Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Ratoncito am April 12, 2020, 13:06:49

Titel: Anfügeabfrage
Beitrag von: Ratoncito am April 12, 2020, 13:06:49
Hallo,

in einer DB erfasse ich täglich Kurse zu ausgewählten Wertpapieren in einer tblKurs.

Auf einem Formular kann ich diese ansehen bzw. eintragen oder ändern. Wird ein bisher nicht vorhandenes Datum ausgewählt erfolgt eine Abfrage, ob für dieses Datum Kurse erfasst werden möchten.
Bisher habe ich über diesen Code:


Private Sub WrIsin()           '
    On Error GoTo ErrHandler
    Dim strDatum As String
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim strSQL As String
     
    strDatum = Format$(Nz(txtKalender, Date), "dd.mm.yyyy")
    strSQL = "INSERT INTO tblKurs (IdfWePa, DatumKurs )" _
        & "SELECT tblWePa.ID, '" & strDatum & "'" _
        & "FROM tblWePa; "
    Set db = CurrentDb
    CurrentDb.Execute strSQL, dbFailOnError
       
Exit_ErrHandler:
    Set qdf = Nothing
    Set db = Nothing
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume Exit_ErrHandler
   
End Sub


für alle vorhandenen Wertpapiere einen neuen Datensatz mit leeren Feldern für dieses Datum eingefügt.

Nun möchte ich diesen Code so ändern, dass statt der leeren Felder die Kurse des Tages, bzw. des Datensatzes davor eingetragen werden. (Montags gibt es keine Daten von Samstag oder Sonntag)
Wie müsste der Code geändert werden?

Weiterhin habe ich noch grundsätzliche Fragen.

Zur Datenübernahme hatte ich eine Tabelle mit Daten vom 01.01.2012 bis 01.05.2020 erstellt und anschließend die Kurse der Wertpapiere über eine Anfügeabfrage eingefügt. Daher gibt es viele leere Felder. Zum Beispiel werden alle Samstage und Sonntage nicht benötigt, da es dort keine neuen Kurse gibt.
Macht es Sinn diese zu löschen um die Datenmenge zu reduzieren?

Für alle Wertpapiere habe ich leere Felder für jedes Datum vor dem Kauf.
Macht es Sinn diese zu löschen?

LG - Wolfgang

Titel: Re: Anfügeabfrage
Beitrag von: DF6GL am April 12, 2020, 15:07:41
Hallo,

--- welchen Datentyp hat das Feld "DatumKurs" in der Tabelle?  Lt. Code liegt DatenTyp TEXT vor, was für ein Datum (in Access) Unsinn ist.


  Sollte das Datumsfeld den Datentyp "Datum/Uhrzeit" aufweisen,  muss der Code wie folgt geändert werden:

.
.
ZitatstrDatum = Format$(Nz(Me!txtKalender, Date), "\#mm/dd/yyyy\#")
    strSQL = "INSERT INTO tblKurs (IdfWePa, DatumKurs )" _
        & " SELECT tblWePa.ID, " & strDatum  & " as DatumKurs " & _
        & " FROM tblWePa; "



--- Leere DS mit irgendwelchen nicht korrekt zutreffenden Werten zu füllen, ist m. E. fehl am Platz.


---
ZitatMacht es Sinn diese zu löschen um die Datenmenge zu reduzieren?
Leere DS zu löschen, wenn diese nicht gebraucht werden ist sicherlich zweckmäßig, wobei "Datenmenge reduzieren" da nicht das ausschlaggebende  Argument wäre.

Den Sinn der leeren DS dahinter muss Du selber kennen.
Titel: Re: Anfügeabfrage
Beitrag von: Ratoncito am April 13, 2020, 11:39:44
Hallo,

das Feld "DatumKurs" hat als Datentyp "Datum/Uhrzeit". Als Format ist "tt\.mm\.jjjj" eingestellt.

Die Anfänge der DB liegen viele Jahre zurück. Nach dem Erstellen der Tabellen habe ich Formulare zur Eingabe der Daten erstellt. Dabei hat mir das Formular zur Anzeige und Eingabe der Kurse die meisten Schwierigkeiten bereitet.

