Ungebundene Daten in Übersicht und Detailansicht

Ausgangspunkt des Beitrags

Bild 1: Ausgangspunkt des Beitrags

In den beiden Beiträgen „Daten in ungebundenen Formularen bearbeiten“ (www.access-im-unternehmen.de/1442) und „Ungebundene Listen und Kombis mit Daten füllen“ (www.access-im-unternehmen.de/1440) haben wir Möglichkeiten aufgezeigt, um Daten ohne die Bindung an Tabellen oder Abfragen in Formularen und Steuerelementen anzuzeigen. In diesem Beitrag gehen wir einen Schritt weiter und kombinieren die beiden Darstellungen einer Übersicht von Daten und der Detailansicht eines ausgewählten Datensatzes. Dabei zeigen wir, wie wir in der Übersicht einen Datensatz auswählen und diesen zum Bearbeiten öffnen, einen neuen Datensatz anlegen oder Datensätze löschen.

Ausgangspunkt für das Beispiel zu diesem Beitrag sind die Formulare aus den oben genannten Beiträgen. Dabei wollen wir das Formular mit der Übersicht der Kunden in einem Listenfeld, das wir in frmKundenuebersicht umbenannt haben, um einige Elemente erweitern (siehe Bild 1).

Ausgangspunkt des Beitrags

Bild 1: Ausgangspunkt des Beitrags

Wir haben die folgenden Erweiterungen vorgesehen:

  • Hinzufügen einer Schaltfläche zum Anzeigen des aktuell ausgewählten Eintrags im Detailformular frmKundendetails (ebenfalls ungebunden)
  • Hinzufügen einer Funktion, mit welcher der entsprechende Datensatz per Doppelklick auf den jeweiligen Eintrag im Listenfeld angezeigt werden kann
  • Hinzufügen einer Schaltfläche zum Anlegen eines neuen Datensatzes über das Formular frmKundendetails
  • Hinzufügen einer Schaltfläche zum Löschen des aktuell markierten Datensatzes aus der zugrunde liegenden Tabelle
  • Programmieren von Funktionen, die dafür sorgen, dass Änderungen an Datensätzen oder neu hinzugefügte Datensätze nach dem Schließen des Formulars frmKundendetails direkt im Listenfeld widergespiegelt werden

Anlegen der Schaltflächen

Bei der Gestaltung der Schaltflächen haben wir neben den Beschriftungen auch noch Icons hinzufügt. Außerdem haben wir die Einstellung Vertikaler Anker auf Unten eingestellt, damit diese, wenn das Formular und das Listenfeld vergrößert werden, ebenfalls nach unten verschoben werden (für das Listenfeld ist diese Einstellung auf den Wert Beide eingestellt). Die Schaltflächen heißen cmdBearbeiten, cmdAnlegen und cmdLoeschen (siehe Bild 2).

Schaltflächen für die Datenoperationen

Bild 2: Schaltflächen für die Datenoperationen

Bearbeiten eines Datensatzes per Schaltlfläche

Um den aktuell im Listenfeld markierten Datensatz im Formular frmKundendetails anzuzeigen, verwenden wir die Schaltfläche cmdBearbeiten hinzu.

Für diese hinterlegen wir die folgende Prozedur:

Private Sub cmdBearbeiten_Click()
     If Not IsNull(Me!lstKundenUngebunden) Then
         DoCmd.OpenForm "frmKundendetails", _
             OpenArgs:=Me!lstKundenUngebunden, _
             WindowMode:=acDialog
     Else
         MsgBox "Bitte markieren Sie einen Datensatz.", _
             vbOKOnly + vbExclamation, _
             "Kein Datensatz markiert"
     End If
End Sub

Diese Prozedur prüft, ob im Listenfeld überhaupt ein Eintrag markiert ist. Falls ja, öffnet sie das Formular frmKundendetails als modalen Dialog und übergibt den Primärschlüsselwert des markierten Eintrags mit dem Parameter OpenArgs.

Ist aktuell kein Eintrag markiert, erscheint eine Meldung mit einem entsprechenden Hinweis.

Im Formular frmKundendetails nimmt die Prozedur Form_Open das Öffnungsargument über die Eigenschaft OpenArgs entgegen und zeigt die Daten des entsprechenden Datensatzes an. Die Details hierzu finden Sie im Beitrag Daten in ungebundenen Formularen bearbeiten (www.access-im-unternehmen.de/1442).

