Home > Artikel > Ausgabe 4/2014 > Datenmakros II: Datenoperationen

Datenmakros II: Datenoperationen

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Datenmakros und benannte Makros liefern vor allem die interessante Möglichkeit, grundlegende Datenoperationen durchzuführen – also beispielsweise das Anlegen neuer Datensätze, das Bearbeiten oder Löschen vorhandener Datensätze, das Durchlaufen von Datensatzgruppen oder das Auffinden bestimmter Datensätze. Prinzipiell bilden Sie damit die Basisoperationen der DAO-Bibliothek auf Makro-Ebene ab. Dieser Artikel stellt die Datenoperationen im Detail vor.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1402_Makros.mdb.

Datenoperationen

Die neuen Datenmakros sollen es vor allem ermöglichen, endlich auch per Makro einfache Datenoperationen auszuführen – also etwa einen neuen Datensatz anzulegen, vorhandene Datensätze zu ändern und zu löschen oder auch einfach auf die Felder eines Datensatzes zuzugreifen.

Diese Operationen bilden Sie typischerweise unter VBA ab – und zwar mit dem Recordset-Objekt und Befehlen wie AddNew, Edit, Update oder FindFirst.

Zu Testzwecken haben wir eine kleine Tabelle namens tblKunden angelegt, die allerdings nur das Primärschlüsselfeld KundeID, das Fremdschlüsselfeld AnredeID sowie die beiden Textfelder Vorname und Nachname enthält (siehe Bild 1).

Beispieltabelle für Testzwecke

Bild 1: Beispieltabelle für Testzwecke

Wenn Sie nun beispielsweise einen neuen Datensatz in der Tabelle anlegen möchten, benötigen Sie ein benanntes Makro für diese Tabelle. Dieses legen Sie bei in der Datenblattansicht geöffneter Tabelle über den Ribbonbefehl Ta­bel­le|Be­nannte Makros|Be­nanntes Ma­kro|Be­nanntes Makro erstellen an.

In diesem Makro fügen Sie nun zunächst den Befehl Datensatz erstellen in ein und wählen die Tabelle tblKunden als Ziel der Aktion aus.

Dieser Aktion können Sie weitere Befehle unterordnen, und zwar Gruppieren, Kommentar, Wenn, AbbrechenDatensatzänderung, FestlegenFeld und FestlegenLokaleVar.

In diesem Fall wollen wir die drei Felder AnredeID, Vorname und Nachname mit den entsprechenden Werten füllen. Dies erledigen wir, indem wir drei Mal die Makroaktion FestlegenFeld hinzufügen, unter Name das Zielfeld auswählen und unter Wert den einzutragenden Wert angeben (siehe Bild 2).

Datenmakro zum Anlegen eines neuen Datensatzes in der Tabelle tblKunden

Bild 2: Datenmakro zum Anlegen eines neuen Datensatzes in der Tabelle tblKunden

Dabei ist zu beachten, dass Sie Literale in Anführungszeichen einfassen. Anderenfalls sucht Access nach einem entsprechenden Ausdruck und löst einen Fehler aus.

Dieses Makro soll nun also einen Datensatz zur Tabelle tblKunden hinzufügen. Aber wie rufen wir das Makro auf? Dazu benötigen wir ein weiteres Makro, dem wir die Makroaktion AusführenDatenmakro zuweisen. Diese erwartet als Parameter den Namen des aufzurufenden Datenmakros mit führendem Tabellennamen, also hier tblKunden.dmkKundeAnlegen (siehe Bild 3). Ein erster Testaufruf des Makros makKundeAnlegen bringt das gewünschte Ergebnis – der Datensatz wird angelegt.

Dieses Makro ruft das Datenmakro zum Anlegen eines Kundendatensatzes auf.

Bild 3: Dieses Makro ruft das Datenmakro zum Anlegen eines Kundendatensatzes auf.

Datenmakro mit Parametern

Als Nächstes wollen wir das doch recht statische Makro etwas dynamischer gestalten – und zwar, indem wir die in die Tabelle tblKunden einzufügenden Werte per Parameter übergeben.

Dazu erstellen wir ein weiteres benanntes Makro für die Tabelle tblKunden. Diesmal klicken wir jedoch zunächst drei Mal auf den Text Parameter erstellen oben rechts im Makro-Entwurf und erzeugen so drei Zeilen zur Eingabe von Parametern. Diese nennen wir prmAnredeID, prmVorname und prmNachname.