Zur Eingabe des Kurses habe ich daher für ein neues Datum für jedes Wertpapier einen leeren Datensatz angelegt, in den ich anschließend den Kurs eingetragen habe.
Kam ein neues Wertpapier hinzu, habe ich für dieses Wertpapier zu jedem schon vorhandene Datum in dieser Tabelle ebenfalls einen Datensatz angelegt.
Vermutlich nicht die richtige Vorgehensweise.

Da ich das Formular zur Anzeige der Kurse nicht so hinbekommen habe, wie es meinen Vorstellungen entsprach, habe ich das ganze Projekt nach unzähligen Versuchen aufgegeben.

Viele Jahre später habe ich mich erneut damit beschäftigt. Das Formular entspricht nun meinen Vorstellungen. Daher habe ich die Tabellen mit realen Daten gefüllt. Wie die leeren Datensätze in der tblKurs entstanden sind habe ich im ersten Beitrag beschrieben.

In der Tabelle sind im Moment
Gesamt: 310488
reale Kurse: 117544
Null: 2561
Leer: 190383

Ist es sinnvoll, alle Samstage und Sonntage komplett zu löschen und die leeren Felder mit Null zu füllen?

Wie muss der Code geändert werden um für ein neues Datum den Kurs vom Vortag einzufügen?

LG - Wolfgang
Titel: Re: Anfügeabfrage
Beitrag von: DF6GL am April 13, 2020, 13:02:54
Hallo,

ZitatIst es sinnvoll, alle Samstage und Sonntage komplett zu löschen und

Habe ich schon erwähnt:  Ich weiß das nicht.  Du musst Dich entscheiden, ob Du Datensätze mit Sa/So in der DB benötigst.


Wenn Du sie löschen willst, also nicht mehr benötigst, dann etwa so:

Delete from tblKurse where Weekday([DatumKurs],2) >5

Dieses SQL-Statement in die SQL-Ansicht im Abfrageentwurf kopieren und ausführen.

Zitat
die leeren Felder mit Null zu füllen?

Das ist wieder nicht zu verstehen?  Was bedeutet "Null" bei Dir? 
Den numerischen Wert 0 oder ein Feld mit NULL (nichts, leer) als Inhalt?

Beim zweiten Fall ist die Aufgabe sinnlos, ein leeres Feld hat schon den Inhalt NULL.


Wenn Du damit meinst, ein leeres Feld mit dem numerischen Wert 0 zu füllen, so ist dies auch überflüssig, weil, wie vorher schon öfters angesprochen, einem solchen leeren Feld (z. B. in einer Abfrage) mit der NZ()-Funktion ein Ersatzwert ( z. B. die Zahl 0 ) zugeordnet werden kann.

Wie Werte aus einem vorherigen Datensatz in einen neuen DS in einem Formular zu übernehmen sind, zeigt dieser Tipp:   http://www.donkarl.com/?FAQ4.22


ZitatIn der Tabelle sind im Moment
Gesamt: 310488
reale Kurse: 117544
Null: 2561
Leer: 190383

Was ist hier der Unterschied zwischen "Null" und "Leer".  Um welche Felder in der Tabelle handelt es sich?
Titel: Re: Anfügeabfrage
Beitrag von: Ratoncito am April 13, 2020, 14:37:26
Hallo,

Zitat von: DF6GL am April 13, 2020, 13:02:54

ZitatIst es sinnvoll, alle Samstage und Sonntage komplett zu löschen und

Habe ich schon erwähnt:  Ich weiß das nicht.  Du musst Dich entscheiden, ob Du Datensätze mit Sa/So in der DB benötigst.

Hatte ich hier geschrieben:

Zitat von: Ratoncito am April 12, 2020, 13:06:49
Daher gibt es viele leere Felder. Zum Beispiel werden alle Samstage und Sonntage nicht benötigt, da es dort keine neuen Kurse gibt.
Macht es Sinn diese zu löschen um die Datenmenge zu reduzieren?

Die Frage hat sich aber erledigt, ich habe diese Tage gelöscht.

Beim nächsten Punkt meinte ich den Zahlenwert 0. Entschuldigung, da habe ich mich nicht richtig ausgedrückt.

Der Link auf die Hilfeseite ist leider nicht das, was ich benötige.

