Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Gockel67 am Mai 12, 2026, 12:50:43

Titel: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Gockel67 am Mai 12, 2026, 12:50:43
Moin Gemeinde,

gibt es eine Möglichkeit die zuletzt angezeigten Datensätze (sagen wir mal 20) zu speichern und mit Buttons dann durchzublättern?
Vielleicht hat ja jemand von euch eine Beispieldatei dazu?

Wünsche allen einen schönen Tag
Jörg
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: MzKlMu am Mai 12, 2026, 13:44:35
Hallo,
warum nimmst Du nicht einfach eine Abfrage für die 20 DS?
Dann kannst Du die Abfrage durchblättern.
Oder Du nimmst ein Formular das auf 20 DS gefiltert wird.
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 12, 2026, 14:22:56
Hallo Jörg,

was genau machst Du denn Filters Du die Daten und willst den Filter erneut verwenden oder Scrollst du einfach nur durch oder ???


Gruß
Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Knobbi38 am Mai 12, 2026, 16:43:25
Hallo Jörg,

kannst du bitte mal ein wenig ausholen, damit man auch versteht, was du da eigentlich machen möchtest?

Knobbi38
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Gockel67 am Mai 12, 2026, 17:15:18
Ich hab mich wahrscheinlich missverständlich ausgedrückt.
Ich möchte die letzten 20 Datensätze die ich aufgerufen habe durchblättern können.

Liebe Grüße
Jörg
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 12, 2026, 17:18:25
Wie aufgerufen

Willkürlich und dann wie oder gefiltert und dann wie gib uns etwas mehr bitte

Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Gockel67 am Mai 12, 2026, 18:41:35
Hallo Holger,

der Aufruf erfolgt willkürlich und ist nicht gefiltert.
Es sollen einfach die 20 zuletzt aufgerufenen Datensätze nachzuverfolgen sein.

Liebe Grüße
Jörg
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Knobbi38 am Mai 12, 2026, 19:11:05
Ja gut, dann mußt du dir einfach die letzten 20 Primärschlüssel merken, z.B. in einer Auflistung, und dann diese Informationen in einem Filter anwenden. Am einfachsten geht so etwas mit einer Klasse. Suche mal mit den Begriffen "Bounded Queue FIFO mit Historie VBA" im Internet, dann kommen schon die richtigen Lösungen.

Knobbi38
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 12, 2026, 20:17:26
Hallo Jörg,

das was Knobbi schreibt ist eine gute Lösung.

Hier mal mein (meine Beschreibung) Ansatz dazu:

mit einem Zeitstempel und einer entsprechenden Protokolltabelle kanns Du das meiner Meinung nach umsetzten

Du musst vom Prinzip her folgendes machen:

1. Eien kleine Zusatz-Tabelle erstelle die immer die ID des gerade aufgerufenen Datensatzes und einen Zeitstempel speichert.

2. Ein Formular erstellen, welches dan die lezten z.B.: 20 Einträge aus der Zusatz-Tabelle anzeigt.



Du musst eigentlich folgendes machen

Deine Tabelle anpassen falls nicht vorhanden mit einem Primärschlüssel versehen z.B.: ID

Erstellen der Zusatz-Tabelle z.B.: tblZugriff mit folgenden Feldern

- IDProtokoll (AutoWert)
- IDDaten (Zahl, bezieht sich auf DeineTabelle.ID)
- TimeStamp (Datum/Uhrzeit, Standartwert = Jetzt() )

Eine Abfrage erstellen (qryLetzte20) für die letzten "20 aufgerufenen Datensätze"

SELECT TOP 20
    DeineTabelle.*
FROM
  DeineTabelle
INNER JOIN
    tblZugriff
    ON DeinTabelle.ID = tblZugriff.IDDaten
ORDER BY
    tblZugriff.TimeStamp DESC;

Das sollte die immer die letzten 20 DAtensätze nach TimeStamp anzeigen.


Was ist nun noch weiter zu machen:
Protokollieren beim öffnen oder Erstellen eines Datensatzes

Im entsprechenden Formular kannst Du im Ereignis Form_Current folgendes zufügen:


