Der übliche Weg, um Daten aus Tabellen in Access-Formularen anzuzeigen, ist die Angabe einer Tabelle oder Abfrage als Datenquelle und das Binden der Steuerelemente an die Felder dieser Quelle. Es gibt jedoch Anwendungsfälle, in denen diese Vorgehensweise nicht das gewünschte Ergebnis liefert. Dann kann man einen alternativen Weg gehen, auch wenn man damit viel Vorteile aufgibt und eine Menge zusätzlicher Aufwand entsteht. In diesem Beitrag erläutern wir, wie man die Daten aus Tabellen oder Abfragen auch ohne direkte Bindung an eine Tabelle oder Abfrage in einem Formular anzeigen, bearbeiten und wieder speichern kann und wie sogar das Anlegen neuer Datensätze möglich ist.
Anwendungsfälle für ungebundene Formulare
Access bietet mit der Bindung von Formularen und Steuerelementen an Tabellen oder Abfragen samt Feldern eine sehr einfache Möglichkeit, Daten anzuzeigen, zu bearbeiten und diese wieder zu speichern.
Man kann allerdings auch den gewünschten Datensatz per VBA öffnen und die Daten auslesen und in die Steuerelemente eines Formulars schreiben. Wenn der Benutzer die gewünschten Änderungen durchgeführt hat, lassen sich diese Daten per VBA sogar wieder zurück in die Tabelle schreiben. Damit ist allerdings ein stark erhöhter Programmieraufwand verbunden. Außerdem kann man damit nur jeweils einen Datensatz in einem Formular anzeigen. Die Datenblattansicht oder die Endlosansicht können wir so nicht mit Daten füllen. Die einzige Möglichkeit, mehrere Datensätze anzuzeigen, wäre ein Listenfeld, dem wir die Daten als Wertliste zuweisen.
Also fragt man sich: Aus welchem Grund sollte man sich diese Arbeit machen, wenn Access doch alle notwendigen Funktionen durch die Datenbindung anbietet? Uns fallen die folgenden Szenarien ein:
- Datensicherheit: Beim Zugriff auf geschützte Backenddatenbanken liegt das Kennwort unverschlüsselt beispielsweise in der Eigenschaft Datensatzquelle vor. Bei ungebundenen Formularen können wir das Kennwort im Code verstecken.
- Kontrolle: Gebundene Formulare und Steuerelemente übernehmen viele Aufgaben automatisch, aber das kann auch ein Nachteil sein. Wenn es keine andere Möglichkeit gibt, zum Beispiel die eingebaute Prüfung von Gültigkeitsregeln oder Restriktionen zu umgehen, das aber notwendig ist, hilft ein ungebundenes Formular.
- Datensatzsperrungen: Im Mehrbenutzerbetrieb können Datensatzsperrungen oder gleichzeitiges Bearbeiten zu Verzögerungen oder Datenverlust führen. Bei ungebundenen Formularen treten Sperrungen maximal beim Lesen oder Schreiben auf, nicht während der gesamten Bearbeitung.
In den folgenden Abschnitten erläutern wir diese Gründe etwas ausführlicher.
Ungebundene Formulare für mehr Datensicherheit
Ein Grund für den Einsatz von ungebundenen Formularen ist die Datensicherheit. Angenommen, wir arbeiten mit einem Frontend und einem Backend, wobei die Daten im Backend durch ein Kennwort geschützt sind. Dann gibt es keine wirklich sichere Möglichkeit, per Datenbindung auf die Daten im Backend zuzugreifen, ohne dass das Kennwort abgegriffen werden kann. Dieses wird nämlich in der Verbindungszeichenfolge gespeichert – und das unverschlüsselt.
Mehr eigene Kontrolle durch ungebundene Formulare
In der Regel profitiert man davon, gebundene Formulare zu nutzen, denn damit werden gleich bei der Dateneingabe verschiedene Regeln wie Gültigkeitsregeln, Restriktionen durch Verknüpfungen oder Datentypen berücksichtigt. Manchmal ist das aber vielleicht nicht gewünscht.
Bei ungebundenen Formularen werden die im Datenmodell definierten Regeln gar nicht berücksichtigt – dies geschieht erst beim Speichern eines geänderten oder neuen Datensatzes.
Datensatzsperrungen und Mehrbenutzerbetrieb
Wollen zwei Benutzer auf den gleichen Datensatz zugreifen, kann das je nach festgelegtem Mechanismus für Datensatzsperrungen entweder gar nicht funktionieren oder zu Konflikten führen. Wenn man dies verhindern möchte und es okay ist, wenn die Änderungen des zuletzt auf den Datensatz zugreifenden Benutzers übernommen werden sollen, egal, ob zwischenzeitlich andere Änderungen vorgenommen wurden, kann der Einsatz eines ungebundenen Formulars sinnvoll sein. Dieses sperrt den Datensatz je nach Einstellungen maximal beim Zurückschreiben eines geänderten Datensatzes.
Ungebundenes Formular mit Daten füllen
Auch wenn es auf den ersten Blick merkwürdig aussieht: Der schnellste Weg zu einem Formular, das die Daten eines Datensatzes anzeigt, ohne an diesen gebunden zu sein, führt über das Erstellen eines herkömmlichen gebundenen Formulars.
Der Grund ist einfach: Nicht nur erleichtert die Datenbindung unter Access das Anzeigen, Bearbeiten und Speichern von Daten, sondern Access ist auch optimal darauf vorbereitet, gebundene Formulare zu erstellen. Aber das wissen Sie ja bereits.
Dennoch können Sie eine der beiden folgenden Alternativen nutzen:
- Sie legen ein Formular an, legen eine Tabelle oder Abfrage als Datensatzquelle fest, ziehen die gewünschten Felder aus der Feldliste in den Formularentwurf und leeren dann die Datensatzquelle und die Eigenschaft Steuerelementinhalt der hinzugefügten Steuerelemente wieder. Dann liegen bereits alle Steuerelemente mit korrekt beschriftetem Bezeichnungsfeld vor und haben außerdem einen Namen, der dem Feld entspricht, dessen Inhalt sie anzeigen sollen.
- Oder Sie legen ein Formular an und fügen für jedes Feld der Tabelle oder Abfrage ein Steuerelement hinzu. Für diese passen Sie dann zuerst die Beschriftungsfelder an und dann die Namen der Steuerelemente, damit wir diese später für das Schreiben und Lesen der enthaltenen Daten referenzieren können.
Wir denken, dass die erste Methode schneller funktioniert und wir damit außerdem die Steuerelemente sinnvoll anordnen können.
Beispieltabelle für ein ungebundenes Formular
Als Beispieltabelle verwenden wir eine sehr einfach gehaltene Kundentabelle namens tblKunden, die lediglich das Primärschlüsselfeld KundeID sowie die Textfelder Vorname, Nachname, Anrede, Strasse, PLZ, Ort und Land enthält. Diese sieht mit einigen Beispieldatensätzen wie in Bild 1 aus.
Bild 1: Tabelle mit Beispieldaten
Schritt 1: Gebundenes Formular erstellen
Damit erstellen wir nun ein neues gebundenes Formular. Dazu gehen wir wie folgt vor:
- Legen Sie ein neues Formular an.
- Wählen Sie für die Eigenschaft Datensatzquelle die Tabelle tblKunden aus.
- Ziehen Sie alle Felder aus der Feldliste in den Detailbereich des Formularentwurfs.
- Speichern Sie das Formular unter dem Namen frmKundenUngebunden und schließen Sie es wieder.
Das Formular sieht nun wie in Bild 2 aus.
Bild 2: Das gebundene Formular
Schritt 2: Formularbindung aufheben
Nun erledigen wir die folgenden Schritte, um die Bindung von Formular und Steuerelementen aufzuheben:
- Leeren Sie die Eigenschaft Datensatzquelle des Formulars.
- Leeren Sie die Eigenschaft Steuerelementinhalt aller gebundenen Steuerelemente.
Letzteres geht am schnellsten, indem Sie alle gebundenen Steuerelemente markieren und dann die Eigenschaft Steuerelementinhalt bearbeiten. Diese wird nun zunächst leer angezeigt, weil sie für die verschiedenen markierten Steuerelemente unterschiedliche Werte enthält (siehe Bild 3). Wie aber sollen wir eine leere Eigenschaft leeren? Dazu geben wir ein beliebiges Zeichen ein und entfernen diese wieder. Anschließend ist die Eigenschaft wirklich leer, wie das Anklicken der einzelnen Steuerelemente zeigt.
Bild 3: Die Eigenschaft Steuerelementinhalt wird leer angezeigt, weil die markierten Steuerelemente unterschiedliche Werte für diese Eigenschaft aufweisen.
Wechseln wir nun zur Formularansicht, sehen wir ein Formular mit leeren Steuerelementen, die wir nach Bedarf füllen können.
Unnötige Elemente entfernen
In einem ungebundenen Formular benötigen wir die Elemente für die Navigation in den Datensätzen nicht.
Daher stellen wir die Eigenschaften Navigationsschaltflächen und Datensatzmarkierer auf den Wert Nein ein.
Ersten Datensatz der Tabelle oder Abfrage anzeigen
Nun wollen wir die Steuerelemente mit den Daten eines Datensatzes füllen. Nur welchen verwenden wir? Wir verwenden zunächst den ersten Datensatz. Später schauen wir uns an, wie wir das Formular für die Anzeige eines speziellen Datensatzes öffnen können.
Um das Formular mit den Daten eines Datensatzes zu versehen, benötigen wir eines der Ereignisse, die direkt beim Öffnen des Formulars ausgelöst werden. In diesem Fall nutzen wir direkt das Ereignis Beim Öffnen.
Nachdem wir dieses angelegt haben, ergänzen wir die leere Prozedur um die folgenden Zeilen:
Private Sub Form_Open(Cancel As Integer) Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("SELECT TOP 1 * " _ & "FROM tblKunden", dbOpenDynaset) Me!KundeID = rst!KundeID Me!Vorname = rst!Vorname Me!Nachname = rst!Nachname Me!Anrede = rst!Anrede Me!Strasse = rst!Strasse Me!PLZ = rst!PLZ Me!Ort = rst!Ort Me!Land = rst!Land rst.Close Set rst = Nothing Set db = Nothing End Sub
[
Diese Prozedur erstellt ein Database– und ein Recordset-Objekt und liest lediglich den ersten Datensatz der Tabelle tblKunden in das Recordset ein (TOP 1).
Dann schreibt sie die Werte der einzelnen Felder der Tabelle in die jeweiligen Textfelder.
Anschließend schließt sie das Recordset und leert die Variablen rst und db.
Öffnen wir das Formular nun in der Formularansicht, zeigt es wie in Bild 4 den gewünschten Datensatz an. Wir können die Daten nun ändern, allerdings werden die Änderungen nicht in die zugrunde liegende Tabelle übernommen.
Bild 4: Daten im ungebundenen Formular
Bevor wir dies programmieren, wollen wir nun zunächst dafür sorgen, dass wir das Formular mit einem bestimmten Datensatz öffnen können.
Formular mit gewünschtem Datensatz öffnen
Wenn Sie ein gebundenes Formular öffnen und mit diesem direkt einen bestimmten Datensatz anzeigen wollen, haben Sie verschiedene Möglichkeiten. Eine davon ist, eine Bedingung mit dem Parameter WhereCondition zu übergeben. So gern wir diese weiter nutzen würden: der übergebene Wert lässt sich für ungebundene Formular nicht auslesen.
Also gehen wir direkt zur nächsten Möglichkeit, einen Wert zu übergeben. Dazu nutzen wir den OpenArgs-Parameter der DoCmd.OpenForm-Methode. Damit übergeben wir den Wert des Primärschlüsselfeldes des Datensatzes, den wir im ungebundenen Formular anzeigen wollen, hier den Wert 2:
DoCmd.OpenForm "frmKundenUngebunden", OpenArgs:="2"
Den Parameter werten wir in einer Erweiterung der Form_Open-Methode wie folgt aus:
Private Sub Form_Open(Cancel As Integer) Dim db As DAO.Database Dim rst As DAO.Recordset Dim lngKundeID As Long Set db = CurrentDb lngKundeID = Nz(Me.OpenArgs, 0) If lngKundeID = 0 Then Set rst = db.OpenRecordset("SELECT TOP 1 * " _ & "FROM tblKunden", dbOpenDynaset) Else Set rst = db.OpenRecordset("SELECT TOP 1 * " _ & "FROM tblKunden WHERE KundeID = " _ & lngKundeID, dbOpenDynaset) End If ... End Sub
Wir weisen der Variablen lngKundeID den Wert der Eigenschaft OpenArgs zu. Diese enthält den übergebenen Wert oder, wenn kein Wert übergeben wurde, den Wert Null. lngKundeID hat dann also entweder den Primärschlüsselwert des anzuzeigenden Datensatzes oder den Wert 0.
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