valume91
Goto Top

Beim öffnen zum zuletzt geänderten Datensatz springen

Ich möchte das beim Öffnen meines Formulars automatisch zum zuletzt geänderten Datensatz gesprungen wird.

Hallo liebes Forum

Ich habe ein Formular "Formular Produkteingabe". Ausserdem habe ich ein Feld "DatumAenderung" in dem das Datum der letzten Änderung eines Datensatzes gespeichert wird. Nun speichere ich meinen Datensatz, und schliesse das Formular.
Wie kann ich das nun bewerkstelligen das beim erneutem öffnen des Formulars zum Datensatz gesprungen wird, der den höchsten Wert in "DatumAenderung" hat. Also der Datensatz der zuletzt geändert wurde?

MfG Valume

Content-ID: 117299

Url: https://administrator.de/contentid/117299

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

jhinrichs
jhinrichs 02.06.2009 um 15:47:42 Uhr
Goto Top
Der einfachste Weg (ohne VBA-Programmierung) wäre m. E., in der dem Formular zugrundeliegenden Abfrage (wenn es eine Tabelle ist, eine Abfrage erstellen), die Datensätze absteigend nach DatumAenderung zu sortieren.
Valume91
Valume91 02.06.2009 um 15:55:49 Uhr
Goto Top
Hi jhinrichs

Erstmal danke für die Antwort.
Leider ist das nicht was ich Suche den die sortierung sollte so bleiben wie sie ist. Kannst du mir sagen wie ich das mit VBA mache?

MfG Valume
NetWolf
NetWolf 02.06.2009 um 22:22:47 Uhr
Goto Top
Hi Valume,

mit VBA geht das ganz einfach, leider schreibst du nicht, mit welcher Access-Version du arbeitest. Auch nicht ob du DAO oder ADO verwendest face-sad

Hier mal eine Anleitung:
- mit DMAX den Datensatz finden, der zuletzt geändert wurde
- die ID speichern(merken)
- einen Recordset (Kopie) öffnen
- ID suchen
- Bookmark setzen
- Recordset schließen
- Bookmark anwenden

Gruß
Wolfgang
(Netwolf)
Valume91
Valume91 03.06.2009 um 08:52:11 Uhr
Goto Top
Hi Netwolf

Danke für die Antwort!
Ich arbeite mit Access 2003.
Leider kann ich mit deiner Anleitung so gut wie nichts anfangen, da ich von VBA keine Ahnung habe.
Ein Code Beispiel wäre also nett. ;)

Gruss Valume
jhinrichs
jhinrichs 03.06.2009 um 09:23:01 Uhr
Goto Top
Guten Morgen, bin auch wieder da.

Hier ein schlichtes Code-Beispiel (auf DAO basierend, ggf. ist im Visual-Basic-Editor unter "Extras-Verweise" die DAO-Object-Library zu aktivieren).

In den Formulareigenschaften unter "Ereignis-Beim Öffnen" Ereignisprozedur anklicken, dann öffnet sich der VB-Editor. Dort zunächst, wie oben beschrieben, DAO aktivieren. Dann den vorhandenen Code wie folgt ergänzen:
Option Compare Database

Private Function SQLDate(InDate As String) As String

  Dim sDay, sMonth, sYear As String
  Dim sDatVal As String

  sDatVal = DateValue(InDate)
  
  sDay = Day(sDatVal)
  sMonth = Month(sDatVal)
  sYear = Year(sDatVal)

  SQLDate = "#" & sMonth & "/" & sDay & "/" & sYear & "#"  

End Function



Private Sub Form_Open(Cancel As Integer)

  Dim rst As DAO.Recordset
  Dim query As String

  Set rst = Me.Recordset

  query = "DatumAenderung=" & SQLDate(DMax("[DatumAenderung]", "Tabellenname"))  

  rst.MoveFirst
  rst.FindFirst (query)
    
End Sub

Natürlich noch "Tabellenname" entsprechend anpassen.

Die Funktion SQLDate dient nur der Übersetzung des Datumsformates in das SQL-Format, welches für die Find-Funktion genutzt wird. Implizit wird vorausgesetzt, dass es nur ein maximales "DatumAenderung" gibt, auf jeden Fall wird mit der o.a. Methode der erste Tabelleneintrag gefunden, dessen DatumAenderung dem Maximum entspricht.
Ich habe jetzt mal das Datumsformat angenommen. Wenn es sich um eine Zahl oder ein Datum mit Uhrzeit (ja wahrscheinlich sinnvoller) handelt, ist der Suchstring query entsprechend anzupassen.

Das sollte es gewesen sein.

Viele Grüße

EDIT:

Hier noch ein Codebeispiel mit automatischem Setzen eines TimeStamps und entsprechender Anzeige, etwas einfacher, da die Datumsformatumwandlung entfällt:

Option Compare Database

Private Sub Form_Open(Cancel As Integer)

  Dim rst As DAO.Recordset
  Dim query As String

  Set rst = Me.Recordset

  query = "DatumAenderung=" & Replace(DMax("[DatumAenderung]", "Tabellenname"), ",", ".")  

  rst.MoveFirst
  rst.FindFirst (query)
   
End Sub


Private Sub Test_Dirty(Cancel As Integer)
  
  Me.DatumAenderung = Now()
  
End Sub
Valume91
Valume91 03.06.2009 um 12:54:17 Uhr
Goto Top
wow danke jhinrichs
Leider funktioniert das bei mir nicht, nurschon aus dem Grund das ich den verweis DAO-Object-Library nicht in meiner Liste habe:S
Datumsformat ist richtig, jedoch mit Uhrzeit. Wie soll ich das nun anpassen?
Und noch eine verständnissfrage: Warum kommt eigendlich das "Option Compare Database" vor dem Private Sub?
Das wird bei mir dann immer oben an den Trennstrich genommen...

MfG Valume
jhinrichs
jhinrichs 03.06.2009 um 14:13:41 Uhr
Goto Top
Hallo,

1. DAO sollte bei Access 2003 dabei sein. Wenn es in der Extras-Verweise-Liste nicht angezeigt wird, ist ggf. die DLL nicht richtig registriert. Suche einmal die dao360.dll (ggf. auf der Office-CD, dann auf die Platte kopieren)und führe dann auf der Kommandozeile

regsvr32.exe C:/Pfad/Zur/dao360.dll

aus.

2. Hier eine angepasste SQLDate-Funktion für das Format mit Datum und Uhrzeit, Beispiel 1 sollte damit laufen.

Private Function SQLDate(InDate As String) As String
  Dim sDay, sMonth, sYear As String
  Dim ZeitFormat As String
  Dim sDatVal As String
  
  sDatVal = InDate
  
  sDay = Day(sDatVal)
  sMonth = Month(sDatVal)
  sYear = Year(sDatVal)
  
  ZeitFormat = "hh:nn:ss"  
      
  SQLDate = "#" & sMonth & "/" & sDay & "/" & sYear & " " & Format(sDatVal, ZeitFormat) & "#"  
    
End Function

3. Option Compare Database sorgt für eine der Ländereinstellung der DB angepasste Sortierreihenfolge, für unser Beispiel unerheblich, taucht im VB-Editor aber automatisch auf.

P.S.:
Programmierung ginge sicherlich "eleganter", der Code sollte aber möglichst selbsterklärend sein.
Valume91
Valume91 10.06.2009 um 16:16:37 Uhr
Goto Top
So sorry habs erst jetzt getestet, funktioniert prima!
Danke nochmals jhinrichs!