{"id":55000860,"date":"2012-12-01T00:00:00","date_gmt":"2020-05-22T21:49:16","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=860"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ACCDB_nach_Access_2003_migrieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/","title":{"rendered":"ACCDB nach Access 2003 migrieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Kennen Sie das auch Sie haben eine schicke Datenbank mit Access 2007 oder 2010 erstellt, diese mit einem Ribbon und Schaltfl&auml;chen mit Icons ausgestattet und nun kommt ein Kunde und m&ouml;chte diese Datenbank unter Access 2003 einsetzen. Da kommt schon ein wenig Aufwand auf Sie zu! Deshalb nehmen wir ein solches Downgrade im vorliegenden Beitrag einmal unter die Lupe.<\/b><\/p>\n<p>Ausgangspunkt ist die Datenbank <b>KVA.accdb <\/b>aus dem Beitrag <b>Kunden, Vertr&auml;ge und Anschreiben verwalten <\/b>(<b>www.access-im-unternehmen.de\/854<\/b>). Diese Anwendung wurde sogar unter Access 2010 erstellt und soll nun, soweit m&ouml;glich, unter Access 2003 lauff&auml;hig gemacht werden. Damit dies gelingt, muss die Anwendung zun&auml;chst einmal um solche Elemente erleichtert werden, die sogar ein Speichern im Format von Access 2002\/2003 unm&ouml;glich machen.<\/p>\n<p>Ob die Datenbank solche Elemente enth&auml;lt, finden Sie etwa unter Access 2010 heraus, indem Sie auf <b>Datei <\/b>klicken, dann im Backstage-Bereich auf <b>Speichern und Ver&ouml;ffentlichen <\/b>und schlie&szlig;lich auf <b>Access 2002-2003-Datenbank (*.mdb) <\/b>&#8211; s. Bild 1. Entweder f&uuml;hren Sie hier einen Doppelklick aus oder Sie bet&auml;tigen nach der Auswahl die Schaltfl&auml;che <b>Speichern unter<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Speichern einer Datenbank im Format von Access 2002\/2003<\/span><\/b><\/p>\n<p>Unter Access 2007 verwenden Sie dazu den Eintrag <b>Speichern unter|Access 2002 &#8211; 2003-Datenbank<\/b> des Office-Men&uuml;s (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Datenbank von Access 2007 aus in anderen Formaten speichern<\/span><\/b><\/p>\n<p>Tendenziell enth&auml;lt eine Datenbank unter Access 2007 oder 2010 Elemente, die unter Access 2002\/2003 noch nicht bekannt waren.<\/p>\n<p>Ist dies der Fall, meldet Access den Fehler aus Bild 3. Hier werden gleich einige potenzielle Probleme genannt &#8211; unter Access 2007 etwa Anlagefelder oder mehrwertige Felder; unter Access 2010 kommen noch Elemente wie Datenmakros, neue Verschl&uuml;sselungstypen oder Navigationssteuerelemente hinzu.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Fehlermeldung beim Versuch, eine Datenbank mit reinen Access 2007\/2010-Features in eine &auml;ltere Version umzuwandeln<\/span><\/b><\/p>\n<p>W&auml;hrend Sie relativ sicher sein k&ouml;nnen, dass wir in <b>Access im Unternehmen <\/b>keine mehrwertigen Felder einsetzen, so sieht dies bei Anlagefeldern anders aus: Wenn Sie mit Access 2010 arbeiten und etwa Bilder in Schaltfl&auml;chen darstellen m&ouml;chten, kommen Sie nicht um den Einsatz einer Systemtabelle namens <b>MSysResources<\/b> herum (die standardm&auml;&szlig;ig ausgeblendet ist &#8211; machen Sie diese unter Access 2010 durch die Aktivierung der Optionen <b>Ausgeblendete Objekte anzeigen <\/b>und <b>Systemobjekte anzeigen <\/b>sichtbar), die wiederum Bilder in einem Anlagefeld speichert.<\/p>\n<p>Diese Bilddateien k&ouml;nnen so bequem als Bilder f&uuml;r Bildsteuerelemente oder Schaltfl&auml;chen ausgew&auml;hlt werden.<\/p>\n<p>Sollte diese Meldung erscheinen, beginnt die Arbeit also gleich in der Access-Version, mit der Sie die Anwendung erstellt haben. Sie m&uuml;ssen hier die Tabellen ausfindig machen, die Felder vom Typ <b>Anlage<\/b> enthalten.<\/p>\n<p>Je nachdem, wie lange Sie die Anwendung bereits entwickeln und wie umfangreich diese geworden ist, haben Sie m&ouml;glicherweise keinen &Uuml;berblick mehr, wo sich die Felder mit dem betreffenden Datentyp befinden.<\/p>\n<p>Wollen Sie nun alle Tabellen manuell durchsuchen oder lieber einen kleinen Codeschnipsel programmieren, der alle Anlage-Felder (und gegebenenfalls auch die mehrwertigen Felder) ausgibt Wir entscheiden uns nat&uuml;rlich f&uuml;r letztere Variante, da diese auch zuverl&auml;ssiger arbeiten d&uuml;rfte.<\/p>\n<p>Wechseln Sie also zum VBA-Editor und legen Sie in einem geeigneten Modul, beispielsweise <b>mdlTools<\/b>, eine neue Prozedur namens <b>NeueDatentypenFinden <\/b>an. Grunds&auml;tzlich soll die Prozedur alle Tabellen und alle darin enthaltenen Felder durchlaufen und die Datentypen auf die neuen Typen pr&uuml;fen.<\/p>\n<p>Die <b>Type<\/b>-Eigenschaft eines <b>Field<\/b>-Elements eines <b>TableDef<\/b>-Elements liefert aber Zahlenwerte. Und wo erhalten wir Informationen &uuml;ber die Konstanten zu diesen Zahlenwerten Im Objektkatalog. Diesen &ouml;ffnen Sie mit der Taste <b>F2 <\/b>und suchen nach dem Begriff <b>Enum<\/b>.<\/p>\n<p>Darunter finden Sie dann alle m&ouml;glichen Enumerationen wie <b>DatabaseTypeEnum<\/b>, <b>FieldAttributeEnum <\/b>oder auch die gesuchte <b>DataTypeEnum<\/b>. Klicken Sie auf <b>DataTypeEnum<\/b>, zeigt der Objektkatalog wie in Bild 4 die verf&uuml;gbaren Datentypen samt Zahlenwert an.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Objektkatalog mit Felddatentypen<\/span><\/b><\/p>\n<p>Die neuen Datentypen sind mit Zahlenwerten gr&ouml;&szlig;er <b>100 <\/b>versehen &#8211; <b>dbAttachment <\/b>hat etwa den Wert <b>101<\/b>. Also soll die Prozedur einfach alle Feldnamen ausgeben, deren Felddatentyp einen Zahlenwert gr&ouml;&szlig;er als <b>100 <\/b>aufweist:<\/p>\n<pre>Public Sub NeueFelddatentypenFinden()\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Set db = CurrentDb\r\n    For Each tdf In db.TableDefs\r\n         For Each fld In tdf.Fields\r\n            If fld.Type &gt; 100 Then\r\n                Debug.Print tdf.Name, fld.Name, fld.Type\r\n            End If\r\n        Next fld\r\n    Next tdf\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Die Prozedur durchl&auml;uft nun alle Tabellen (also <b>TableDef<\/b>-Objekte) der <b>TableDefs<\/b>-Auflistung der Datenbank und f&uuml;r jede Tabelle alle Felder (also <b>Field<\/b>-Objekte) der <b>Fields<\/b>-Auflistung der aktuellen Tabelle. Weist die <b>Type<\/b>-Eigenschaft einen Wert gr&ouml;&szlig;er als <b>100 <\/b>auf, gibt die Prozedur Tabellenname, Feldname und Datentyp im Direktfenster aus.<\/p>\n<p>Bei der Beispieldatenbank kommen wir glimpflich davon: Das einzige Anlagefeld hei&szlig;t <b>Data <\/b>und stammt aus der bereits erw&auml;hnten Tabelle <b>MSysResources<\/b>:<\/p>\n<pre>MSysResources Data 101<\/pre>\n<p>Im Beispiel der Datenbank <b>KVA.accdb <\/b>ist allerdings m&ouml;glicherweise eine zus&auml;tzliche Untersuchung notwendig: Die Anwendung verwendet ja ein Backend, in dem sich auch noch Tabellen befinden.<\/p>\n<p>Auch diese m&uuml;ssen Sie selbstverst&auml;ndlich nach entsprechenden neuen Felddatentypen untersuchen. Diese Aufgabe nimmt uns die obige Prozedur jedoch bereits ab: Sie greift auch auf die per Verkn&uuml;pfung eingebundenen Tabellen zu und untersucht deren Felddatentypen.<\/p>\n<p><b>Behandlung von Anlage-Feldern<\/b><\/p>\n<p>Da wir in Access 2002\/2003 ohnehin nicht auf Daten in Anlagefeldern zugreifen k&ouml;nnen, w&auml;re es am einfachsten, diese Tabelle direkt zu l&ouml;schen. Allerdings kann es ja sein, dass wir die enthaltenen Bilder noch f&uuml;r Men&uuml;- und Symbolleisten oder f&uuml;r Kontextmen&uuml;s ben&ouml;tigen. Nun gibt es drei M&ouml;glichkeiten: <\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie verf&uuml;gen &uuml;ber eine Kopie der Bilddateien im Dateisystem und k&ouml;nnen diese sp&auml;ter wieder in die Access 2002\/2003-Version Ihrer Anwendung einbinden,<\/li>\n<li class=\"aufz-hlung\">Sie speichern alle Bilder dieser Tabelle in das Dateisystem, um diese sp&auml;ter wieder einzubinden, oder<\/li>\n<li class=\"aufz-hlung\">Sie &uuml;bertragen die Bilder gleich in eine &auml;hnliche aufgebaute Tabelle, welche die Bilder allerdings in einem OLE-Feld speichert.<\/li>\n<\/ul>\n<p>Die erste Variante erfordert keinen Aufwand. Die zweite k&ouml;nnen Sie je nach der Anzahl der Bilder manuell durchf&uuml;hren oder Sie verwenden auch hier eine Prozedur, um die Bilder auf die Festplatte zu bannen. Dazu vewenden Sie die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-58-anchor\">Listing 1<\/a><\/span>. Diese liest zun&auml;chst die drei Felder <b>Data.Filedata<\/b>, <b>Name <\/b>und <b>Extension <\/b>aus der Tabelle <b>MSysResources <\/b>ein.<\/p>\n<p class=\"listingueberschrift-start\">Listing 1: Dateien aus MSysResources speichern<\/p>\n<pre>Public Function DateienSpeichern()\r\n    Dim rst As DAO.Recordset2\r\n    Dim strFilename As String\r\n    On Error GoTo Fehler\r\n    Set rst = CurrentDb.OpenRecordset(&quot;SELECT Data.Filedata, Name, Extension FROM MSysResources&quot;, _\r\n        dbOpenSnapshot)\r\n    Do While Not rst.EOF\r\n        strFilename = CurrentProject.Path &amp; &quot;\\&quot; &amp; rst!Name &amp; &quot;.&quot; &amp; rst!Extension\r\n        If Dir(strFilename) &lt;&gt; &quot;&quot; Then\r\n            Kill strFilename\r\n            DoEvents\r\n        End If\r\n        On Error Resume Next\r\n        rst(&quot;Data.Filedata&quot;).SaveToFile strFilename\r\n        If Err.Number = (-2146697202) Then\r\n            rst!Data.SaveToFile strFilename &amp; &quot;.dat&quot;\r\n            DoEvents\r\n            Name strFilename &amp; &quot;.dat&quot; As strFilename\r\n        End If\r\n        rst.MoveNext\r\n    Loop\r\nEnde:\r\n    On Error Resume Next\r\n    Set rst = Nothing\r\n    Exit Function\r\nFehler:\r\n    MsgBox Err.Number &amp; &quot;\/&quot; &amp; Err.Description, vbCritical\r\n    Resume Ende\r\nEnd Function<\/pre>\n<p>Dabei bezieht sich <b>Data.Filedata <\/b>direkt auf das Feld <b>Filedata <\/b>der intern im Anlagefeld <b>Data <\/b>gespeicherten Untertabelle. Dies verdeutlicht eine Abfrage auf Basis der Tabelle <b>MSysResources <\/b>in der Entwurfsansicht (s. Bild 5).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Zugriff auf die Felder eines Attachment-Felds<\/span><\/b><\/p>\n<p>Wir gehen an dieser Stelle davon aus, dass jeder Datensatz der Tabelle <b>MSysResources <\/b>immer nur mit einer Datei bef&uuml;llt wurde. Dazu durchl&auml;uft die Prozedur alle Datens&auml;tze dieser Tabelle in einer <b>Do While<\/b>-Schleife. Innerhalb dieser Schleife ermittelt die Prozedur zun&auml;chst den Dateinamen aus den beiden Feldern <b>Name <\/b>und <b>Extension<\/b>.<\/p>\n<p>Die Dateien sollen im Verzeichnis der Datenbank gespeichert werden. Dabei pr&uuml;ft die Prozedur, ob eine Datei gleichen Namens bereits vorhanden ist, und l&ouml;scht diese gegebenenfalls zuvor.<\/p>\n<p>Dabei kommt die <b>Dir<\/b>-Funktion zum Einsatz, die eine leere Zeichenkette zur&uuml;ckliefert, wenn die als Parameter angegebene Datei nicht vorhanden ist.<\/p>\n<p>Dann versucht die Prozedur, die im Feld <b>Data.Filedata <\/b>enthaltene Datei mit der <b>SaveToFile<\/b>-Methode unter dem in <b>strFilename <\/b>enthaltenen Dateinamen zu speichern.<\/p>\n<p>Gelingt dies nicht, liegt dies in der Regel daran, dass Access Sicherheitsbedenken wegen des Dateityps hat.<\/p>\n<p>Dies erkennt Access allein an der Dateiendung, weshalb die Prozedur in diesem Fall einfach die erlaubte Dateiendung <b>.dat <\/b>anh&auml;ngt, die Datei speichert und dann die Dateiendung wieder entfernt.<\/p>\n<p>Dieser Vorgang wird f&uuml;r jeden Datensatz wiederholt, was eine mehr oder weniger gro&szlig;e Menge Dateien in das Verzeichnis der aktuellen Datenbank sp&uuml;lt.<\/p>\n<p>Wenn Sie die Dateien in einem anderen Verzeichnis speichern m&ouml;chten, &auml;ndern Sie einfach die Zeile<\/p>\n<pre>strFilename = CurrentProject.Path &amp; &quot;\\&quot; &amp; rst!Name &amp; &quot;.&quot; &amp; rst!Extension<\/pre>\n<p>ab, indem Sie hinter <b>&quot;\\&quot; <\/b>ein Unterverzeichnis anh&auml;ngen &#8211; zum Beispiel so:<\/p>\n<pre>strFilename = CurrentProject.Path &amp; &quot;\\pics\\&quot; &amp; rst!Name &amp; &quot;.&quot; &amp; rst!Extension<\/pre>\n<p>Auf diese Weise werden die Bilder in einem Unterverzeichnis namens <b>pics <\/b>gespeichert, welches zuvor noch erzeugt werden muss &#8211; beispielsweise so (gleich hinter der Zeile <b>Dim strFilename &#8230;<\/b>):<\/p>\n<pre>On Error Resume Next\r\nMkDir CurrentProject.Path &amp; &quot;\\pics\\&quot;<\/pre>\n<p>Mit <b>On Error Resume Next <\/b>verhindern Sie, dass ein eventuell vorhandenes Verzeichnis gleichen Namens einen Fehler ausl&ouml;st.<\/p>\n<p><b>Vom Anlage-Feld zum OLE-Feld<\/b><\/p>\n<p>Wenn Sie die im Anlagefeld gespeicherten Bilder und weitere Dateien anderweitig von der nach Access 2002\/2003 migrierten Anwendung aus nutzen m&ouml;chten und diese in einem Feld einer Tabelle speichern wollen, m&uuml;ssen Sie diese in einem OLE-Feld unterbringen.<\/p>\n<p>Da die Tabelle <b>MSysResources <\/b>bereits vorhanden ist, k&ouml;nnen Sie diese gleich weiterverwenden: Dazu m&uuml;ssen Sie der Tabelle lediglich ein neues OLE-Feld etwa namens <b>FileOLE <\/b>hinzuf&uuml;gen und die Daten f&uuml;r jeden Datensatz aus dem Anlagefeld <b>Data.Filedata<\/b> in das OLE-Feld &uuml;bertragen.<\/p>\n<p>Das ist manuell gar nicht zu erledigen, sodass wir hier auf jeden Fall eine entsprechende VBA-Routine ben&ouml;tigen. Diese sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-60-anchor\">Listing 2<\/a><\/span> aus.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Inhalt vom Anlagefeld in ein OLE-Feld &uuml;bertragen<\/p>\n<pre>Public Function Anlage2OLE()\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Dim fld As DAO.Field\r\n    Dim rst As DAO.Recordset\r\n    Dim bintmp() As Byte, bintmp2() As Byte\r\n    Dim lOffset As Long\r\n    Dim buffer() As Byte\r\n    Set db = CurrentDb\r\n    Set tdf = db.TableDefs(&quot;MSysResources&quot;)\r\n    On Error Resume Next\r\n    Set fld = tdf.Fields(&quot;FileOLE&quot;)\r\n    If fld Is Nothing Then\r\n        Set fld = tdf.CreateField(&quot;FileOLE&quot;, dbLongBinary)\r\n        tdf.Fields.Append fld\r\n    End If\r\n    On Error GoTo 0\r\n    Set rst = db.OpenRecordset(&quot;SELECT Data.Filedata, FileOle FROM MSysResources&quot;, dbOpenDynaset)\r\n    Do While Not rst.EOF\r\n        bintmp = rst(0).Value\r\n        lOffset = bintmp(0)\r\n        ReDim bintmp2(UBound(bintmp) - lOffset)\r\n        CopyMemory bintmp2(0), bintmp(lOffset), UBound(bintmp2)\r\n        buffer = bintmp2\r\n        rst.Edit\r\n        rst!FileOLE.AppendChunk buffer\r\n        rst.Update\r\n        rst.MoveNext\r\n    Loop\r\n    Erase bintmp\r\n    Erase bintmp2\r\n    Set tdf = Nothing\r\n    Set db = Nothing\r\nEnd Function<\/pre>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob die Tabelle bereits ein Feld namens <b>FileOLE<\/b> enth&auml;lt &#8211; gegebenenfalls f&uuml;hren Sie diese Prozedur ja mehrfach aus, was bei Vorhandensein dieses Feldes einen Fehler bei der Neuanlage ausl&ouml;sen w&uuml;rde. Die Prozedur versucht also, eine Referenz auf das Feld in der Variablen <b>fld <\/b>zu speichern.<\/p>\n<p>Da dies beim Fehlen des Feldes zu einem Fehler f&uuml;hrt, wird die Fehlerbehandlung zuvor mit <b>On Error Resume Next <\/b>ausgeschaltet. Befindet sich anschlie&szlig;end ein Objektverweis in der Variablen (<b>fld <\/b>ist nicht <b>Nothing<\/b>), erstellt die Prozedur mit der Methode <b>Add <\/b>der <b>Fields<\/b>-Auflistung des <b>TableDef<\/b>-Objekts zur Tabelle <b>MSysResources <\/b>dieses Feld mit dem Typ <b>dbLongBinary<\/b>, was dem Felddatentyp <b>OLE-Objekt <\/b>entspricht. Die Tabelle sieht anschlie&szlig;end wie in Bild 6 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: MSysResources mit neuem OLE-Feld<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Nun muss die Prozedur noch die Inhalte des Anlagefelds in das OLE-Feld &uuml;bertragen, und zwar f&uuml;r alle enthaltenen Datens&auml;tze. Dies erledigen die Befehle in der folgenden <b>Do While<\/b>-Schleife.<\/p>\n<p>Diese lesen, vereinfacht beschrieben, den relevanten Inhalt des Anlage-Feldes aus, speichern diesen in einem Byte-Array und f&uuml;gen dessen Inhalt mit der Methode <b>AppendChunk <\/b>in das OLE-Feld ein. Dass sich etwas getan hat, erkennen Sie in der Datenblattansicht der Tabelle, die f&uuml;r das Feld <b>FileOLE <\/b>nun jeweils den Text <b>Long binary-Daten <\/b>ausweist (siehe Bild 7). Wie aber pr&uuml;fen Sie nun, ob der Inhalt korrekt dort gelandet ist Dazu verwenden Sie die Prozedur <b>SaveOLEFieldToFile <\/b>im Modul <b>mdlOLE <\/b>der Beispieldatenbank, mit dem Sie etwa den Inhalt des OLE-Feldes <b>FileOLE <\/b>des Datensatzes mit dem Wert <b>2 <\/b>im Prim&auml;rschl&uuml;sselfeld <b>id <\/b>unter dem Namen <b>test.png <\/b>im Verzeichnis der aktuellen Datenbank speichern:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Die Daten aus dem Anlagefeld wurden in ein OLE-Feld &uuml;bertragen.<\/span><\/b><\/p>\n<pre>SaveOLEFieldToFile &quot;MSysResources&quot;, &quot;id&quot;, 2, &quot;FileOLE&quot;, CurrentProject.Path &amp; &quot;\\test.png&quot;<\/pre>\n<p>Wenn Sie sich von der ordnungsgem&auml;&szlig;en &Uuml;bertragung der Dateien &uuml;berzeugt haben, k&ouml;nnen Sie das Anlagefeld <b>Data <\/b>l&ouml;schen (nat&uuml;rlich nicht, ohne zuvor eine Sicherheitskopie der kompletten Datenbank zu erstellen). Die Beispieldatenbank ist somit Anlagefeld-frei und ein erneuter Versuch des Exports in das Format Access 2002\/2003 steht an.<\/p>\n<p>Achtung: Wenn Sie die Tabelle <b>MSysResources <\/b>in eine <b>.mdb<\/b>-Datenbank importieren, wird das Feld <b>Data <\/b>in ein Memofeld umgewandelt.<\/p>\n<p>Sie sollten dann die Prozedur <b>File2OLE <\/b>vor dem Import in der <b>.accdb<\/b>-Datei ausf&uuml;hren. Stellen Sie au&szlig;erdem sicher, dass die Tabelle <b>MSysResources<\/b> nicht in Verwendung ist &#8211; dies erreichen Sie am zuverl&auml;ssigsten, wenn Sie die Datenbank bei gedr&uuml;ckter Umschalttaste &ouml;ffnen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Wenn Sie weitere Anlagefelder verwenden<\/p>\n<p>Sollten Sie in einer eigenen Datenbank, die nach Access 2002\/2003 migriert werden soll, weitere Anlage-Felder nutzen, m&uuml;ssen Sie auch diese durch OLE-Felder ersetzen.<\/p>\n<p>Dazu k&ouml;nnen Sie die in den Prozeduren <b>DateienSpeichern <\/b>und <b>Anlage2OLE <\/b>verwendeten Tabellen- und Feldnamen anpassen und die betroffenen Tabellen damit behandeln.<\/p>\n<p><b>Neuer Export<\/b><\/p>\n<p>Bei den Experimenten zu diesem Beitrag reagierte Access 2010 nicht wie gewohnt auf den Doppelklick auf die Schaltfl&auml;che zum Exportieren der Datenbank im Format von Access 2002\/2003. Ein &Ouml;ffnen und Schlie&szlig;en und Komprimieren erm&ouml;glichte dies jedoch im Anschluss wieder. Der Export erfolgte nun ohne Probleme, die Datei konnte unter dem Namen <b>KVA.mdb <\/b>gespeichert werden (s. Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Speichern der Anwendung als .mdb-Datei<\/span><\/b><\/p>\n<p><b>Datenbank in Access 2003 &ouml;ffnen<\/b><\/p>\n<p>Alle weiteren Versuche, die Datenbank auf den Einsatz unter Access 2003 vorzubereiten, sollten direkt in der Zielversion der Access-Anwendung geschehen. Wechseln Sie also zu einem anderen Rechner oder auch zu einer virtuellen Maschine, kopieren Sie die Dateien <b>KVA.mdb <\/b>und die Backenddatei <b>KA_BE.mdb <\/b>(die Sie zwischenzeitlich auch umgewandelt haben) dorthin und &ouml;ffnen Sie die Anwendung.<\/p>\n<p>Dies f&uuml;hrt dazu, dass wie beim Original das in den Anwendungsoptionen festgelegte Formular <b>frmStart <\/b>ge&ouml;ffnet werden soll. Bevor dies geschieht, entdeckt VBA jedoch gleich einen Kompilierfehler: die Funktion <b>Left <\/b>k&ouml;nnte nicht gefunden werden (s. Bild 9). Kein Problem: Wer diesen Fehler, der auch mit weiteren VBA-Funktionen auftreten kann, einmal erlebt und behoben hat, wei&szlig;, wo der Hebel anzusetzen ist &#8211; und zwar in den Verweisen. Also klicken Sie auf <b>OK<\/b>, halten den Code mit dem Men&uuml;eintrag <b>Ausf&uuml;hren|Zur&uuml;cksetzen <\/b>an und &ouml;ffnen mit <b>Extras|Verweise <\/b>den <b>Verweise<\/b>-Dialog.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Fehler beim Kompilieren<\/span><\/b><\/p>\n<p>Dort findet sich auch gleich der &Uuml;belt&auml;ter: VBA kann den Verweis auf die Bibliothek <b>Microsoft Outlook 14.0 Object Library <\/b>nicht finden (s. Bild 10). Dies kann, sofern diese Verweise vorliegen, auch mit anderen Bibliotheken wie der von Excel oder Word geschehen &#8211; Access stuft die Bibliotheken nicht als abw&auml;rtskompatibel ein und ersetzt diese daher nicht durch die entsprechenden Bibliotheken der auf dem System vorhandenen Office-Version. Beim Verweis auf die <b>Microsoft Office x.0 Object Library <\/b>hat dies hingegen funktioniert &#8211; die Version <b>14 <\/b>wurde einfach durch einen Verweis auf die entsprechende Bibliothek von Office 2003 ersetzt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic010.png\" alt=\"pic010.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Ein nicht vorhandener Verweis<\/span><\/b><\/p>\n<p>Das Problem l&ouml;sen wir schnell, indem wir den nicht vorhandenen Verweis deaktivieren, den Dialog schlie&szlig;en und wieder &ouml;ffnen und den Verweis auf <b>Microsoft Outlook 11.0 Object Library <\/b>hinzuf&uuml;gen.<\/p>\n<p>Danach schlie&szlig;en Sie die Anwendung und &ouml;ffnen diese erneut. Immerhin funktioniert der erste Schritt: Die Anwendung findet das Backend nicht und fordert den Benutzer auf, dieses per <b>Datei &ouml;ffnen<\/b>-Dialog auszuw&auml;hlen.<\/p>\n<p>Danach funktioniert die Anwendung mit Einschr&auml;nkungen: So zeigen die Formulark&ouml;pfe und die Schaltfl&auml;chen nicht die unter Access 2010 sichtbaren Bilder an. Bei manchen Schaltfl&auml;chen ist das in Ordnung, da dort entsprechende Beschriftungen hinterlegt wurden, die Beschriftung anderer Schaltfl&auml;chen muss noch angepasst werden.<\/p>\n<p>Sie wollen die Schaltfl&auml;chen auch unter Office 2003 mit Bildern ausstatten Das ist ein relativ hoher Aufwand, da dies am besten mit der Schaltfl&auml;che der <b>MSForms<\/b>-Steuerelementsammlung funktioniert &#8211; und dazu m&uuml;ssten Sie alle Schaltfl&auml;chen ersetzen.<\/p>\n<p><b>VBA-Projekt kompilieren<\/b><\/p>\n<p>Eine Reihe Probleme finden Sie durch einfaches Kompilieren des VBA-Projekts heraus. Dazu wechseln Sie mit <b>Strg + G <\/b>zum VBA-Editor und bet&auml;tigen dort den Men&uuml;eintrag <b>Debuggen|Kompilieren von &lt;Projektname&gt;<\/b>.<\/p>\n<p>Daraufhin meckert der VBA-Compiler beispielsweise dar&uuml;ber, dass der Typ <b>IRibbonControl<\/b> nicht bekannt sei (s. Bild 11). Das ist auch logisch: Dieser Typ wird in Version 12 der Bibliothek <b>Microsoft Office x.0 Object Library <\/b>eingef&uuml;hrt und ist in der hier verwendeten Version 11 noch nicht verf&uuml;gbar. Generell handelt es sich hier um ein Objekt, das zur Steuerung des Ribbons ben&ouml;tigt wird. Die Funktion soll die Bezeichnung f&uuml;r ein <b>label<\/b>-Steuerelement einlesen, um die Version der aktuellen Datenbank anzuzeigen. Dies sollten wir nicht grunds&auml;tzlich unterbinden, sondern im Anschluss eine Funktion bereitstellen, welche die Versionsnummer etwa in der Men&uuml;- oder Symbolleiste bereitstellt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 11: Dieser Datentyp ist unbekannt.<\/span><\/b><\/p>\n<p>Vorerst kommentieren wir diese Funktion jedoch komplett aus und versuchen erneut, die Anwendung zu kompilieren. Wir landen wieder bei einer Funktion, die ein Objekt des Typs <b>IRibbonControl <\/b>erwartet &#8211; diesmal hei&szlig;t diese <b>onAction<\/b>. Hier werden die Aktionen ausgef&uuml;hrt, die beim Anklicken der verschiedenen Ribbon-Eintr&auml;ge aufgerufen werden sollen. Wir behalten auch diese f&uuml;r die sp&auml;tere Erstellung der Men&uuml;leiste im Kopf und kommentieren sie dann komplett aus.<\/p>\n<p>Ein weiterer Kompilierversuch landet bei der folgenden Zeile:<\/p>\n<pre>Dim rst As DAO.Recordset2<\/pre>\n<p>Das Objekt <b>Recordset2 <\/b>wurde mit Access 2007 eingef&uuml;hrt, kann aber problemlos durch <b>Recordset <\/b>ersetzt werden &#8211; auch unter Access-Anwendungen, welche die <b>Microsoft Office x.0 Access Database Engine Objects <\/b>verwenden.<\/p>\n<p>Danach stolpern wir beim Kompilieren &uuml;ber die folgende Zeile:<\/p>\n<pre>rst(&quot;Data.Filedata&quot;).SaveToFile strFilename<\/pre>\n<p>Sie befindet sich genau wie die vorherige in der Prozedur <b>DateienSpeichern<\/b>. Allerdings l&auml;sst sie sich nicht so einfach ersetzen, weil es sich dabei tats&auml;chlich um eine Methode handelt, die erst mit der oben genannten Bibliothek eingef&uuml;hrt wurde. Eine kurze Pr&uuml;fung ergibt jedoch, dass die gesamte Funktion offensichtlich nirgendwo in der Anwendung aufgerufen wird, weshalb wir einfach die komplette Funktion auskommentieren. Sollte diese doch &uuml;ber einen Kontextmen&uuml;-Eintrag et cetera ausgew&auml;hlt werden, k&ouml;nnen wir uns immer noch darum k&uuml;mmern. Vorerst reicht es, bei der Erstellung einer kompilierf&auml;higen Anwendung weiterzukommen.<\/p>\n<p>Als N&auml;chstes sto&szlig;en wir auf einige weitere Vorkommen des <b>Recordset2<\/b>-Objekts, das wir genau wie das <b>Field2<\/b>-Objekt einfach um die <b>2 <\/b>erleichtern. Danach taucht das Pendant zum bereits zuvor nicht kompilierbaren Befehl <b>SaveToFile <\/b>auf, n&auml;mlich <b>LoadFromFile<\/b>. Auch die Funktion <b>StoreBLOB0710<\/b>, in der sich dieser befindet, scheint nicht ben&ouml;tigt zu werden &#8211; also auskommentieren. Auch die Funktion <b>RestoreBLOB0710 <\/b>fliegt wegen der Methode <b>SaveToFile<\/b> raus.<\/p>\n<p>In der Klasse <b>clsMail <\/b>finden wir in der Prozedur, die wie folgt beginnt, das unter Outlook 2003 nicht verf&uuml;gbare <b>Folder<\/b>-Objekt:<\/p>\n<pre>Public Property Let Zielordner(strFolder As String)\r\n    Dim objOrdnerGesendet As Outlook.Folder\r\n    ...<\/pre>\n<p>Dieses k&ouml;nnen Sie einfach durch das <b>MAPIFolder<\/b>-Objekt ersetzen, das in diesem Fall den gleichen Dienst leistet.<\/p>\n<p>Die folgende Prozedur muss komplett entfallen, da es unter Outlook 2003 keine einfache M&ouml;glichkeit gibt, den Absender einer E-Mail einzustellen:<\/p>\n<pre>Public Property Let Von(strFrom As String)\r\n    Dim objAccount As Outlook.Account\r\n    ...<\/pre>\n<p>Fertig &#8211; nun l&auml;sst sich die komplette Anwendung kompilieren. Fehlt nur noch der Ersatz f&uuml;r einige Features, vor allem f&uuml;r das Ribbon. Dieses wollen wir durch eine entsprechende Men&uuml;leiste ersetzen, die dynamisch per VBA angelegt werden und die gleichen Befehle wie das entsprechende Ribbon enthalten soll.<\/p>\n<p><b>Men&uuml;leiste statt Ribbon<\/b><\/p>\n<p>Die Beispielanwendung macht es uns einfach &#8211; sie enth&auml;lt im Ribbon nur einfache Schaltfl&auml;chen (s. Bild 12). Wie aber setzen wir dies um Einfach nur die Befehle als oberste Eintr&auml;ge einer Men&uuml;leiste darzustellen, w&auml;re etwas zu einfach.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 12: Dieses Ribbon gilt es in eine Men&uuml;leiste umzuwandeln.<\/span><\/b><\/p>\n<p>Wie w&auml;re es also, f&uuml;r jede Gruppe einen Eintrag in der obersten Ebene anzulegen und die eigentlichen Schaltfl&auml;chen beim Anklicken des jeweiligen Hauptmen&uuml;punkts einzublenden<\/p>\n<p>Genau das machen wir &#8211; auf diese Weise k&ouml;nnen wir auch noch die Icons geb&uuml;hrend anzeigen. Den <b>Optionen<\/b>-Button und den <b>Beenden<\/b>-Button f&uuml;hren wir unter einem Men&uuml;punkt namens <b>Datei <\/b>zusammen, dann wird eine runde Sache daraus.<\/p>\n<p>Diese &auml;nderung k&ouml;nnten wir theoretisch mit einer Vollversion von Access 2003 durchf&uuml;hren &#8211; nur dort gibt es eine grafische Benutzeroberfl&auml;che zum Anpassen der Men&uuml;s -, aber wir erledigen dies per VBA, da so auch benutzerdefinierte Bilder f&uuml;r die Men&uuml;schaltfl&auml;chen angezeigt werden k&ouml;nnen. Das Ergebnis soll sp&auml;ter einmal wie in Bild 13 aussehen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic013.png\" alt=\"pic013.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 13: Die nachgebaute Men&uuml;leiste<\/span><\/b><\/p>\n<p>Die dazu verwendete Prozedur sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-67-anchor\">Listing 3<\/a><\/span> aus. Die Prozedur deklariert zun&auml;chst die notwendigen Variablen &#8211; eine f&uuml;r das Men&uuml; selbst (<b>cbr <\/b>f&uuml;r das <b>CommandBar<\/b>-Objekt) und eine f&uuml;r die Untermen&uuml;s (<b>cbp<\/b>\/<b>CommandBarPopup<\/b>). Danach l&ouml;scht sie zun&auml;chst ein eventuell vorhandenes Men&uuml; namens <b>cbrMain<\/b>. Damit dies keinen Fehler ausl&ouml;st, wenn das Men&uuml; nicht vorhanden ist, wird die Fehlerbehandlung rundherum deaktiviert.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Hauptprozedur zum Anlegen eines Men&uuml;s<\/p>\n<pre>Public Function MenueErstellen()\r\n    Dim cbr As Commandbar\r\n    Dim cbp As CommandBarPopup\r\n    On Error Resume Next\r\n    CommandBars(&quot;cbrMain&quot;).Delete\r\n    On Error GoTo 0\r\n    Set cbr = CommandBars.Add(&quot;cbrMain&quot;, , True, True)\r\n    Set cbp = cbr.Controls.Add(msoControlPopup)\r\n    cbp.Caption = &quot;&amp;Datei&quot;\r\n    AddCommandbarButton cbp, &quot;Optionen&quot;, &quot;toolbox_32&quot;, &quot;=onAction(&quot;&quot;btnOptionen&quot;&quot;)&quot;\r\n    AddCommandbarButton cbp, &quot;&amp;Beenden&quot;, &quot;exit_32&quot;, &quot;=onAction(&quot;&quot;btnBeenden&quot;&quot;)&quot;\r\n    Set cbp = cbr.Controls.Add(msoControlPopup)\r\n    cbp.Caption = &quot;&amp;Kunden&quot;\r\n    AddCommandbarButton cbp, &quot;&Uuml;bersicht&quot;, &quot;users_32&quot;, &quot;=onAction(&quot;&quot;btnKundenUebersicht&quot;&quot;)&quot;\r\n    AddCommandbarButton cbp, &quot;Neuer Kunde&quot;, &quot;user_add_32&quot;, &quot;=onAction(&quot;&quot;btnKundeNeu&quot;&quot;)&quot;\r\n    Set cbp = cbr.Controls.Add(msoControlPopup)\r\n    cbp.Caption = &quot;&amp;Kreditinstitute&quot;\r\n    AddCommandbarButton cbp, &quot;&Uuml;bersicht&quot;, &quot;bank_house2_32&quot;, &quot;=onAction(&quot;&quot;btnKreditinstituteUebersicht&quot;&quot;)&quot;\r\n    AddCommandbarButton cbp, &quot;Neues Kreditinstitut&quot;, &quot;bank_house2_32_add&quot;, &quot;=onAction(&quot;&quot;btnKreditinstitutNeu&quot;&quot;)&quot;\r\n    Set cbp = cbr.Controls.Add(msoControlPopup)\r\n    cbp.Caption = &quot;&amp;Gesellschaften&quot;\r\n    AddCommandbarButton cbp, &quot;&Uuml;bersicht&quot;, &quot;shield_32&quot;, &quot;=onAction(&quot;&quot;btnGesellschaftenUebersicht&quot;&quot;)&quot;\r\n    AddCommandbarButton cbp, &quot;Neue Gesellschaft&quot;, &quot;shield_add_32&quot;, &quot;=onAction(&quot;&quot;btnGesellschaftNeu&quot;&quot;)&quot;\r\n    Set cbp = cbr.Controls.Add(msoControlPopup)\r\n    cbp.Caption = &quot;&amp;Vertragsarten&quot;\r\n    AddCommandbarButton cbp, &quot;&Uuml;bersicht&quot;, &quot;contract_32&quot;, &quot;=onAction(&quot;&quot;btnVertragsartenUebersicht&quot;&quot;)&quot;\r\n    AddCommandbarButton cbp, &quot;Neue Vertragsart&quot;, &quot;contract_32_add&quot;, &quot;=onAction(&quot;&quot;btnVertragsartNeu&quot;&quot;)&quot;\r\n    Application.MenuBar = cbr.Name\r\n    DoCmd.ShowToolbar cbr.Name\r\nEnd Function<\/pre>\n<p>Dieses Men&uuml; wird schlie&szlig;lich mit der <b>Add<\/b>-Methode der <b>CommandBars<\/b>-Auflistung neu erstellt. Dabei wird der Name <b>cbrMain<\/b> vergeben und das Men&uuml; au&szlig;erdem mit den Parametern <b>Menubar <\/b>und <b>Temporary <\/b>als tempor&auml;re Men&uuml;leiste definiert. Tempor&auml;r deshalb, damit es nach dem Schlie&szlig;en der Anwendung nicht bestehen bleibt und beim &Ouml;ffnen einer anderen Anwendung angezeigt wird.<\/p>\n<p>Schlie&szlig;lich erstellt die Prozedur mit der <b>Add<\/b>-Methode der <b>Controls<\/b>-Auflistung des <b>CommandBar<\/b>-Objekts das erste Untermen&uuml; mit der Beschriftung <b>Datei <\/b>(das f&uuml;hrende Kaufmanns-Und im Code kennzeichnet den Buchstaben f&uuml;r den Zugriff &uuml;ber die Tastatur &#8211; der Buchstabe hinter dem Kaufmanns-Und wird dann unterstrichen angezeigt).<\/p>\n<p>Danach f&uuml;gt die Prozedur die eigentlichen Men&uuml;schaltfl&auml;chen an. Den Hauptteil dieser Arbeit erledigt eine kleine Hilfsfunktion namens <b>AddCommandbarButton<\/b>. Diese erwartet vier Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\">einen Verweis auf das Untermen&uuml;, in dem die Schaltfl&auml;che landen soll,<\/li>\n<li class=\"aufz-hlung\">die Beschriftung der Schaltfl&auml;che,<\/li>\n<li class=\"aufz-hlung\">den Namen des Bildes aus der Tabelle <b>MSysResources <\/b>und<\/li>\n<li class=\"aufz-hlung\">den Namen der Funktion, die beim Anklicken der Men&uuml;schaltfl&auml;che ausgel&ouml;st werden soll.<\/li>\n<\/ul>\n<p>Bevor wir uns dieser Funktion zuwenden, schauen wir uns noch den Rest der Prozedur <b>MenueErstellen <\/b>an.<\/p>\n<p>Nach dem Anlegen aller Elemente brauchen Sie n&auml;mlich nur noch die Eigenschaft <b>MenuBar <\/b>des <b>Application<\/b>-Objekts auf den Namen des frisch erstellten <b>Commandbar<\/b>-Objekts einzustellen und diesen mit der Methode <b>ShowToolbar <\/b>des <b>DoCmd<\/b>-Objekts aufzurufen &#8211; schon erscheint das Men&uuml; oben im Anwendungsfenster.<\/p>\n<p>Fehlt nur noch eine M&ouml;glichkeit, diese Funktion gleich beim Start der Anwendung auszuf&uuml;hren. Dazu legen Sie ein <b>AutoExec<\/b>-Makro wie in Bild 14 an, dessen einzige Aktion <b>Ausf&uuml;hrenCode <\/b>hei&szlig;t und die Funktion <b>MenueErstellen <\/b>aufruft.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_06\/ACCDBAbwaertskompatibelMachen-web-images\/pic014.png\" alt=\"pic014.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 14: AutoExec-Makro zum Einblenden der Men&uuml;leiste<\/span><\/b><\/p>\n<p>Nun widmen wir uns der Funktion <b>AddCommandbarButton <\/b>und ihren Aufrufen. Bevor wir uns den Quellcode ansehen, m&uuml;ssen wir ermitteln, woher wir die passenden Informationen erhalten  &#8211; immerhin sollen die gleichen Beschriftungen und Bilder wie im Ribbon der 2007\/2010er-Version angezeigt und die gleichen Befehle aufgerufen werden. Alles N&ouml;tige finden wir in der Ribbon-XML-Definition, die sich in der Tabelle <b>USysRibbons <\/b>befindet. Ein Ausschnitt daraus sieht etwa wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-70-anchor\">Listing 4<\/a><\/span> aus. Uns interessieren vor allem die <b>group<\/b>&#8211; und <b>button<\/b>-Elemente. Die <b>group<\/b>-Elemente liefern die &Uuml;berschriften f&uuml;r die Untermen&uuml;s, also <b>Datei<\/b>, <b>Kunden<\/b>, <b>Vertr&auml;ge <\/b>et cetera.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Ribbon-Code als Quelle f&uuml;r die Informationen zur Men&uuml;-Erstellung<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;customUI xmlns=&quot;http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui&quot; loadImage=&quot;loadImage&quot;&gt;\r\n&lt;ribbon startFromScratch=&quot;true&quot;&gt;\r\n&lt;tabs&gt;\r\n&lt;tab id=&quot;tabKundenVertraegeAnschreiben&quot; label=&quot;Kunden, Vertr&auml;ge und Anschreiben&quot;&gt;\r\n&lt;group id=&quot;grpKunden&quot; label=&quot;Kunden&quot;&gt;\r\n&lt;button id=&quot;btnKundenUebersicht&quot; image=&quot;users_32&quot; label=&quot;&Uuml;bersicht&quot; onAction=&quot;onAction&quot;\r\nsize=&quot;large&quot;\/&gt;\r\n&lt;button id=&quot;btnKundeNeu&quot; image=&quot;user_add_32&quot; label=&quot;Neuer Kunde&quot; onAction=&quot;onAction&quot;\r\nsize=&quot;large&quot;\/&gt;\r\n...<\/pre>\n<p>Die <b>button<\/b>-Elemente hingegen enthalten gleich drei Informationen, von denen zwei offensichtlich sind: Das Attribut <b>image <\/b>liefert jeweils den Namen der Bilddatei aus der Tabelle <b>MSysResources <\/b>und das Attribut <b>label <\/b>die Beschriftung.<\/p>\n<p>Schlie&szlig;lich ben&ouml;tigen wir aber noch eine Funktion, die beim Anklicken der Schaltfl&auml;che ausgel&ouml;st werden soll, und m&uuml;ssen diese der Eigenschaft <b>OnAction <\/b>der Men&uuml;schaltfl&auml;che mitteilen. Und hier greifen wir die Callback-Funktion <b>OnAction <\/b>wieder auf, die eigentlich durch das Bet&auml;tigen der Ribbon-Befehle in der 2007\/2010er-Version ausgel&ouml;st wird. Wir m&uuml;ssen dort nur den Datentyp des einzigen Parameters in <b>String <\/b>&auml;ndern sowie in den einzelnen Zweigen des <b>Select Case<\/b>-Zweiges den Wert des Parameters <b>control <\/b>statt <b>control.id <\/b>pr&uuml;fen (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-71-anchor\">Listing 5<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 5: Diese Funktion wird f&uuml;r alle Men&uuml;eintr&auml;ge aufgerufen.<\/p>\n<pre>Public Function onAction(control As String)\r\n    Select Case control\r\n        Case &quot;btnKundenUebersicht&quot;\r\n            DoCmd.OpenForm &quot;frmKundenuebersicht&quot;\r\n            ...\r\n        Case Else\r\n            MsgBox &quot;Klick auf Ribbon-Eintrag ''&quot; &amp; control &amp; &quot;''&quot;\r\n    End Select\r\nEnd Function<\/pre>\n<p>Fehlt also nur noch der passende Wert f&uuml;r die Eigenschaft <b>OnAction <\/b>der <b>CommandbarButton<\/b>-Elemente. Dieser erh&auml;lt schlie&szlig;lich einen Ausdruck wie <b>&quot;=onAction(&quot;&quot;btnKundenUebersicht&quot;&quot;)&quot;<\/b>, wobei <b>btnKundenUebersicht <\/b>der urspr&uuml;ngliche Name der Ribbon-Schaltfl&auml;che ist.<\/p>\n<p>Die Funktion <b>AddCommandbarButton <\/b>nimmt all diese Parameter entgegen, h&auml;ngt ein neues <b>CommandbarButton<\/b>-Element an die <b>Controls<\/b>-Auflistung des <b>CommandbarPopup<\/b>-Elements an, weist die Bezeichnung der Eigenschaft <b>Caption <\/b>zu und stellt die <b>onAction<\/b>-Eigenschaft entsprechend ein (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-72-anchor\">Listing 6<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 6: Funktion zum Hinzuf&uuml;gen einer Men&uuml;schaltfl&auml;che<\/p>\n<pre>Public Function AddCommandbarButton(cbp As CommandBarPopup, strCaption As String, _\r\n    strPicture As String, strOnAction As String)\r\n    Dim cbb As CommandBarButton\r\n    Set cbb = cbp.Controls.Add(msoControlButton)\r\n    cbb.Caption = strCaption\r\n    SetPicture cbb, strPicture\r\n    cbb.onAction = &quot;=onAction(&quot;&quot;&quot; &amp; strOnAction &amp; &quot;&quot;&quot;)&quot;\r\nEnd Function<\/pre>\n<p>Nur mit den Bildern wird es etwas aufwendiger: Dort muss eine weitere Funktion namens <b>SetPicture <\/b>aushelfen. Diese erwartet einen Verweis auf das zu best&uuml;ckende <b>CommandbarButton<\/b>-Element und den Namen des entsprechenden Eintrags f&uuml;r das Bild in der Tabelle <b>MSysResources<\/b> als Parameter (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-73-anchor\">Listing 7<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 7: Einstellen des Icons eines Men&uuml;eintrags<\/p>\n<pre>Public Function SetPicture(cbb As CommandBarButton, strName As String)\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim fld As DAO.Field\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;SELECT FileOLE FROM MSysResources WHERE Name = ''&quot; &amp; strName &amp; &quot;''&quot;, _\r\n        dbOpenDynaset)\r\n    Set fld = rst.Fields(0)\r\n    cbb.Picture = PicFromField(fld)\r\n    cbb.Mask = MaskFromPicture(cbb.Picture)\r\nEnd Function<\/pre>\n<p>Die Funktion erstellt zun&auml;chst ein Recordset auf Basis der Tabelle <b>MSysResources<\/b>, wobei lediglich das Feld <b>FileOLE <\/b>mit der bin&auml;r gespeicherten Bilddatei (zuvor im Anlagefeld <b>Data <\/b>enthalten) zur&uuml;ckgeliefert wird. Als Kriterium f&uuml;r die Auswahl des richtigen Datensatzes dient das Feld <b>Name<\/b>, das mit dem im zweiten Parameter &uuml;bergebenen Namen des Bildes abgeglichen wird.<\/p>\n<p>Aus diesem Recordset bezieht die Funktion ein einziges Feld, das mit der Variablen <b>fld <\/b>des Typs <b>Field <\/b>referenziert wird. Diese wiederum wird an die Funktion <b>PicFromField <\/b>&uuml;bergeben, die sich im Modul <b>mdlOGL0710 <\/b>befindet und bereits in der 2007\/2010er-Version enthalten war.<\/p>\n<p>Diese Funktion wandelt eine in einem Tabellenfeld gespeicherte Bilddatei in ein Objekt des Typs <b>StdPicture <\/b>um. Dieses wiederum ist genau das, was die Eigenschaft <b>Picture <\/b>einer Men&uuml;schaltfl&auml;che erwartet. Damit sind wir allerdings noch nicht ganz fertig, denn dies liefert nur ein Bild ohne transparente Bereiche.<\/p>\n<p>Dies sieht im Men&uuml; nicht so gut aus, also f&uuml;gen Sie der speziell daf&uuml;r vorgesehenen Eigenschaft <b>Mask <\/b>noch ein weites <b>Picture<\/b>-Objekt hinzu, welches Informationen dar&uuml;ber enth&auml;lt, welche Bereiche des ersten <b>Picture<\/b>-Elements transparent dargestellt werden sollen.<\/p>\n<p>M&uuml;ssen Sie nun f&uuml;r alle Bilder ein solches Bild mit Transparent-Angaben erstellen Nein, das erledigt die Funktion <b>MaskFromPicture <\/b>zur Laufzeit auf Basis des f&uuml;r <b>Picture <\/b>festgelegten Bild-Objekts.<\/p>\n<p>Damit ist die Men&uuml;leiste erstellt. Gegebenenfalls lie&szlig;e sich dies f&uuml;r Ribbon-Definitionen, die ausschlie&szlig;lich oder zumindeste weitgehend einfache <b>button<\/b>-Elemente enthalten, komplett automatisieren &#8211; dies w&uuml;rde jedoch an dieser Stelle den Rahmen sprengen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Bilder f&uuml;r Formulare und Schaltfl&auml;chen<\/p>\n<p>An dieser Stelle haben wir es uns leicht gemacht: Die Bilder im Kopfbereich der Formulare haben wir einfach entfernt, genauso wie die auf den Schaltfl&auml;chen. Access vor der Version 2007 ist einfach nicht optimal mit Bildern auszustatten, daher wollten wir keinen gr&ouml;&szlig;eren Aufwand betreiben. Au&szlig;erdem sollen die Benutzer ja auch noch einen Anreiz haben, einmal zu einer aktuelleren Version von Access zu wechseln (immerhin erscheint nun bereits bald Access 2013).<\/p>\n<p><b>Weitere &auml;nderungen<\/b><\/p>\n<p>Unter Access 2003 wird das Eigenschaftsfenster f&uuml;r ein Formular angezeigt, wenn Sie nicht die Eigenschaft <b>Entwurfs&auml;nderungen zulassen <\/b>auf <b>Nur Entwurfsansicht <\/b>einstellen. Diese &auml;nderung sollten Sie f&uuml;r alle Formulare durchf&uuml;hren.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>In diesem Beitrag haben Sie erfahren, wie Sie eine <b>.accdb<\/b>-Datenbank auf Basis von Access 2007 und j&uuml;nger zumindest weitgehend f&uuml;r den Einsatz unter Access 2003 anpassen.<\/p>\n<p>Es gibt noch einige Features, f&uuml;r die es bereits vorher Workarounds gab &#8211; zum Beispiel f&uuml;r die automatische Anpassung von Steuerelementen an die Formulargr&ouml;&szlig;e. Dies l&auml;sst sich unter Access 2007 und j&uuml;nger ganz einfach mit wenigen Eigenschaftseinstellungen erreichen, unter &auml;lteren Access-Versionen m&uuml;ssen Sie dazu eigene Ereignisprozeduren anlegen &#8211; dazu gibt es einige L&ouml;sungen im Internet.<\/p>\n<p>Sollte sich also einmal ein Interessent f&uuml;r eine Ihrer mit einer aktuellen Version von Access erstellten Anwendungen begeistern, selbst aber nur Access 2003 zur Verf&uuml;gung haben, k&ouml;nnen Sie ihm zumindest eine weitgehend kompatible Anwendung zaubern.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KA_BE.mdb<\/p>\n<p>KVA.accdb<\/p>\n<p>KVA_2003.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{F03620A5-40EF-424A-BC7D-030AF9E8DD5E}\/aiu_860.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kennen Sie das auch Sie haben eine schicke Datenbank mit Access 2007 oder 2010 erstellt, diese mit einem Ribbon und Schaltfl&auml;chen mit Icons ausgestattet und nun kommt ein Kunde und m&ouml;chte diese Datenbank unter Access 2003 einsetzen. Da kommt schon ein wenig Aufwand auf Sie zu! Deshalb nehmen wir ein solches Downgrade im vorliegenden Beitrag einmal unter die Lupe.<\/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":[662012,66062012,44000027],"tags":[],"class_list":["post-55000860","post","type-post","status-publish","format-standard","hentry","category-662012","category-66062012","category-Loesungen"],"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>ACCDB nach Access 2003 migrieren - 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\/ACCDB_nach_Access_2003_migrieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ACCDB nach Access 2003 migrieren\" \/>\n<meta property=\"og:description\" content=\"Kennen Sie das auch Sie haben eine schicke Datenbank mit Access 2007 oder 2010 erstellt, diese mit einem Ribbon und Schaltfl&auml;chen mit Icons ausgestattet und nun kommt ein Kunde und m&ouml;chte diese Datenbank unter Access 2003 einsetzen. Da kommt schon ein wenig Aufwand auf Sie zu! Deshalb nehmen wir ein solches Downgrade im vorliegenden Beitrag einmal unter die Lupe.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:49:16+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c\" \/>\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=\"27\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"ACCDB nach Access 2003 migrieren\",\"datePublished\":\"2020-05-22T21:49:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/\"},\"wordCount\":4549,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56cb5be5cc1e420192305147c34fdf4c\",\"articleSection\":[\"2012\",\"6\\\/2012\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/\",\"name\":\"ACCDB nach Access 2003 migrieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56cb5be5cc1e420192305147c34fdf4c\",\"datePublished\":\"2020-05-22T21:49:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56cb5be5cc1e420192305147c34fdf4c\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/56cb5be5cc1e420192305147c34fdf4c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ACCDB_nach_Access_2003_migrieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ACCDB nach Access 2003 migrieren\"}]},{\"@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":"ACCDB nach Access 2003 migrieren - 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\/ACCDB_nach_Access_2003_migrieren\/","og_locale":"de_DE","og_type":"article","og_title":"ACCDB nach Access 2003 migrieren","og_description":"Kennen Sie das auch Sie haben eine schicke Datenbank mit Access 2007 oder 2010 erstellt, diese mit einem Ribbon und Schaltfl&auml;chen mit Icons ausgestattet und nun kommt ein Kunde und m&ouml;chte diese Datenbank unter Access 2003 einsetzen. Da kommt schon ein wenig Aufwand auf Sie zu! Deshalb nehmen wir ein solches Downgrade im vorliegenden Beitrag einmal unter die Lupe.","og_url":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:49:16+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"27\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"ACCDB nach Access 2003 migrieren","datePublished":"2020-05-22T21:49:16+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/"},"wordCount":4549,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c","articleSection":["2012","6\/2012","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/","url":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/","name":"ACCDB nach Access 2003 migrieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c","datePublished":"2020-05-22T21:49:16+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/56cb5be5cc1e420192305147c34fdf4c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/ACCDB_nach_Access_2003_migrieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"ACCDB nach Access 2003 migrieren"}]},{"@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\/55000860","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=55000860"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000860\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000860"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000860"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000860"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}