Private Sub Form_Current()

    Dim idAktuell As Long
   
    If Me.NewRecord Then Exit Sub   
   
    idAktuell = Nz(Me!ID, 0)     
   
    If idAktuell = 0 Then Exit Sub 
   

    CurrentDb.Execute "INSERT INTO tblZugriff (IDDaten) VALUES (" & idAktuell & ");", dbFailOnError

End Sub

Du musst natürlich die Feldnamen anpassen!
Was passiert hier:  Jedes Mal, wenn Du Datensätze aufrufst / wechselst, wird ein Eintrag mit IDDaten und einem aktuellem TimeStamp angelegt.

Jetzt musst Du ein Formular erstellen auf Basis der Abfrage qryLetzte20

Das Formular kannst Du nun als Endlosformualr oder Datenblatt darstllen, wie Du möchtest.

Du musst natürlich noch darauf achten, dass die Tabelle tblZugriff nicht zu groß wird also immer Reorganisieren sprich alles löschen was mehr als X Einträge in der DB ergibt und hier natürlich immer die ältesten zuerst.

Ich hoffe das ist einigermaßen verständlich.

Holger

Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 12, 2026, 20:29:34
Das ist das was Knobbi meint die Lösung gibt noch mehr her:


Sorry der Text ist kopiert aus Google



Eine "Bounded Queue" (begrenzte Warteschlange) nach dem FIFO-Prinzip (First-In-First-Out) mit Historie lässt sich in VBA am besten durch ein Klassenmodul umsetzen. Dieses verwaltet ein festes Array (die Begrenzung) und speichert die Historie (alle jemals hinzugefügten Elemente) in einem separaten Log, beispielsweise auf einem Arbeitsblatt.VBA Lösung: Bounded Queue KlasseKlassenmodul erstellen: Nennen Sie es BoundedQueue.Code einfügen:vba' --- Klassenmodul: BoundedQueue ---
Option Explicit

Private pItems() As Variant
Private pCapacity As Long
Private pSize As Long
Private pHead As Long
Private pTail As Long
Private pHistorySheet As Worksheet

' Initialisierung der Queue
Public Sub Init(Capacity As Long, HistorySheet As Worksheet)
    pCapacity = Capacity
    ReDim pItems(0 To pCapacity - 1)
    pSize = 0
    pHead = 0
    pTail = 0
    Set pHistorySheet = HistorySheet
End Sub

' Element hinzufügen (Enqueue)
Public Sub Enqueue(Item As Variant)
    If pSize = pCapacity Then
        ' Optional: Altes Element entfernen, wenn voll (Overflow)
        Dequeue
    End If
   
    pItems(pTail) = Item
    pTail = (pTail + 1) Mod pCapacity
    pSize = pSize + 1
   
    ' Historie auf dem Arbeitsblatt loggen
    LogToHistory Item
End Sub

' Element entfernen (Dequeue)
Public Function Dequeue() As Variant
    If pSize = 0 Then
        Dequeue = Null
        Exit Function
    End If
   
    Dequeue = pItems(pHead)
    pItems(pHead) = Empty ' Speicher freigeben
    pHead = (pHead + 1) Mod pCapacity
    pSize = pSize - 1
End Function

' Historie in Excel schreiben
Private Sub LogToHistory(Item As Variant)
    Dim nextRow As Long
    nextRow = pHistorySheet.Cells(pHistorySheet.Rows.Count, 1).End(xlUp).Row + 1
    pHistorySheet.Cells(nextRow, 1).Value = Now ' Zeitstempel
    pHistorySheet.Cells(nextRow, 2).Value = Item ' Element
End Sub

Public Property Get Count() As Long
    Count = pSize
End Property
Verwende Code mit Vorsicht.Nutzung der Klasse (Standardmodul)vba' --- Standardmodul ---
Sub TestQueue()
    Dim q As New BoundedQueue
    Dim wsLog As Worksheet
   
    Set wsLog = ThisWorkbook.Sheets("Log") ' Arbeitsblatt für Historie
   
    ' Initialisiere Queue mit Kapazität 5
    q.Init 5, wsLog
   
    ' Elemente hinzufügen
    q.Enqueue "Auftrag 1"
    q.Enqueue "Auftrag 2"
    q.Enqueue "Auftrag 3"
   
    Debug.Print "Queue Größe: " & q.Count ' Ausgabe: 3
