{"id":55000437,"date":"2007-02-01T00:00:00","date_gmt":"2021-02-11T21:08:25","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=437"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Disconnected_Recordsets","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/","title":{"rendered":"Disconnected Recordsets"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250\" width=\"1\" height=\"1\" alt=\"\">        <\/p>\n<p><b>Konfigurationsdaten, Meldungen oder SQL-Befehle kann man in passenden Tabellen speichern und bei Bedarf per DLookup oder DAO auf diese zugreifen. Da diese Daten sich in der Regel nur selten &auml;ndern, kann man sie getrost einmal zu Beginn der Session auslesen und dann auf die tempor&auml;r gespeicherten Daten zugreifen. Das spart Ressourcen und erh&ouml;ht die Zugriffsgeschwindigkeit &#8211; dank ADO und Disconnected Recordsets.<\/b><\/p>\n<\/p><\/div>\n<div class=\"story\">\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Neue Datenzugriffstechnik mit ADO<\/p>\n<p>Das Schlagwort &#8222;Disconnected Recordsets&#8220; geisterte durch die Welt der Programmierung, seit Microsoft die Version 2.0 von &#8222;ADO&#8220; (ActiveX Data Objects) f&uuml;r Datenbanken publiziert hatte. ADO war urspr&uuml;nglich als Nachfolger f&uuml;r DAO (Data Access Objects) geplant. <\/p>\n<p>Der Datenbankzugriff mit ADO weist gegen&uuml;ber DAO einige Verbesserungen in der Performance auf, wenn SQL-Server-Backends zum Einsatz kommen. Der Hemmschuh ist in diesem Fall die von DAO f&uuml;r den Zugriff ben&ouml;tigte ODBC-Schnittstelle. F&uuml;r die Festlegung des Datenbankzugriffs wird ein OLE DB-Provider ben&ouml;tigt &#8211; eine der Neuerungen von ADO. Mit Hilfe dieses Providers k&ouml;nnen Sie dem Connection-Objekt mitteilen, auf welche Datenbank es zugreifen soll und um welche Version es sich dabei handelt. Mit ADO lassen sich nahezu alle gebr&auml;uchlichen Datenbanken wie etwa Microsoft Access, SQL-Server, Oracle oder Informix ansprechen.<\/p>\n<p>Die wichtigsten drei Komponenten des ADO-Datenmodells sind folgende:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Connection <\/b>(&#8222;Verbindung&#8220;): Enth&auml;lt den Ort und den Namen der angesprochenen Datenbank, braucht f&uuml;r eine angesprochene Datenbank nur einmal definiert zu werden. <\/li>\n<li class=\"aufz-hlung\"><b>Recordset <\/b>(&#8222;Datensatz-Objekt&#8220;): Der Verbindung untergeordnetes und abh&auml;ngiges Objekt, das Daten in Form von Tabellen oder Abfragen zur&uuml;ckgibt; ist die Grundlage der folgenden Ausf&uuml;hrungen.<\/li>\n<li class=\"aufz-hlung\"><b>Command <\/b>(&#8222;Befehls-Objekt&#8220;): Das Command-Objekt ben&ouml;tigt keine Connection und dient dem &auml;ndern der Datenbank und der enthaltenen Daten mit Befehlen wie UPDATE, CREATE TABLE oder INSERT INTO.<\/li>\n<\/ul>\n<p><b>Vergleich des Zugriffs auf Recordsets<\/b><\/p>\n<p>Die folgenden Codebeispiele zeigen den Unterschied des Datenzugriffs mit DAO und ADO. Beachten Sie, dass das DAO-Beispiel nicht mit Access-Projekten funktioniert. Das h&auml;ngt damit zusammen, dass DAO ausschlie&szlig;lich mit der JET-Engine arbeiten kann, egal, ob die Relationen aus einer Access-Datenbank oder einer ODBC-Datenbank stammen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">&ouml;ffnen eines Recordsets mit DAO<\/p>\n<p>Um mittels DAO ein Recordset zu &ouml;ffnen, ben&ouml;tigt man nicht viel. Das Codebeispiel aus Listing 1 verwendet die <b>OpenRecordset<\/b>-Methode zum Erzeugen des Recordsets und liefert dieses als Funktionswert an die aufrufende Routine zur&uuml;ck.<\/p>\n<p class=\"kastentabelleheader\">Listing 1: &ouml;ffnen eines Recordset-Objekts mit DAO<\/p>\n<pre>Public Function OpenRecordSet_By_DAO() As DAO.RecordSet\r\n     On Error GoTo ErrorHandler \r\n     Dim db As DAO.Database\r\n     Dim rst As DAO.Recordset \r\n     Set db = DBEngine(0)(0)\r\n     Set rst = db.OpenRecordset(&quot;tblStammdaten&quot;, dbOpenDynaset) \r\n     If Not rst Is Nothing Then\r\n         Set OpenRecordSet_By_DAO = rst\r\n     End If \r\nExitCode:\r\n     On Error Resume Next\r\n     Set rst = Nothing\r\n     Set db = Nothing\r\n     Exit Function \r\nErrorHandler:\r\n     MsgBox Err.Description, vbInformation, &quot;OpenRecordSet_By_DAO&quot;\r\n     Resume ExitCode\r\nEnd Function<\/pre>\n<p><b>&ouml;ffnen eines Recordsets mittels ADO<\/b><\/p>\n<p>Wollen Sie die gleiche Funktion mit ADO nachbilden, m&uuml;ssen Sie ein paar wenige Codezeilen mehr schreiben. Dies ist aber dadurch bedingt, dass ADO wesentlich mehr M&ouml;glichkeiten besitzt als DAO. Der Unterschied im Code wird schnell ersichtlich. Der Code f&uuml;r den Zugriff mittels ADO ist zwar etwas l&auml;nger, daf&uuml;r aber auch strukturierter (s. Listing 2). Zun&auml;chst baut die Routine durch Setzen der Eigenschaft <b>ActiveConnection<\/b> eine Verbindung zur Datenquelle auf.<\/p>\n<p class=\"kastentabelleheader\">Listing 2: &ouml;ffnen eines Recordset-Objekts mit ADO<\/p>\n<pre>Public Function OpenRecordSet_By_ADO() As ADODB.Recordset\r\n     On Error GoTo ErrorHandler\r\n     Dim rst As ADODB.Recordset \r\n     Set rst = New ADODB.Recordset \r\n     With rst\r\n         Set .ActiveConnection = CurrentProject.Connection\r\n         .CursorLocation = adUseServer\r\n         .CursorType = adOpenDynamic\r\n         .Source = &quot;tblStammdaten&quot;\r\n         .Open\r\n     End With \r\n     If Not rst Is Nothing Then\r\n         Set OpenRecordSet_By_ADO = rst\r\n     End If \r\nExitCode:\r\n     On Error Resume Next\r\n     Set rst = Nothing\r\n     Exit Function \r\nErrorHandler:\r\n     MsgBox Err.Description, vbInformation, &quot;OpenRecordSet_By_ADO&quot;\r\n     Resume ExitCode\r\nEnd Function<\/pre>\n<p>Im n&auml;chsten Schritt konfiguriert sie das zu f&uuml;llende Recordset und &ouml;ffnet es anschlie&szlig;end mit der <b>Open<\/b>-Methode. Was bei DAO ein Einzeiler ist, l&auml;sst sich auch mit ADO in einer Zeile realisieren, allerdings scheint diese Variante un&uuml;bersichtlicher &#8211; auch im Vergleich mit dem passenden DAO-Aufruf, da ADO mehr Optionen bereitstellt:<\/p>\n<pre>rst.Open [Source], <br \/>[ActiveConnection], [CursorType], [LockType], [Options]<\/pre>\n<p>Die Eigenschaft <b>ActiveConnection <\/b>erm&ouml;glicht es dem Recordset, eine Verbindung zur Datenbank aufzubauen. Die so genannten Connectionstrings f&uuml;r die g&auml;ngigsten Datenquellen findet man sowohl im Internet [1] als auch in der Online-Hilfe von Microsoft. Die Codes zu obigem Beispiel finden Sie im Formular <b>Demonstration DAO &#8211; ADO <\/b>der Beispieldatenbank (siehe Bild 1).<\/p>\n<div class=\"abbildung\">\n            <img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_01\/DisconnectedRecordsets-web-images\/pic001_opt.jpeg\" alt=\"pic001.tif\" \/>\n        <\/div>\n<div class=\"abbildung\">\n<p><b><span style=\"color:darkgrey\">Bild 1: Beispielformular zum Erzeugen eines Recordsets mit DAO und ADO<\/span><\/b><\/p>\n<\/p><\/div>\n<p><b>Was sind <br \/>&#8222;Disconnected Recordsets&#8220;<\/b><\/p>\n<p>Ab ADO 2.0 (wurde 1998\/1999 im Rahmen der Einf&uuml;hrung von MDAC 2.0 ausgeliefert) k&ouml;nnen Recordsets von ihrer Verbindung getrennt werden. Der Zeiger eines Recordsets auf die von ihm verwendete Datenquelle wird durch die Eigenschaft <b>ActiveConnection <\/b>repr&auml;sentiert. Diese Eigenschaft kann seit der Version 2.0 nicht nur ausgelesen, sondern auch neu gesetzt werden.<\/p>\n<p>Dabei kann sie sowohl auf <b>Nothing <\/b>als auch auf eine andere Verbindung als die urspr&uuml;ngliche gesetzt werden. Wenn ein Recordset mit folgender Anweisung von seiner Datenquelle abgekoppelt wird, kann es immer noch bearbeitet werden:<\/p>\n<pre>Set .ActiveConnection = Nothing<\/pre>\n<p>Voraussetzung hierf&uuml;r ist jedoch, dass ein Cursor auf der Client-Seite verwendet wird:<\/p>\n<pre>.CursorLocation = adUseClient<\/pre>\n<p>Au&szlig;erdem muss die Eigenschaft <b>LockType <\/b>den Wert <b>adLockBatchOptimistic <\/b>aufweisen:<\/p>\n<pre>.LockType = adLockBatch<\/pre>\n<p>Dadurch werden alle Datens&auml;tze des Recordsets im Speicher gehalten und auf Seiten der Datenbank keine Sperren gesetzt. Das Recordset f&uuml;hrt seine Statusinformationen korrekt mit. Sie k&ouml;nnen zu einem sp&auml;teren Zeitpunkt die Verbindung wieder herstellen und mit der Methode <b>UpdateBatch <\/b>die &auml;nderungen wieder in die Datenbank einspielen.<\/p>\n<p><b>Warum &#8222;Disconnected Recordsets&#8220;<\/b><\/p>\n<p>Die Verwendung von <b>Disconnected Recordsets<\/b> wird im ersten Augenblick nicht unbedingt einleuchtend sein, insbesondere, wenn man (wie auch ich selbst) bisher immer mit JET-Datenbanken oder zumindest mit sehr leistungsf&auml;higen Datenbank-Backends gearbeitet hat. <\/p>\n<p>Ein klassisches Beispiel f&uuml;r die Verwendung von <b>Disconnected Recordsets<\/b> bietet das Internet. Stellen Sie sich vor, Sie haben einen gut laufenden Online-Shop. Jede Listbox bef&uuml;llen Sie mit Daten aus Ihrem Artikelstamm.<\/p>\n<p>Bei jeder Aktualisierung der Seite w&uuml;rden bei einer bestehenden Verbindung des Recordsets zur Datenquelle die Daten erneut aus der Datenbank gelesen werden. Sollte gerade nur ein K&auml;ufer in Ihrem Shop einkaufen, w&auml;re diese Performance-Bremse noch zu ertragen &#8211; stellen Sie sich aber mal vor, Sie seien der Betreiber von Amazon, EBay, etc. <\/p>\n<p>Es wird schnell klar, wo der Vorteil von <b>Disconnected Recordsets<\/b> liegt &#8211; der Zugriff auf die Datenbank erfolgt einmalig und die Anwendung kann mit den Daten lokal im Arbeitsspeicher des Computers arbeiten. Es erkl&auml;rt sich von selbst, dass die Verwendung von <b>Disconnected Recordsets<\/b> nicht geeignet ist, wenn Sie eine Datenbankl&ouml;sung einsetzen, bei der es auf Aktualit&auml;t der Daten ankommt.<\/p>\n<p><!--30percent--><\/p>\n<p><b>Anwendungsbeispiele f&uuml;r <br \/>&#8222;Disconnected Recordsets&#8220;<\/b><\/p>\n<p>Nicht nur f&uuml;r Internet-Anwendungen k&ouml;nnen <b>Disconnected Recordsets<\/b> hilfreich sein &#8211; auch Ihre Datenbankanwendung k&ouml;nnen Sie unter Umst&auml;nden mit einer Leistungssteigerung versehen, wenn Sie statische Daten mit einem <b>Disconnected Recordset<\/b> in den Arbeitsspeicher verlagern. Die folgenden Beispiele verdeutlichen dies:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Formularkonfigurationen<\/b>: Sie speichern das Design und die Formate der Steuerelemente aller Formulare in Tabellen Ihrer Datenbank. Beim &ouml;ffnen eines Formulars werden die Konfigurationsdaten f&uuml;r das Formular und f&uuml;r die in diesem Formular befindlichen Steuerelemente aus der Datenbank ausgelesen und auf das Formular angewendet.<\/li>\n<li class=\"aufz-hlung\"><b>SQL-Anweisungen<\/b>: Um Ihre Applikation flexibel zu halten, speichern Sie alle SQL-Anweisungen in einer Relation Ihrer Anwendung anstatt sie als separate Abfrageobjekte zu speichern. Wenn eine SQL-Anweisung ausgef&uuml;hrt werden soll, lesen Sie den entsprechenden Text aus der Tabelle ein und f&uuml;hren ihn anschlie&szlig;end aus.<\/li>\n<li class=\"aufz-hlung\"><b>Meldungen und Anweisungen<\/b>: Sie verwenden eine Tabelle in Ihrer Datenbank, in der Sie alle Meldungen und Anweisungen abgespeichert haben. Bevor ein Dialog ge&ouml;ffnet wird, lesen Sie den anzuzeigenden Text aus dieser Tabelle aus.<\/li>\n<\/ul>\n<p><b>Erstellen eines &#8222;Disconnected Recordsets&#8220;<\/b><\/p>\n<p>Um die Verbindung eines Recordsets zur Datenbank zu trennen, m&uuml;ssen Sie lediglich die Eigenschaft <b>ActiveConnection <\/b>des Recordsets auf <b>Nothing <\/b>setzen. Dadurch beh&auml;lt das Recordset seine Eigenschaften und Daten, hat aber keine Verbindung mehr zur Datenquelle. Die folgenden Beispiele demonstrieren diese Technik.<\/p>\n<p><b>Datenbankbeispiel f&uuml;r die Verwendung von &#8222;Disconnected Recordsets&#8220;<\/b><\/p>\n<p>Das nachfolgende Beispiel soll die Vorteile von <b>Disconnected Recordsets<\/b> bei der t&auml;glichen Arbeit mit Microsoft Access verdeutlichen. Weiter oben finden Sie einige Beispiele f&uuml;r die Anwendung von <b>Disconnected Recordset<\/b>. Nun sollen Sie die oben beschriebenen Szenarien an einem einfachen Beispiel nachvollziehen.<\/p>\n<p><b>Beschreibung des Szenarios und der <br \/>Zieldefinition<\/b><\/p>\n<p>Gegeben sei eine Tabelle, in der Texte und Anweisungen Ihrer Anwendung gespeichert sind, die Sie w&auml;hrend der Laufzeit dynamisch anzeigen. Diese Tabelle dient als Konfigurationstabelle f&uuml;r die <b>MsgBox<\/b>-Anweisung und ist wie in Bild 2 aufgebaut.<\/p>\n<div class=\"abbildung\">\n            <img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_01\/DisconnectedRecordsets-web-images\/pic002_opt.jpeg\" alt=\"pic002.tif\" \/>\n        <\/div>\n<div class=\"abbildung\">\n<p><b><span style=\"color:darkgrey\">Bild 2: Aufbau einer Tabelle zum Speichern von Meldungstexten<\/span><\/b><\/p>\n<\/p><\/div>\n<p>&uuml;blicherweise w&uuml;rde man den Text und die Konfiguration mit einer Funktion auslesen, die bei jedem Zugriff dynamisch auf die Relation zugreift (s. Listing 3). Der Aufruf der obigen Funktion erfolgt so:<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Auslesen einer Message durch direkten Tabellenzugriff<\/p>\n<pre>Public Function fn_app_MessageText(MsgFlag As String) As String\r\n     On Error GoTo ErrorHandler \r\n     If MsgFlag = vbNullString Then GoTo ExitCode \r\n         Dim rst As ADODB.Recordset\r\n         Set rst = New ADODB.Recordset\r\n         With rst\r\n             Set .ActiveConnection = CurrentProject.Connection\r\n             .CursorLocation = adUseClient\r\n             .CursorType = adOpenForwardOnly\r\n             .Source = &quot;SELECT MsgText FROM tbl_sys_Messages WHERE MsgFlag = &apos;&quot; _<br \/> &amp; MsgFlag &amp; &quot;&apos;&quot;\r\n             .Open \r\n             If Not rst Is Nothing Then\r\n                 If Not (.EOF And .BOF) Then\r\n                     fn_app_MessageText = !MsgText\r\n                 Else\r\n                     fn_app_MessageText = vbNullString\r\n                 End If\r\n             End If\r\n     End With \r\nExitCode:\r\n     On Error Resume Next\r\n     Exit Function \r\nErrorHandler:\r\n     MsgBox Err.Description, vbInformation, &quot;fn_app_MessageText&quot;\r\n     Resume ExitCode\r\nEnd Function\r\nDim Result as String\r\nResult = fn_app_MessageText(&quot;MeinMessageFlag&quot;)\r\nDebug.Print Result<\/pre>\n<p>So weit, so gut &#8211; leider wird jedes Mal, wenn Sie eine Meldung ausgeben m&ouml;chten, eine Verbindung zur Datenbank hergestellt und anschlie&szlig;end eine Abfrage auf die Tabelle durchgef&uuml;hrt. Das macht eigentlich keinen Sinn, da ja in der Regel die Meldungen nicht so h&auml;ufig aktualisiert werden.<\/p>\n<p>Ziel der &uuml;berarbeitung soll nun sein, dass f&uuml;r zuk&uuml;nftige Erweiterungen der Zugriff auf Konfigurationen nicht mehr mittels einzelner Funktionen, sondern lediglich durch die Methoden einer Klasse stattfindet.<\/p>\n<p>Weiterhin sollen Konfigurationsdaten nur noch einmal von der Datenbank ermittelt werden &#8211; anschlie&szlig;ende Lesezugriffe erfolgen dann &uuml;ber ein im Arbeitspeicher gehaltenes <b>Disconnected Recordset<\/b>.<\/p>\n<p><b>Aufteilung der Aufgaben in Klassen<\/b><\/p>\n<p>Das obige Szenario stammt aus der Realit&auml;t &#8211; aus der des Autors n&auml;mlich. Je mehr Konfigurationstabellen es gab, umso mehr Funktionen waren notwendig, um die Daten aus diesen Konfigurationstabellen auszulesen.<\/p>\n<p>Das brachte unter anderem den Nachteil mit sich, dass man alle Funktionen kennen muss, die auf die Konfigurationstabellen zugreifen.<\/p>\n<p>Durch die Kapselung in Klassen kann man diese Vorgehensweise sehr stark vereinfachen &#8211; man muss lediglich wissen, wie die Klasse hei&szlig;t, &uuml;ber die man an die Konfigurationsdaten herankommt.<\/p>\n<p>Sie ben&ouml;tigen also mindestens zwei Klassen. Die erste Klasse dient als &#8222;Container&#8220; f&uuml;r die Aufrufe aus den Konfigurationsklassen &#8211; diese Klasse soll <b>ConfigData <\/b>hei&szlig;en. Desweiteren ben&ouml;tigen Sie f&uuml;r jede Art von Konfiguration eine separate Klasse.<\/p>\n<p>Wenn Sie beispielsweise SQL-Anweisungen in Tabellen speichern, erstellen Sie eine Klasse mit dem Namen <b>SQL<\/b>; speichern Sie Meldungen in Tabellen, erstellen Sie eine weitere Klasse mit dem Namen <b>Meldungen<\/b>.<\/p>\n<p>F&uuml;r das obige Beispiel nennen Sie die Klasse <b>MessageText<\/b>. Um ein Klassenobjekt in Microsoft Access zu erstellen, wechseln Sie in den VBA-Editor von Access und w&auml;hlen den Men&uuml;eintrag <b>Einf&uuml;gen\/Klassenmodul <\/b>aus. Speichern Sie anschlie&szlig;end das Modul unter dem Namen <b>Messages<\/b>. Nachdem die Klasse in Microsoft Access gespeichert ist, k&ouml;nnen Sie mit der Programmierung beginnen. Die Klasse soll beim Initialisieren automatisch die Daten aus der Datenbank in ein Recordset einlesen und anschlie&szlig;end die Verbindung zur Datenquelle wieder schlie&szlig;en.<\/p>\n<p>Eine Klasse besitzt zwei Standardmethoden, die Sie ausprogrammieren k&ouml;nnen. Die Methode <b>Class_Initialize <\/b>wird automatisch ausgef&uuml;hrt, sobald Sie eine Klasse in Ihrem Code instanzieren, die Methode <b>Class_Terminate <\/b>beim Zerst&ouml;ren der Klasse (etwa durch Setzen der Objektvariable auf <b>Nothing<\/b>).<\/p>\n<p>Das Einlesen der Daten in das Recordset erfolgt also logischerweise innerhalb des <b>Initialize<\/b>-Ereignisses, der Code sieht wie in Listing 4 aus.<\/p>\n<p class=\"kastentabelleheader\">Listing 4: Einlesen einer Tabelle in ein Recordset beim Instanzieren der Klasse Messages<\/p>\n<pre>Private Sub Class_Initialize()\r\n     On Error GoTo ErrorHandler\r\n     Dim rst As ADODB.RecordSet\r\n     Set rst = New ADODB.RecordSet\r\n     With rst\r\n         Set .ActiveConnection = CurrentProject.Connection\r\n         .CursorType = adOpenStatic\r\n         .CursorLocation = adUseClient\r\n         .LockType = adLockReadOnly\r\n         .Source = &quot;SELECT MsgFlag, MsgText FROM tbl_sys_Messages&quot;\r\n         .Open , , , , adCmdText\r\n         If Not rst Is Nothing Then\r\n             Set .ActiveConnection = Nothing\r\n         End If\r\n     End With\r\nExitCode:\r\n     On Error Resume Next\r\n     Exit Sub\r\nErrorHandler:\r\n     MsgBox Err.Description, vbInformation, &quot;Class:Messages&quot;\r\n     Resume ExitCode\r\nEnd Sub<\/pre>\n<p>Um sicherzustellen, dass beim Zerst&ouml;ren der Klasse auch das Recordset im Nirwana des Arbeitsspeichers verschwindet, soll die Ereignisprozedur <b>Class_Terminate <\/b>die passende Objektvariable auf <b>Nothing <\/b>setzen (s. Listing 5).<\/p>\n<p class=\"kastentabelleheader\">Listing 5: Schlie&szlig;en des Recordset-Objekts beim Zerst&ouml;ren der Klasse Messages<\/p>\n<pre>Private Sub Class_Terminate()\r\n     On Error Resume Next\r\n     rst.Close\r\n     Set rst = Nothing\r\nEnd Sub<\/pre>\n<p>Nun m&uuml;ssen Sie noch daf&uuml;r sorgen, dass Sie die M&ouml;glichkeit haben, auf das Recordset von au&szlig;en zuzugreifen. Erstellen Sie dazu noch eine Klasseneigenschaft. Die passende <b>Property Get<\/b>-Prozedur liefert an die aufrufende Funktion das Recordset zur&uuml;ck, das zuvor in der Routine <b>Class_Initialize <\/b>ge&ouml;ffnet wurde:<\/p>\n<pre>Public Property Get Source() As Object\r\n     Set Source = rst\r\nEnd Property<\/pre>\n<p>Mit den beiden Ereignisprozeduren <b>Class_Initialize <\/b>und <b>Class_Terminate <\/b>sowie der <b>Property Get<\/b>-Prozedur <b>Source <\/b>haben Sie die Voraussetzung f&uuml;r den Zugriff auf ein <b>Disconnected Recordset <\/b>geschaffen.<\/p>\n<p>Die Klasse f&uuml;llt das Recordset beim ersten Zugriff und stellt seine im Arbeitsspeicher befindlichen Inhalt von nun an bereit.<\/p>\n<p>Nun brauchen Sie nur noch eine Funktion, die den gew&uuml;nschten Datensatz des Recordsets beschafft, und diese bringen Sie wie oben erl&auml;utert wiederum in einer Klasse unter. Den kompletten Code dieser Klasse namens <b>ConfigData <\/b>finden Sie in Listing 6, die Beschreibung in den folgenden Abschnitten.<\/p>\n<p class=\"kastentabelleheader\">Listing 6: In einer Klasse gekapselter Zugriff auf die Meldungstexte<\/p>\n<pre>Private m As Messages &apos;m = Meldungstexte\r\nPrivate Sub Class_Initialize()\r\n     Set m = New Messages\r\nEnd Sub\r\nPublic Property Get MsgText(MsgFlag As String) As String\r\n     On Error GoTo ErrorHandler\r\n     If MsgFlag &lt;&gt; vbNullString Then\r\n         With m.Source\r\n         .Filter = &quot;MsgFlag = &apos;&quot; &amp; MsgFlag &amp; &quot;&apos;&quot;\r\n         If Not (.EOF And .BOF) Then\r\n             MsgText = Nz(!MsgText, vbNullString)\r\n         Else\r\n             MsgText = vbNullString\r\n         End If\r\n         End With\r\n     End If\r\nExitCode:\r\n     Exit Property\r\nErrorHandler:\r\n     MsgBox Err.Description, vbInformation, &quot;ConfigData:MsgText()&quot;\r\n     Resume ExitCode\r\nEnd Property<\/pre>\n<p>Damit die Eigenschaften der Klasse &ouml;ffentlich zug&auml;nglich sind, muss diese zun&auml;chst deklariert und instanziert werden, was die folgende, in einem Standardmodul gespeicherte Zeile erledigt:<\/p>\n<pre>Public cd As New ConfigData<\/pre>\n<p>Beim ersten Zugriff auf eine Eigenschaft oder Methode der Klasse wird dann die Ereignisprozedur <b>Class_Initialize <\/b>dieser Klasse ausgef&uuml;hrt. Diese instanziert die im Kopf der Klasse deklarierte und weiter oben beschriebene Klasse <b>Messages<\/b> und sorgt damit f&uuml;r die Ausf&uuml;hrung des <b>Class_Initialize<\/b>-Ereignisses der <b>Messages<\/b>-Klasse, was zum F&uuml;llen des <b>Disconnected Recordsets <\/b>f&uuml;hrt.<\/p>\n<p>Von diesem Moment an kann man mit dem folgenden Aufruf auf die Meldungstexte des <b>Disconnected Recordsets <\/b>zugreifen und erh&auml;lt die passende Ausgabe:<\/p>\n<pre>Debug.Print cd.MsgText(&quot;Autor&quot;)\r\nUwe Ricken<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Was geschieht<\/p>\n<p>Wenn Sie diesen Aufruf absetzen, l&ouml;st dies die <b>Property Get<\/b>-Routine <b>MsgText <\/b>der Klasse <b>ConfigData <\/b>aus. Diese greift dann auf die Eigenschaft Source des Objekts <b>m<\/b> zu, das ja eine Instanz der Klasse <b>Messages <\/b>ist und einen Verweis auf das <b>Disconnected Recordset <\/b>liefert.<\/p>\n<p>Dabei wird &#8211; sofern dies nicht in einem vorherigen Aufruf schon geschehen ist &#8211; in einer Art Kettenreaktion nun auch die Klasse <b>Messages <\/b>instanziert und das <b>Disconnected Recordset <\/b>mit den gew&uuml;nschten Daten gef&uuml;llt.<\/p>\n<p>Die Routine <b>MsgText <\/b>filtert dann das Recordset und gibt, sofern vorhanden, den zum &uuml;bergebenen <b>MsgFlag <\/b>passenden <b>MsgText <\/b>zur&uuml;ck. <\/p>\n<p>Sofern gew&uuml;nscht, kann man das Objekt mit folgender Anweisung aus dem Speicher entfernen:<\/p>\n<pre>Set cd = Nothing <\/pre>\n<p>Mit diesen beiden Klassen haben Sie bereits das Werkzeug f&uuml;r den komfortablen Zugriff auf die Daten von <b>Disconnected Recordsets <\/b>zur Hand.<\/p>\n<p><b>Beispielhaft<\/b><\/p>\n<p>Das Formular <b>Demonstration Disconnected Recordsets <\/b>aus der Beispieldatenbank zeigt drei verschiedene Zugriffsarten auf die Daten einer Konfigurationstabelle: per <b>DLookup<\/b>, per Recordset wie in Listing 3 beschrieben, und per Zugriff auf ein <b>Disconnected Recordset<\/b>.<\/p>\n<p>Um die bisherigen Ausf&uuml;hrungen besser zu verstehen, schauen Sie sich einfach einmal die enthaltenen Listings und ihren Ablauf an; am besten setzen Sie dazu einen Haltepunkt in die Prozedur <b>cboMsgFlag_AfterUpdate<\/b>, die beim Ausw&auml;hlen eines der Beispiele des Formulars ausgel&ouml;st wird.<\/p>\n<p>Damit Sie auch den kompletten Ablauf nachverfolgen k&ouml;nnen, sollten Sie die Datenbank zuvor einmal &ouml;ffnen und schlie&szlig;en, damit das <b>Disconnected Recordset <\/b>auf jeden Fall neu erzeugt wird.<\/p>\n<p><b>Ausbauf&auml;hig<\/b><\/p>\n<p>M&ouml;glicherweise greifen Sie im Laufe der Zeit auf mehr als eine Tabelle mit Konfigurationsdaten zu. In dem Fall k&ouml;nnen Sie die Klasse <b>ConfigData<\/b> leicht ausbauen, indem Sie weitere Tabellen mit Konfigurationsdaten anlegen, neue Klassen im Stile der Klasse <b>Messages <\/b>erstellen und passende Eintr&auml;ge an den entsprechenden Stellen der Klasse <b>ConfigData <\/b>hinzuf&uuml;gen.<\/p>\n<p>Das Erzeugen der Tabellen und Klassen erfolgt analog zur Tabelle <b>tbl_sys_Messages <\/b>und zur Klasse <b>Messages<\/b>. Wenn Sie etwa weitere Daten wie Fehlermeldungen oder SQL-Anweisungen in <b>Disconnected Recordsets <\/b>speichern und darauf zugreifen wollen, f&uuml;gen Sie zun&auml;chst eine passende Deklaration zur Klasse <b>ConfigData <\/b>hinzu. F&uuml;r Fehlermeldungen s&auml;he dies wie folgt aus: <\/p>\n<pre>Private e As ErrorMessages 'Fehlermeldungen<\/pre>\n<p>Das Erstellen der passenden Instanzen erfolgt wiederum in der Prozedur <b>Class_Initialize <\/b>der Klasse <b>ConfigData<\/b>. Zur bestehenden Instanzierung eines Objekts der Klasse <b>Messages <\/b>f&uuml;gen Sie eine weitere Instanzierung wie folgt hinzu:<\/p>\n<pre>Private Sub Class_Initialize()\r\n     Set e = New ErrorMessages\r\n     Set m = New Messages\r\nEnd Sub<\/pre>\n<p>Schlie&szlig;lich m&uuml;ssen Sie passende Routinen &aacute; la <b>MsgText <\/b>hinzuf&uuml;gen, die die in den von den Klassen bereitgestellten <b>Disconnected Recordsets <\/b>gespeicherten Daten abfragen. <\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Arbeit mit <b>Disconnected Recordsets <\/b>sollten Sie nicht nur den Webentwicklern &uuml;berlassen &#8211; auch in der allt&auml;glichen Entwicklung von Datenbanken gibt es vielf&auml;ltige M&ouml;glichkeiten zur Verwendung von <b>Disconnected Recordsets<\/b>.<\/p>\n<p>Mit <b>Disconnected Recordsets<\/b> lassen sich vielf&auml;ltige L&ouml;sungen realisieren. So ist es etwa m&ouml;glich, Kundendaten als Datei an die Au&szlig;endienstmitarbeiter zu schicken. Die wiederum bearbeiten die Daten des Recordsets in einer separaten Anwendung und schicken die &uuml;berarbeiteten Daten wieder an Sie zur&uuml;ck. Sie speichern dann die zugesendete Datei, vergleichen die Daten mit Ihren Stammdaten und f&uuml;hren gegebenenfalls Aktualisierungen durch.<\/p>\n<p>            <img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2007_01\/DisconnectedRecordsets-web-images\/pic003_opt.jpeg\" alt=\"pic003.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Formular mit Beispielen zu Disconnected Recordsets und den Alternativen<\/span><\/b><\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DisconnectedRecordSets.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F096249E-0DB6-4F19-8D1D-88D0FAD1B932\/aiu_437.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Konfigurationsdaten, Meldungen oder SQL-Befehle kann man in passenden Tabellen speichern und bei Bedarf per DLookup oder DAO auf diese zugreifen.  Da diese Daten sich in der Regel nur selten &auml;ndern, kann man sie getrost einmal zu Beginn der Session auslesen und dann auf die tempor&auml;r gespeicherten Daten zugreifen. Das spart Ressourcen und erh&ouml;ht die Zugriffsgeschwindigkeit &#8211; dank ADO und Disconnected Recordsets.<\/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":[66012007,662007,44000035,44000025],"tags":[],"class_list":["post-55000437","post","type-post","status-publish","format-standard","hentry","category-66012007","category-662007","category-Datenzugriff_programmieren","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Disconnected Recordsets - 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\/Disconnected_Recordsets\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Disconnected Recordsets\" \/>\n<meta property=\"og:description\" content=\"Konfigurationsdaten, Meldungen oder SQL-Befehle kann man in passenden Tabellen speichern und bei Bedarf per DLookup oder DAO auf diese zugreifen. Da diese Daten sich in der Regel nur selten &auml;ndern, kann man sie getrost einmal zu Beginn der Session auslesen und dann auf die tempor&auml;r gespeicherten Daten zugreifen. Das spart Ressourcen und erh&ouml;ht die Zugriffsgeschwindigkeit - dank ADO und Disconnected Recordsets.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-11T21:08:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250\" \/>\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=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Disconnected Recordsets\",\"datePublished\":\"2021-02-11T21:08:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/\"},\"wordCount\":2699,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/24a8a834baf947e9809d593c461b2250\",\"articleSection\":[\"1\\\/2007\",\"2007\",\"Datenzugriff programmieren\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/\",\"name\":\"Disconnected Recordsets - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/24a8a834baf947e9809d593c461b2250\",\"datePublished\":\"2021-02-11T21:08:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/24a8a834baf947e9809d593c461b2250\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/24a8a834baf947e9809d593c461b2250\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Disconnected_Recordsets\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Disconnected Recordsets\"}]},{\"@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":"Disconnected Recordsets - 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\/Disconnected_Recordsets\/","og_locale":"de_DE","og_type":"article","og_title":"Disconnected Recordsets","og_description":"Konfigurationsdaten, Meldungen oder SQL-Befehle kann man in passenden Tabellen speichern und bei Bedarf per DLookup oder DAO auf diese zugreifen. Da diese Daten sich in der Regel nur selten &auml;ndern, kann man sie getrost einmal zu Beginn der Session auslesen und dann auf die tempor&auml;r gespeicherten Daten zugreifen. Das spart Ressourcen und erh&ouml;ht die Zugriffsgeschwindigkeit - dank ADO und Disconnected Recordsets.","og_url":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-11T21:08:25+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Disconnected Recordsets","datePublished":"2021-02-11T21:08:25+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/"},"wordCount":2699,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250","articleSection":["1\/2007","2007","Datenzugriff programmieren","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/","url":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/","name":"Disconnected Recordsets - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250","datePublished":"2021-02-11T21:08:25+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/24a8a834baf947e9809d593c461b2250"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Disconnected_Recordsets\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Disconnected Recordsets"}]},{"@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\/55000437","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=55000437"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000437\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}