Hallo,
ich benötige die Hilfe von erfahrenen Access-Anwender, da ich mich erst kürzlich mit Access angefreundet habe.
Ich möchte folgendes umsetzen:
In einem Formular, das sich auf eine Tabelle bezieht in der u.a. Datum und Uhrzeit eingetragen wird, möchte ich mittels Schaltflächen von einem Tag zum nächsten springen können, egal wie viele Datensätze der jeweilige Tag enthält. D.h. bei jedem Klick in die entsprechende Richtung, möchte ich auf den ersten Datensatz des jeweils nächsten bzw. vorherigen Tages springen.
Ich vermute mal, das lässt sich nur mittels VBA umsetzen und nicht mit den Standardmöglichkeiten innerhalb der Formularerstellung?
Vielen Dank für Eure hilfreichen Tipps!
Gruß,
Thorsten
Hallo,
erstelle zwei Buttons ("btnNext", "btnBack") mit deren Ereignisprozeduren "Beim Klicken":
Sub btnNext_Click()
Docmd.Gotorecord,,acNext
End Sub
Sub btnBack_Click()
Docmd.GotoRecord,,acPrevious
End Sub
(ohne Fehlerbehandlung)
Alternativ kann das Ganze auch mit den entspr. Makros erreicht werden.
Hallo Thorsten,
Mein Vorschlag (Franz' berücksichtigt ja nicht die Anzahl der DS.
Quick & Dirty (Luftcode):
Dim rst as DAO.Recordset
Set rst = Me.Recordsetclone
Do While rst.Fields("DeinDatum") = Me!DeinDatum
rst.MoveNext
Loop
Me.Bookmark = rst.Bookmark
rst.close: Set rst = Nothing
End Sub
gruss ekkehard
Hallo,
und besten Dank für Eure Tipps und Vorgehensweisen.
Mit "Button erstellen"...., meint Ihr damit eine Schaltfläche?
Um den Code einzugeben ändere ich bei "Beim Klicken" den Eintrag auf "Ereignisprozedur" und öffne mit einem weiteren Klick auf die 3 Punkte den VBA-Editor..., ist das von der Vorgehensweise so korrekt?
Gruß,
Thorsten
Ja.
KNALLER! :D Funktioniert einwandfrei, vielen Dank!
Also jedenfalls nach vorne. Was ist für die Rückwärts-Sping-Funktion zu ändern?
Hallo Thorsten,
Freut mich. Mir ist aber gerade noch was aufgefallen, wobei ich mir nicht sicher bin,
ob es evtl. nötig ist (blaue Zeile):
ZitatDim rst as DAO.Recordset
Set rst = Me.Recordsetclone
rst.Bookmark = Me.Bookmark
Do While rst.Fields("DeinDatum") = Me!DeinDatum
rst.MoveNext
Loop
Me.Bookmark = rst.Bookmark
rst.close: Set rst = Nothing
Habe es halt nicht getestet und bin mir nicht sicher, wo der DS-Zeiger nach Set rst = ...
steht. Musst du mal mit verschiedenen Einstiegspunkten (DS) testen.
gruss ekkehard
Ja, Du hast Recht. Das macht es noch etwas besser ;)
Vielen Dank geht jetzt in beide Richtungen, TOP!
Gruß,
Thorsten
' vorwärts
Me.Recordset.FindFirst "Datumsfeld = " & _
Format(DateAdd("dd", 1, Me.txtDatumsfeld), "\#yyyy\-mm\-dd\#")
Für rückwärts dann -1 statt 1.
Ich danke Euch allen für die guten Tipps und Codes!
Funktioniert alles tadellos :)
Gruß,
Thorsten
Hallo Eberhard,
Da ich diese Idee mit dem Tageweise blättern irgendwie ganz nützlich finde, habe
ich mich hingesetzt um die Prozedur zu parametrisieren und somit für mehrere
Formulare verfügbar zu machen. Dies ist dabei heraus gekommen:
Public Sub TageweiseBlaettern( _
ByRef frm As Form, _
ByRef ctl As Control, _
Optional ByVal VorZurueck As Boolean = True)
'True für "vorwärts" - False = "rückwärts"
On Error GoTo Fehler
Dim fld As String
Dim rst As DAO.Recordset
Set rst = frm.RecordsetClone
fld = ctl.ControlSource
rst.Bookmark = frm.Bookmark
Do While Int(rst.Fields(fld)) = Int(ctl.Value)
'int() schneidet einen evtl. vorhandenen Zeitanteil ab
If VorZurueck = True Then
rst.MoveNext
Else
rst.MovePrevious
End If
Loop
frm.Bookmark = rst.Bookmark
Ende_CleanUp:
On Error Resume Next
rst.Close: Set rst = Nothing
Exit Sub
Fehler:
If rst.BOF Or rst.BOF then Goto Ende_Cleanup
'ansonsten Behandlung wie nötig/gewünscht/passend
End Sub
(hoffentlich sind da jetzt keine Copy&Paste-Fehler drin).
Bevor ich jetzt posten konnte, habe ich deine Lösung gesehen, und (natürlich ;))
gleich mal wieder gedacht "Ja, die Profis machen da mal schnell 'nen Einzeiler draus".
Beim genauen Hinsehen denke ich aber, dass das nur den genau nächsten Tag anzeigt
(Datum +/- 1), nicht aber einfach nur den nächsten Tag in der Zukunft/Vergangenheit.
Sehe ich das richtig?
gruss ekkehard
Wenn das Datumsfeld selber einen Zeitanteil enthält, müsste man das zusätzlich berücksichtigen, aber auch schon in der Aufgabenstellung - könnte ja sein, man möchte auf eine bestimmte Zeit (Mittag) orientieren.
Übrigens: MovePrevious/MoveNext setzt eine entsprechende Sortierung voraus, FindNext würd auch in einer andersartigen Sortierung einen Treffer landen, wenn es einen gibt (Prüfen mit NoMatch).
In Deinem Code kommt nach meinem Gefühl die Fehlerbehandlung (Prüfung auf BOF/EOF) zu spät.
Hallo Eberhard,
Alle Einwände akzeptiert.
Bezügl. Prüfung, die hatte ich vergessen, und dann vor dem Versenden noch schnell
so reingefrickelt. Ist klar, sollte vorher geprüft werden (Fehlervermeidung).
Aber
Zitateinen Treffer landen
welchen, wenn der Abstand > 1 ist? Den nächsten verfügbaren? (EOF aussen vor)
gruss ekkehard
Wenn man im Kriterium auf Gleichheit prüft, erwartet man das auch im Ergebnis und nichts anderes. Man könnte aber auch auf >= prüfen, was insbesondere bei Zeitanteilen Sinn macht.
Hallo Eberhard,
Grrrr >:(
Zu einfach um drauf zu kommen, - ich hasse mich ;)
gruss ekkehard