Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

SQL Anfügeabfrage

Begonnen von Xoar, April 13, 2018, 19:01:09

⏪ vorheriges - nächstes ⏩

Xoar

Hallo SQL Experten,

habe mal wieder ein Problem wo ich nicht so wirklich weiter komme.

Ich habe eine TblKilometerstaende, an diese sollen alle DS aus tblFahrzeuge angefügt werden und zwar 12x, sprich für jeden Monat 1x.
Die TblKilometerstaende beinhaltet die relevanten Felder "FahrzeugID_F, Kilometerstand und DatumDerAblesung "
Das ganze möchte ich in einer Schleife laufen lassen.

Hier mal mein bisheriger Versuch:
Public Sub KilometerAllenFahrzeugenAlleMonateHinzufuegen()

Dim Datumswert As String
Dim i As Integer

    Datumswert = "20.01." & Year(Now)
   
    For i = 1 To 12
        CurrentDb.Execute ("INSERT INTO tblKilometerstaende ( FahrzeugID_F, DatumDerAblesung ) " & _
                          " SELECT tblFahrzeuge.FahrzeugeID, Date(" & Datumswert & ") " & _
                          " FROM tblFahrzeuge; ")
               
    Datumswert = DateAdd("m", 1, Datumswert)

    Next
End Sub


Leider klappt das nicht, Laufzeitfehler 3075, Syntaxfehler in Zahl in Abfrageausdruck Date(20.01.2018)

Scheint mir auch zum Teil sinnig, weil ich ja ein Datumswert habe den ich aus tblFahrzeuge auslesen kann. Irgendwie müsste man mit VALUES das hinzufügen, glaube ich.

Könnt ihr mir da auf die Sprünge helfen?

PS: Hatte auch den Datumswert mit ner Funktion in SQL Schreibweise umgeändert, brachte aber auch keinen Erfolg.
Die tblKilometerstaende hat auch einen gemeinsamen eindeutigen Index auf die beiden Felder FahrzeugID_F und DatumDerAblesung

Beste Grüße

MzKlMu

#1
Hallo,
Datumswert ist doch ein Datum, oder nicht ? Warum deklarierst Du da als String ? Außerdem bietet sich die Funktion DateSerial an. Und dann wird es auch noch kürzer und einfacher:
Public Sub KilometerAllenFahrzeugenAlleMonateHinzufuegen()
Dim i As Integer
    For i = 1 To 12
        CurrentDb.Execute "INSERT INTO tblKilometerstaende ( FahrzeugID_F, DatumDerAblesung )" & _
                " SELECT FahrzeugeID, DateSerial(Year(Date())," & i & ",20) FROM tblFahrzeuge", DbFailOnError
    Next i
End Sub


Gruß Klaus

Lachtaube

Was haben denn Dummy-Datensätze mit Datum ohne Kilometerstand für einen Wert? Mit einer einer Pivot- oder Kalendertabelle kann man sich auch auf Wunsch editierbare virtuelle Datensätze mit leeren Kilometerständen anzeigen lassen, ohne irgendwelchen Datenmüll zu hinterlegen. :(
Grüße von der (⌒▽⌒)

Xoar

@Klaus
Danke werde ich heute abend testen. Datumswert als String zu deklarieren war natürlich falsch.

@Lachtaube
In meinem Kopf sah das so aus, dass ich dann die Fahrzeugliste mit den monatlichen (wird nur als ganzer Monat angezeigt) leeren Kilometerständen angezeigt bekomme und dann diese bei Bedarf füllen kann. Ausgefüllt werden diese leeren DS auf das Jahr gesehen sowieso. Sprich am Ende des Jahres herrscht kein Datenmüll mehr.

Den anderen Weg über eine Kalendertabelle hatte ich nicht auf den Schirm, wäre aber mit mehr Aufwand verbunden. Müsste dann ja jedesmal eine Anfügeabfrage ausführen sobald ich ein Kilometerwert eintrage, oder hast du dir das anders gedacht?

Grüße

PhilS

Zitat von: Xoar am April 14, 2018, 08:15:11In meinem Kopf sah das so aus, dass ich dann die Fahrzeugliste mit den monatlichen (wird nur als ganzer Monat angezeigt) leeren Kilometerständen angezeigt bekomme und dann diese bei Bedarf füllen kann. Ausgefüllt werden diese leeren DS auf das Jahr gesehen sowieso. Sprich am Ende des Jahres herrscht kein Datenmüll mehr.
Das mag zwar stimmen, aber besonders ansprechend finde ich die Idee auch nicht, einen Haufen Datensätze zu erzeugen, die erst in 12 Monaten vollständig Sinn ergeben. - Und dann erzeugst du ja bald wieder die Daten für das nächste Jahr...
Was ist denn, wenn der Kilometerstand eines Fahrzeugs nicht am 20. des Monats eingetragen wird? DatumDerAblesung ist erstmal falsch.
Ich würde auch dringend empfehlen, nur die tatsächlichen Fakten zu speichern, wenn diese feststehen.

Zitat von: Xoar am April 14, 2018, 08:15:11[...]Müsste dann ja jedesmal eine Anfügeabfrage ausführen sobald ich ein Kilometerwert eintrage, oder hast du dir das anders gedacht?
Das hörst sich hier so an, als wäre das ein außergewöhnlicher Aufwand. - Jedes mal, wenn du einen Datensatz in Access eingibst, wird doch intern und automatisch eine Anfügeabfrage ausgeführt. Um mehr als die Eingabe eines neuen Datensatzes geht es doch auch hier nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Xoar

@PhilS

Ja das stimmt schon, ich geb dir insofern recht das die Kilometer nicht immer am 20. eingetragen werden, aber gefordert war nur ne Eingabe für einen Monat, da ist es tatsächlich egal ob der am 01. oder 20. eingetragen wird. Klingt komisch, ist aber so ;)