ZitatProblem
Du möchtest einen gerade eingegebenen Wert in einem neuen Datensatz als Standardwert vorgeben, um ihn nur bei Bedarf ändern zu müssen.

Auf einem Formular werden die Kurse von ausgewählten Wertpapieren an mehreren Tagen in mehreren Subformularen als Endlosformulare angezeigt. Wird ein Datum ausgewählt, zu dem noch keine Kurse eingetragen sind, hatte ich durch den im ersten Beitrag aufgelisteten Code für jedes Wertpapier für dieses Datum einen neuen Datensatz erstellt und angezeigt.

So soll das auch weiterhin sein, allerdings soll das Feld "Kurs" den Wert aus dem vorhergehenden Datensatz erhalten.

Ich hoffe, dass ich mich verständlich ausgedrückt habe. Sonst bitte nochmal fragen.

LG - Wolfgang
Titel: Re: Anfügeabfrage
Beitrag von: DF6GL am April 13, 2020, 17:49:49
Hallo,


ZitatSo soll das auch weiterhin sein, allerdings soll das Feld "Kurs" den Wert aus dem vorhergehenden Datensatz erhalten.

Der Link hilft Dir schon und wirkt, sobald Du einen neuen Tag eingibst, und das mit Hilfe eines Formulars.

Oder soll das im Nachhinein bei solchen Datensätzen passieren, bei denen "Kurs" leer (NULL)  ist?



Titel: Re: Anfügeabfrage
Beitrag von: Ratoncito am April 14, 2020, 07:02:26
Hallo,

der Code sollte lediglich so geändert werden, dass statt der leeren Felder die Kurse des letzten Tages eingetragen sind.

LG - Wolfgang
Titel: Re: Anfügeabfrage
Beitrag von: ebs17 am April 14, 2020, 08:03:40
Eine gute Datenbank lügt nicht. Sie enthält in Stammdatentabellen Daten die Daten sind (Fakten), keine Dummies und Platzhalter (Datenmüll) und keine Übertragungen in die Zukunft, die man nicht kennt und die also mit hoher Wahrscheinlichkeit falsch sein werden.

Gedachtes zum Anschauen und Hochrechnen würde man besser in virtuellen Tabellen darstellen. Im einfachsten Fall ist das eine Auswahlabfrage, die Fakten und Gedankenspiele zusammenbringt:
SELECT
   [Feldliste],
   IIF(T.Kurs IS NULL,
   (
      SELECT TOP 1
         X.Kurs
      FROM
         TabelleX AS X
      WHERE
         X.Wertpapier = T.Wertpapier
            AND
         X.Kursdatum < T.Kursdatum
      ORDER BY
         X.Kursdatum DESC
   )
   , T.Kurs) AS Kurs
FROM
   TabelleX AS T
Titel: Re: Anfügeabfrage
Beitrag von: Ratoncito am April 14, 2020, 09:13:06
Hallo,

warum wird hier eine klare Frage und Bitte um Hilfe nicht beantwortet?

LG - Wolfgang
Titel: Re: Anfügeabfrage
Beitrag von: ebs17 am April 14, 2020, 09:53:52
Manche wissen ganz genau, was sie tun möchten und was sie nicht hören wollen, ungeachtet des eigenen Bewusstseins,  noch nicht allzu viel Ahnung zu haben, und ungeachtet von Hinweisen, die helfen können, es gleich richtig zu machen.

Davon unabhängig: Wenn man vor eine Auswahlabfrage eine INSERT INTO-Zeile davor setzt, hat man eine Anfügeabfrage (wie der Thementitel lautet).

Sowie: Den "Code zu ergänzen" ist an sich schon ein Akt, der an Masochismus anlehnt:
strDatum = Format$(Nz(txtKalender, Date), "dd.mm.yyyy")
Ein Datum zum Text zu machen und als Text in eine Tabelle einzutragen - solche wohldurchdachten Ideen kann ich nicht nachvollziehen. Da fliegen schon die ersten Sicherungen ...
Titel: Re: Anfügeabfrage
Beitrag von: Ratoncito am April 14, 2020, 11:08:16
Hallo,