Nun fügen Sie wieder die Makroaktion Datensatz erstellen in hinzu, legen die Tabelle tblKunden als Ziel fest und tragen unterhalb dieser Makroaktion drei Mal den Befehl FestlegenFeld ein. Die Feldnamen lauten wieder wie im vorherigen Beispiel. Allerdings geben wir diesmal nicht direkt die einzufügenden Werte an, sondern die Namen der weiter oben definierten Parameter – also etwa den Parameter prmAnredeID für das Feld AnredeID. Die Parameter lassen sich bequem per IntelliSense aus der Liste der verfügbaren Elemente auswählen (siehe Bild 4).

Benanntes Makro mit Parametern

Bild 4: Benanntes Makro mit Parametern

Nun folgt der zweite Teil: die Definition des Makros, mit dem wir das Datenmakro aufrufen und diesem die Werte für die Parameter übergeben.

Dazu erstellen Sie ein neues Makro namens macKundeAnlegenMitParameter und fügen diesem wieder die Makroaktion AusführenDatenmakro hinzu (siehe Bild 5). Diesmal wählen Sie das Makro tblKunden.dmkKundeAnlegenMitParameter für den Parameter Makroname aus. Nach der Auswahl des auszuführenden Makros erscheinen gleich die drei für das benannte Makro definierten Parameter. Hier geben wir wieder die gewünschten Werte ein (Anführungszeichen bei Zeichenketten nicht vergessen) und führen das Makro dann aus. Es funktioniert – auch dies legt den Datensatz mit den angegebenen Daten an.

Aufruf eines benannten Makros mit Parametern

Bild 5: Aufruf eines benannten Makros mit Parametern

Parameter per VBA übergeben

Nun möchten wir aber vielleicht das benannte Makro per VBA aufrufen. Wie übergeben wir die notwendigen Parameter mit der Methode RunDataMacro? Der Versuch, dieses einfach ohne Angabe von Parametern aufzurufen, führt direkt zu einem Laufzeitfehler (siehe Bild 6).

Aufruf eines Datenmakros ohne Angabe der Parameter

Bild 6: Aufruf eines Datenmakros ohne Angabe der Parameter

Die Antwort lautet: Wir übergeben die Parameter gar nicht mit dieser Methode. Stattdessen legen wir die Parameter vorher fest, und zwar mit einer eigenen DoCmd-Methode. Das sieht dann für dieses Beispiel wie in Bild 7 aus. Wichtig ist an dieser Stelle, dass Sie Zeichenketten nicht nur in Anführungszeichen, sondern zusätzlich in Hochkommata einfassen (oder zusätzliche doppelte Anführungszeichen: """Maria""").

Vorherige Angabe der Parameter

Bild 7: Vorherige Angabe der Parameter

Nach dem Aufruf der drei DoCmd.SetParameter-Anweisungen sowie der RunDataMacro-Methode wird der neue Datensatz in der Tabelle tblKunden angelegt. Anzumerken ist noch, dass die mit SetParameter gesetzten Parameter mit dem Aufruf der RunDataMacro-Methode geleert werden, sodass ein erneuter Aufruf des benannten Makros einen Fehler auslöst.

DLookup im Makro

Nun erhöhen wir den Schwierigkeitsgrad: Ein neues benanntes Makro soll nur die Anrede, aber nicht den Primärschlüsselwert des entsprechenden Datensatzes in der Tabelle tblAnreden als Parameter erhalten. Das heißt, dass das benannte Makro selbst die AnredeID für die angegebene Anrede ermitteln muss.

Das ist eigentlich recht einfach – wenn man weiß, auf welche Kleinigkeiten man achten muss. In diesem Fall erstellen Sie wiederum ein neues benanntes Makro für die Tabelle tblKunden. Diesmal geben Sie statt des Parameters prmAnredeID den Parameter prmAnrede an – es soll also nicht mehr direkt die AnredeID übergeben werden, sondern die Bezeichnung der Anrede.