End Sub
Verwende Code mit Vorsicht.Kernfunktionen dieser ImplementierungBounded: Die Kapazität wird über ReDim festgesetzt.FIFO: Die pHead/pTail Pointer-Logik (Circular Buffer) stellt sicher, dass das erste Element zuerst entfernt wird.Historie: Die LogToHistory-Prozedur schreibt jeden Enqueue-Vorgang mit Zeitstempel in eine Excel-Tabelle.Overflow Handling: Wenn die Queue voll ist, wird das älteste Element entfernt (Dequeue innerhalb Enqueue), um Platz zu machen.Diese Methode ist ideal, um z.B. die letzten \(N\) Aktivitäten zu verfolgen und gleichzeitig eine vollständige Historie auf einem Blatt zu führen.
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Gockel67 am Mai 12, 2026, 22:49:10
Danke für eure antworten. Das werde ich mir die Tage anschauen.

Liebe Grüße
Jörg
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 13, 2026, 09:55:24
Hallo Jörg,

habe Dir mal auf die schnelle noch eine klein Demo gemacht.

Das Reorganisieren und dass keine doppelten dabei sind, würde ich an Deiner Stelle aber auch noch einbauen.

Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 13, 2026, 10:21:03
Hallo Jörg, habe Dir auch noch das reorganisieren eingebaut. Beim Laden Deines Formulars werden alle Datensätze aus der Tabelle tblZugriff gelöscht. Alle bis auf die letzten 10. Des Weiteren habe ich noch in Backup der Tabelle eingebaut damit Du ggf immer noch einen schritt zurück kannst.

Holger

Hier der Code für Dein Formular

Private Sub Form_Load()

    Const cTblQuelle  As String = "tblZugriff"
    Const cTblBackup  As String = "tblZugriff_Backup"

    Dim strSQL As String

    On Error GoTo ErrorHandler


 
    If DCount("*", "MSysObjects", "Name='" & cTblBackup & "' AND Type=1") > 0 Then
        DoCmd.DeleteObject acTable, cTblBackup
    End If

 
    DoCmd.CopyObject , cTblBackup, acTable, cTblQuelle


   
    If DCount("*", cTblQuelle) > 10 Then

        strSQL = "DELETE * " & _
                 "FROM tblZugriff " & _
                 "WHERE IDProtokoll NOT IN " & _
                 "(SELECT TOP 10 IDProtokoll " & _
                 " FROM tblZugriff " & _
                 " ORDER BY TimeStamp DESC, IDProtokoll ASC);"

        CurrentDb.Execute strSQL, dbFailOnError

    End If


    Exit Sub

ErrorHandler:
    MsgBox "Fehler:" & vbCrLf & Err.Description, vbCritical

End Sub

Gruß
Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Knobbi38 am Mai 13, 2026, 10:38:41
Hallo Holger,

das mit der "Bounded Queue" sollte eigentlich ganz gut funktionieren, allerdings hatte ich da eher an eine Collection gedacht als an ein Implementierung mit einem Array. Wenn es um Eindeutigkeit geht, wäre ein Dictionary vielleicht sogar besser. Das Log per Excel Sheet ist dabei eine, wie ich finde, pfiffige Idee denn so exzessives Einfügen und Löschen führt unweigerlich zum Aufblähen der DB und würde öfters eine Datenkomprimierung notwendig machen. Ich bin mir nicht sicher, ob die Tabelle "tblZugriff" wirklich benötigt wird.

Gruß Knobbi38

 
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 13, 2026, 11:14:16
Hallo Knobbi,

