Access wie kann man mit Werten aus dem vorigen Datensatz arbeiten
Ich arbeite gerade an einem Berichtsformular (wöchentlich) welches eigentlich schon ganz gut funktioniert.
Was mir noch fehlt ist die Möglichkeit bei der Erstellung eines neuen Datensatzes auf das Datum des vorherigen Datensatzes zu zu greifen um daraus automatisch das Datum des aktuellen Datensatzes berechnen zu können.
Also gibt es in VBA eine Möglichkeit zu prüfen, ob ein vorhergehender Datensatz existiert und wenn ja, aus den Wert aus dem Datumsfeld zu holen?
3 Antworten
SELECT TOP 1 Datum FROM Berichte ORDER BY Datum DESC;
Den Spalten und Tabellennamen musst du natürlich noch anpassen ^^ den habe ich jetzt mal frei erfunden ^^
Ich hoff es hilft dir weiter.
Liebe Grüße,
Davi Schwickerath
Wenn ich jetzt folgendes schreibe (kann ich erst heute Abend testen)
Dim altes_Datum
altes_Datum = DoCmd.RunSQL ("SELECT TOP 1 Datum FROM Berichte ORDER BY Datum DESC;")
Dann sollte, wenn sich SQL in Access genauso verhält wie SQL in PHP in der Variablen altes_Datum ein Array befinden.
Wenn das so ist wie bekomme dann ich das Datum aus dem Array?
Vielen Dank ich habe es jetzt hinbekommen - sieht ein wenig verrückt aus:
Private Sub Abteilung_AfterUpdate()
If Nz(Me!start) = "" Then
Dim strSQL
strSQL = DLookup("start", "tabWochenBerichte", "[ID]=Forms![Wochenbericht]![ID]-1")
If strSQL <> "" Then
Me!start = DateAdd("d", 7, strSQL)
Me!ende = DateAdd("d", 4, Me!start)
Me!KW = Format(Me!start, "ww", 2, 2)
Me!Jahr = Year(Me!start)
End If
End If
End Sub
Es funktioniert super - aber weißt Du zufällig wie man beim Erstellen eines neuen Datensatzes den Fokus auf ein bestimmtes Feld legen kann?
statt dem alten DoCmd.RunSQL würde ich die mehr effiziente Version
CurrentDb.Execute “Query statement”
benutzen. Funktioniert auch prima wenn Parameter aus Formularen geholt werden.
Ja, man kann SQL-Abfragen auch in VBA nutzen:
Erstelle eine Abfrage auf Deine Tabelle, wie Du es immer machst (Assistent, Entwurf..) und verwende nicht viel Aufwand darauf (Tabelle[n] einbinden, keine Bedingungen und fertig).
Öffne diese Abfrage (Doppelklick)
Geh dann auf ''Ansicht'', ''SQL-Ansicht''
Lösche den vorhandenen SQL-Text und füge Deinen SQL-Code ein.
Für die Fortgeschrittenen (nicht zum obigen Problem gehörig):
Umgekehrt kannst Du auch eine ordentliche Abfrage erstellen, Dir den SQL-Code wie oben herauskopieren und im VBA-Code verwenden um Datensätze für eine Listbox etc. zu selektieren:
strNeuerDS = "SELECT ...."
Me.MeineListbox.RowSource = strNeuerDS
Me.Requery
Hier mal ein kompletter Auswahlstring mit Variable:
strNeuerDS = "SELECT Tabelle_Nutzer.Feld_Name, Tabelle_Nutzer.Feld_Vorame " & _
FROM Tabelle_Nutzer WHERE Tabelle_Nutzer.Feld_Name Like '" _
& Me.TextBox_Name_Search.Value & "*'
Der String begrenzt dann auf alles was wie die Textbox_
Name_Search beginnt.
Mei liefert dann Meier, Meierei, Meinert,..... eben allse was mit Mei beginnt.
Beachten muss man, dass die RowSource hinten kein Semikolon als Abschluss des SQL zulässt
Ist das die gängig Syntax?
Tabelle_Nutzer.Feld_Name
wenn ich mit SQL in einem VBA-Script auf ein bestimmtes Feld in einer Bestimmten Tabelle zugreifen möchte?
Ich hatte Probleme, als ich den SQL-Code einer Aktualisierungs-Abfrage 1:1 verwenden wollte bzw. das hier hat nicht funktioniert:
SELECT tabAzubis.Auszubildender
FROM tabWochenBerichte INNER JOIN tabAzubis ON tabWochenBerichte.[Azubi-ID] = tabAzubis.[Azubi-ID]
WHERE (((tabWochenBerichte.[Azubi-ID])=[tabAzubis].[Azubi-ID]))
GROUP BY tabAzubis.Auszubildender
Hallo,
ein recht einfache Möglichkeit wäre, einen Button "Neuer Datensatz mit Datum des aktuellen Datensatzes" in das Formular zu setzen, und in den Click-Event desselben etwa:
CLng(MAltesDatum) = Me!Datum
DoCmd.GoToRecord , "", acNewRec
Me!Datum = DateAdd(7, "d", MAltesDatum)
Das sollte es tun, wenn neues Datum 7 Tage vom alten Datum entfernt ist, ansonsten andere Werte benutzen.
Hilft das?
Gruss, Cholo
Ja aber wenn man das aus einem Datensatz heraus aufruft welcher nicht der letzte ist, dann stimmt das Datum im neuen nicht.
Das ist richtig, das ist hier die Bedingung. Aber auch das kannst Du schnell erledigen: Wie kann man Deinen letzter Datensatz erkennen?
Das höchste Datum?
Dann statt CLng(MAltesDatum) = Me!Datum eben
CLng(MAltesDatum) = DMax([Datumsfeld],[Tabelle])
Ist es das Autonumfeld (so es das gibt):
CLng(MAltesDatum) = DMax([Autonumfeld],[Tabelle])
Oder so. Hilft?
Gruss, Cholo
Sorry, das zweite Beispiel ist natürlich Stuss. Es muss heissen
CLng(MAltesDatum) = DLookup("[Datumsfeld]", "[Tabelle]", "[Tabelle].[Autonumfeld] = DMax([Autonumfeld],[Tabelle])")
Wenn das mit dem Nesten der zwei aggregated functions nicht funktioniert, das DMax zunächst einer Variablen zuweisen, z.B. MTest, und dann:
CLng(MAltesDatum) = DLookup("[Datumsfeld]", "[Tabelle]", "[Tabelle].[Autonumfeld] = " & MTest)
Das ist eine SQL-Abfrage kann man die auch in VBA benutzen?