{"id":55001164,"date":"2018-12-01T00:00:00","date_gmt":"2020-05-13T21:13:13","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1164"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ODBCVerknuepfungen_in_Formularen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/","title":{"rendered":"ODBC-Verkn&uuml;pfungen in Formularen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt verschiedene M&ouml;glichkeiten, auf die Daten einer SQL Server-Datenbank zuzugreifen. Die einfachste Variante, wenn es um die Migration einer reinen Access-Datenbank in eine Kombination aus Access-Frontend und SQL Server-Backend geht, ist der Einsatz ODBC-verkn&uuml;pfter Tabellen. Dabei werden die Tabellen einfach nur zum SQL Server migriert und man greift dann &uuml;ber ODBC-Verkn&uuml;pfungen auf die Tabellen zu. F&uuml;r den Zugriff auf diese Daten von Formularen aus ergeben sich so gut wie keine &auml;nderungen &#8211; und was sich doch &auml;ndern kann, erfahren Sie in diesem Beitrag.<\/b><\/p>\n<p>Wenn Sie eine Datenbank von Access zum SQL Server migrieren, &uuml;bertragen Sie die Tabellen im Optimalfall 1:1 auf die SQL Server-Datenbank. Ist das der Fall, haben Sie recht gute Karten, dass Sie Ihre Anwendung recht schnell auch mit der neuen Datenherkunft l&auml;uft.<\/p>\n<p>Wie das geht Indem Sie einfach die Tabellen der SQL Server-Datenbank per ODBC mit der Access-Anwendung verkn&uuml;pfen. Wenn Sie dabei darauf achten, dass die Verkn&uuml;pfungen anschlie&szlig;end die gleichen Namen wie die zuvor verwendeten Tabellen haben, sollten die Abfragen, Formulare, Berichte und auch der VBA-Code, der auf die Daten zugreift, anstandslos funktionieren.<\/p>\n<p>Wir schauen uns das einmal an. In unserer Beispieldatenbank finden Sie zwei Formulare, die Ihnen bei der Verkn&uuml;pfung der Tabellen behilflich sind und Ihnen viel Zeit sparen k&ouml;nnen. Das erste Formular hei&szlig;t <b>frmVerbindungszeichenfolgen<\/b>. Hier legen Sie mit der Schaltfl&auml;che <b>Neu<\/b> eine neue Verbindungszeichenfolge an und geben dann ihre Eigenschaften ein. Ein Beispiel finden Sie in Bild 1 &#8211; hier testen wir auch gleich noch die Funktionalit&auml;t der Verbindungszeichenfolge.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_001.png\" alt=\"Verbindungszeichenfolge definieren und testen\" width=\"424,7115\" height=\"305,2848\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verbindungszeichenfolge definieren und testen<\/span><\/b><\/p>\n<p>Das zweite hilfreiche Formular hei&szlig;t <b>frmTabellenVerknuepfen<\/b>. Mit diesem w&auml;hlen Sie als Erstes die soeben definierte Verbindungszeichenfolge aus und selektieren dann bei gedr&uuml;ckter <b>Strg<\/b>-Taste die zu verkn&uuml;pfenden Tabellen &#8211; in diesem Fall <b>tblArtikel<\/b>, <b>tblBestelldetails<\/b>, <b>tblBestellungen<\/b>, <b>tblKategorien<\/b>, <b>tblKunden<\/b>, <b>tblLieferanten<\/b>, <b>tblPersonal <\/b>und <b>tblVersandfirmen <\/b>(siehe -Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_002.png\" alt=\"Hinzuf&uuml;gen der zu verkn&uuml;pfenden Tabellen\" width=\"424,7115\" height=\"319,7828\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Hinzuf&uuml;gen der zu verkn&uuml;pfenden Tabellen<\/span><\/b><\/p>\n<p>Nach einem Klick auf die Schaltfl&auml;che <b>Tabellen verkn&uuml;pfen <\/b>landen die Verkn&uuml;pfungen dann im Navigationsbereich, wo sie mit dem entsprechenden Symbol angezeigt werden (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_003.png\" alt=\"Die per ODBC verkn&uuml;pften Tabellen\" width=\"424,7115\" height=\"295,8891\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Die per ODBC verkn&uuml;pften Tabellen<\/span><\/b><\/p>\n<h2>Zeitstempel<\/h2>\n<p>Die Tabellen wurden mit dem SQL Server Migrations-Assistenten f&uuml;r Access in eine SQL Server-Datenbank migriert. Dabei stellt dieser sicher, dass jede Tabelle ein Timestamp-Feld erh&auml;lt. Dieses sieht in einer frisch migrierten Datenbank erst einmal wie in Bild 4 aus &#8211; das Feld ist zun&auml;chst scheinbar leer.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_004.png\" alt=\"Tabelle mit Timestamp-Feld\" width=\"599,593\" height=\"227,0458\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tabelle mit Timestamp-Feld<\/span><\/b><\/p>\n<p>Wenn Sie sich dieses Feld jedoch im SQL Server Management Studio ansehen, sind die Werte dieses Feldes mit Daten des Typs <b><Bin&auml;rdaten> <\/b>gef&uuml;llt (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_005.png\" alt=\"Tabelle mit Timestamp-Feld im SQL Server Management Studio\" width=\"549,6265\" height=\"262,2339\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Tabelle mit Timestamp-Feld im SQL Server Management Studio<\/span><\/b><\/p>\n<p>Warum aber wollen wir unsere SQL Server-Tabellen mit einem Zeitstempel versehen &#8211; und was ist der Zeitstempel, unter SQL Timestamp, &uuml;berhaupt Zun&auml;chst einmal: Das Timestamp-Feld ist nicht etwa ein Feld, welches die aktuelle Systemzeit etwa beim &auml;ndern oder Anlegen eines Datensatzes speichert.<\/p>\n<p>Es hat auch nicht das Format eines Datumsfeldes. Es ist vielmehr ein Feld, das einen bin&auml;ren Wert speichert, der beim Anlegen oder &auml;ndern eines Datensatzes eingetragen wird und der einzigartig ist.<\/p>\n<p>Damit sorgen Sie f&uuml;r verschiedene Effekte:<\/p>\n<ul>\n<li>Sie vereinfachen die Untersuchung, ob ein Datensatz seit dem Beginn der Bearbeitung durch einen anderen Benutzer ge&auml;ndert wurde und ob eine entsprechende Meldung angezeigt werden muss.<\/li>\n<li>Sie verhindern Fehler, die durch unterschiedliche Flie&szlig;komma-Datentypen auftreten k&ouml;nnen.<\/li>\n<\/ul>\n<h2>Datensatz&auml;nderungen pr&uuml;fen<\/h2>\n<p>Bevor Sie einen Datensatz im SQL Server nach der Bearbeitung etwa in einem Formular speichern k&ouml;nnen, muss der SQL Server pr&uuml;fen, ob eventuell ein anderer Benutzer in der Zwischenzeit ebenfalls &auml;nderungen an diesem Datensatz durchgef&uuml;hrt hat. Ist das der Fall, erhalten Sie eine Meldung wie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_006.png\" alt=\"Fehlermeldung bei Schreibkonflikt\" width=\"499,6607\" height=\"171,6314\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Fehlermeldung bei Schreibkonflikt<\/span><\/b><\/p>\n<p>Wie l&ouml;sen Sie diesen Fehler aus Dazu haben wir die Tabelle <b>tblKategorien<\/b>, die in der Beispieldatenbank bereits ein Timestamp-Feld enth&auml;lt, nochmals in eine neue Tabelle namens <b>tblKategorien1 <\/b>kopiert, die kein Timestamp-Feld enth&auml;lt. Au&szlig;erdem haben wir f&uuml;r diese Tabelle eine ODBC-Verkn&uuml;pfung namens <b>tblKategorien1 <\/b>in der Access-Datenbank erstellt. Dann haben wir zwei Formulare namens <b>frmKategorien1 <\/b>und <b>frmKategorien2 <\/b>erstellt, die beide die ODBC-Verkn&uuml;pfung <b>tblKategorien1 <\/b>referenzieren.<\/p>\n<p>Beide Formulare &ouml;ffnen Sie und platzieren diese so, dass beide Formulare sichtbar sind. Dann &auml;ndern Sie den Datensatz im ersten Formular, speichern die &auml;nderung aber noch nicht. Hier setzen wir den Wert des Feldes <b>Kategoriename <\/b>auf <b>Kategorie 2<\/b>. Achten Sie darauf, dass der Datensatzmarkierer das Bearbeiten-Symbol anzeigt (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_007.png\" alt=\"&auml;ndern des Datensatzes im ersten Formular\" width=\"424,7115\" height=\"174,2406\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: &auml;ndern des Datensatzes im ersten Formular<\/span><\/b><\/p>\n<p>Nun &auml;ndern Sie den Wert des gleichen Feldes im zweiten Formular auf <b>Kategorie 3 <\/b>und speichern die &auml;nderung dort durch einen Klick auf den Datensatzmarkierer (siehe Bild 8). Schlie&szlig;lich versuchen Sie im Anschluss, auch die &auml;nderungen im ersten Formular per Klick auf den Datensatzmarkierer zu speichern. In diesem Moment erscheint die oben vorgestellte Meldung.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_008.png\" alt=\"&auml;ndern und Speichern des Datensatzes im zweiten Formular\" width=\"424,7115\" height=\"174,2406\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: &auml;ndern und Speichern des Datensatzes im zweiten Formular<\/span><\/b><\/p>\n<p>Die Meldung h&auml;lt zwei Optionen bereit:<\/p>\n<ul>\n<li><b>In Zwischenablage kopieren<\/b>: Aktualisiert den Datensatz im Formular, wodurch die im zweiten Formular ge&auml;nderte Version angezeigt wird. Die Version des Datensatzes, die im ersten Formular gespeichert wurde, landet dann in der Zwischenablage. Von dort k&ouml;nnen Sie diesen dann &uuml;ber den aktuellen Datensatz schreiben und doch noch speichern.<\/li>\n<li><b>Eigene &auml;nderungen verwerfen<\/b>: Diese Option verwirft einfach die &auml;nderungen im ersten Formular und aktualisiert dieses mit dem im zweiten Formular ge&auml;nderten Datensatz.<\/li>\n<\/ul>\n<h2>Noch eine Fehlermeldung<\/h2>\n<p>Interessanterweise gibt es noch eine zweite Konstellation, unter der eine Fehlermeldung beim &auml;ndern eines Datensatzes angezeigt wird &#8211; und zwar schon beim Versuch, auch nur den Inhalt eines Feldes zu bearbeiten. Um dies nachzustellen, verwenden Sie wieder die gleichen beiden Formular <b>frmKategorien1 <\/b>und <b>frmKategorien2<\/b>. Geben Sie nun in <b>frmKategorien1 <\/b>f&uuml;r das Feld <b>Kategoriename <\/b>beispielsweise den Wert <b>Kategorie 0 <\/b>ein. Speichern Sie den Datensatz diesmal direkt.<\/p>\n<p>Anschlie&szlig;end wechseln Sie zum Formular <b>frmKategorien2 <\/b>und versuchen, den Inhalt des Feldes <b>Kategoriename <\/b>anzupassen. Schon beim Eintippen des ersten Zeichens erscheint die Fehlermeldung aus Bild 9. Dies gilt &uuml;brigens f&uuml;r alle Steuer-elemente des Formulars.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_009.png\" alt=\"Fehlermeldung beim Versuch, einen bereits ge&auml;nderten Datensatz von einem anderen Formular aus nochmals zu &auml;ndern\" width=\"700\" height=\"106,7427\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Fehlermeldung beim Versuch, einen bereits ge&auml;nderten Datensatz von einem anderen Formular aus nochmals zu &auml;ndern<\/span><\/b><\/p>\n<p>Wichtig: Um dies reproduzieren zu k&ouml;nnen, muss der im anderen Formular editierte und gespeicherte Datensatz bereits im ersten Formular angezeigt werden. Wenn Sie den Datensatz erst nach der Bearbeitung im anderen Formular laden oder diesen erst aktualisieren, k&ouml;nnen Sie ihn ohne Probleme bearbeiten.<\/p>\n<h2>Fehlernummer ermitteln<\/h2>\n<p>Aber woher kommt dieser Fehler Wir wollen erst einmal die Fehlernummer ermitteln, um dann weitere Nachforschungen anstellen zu k&ouml;nnen. Fehler, die in Formularen auftreten, aber nicht per VBA ausgel&ouml;st werden, kommt man nicht auf herk&ouml;mmliche Weise auf die Spur &#8211; also indem man einfach die Fehlernummer per <b>Err.Number <\/b>abfragt. Stattdessen m&uuml;ssen wir in diesem Fall wir die Ereignisprozedur <b>Form_Error <\/b>bem&uuml;hen, die wir f&uuml;r die Ereigniseigenschaft <b>Bei Fehler <\/b>des Formulars anlegen (in diesem Fall nur f&uuml;r das Formular <b>frmKategorien2<\/b>).<\/p>\n<p>Die Ereignisprozedur statten wir zun&auml;chst nur mit einer einzigen Anweisung aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>,  Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">MsgBox<\/span> DataErr\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Danach f&uuml;hren wir die oben angegebenen Schritte erneut aus. Dies liefert die Meldung aus Bild 10 mit der Nummer <b>7878<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_010.png\" alt=\"Ausgabe der Fehlernummer bei Reproduzierung des zweiten Fehlers\" width=\"424,7115\" height=\"190,0256\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Ausgabe der Fehlernummer bei Reproduzierung des zweiten Fehlers<\/span><\/b><\/p>\n<p>Wenn wir schon einmal dabei sind, k&ouml;nnen wir auch gleich die Fehlernummer des weiter oben ausgel&ouml;sten Fehlers ermitteln. Dieser lautet, wie Bild 11 zeigt, nur etwas anders, n&auml;mlich <b>7787<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_011.png\" alt=\"Ausgabe der Fehlernummer bei Reproduzierung des ersten Fehlers\" width=\"424,7115\" height=\"183,1405\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Ausgabe der Fehlernummer bei Reproduzierung des ersten Fehlers<\/span><\/b><\/p>\n<p>Um die Fehlertexte der beiden Fehler zu ermitteln, k&ouml;nnen wir die Funktion <b>AccessError <\/b>im Direktbereich des VBA-Fensters absetzen. F&uuml;r den Fehler <b>7878 <\/b>ergibt sich Folgendes:<\/p>\n<pre>  AccessError(7878)\r\nDie Daten wurden ge&auml;ndert.@Ein anderer Benutzer hat diesen Datensatz bearbeitet und die von ihm vorgenommenen &auml;nderungen gespeichert, bevor Sie versucht haben, Ihre &auml;nderungen zu speichern.@Bearbeiten Sie den Datensatz erneut.@1@@@1<\/pre>\n<p>F&uuml;r den Fehler <b>7787 <\/b>liefert diese Funktion interessanterweise keine Fehlermeldung.<\/p>\n<h2>Fehlermeldungen durch benutzerdefinierte Fehlermeldung ersetzen<\/h2>\n<p>Wenn Sie denken, dass die Benutzer Ihrer Datenbankanwendung nicht mit der vom System erzeugten Meldung arbeiten k&ouml;nnen, l&auml;sst sich diese nat&uuml;rlich auch durch eine benutzerdefinierte Meldung ersetzen.<\/p>\n<p>F&uuml;r den Fehler <b>7787<\/b>, der beim zwischenzeitlichen &auml;ndern des gleichen Datensatzes an anderer Stelle ausgel&ouml;st wird, erledigen wir dies wie in Listing 1.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>7878\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"7878\"\r\n         <span style=\"color:blue;\">Case <\/span>7787\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Der Datensatz wurde in der Zwischenzeit an anderer Stelle ge&auml;ndert.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & \"Ihre &auml;nderungen werden verworfen, aber in der Zwischenablage gespeichert.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & \"Um Ihre Version zu &uuml;bernehmen, markieren Sie den Datensatz und dr&uuml;cken Sie Strg + V.\"\r\n             Response = acDataErrContinue\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Neue Fehlermeldung f&uuml;r den Fehler mit der Nummer 7787<\/span><\/b><\/p>\n<p>Dabei pr&uuml;fen wir in einer <b>Select Case<\/b>-Bedingung den Wert des Parameters <b>DataErr<\/b>. Lautet dieser auf <b>7787<\/b>, zeigen wir eine Meldung an, die den Benutzer &uuml;ber das Problem und die M&ouml;glichkeiten aufkl&auml;rt (siehe Bild 12). Aber wo sind hier im Vergleich zur Systemmeldung die beiden Auswahlm&ouml;glichkeiten Ganz einfach: Die haben wir herausgek&uuml;rzt. In diesem Fall haben wir n&auml;mlich nicht die M&ouml;glichkeit, individuell auf die Benutzereingabe zu reagieren. Wie aber k&ouml;nnen wir dem Benutzer die M&ouml;glichkeit offen halten, dass er trotz der &uuml;bernommenen &auml;nderungen durch einen anderen Benutzer dennoch seine eigenen &auml;nderungen durchsetzen kann Und geht das &uuml;berhaupt, wenn wir die Ursprungsmeldung mit den beiden Optionen gar nicht mehr anzeigen <\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_012.png\" alt=\"Neue, benutzerdefinierte Meldung beim Versuch, einen Datensatz zu &auml;ndern, der zwischenzeitlich an anderer Stelle ge&auml;ndert wurde.\" width=\"649,559\" height=\"248,6208\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Neue, benutzerdefinierte Meldung beim Versuch, einen Datensatz zu &auml;ndern, der zwischenzeitlich an anderer Stelle ge&auml;ndert wurde.<\/span><\/b><\/p>\n<p>Ja, das geht. Den Hinweis auf die Vorgehensweise geben wir in der Meldung. Nach dem Benutzer diese best&auml;tigt hat, weisen wir dem Parameter <b>Response <\/b>der Prozedur noch den Wert <b>acDataErrContinue <\/b>zu. Das sorgt daf&uuml;r, dass die Systemmeldung unterdr&uuml;ckt wird.<\/p>\n<p>Immerhin sichert Access in diesem Fall aber den Inhalt des Datensatzes, den der aktuelle Benutzer bearbeitet hat, in der Zwischenablage &#8211; so kann dieser seine Version des Datensatzes &uuml;ber den durch den anderen Benutzer ge&auml;nderten Datensatz kopieren.<\/p>\n<h2>Fehlermeldung bei vorheriger &auml;nderung durch anderen Benutzer ersetzen<\/h2>\n<p>Dies wollen wir auch noch f&uuml;r die Fehlermeldung erledigen, die ausgel&ouml;st wird, wenn ein anderer Benutzer den aktuellen Datensatz bearbeitet und speichert, bevor wir diesen selbst &auml;ndern. Um die Fehlermeldung f&uuml;r diesen Fall korrekt zu formulieren, schauen wir uns nochmal genau an, was beim Erscheinen der eingebauten Fehlermeldung geschehen ist. Hier stellen wir dann fest, dass sofort mit dem Eingeben des ersten Zeichens die im anderen Formular ge&auml;nderte Version des Datensatzes erscheint. <\/p>\n<p>Also k&ouml;nnen wir den Benutzer genau darauf hinweisen &#8211; dass der Datensatz seit dem Zeitpunkt des Anzeigens an anderer Stelle ge&auml;ndert wurde und diese nun auf den aktuellen Stand gebracht wurde (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>7878\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Der Datensatz wurde in der Zwischenzeit an anderer Stelle ge&auml;ndert.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & \"Die Daten wurden soeben aktualisiert.\"\r\n             Response = acDataErrContinue\r\n         <span style=\"color:blue;\">Case <\/span>7787\r\n             ...\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Neue Fehlermeldung f&uuml;r den Fehler mit der Nummer 7878<\/span><\/b><\/p>\n<h2>Probleme, die ein Timestamp-Feld erfordern<\/h2>\n<p>Es gibt zwei m&ouml;gliche Probleme, die ohne ein Timestamp-Feld zur Anzeige von Fehlern f&uuml;hren k&ouml;nnen, ohne dass &uuml;berhaupt eine andere &auml;nderung stattgefunden hat. Wir konnten in der Praxis nur eine der beiden reproduzieren, weisen aber dennoch auf beide hin:<\/p>\n<ul>\n<li>Bei der ersten befindet sich in der SQL Server-Tabelle ein Feld mit dem Datentyp <b>bit<\/b>, welches zum Abbilden von <b>Ja\/Nein<\/b>-Feldern genutzt wird.<\/li>\n<li>Bei der zweiten enth&auml;lt die Tabelle Felder mit einem Flie&szlig;komma-Datentyp, also etwa <b>real <\/b>oder <b>float<\/b>.<\/li>\n<\/ul>\n<h2>Probleme mit bit-Feldern, die den Wert Null enthalten<\/h2>\n<p>F&uuml;r SQL Server-Tabellen mit einem bit-Feld ist in diesem Feld ist normalerweise der Standardwert <b>Null <\/b>eingestellt (also eigentlich kein Standardwert &#8211; das Feld bleibt schlicht leer).<\/p>\n<p>Wenn Sie eine solche Tabelle in Access einbinden, wird das <b>bit<\/b>-Feld mit dem Datentyp <b>Ja\/Nein <\/b>abgebildet. Da das <b>Ja\/Nein<\/b>-Feld keinen Nullwert kennt, zeigt etwa ein Formular f&uuml;r einen Datensatz mit dem Wert <b>Null <\/b>ein nicht markiertes Kontrollk&auml;stchen an, also prinzipiell einen <b>Nein<\/b>-Wert. Wenn Sie dann einen Datensatz &auml;ndern, der ein solches leeres <b>bit<\/b>-Feld enth&auml;lt, wird die weiter oben vorgestellte Meldung angezeigt.<\/p>\n<p>Wir stellen das einmal nach. Dazu f&uuml;gen Sie im SQL Server Management Studio der Tabelle <b>tblKategorie1<\/b>, also der Version der Tabelle <b>tblKategorien <\/b>ohne Timestamp-Feld, ein Feld namens <b>Aktiv<\/b> mit dem Datentyp <b>bit <\/b>hinzu. Die Spalte <b>NULL-Werte zulassen <\/b>bleibt hier markiert (siehe Bild 13).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_013.png\" alt=\"Hinzuf&uuml;gen eines bit-Feldes zur Tabelle\" width=\"499,6607\" height=\"230,1341\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Hinzuf&uuml;gen eines bit-Feldes zur Tabelle<\/span><\/b><\/p>\n<p>Danach f&uuml;gen wir der Tabelle ebenfalls im SQL Server Management Studio einige Datens&auml;tze hinzu, sodass wir jeweils ein Exemplar mit den Werten <b>True<\/b>, <b>False <\/b>und <b>NULL <\/b>im Feld <b>Aktiv <\/b>haben (siehe Bild 14).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_014.png\" alt=\"Eingeben einiger Beispieldaten\" width=\"549,6265\" height=\"197,4011\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Eingeben einiger Beispieldaten<\/span><\/b><\/p>\n<p>Da wir die Tabelle im SQL Server ge&auml;ndert haben, m&uuml;ssen wir die Verkn&uuml;pfung mit der Access-Datenbank aktualisieren, was wir wie weiter oben beschrieben &uuml;ber das Formular <b>frmTabelleVerknuepfen <\/b>erledigen. Anschlie&szlig;end k&ouml;nnen wir uns erst einmal ansehen, wie die Werte <b>True<\/b>, <b>False <\/b>und <b>NULL <\/b>unter Access dargestellt werden. Dazu brauchen wir nur die Verkn&uuml;pfung namens <b>tblKategorien1 <\/b>zu &ouml;ffnen.<\/p>\n<p>Diese bietet den Anblick aus Bild 15. Sie sehen, dass schon hier nicht der Wert <b>Null <\/b>angezeigt wird, sondern stattdessen der Wert <b>0<\/b>, also <b>False<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_016.png\" alt=\"Das Feld Aktiv in der Datenblattansicht unter Access\" width=\"499,6607\" height=\"169,7876\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Das Feld Aktiv in der Datenblattansicht unter Access<\/span><\/b><\/p>\n<h2>Nullwert als Kontrollk&auml;stchen im Formular<\/h2>\n<p>Nun passen wir das Formular an, indem wir diesem ein neues Kontrollk&auml;stchen hinzuf&uuml;gen und dessen Eigenschaft <b>Steuer-elementinhalt <\/b>auf das Feld <b>Aktiv <\/b>einstellen (siehe Bild 16). Wenn wir das Feld <b>Aktiv <\/b>einfach aus der Feldliste in den Formularentwurf ziehen w&uuml;rden, w&auml;re das Resultat ein an das Feld <b>Aktiv <\/b>gebundenes Textfeld statt eines Kontrollk&auml;stchens.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_015.png\" alt=\"Hinzuf&uuml;gen des Kontrollk&auml;stchen-Steuerelements f&uuml;r das Feld Aktiv\" width=\"499,6607\" height=\"319,3044\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: Hinzuf&uuml;gen des Kontrollk&auml;stchen-Steuerelements f&uuml;r das Feld Aktiv<\/span><\/b><\/p>\n<p>Damit kommen wir zum Test des Verhaltens des Formulars, wenn wir die drei Datens&auml;tze nacheinander ver&auml;ndern, und zwar jeweils nicht im Feld <b>Aktiv<\/b>.<\/p>\n<p>Beim ersten Datensatz, wo das Feld <b>Aktiv <\/b>den Wert <b>-1 <\/b>enth&auml;lt, lassen sich &auml;nderungen ohne Probleme durchf&uuml;hren und auch speichern. Das gleiche gilt f&uuml;r den dritten Datensatz, wo wir den Wert <b>0<\/b>, also <b>False<\/b>, f&uuml;r das Feld <b>Aktiv <\/b>hinterlegt haben.<\/p>\n<p>Interessant wird es beim zweiten Datensatz, der den Wert <b>Null <\/b>im Feld <b>Aktiv <\/b>aufweist. Hier erscheint dann auch prompt unsere benutzerdefinierte Meldung, wo sonst die Meldung mit den beiden Optionen zum Speichern der eigenen &auml;nderungen in der Zwischenablage oder dem Verwerfen der eigenen &auml;nderungen erschienen w&auml;re (siehe Bild 17).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_017.png\" alt=\"Meldung beim &auml;ndern eines Datensatzes mit dem Wert Null in einem bit-Feld\" width=\"599,593\" height=\"328,9364\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Meldung beim &auml;ndern eines Datensatzes mit dem Wert Null in einem bit-Feld<\/span><\/b><\/p>\n<p>Da wir den Datensatz offensichtlich zwischenzeitlich nicht ver&auml;ndert haben, ist ein anderes Problem f&uuml;r die Meldung verantwortlich &#8211; n&auml;mlich einen Type Mismatch-Fehler.<\/p>\n<p>Was k&ouml;nnen wir tun Es gibt verschiedene M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Auf der Daten-Ebene: F&uuml;llen Sie alle <b>bit<\/b>-Felder, die den Wert <b>NULL <\/b>enthalten, mit dem Wert <b>0<\/b>. Das wird auch von Access korrekt als <b>False <\/b>erkannt.<\/li>\n<li>Auf der Tabelleentwurfs-Ebene: Sie k&ouml;nnen auch einfach den Haken bei <b>NULL-Werte zulassen <\/b>aus dem Tabellenentwurf im SQL Server entfernen. Auf diese Weise werden keine Nullwerte mehr zugelassen.<\/li>\n<li>Auf der Tabellenentwurfs-Ebene: Die zweite L&ouml;sung ist, der Tabelle ein Timestamp-Feld hinzuzuf&uuml;gen. Wir haben auch die Tabelle <b>tblKategorien<\/b>, die ja bereits ein Timestamp-Feld enth&auml;lt, mit dem <b>bit<\/b>-Feld <b>Aktiv <\/b>versehen. Sobald ein Timestamp-Feld vorhanden ist, wird der Fehler durch einen Schreibkonflikt nicht mehr gemeldet.<\/li>\n<\/ul>\n<p>In allen drei F&auml;llen brauchen Sie sich zumindest f&uuml;r diese Konstellation nicht mehr um die Anpassung der Fehlermeldungen zu k&uuml;mmern.<\/p>\n<h2>Formular mit Unterformular<\/h2>\n<p>Als n&auml;chstes schauen wir uns ein Formular mit einem Unterformular an, dass an die per ODBC verkn&uuml;pften Tabellen der SQL Server-Tabelle gebunden ist. Das Hauptformular soll die Tabelle <b>tblKategorien <\/b>binden, das Unterformular an die Tabelle <b>tblArtikel<\/b>. Dabei soll es alle Artikel zur jeweils im Hauptformular angezeigten Kategorie liefern.<\/p>\n<p>Wenn wir Haupt- und Unterformular neu entwerfen und dann das Unterformular aus dem Navigationsbereich in den Entwurf des Hauptformulars ziehen, sieht dieses wie in Bild 18 aus. Sogar die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>werden korrekt eingestellt &#8211; Access erkennt also die Verkn&uuml;pfungen auch auf dem SQL Server.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_018.png\" alt=\"Entwurf von Haupt- und Unterformular\" width=\"499,6607\" height=\"378,6047\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Entwurf von Haupt- und Unterformular<\/span><\/b><\/p>\n<p>Diese werden allerdings, wie Bild 19 zeigt, beim Verkn&uuml;pfen nicht automatisch in die Access-Anwendung &uuml;bernommen, was ein Zeichen daf&uuml;r ist, dass Access tats&auml;chlich die Verkn&uuml;pfungen auf dem SQL Server erkennt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_019.png\" alt=\"Fehlende Verkn&uuml;pfungen im Datenmodell\" width=\"424,7115\" height=\"214,6893\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Fehlende Verkn&uuml;pfungen im Datenmodell<\/span><\/b><\/p>\n<p>Ein kleines Problem gibt es noch: Im Gegensatz zu Access, wo Sie bereits bei der Tabellendefinition ein Nachschlagefeld f&uuml;r Fremdschl&uuml;sselfelder einrichten konnten, geht dies beim SQL Server nicht. Nachschlagefelder sorgen daf&uuml;r, dass beim Hineinziehen von Feldern, die als Nachschlagefeld ausgelegt sind, direkt Kombinationsfelder angelegt werden, welche die Daten der verkn&uuml;pften Tabelle zur Auswahl anbieten. Im Fall der Felder <b>LieferantID <\/b>und <b>KategorieID <\/b>m&uuml;ssen wir also selbst t&auml;tig werden und die entsprechenden Eigenschaften nachtr&auml;glich einrichten. Dabei &auml;ndern wir zun&auml;chst &uuml;ber den Kontextmen&uuml;-Eintrag <b>&auml;ndern zu|Kombinationsfeld <\/b>des Textfeldes <b>LieferantID <\/b>den Steuerelementtyp (siehe Bild 20).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_020.png\" alt=\"&auml;ndern eines Textfeldes in ein Kombinationsfeld\" width=\"499,6607\" height=\"244,2455\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: &auml;ndern eines Textfeldes in ein Kombinationsfeld<\/span><\/b><\/p>\n<p>In unserem Fall &auml;nderte sich durch diese Anpassung der Tab-Reihenfolge, die Sie &uuml;ber den Dialog <b>Reihenfolge <\/b>wiederherstellen k&ouml;nnen (siehe Bild 21), zu &ouml;ffnen &uuml;ber den Kontextmen&uuml;-Eintrag <b>Aktivierreihenfolge&#8230; <\/b>eines der Steuerelemente im Unterformular. Damit die Kombinationsfelder auch Daten anzeigen, legen wir f&uuml;r die Eigenschaft <b>Datensatzquelle <\/b>den folgenden Wert fest:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_021.png\" alt=\"Wiederherstellen der Aktivierreihenfolge\" width=\"349,7625\" height=\"358,9448\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Wiederherstellen der Aktivierreihenfolge<\/span><\/b><\/p>\n<pre>SELECT tblLieferanten.LieferantID, tblLieferanten.Firma FROM tblLieferanten ORDER BY tblLieferanten.Firma;<\/pre>\n<p>Mit dem Wert <b>2 <\/b>f&uuml;r die Eigenschaft <b>Spaltenanzahl <\/b>und <b>0cm <\/b>f&uuml;r <b>Spaltenbreiten <\/b>sorgen wir noch daf&uuml;r, dass nur die Firma angezeigt wird und nicht der Wert der gebundenen Spalte.<\/p>\n<p>Auf die gleiche Weise passen Sie auch noch das Textfeld zur Anzeige der Kategorieauswahl an. Danach wechseln wir in die Formularansicht und sehen in Bild 22, dass die Anbindung des Formulars an die per ODBC verkn&uuml;pften SQL Server-Tabellen wie gew&uuml;nscht funktioniert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_06\/pic_1164_022.png\" alt=\"Hauptformular mit Unterformular und Kombinationsfeldern auf Basis von per ODBC verkn&uuml;pften Tabellen - es funktioniert wie erwartet.\" width=\"649,559\" height=\"395,0823\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 22: Hauptformular mit Unterformular und Kombinationsfeldern auf Basis von per ODBC verkn&uuml;pften Tabellen &#8211; es funktioniert wie erwartet.<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag beleuchtet den Umgang mit Formularen, die an per ODBC verkn&uuml;pfte Tabellen gebunden sind.<\/p>\n<p>Wenn man ein paar Dinge beachtet, machen diese Tabellen keine Probleme und wir k&ouml;nnen lokale Access-Tabellen als Datenherkunft f&uuml;r einfache Formulare genutzt werden.<\/p>\n<p>Auch wenn wir das Formular <b>frmKategorienArtikel <\/b>hier neu erstellt haben, um zu demonstrieren, welche Schritte notwendig sind, um die fehlende Nachschlagefeld-Funktion im Tabellenentwurf des SQL Servers auszugleichen, l&auml;sst sich folgendes Fazit ziehen: Die per ODBC verkn&uuml;pften Tabellen lassen sich in Formularen und ihren Steuerelementen ohne Probleme wie lokale Tabellen verwenden.<\/p>\n<p>F&uuml;r kleinere Probleme wie <b>bit<\/b>-Felder, die Nullwerte enthalten und dadurch beim Bearbeiten von Datens&auml;tzen, die tats&auml;chlich den Wert <b>NULL <\/b>in einem solchen Feld enthalten, Datensatzsperrungen ausl&ouml;sen, haben wir L&ouml;sungen gezeigt.<\/p>\n<p>Sogar das Bearbeiten von Datens&auml;tzen funktioniert reibungslos, sofern nicht der gleiche Datensatz parallel durch mehrere Benutzer bearbeitet wird.<\/p>\n<p>Der Grund, weshalb wir dennoch ODBC-Verkn&uuml;pfungen nur als ersten Schritte bei einer Migration oder f&uuml;r das Prototyping beim Neuerstellen einer Anwendung mit SQL Server-Backend nutzen sollten, ist die schlechte Performance.<\/p>\n<p>Der Grund: Access holt sich hier erst einmal alle Daten der Datenherkunft und filtert oder sortiert erst auf dem Client-Rechner. Wenn Sie stattdessen etwa gespeicherte Prozeduren verwenden, erfolgt die Filterung bereits auf dem SQL Server und es werden nur die Daten &uuml;ber das Netz geschickt, die der Benutzer tats&auml;chlich angefordert hat. Wie Sie dies realisieren, erfahren Sie in weiteren Beitr&auml;gen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ODBCVerknuepfungenInFormularen.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/080B1CF2-6E46-4500-A59E-65BE4DC3A62A\/aiu_1164.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt verschiedene M&ouml;glichkeiten, auf die Daten einer SQL Server-Datenbank zuzugreifen. Die einfachste Variante, gerade wenn es um die Migration einer reinen Access-Datenbank in eine Kombination aus Access-Frontend und SQL Server-Backend geht, ist der Einsatz von per ODBC verkn&uuml;pften Tabellen. Dabei werden die Tabellen einfach nur zum SQL Server migriert und man greift dann &uuml;ber ODBC-Verkn&uuml;pfungen auf die Tabellen zu. F&uuml;r den Zugriff auf diese Daten von Formularen aus ergeben sich so gut wie keine &Auml;nderungen &#8211; und was sich doch &auml;ndern kann, erfahren Sie in diesem Beitrag.<\/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":[662018,66062018,44000022],"tags":[],"class_list":["post-55001164","post","type-post","status-publish","format-standard","hentry","category-662018","category-66062018","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>ODBC-Verkn&uuml;pfungen in Formularen - 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\/ODBCVerknuepfungen_in_Formularen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ODBC-Verkn&uuml;pfungen in Formularen\" \/>\n<meta property=\"og:description\" content=\"Es gibt verschiedene M&ouml;glichkeiten, auf die Daten einer SQL Server-Datenbank zuzugreifen. Die einfachste Variante, gerade wenn es um die Migration einer reinen Access-Datenbank in eine Kombination aus Access-Frontend und SQL Server-Backend geht, ist der Einsatz von per ODBC verkn&uuml;pften Tabellen. Dabei werden die Tabellen einfach nur zum SQL Server migriert und man greift dann &uuml;ber ODBC-Verkn&uuml;pfungen auf die Tabellen zu. F&uuml;r den Zugriff auf diese Daten von Formularen aus ergeben sich so gut wie keine &Auml;nderungen - und was sich doch &auml;ndern kann, erfahren Sie in diesem Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:13:13+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"ODBC-Verkn&uuml;pfungen in Formularen\",\"datePublished\":\"2020-05-13T21:13:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/\"},\"wordCount\":3288,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/39ad978aa7cc474fb0daa69b6af34439\",\"articleSection\":[\"2018\",\"6\\\/2018\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/\",\"name\":\"ODBC-Verkn&uuml;pfungen in Formularen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/39ad978aa7cc474fb0daa69b6af34439\",\"datePublished\":\"2020-05-13T21:13:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/39ad978aa7cc474fb0daa69b6af34439\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/39ad978aa7cc474fb0daa69b6af34439\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/ODBCVerknuepfungen_in_Formularen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ODBC-Verkn&uuml;pfungen in Formularen\"}]},{\"@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":"ODBC-Verkn&uuml;pfungen in Formularen - 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\/ODBCVerknuepfungen_in_Formularen\/","og_locale":"de_DE","og_type":"article","og_title":"ODBC-Verkn&uuml;pfungen in Formularen","og_description":"Es gibt verschiedene M&ouml;glichkeiten, auf die Daten einer SQL Server-Datenbank zuzugreifen. Die einfachste Variante, gerade wenn es um die Migration einer reinen Access-Datenbank in eine Kombination aus Access-Frontend und SQL Server-Backend geht, ist der Einsatz von per ODBC verkn&uuml;pften Tabellen. Dabei werden die Tabellen einfach nur zum SQL Server migriert und man greift dann &uuml;ber ODBC-Verkn&uuml;pfungen auf die Tabellen zu. F&uuml;r den Zugriff auf diese Daten von Formularen aus ergeben sich so gut wie keine &Auml;nderungen - und was sich doch &auml;ndern kann, erfahren Sie in diesem Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:13:13+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"ODBC-Verkn&uuml;pfungen in Formularen","datePublished":"2020-05-13T21:13:13+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/"},"wordCount":3288,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439","articleSection":["2018","6\/2018","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/","url":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/","name":"ODBC-Verkn&uuml;pfungen in Formularen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439","datePublished":"2020-05-13T21:13:13+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/39ad978aa7cc474fb0daa69b6af34439"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/ODBCVerknuepfungen_in_Formularen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"ODBC-Verkn&uuml;pfungen in Formularen"}]},{"@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\/55001164","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=55001164"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001164\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}