Zitat von: ebs17 am April 14, 2020, 09:53:52
Manche wissen ganz genau, was sie tun möchten und was sie nicht hören wollen, ungeachtet des eigenen Bewusstseins,  noch nicht allzu viel Ahnung zu haben, und ungeachtet von Hinweisen, die helfen können, es gleich richtig zu machen.

Davon unabhängig: Wenn man vor eine Auswahlabfrage eine INSERT INTO-Zeile davor setzt, hat man eine Anfügeabfrage (wie der Thementitel lautet).

Sowie: Den "Code zu ergänzen" ist an sich schon ein Akt, der an Masochismus anlehnt:
strDatum = Format$(Nz(txtKalender, Date), "dd.mm.yyyy")
Ein Datum zum Text zu machen und als Text in eine Tabelle einzutragen - solche wohldurchdachten Ideen kann ich nicht nachvollziehen. Da fliegen schon die ersten Sicherungen ...

Vielen Dank, das ist sehr hilfreich!

In der Tabelle hat das Feld "DatumKurs" den Datentyp "Datum/Uhrzeit". Als Format ist "tt\.mm\.jjjj" eingestellt.
Ich habe schon oft beschrieben, wie und über welch langen Zeitraum die DB entstanden ist. Anfang des Jahres habe ich hier um Hilfe bei der Erstellung der DB gebeten. Da wäre der richtige Zeitpunkt zu solchen konstruktiven Hinweisen gewesen.

Bei solchen Bemerkungen:
ZitatEin Datum zum Text zu machen und als Text in eine Tabelle einzutragen - solche wohldurchdachten Ideen kann ich nicht nachvollziehen. Da fliegen schon die ersten Sicherungen ...
sollte man mal über die Nettiquette nachdenken.

Aber scheinbar gibt es Leute, die schon als Meister vom Himmel gefallen sind und statt zu helfen lieber ironische Kommentare schreiben.

Wenn es irgendwo Fehler gibt, bin ich gerne bereit, diese nach Möglichkeit zu beseitigen. Wie vor ein paar Tagen nach dem hilfreichen Hinweis von Beaker s.a. im anderen Thema.
Wie wäre es, mal aufzuzeigen wie es richtig gemacht wird? Das würde mir jetzt und für später helfen.

LG - Wolfgang
Titel: Re: Anfügeabfrage
Beitrag von: DF6GL am April 14, 2020, 13:18:44
Hallo,
Zitat
Wie wäre es, mal aufzuzeigen wie es richtig gemacht wird?

Was glaubst Du eigentlich, was wir bisher gemacht haben?

Allesamt weisen wir Dich auf Unzulänglichkeiten hin und versuchen, diese durch Lösungsvorschläge und mit  weitschweifenden Grundlagen-Erklärungen zu verringern.

Es ist egal, woher die DB, bzw. Daten gekommen sind. Wenn die in eine fehlerhafte (vermurkste) Tabellenbasis geführt haben, ist es unsinnig, auf diesem Murks aufzubauen.  Trotzdem hast Du manche Lösungsvorschläge erhalten. Dabei wird der Murks aber nicht besser oder verschwindet gar, zudem Du die Vorschläge oftmals nicht umgesetzt hast.

(Bzgl. der Speicherung eines Datums habe ich schon vor einiger Zeit hingewiesen und den Code korrigiert.)

Zitat

Anfang des Jahres habe ich hier um Hilfe bei der Erstellung der DB gebeten. Da wäre der richtige Zeitpunkt zu solchen konstruktiven Hinweisen gewesen.

Die hast Du sicher erhalten, hast aber oftmals nicht auf Rückfragen reagiert, bzw. diese nicht beantwortet und schon gar vielfach nicht umgesetzt.

Die Logik, im Nachhinein bei bestehenden DS Kurse vom (zeitlich) vorhergehenden DS zu übernehmen, wenn der Kurs NULL (leer) ist, ist keine.

Da ist es besser, den Kurs "wegzulassen" , als dass man einen falschen Wert einsetzt.

Auch das wäre ein "Hinweis", nur nicht in Form von Code, der lediglich kopiert wird und Unsinnigkeit produziert.

Übrigens: Beim Post von ebs finde ich kein Wort mit ironischer Bedeutung..

Und Nettiquette nachdenken (bzw. lesen) trifft wohl eher auf Dich zu, wobei ich da an konkrete Darstellung und ausführliche (db-technische) Beschreibung der Probleme denke.


