{"id":55000808,"date":"2011-12-01T00:00:00","date_gmt":"2020-05-22T21:59:19","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=808"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenzugriffscode_erzeugen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/","title":{"rendered":"Datenzugriffscode erzeugen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Code f&uuml;r den Datenzugriff brauchen Sie immer wieder. Mal m&ouml;chten Sie eine SQL-Aktionsabfrage auf Basis einer Tabelle erzeugen, in die Sie eine Reihe zuvor gef&uuml;llter Variablen integrieren, mal greifen Sie vielleicht per DAO oder ADO auf die Felder einer solchen Tabelle zu. Wir stellen Ihnen die notwendigen Techniken vor, damit Sie dies nicht mehr von Hand erledigen m&uuml;ssen.<\/b><\/p>\n<p><b>DAO- und SQL-Ausdr&uuml;cke erzeugen<\/b><\/p>\n<p>Wer Code f&uuml;r den Datenzugriff erstellen muss, der mehr als ein paar Felder umfasst, sieht sich einer Flei&szlig;aufgabe gegen&uuml;ber, die oft Fl&uuml;chtigkeitsfehler hervorbringt. Variablendeklaration, Werte zuweisen oder per Parameter entgegennehmen, Zuweisung der Variablen oder Werte zu den Feldern erfordern einiges an Schreibarbeit. Komplizierter wird es noch, wenn Sie SQL-Anweisungen wie <b>UPDATE <\/b>oder <b>INSERT INTO <\/b>erzeugen und mit den Feldern kompletter Tabellen f&uuml;llen m&uuml;ssen.<\/p>\n<p>Dem Autor dieses Beitrags kribbelt es schon lange in den Fingern, ein Tool zu programmieren, mit dem sich solche Aufgaben per Mausklick erledigen lassen. Dieser Beitrag beschreibt, was dabei herausgekommen ist.<\/p>\n<p>Hauptelement der L&ouml;sung ist das Formular aus Bild 1. Es erlaubt zun&auml;chst das Ausw&auml;hlen der Zieltabelle. Dann legen Sie fest, welche Felder dieser Tabelle vom Einf&uuml;gen beziehungsweise &Atilde;&#8220;ndern der Daten betroffen sind und welche Felder als Kriterien beim Ausw&auml;hlen eines zu &auml;ndernden Datensatzes verwendet werden.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_06\/DatenzugriffscodeErzeugen-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Das Formular frmDatenzugriffscode<\/span><\/b><\/p>\n<p>Schlie&szlig;lich legen Sie diverse weitere Optionen fest, die wir in den folgenden Abschnitten zusammen mit der Programmierung dieses Formulars vorstellen.<\/p>\n<p>Das Resultat ist eine fertige Prozedur, die genau auf die ausgew&auml;hlten Parameter zugeschnitten ist. Sie k&ouml;nnen diese Prozedur kopieren und in die Module Ihrer eigenen Datenbank einf&uuml;gen.<\/p>\n<p>Um die L&ouml;sung im aktuellen Zustand einzusetzen, kopieren Sie einfach das Formular <b>frmDatenzugriffscode <\/b>in die Zielanwendung und &ouml;ffnen es &#8211; schon k&ouml;nnen Sie Datenzugriffscode erzeugen.<\/p>\n<p>Gegebenenfalls ben&ouml;tigen Sie noch die Funktion <b>IsoDatum <\/b>aus dem Modul <b>mdlTools <\/b>&#8211; f&uuml;gen Sie diese einfach zu einem bestehenden Modul mit Hilfsroutinen hinzu oder importieren Sie das Modul komplett in Ihre Anwendung.<\/p>\n<p><b>Formular zum Festlegen der Parameter<\/b><\/p>\n<p>Die Funktionen zum Erstellen der gew&uuml;nschten Code-Schnipsel sollen &uuml;ber ein Formular gesteuert werden. Dieses Formular hei&szlig;t <b>frmDatenzugriffscode <\/b>und verf&uuml;gt f&uuml;r die Auswahl der betroffenen Tabelle und der zu ber&uuml;cksichtigenden Felder ein Kombinationsfeld namens <b>cboTabelle<\/b>, ein Listenfeld namens <b>lstFelder<\/b> und einige weitere Steuerelemente (s. Bild 1).<\/p>\n<p>F&uuml;r das Listenfeld stellen Sie die Eigenschaft <b>Herkunftstyp <\/b>auf <b>Feldliste <\/b>ein. Es zeigt dann alle Felder der Tabelle an, die Sie f&uuml;r die Eigenschaft <b>Datensatzherkunft <\/b>angeben.<\/p>\n<p>Diese w&auml;hlen Sie mit dem Kombinationsfeld <b>cboTabelle<\/b> aus. Das Kombinationsfeld bezieht seine Werte aus der Systemtabelle <b>MSysObjects<\/b>:<\/p>\n<pre>SELECT Name FROM MSysObjects WHERE Type = 1 AND Name NOT LIKE ''MSYS*'';<\/pre>\n<p>Stellen Sie f&uuml;r das Listenfeld au&szlig;erdem die Eigenschaft <b>Mehrfachauswahl <\/b>auf <b>Einfach <\/b>ein. Der Benutzer kann so eines oder mehrere Felder durch simples Anklicken der gew&uuml;nschten Felder ausw&auml;hlen.<\/p>\n<p>Da sicher gelegentlich alle Felder in den Datenzugriffscode eingebunden werden sollen, f&uuml;gen Sie au&szlig;erdem eine Schaltfl&auml;che namens <b>cmdAlleMarkieren <\/b>hinzu.<\/p>\n<p>Damit diese alle Eintr&auml;ge des Listenfeldes <b>lstFelder <\/b>ausw&auml;hlt, hinterlegen Sie f&uuml;r die Ereigniseigenschaft <b>Beim Klicken <\/b>die folgende Prozedur:<\/p>\n<pre>Private Sub cmdAlleAuswaehlen_Click()\r\n    Dim i As Integer\r\n    For i = 0 To Me!lstFelder.ListCount - 1\r\n        Me!lstFelder.Selected(i) = True\r\n    Next i\r\n    End Sub<\/pre>\n<p>Neben diesem Listenfeld befindet sich ein weiteres Listenfeld namens <b>lstKriterien<\/b>, mit dem Sie festlegen k&ouml;nnen, welche Kriterien beim &Atilde;&#8220;ndern bestehender Datens&auml;tze ber&uuml;cksichtigt werden sollen.<\/p>\n<p>Beide Listenfelder werden beim Ausw&auml;hlen einer Tabelle aktualisiert:<\/p>\n<pre>Private Sub cboTabelle_AfterUpdate()\r\n    If Not IsNull(Me!cboTabelle) Then\r\n        Me!lstFelder.RowSource = Me!cboTabelle\r\n        Me!lstKriterien.RowSource = Me!cboTabelle\r\n    Else\r\n        Me!lstFelder.RowSource = &quot;&quot;\r\n        Me!lstKriterien.RowSource = &quot;&quot;\r\n    End If\r\n    End Sub<\/pre>\n<p>Die Optionsgruppe <b>ogrKriterien <\/b>erlaubt das Festlegen eines Verkn&uuml;pfungsoperators f&uuml;r mehrere Kriterien. Sie k&ouml;nnen diese entweder mit <b>AND <\/b>oder mit <b>OR <\/b>verkn&uuml;pfen, aber nicht gemischt &#8211; dies m&uuml;ssen Sie gegebenenfalls manuell durchf&uuml;hren.<\/p>\n<p>Die Optionsgruppe <b>ogrVariablen <\/b>fragt ab, ob die zu verwendenden Variablen als Parameter der zu erstellenden Routine &uuml;bergeben werden sollen oder ob diese innerhalb der Routine deklariert werden sollen. Mit der Optionsgruppe <b>ogrZugriffsart <\/b>legen Sie fest, ob ein bestehender Datensatz bearbeitet oder ein neuer Datensatz angelegt werden soll.<\/p>\n<p>Schlie&szlig;lich bestimmt die Optionsgruppe <b>ogrZugriffstechnik<\/b>, ob beim Aktualisieren beziehungsweise Hinzuf&uuml;gen des Datensatzes DAO verwendet werden soll oder eine per Execute ausgef&uuml;hrte Aktionsabfrage.<\/p>\n<p>In einem weiteren Rahmen finden Sie noch drei Optionen:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>chkZwischenablage<\/b>: Ist diese Option aktiviert, schreibt das Tool den erzeugten Code gleich in die Zwischenablage. Von dort k&ouml;nnen Sie diesen gleich in das Zielmodul einf&uuml;gen.<\/li>\n<li class=\"aufz-hlung\"><b>chkIsoDatum<\/b>: Wenn Sie diese Option aktivieren, f&uuml;gt das Tool zu Datumsvariablen, die in Aktionsabfragen verwendet werden, die Funktion <b>IsoDatum <\/b>hinzu. Diese wandelt ein Datum in ein SQL-taugliches Datumsformat um.<\/li>\n<li class=\"aufz-hlung\"><b>chkKommaErsetzen<\/b>: Bei Verwendung von Zahlenwerten in Aktionsabfragen kann es zu Problemen kommen, wenn als Trennzeichen das Komma eingesetzt wird. Wenn die Option <b>chkKommaErsetzen <\/b>aktiviert ist, ersetzt das Tool Kommata in Dezimalzahlen durch den Punkt.<\/li>\n<\/ul>\n<p><b>Zusammenstellen der Prozedur auf Basis der gew&auml;hlten Parameter<\/b><\/p>\n<p>In den folgenden Abschnitten erfahren Sie, wie das Tool den gew&uuml;nschten Code zusammenstellt. <\/p>\n<p>Den Startschuss geben Sie mit einem Klick auf die Schaltfl&auml;che <b>cmdCodeErstellen<\/b>. Dies l&ouml;st die folgende Prozedur aus:<\/p>\n<pre>Private Sub cmdCodeErstellen_Click()\r\n    If IsNull(Me!cboTabelle) Then\r\n        MsgBox &quot;Bitte w&auml;hlen Sie eine Tabelle aus.&quot;\r\n        Exit Sub\r\n    End If\r\n    If Me!lstFelder.ItemsSelected.Count = 0 Then\r\n        MsgBox &quot;Bitte w&auml;hlen Sie die betroffenen\r\n        Felder aus.&quot;\r\n        Exit Sub\r\n    End If\r\n    Me!txtZugriffscode = CreateCode\r\n    End Sub<\/pre>\n<p>Die Prozedur stellt sicher, dass der Benutzer eine Tabelle ausgew&auml;hlt und mindestens ein Feld aus dem Listenfeld <b>lstFelder <\/b>markiert hat.<\/p>\n<p>Ist dies gew&auml;hrleistet, wird das Textfeld <b>txtZugriffscode <\/b>durch die Funktion <b>CreateCode <\/b>mit der gew&uuml;nschten Prozedur gef&uuml;llt.<\/p>\n<p><b>Code erstellen<\/b><\/p>\n<p>Der Prozess findet haupts&auml;chlich in der Funktion <b>CreateCode <\/b>statt, die eine Variable namens <b>strCode <\/b>nach und nach mit den Zeilen der zu erstellenden Routine f&uuml;llt:<\/p>\n<pre>Private Function CreateCode() As String\r\n    Dim strCode As String\r\n    ...\r\nEnd Function<\/pre>\n<p>Wir starten mit der Kopfzeile der Prozedur. Bereits diese kann nicht einfach erstellt werden, denn gegebenenfalls sollen ja die Variablen, auf deren Basis der Datenzugriff erfolgt, als Parameter &uuml;bergeben werden. Die Zeile zum Erstellen der ersten Zeile ruft daher gleich zwei weitere Funktionen auf:<\/p>\n<pre>strCode = strCode &amp; &quot;Public Sub &quot; &amp; GetCodename &amp; &quot;(&quot; &amp; GetParameters &amp; &quot;)&quot; &amp; vbCrLf<\/pre>\n<p>Die erste Funktion namens <b>GetCodename<\/b> setzt den Namen der Prozedur zusammen (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-30-anchor\">Listing 1<\/a><\/span>). Der Name besteht aus einem Pr&auml;fix, das entweder <b>Add_ <\/b>oder <b>Update_ <\/b>lautet &#8211; je nachdem, ob der Datensatz hinzugef&uuml;gt oder ge&auml;ndert werden soll. Das Pr&auml;fix wird durch eine <b>Choose<\/b>-Funktion auf Basis des Wertes der Optionsgruppe <b>ogrZugriffsart <\/b>ermittelt. Dann folgt der Name der Tabelle und schlie&szlig;lich ein Suffix, das die Art des Datenzugriffs repr&auml;sentiert &#8211; entweder <b>_DAO <\/b>oder <b>_SQL <\/b>(je nach Wert der Optionsgruppe <b>ogrZugriffstechnik<\/b>). F&uuml;r das Hinzuf&uuml;gen eines Datensatzes per DAO zur Tabelle <b>tblArtikel <\/b>entsteht so ein Routinenname wie <b>Add_tblArtikel_DAO<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Prozedurname erstellen<\/p>\n<pre>Private Function GetCodename() As String\r\n    Dim strCodename As String\r\n    strCodename = Choose(Me!ogrZugriffsart, &quot;Add_&quot;, &quot;Update_&quot;)\r\n    strCodename = strCodename &amp; Me!cboTabelle\r\n    strCodename = strCodename &amp; Choose(Me!ogrZugriffstechnik, &quot;_DAO&quot;, &quot;_SQL&quot;)\r\n    GetCodename = strCodename\r\nEnd Function<\/pre>\n<p><b>Variablen als Parameter &uuml;bergeben<\/b><\/p>\n<p>Wenn der Benutzer den Wert <b>1 <\/b>f&uuml;r die Optionsgruppe <b>ogrVariablen <\/b>ausgew&auml;hlt hat, sollen alle Variablen in der Parameterliste im Prozedurkopf erscheinen &#8211; sowohl die f&uuml;r die neuen Daten als auch f&uuml;r die eventuell zu verwendenden Kriterien. Diese Liste erzeugt die Funktion <b>GetParameters <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-28-anchor\">Listing 2<\/a><\/span>). Sie pr&uuml;ft zun&auml;chst den Wert der Optionsgruppe <b>ogrVariablen<\/b>. Danach durchl&auml;uft sie alle markierten Elemente der beiden Listenfelder <b>lstFelder <\/b>und <b>lstKriterien<\/b>. F&uuml;r jeden Eintrag f&uuml;gt sie der Variablen <b>str <\/b>einen Ausdruck nach dem Schema <b>[Pr&auml;fix]Feldname As [Datentyp] <\/b>hinzu. Das Pr&auml;fix wird dabei &uuml;ber eine weitere Funktion namens <b>GetPraefix <\/b>ermittelt (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-31-anchor\">Listing 3<\/a><\/span>). Diese Funktion erwartet einen Verweis auf das dem Eintrag entsprechende <b>Field<\/b>-Objekt der Tabellendefinition. Abh&auml;ngig vom Wert der <b>Type<\/b>-Eigenschaft dieses <b>Field<\/b>-Objekts liefert sie ein passendes Pr&auml;fix wie etwa <b>str <\/b>oder <b>lng <\/b>zur&uuml;ck.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Parameterliste zusammenstellen<\/p>\n<pre>Private Function GetParameters() As String\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    If Me!ogrVariablen = 1 Then\r\n        Set db = CurrentDb\r\n        Set tdf = db.TableDefs(Me!cboTabelle)\r\n        For i = 0 To Me!lstFelder.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.ItemsSelected(i))\r\n        str = str &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot; As &quot; &amp; GetDatatype(fld) &amp; &quot;, &quot;\r\n        Next i\r\n        For i = 0 To Me!lstKriterien.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstKriterien.ItemsSelected(i))\r\n        str = str &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot;_Crit As &quot; &amp; GetDatatype(fld) &amp; &quot;, &quot;\r\n        Next i\r\n        GetParameters = Left(str, Len(Trim(str)) - 1)\r\n    End If\r\nEnd Function<\/pre>\n<p class=\"listingueberschrift\">Listing 3: Pr&auml;fix f&uuml;r ein Feld ermitteln<\/p>\n<pre>Private Function GetPraefix(fld As DAO.Field) As String\r\n    Select Case fld.Type\r\n        Case dbBoolean\r\n        GetPraefix = &quot;bol&quot;\r\n        Case dbInteger\r\n        GetPraefix = &quot;int&quot;\r\n        Case dbLong\r\n        GetPraefix = &quot;lng&quot;\r\n        Case dbCurrency\r\n        GetPraefix = &quot;cur&quot;\r\n        Case dbSingle\r\n        GetPraefix = &quot;sng&quot;\r\n        Case dbDouble\r\n        GetPraefix = &quot;dbl&quot;\r\n        Case dbText, dbMemo\r\n        GetPraefix = &quot;str&quot;\r\n        Case dbDate\r\n        GetPraefix = &quot;dat&quot;\r\n        Case Else\r\n        Debug.Print fld.Type, fld.Name\r\n    End Select\r\nEnd Function<\/pre>\n<p class=\"listingueberschrift\">Listing 5: Deklarationszeilen zusammenstellen<\/p>\n<pre>Private Function GetDeclarations()\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    If Me!ogrVariablen = 2 Then\r\n        Set db = CurrentDb\r\n        Set tdf = db.TableDefs(Me!cboTabelle)\r\n        For i = 0 To Me!lstFelder.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.ItemsSelected(i))\r\n        str = str &amp; GetDeclaration(fld)\r\n        Next i\r\n        For i = 0 To Me!lstKriterien.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstKriterien.ItemsSelected(i))\r\n        str = str &amp; GetDeclaration(fld, &quot;_Crit&quot;)\r\n        Next i\r\n        GetDeclarations = str\r\n    End If\r\nEnd Function\r\nPrivate Function GetDeclaration(fld As DAO.Field, Optional strSuffix As String) As String\r\n    GetDeclaration = &quot;    Dim &quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; strSuffix &amp; &quot; As &quot; _\r\n        &amp; GetDatatype(fld) &amp; vbCrLf\r\nEnd Function<\/pre>\n<p><!--30percent--><\/p>\n<p>Ganz &auml;hnlich arbeitet die Funktion <b>GetDatatype <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-32-anchor\">Listing 4<\/a><\/span>): Sie erwartet ebenfalls den Verweis auf das aktuelle <b>Field<\/b>-Objekt und ermittelt in einem <b>Select Case<\/b>-Konstrukt den Datentyp f&uuml;r diesen Ausdruck, also beispielsweise <b>String <\/b>oder <b>Integer<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Datentyp eines Feldes ermitteln<\/p>\n<pre>Private Function GetDatatype(fld As DAO.Field) As String\r\n    Select Case fld.Type\r\n        Case dbBoolean\r\n        GetDatatype = &quot;Boolean&quot;\r\n        Case dbInteger\r\n        GetDatatype = &quot;Integer&quot;\r\n        Case dbLong\r\n        GetDatatype = &quot;Long&quot;\r\n        Case dbCurrency\r\n        GetDatatype = &quot;Currency&quot;\r\n        Case dbSingle\r\n        GetDatatype = &quot;Single&quot;\r\n        Case dbDouble\r\n        GetDatatype = &quot;Double&quot;\r\n        Case dbText, dbMemo\r\n        GetDatatype = &quot;String&quot;\r\n        Case dbDate\r\n        GetDatatype = &quot;Date&quot;\r\n        Case Else\r\n        Debug.Print fld.Type, fld.Name\r\n    End Select\r\nEnd Function<\/pre>\n<p><b>Deklaration von Database und Recordset<\/b><\/p>\n<p>Danach folgt die Deklaration einiger wichtiger Objekte. Auf jeden Fall ben&ouml;tigt die Prozedur ein <b>Database<\/b>-Objekt, dessen Deklaration die folgende Zeile hinzuf&uuml;gt:<\/p>\n<pre>strCode = strCode &amp; &quot;    Dim db As\r\n         DAO.Database&quot; &amp; vbCrLf<\/pre>\n<p>Wenn die Daten per DAO hinzugef&uuml;gt oder ge&auml;ndert werden sollen, brauchen Sie au&szlig;erdem ein <b>Recordset<\/b>-Objekt. Ob dieses deklariert wird oder nicht, legt der Wert der Optionsgruppe <b>ogrZugriffstechnik <\/b>fest. Der Wert <b>1 <\/b>steht f&uuml;r <b>DAO <\/b>und erfordert das Anlegen der entsprechenden Zeile:<\/p>\n<pre>If Me!ogrZugriffstechnik = 1 Then\r\n    strCode = strCode &amp; &quot;    Dim\r\n     rst As DAO.Recordset&quot; &amp; vbCrLf\r\nEnd If<\/pre>\n<p><b>Deklaration in der Prozedur<\/b><\/p>\n<p>Die folgende Zeile ruft die Funktion <b>GetDeclarations <\/b>auf und f&uuml;gt so die Deklarationszeilen zur Prozedur hinzu (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-34-anchor\">Listing 5<\/a><\/span>):<\/p>\n<p class=\"listingueberschrift\">Listing 9: Aktionsabfrage zusammenbauen<\/p>\n<pre>Private Function GetExecute() As String\r\n    Select Case Me!ogrZugriffsart\r\n        Case 1\r\n        GetExecute = &quot;    db.Execute(&quot;&quot;INSERT INTO &quot; &amp; Me!cboTabelle &amp; &quot;(&quot; &amp; GetFields _\r\n            &amp; &quot;) VALUES(&quot; &amp; GetValues &amp; &quot;)&quot;&quot;)&quot; &amp; vbCrLf\r\n        Case 2\r\n        If Len(GetCriteria) &gt; 0 Then\r\n            GetExecute = &quot;    db.Execute(&quot;&quot;UPDATE &quot; &amp; Me!cboTabelle &amp; &quot; SET &quot; &amp; GetUpdates _\r\n            &amp; &quot; WHERE &quot; &amp; GetCriteria &amp; &quot;)&quot; &amp; vbCrLf\r\n        Else\r\n            GetExecute = &quot;    db.Execute(&quot;&quot;UPDATE &quot; &amp; Me!cboTabelle &amp; &quot; SET &quot; &amp; GetUpdates &amp; vbCrLf\r\n        End If\r\n    End Select\r\nEnd Function\r\nstrCode = strCode &amp; GetDeclarations<\/pre>\n<p><b>GetDeclarations <\/b>liefert allerdings nur ein Ergebnis zur&uuml;ck, wenn die Optionsgruppe <b>ogrVariablen <\/b>den Wert <b>2 <\/b>enth&auml;lt, die Variablen also innerhalb der Prozedur deklariert werden sollen.<\/p>\n<p>Dies wird in einer <b>If&#8230;Then<\/b>-Bedingung gepr&uuml;ft. Innerhalb dieser Bedingung durchl&auml;uft die Funktion zwei <b>For&#8230;Next<\/b>-Schleifen. Die erste durchl&auml;uft alle markierten Eintr&auml;ge des Listenfeldes <b>lstFelder<\/b>, das zweite k&uuml;mmert sich um die markierten Eintr&auml;ge von <b>lstKriterien<\/b>.<\/p>\n<p>Innerhalb dieser Schleifen befinden sich jeweils zwei Anweisungen. Die erste f&uuml;llt eine <b>Field<\/b>-Variable mit einem Verweis auf das Feld der Zieltabelle, dessen Name dem im Listenfeld ausgew&auml;hlten Eintrag entspricht. Dieser Objektverweis wird im Aufruf der Funktion <b>GetDeclaration <\/b>in der zweiten Zeile als Parameter &uuml;bergeben. <\/p>\n<p><b>GetDeclaration <\/b>liefert einen Ausdruck nach dem Schema <b>Dim [Praefix]Feldname[Suffix] As [Datentyp] <\/b>zur&uuml;ck. Dabei kommen die bereits weiter oben vorgestellten Funktionen <b>GetPraefix <\/b>und <b>GetDatatype <\/b>zum Einsatz.<\/p>\n<p>Das Suffix wird nur von der zweiten Schleife aus &uuml;bergeben und unterscheidet die Variablennamen der Kriterienfelder gegen&uuml;ber den Variablen f&uuml;r die zu &auml;ndernden beziehungsweise einzuf&uuml;genden Werte.<\/p>\n<p>Die Ausdr&uuml;cke werden mit der Variablen <b>str<\/b> zusammengefasst und als Funktionswert zur&uuml;ckgegeben.<\/p>\n<p><b>Database-Objekt zuweisen<\/b><\/p>\n<p>Die folgende Zeile der Hauptprozedur <b>CreateCode<\/b> f&uuml;gt der Prozedur eine unabk&ouml;mmliche Zeile hinzu, n&auml;mlich die folgende:<\/p>\n<pre>Set db = CurrentDb<\/pre>\n<p>Daf&uuml;r sorgt diese Anweisung:<\/p>\n<pre>strCode = strCode &amp; &quot;    Set db = CurrentDb&quot;\r\n                    &amp; vbCrLf<\/pre>\n<p><b>Recordset &ouml;ffnen<\/b><\/p>\n<p>Wenn der Benutzer f&uuml;r die Optionsgruppe <b>ogrZugriffstechnik <\/b>den Wert <b>1 <\/b>(f&uuml;r DAO) ausgew&auml;hlt hat, soll die zu erstellende Prozedur ein Recordset auf Basis der angegebenen Felder und Kriterien &ouml;ffnen. Die Erstellung der Zeile mit der <b>OpenRecordset<\/b>-Anweisung wird &uuml;ber die Funktion <b>GetSelect <\/b>abgewickelt (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-36-anchor\">Listing 6<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 6: OpenRecordset-Anweisung konstruieren<\/p>\n<pre>Private Function GetSelect() As String\r\n    Select Case Me!ogrZugriffstechnik\r\n        Case 1\r\n        If Me!lstKriterien.ItemsSelected.Count = 0 Then\r\n            GetSelect = &quot;    Set rst = db.OpenRecordset(&quot;&quot;SELECT &quot; &amp; GetFields &amp; &quot; FROM &quot; _\r\n            &amp; Me!cboTabelle &amp; &quot;&quot;&quot;, dbOpenDynaset)&quot; &amp; vbCrLf\r\n        Else\r\n            GetSelect = &quot;    Set rst = db.OpenRecordset(&quot;&quot;SELECT &quot; &amp; GetFields &amp; &quot; FROM &quot; _\r\n            &amp; Me!cboTabelle &amp; &quot; WHERE &quot; &amp; GetCriteria &amp; &quot;&quot;&quot;, dbOpenDynaset)&quot; &amp; vbCrLf\r\n        End If\r\n    End Select\r\nEnd Function<\/pre>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob als Zugriffstechnik &uuml;berhaupt DAO eingesetzt werden soll. Falls ja, folgen weitere Schritte. Diese unterscheiden sich dadurch, ob der Benutzer Kriterien ausgew&auml;hlt hat oder nicht. Falls nein, wird die <b>SELECT<\/b>-Anweisung ohne <b>WHERE<\/b>-Klausel erstellt, sonst mit einer Bedingung.<\/p>\n<p>In beiden F&auml;llen kommt die Funktion <b>GetFields <\/b>zum Einsatz. Diese stellt eine Liste aller Felder zusammen, die per DAO bearbeitet werden sollen. Die Funktion durchl&auml;uft in einer <b>For&#8230;Next<\/b>-Schleife alle markierten Eintr&auml;ge des Listenfeldes <b>lstFelder<\/b> und erstellt dabei eine durch Kommata getrennte Liste aller Felder. Nach dem Entfernen des letzten, &uuml;berfl&uuml;ssigen Kommas wird die Liste an die aufrufende Routine zur&uuml;ckgegeben:<\/p>\n<pre>Private Function GetFields()\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(Me!cboTabelle)\r\n    For i = 0 To Me!lstFelder.ItemsSelected.\r\n                        Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.\r\n                    ItemsSelected(i))\r\n        str = str &amp; fld.Name &amp; &quot;, &quot;\r\n    Next i\r\n    str = Left(str, Len(Trim(str)) - 1)\r\n    GetFields = str\r\nEnd Function<\/pre>\n<p>Etwas aufwendiger ist die Zusammenstellung der Liste der Kriterien. Dies erledigt die Funktion <b>GetCriteria<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-43-anchor\">Listing 7<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 7: Zusammenstellen des Kriteriums der SELECT-Abfrage<\/p>\n<pre>Private Function GetCriteria() As String\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim strAndOr As String\r\n    Dim i As Integer\r\n    Dim str As String\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(Me!cboTabelle)\r\n    strAndOr = Choose(Me!ogrKriterien, &quot;AND&quot;, &quot;OR&quot;)\r\n    For i = 0 To Me!lstKriterien.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstKriterien.ItemsSelected(i))\r\n        Select Case fld.Type\r\n        Case dbBoolean, dbInteger, dbLong\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; &quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot; &amp; &quot;&quot;&quot;\r\n        Case dbCurrency, dbSingle, dbDouble\r\n            If Me!chkKommaErsetzen Then\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; Replace(&quot; &amp; GetPraefix(fld) &amp; fld.Name _\r\n                &amp; &quot;, &quot;&quot;,&quot;&quot;, &quot;&quot;.&quot;&quot;) &amp; &quot;&quot;&quot;\r\n            Else\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; &quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot; &amp; &quot;&quot;&quot;\r\n            End If\r\n        Case dbText, dbMemo\r\n            str = str &amp; fld.Name &amp; &quot; = ''&quot;&quot; &amp; &quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot; &amp; &quot;&quot;''&quot;\r\n        Case dbDate\r\n            If Me!chkIsoDatum Then\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; IsoDatum(&quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot;) &amp; &quot;&quot;&quot;\r\n            Else\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; &quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot; &amp; &quot;&quot;&quot;\r\n            End If\r\n        Case Else\r\n            Debug.Print fld.Type, fld.Name\r\n        End Select\r\n        str = str &amp; &quot; &quot; &amp; strAndOr &amp; &quot; &quot;\r\n    Next i\r\n    str = Left(str, Len(str) - Len(strAndOr) - 2)\r\n    GetCriteria = str\r\nEnd Function<\/pre>\n<p>Diese arbeitet grunds&auml;tzlich wie die Funktion <b>GetFields<\/b>, muss jedoch ein wenig mehr Informationen zusammenstellen. Jeder Ausdruck der <b>WHERE<\/b>-Bedingung hat die folgende Form, wobei noch vom Datentyp abh&auml;ngige Varianten hinzukommen:<\/p>\n<pre>Bestelldatum = &quot; &amp; datBestelldatum &amp; &quot;<\/pre>\n<p>Sie k&ouml;nnen durch Aktivieren des Kontrollk&auml;stchens <b>chk <\/b>die Funktion <b>IsoDatum<\/b> hinzuf&uuml;gen:<\/p>\n<pre>Bestelldatum = &quot; &amp; IsoDatum(datBestelldatum) &amp; &quot;<\/pre>\n<p>Wenn das Feld ein Textfeld ist, kommen etwa noch Hochkommata hinzu wie in folgendem Beispiel:<\/p>\n<pre>Empfaenger = ''&quot; &amp; strEmpfaenger &amp; &quot;''&quot;<\/pre>\n<p>Bei Dezimalzahlen ersetzt die Funktion nach Wunsch die Kommata als Dezimaltrennzeichen durch den Punkt &#8211; SQL fasst das Komma sonst als Aufz&auml;hlungszeichen auf.<\/p>\n<p>Au&szlig;erdem muss die Funktion sich um die Operatoren zum Verkn&uuml;pfen mehrerer Bedingungen k&uuml;mmern. Mit der Optionsgruppe <b>ogrKriterien <\/b>legen Sie fest, ob die Bedingungen mit <b>OR <\/b>oder <b>AND <\/b>verkn&uuml;pft werden.<\/p>\n<p>Die Funktion durchl&auml;uft alle markierten Eintr&auml;ge des Listenfeldes <b>lstKriterien<\/b>. Dabei f&uuml;llt sie wieder jeweils eine <b>Field<\/b>-Variable mit einem Verweis auf das entsprechende Feld der betroffenen Tabelle, um die notwendigen Informationen zum Datentyp zu erhalten. Von diesem h&auml;ngt n&auml;mlich beispielsweise ab, ob der Vergleichsausdruck in Hochkommata eingefasst wird (bei Text- und Memofeldern), ob die <b>IsoDatum<\/b>-Funktion f&uuml;r Datumsfelder eingesetzt werden soll oder ob Kommata bei Dezimalzahlen durch Punkte ersetzt werden sollen.<\/p>\n<p>Der Vergleichsoperator wird gleich zu Beginn in Abh&auml;ngigkeit vom Wert von <b>ogrKriterien <\/b>per <b>Choose<\/b>-Anweisung aus <b>AND <\/b>und <b>OR <\/b>ermittelt. Das &uuml;berfl&uuml;ssige <b>AND <\/b>oder <b>OR <\/b>wird am Ende der Funktion abgeschnitten.<\/p>\n<p><b>Variablenwerte zuweisen<\/b><\/p>\n<p>Wenn die Variablen nicht als Parameter &uuml;bergeben, sondern innerhalb der Routine deklariert werden, m&ouml;chten Sie diese m&ouml;glicherweise gleich f&uuml;llen.<\/p>\n<p>Dazu bereitet die Prozedur die notwendigen Zeilen vor, etwa so:<\/p>\n<pre>lngPersonalID = 0\r\ndatBestelldatum = 0\r\nstrEmpfaenger = &quot;&quot;<\/pre>\n<p>Diese Aufgabe erledigt diese Zeile:<\/p>\n<pre>strCode = strCode &amp; GetAssignments<\/pre>\n<p>Die dadurch aufgerufene Funktion <b>GetAssignmentsVariables <\/b>sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-44-anchor\">Listing 8<\/a><\/span> aus. Sie durchl&auml;uft alle ausgew&auml;hlten Eintr&auml;ge des Listenfeldes <b>lstFelder <\/b>und erstellt f&uuml;r jedes Feld eine entsprechende Wertzuweisung &#8211; dies jedoch nur, wenn <b>ogrVariablen <\/b>den Wert <b>2<\/b> aufweist.<\/p>\n<p class=\"listingueberschrift\">Listing 8: Zusammenstellung der Wertzuweisungen<\/p>\n<pre>Private Function GetAssignmentsVariables()\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    Dim strValue As String\r\n    If Me!ogrVariablen = 2 Then\r\n        Set db = CurrentDb\r\n        Set tdf = db.TableDefs(Me!cboTabelle)\r\n        For i = 0 To Me!lstFelder.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.ItemsSelected(i))\r\n        Select Case fld.Type\r\n            Case dbBoolean, dbInteger, dbLong, dbCurrency, dbSingle, dbDouble, dbDate\r\n            strValue = 0\r\n            Case dbText, dbMemo\r\n            strValue = &quot;&quot;&quot;&quot;&quot;&quot;\r\n            Case Else\r\n            Debug.Print fld.Type, fld.Name\r\n        End Select\r\n        str = str &amp; &quot;    &quot; &amp; GetPraefix(fld) &amp; fld.Name &amp; &quot; = &quot; &amp; strValue &amp; vbCrLf\r\n        Next i\r\n    End If\r\n    GetAssignmentsVariables = str\r\nEnd Function<\/pre>\n<p><b>Bearbeitung per DAO<\/b><\/p>\n<p>F&uuml;r das Anlegen beziehungsweise die Bearbeitung per DAO sollen nun folgende Zeilen zur zu erzeugenden Routine hinzukommen (beim Bearbeiten wird <b>AddNew <\/b>durch <b>Edit <\/b>ersetzt):<\/p>\n<pre>rst.AddNew\r\nrst!BestellungID = lngBestellungID\r\nrst!KundeID = lngKundeID\r\nrst!PersonalID = lngPersonalID\r\nrst!Bestelldatum = datBestelldatum\r\nrst!Empfaenger = strEmpfaenger\r\nrst.Update\r\nrst.Close\r\nSet rst = Nothing<\/pre>\n<p>Ob <b>AddNew <\/b>oder <b>Edit <\/b>zum Einsatz kommt, entscheidet sich in der folgenden <b>Select Case<\/b>-Anweisung:<\/p>\n<pre>Select Case Me!ogrZugriffsart\r\nCase 1\r\n    strCode = strCode &amp; &quot;    rst.AddNew&quot; &amp; vbCrLf\r\nCase 2\r\n    strCode = strCode &amp; &quot;    rst.Edit&quot; &amp; vbCrLf\r\nEnd Select<\/pre>\n<p>Danach folgt die eigentliche Wertzuweisung.<\/p>\n<p>Die notwendigen Anweisungen liefert die Funktion <b>GetAssignmentsDAO<\/b>, die wie folgt aufgerufen wird:<\/p>\n<pre>strCode = strCode &amp; GetAssignmentsDAO<\/pre>\n<p>Diese Funktion durchl&auml;uft alle aktivierten Felder des Listenfeldes <b>lstFelder <\/b>und stellt die ben&ouml;tigten Name-Wert-Paare zusammen:<\/p>\n<pre>Private Function GetAssignmentsDAO() As String\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(Me!cboTabelle)\r\n    For i = 0 To Me!lstFelder.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.\r\n                    ItemsSelected(i))\r\n        str = str &amp; &quot;    rst!&quot; &amp; fld.Name &amp; &quot; = &quot;\r\n        &amp; GetPraefix(fld) &amp; fld.Name &amp; vbCrLf\r\n    Next i\r\n    GetAssignmentsDAO = str\r\nEnd Function<\/pre>\n<p>Fehlen noch die Anweisungen, die sich um das Aktualisieren und Schlie&szlig;en des <b>Recordset<\/b>-Objekts und um die Leerung der Objektvariablen k&uuml;mmern:<\/p>\n<pre>strCode = strCode &amp; &quot;    rst.Update&quot; &amp; vbCrLf\r\nstrCode = strCode &amp; &quot;    rst.Close&quot; &amp; vbCrLf\r\nstrCode = strCode &amp; &quot;    Set rst = Nothing&quot; &amp; vbCrLf<\/pre>\n<p><b>Bearbeitung per Aktionsabfrage<\/b><\/p>\n<p>Wenn als Zugriffstechnik die SQL-Aktionsabfrage ausgew&auml;hlt wurde, wird der Code anders erweitert, und zwar durch folgende Anweisung:<\/p>\n<pre>strCode = strCode &amp; GetExecute<\/pre>\n<p>Die <b>GetExecute<\/b>-Funktion pr&uuml;ft zun&auml;chst, ob eine Anf&uuml;ge- oder eine Aktualisierungsabfrage verwendet werden soll (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-48-anchor\">Listing 9<\/a><\/span>). Dazu untersucht sie den Wert des Steuerelements <b>ogrZugriffsart<\/b>. Im Falle einer Anf&uuml;geabfrage wird eine entsprechende <b>INSERT INTO<\/b>-Anweisung erstellt.<\/p>\n<p>Diese enth&auml;lt einige variable Anteile: den Tabellennamen, die Feldliste und die Wertliste. Die letzten beiden werden durch entsprechende Funktionen ermittelt. <b>GetFields <\/b>wurde bereits weiter vorn vorgestellt, <b>GetValues <\/b>ist neu und in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-47-anchor\">Listing 10<\/a><\/span> zu finden.<\/p>\n<p class=\"listingueberschrift\">Listing 10: Wertliste zusammenstellen<\/p>\n<pre>Private Function GetValues() As String\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    Dim strField As String\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(Me!cboTabelle)\r\n    For i = 0 To Me!lstFelder.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.ItemsSelected(i))\r\n        strField = GetPraefix(fld) &amp; fld.Name\r\n        Select Case fld.Type\r\n        Case dbBoolean, dbInteger, dbLong\r\n            str = str &amp; &quot;&quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;, &quot;\r\n        Case dbCurrency, dbSingle, dbDouble\r\n            If Me!chkKommaErsetzen Then\r\n            str = str &amp; &quot; = &quot;&quot; &amp; Replace(&quot; &amp; strField &amp; &quot;, &quot;&quot;,&quot;&quot;, &quot;&quot;.&quot;&quot;) &amp; &quot;&quot;&quot;\r\n            Else\r\n            str = str &amp; &quot; = &quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;&quot;\r\n            End If\r\n        Case dbText, dbMemo\r\n            str = str &amp; &quot;''&quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;'', &quot;\r\n        Case dbDate\r\n            If Me!chkIsoDatum Then\r\n            str = str &amp; &quot;&quot;&quot; &amp; IsoDatum(&quot; &amp; strField &amp; &quot;) &amp; &quot;&quot;, &quot;\r\n            Else\r\n            str = str &amp; &quot;&quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;, &quot;\r\n            End If\r\n        Case Else\r\n            Debug.Print fld.Type, fld.Name\r\n        End Select\r\n    Next i\r\n    str = Left(str, Len(Trim(str)) - 1)\r\n    GetValues = str\r\nEnd Function<\/pre>\n<p><b>INSERT INTO-Werte zusammenstellen<\/b><\/p>\n<p>Die Funktion <b>GetValues <\/b>stellt den Ausdruck zusammen, der hinter dem <b>VALUES<\/b>-Schl&uuml;sselwort einer <b>INSERT INTO<\/b>-Anweisung in Klammern angegeben wird &#8211; etwa so:<\/p>\n<pre>VALUES(&quot; &amp; lngBestellungID &amp; &quot;, &quot; &amp; lngKundeID &amp; &quot;,\r\n&quot; &amp; lngPersonalID &amp; &quot;, &quot; &amp; IsoDatum(datBestelldatum) &amp; &quot;, &quot; &amp; curFrachtkosten &amp; &quot;''&quot; ...<\/pre>\n<p>Dabei durchl&auml;uft sie alle selektierten Felder des Listenfeldes <b>lstFelder <\/b>und f&uuml;gt die Wertliste entsprechend dem jeweiligen Felddatentyp zusammen.<\/p>\n<p><b>UPDATE-Zuweisungen ermitteln<\/b><\/p>\n<p>F&uuml;r die Aktualisierungsabfrage ben&ouml;tigen Sie einen Ausdruck, der die Zuweisung der neuen Werte zu den Feldern enth&auml;lt. Diesen Ausdruck liefert die Funktion <b>GetUpdates<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-49-anchor\">Listing 11<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 11: Feldzuweisungen zusammenstellen<\/p>\n<pre>Private Function GetUpdates() As String\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim i As Integer\r\n    Dim str As String\r\n    Dim strField As String\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(Me!cboTabelle)\r\n    For i = 0 To Me!lstFelder.ItemsSelected.Count - 1\r\n        Set fld = tdf.Fields(Me!lstFelder.ItemsSelected(i))\r\n        strField = GetPraefix(fld) &amp; fld.Name\r\n        Select Case fld.Type\r\n        Case dbBoolean, dbInteger, dbLong\r\n            If Me!chkKommaErsetzen Then\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; Replace(&quot; &amp; strField &amp; &quot;, &quot;&quot;,&quot;&quot;, &quot;&quot;.&quot;&quot;) &amp; &quot;&quot;, &quot;\r\n            Else\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;, &quot;\r\n            End If\r\n        Case dbCurrency, dbSingle, dbDouble\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;, &quot;\r\n        Case dbText, dbMemo\r\n            str = str &amp; fld.Name &amp; &quot; = ''&quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;'', &quot;\r\n        Case dbDate\r\n            If Me!chkIsoDatum Then\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; IsoDatum(&quot; &amp; strField &amp; &quot;) &amp; &quot;&quot;, &quot;\r\n            Else\r\n            str = str &amp; fld.Name &amp; &quot; = &quot;&quot; &amp; &quot; &amp; strField &amp; &quot; &amp; &quot;&quot;, &quot;\r\n            End If\r\n        Case Else\r\n            Debug.Print fld.Type, fld.Name\r\n        End Select\r\n    Next i\r\n    str = Left(str, Len(Trim(str)) - 1)\r\n    GetUpdates = str\r\nEnd Function<\/pre>\n<p>Die Funktion arbeitet prinzipiell wie die Funktion <b>GetValues<\/b>, erstellt jedoch Name-Wert-Paare wie in folgendem Beispiel:<\/p>\n<pre>SET BestellungID = &quot; &amp; lngBestellungID &amp; &quot;, KundeID = &quot; &amp; lngKundeID &amp; &quot;, ...<\/pre>\n<p><b>Der Rest vom Sch&uuml;tzenfest<\/b><\/p>\n<p>Fehlen schlie&szlig;lich nur noch zwei Zeilen Code: Das Leeren der <b>db<\/b>-Variablen und die <b>End Sub<\/b>-Anweisung. Dies erledigen diese beiden Zeilen der Funktion <b>CreateCode<\/b>:<\/p>\n<pre>strCode = strCode &amp; &quot;    Set db = Nothing&quot; &amp; vbCrLf\r\nstrCode = strCode &amp; &quot;End Sub&quot;<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zusammenfassung und Ausblick<\/p>\n<p>Aus dieser L&ouml;sung l&auml;sst sich leicht ein Add-In erzeugen, mit dem Sie schnell den Code f&uuml;r den Datenzugriff unter verschiedenen Bedingungen erstellen k&ouml;nnen.<\/p>\n<p>Das Resultat k&ouml;nnen Sie nach Gutd&uuml;nken manuell beschneiden oder anpassen, Sie k&ouml;nnen aber auch neue Funktionen zu dieser L&ouml;sung hinzuf&uuml;gen. <\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>aiuDatenzugriffscode.mda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{1A598BAF-9C44-489A-8D4C-70A1505B614B}\/aiu_808.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Code f&uuml;r den Datenzugriff brauchen Sie immer wieder. Mal m&ouml;chten Sie eine SQL-Aktionsabfrage auf Basis einer Tabelle erzeugen, in das Sie eine Reihe zuvor gef&uuml;llter Variablen integrieren, mal greifen Sie vielleicht per DAO oder ADO auf die Felder einer solchen Tabelle zu. Wir stellen Ihnen die notwendigen Techniken vor, damit Sie dies nicht mehr von Hand erledigen m&uuml;ssen.<\/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":[662011,66062011,44000025],"tags":[],"class_list":["post-55000808","post","type-post","status-publish","format-standard","hentry","category-662011","category-66062011","category-VBA_und_Programmiertechniken"],"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>Datenzugriffscode erzeugen - 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\/Datenzugriffscode_erzeugen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenzugriffscode erzeugen\" \/>\n<meta property=\"og:description\" content=\"Code f&uuml;r den Datenzugriff brauchen Sie immer wieder. Mal m&ouml;chten Sie eine SQL-Aktionsabfrage auf Basis einer Tabelle erzeugen, in das Sie eine Reihe zuvor gef&uuml;llter Variablen integrieren, mal greifen Sie vielleicht per DAO oder ADO auf die Felder einer solchen Tabelle zu. Wir stellen Ihnen die notwendigen Techniken vor, damit Sie dies nicht mehr von Hand erledigen m&uuml;ssen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:59:19+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2\" \/>\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=\"23\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenzugriffscode erzeugen\",\"datePublished\":\"2020-05-22T21:59:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/\"},\"wordCount\":2589,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7a8b36c3768b4f0d8e3f7addfad46cf2\",\"articleSection\":[\"2011\",\"6\\\/2011\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/\",\"name\":\"Datenzugriffscode erzeugen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7a8b36c3768b4f0d8e3f7addfad46cf2\",\"datePublished\":\"2020-05-22T21:59:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7a8b36c3768b4f0d8e3f7addfad46cf2\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/7a8b36c3768b4f0d8e3f7addfad46cf2\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriffscode_erzeugen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenzugriffscode erzeugen\"}]},{\"@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":"Datenzugriffscode erzeugen - 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\/Datenzugriffscode_erzeugen\/","og_locale":"de_DE","og_type":"article","og_title":"Datenzugriffscode erzeugen","og_description":"Code f&uuml;r den Datenzugriff brauchen Sie immer wieder. Mal m&ouml;chten Sie eine SQL-Aktionsabfrage auf Basis einer Tabelle erzeugen, in das Sie eine Reihe zuvor gef&uuml;llter Variablen integrieren, mal greifen Sie vielleicht per DAO oder ADO auf die Felder einer solchen Tabelle zu. Wir stellen Ihnen die notwendigen Techniken vor, damit Sie dies nicht mehr von Hand erledigen m&uuml;ssen.","og_url":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:59:19+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"23\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenzugriffscode erzeugen","datePublished":"2020-05-22T21:59:19+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/"},"wordCount":2589,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2","articleSection":["2011","6\/2011","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/","url":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/","name":"Datenzugriffscode erzeugen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2","datePublished":"2020-05-22T21:59:19+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/7a8b36c3768b4f0d8e3f7addfad46cf2"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriffscode_erzeugen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenzugriffscode erzeugen"}]},{"@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\/55000808","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=55000808"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000808\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}