Access wie kann man mit Werten aus dem vorigen Datensatz arbeiten

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet
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


BrilleHN 
Beitragsersteller
 22.05.2013, 06:37

Das ist eine SQL-Abfrage kann man die auch in VBA benutzen?

Davidtut  22.05.2013, 06:59
@BrilleHN

kannst du mit DoCmd.RunSQL ("SELECT TOP 1 Datum FROM Berichte ORDER BY Datum DESC;") in VBA ausführen ;-)

Viel Erfolg =)

BrilleHN 
Beitragsersteller
 22.05.2013, 13:16
@Davidtut

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?

Davidtut  22.05.2013, 14:17
@BrilleHN

oh Entschuldigung ich vergas das DoCMD.RunSQL nur für delete, update und insert anwendbar ist.

versuch das einmal

altes_Datum = DLookup("Datum","Berichte","order by Datum DESC Limit 1")

BrilleHN 
Beitragsersteller
 22.05.2013, 20:36
@Davidtut

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?

CholoAleman  22.05.2013, 22:48
@Davidtut

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

PauleVBA  22.05.2013, 09:50

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

BrilleHN 
Beitragsersteller
 29.05.2013, 18:29
@PauleVBA

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


BrilleHN 
Beitragsersteller
 23.05.2013, 07:13

Ja aber wenn man das aus einem Datensatz heraus aufruft welcher nicht der letzte ist, dann stimmt das Datum im neuen nicht.

CholoAleman  24.05.2013, 00:46
@BrilleHN

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

CholoAleman  24.05.2013, 00:54
@CholoAleman

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)