Du hast natürlich recht mit Deiner Lösung, und diese ist auch deutlich "eleganter", was ich auch schon in #8 erwähnt hatte. Aber ich glaube, das Jörg hier mehr private Dinge verwaltet, wenn ich mich richtig entsinne :=)). Daher wird die Datenmenge überschaubar sein. Aus diesem Grund habe ich versucht eine einfache und für Ihn einfach nach zu vollziehende Lösung zu bauen. Und um das Problem des Aufblähens der DB zu vermeiden habe ich ja noch das reorganisieren mit eingebaut. Wenn man nun im privaten Bereich alle 14 Tage die DB beim beenden komprimiert sollte das meiner Meinung nach vollkommen ausreichen (kann man ja auch per vba regeln).

Aber wie gesagt Deine Lösung ist auf jeden Fall die elegantere und auch bessere wenn man von anderen Datenmengen ausgeht.

Gruß
Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Gockel67 am Mai 13, 2026, 16:06:30
Hallo Leute,

vielen Dank für eure ganze Arbeit.

Wünsche allenn Morgen einen schönen Vatertag
Jörg
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 13, 2026, 16:16:24
Hallo Jörg,

kommst du mit der kleine Demo klar?  Auch mit dem Einbau der Reorg?  Wenn nicht, dann sag bescheid, denn Knobbi hat recht mit seinem Vorgehen, aber für Dich ist das "kleinere" glaube ich das richtige, weil es auch besser zu verstehen ist.

Wenn Du was nicht verstehst, oder noch was ist, dann sag bescheid.

Ich würde Dir aber (siehe das was Knobbi schreibt) die kompremierung nach beendigung der DB empfehlen zumindestens alle x mal. Das kann man dann auch per vba Code steuern.

Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Köbi am Mai 13, 2026, 21:24:30
Hallo
Ich möchte auch noch meinen Senf dazugeben und lade hier eine kleine Demo hoch.
Sie entspricht ungefähr dem, was Debus in #8 und #12 vorschlägt. So ähnlich habe ich es vor Jahren schon einmal in einer DB mit über 100'000 Datensätzen realisiert. Hat tadellos funktioniert.
Der Code von Debus und Ulrich (Knobbi38) in #9 ist wohl eher für grössere Anwendungen geeignet.

Zu beachten gilt:
mdlVerlauf
qryVerlauf
Private Sub Form_Current()
Private Sub lstVerlauf_Click()
Datensatzherkunft bei lstVerlauf

Gruss, Köbi
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 13, 2026, 21:30:16
Hallo Köbi passt ja zu meiner Demo in #11 und 12

Habe gerade zwar keinen Rechner da aber hast du da auch eine reorg drin? Dann würde ich mir die gerne mal anschauen

Schönen Abend noch

Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Köbi am Mai 13, 2026, 21:55:44
Guten Abend Holger

"hast du da auch eine reorg drin?" Was verstehst du darunter? Den Begriff in dieser Form kenne ich nicht.

Gruss, Köbi
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 13, 2026, 21:58:58
Reorganisationen so daß sich die dB nicht aufbläht oder hilfstabellen unendlich voll schreiben
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Köbi am Mai 13, 2026, 22:18:51
Also, die DB wird beim Schliessen komprimiert. Das ist so in den Optionen eingestellt.
Ich glaube, das sollte genügen.
Oder hast du eine andere Idee?
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 14, 2026, 07:42:07
Guten Morgen Köbi,

ich meine folendes. Die Tabelle tblVerlauf wird ja immer fortlaufend geschrieben und wird dadurch immer größer. Ich kann diese aber jedesmal bereinigen, so daß nur eine bestimmte Menge an DS vorhanden sind. Das meine ich mit Reorg.

Und zum Thema Kompremieren habe ich es wie folgt gelöst. Ich merke mir das Datum der letzten Kompremierung und mache das nur jedes x. mal die Zahl kann ich frei wählen. Denn ich schreibe alles auf ein Netzlaufwerk, welches wo anders als an meinem Standort liegt. Das dauert halt manchmal recht lange. Daher will ich das flexibel handeln. Ich blende dann für 5 Sek. eine Fenster ein wo ich ja oder nein sagen kann zum kompremieren jetzt aber wenn die zahl x erreicht ist erzwinge ich das ganze halt.

Gruß
Holger


