{"id":55000910,"date":"2013-12-01T00:00:00","date_gmt":"2020-05-22T21:31:27","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=910"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Parameterabfragen_unter_der_Lupe","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/","title":{"rendered":"Parameterabfragen unter der Lupe"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Abfragen lassen sich auf unterschiedlichste Weise mit den Vergleichswerten f&uuml;r ihre Kriterien best&uuml;cken &#8211; beispielsweise, indem man einfach den gew&uuml;nschten SQL-Ausdruck per VBA zusammensetzt. Es gelingt jedoch unter Einsatz von Abfrageparametern: Sie f&uuml;gen in eckige Klammern eingefasste Bezeichnungen in den Abfrageentwurf ein und f&uuml;llen diese dann entweder per eingebauter Inputbox oder per VBA. Dieser Beitrag stellt alle wichtigen Techniken rund um den Einsatz von Parameterabfragen vor.<\/b><\/p>\n<p><b>Warum Parameterabfragen<\/b><\/p>\n<p>In vielen F&auml;llen ben&ouml;tigen Sie keine Parameterabfragen, weil die Abfrage entweder bereits die notwendigen Kriterien enth&auml;lt oder diese nachtr&auml;glich per Filter appliziert werden. Dies kann beispielsweise der Fall sein, wenn Sie einem Formular eine komplette Tabelle als Datenherkunft zuweisen, dann aber etwa mit der <b>OpenForm<\/b>-Methode des <b>DoCmd<\/b>-Objekts einen entsprechenden Filterausdruck &uuml;bergeben. Dieser wird dann beim &ouml;ffnen des Formulars angewendet.<\/p>\n<p>In manchen F&auml;llen kommen Sie damit aber nicht weiter: Wenn Sie etwa eine Aktualisierungsabfrage erstellen, die ein oder mehrere Kriterien enth&auml;lt, k&ouml;nnen Sie die Vergleichswerte nur auf zwei Arten anwenden: Entweder, indem Sie den SQL-Ausdruck der Abfrage in eine VBA-Variable laden und dieser die entsprechenden Kriterien hinzuf&uuml;gen oder eben mit Abfrageparametern.<\/p>\n<p>Bestimmte Anwendungsf&auml;lle erfordern es auch, dass man mehrere aufeinander aufbauende Abfragen nutzt. Das kann etwa sein, wenn Sie zun&auml;chst die Daten einer Abfrage mit <b>OUTER JOIN<\/b>-Verkn&uuml;pfung ermitteln und das Ergebnis dann in einer weiteren Abfrage mit den Daten aus weiteren Tabellen verkn&uuml;pfen. In diesem Fall kommen Sie kaum um den Einsatz von Abfrageparametern herum. Sie k&ouml;nnten zwar noch den Abfragetext der Ausgangsabfrage per VBA anpassen und erst dann die andere Abfrage darauf zugreifen lassen, aber das w&auml;re doch etwas umst&auml;ndlich.<\/p>\n<p>Dar&uuml;ber hinaus haben Parameterabfragen den Vorteil, dass Access f&uuml;r diese nach der ersten Ausf&uuml;hrung einen Ausf&uuml;hrungsplan erstellt. Das bedeutet, dass ein Plan aufgestellt, mit dem das Ergebnis optimal ermittelt wird. Wenn Sie die gleiche Abfrage anschlie&szlig;end nochmals aufrufen, kann diese auf den bereits ermittelten Ausf&uuml;hrungsplan zur&uuml;ckgreifen. Wenn Sie eine Abfrage bei jedem Aufruf erneut per VBA zusammenstellen, muss auch der Ausf&uuml;hrungsplan mit jedem Aufruf erneut erstellt werden.<\/p>\n<p><b>Parameterabfrage erstellen<\/b><\/p>\n<p>Eine Parameterabfrage unterscheidet sich nicht wesentlich von einer herk&ouml;mmlichen Abfrage. Der Unterschied ist, dass beispielsweise ein Kriteriumsausdruck nicht direkt beim Erstellen mit dem Vergleichswert f&uuml;r diese Abfrage ausgestattet wird, sondern stattdessen einen in eckigen Klammern eingefassten Parameter aufnimmt.<\/p>\n<p>Dies sieht beispielsweise so wie in Bild 1 aus. Wenn Sie die Abfrage nun ausf&uuml;hren, zeigt diese alle Datens&auml;tze der Tabelle <b>tblArtikel <\/b>an, deren Feld <b>KategorieID <\/b>den Wert <b>1 <\/b>enth&auml;lt. Dies wollen wir nun flexibler gestalten: Der Benutzer soll diesen Wert beim Aufruf der Abfrage selbst eingeben k&ouml;nnen. Dazu ersetzen Sie den Wert <b>1 <\/b>einfach durch den Ausdruck <b>[VergleichskategorieID]<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_001.png\" alt=\"Abfrage mit festem Vergleichswert\" width=\"575\" height=\"415,9364\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Abfrage mit festem Vergleichswert<\/span><\/b><\/p>\n<p>Wenn Sie die Abfrage dann ausf&uuml;hren, zeigt Access einen Dialog zur Eingabe des Vergleichswertes an (s. Bild 2). Dieser erh&auml;lt als Titel den Text <b>Parameterwert eingeben <\/b>und als Meldungstext den in eckigen Klammern angegebenen Ausdruck. Hier ist zu beachten, dass der Text in eckigen Klammern, also der Name des Parameters, nicht den Namen eines der Felder der Tabellen der Datenherkunft enthalten darf. In diesem Fall wird der Parameter mit dem jeweiligen Wert der Datenherkunft gef&uuml;llt. <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_002.png\" alt=\"Abfrage mit Parameter als Vergleichswert\" width=\"500\" height=\"334,6613\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Abfrage mit Parameter als Vergleichswert<\/span><\/b><\/p>\n<p>Bei der Benennung der Parameter gibt es sonst kaum Einschr&auml;nkungen &#8211; Sie d&uuml;rfen allerdings keinen Punkt und kein Ausrufezeichen verwenden. Dies f&uuml;hrt direkt zu einer entsprechenden Meldung (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_003.png\" alt=\"Abfrageparameter mit ung&uuml;ltigem Zeichen\" width=\"650\" height=\"381,4516\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Abfrageparameter mit ung&uuml;ltigem Zeichen<\/span><\/b><\/p>\n<p>Wenn Sie den Parameter tats&auml;chlich &uuml;ber den daf&uuml;r vorgesehenen Dialog vom Benutzer abfragen m&ouml;chten, k&ouml;nnen Sie allerdings auch komplette S&auml;tze unterbringen &#8211; nur ohne Punkt. Aber das ist kein Problem &#8211; Sie k&ouml;nnen einen solchen Satz ja auch mit einem Doppelpunkt abschlie&szlig;en:<\/p>\n<pre>[Geben Sie die KategorieID ein:]<\/pre>\n<p><b>Zeichenketten und Parameter<\/b><\/p>\n<p>Wenn Sie eine Zeichenkette mit einem Parameter vergleichen wollen, gehen Sie genauso vor wie mit einem Zahlenwert wie im obigen Beispiel. Allerdings m&ouml;chten Sie den Parameter ja vielleicht als Teil des Vergleichsausdrucks einsetzen.<\/p>\n<p>Auch das ist kein Problem: Sie m&uuml;ssen den Abfrageparameter lediglich per Und-Zeichen mit den &uuml;brigen Elementen verbinden. Wenn der Benutzer etwa Kundendatens&auml;tze anhand der Postleitzahl eingrenzen soll, k&ouml;nnen Sie ihm folgendes Kriterium anbieten:<\/p>\n<pre>Wie [Geben Sie die PLZ ein:] & \"*\"<\/pre>\n<p>Dieses fragt wie in Bild 4 eine Zeichenkette ab und h&auml;ngt an diese noch das Sternchen (*) als Platzhalter an. Die Abfrage liefert dann alle Datens&auml;tze der Tabelle <b>tblKunden<\/b>, deren Feld <b>PLZ <\/b>mit dem als Parameter &uuml;bergebenen Wert &uuml;bereinstimmt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_004.png\" alt=\"Abfrageparameter als Teil des Vergleichswertes\" width=\"500\" height=\"332,0755\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Abfrageparameter als Teil des Vergleichswertes<\/span><\/b><\/p>\n<p><b>Datentypen f&uuml;r Parameter festlegen<\/b><\/p>\n<p>Aktuell kann der Benutzer f&uuml;r die Parameter alle denkbaren Werte eingeben. So landet dann auch schon mal eine Zeichenkette in einem Parameter, der eigentlich ein Datumsfeld betrifft. Dies f&uuml;hrt nat&uuml;rlich zu einer entsprechenden Fehlermeldung, die &#8211; wie in vielen F&auml;llen &#8211; f&uuml;r Otto Normalverbraucher wenig Aussagekraft besitzt. Wenn Sie sicherstellen wollen, dass der Benutzer einen Wert als Parameter &uuml;bergibt, der einem bestimmten Datentyp entspricht, m&uuml;ssen Sie den Parameter in einem separaten Dialog deklarieren.  Diesen Dialog rufen Sie auf, indem Sie das Kontextmen&uuml; des Abfrageentwurfs anzeigen und dort den Eintrag <b>Parameter <\/b>ausw&auml;hlen (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_005.png\" alt=\"Anzeigen des Dialogs zum Deklarieren von Parametern\" width=\"500\" height=\"289,8194\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Anzeigen des Dialogs zum Deklarieren von Parametern<\/span><\/b><\/p>\n<p>In diesem Fall wollen wir daf&uuml;r sorgen, dass der Benutzer f&uuml;r die beiden Parameter <b>Startdatum <\/b>und <b>Enddatum <\/b>nur Datumswerte eintragen darf. Der Dialog, den Sie mit dem Kontextmen&uuml;eintrag Parameter anzeigen, enth&auml;lt leider noch nicht automatisch die bereits im Kriterium angegebenen Abfrageparameter. Sie m&uuml;ssen diese also manuell dort eintragen und dann den Datentyp festlegen. Dabei stellen wir fest, dass die Datentypen nicht exakt mit denen im Tabellenentwurf &uuml;bereinstimmen. Die Zahlendatentypen etwa werden hier direkt mit der entsprechenden Feldgr&ouml;&szlig;e angegeben, also <b>Byte<\/b>, <b>Long <\/b>et cetera (s. Bild 6). Wir tragen hier die beiden Parameter <b>Startdatum <\/b>und <b>Enddatum <\/b>ein und legen als Felddatentyp jeweils <b>Datum\/Uhrzeit <\/b>fest.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_006.png\" alt=\"Der Dialog zum Anzeigen von Parametern\" width=\"400\" height=\"295,3959\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Der Dialog zum Anzeigen von Parametern<\/span><\/b><\/p>\n<p>Wenn der Benutzer dann einen falschen Wert eintr&auml;gt, erscheint die Meldung <b>Sie haben einen Wert eingegeben, der f&uuml;r dieses Feld nicht g&uuml;ltig ist <\/b>&#8211; also die gleiche Meldung, die auch bei der Eingabe falscher Daten in Tabellenfelder erscheint.<\/p>\n<p>Davon abgesehen arbeiten Abfrageparameter, die auch als solche deklariert wurden, genau wie nicht deklarierte Abfrageparameter.<\/p>\n<p>Nun wird es Zeit, einen Blick auf den SQL-Code f&uuml;r eine Abfrage mit deklarierten Parametern zu werfen. Die Parameter werden hier in einer eigenen Zeile vor Beginn der eigentlichen SQL-Anweisung mit dem Schl&uuml;sselwort <b>PARAMETERS <\/b>unter Angabe des entsprechenden Datentyps deklariert:<\/p>\n<pre>PARAMETERS Startdatum DateTime, Enddatum DateTime;\r\nSELECT BestellungID, KundeID, PersonalID, Bestelldatum\r\nFROM tblBestellungen\r\nWHERE Bestelldatum Between [Startdatum] And [Enddatum];<\/pre>\n<p>Sollten die Namen der im Kriterium untergebrachten Parameter nicht mit denen im <b>Parameter<\/b>-Dialog &uuml;bereinstimmen, fragt Access alle verschiedenen Versionen ab.<\/p>\n<p>Wenn Sie also einen Parameter namens <b>Datum eingeben: <\/b>im Abfrageentwurf unterbringen und im <b>Parameter<\/b>-Dialog einen Parameter namens <b>Datumeingabe: <\/b>definieren, erscheinen Abfragedialoge f&uuml;r beide Varianten. Allerdings wirkt sich nur derjenige, der auch im Kriterium eingesetzt wird, auf das Abfrageergebnis aus.<\/p>\n<p><b>Parameter-abfragen per VBA<\/b><\/p>\n<p>F&uuml;r einen Schnellschuss kann man den Benutzer mal mit den von Access erzeugten Dialogen zum Abfragen von Parametern konfrontieren, aber in der Regel sollte man die Werte per Formular abfragen. Dort kann man diese gegebenenfalls vorbelegen, eine eigene Fehlerbehandlung f&uuml;r den Fall der Eingabe ung&uuml;ltiger Werte unterbringen et cetera. Also schauen wir uns an, wie man unter VBA mit Parameterabfragen umgeht.<\/p>\n<p>Wenn Sie die Abfrage etwa als Recordset &ouml;ffnen und durchlaufen m&ouml;chten und annehmen, dass Access wie beim manuellen &ouml;ffnen den Dialog zum Eingeben der Parameter anzeigt, probieren Sie einmal die Prozedur aus Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ParameterabfrageMitFehler()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"qryBestellungenNachDatum\")\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Dieser Zugriff auf die Parameterabfrage l&ouml;st einen Fehler aus.<\/span><\/b><\/p>\n<p>Das Ergebnis ist die Fehlermeldung aus Bild 7. Access zeigt also keine Eingabedialoge an, wenn Sie eine Parameterabfrage als Recordset &ouml;ffnen. Wie also bringen Sie die Parameterwerte in der Abfrage unter<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_007.png\" alt=\"Fehlermeldung beim Versuch, eine Abfrage mit Parametern per OpenRecordset zu &ouml;ffnen\" width=\"400\" height=\"221,5385\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Fehlermeldung beim Versuch, eine Abfrage mit Parametern per OpenRecordset zu &ouml;ffnen<\/span><\/b><\/p>\n<p><b>VBA und QueryDef<\/b><\/p>\n<p>Dazu ben&ouml;tigen Sie zwei weitere DAO-Objekte, n&auml;mlich das <b>QueryDef<\/b>-Objekt, mit dem Sie auf Abfragen zugreifen und ihre Eigenschaften ver&auml;ndern k&ouml;nnen, sowie das <b>Parameter<\/b>-Objekt, das den Zugriff auf die Parameter einer Abfrage erlaubt. F&uuml;r das Beispiel der Abfrage <b>qryBestellungenNachDatum <\/b>ben&ouml;tigen wir eigentlich sogar zwei Parameter-Objekte, die wir als <b>prmStart <\/b>und <b>prmEnde <\/b>deklarieren. Theoretisch w&uuml;rde zwar eine Variable reichen (<b>prm<\/b>), aber wir wollen f&uuml;r eine bessere &uuml;bersicht f&uuml;r jeden Parameter eine eigene Variable einsetzen. Der Einsatz von Parametern in VBA sieht wie in Listing 2 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Parameterabfrage()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>prmStart<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>prmEnde<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryBestellungenNachDatum\")\r\n     <span style=\"color:blue;\">Set<\/span> prmStart = qdf.Parameters(\"Startdatum\")\r\n     prmStart.Value = \"1.1.2012\"\r\n     <span style=\"color:blue;\">Set<\/span> prmEnde = qdf.Parameters(\"Enddatum\")\r\n     prmEnde.Value = \"31.1.2012\"\r\n     <span style=\"color:blue;\">Set<\/span> rst = qdf.OpenRecordset\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Debug.Print<\/span> rst!BestellungID\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Parameterabfrage mit per VBA zugewiesenen Parametern<\/span><\/b><\/p>\n<p>Neben den beiden <b>Parameter<\/b>-Variablen deklarieren wir dort eine <b>QueryDef<\/b>-Variable namens <b>qdf<\/b> sowie ein <b>Database<\/b>-Objekt und ein <b>Recordset<\/b>-Objekt. Das <b>Database<\/b>-Objekt <b>db <\/b>f&uuml;llen wir mit einem Verweis auf die aktuelle Datenbank. Dann referenzieren wir die Abfrage <b>qryBestellungenNachDatum<\/b> mit dem <b>QueryDef<\/b>-Objekt <b>qdf<\/b>, das wir &uuml;ber den Namen der Abfrage aus der <b>QueryDefs<\/b>-Auflistung des <b>Database<\/b>-Objekts beziehen.<\/p>\n<p><!--30percent--><\/p>\n<p>Und nat&uuml;rlich m&uuml;ssen wir noch die beiden <b>Parameter<\/b>-Variablen f&uuml;llen. Dies erledigen wir &uuml;ber die <b>Parameters<\/b>-Auflistung, deren Elemente wir beispielsweise direkt &uuml;ber den Namen ansprechen k&ouml;nnen &#8211; also <b>Startdatum <\/b>und <b>Enddatum<\/b>.<\/p>\n<p>Das <b>Parameter<\/b>-Objekt bietet eine Eigenschaft namens <b>Value<\/b>, mit der wir den Parameterwert &uuml;bergeben k&ouml;nnen. Schlie&szlig;lich erstellen wir ein <b>Recordset<\/b>-Objekt auf Basis des mit den entsprechenden Parametern versehenen <b>QueryDef<\/b>-Objekts <b>qdf <\/b>und durchlaufen zum Test dessen Datens&auml;tze.<\/p>\n<p><b>Parameter aufnehmen<\/b><\/p>\n<p>Im n&auml;chsten Beispiel bieten wir dem Benutzer eine M&ouml;glichkeit, um die beiden Parameter einzugeben und gleich die gesuchten Datens&auml;tze anzuzeigen. Dazu erstellen Sie ein Hauptformular namens <b>frmBestellungen<\/b>, das die beiden Textfelder <b>txtStartdatum <\/b>und <b>txtEnddatum <\/b>enth&auml;lt, sowie eine Schaltfl&auml;che namens <b>cmdAnzeigen<\/b> (s. Bild 8). Das Unterformular enth&auml;lt zun&auml;chst die Daten der Tabelle <b>tblBestellungen<\/b>. Beim Laden belegt das Formular die beiden Textfelder vor:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_008.png\" alt=\"Eingabe der Parameter per Textfeld\" width=\"400\" height=\"241,6812\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Eingabe der Parameter per Textfeld<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!txtEnddatum = Date\r\n     Me!txtStartdatum = DateAdd(\"yyyy\",  -1, Date)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Ein Klick auf die Schaltfl&auml;che <b>cmdAnzeigen <\/b>sorgt schlie&szlig;lich f&uuml;r das Einlesen eines Recordsets auf Basis der Abfrage <b>qryBestellungenNachDatum <\/b>und der beiden angegebenen Datumsangaben (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAnzeigen_Click()\r\n     <span style=\"color:blue;\">Set<\/span> Me!sfmBestellungen.Form.Recordset = _\r\n         BestellungenNachDatum(Me!txtStartdatum, Me!txtEnddatum)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: F&uuml;llen des Unterformulars per Recordset aus einer benutzerdefinierten Funktion<\/span><\/b><\/p>\n<p>Die Funktion <b>BestellungenNachDatum <\/b>erwartet schlie&szlig;lich die beiden Datums-angaben als Parameter (s. Listing 4). Sie arbeitet prinzipiell wie die Prozedur Parameterabfrage aus dem vorherigen Beispiel, gibt das <b>Recordset<\/b>-Objekt jedoch als Funktionswert zur&uuml;ck. Dieses wird dann direkt der <b>Recordset<\/b>-Eigenschaft des Unterformulars zugewiesen. Achtung: Dies f&uuml;hrte in der Beispieldatenbank zu nicht reproduzierbaren Abst&uuml;rzen, wenn man das Recordset mehrfach nacheinander aktualisiert hat.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BestellungenNachDatum(datStart<span style=\"color:blue;\"> As Date<\/span>, datEnde<span style=\"color:blue;\"> As Date<\/span>) _\r\n        <span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>prmStart<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>prmEnde<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryBestellungenNachDatum\")\r\n     <span style=\"color:blue;\">Set<\/span> prmStart = qdf.Parameters(\"Startdatum\")\r\n     prmStart.Value = datStart\r\n     <span style=\"color:blue;\">Set<\/span> prmEnde = qdf.Parameters(\"Enddatum\")\r\n     prmEnde.Value = datEnde\r\n     <span style=\"color:blue;\">Set<\/span> BestellungenNachDatum = qdf.OpenRecordset\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Zusammenstellung des Recordsets mit den angegebenen Kriterien<\/span><\/b><\/p>\n<p><b>Parameter auslesen<\/b><\/p>\n<p>Die Auflistung <b>Parameters <\/b>des <b>QueryDefs<\/b>-Objekts haben Sie ja bereits genutzt, um &uuml;ber den Namen auf die <b>Parameter<\/b>-Objekte zuzugreifen. Sie k&ouml;nnen den Namen, den Datentyp und den Wert eines <b>Parameter<\/b>-Elements auch per VBA auslesen. Die Prozedur aus Listing 5 erledigt dies in einer Schleife &uuml;ber alle Elemente der <b>Parameters<\/b>-Auflistung. Die einzelnen Eigenschaften <b>Name<\/b>, <b>Type <\/b>und <b>Value <\/b>landen dann im Direktbereich des VBA-Editors.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ParameterAuslesen()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>prm<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryBestellungenNachDatum\")\r\n     For Each prm In qdf.Parameters\r\n         <span style=\"color:blue;\">Debug.Print<\/span> prm.Name, prm.Type, prm.Value\r\n     <span style=\"color:blue;\">Next<\/span> prm\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Parameter einer Abfrage auslesen<\/span><\/b><\/p>\n<p><b>Per Index auf die Parameter zugreifen<\/b><\/p>\n<p>Sie k&ouml;nnen nicht nur &uuml;ber den Namen, sondern auch &uuml;ber den Indexwert auf ein Element der <b>Parameters<\/b>-Auflistung zugreifen.<\/p>\n<p>Wie dies gelingt, zeigt die Prozedur aus Listing 6. Die <b>Parameters<\/b>-Auflistung liefert mit einer Eigenschaft namens <b>Count <\/b>die Anzahl der Parameter der Abfrage. Wenn Sie in einer Schleife von <b>0 <\/b>bis zur Anzahl der Elemente minus eins alle Elemente der <b>Parameters<\/b>-Auflistung anhand des numerischen Index durchlaufen, erhalten Sie das gleiche Ergebnis wie beim Durchlaufen &uuml;ber eine <b>For Each<\/b>-Schleife. Allerdings ben&ouml;tigen Sie eine Zeile mehr, weil die Zuweisung an die Variable <b>prm<\/b> ja nicht direkt in der Schleife erfolgt.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ParameterPerIndex()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>prm<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(\"qryBestellungenNachDatum\")\r\n     For i = 0 To qdf.Parameters.Count - 1\r\n         <span style=\"color:blue;\">Set<\/span> prm = qdf.Parameters(i)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> prm.Name, prm.Type, prm.Value\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Parameter einer Abfrage mit numerischem Index durchlaufen<\/span><\/b><\/p>\n<p><b>Flexibel Recordset aus Abfrage generieren<\/b><\/p>\n<p>Damit Sie in Zukunft auf einfache Weise Recordsets auf Basis von Parameterabfragen erstellen k&ouml;nnen, haben wir die Funktion <b>RecordsetAusParameterabfrage <\/b>erstellt (s. Listing 7). Diese erwartet die folgenden Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RecordsetAusParameterabfrage(db<span style=\"color:blue;\"> As <\/span>DAO.Database, strAbfrage<span style=\"color:blue;\"> As String<\/span>, bolBenannteParameter<span style=\"color:blue;\"> As Boolean<\/span>, _\r\n         ParamArray varParameter()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>prm<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>intAnzahlParameter<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(strAbfrage)\r\n     intAnzahlParameter = <span style=\"color:blue;\">UBound<\/span>(varParameter) - <span style=\"color:blue;\">LBound<\/span>(varParameter) + 1\r\n     <span style=\"color:blue;\">If <\/span>bolBenannteParameter = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>intAnzahlParameter <span style=\"color:blue;\">Mod<\/span> 2 = 0<span style=\"color:blue;\"> Then<\/span>\r\n             For i = <span style=\"color:blue;\">LBound<\/span>(varParameter) To <span style=\"color:blue;\">UBound<\/span>(varParameter)\r\n                 <span style=\"color:blue;\">Set<\/span> prm = qdf.Parameters(varParameter(i))\r\n                 i = i + 1\r\n                 prm.Value = varParameter(i)\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Ungerade Anzahl von Parameter, Name\/Wert-Paare k&ouml;nnen nicht gebildet werden.\"\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>intAnzahlParameter = qdf.Parameters.Count<span style=\"color:blue;\"> Then<\/span>\r\n             For i = <span style=\"color:blue;\">LBound<\/span>(varParameter) To <span style=\"color:blue;\">UBound<\/span>(varParameter)\r\n                 <span style=\"color:blue;\">Set<\/span> prm = qdf.Parameters(i)\r\n                 prm.Value = varParameter(i)\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Anzahl der Abfrageparameter und der &uuml;bergebenen Parameter muss gleich sein.\"\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> RecordsetAusParameterabfrage = qdf.OpenRecordset\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Flexible Funktion zum Erstellen von Recordsets auf Basis von Parameterabfragen<\/span><\/b><\/p>\n<ul>\n<li><b>db<\/b>: Verweis auf das zu verwendende <b>Database<\/b>-Objekt<\/li>\n<li><b>strAbfrage<\/b>: Name der Parameterabfrage<\/li>\n<li><b>bolBenannteParameter<\/b>: Gibt an, ob die Parameter als Paar aus Name und Wert &uuml;bergeben werden oder nur die Werte.<\/li>\n<li><b>varParameter()<\/b>: Parameter-Array, das beliebig viele Werte des Datentyps <b>Variant <\/b>aufnehmen kann. Erwartet die Namen und\/oder Werte der Parameter &#8211; mehr dazu weiter unten.<\/li>\n<\/ul>\n<p>Der R&uuml;ckgabewert der Funktion ist ein <b>Recordset<\/b>-Objekt mit den ermittelten Datens&auml;tzen.<\/p>\n<p>Wie schon angedeutet, k&ouml;nnen Sie die Parameter auf zwei Arten &uuml;bergeben. Wenn Sie genau wissen, in welcher Reihenfolge die Parameter der Parameterabfrage vorliegen, k&ouml;nnen Sie einfach die Werte als Parameter-Array &uuml;bergeben. Anderenfalls &uuml;bergeben Sie jeweils durch Komma getrennte Paare aus Parametername und -wert. Zur Verdeutlichung finden Sie in Listing 8 zun&auml;chst ein Beispiel f&uuml;r den Aufruf der Funktion nur mit den Parameterwerten &#8211; wir verwenden wieder die Abfrage <b>qryBestellungenNachDatum<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_RecordsetAusParameterabfrage()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = RecordsetAusParameterabfrage(db, \"qryBestellungenNachDatum\", False, \"1.1.2012\", \"4.1.2012\")\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Debug.Print<\/span> rst!BestellungID, rst!Bestelldatum\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Beispielaufruf der Funktion RecordsetAusParameterabfrage<\/span><\/b><\/p>\n<p>Die Prozedur deklariert ein <b>Database<\/b>&#8211; und ein <b>Recordset<\/b>-Objekt und ruft dann die Funktion <b>RecordsetAusParameterabfrage <\/b>auf. Wissend, dass die Parameter in der Reihenfolge <b>Startdatum<\/b>, <b>Enddatum <\/b>vorliegen, werden die Parameterwerte in dieser Reihenfolge &uuml;bergeben. Die Funktion liefert dann ein <b>Recordset <\/b>zur&uuml;ck, das direkt weiterverwendet werden kann &#8211; beispielsweise zum Durchlaufen der einzelnen Datens&auml;tze.<\/p>\n<p>Wenn Sie die Reihenfolge der Parameter nicht kennen, k&ouml;nnte der Aufruf auch so aussehen:<\/p>\n<pre>RecordsetAusParameterabfrage(db, \"qryBestellungenNachDatum\", True, \"Startdatum\", \"1.1.2012\", \"Enddatum\", \"4.1.2012\")<\/pre>\n<p>In diesem Fall &uuml;bergeben Sie f&uuml;r den Parameter <b>bolBenannteParameter <\/b>den Wert <b>True <\/b>und h&auml;ngen dann immer abwechselnd den Namen des Parameters und den Wert des Parameters an.<\/p>\n<p>Die Funktion deklariert ein <b>QueryDef<\/b>&#8211; und ein <b>Parameter<\/b>-Objekt sowie <b>Integer<\/b>-Variablen zur Aufnahme der Anzahl der Parameter und als Laufvariable.<\/p>\n<p>Dann f&uuml;llt sie zun&auml;chst die <b>QueryDef<\/b>-Variable <b>qdf <\/b>mit einem Verweis auf die mit <b>strAbfrage <\/b>&uuml;bergebene Abfrage. Durch Subtrahieren der unteren von der oberen Array-Grenze und anschlie&szlig;endes Addieren von <b>1 <\/b>ermittelt die Funktion die Anzahl der Parameter und speichert diese in der Variablen <b>intAnzahlParameter<\/b>.<\/p>\n<p>Da <b>LBound <\/b>bei einem leeren Array den Wert <b>-1 <\/b>liefert und <b>UBound <\/b>den Wert <b>0<\/b>, liefert dieser Ausdruck sogar die richtige Anzahl, wenn das Parameter-Array leer ist &#8211; n&auml;mlich <b>0<\/b>.<\/p>\n<p>Nun unterscheidet die Funktion die F&auml;lle, ob der Parameter <b>bolBenannteParameter <\/b>den Wert <b>True <\/b>oder <b>False <\/b>hat. Lautet der Wert <b>True<\/b>, wird der erste Teil der <b>If&#8230;Then<\/b>-Bedingung ausgef&uuml;hrt. Hier pr&uuml;ft die Prozedur mit dem <b>Mod<\/b>-Operator, ob der Aufruf eine gerade Anzahl von Elementen im Parameter-Array liefert. Ist dies nicht der Fall, wird die Funktion mit einer entsprechenden Meldung beendet.<\/p>\n<p>Anderenfalls durchl&auml;uft die Funktion in einer <b>For&#8230;Next<\/b>-Schleife alle Elemente des Parameter-Arrays. Darin f&uuml;llt sie zun&auml;chst die <b>Parameter<\/b>-Variable <b>prm <\/b>mit dem Parameter, dessen Name mit dem entsprechenden Wert des Parameter-Arrays &uuml;bereinstimmt. Dann erh&ouml;ht die Funktion innerhalb der Schleife den Wert der Laufvariablen <b>i <\/b>um <b>1<\/b> und liest mit diesem Indexwert den Wert f&uuml;r den ersten Parameter ein. Auf diese Weise durchl&auml;uft die Funktion alle angegebenen Parameter.<\/p>\n<p>Wenn Parameter <b>bolBenannteParameter <\/b>des Aufrufs den Wert <b>False <\/b>enth&auml;lt, erwartet die Funktion nur die Werte f&uuml;r die Parameter &#8211; und zwar tunlichst in der richtigen Reihenfolge. Zun&auml;chst pr&uuml;ft die Funktion, ob die in <b>intAnzahlParameter <\/b>der mit <b>qdf.Parameters.Count <\/b>ermittelten Anzahl der Abfrageparameter entspricht.<\/p>\n<p>Ist dies der Fall, startet wiederum eine <b>For&#8230;Next<\/b>-Schleife, die diesmal einfach ein <b>Parameter<\/b>-Objekt f&uuml;r den Parameter mit dem der Laufvariablen <b>i <\/b>entsprechenden Index erstellt und diesem den ebenfalls &uuml;ber den Index des <b>Parameter<\/b>-Array <b>varParameter <\/b>ermittelten Wert zuweist.<\/p>\n<p>Schlie&szlig;lich gibt die Funktion das mit der <b>OpenRecordset<\/b>-Methode ge&ouml;ffnete Recordset als Funktionswert an die aufrufende Funktion zur&uuml;ck.<\/p>\n<p><b>Aktionsabfragen mit Parametern<\/b><\/p>\n<p>Neben den Auswahlabfragen k&ouml;nnen Sie nat&uuml;rlich auch Aktionsabfragen mit Parametern ausstatten &#8211; beispielsweise, um einer Tabelle auf einfache Weise einen Datensatz hinzuzuf&uuml;gen. Im Beispiel aus Bild 9 haben wir eine Abfrage erstellt, die einen Datensatz an die Tabelle <b>tblKategorien <\/b>anf&uuml;gen soll. Wenn alle hinzuzuf&uuml;genden Werte mithilfe von Abfrageparametern ermittelt werden sollen, erh&auml;lt die Abfrage keine Datenherkunft.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_06\/pic_910_009.png\" alt=\"Aktionsabfrage mit Abfrageparametern\" width=\"575\" height=\"256,1444\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Aktionsabfrage mit Abfrageparametern<\/span><\/b><\/p>\n<p>Nach der Umwandlung der Auswahlabfrage in eine Anf&uuml;geabfraage (etwa mit dem Kontextmen&uuml;-Eintrag <b>Abfragetyp|Anf&uuml;geabfrage&#8230; <\/b>des Abfrage-Entwurfs) brauchen Sie daher keine Tabelle zum Abfrageentwurf hinzuzuf&uuml;gen. Sie legen lediglich die Zieltabelle fest. Dann geben Sie jeweils in der Zeile <b>Feld<\/b> einen Ausdruck ein, der den Feldnamen des Zielfeldes sowie den in eckigen Klammern eingefassten Parameternamen enth&auml;lt &#8211; etwa so:<\/p>\n<pre>Kategoriename: [NameDerKategorie]<\/pre>\n<p>In der Zeile <b>Anf&uuml;gen an <\/b>w&auml;hlen Sie dann das Zielfeld f&uuml;r den mit dem Parameter ermittelten Ausdruck an, in diesem Fall <b>Kategoriename<\/b>.<\/p>\n<p>Klicken Sie dann auf die Ausf&uuml;hren-Schaltfl&auml;che, fragt Access die angegebenen Parameter ab und legt den gew&uuml;nschten Datensatz in der Zieltabelle an. <\/p>\n<p><b>Aktionsabfragen mit Parametern flexibel ausf&uuml;hren<\/b><\/p>\n<p>Auch f&uuml;r diese Variante haben wir eine flexible VBA-Funktion erstellt. Diese sieht wie in Listing 10 aus und erwartet fast die gleichen Parameter wie die zuvor beschriebene Funktion.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AktionsabfrageMitParameter(db<span style=\"color:blue;\"> As <\/span>DAO.Database, strAbfrage<span style=\"color:blue;\"> As String<\/span>, intError<span style=\"color:blue;\"> As Integer<\/span>, _\r\n         bolBenannteParameter<span style=\"color:blue;\"> As Boolean<\/span>, ParamArray varParameter()<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>prm<span style=\"color:blue;\"> As <\/span>DAO.Parameter\r\n     <span style=\"color:blue;\">Dim <\/span>intAnzahlParameter<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(strAbfrage)\r\n     intAnzahlParameter = <span style=\"color:blue;\">UBound<\/span>(varParameter) - <span style=\"color:blue;\">LBound<\/span>(varParameter) + 1\r\n     <span style=\"color:blue;\">If <\/span>bolBenannteParameter = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>intAnzahlParameter <span style=\"color:blue;\">Mod<\/span> 2 = 0<span style=\"color:blue;\"> Then<\/span>\r\n             For i = <span style=\"color:blue;\">LBound<\/span>(varParameter) To <span style=\"color:blue;\">UBound<\/span>(varParameter)\r\n                 <span style=\"color:blue;\">Set<\/span> prm = qdf.Parameters(varParameter(i))\r\n                 i = i + 1\r\n                 prm.Value = varParameter(i)\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Ungerade Anzahl von Parameter, Name\/Wert-Paare k&ouml;nnen nicht gebildet werden.\"\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>intAnzahlParameter = qdf.Parameters.Count<span style=\"color:blue;\"> Then<\/span>\r\n             For i = <span style=\"color:blue;\">LBound<\/span>(varParameter) To <span style=\"color:blue;\">UBound<\/span>(varParameter)\r\n                 <span style=\"color:blue;\">Set<\/span> prm = qdf.Parameters(i)\r\n                 prm.Value = varParameter(i)\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Anzahl der Abfrageparameter und der &uuml;bergebenen Parameter muss gleich sein.\"\r\n             <span style=\"color:blue;\">Exit Function<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     qdf.Execute dbFailOnError\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         AktionsabfrageMitParameter = qdf.RecordsAffected\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         intError = Err.Number\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Flexible Funktion zum Ausf&uuml;hren von Aktionsabfragen auf Basis von Parameterabfragen<\/span><\/b><\/p>\n<p>Im Gegensatz zur Funktion <b>RecordsetAusParameterabfrage <\/b>kann es beim Durchf&uuml;hren von Aktionsabfragen schnell zu Fehlern kommen &#8211; beispielsweise, wenn ein Datensatz angelegt wird, der in einem als eindeutig indizierten Feld bereits den zu erstellenden Wert enth&auml;lt. Da die Fehlerbehandlung von der aufrufenden Routine &uuml;bernommen werden soll, bietet die Funktion <b>AktionsabfrageMitParameter <\/b>einen weiteren Parameter namens <b>intFehler <\/b>an, der beim Aufruf in Form einer Variablen &uuml;bergeben werden muss und gegebenenfalls gef&uuml;llt zur&uuml;ckgeliefert wird.<\/p>\n<p>Au&szlig;erdem liefert diese ein anderes Ergebnis zur&uuml;ck &#8211; n&auml;mlich die Anzahl der durch die Ausf&uuml;hrung der Aktionsabfrage betroffenen Datens&auml;tze.<\/p>\n<p>Schauen wir uns erst an, wie diese Funktion aufgerufen wird. Eine entsprechende Beispielprozedur finden Sie in Listing 9. Diese deklariert und f&uuml;llt wiederum ein <b>Database<\/b>-Objekt und deklariert au&szlig;erdem eine Variable, welche die Anzahl der von der Aktionsabfrage betroffenen Datens&auml;tze aufnehmen soll sowie eine weitere f&uuml;r eventuelle Fehler. Dann ruft sie die Funktion <b>AktionsabfrageMitParameter <\/b>auf und &uuml;bergibt neben dem Verweis auf das <b>Database<\/b>-Objekt noch den Namen der auszuf&uuml;hrenden Aktionsabfrage sowie die Werte f&uuml;r die beiden Parameter.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_AktionsabfrageMitParameter()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>intBetroffeneDatensaetze<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intError<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strError<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     intBetroffeneDatensaetze = AktionsabfrageMitParameter(db, \"qryINSERTINTOKategorie\", intError, False, _\r\n         \"Neue Kategorie\", \"Neue Beschreibung\")\r\n     <span style=\"color:blue;\">If <\/span>intError = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Anzahl angelegter Datens&auml;tze: \" & intBetroffeneDatensaetze\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strError = Eval(\"AccessError(\" & intError & \")\")\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & intError & <span style=\"color:blue;\">vbCrLf<\/span> & strError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Beispielaufruf der Funktion AktionsabfrageMitParameter<\/span><\/b><\/p>\n<p>Das Ergebnis der Aktionsabfrage, also die Anzahl der ge&auml;nderten Datens&auml;tze, landet in der Variablen <b>intBetroffeneDatensaetze<\/b>, die wiederum in einem nachfolgenden Meldungsfenster ausgegeben wird.<\/p>\n<p>Wenn <b>intFehler <\/b>einen Wert ungleich <b>0 <\/b>enth&auml;lt, hat die Aktionsabfrage einen Fehler ausgel&ouml;st. In diesem Fall liefert die Beispielprozedur zum Aufruf der Funktion ein Meldungsfenster mit der Fehlernummer und der Fehlerbeschreibung. In einer echten Anwendung m&uuml;ssten Sie diese Informationen durch Ihre eigene Fehlerbehandlung verarbeiten lassen. Etwas trickreich ist die Ermittlung der Fehlerbeschreibung: Die Funktion <b>AccessError <\/b>funktioniert n&auml;mlich anscheinend nur im Direktfenster. Mit einem kleinen Trick haben wir sie allerdings auch innerhalb der Prozedur zum Laufen gebracht: Rufen Sie diese einfach mit der <b>Eval<\/b>-Funktion auf, wobei die Fehlernummer nat&uuml;rlich dynamisch in die auszuf&uuml;hrende Zeichenkette eingearbeitet werden muss.<\/p>\n<p>Wenn Sie die Namen der Parameter mit &uuml;bergeben m&ouml;chten, &auml;ndern Sie den Aufruf wie im vorherigen Beispiel &#8211; stellen Sie <b>bolBenannteParameter <\/b>auf <b>True <\/b>ein und geben Sie die Parameternamen mit an. Die Funktion <b>AktionsabfrageMitParameter <\/b>arbeitet grunds&auml;tzlich wie <b>RecordsetAusParameterabfrage<\/b>. Der Unterschied ist, dass am Ende nicht die <b>OpenRecordset<\/b>-Methode, sondern die <b>Execute<\/b>-Methode aufgerufen wird. Die Anzahl der betroffenen Datens&auml;tze liefert die Eigenschaft <b>RecordsAffected <\/b>des <b>QueryDef<\/b>-Objekts. Au&szlig;erdem gibt die Funktion im Fehlerfall mit dem R&uuml;ckgabeparameter <b>intFehler <\/b>einen Fehlercode an die aufrufende Prozedur zur&uuml;ck.<\/p>\n<p>Beide Funktionen sparen Ihnen eine Menge Code, wenn Sie viel mit <b>QueryDef<\/b>-Objekten und Parametern arbeiten &#8211; allerdings funktionieren beide ja auch ohne Parameter.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ParameterabfragenUnterDerLupe.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{07A847C0-D8D1-4289-969E-E94D4675FEBC}\/aiu_910.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Abfragen lassen sich auf unterschiedlichste Weise mit den Vergleichswerten f&uuml;r ihre Kriterien best&uuml;cken &#8211; beispielsweise, indem man einfach den gew&uuml;nschten SQL-Ausdruck per VBA zusammensetzt. Es gelingt jedoch unter Einsatz von Abfrageparametern: Sie f&uuml;gen in eckige Klammern eingefasste Bezeichnungen in den Abfrageentwurf ein und f&uuml;llen diese dann entweder per eingebauter Inputbox oder per VBA. Dieser Beitrag stellt alle wichtigen Techniken rund um den Einsatz von Parameterabfragen vor.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662013,66062013,44000029],"tags":[],"class_list":["post-55000910","post","type-post","status-publish","format-standard","hentry","category-662013","category-66062013","category-Abfragetechnik_und_SQL"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Parameterabfragen unter der Lupe - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Parameterabfragen unter der Lupe\" \/>\n<meta property=\"og:description\" content=\"Abfragen lassen sich auf unterschiedlichste Weise mit den Vergleichswerten f&uuml;r ihre Kriterien best&uuml;cken - beispielsweise, indem man einfach den gew&uuml;nschten SQL-Ausdruck per VBA zusammensetzt. Es gelingt jedoch unter Einsatz von Abfrageparametern: Sie f&uuml;gen in eckige Klammern eingefasste Bezeichnungen in den Abfrageentwurf ein und f&uuml;llen diese dann entweder per eingebauter Inputbox oder per VBA. Dieser Beitrag stellt alle wichtigen Techniken rund um den Einsatz von Parameterabfragen vor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:31:27+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Parameterabfragen unter der Lupe\",\"datePublished\":\"2020-05-22T21:31:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/\"},\"wordCount\":3386,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/7f38899fcf184b9e9a05eaf7585e146d\",\"articleSection\":[\"2013\",\"6\\\/2013\",\"Abfragetechnik und SQL\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/\",\"name\":\"Parameterabfragen unter der Lupe - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/7f38899fcf184b9e9a05eaf7585e146d\",\"datePublished\":\"2020-05-22T21:31:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/7f38899fcf184b9e9a05eaf7585e146d\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/7f38899fcf184b9e9a05eaf7585e146d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Parameterabfragen_unter_der_Lupe\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Parameterabfragen unter der Lupe\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Parameterabfragen unter der Lupe - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/","og_locale":"de_DE","og_type":"article","og_title":"Parameterabfragen unter der Lupe","og_description":"Abfragen lassen sich auf unterschiedlichste Weise mit den Vergleichswerten f&uuml;r ihre Kriterien best&uuml;cken - beispielsweise, indem man einfach den gew&uuml;nschten SQL-Ausdruck per VBA zusammensetzt. Es gelingt jedoch unter Einsatz von Abfrageparametern: Sie f&uuml;gen in eckige Klammern eingefasste Bezeichnungen in den Abfrageentwurf ein und f&uuml;llen diese dann entweder per eingebauter Inputbox oder per VBA. Dieser Beitrag stellt alle wichtigen Techniken rund um den Einsatz von Parameterabfragen vor.","og_url":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:31:27+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Parameterabfragen unter der Lupe","datePublished":"2020-05-22T21:31:27+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/"},"wordCount":3386,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d","articleSection":["2013","6\/2013","Abfragetechnik und SQL"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/","url":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/","name":"Parameterabfragen unter der Lupe - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d","datePublished":"2020-05-22T21:31:27+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/7f38899fcf184b9e9a05eaf7585e146d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Parameterabfragen_unter_der_Lupe\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Parameterabfragen unter der Lupe"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000910","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000910"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000910\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}