Möchte aber trotzdem eure vorgeschlagene Methode ausprobieren und wenn sie so klappt wie ich mir das vorstelle auch diese nutzen.

Wie genau müsste ich das angehen?
Kalendertabellen habe ich schonmal in ner anderen Tabelle benutzt.

Also eine tblKalender mit das Datum direkt als PK

Und dann erzeuge ich ne Abfrage, welche die tblKalender und tblFahrzeuge beinhaltet.
Dann nen leftjoin auf FahrzeugeID aus tblFahrzeuge und dann einfach das Datumsfeld aus der TblKalender?

Grüße

ebs17

Willst Du Kilometerstände per Anfügeabfrage eintragen (woher nimmst Du die?), oder kennst und nutzt Du auch Formulare?

Bei einer Formulareingabe könnte man für das Datum ein Kombinationsfeld anbieten, das als Datensatzherkunft ein oder mehrere  benötigte Datumswerte  bereitstellt, also im Beispiel einige Montszwanzigste, die größer als der letztverwendete Wert für das Datum sind. Da könnten aber entsprechend Hinweis auch realistische Werte stehen.

Von solchen Formularsteuerelementen könnte man eine Anfügeabfrage oder ein Recordset-AddNew ableiten, oder man verwendet schlicht ein gebundenes Formular.
Mit freundlichem Glück Auf!

Eberhard

Xoar

Ja das gebundene Formular habe ich natürlich in meiner Variante, wo ich viele leere DS erzeuge, damit stellt die, nach Monaten filterbare, Eingabe kein Problem da.

Die Anfügeabfrage wäre hier nur im Fall eines neuen Fahrzeuges auszuführen.

Dies ist aber wohl noch nicht die Beste Varainte, deshalb möchte ich die andere Variante testen.

ebs17

ZitatDie Anfügeabfrage wäre hier nur im Fall eines neuen Fahrzeuges auszuführen.
Ein neues Fahrzeug könnte man in einem gebundenen (Haupt)Formular erzeugen, die Kilometerstände verwaltet man dann in einem Unterformular.

Es ist sicher wichtig, notwendiges Handwerkszeug wie Aktionsabfragen zu beherrschen. Lösungen sollten aber einfach sein. Das Richtig- und Komplexprogrammieren kann man sich für richtige Aufgabenstellungen aufsparen.
Mit freundlichem Glück Auf!

Eberhard

Xoar

@Eberhard

Genau so läuft es ja auch bei mir, nur ist nicht gewünscht das man jedes Fahrzeug im Hauptformular durchklicken muss um den Kilometerstand dann einzufügen.

Hatte auch schon überlegt im Ereignis nach Aktualisierung einfach zum nächsten DS zu springen, aber auch das war nicht gewünscht.

Deshalb diese Variante wo einfach alle Fahrzeuge direkt unter einander aufgelistet sind und der passende Kilometerwert rechts daneben eingegeben werden kann.

Diese Liste wird blanko ausgedruckt, handschriftlich alle Werte eingetragen und soll dann ins System übernommen werden.

Diese ganze Problematik ist rein kosmetisch und um den User seine Bequemlichkeit gerecht zu werden.

Hab ja jetzt einige Tipps bekommen, diese werde ich mal ausprobieren.

Danke schonmal

ebs17

Zitatnur ist nicht gewünscht das man jedes Fahrzeug im Hauptformular durchklicken muss um den Kilometerstand dann einzufügen
Nun, der Entwickler könnte dafür sorgen, dass über eine Fahrzeugauswahlleiste das Hauptformular gezielt gefiltert wird bzw. der Datensatzzeiger auf das gewünschte Fahrzeug gelegt wird.

ZitatDiese Liste wird blanko ausgedruckt
Dateneingabe, Berechnungen und Ausdrucke dürfen sehr verschiedene Dinge sein. Man muss sich nicht an einem Excelblatt festbeißen, wo man dies alles mit einem Arbeitsblatt abwickeln kann ... oder umgedreht: Man ist konsequent und wechselt auf Excel.
Mit freundlichem Glück Auf!

Eberhard