Um die AnredeID aus der Tabelle tblAnreden zu ermitteln, gehen wir wie folgt vor: Zunächst legen Sie im benannten Makro dmcKundeAnlegenMitAnrede die Makroaktion Datensatz nachschlagen in an. Dieser weisen Sie als Quelle die Tabelle tblAnreden zu. Die erste Hürde, die den meisten etwas Kopfzerbrechen bereiten dürfte, ist die Formulierung der Bedingung, die genau den Datensatz mit der angegebenen Anrede liefert. Intuitiv würde man hier einen Ausdruck wie den folgenden unterbringen:

="Anrede = '" & prmAnrede & "'"

Dieser Versuch misslingt jedoch. An dieser Stelle ist dann guter Rat teuer. Wie soll ich ohne meine gewohnten VBA-Werkzeuge mal eben debuggen und beispielsweise herausfinden, welches Ergebnis mir der hier verwendete Ausdruck liefert? Aber das ist kein Problem: Es gibt ja die Makroaktion ProtokollierenEreignis, mit dem wir einen beliebigen Ausdruck in die Tabelle USysApplicationLog eintragen können. Also verwenden wir diesen wie in Bild 8 und lassen uns das Ergebnis des ermittelten Ausdrucks in dieser Tabelle ausgeben.

Benanntes Makro inklusive Ermittlung von Lookup-Werten

Bild 8: Benanntes Makro inklusive Ermittlung von Lookup-Werten

Dabei ist noch anzumerken, dass wir mit einem Alias für das mit Datensatz nachschlagen in ermittelte Recordset arbeiten, das wir mit rstAnreden bezeichnen. Dadurch können wir über diesen Bezeichner auf die im Recordset enthaltenen Feldwerte zugreifen.

Nun: Der genannte Ausdruck liefert nicht das gewünschte Ergebnis, stattdessen einfach den ersten Datensatz. Wenn Sie also Frau als Anrede übergeben, erhalten Sie nicht den Wert 2 aus dem Feld AnredeID, sondern den Wert 1 (für Herr). Dies ist ein gutes Beispiel dafür, dass niemals nur mit Standardwerten (in diesem Fall den ersten Datensatz der Tabelle tblAnreden) testen sollte, da man sonst später nachkorrigieren muss. Der korrekte Ausdruck, um mit Datensatz nachschlagen in tatsächlich die AnredeID für den mit Anrede übergebenen Wert zu erhalten, lautet wie folgt:

[tblAnreden].[Anrede]=[prmAnrede]

Die Vergleichswerte werden also nicht in Abhängigkeit vom Datumstyp etwa in Anführungszeichen eingefasst.

rstAnreden enthält also nun den Datensatz der Tabelle tblAnreden, dessen Feld Anrede den mit dem Parameter prmAnrede übergebenen Wert enthält. Aus diesem Datensatz möchten wir nun den Wert des Feldes AnredeID auslesen und beim Anlegen des neuen Datensatzes in der Tabelle tblKunden nutzen. Dazu verwenden wir eine lokale Variable, die wir mit der Makroaktion FestlegenLokaleVar festlegen. Diese Aktion erwartet zwei Parameter: Name erhält den zu verwendenden Variablennamen, in diesem Fall lngAnredeID. Ausdruck erwartet den Wert, den die Makroaktion der Variablen zuweisen soll. Dieser Ausdruck lautet wie folgt:

[rstAnreden].[AnredeID]

Sie können diesen Ausdruck wie die meisten anderen mit IntelliSense zusammenklicken.

Nun müssen wir nur noch den Teil des benannten Makros, der den neuen Datensatz zur Tabelle tblKunden hinzufügt, programmieren. Dieser sieht fast genauso aus wie bei den vorherigen Beispielen – mit dem kleinen Unterschied, dass das Feld AnredeID diesmal aus der lokalen Variablen lngAnredeID gefüllt wird und nicht mehr mit dem Wert des Parameters prmAnredeID.

Das Makro macKundeAnlegenMitAnrede zum Ausführen des Datenmakros dmcKundeAnlegenMit­Anrede sieht schließlich wie in Bild 9 aus.

Aufruf des Makros mit der Anrede als Zeichenkette

Bild 9: Aufruf des Makros mit der Anrede als Zeichenkette

Neue Lookup-Werte anlegen

Wir gehen noch einen Schritt weiter und nehmen an, dass gelegentlich neue Anreden zur Tabelle tblAnreden hinzukommen (das geschieht in der Praxis zwar so gut wie nie, aber wir benötigen noch eine Beispielkonstellation zum Anlegen neuer Lookup-Werte ...).

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!