Nun wird es interessant: In gebundenen Formularen würden wir nun nach dem Bearbeiten des Datensatzes im Detailformular das Formular ausblenden, wodurch der Code im aufrufenden Formular fortgesetzt würde. Hier würden wir dann abfragen, ob das Detailformular noch geöffnet ist und gegebenenfalls auf die geänderten Daten reagieren, bevor wir die Daten im aufrufenden Formular entsprechend anpassen. Dazu reicht dann meist ein Aufruf der Methode Requery der Übersicht.

Hier können wir ähnlich vorgehen. Wir machen das Detailformular beim Anklicken der OK-Schaltfläche unsichtbar, damit wir im aufrufenden Formular feststellen können, ob der Benutzer die OK– oder die Abbrechen-Schaltfläche gedrückt hat (die Abbrechen-Schaltfläche würde das Formular direkt schließen).

Den Code der OK-Schaltfläche passen wir dazu wie folgt an:

Private Sub cmdOK_Click()
     ...
     Me.Visible = False
End Sub

Im aufrufenden Formular können wir nun allerdings nicht die Requery-Methode des Listenfeldes aufrufen, da das Listenfeld nicht an eine Tabelle oder Abfrage gebunden ist, sondern anderweitig gefüllt wurde. An dieser Stelle haben wir nun zwei Möglichkeiten:

  • Wir füllen das Listenfeld erneut oder
  • wir lesen nur den geänderten Wert erneut ein.

Die erste Variante ist schnell erledigt: Wir rufen einfach die Prozedur, welche die Daten in das Listenfeld einliest, erneut auf. Die Erweiterung sieht wie folgt aus:

...
If Not IsNull(Me!lstKundenUngebunden) Then
     DoCmd.OpenForm "frmKundendetails", _
         OpenArgs:=Me!lstKundenUngebunden, _
         WindowMode:=acDialog
     If IstFormularGeoeffnet("frmKundendetails") Then
         KundenEinlesen
     End If
...

Damit ist die Aufgabe prinzipiell erledigt. Wir rufen das Detailformular auf, nehmen eine Änderung vor, schließen das Detailformular und der Inhalt des Listenfeldes wird aktualisiert. In der aktuellen Fassung der Prozedur, welche die Daten der Tabelle tblKunden einliest und dem Listenfeld lstKunden hinzufügt, wird das Listenfeld allerdings vorher nicht geleert. Das bedeutet, dass die aktualisierten Daten durch die Aufrufe der AddItem-Methode an die bestehenden Daten angehängt werden. Um dies zu ändern, müssen wir das Listenfeld an irgendeiner Stelle leeren, was wir mit der folgenden Anweisung erledigen können:

Me!lstKundenUngebunden.RowSource = ""

[

Diese können wir beispielsweise in der Prozedur KundenEinlesen vor der Do While-Schleife einfügen. Allerdings gibt es noch eine Alternative.

Gezieltes Aktualisieren der Daten des Listenfeldes

Da wir ein ungebundenes Listenfeld nutzen und dieses mit der AddItem-Methode füllen, können wir uns auch noch eine Alternative zum erneuten Laden aller Daten ansehen – denn je nach der Menge der Datensätze kann dieser Vorgang durchaus zu sichtbaren Verzögerungen führen.

Also erstellen wir eine Prozedur namens KundeAktualisieren, die wir von cmdBearbeiten_Click aus wie folgt aufrufen.

Dabei übergeben wir den Primärschlüsselwert des geänderten Datensatzes sowie seinen Index im Listenfeld, den wir mit der Eigenschaft ListIndex ermitteln:

Private Sub cmdBearbeiten_Click()
     ...
         If IstFormularGeoeffnet("frmKundendetails") Then
             KundeAktualisieren Me!lstKundenUngebunden, _
                 Me!lstKundenUngebunden.ListIndex
         End If
     ...
End Sub

Die Prozedur KundeAktualisieren erstellt ein neues Recordset auf Basis der Tabelle tblKunden mit dem geänderten Datensatz (siehe Listing 1). Ist dieses Recordset nicht leer, entfernt die Prozedur zuerst den vorhandenen Eintrag mit der RemoveItem-Methode. Den zu entfernenden Datensatz identifizieren wir mit dem Index aus lngIndex.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar