Neuigkeiten:

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

Mobiles Hauptmenü

Tageweise durch Datensätze springen

Begonnen von Thors1204, November 28, 2016, 11:27:47

⏪ vorheriges - nächstes ⏩

Thors1204

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

DF6GL

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.

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Thors1204

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

Beaker s.a.

Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Thors1204

KNALLER!  :D Funktioniert einwandfrei, vielen Dank!
Also jedenfalls nach vorne. Was ist für die Rückwärts-Sping-Funktion zu ändern?

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Thors1204

Ja, Du hast Recht. Das macht es noch etwas besser ;)
Vielen Dank geht jetzt in beide Richtungen, TOP!

Gruß,
Thorsten

ebs17

' vorwärts
Me.Recordset.FindFirst "Datumsfeld = " & _
        Format(DateAdd("dd", 1, Me.txtDatumsfeld), "\#yyyy\-mm\-dd\#")


Für rückwärts dann -1 statt 1.
Mit freundlichem Glück Auf!

Eberhard

Thors1204

Ich danke Euch allen für die guten Tipps und Codes!
Funktioniert alles tadellos :)

Gruß,
Thorsten

Beaker s.a.

#10
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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

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
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

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.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

Hallo Eberhard,
Grrrr  >:(
Zu einfach um drauf zu kommen, - ich hasse mich  ;)
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)