PS ansonsten ist deine Variante ja sehr ähnlich zu meiner.

 
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Knobbi38 am Mai 14, 2026, 13:58:35
Standardmäßig die Datenbankkomprimierung zu aktivieren, war noch nie eine gute Idee. Wenn dabei etwas fehlschlägt, steht am Ende gar keine Datenbank mehr zur Verfügung. Für einen solchen ,,Reorg" bietet sich eine externe Datenbank mit der Verlaufstabelle an, die dann nur verknüpft eingebunden wird. Für einen Reorg würde man den Link löschen, die externe Datenbank per VBA komprimieren und anschließend neu verknüpfen. Damit sollte das Problem des ,,Aufblähens" besser gelöst sein als durch die Aktivierung der automatischen Datenbankkomprimierung.

Knobbi38
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 14, 2026, 14:41:13
Hallo Ulli,

um mal etwas klar zu stellen, ich meine mit Reorg nicht das komprimieren der DB!

Mit der Reorg meine ich folgendes. Die Tabelle tblZugriff, die würde sich ja bis ins unentliche weiterschreiben, daher lösche ich alles was mehr als x Einträge beträgt. Mit X kann ich selber entscheiden wieviel ich im Verlauf stehen haben will. Das meine ich mit Reorg.

Beim komprimieren bin ich bei Dir, daher lass ich meine DB auch nicht automatisch komprimieren. Ich biete es an, aber ich mache auch hier nur jedes xte mal eine komprimierung.

Und dann gehe ich noch wie folgt vor. Ich mache vom Backend zuerst eine Kopie und komprimiere dann. Wenn das erfolgreich war lösche ich die Kopie automatisch. Eine Datensicherung läuft sowieso jede Nacht noch automatisch.

Die Reorg ist glaub ich nun klar es dreht sich nur um die Tabelle tblsZugriff.

Aber was würdest Du anders machen wegen der komprimierung. Bin für Ideen immer aufgeschlossen.

Danke
Holger
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Köbi am Mai 14, 2026, 18:31:03
Guten Abend
Mit Hilfe von KI (Meta AI) habe ich eine neue Version der Datenbank geschafft. Diese lade ich hier hoch.
Merkmale: Der Eintrag im Verlauf kann nach Wunsch im mdlVerlauf eingestellt/beschränkt werden. Also keine übergrosse Tabellen mehr.
Alte Einträge in der Tabelle werden so gelöscht. Die Anzeige im Listenfeld im Formular wird immer aktualisiert, was bisher nicht der Fall war. Also es werden immer die letzten Datensatzwechsel angezeigt.
Komprimieren der DB beim Schliessen habe ich deaktiviert.

Die Lösung funktioniert dank KI, aber ich bin nicht unbedingt glücklich damit. Eigentlich sollte ich selbst dazu fähig sein. Aber ich bin altershalber eigentlich weg vom Fenster.

Gruss, Köbi
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Knobbi38 am Mai 14, 2026, 19:39:21
Hallo Holger,

so hatte ich auch deinen "Reorg" verstanden. Beim Komprimieren würde das auch so machen, allerdings belasse ich die Kopie so wie sie ist und lösche diese erst beim nächsten Komprimiervorgang. Die "Platzverschwendung" ist mir dabei egal.

Wie gesagt, nicht im BE sondern, tatsächlich als separate lokale DB, was die Sache erheblich vereinfacht. Angesichts der geringen Datenmengen könnte man das eigentlich auch einfach weiterlaufen lassen.

Knobbi38
Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Debus am Mai 14, 2026, 19:44:08
Hallo Ulli,

da hast Du recht, und bei Jörg sind die Daten sehr übersichtlich. Da kann man wirklich einfach alles so lassen.

Schönen Abend noch
Holger


Titel: Re: Zuletzt verwendete Datensätze anzeigen
Beitrag von: Gockel67 am Mai 16, 2026, 10:38:59
Moin Gemeinde,

vielen Dank für eure Vorschläge und Programmcodes.
Diese habe ich zwar nicht verwendet aber die haben mich auf den richtigen Weg gebracht.
Den Fifo-Speicher hab ich mit einem einfachen Zähler realisiert.

Wünsche allen ein schönes Wochenende
Jörg