Insofern klinke ich mich jetzt hier (ich glaube schon zum 2. Mal) aus diesem Thema aus.










Titel: Re: Anfügeabfrage
Beitrag von: ebs17 am April 14, 2020, 13:30:42
Zitatmal über die Nettiquette nachdenken
Fehler wird man doch als solche bezeichnen dürfen. Das ist auch eine Hilfe. Wenn jemand solche Unzulänglichkeiten als Teil seiner Persönlichkeit begreift und somit Kritik als Herabwürdigung und Beleidigung, ist das vor allem ein Abbild vom eigenen Charakter.
Wenn man einiges etwas deutlicher äußert, kann das auch damit zusammenhängen, dass normale Hinweise regelmäßig ignoriert oder gar nicht wahrgenommen wurden.

ZitatWie wäre es, mal aufzuzeigen wie es richtig gemacht wird?
Ja, wie wäre es gewesen, wenn Du auf meinen vorletzten Beitrag ein Feedback in diesem Sinne gegeben hättest?
Wenn Du andere nicht für voll nimmst - wie soll die Gegenreaktion aussehen?

ZitatAnfang des Jahres habe ich hier um Hilfe bei der Erstellung der DB gebeten. Da wäre der richtige Zeitpunkt zu solchen konstruktiven Hinweisen gewesen.
Wenn es um Hilfe ginge: Du bist vermutlich bereitwillig und schnell und lernwillig ohne  Diskussionen den Hinweisen zur Datenmodellierung nachgegangen? Weil: Mich erschöpfen 60-Beiträge-Themen sehr schnell, da weiß man praktisch zu keinem Zeitpunkt genau, wie genau der Zustand ist. Bei einer fortwährenden Diskussion über Selbstverständlichkeiten lassen dann Überblick, Zeit und Lust noch mehr nach.

Weißt Du: Ständig wiederholte Beteuerungen darüber, was man alles schon geleistet hat, dass man doch gerne lernen will usw. ... sind auch nicht hilfreich. So etwas möchte und kann man eigentlich am Sagen und Tun entnehmen. Kokettieren mit seinem Alter - wird leicht zur Beleidigung von Altersgenossen (sehr schnell verzichtbar).

Richtig Ansprüche darfst Du stellen, was wie zu machen und wie zu erklären ist, wenn Du jemanden angemessen dafür bezahlst, denn man darf auch davon ausgehen, dass einem die eigene Zeit auch wertvoll ist. Du darfst aber sicher sein, dass der allergrößte Teil der Hinweise aus der Kiste der Best Practice der Hinweisgeber kommt und sich da sofort und unmittelbar ein Feedback darauf lohnt (Umsetzen, Nachfragen bei Nichtverständnis nicht nur der Technik, sondern auch des Sinns). Solch ein umfassendes Feedback wäre auch gelebte Höflichkeit ...
Zitat
statt zu helfen lieber ironische Kommentare schreiben
Unter Hilfe verstehen viele viel Unterschiedliches. Ironie ist noch ein Mittel der Information. Man kann aber auch selber die Ignoranz  verstärken. Eine Nichtantwort ist sicher noch hilfreicher und angenehmer.

ZitatAber scheinbar gibt es Leute, die schon als Meister vom Himmel gefallen sind
Natürlich nicht. Aber Meisterschaft, um dieses hohe Wort zu verwenden, kommt nicht vom Tragenlassen, sondern vor allem von eigenen aktiven Tun in vielen Bereichen (Grundlagen lesen und verarbeiten, Hinweise und Beispiele durcharbeiten, wiederholen usw.). Ich habe schon diverse Access-Neulinge erlebt, auch solche, die nach einem richtigen Arbeitstag den Nachtschlaf auf 3 bis 4 Stunden verkürzt haben und das über Wochen und über diese Zeit nach zweieinhalb Monaten eine umfangreiche Anwendung (schon mal größer 25 Tabellen im Modell) als Mehrnutzeranwendung im betrieblichen Bereich auf die Beine gestellt haben. Da hat es Spaß gemacht, eigene Zeit und Gedanken hinzuzufügen.

Viel Erfolg auf dem weiteren Weg.