{"id":55000082,"date":"2002-10-01T00:00:00","date_gmt":"2021-02-10T20:16:32","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=82"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenzugriff_im_Schichtbetrieb","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/","title":{"rendered":"Datenzugriff im Schichtbetrieb"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Autor: Christoph Spielmann, D&uuml;sseldorf<\/p>\n<p><\/b>!<\/p>\n<p><b>Was Access von anderen Entwicklungsumgebungen unterscheidet, ist insbesondere die einfache und schnelle Entwicklung kompletter Anwendungen ohne viel Programmcode. Eine einfache Datenbank ist so in vielen F&auml;llen bereits nach wenigen Stunden in den Grundz&uuml;gen fertig gestellt. Sobald die Datenbank aber w&auml;chst, werden die ersten Schw&auml;chen und Probleme deutlich. Dieser Artikel zeigt Ihnen anhand eines Beispiels f&uuml;r Access 2000, wie Sie diese Schw&auml;chen vermeiden.<\/b><\/p>\n<p>Der typische Aufbau einer Access-Anwendung sieht folgenderma&szlig;en aus: Sie haben verschiedene Tabellen, die &#8211; teils mit oder teils ohne Abfragen &#8211; an Formulare gebunden sind. <\/p>\n<p>Innerhalb der Formulare werden die Daten angezeigt, ver&auml;ndert und neu hinzugef&uuml;gt. Beim Ver&auml;ndern und Hinzuf&uuml;gen pr&uuml;ft ein Makro oder eine VBA-Prozedur, ob die Eingaben bestimmten Plausibilit&auml;tsregeln entsprechen. <\/p>\n<p>Teilweise wird hierzu auf Werte anderer Formulare zugegriffen und teilweise findet eine Validierung auch innerhalb der G&uuml;ltigkeitsregel-Eigenschaft von Tabellen oder Formularfeldern statt. <\/p>\n<p>Wenn Ihre Datenbank ein zweites Formular enth&auml;lt, in dem Sie die gleichen Daten evtl. tabellarisch bearbeiten, dann bringen Sie hier einen Gro&szlig;teil der Logik nochmals unter. Bei &auml;nderungen passen Sie dann notwendigerweise beide Formulare an.<\/p>\n<p>Diese Art der Anwendungsentwicklung funktioniert bis zu einem bestimmten Punkt sehr gut, da Ergebnisse relativ z&uuml;gig erzielt werden k&ouml;nnen.<\/p>\n<p>W&auml;chst die Datenbank aber weiter, zeigen sich sehr schnell die Schw&auml;chen:<\/p>\n<li>&auml;nderungen m&uuml;ssen h&auml;ufig an vielen Stellen parallel durchgef&uuml;hrt werden.<\/li>\n<li>Wenn man an einer Stelle eine Kleinigkeit &auml;ndert, wirkt sich dies oft auf viele andere Stellen der Datenbank aus. Die Folge sind viele Fehler und eine wenig robuste Datenbank.<\/li>\n<li>Da die Gesch&auml;ftslogik &uuml;ber viele Makros, Module, Abfragen und Formulare verstreut ist, ist die Pflege zeitintensiv. Zudem k&ouml;nnen fremde Entwickler nur sehr schwer die Funktionsweise der Datenbank nachvollziehen.<\/li>\n<li>Der Entwickler kann leicht die &uuml;bersicht &uuml;ber die Software verlieren, sodass sich weitere Fehler einschleichen.<\/li>\n<p>Eine solche Software-Architektur wird als monolithisch bezeichnet, da sich alle Funktionen durcheinander in einem Klotz befinden.<\/p>\n<p>Die L&ouml;sung des Problems besteht darin, die Anwendung nach dem Schichtenmodell aufzubauen. Hierbei werden h&auml;ufig drei Schichten verwendet: Datenschicht, Business-Schicht und Pr&auml;sentationsschicht.<\/p>\n<p>In der Datenschicht sind Funktionen untergebracht, die lesend oder schreibend auf die Tabellen zugreifen. Jeglicher Datenzugriff muss &uuml;ber diese Schicht erfolgen.<\/p>\n<p>In der Business-Schicht werden Plausibilit&auml;ten gepr&uuml;ft. Dazu geh&ouml;rt beispielsweise die Pr&uuml;fung, ob der aktuelle Benutzer die betreffende Funktion ausf&uuml;hren darf oder ob alle Datenfelder korrekte Werte beinhalten. Die Business-Schicht greift zur Pr&uuml;fung ausschlie&szlig;lich auf die Datenschicht zu.<\/p>\n<p>An oberster Stelle liegt die Pr&auml;sentationsschicht. Hier werden Daten erfasst oder angezeigt. Die Pr&auml;sentationsschicht darf nur auf die Business-Schicht, nicht jedoch auf die Datenschicht zugreifen.<\/p>\n<p>Die Vorteile liegen auf der Hand: Wenn Sie in der Business-Schicht eine Pr&uuml;fung eines Schreibvorgangs unterbringen und alle Formulare dieses Funktion nutzen, brauchen Sie auch nur eine zentrale Funktion anpassen bzw. korrigieren.<\/p>\n<p>Ein anderer Vorteil besteht darin, dass Sie beim Umstieg z. B. auf den SQL-Server lediglich die Datenschicht anpassen m&uuml;ssen. Die Business-Schicht, in der das eigentliche Know-how Ihrer Anwendung liegt, kann dagegen unver&auml;ndert bleiben.<\/p>\n<p>Das hier vorgestellte Beispiel besteht aus nur einer einzelnen Tabelle, die Adressdaten zusammen mit einem Anlage- und einem &auml;nderungsdatum speichert. <\/p>\n<p>Die Beispieldatenbank finden Sie auf der Heft-CD unter dem Dateinamen Klassen2000.mdb. <\/p>\n<p>Die Tabelle tblAdressen besteht aus den folgenden Feldern (siehe Bild 1):<\/p>\n<li>AdresseID (Long Integer, Prim&auml;rschl&uuml;ssel der Tabelle) <\/li>\n<li>Firmenname (Text)<\/li>\n<li>Nachname (Text)<\/li>\n<li>Vorname (Text)<\/li>\n<li>Stra&szlig;e (Text)<\/li>\n<li>PLZ (Text)<\/li>\n<li>Ort (Text)<\/li>\n<li>Anlagedatum (Datum\/Uhrzeit)<\/li>\n<li>&auml;nderungsdatum (Datum\/Uhrzeit)<\/li>\n<p><IMG height=\"385\" src=\"..\/fileadmin\/_temp_\/{120694B0-9B4D-4ACF-96DA-4A3B38A5E84E}\/pic001.png\" width=\"328\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1:  Die Tabelle tblAdressen in der Entwurfsansicht.<\/span><\/b><\/p>\n<p>Standardwerte oder G&uuml;ltigkeitsregeln sind nicht definiert, da diese Aufgaben von der Business-Schicht erledigt werden.<\/p>\n<h3>Hinweis<\/h3>\n<p>Parallel zu der Beispieldatenbank Klassen2000.mdb finden Sie noch eine weitere Datenbank namens KlassenXP.mdb, die die Vorgehensweise beim Einsatz von XP beschreibt. Access 2000 enth&auml;lt einige Fehler die bei der Bindung von Recordsets an Formulare zutage treten. Bei Access XP sind diese Probleme behoben, sodass hier einige Prozeduren einen einfacheren und eleganteren Aufbau haben. <\/p>\n<p>Zum Zugriff auf die Tabellen ist nun zun&auml;chst einmal die Anlage der Datenschicht erforderlich.<\/p>\n<p>Um eine gute &uuml;bersicht zu gew&auml;hrleisten, sollte pro Tabelle ein entsprechendes Klassenmodul angelegt werden, in dem alle Funktionen untergebracht sind, die sich mit dieser Tabelle besch&auml;ftigen.<\/p>\n<pre>Public Function GetAdresse(AdresseID As Long) _    As Recordset\r\n    Dim SQL As String\r\n    Dim Data As New ADODB.Recordset\r\n    SQL = \"SELECT * FROM tblAdressen\"\r\n    SQL = SQL & \" WHERE AdresseID=\" & CStr(AdresseID)\r\n    With Data\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .Source = SQL\r\n        .LockType = adLockReadOnly\r\n        .CursorType = adOpenStatic\r\n        .CursorLocation = adUseClient\r\n        .Open\r\n    End With\r\n    Set GetAdresse = Data\r\nEnd Function<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p><IMG height=\"468\" src=\"..\/fileadmin\/_temp_\/{120694B0-9B4D-4ACF-96DA-4A3B38A5E84E}\/pic002.png\" width=\"482\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2:  Der Zugriff auf die Tabellen erfolgt ausschlie&szlig;lich &uuml;ber das Klassenmodul AdressenD.<\/span><\/b><\/p>\n<p>Da in diesem Beispiel nur eine Tabelle zum Einsatz kommt, existiert auch nur ein Klassenmodul. Dies tr&auml;gt den Namen AdressenD. Das D steht hierbei f&uuml;r Datenschicht (siehe Bild 2).<\/p>\n<p><b>Einzelne Adresse abrufen<\/b><\/p>\n<p>Die erste Prozedur dieses Klassenmoduls tr&auml;gt den Namen GetAdresse. Ihre Aufgabe ist es, eine einzelne Adresse aus der Tabelle abzurufen und die Daten in Form eines Recordsets zur&uuml;ck zu liefern. Als Parameter erwartet die Prozedur die Prim&auml;rschl&uuml;sselnummer der Adresse (s. Quell-code 1).<\/p>\n<p>Innerhalb der Prozedur wird ein SQL-Text zusammengestellt mit dessen Hilfe danach ein Recordset gef&uuml;llt wird. Dieses wird dann als Ergebnis der Funktion zur&uuml;ckgegeben. Damit sich &auml;nderungen am Recordset, die in einer h&ouml;heren Schicht durchgef&uuml;hrt werden, nicht auf die Datenbank auswirken, sollte das Recordset vor der &uuml;bergabe an die h&ouml;here Schicht noch entbunden (disconnected) werden:<\/p>\n<pre>\r\nSet .ActiveConnection = Nothing<\/pre>\n<p>Schlie&szlig;lich sollen Schreibzugriffe kontrolliert &uuml;ber eine andere Datenschicht-Funktion durchgef&uuml;hrt werden.<\/p>\n<p>Aufgrund eines Fehlers in Access 2000 l&auml;sst sich ein solches Recordset jedoch nicht an ein Formular binden, weshalb auf diese Anweisung in dieser Beispieldatenbank generell verzichtet werden muss. Beim Einsatz von Access XP tritt das Problem allerdings nicht mehr auf.<\/p>\n<p>Um direkte Schreibzugriffe zu verhindern, wird die LockType-Eigenschaft auf ReadOnly gestellt.<\/p>\n<p>Der LockType wird bewusst nicht auf ReadOnly gesetzt. Dies hat den folgenden Grund:<\/p>\n<pre>Public Function GetAdressenSuchergebnis(Firmenname As _    String, Nachname As String) As Recordset\r\n    Dim SQL As String\r\n    SQL = \"SELECT AdresseID, Firmenname, Nachname, \" _    SQL = SQL & \"Vorname, PLZ FROM tblAdressen\"\r\n    SQL = SQL + \" WHERE True\"\r\n    If Firmenname &lt;&gt; \"\" Then\r\n        SQL = SQL + \" AND Firmenname LIKE \" + _            Quote(\"%\" + Firmenname + \"%\")\r\n    End If\r\n    If Nachname &lt;&gt; \"\" Then\r\n        SQL = SQL + \" AND Nachname LIKE \" + _            Quote(\"%\" + Nachname + \"%\")\r\n    End If\r\n    Dim Data As New ADODB.Recordset\r\n    With Data\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .Source = SQL\r\n        .LockType = adLockReadOnly\r\n        .CursorType = adOpenStatic\r\n        .CursorLocation = adUseClient\r\n        .Open\r\n      End With\r\n    Set GetAdressenSuchergebnis = Data\r\nEnd Function<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<pre>Public Function SaveAdresse(Firmenname As String, _\r\n    Nachname As String, Vorname As String, _\r\n    Strasse As String, PLZ As String, Ort As String, _\r\n    Anlagedatum As Date, &auml;nderungsdatum As Date) As Long\r\n    Dim SQL As String\r\n    SQL = \"SELECT * FROM tblAdressen WHERE False\"\r\n    Dim Data As New ADODB.Recordset\r\n    With Data\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .Source = SQL\r\n        .LockType = adLockOptimistic\r\n        .CursorType = adOpenDynamic\r\n        .MaxRecords = 1\r\n        .Open\r\n        .AddNew\r\n            !Firmenname = ZN(Firmenname)\r\n            !Nachname = ZN(Nachname)\r\n            !Vorname = ZN(Vorname)\r\n            !Strasse = ZN(Strasse)<\/pre>\n<p><b>Quellcode 3 (Fortsetzung n&auml;chste Seite)<\/b><\/p>\n<p>Das Recordset wird sp&auml;ter auch in der Pr&auml;sentationsschicht verwendet und hier an das entsprechende Access-Formular gebunden.<\/p>\n<p>W&auml;re hier ReadOnly eingestellt, k&ouml;nnte man die Daten des Formulars nicht bearbeiten (und dann letztendlich auch nicht an die entsprechende Speicher-Funktion weiterleiten).<\/p>\n<p><b>Abfragen eines   Suchergebnisses<\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Da die Anwendung auch eine Suchfunktion zur Verf&uuml;gung stellt, liefert die Funktion GetAdressenSuchergebnis mehrere Adressen zur&uuml;ck, die einem Suchkriterium entsprechen (s. Quellcode 2).  Auch in dieser Funktion wird wieder ein SQL-Text zusammengestellt und ein entsprechendes Recordset gef&uuml;llt. Um unbeabsichtigte &auml;nderungen am Recordset zu vermeiden, wird der LockType auf adLockReadOnly und der CursorType auf adOpenStatic gesetzt.<\/p>\n<p>Die Quote-Funktion hat die Aufgabe, evtl. vorhandene Anf&uuml;hrungszeichen im Suchtext zu doppeln, sodass Access kein Problem bei der Auswertung der Abfrage hat. Sie finden die Prozedur im Modul modTools der Beispieldatenbank.<\/p>\n<p><b>Adresse hinzuf&uuml;gen<\/b><\/p>\n<p>Die beiden vorgestellten Prozeduren dienen lediglich dem Einlesen, aber nicht dem Speichern von Daten.<\/p>\n<pre>            !PLZ = ZN(PLZ)\r\n            !Ort = ZN(Ort)\r\n            !Anlagedatum = Anlagedatum\r\n            !&auml;nderungsdatum = &auml;nderungsdatum\r\n            SaveAdresse = !AdresseID\r\n        .Update\r\n        .Close\r\n    End With\r\nEnd Function<\/pre>\n<p><b>Quellcode 3 (Fortsetzung)<\/b><\/p>\n<pre>Public Sub UpdateAdresse(AdresseID As Long, Firmenname _    As String, Nachname As String, Vorname As String, _    Strasse As String, PLZ As String, Ort As String, _    &auml;nderungsdatum As Date)\r\n    Dim SQL As String\r\n    SQL = \"SELECT * FROM tblAdressen\"\r\n    SQL = SQL + \" WHERE AdresseID=\" + CStr(AdresseID)\r\n    Dim Data As New ADODB.Recordset\r\n    With Data\r\n        .ActiveConnection = CurrentProject.Connection\r\n        .Source = SQL\r\n        .LockType = adLockOptimistic\r\n        .CursorType = adOpenDynamic\r\n        .Open\r\n            !Firmenname = ZN(Firmenname)\r\n            !Nachname = ZN(Nachname)\r\n            !Vorname = ZN(Vorname)\r\n            !Strasse = ZN(Strasse)\r\n            !PLZ = ZN(PLZ)\r\n            !Ort = ZN(Ort)\r\n            !&auml;nderungsdatum = &auml;nderungsdatum\r\n        .Update\r\n        .Close\r\n    End With\r\nEnd Sub<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<pre>Public Sub DeleteAdresse(AdresseID As Long)\r\n    Dim SQL As String\r\n    SQL = \"DELETE * FROM tblAdressen\"\r\n    SQL = SQL + \" WHERE AdresseID=\" + CStr(AdresseID)\r\n    CurrentProject.Connection.Execute SQL\r\nEnd Sub<\/pre>\n<p><b>Quellcode 5<\/b><\/p>\n<p>Die Prozedur SaveAdresse hat dagegen die Aufgabe, eine Adresse in die Tabelle zu schreiben (s. Quellcode 3). Die Prozedur hat f&uuml;r jedes Feld der Tabelle einen entsprechenden Parameter. Ausnahme ist der Prim&auml;rschl&uuml;ssel. Dieser wird nach Anlage als Ergebnis der Prozedur zur&uuml;ck geliefert.<\/p>\n<p>Die ZN-Funktion wandelt einen Leerstring in den Wert Null um. Dies ist erforderlich, da als Parameter der Datentyp String und nicht Variant verwendet wird.<\/p>\n<p><b>Vorhandene Adresse aktualisieren<\/b><\/p>\n<p>Die Update-Prozedur hat einen &auml;hnlichen Aufbau (s. Quellcode 4). Im Unterscheid zur Anlage einer neuen Adresse wird bei dieser Prozedur kein Wert zur&uuml;ckgegeben. <\/p>\n<p>Die ID muss stattdessen als Parameter &uuml;bergeben werden, sodass die Prozedur wei&szlig;, welche Adresse sie aktualisieren soll.<\/p>\n<p><b>Adresse l&ouml;schen<\/b><\/p>\n<p>Zu guter Letzt fehlt noch eine Prozedur zum L&ouml;schen einer Adresse (s. Quellcode 5)<\/p>\n<p>Die Aufgabe der Business-Schicht ist es, den Aufruf der entsprechenden Datenschicht-Prozeduren zu koordinieren und die Datenbank vor unsinnigen Speichervorg&auml;ngen zu sch&uuml;tzen.<\/p>\n<pre>Public Function GetAdresse(AdresseID As Long) As _    Recordset\r\n    With New AdressenD\r\n        Set GetAdresse = .GetAdresse(AdresseID)\r\n    End With\r\nEnd Function<\/pre>\n<p><b>Quellcode 6<\/b><\/p>\n<pre>Public Function GetAdressenSuchergebnis(Firmenname As _    String, Nachname As String) As Recordset\r\n    If Firmenname = \"\" And Nachname = \"\" Then\r\n        Err.Raise vbObjectError + 2000, _            \"UpdateAdresse\", _            \"Firmenname oder Nachname erforderlich\"\r\n    End If\r\n    With New AdressenD\r\n        Set GetAdressenSuchergebnis = _            .GetAdressenSuchergebnis(Firmenname, _            Nachname)\r\n    End With\r\nEnd Function<\/pre>\n<p><b>Quellcode 7<\/b><\/p>\n<pre>Public Function SaveAdresse(Firmenname As String, _    Nachname As String, Vorname As String, Strasse As _    String, PLZ As String, Ort As String) As Long\r\n    If Firmenname = \"\" And Nachname = \"\" Then\r\n        Err.Raise vbObjectError + 2000, _           \"UpdateAdresse\", \"Firmenname oder Nachname erforderlich\"\r\n    End If\r\n    If PLZ = \"\" Then\r\n        Err.Raise vbObjectError + 2000, _\"UpdateAdresse\", \"Postleitzahl erforderlich\"\r\n    End If\r\n    If Ort = \"\" Then\r\n        Err.Raise vbObjectError + 2000, _\"UpdateAdresse\", \"Ort erforderlich\"\r\n    End If\r\n    With New AdressenD\r\n        SaveAdresse = .SaveAdresse(Firmenname, _\r\n            Nachname, Vorname, Strasse, PLZ, Ort, _            Now, Now)\r\n    End With\r\nEnd Function<\/pre>\n<p><b>Quellcode 8<\/b><\/p>\n<p>In diesem Beispiel tr&auml;gt das entsprechende Klassenmodul den Namen AdressenB. Das B steht hierbei f&uuml;r Business-Schicht.<\/p>\n<p>Bei den &ouml;ffentlichen Prozeduren der Business-Schicht bietet es sich an, wenn m&ouml;glich die Namen der Datenschicht zu &uuml;bernehmen. Dementsprechend tr&auml;gt die erste Prozedur den Namen GetAdresse (s. Quellcode 6). Diese Prozedur macht nichts weiter, als eine neue Instanz der Datenschicht-Klasse AdressenD zu erzeugen und hier die gleichnamige Prozedur GetAdresse aufzurufen.<\/p>\n<p>Die Prozedur GetAdressenSuchergebnis hat einen &auml;hnlich einfachen Aufbau (s. Quellcode 7). Hier wird jedoch bereits gepr&uuml;ft, ob entweder ein Firmenname oder ein Nachname angegeben ist. Dies soll vermeiden, dass der Benutzer zu viele Datens&auml;tze abfragt und die Performance der Datenbank darunter leiden w&uuml;rde.<\/p>\n<p>Sollten beiden Parameter Leerstrings enthalten, l&ouml;st die Prozedur einen Laufzeitfehler mit einem entsprechenden Fehlertext aus. Als Fehlernummer wird hierbei der Wert 2000 zuz&uuml;glich dem Wert der Access-Konstanten vbObjectError verwendet.<\/p>\n<p>Der Wert 2000 k&ouml;nnte innerhalb Ihrer Anwendung als genereller Fehler der Business-Schicht interpretiert werden.<\/p>\n<p>Zus&auml;tzlich k&ouml;nnten Sie weitere Fehlernummern reservieren, um genauere Informationen &uuml;ber die Art des Fehlers an die h&ouml;here Schicht zu liefern.<\/p>\n<p><IMG height=\"256\" src=\"..\/fileadmin\/_temp_\/{120694B0-9B4D-4ACF-96DA-4A3B38A5E84E}\/pic003.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Das Suchformular in der Entwurfsansicht<\/span><\/b><\/p>\n<pre>Public Sub DeleteAdresse(AdresseID As Long)\r\n    With New AdressenD\r\n        .DeleteAdresse AdresseID\r\n    End With\r\nEnd Sub<\/pre>\n<p><b>Quellcode 9<\/b><\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Me.Section(0).Visible = False\r\nEnd Sub<\/pre>\n<p><b>Quellcode 10<\/b><\/p>\n<pre>Private Sub btnSuchen_Click()\r\n    RefreshSuchergebnis\r\nEnd Sub<\/pre>\n<p><b>Quellcode 11<\/b><\/p>\n<p>Die folgende Auflistung gibt Ihnen einige Anregungen:<\/p>\n<li>2001: Parameter darf kein Leerstring sein.<\/li>\n<li>2002: Parameter au&szlig;erhalb des erwarteten Wertebereichs.<\/li>\n<li>2003: Parameter untereinander nicht schl&uuml;ssig.<\/li>\n<li>2004: Benutzer hat nicht die erforderlichen Rechte zur Ausf&uuml;hrung.<\/li>\n<li>2005: Datensatz konnte nicht gel&ouml;scht werden.<\/li>\n<li>2006: Datensatz existiert nicht mehr.<\/li>\n<p>Eine wichtige Besonderheit ist noch zu beachten: Standardm&auml;&szlig;ig unterbricht Access die Programmcode-Ausf&uuml;hrung, wenn in einem Klassenmodul ein Fehler auftritt. Um Fehler an die h&ouml;here Schicht zu melden, darf dies jedoch nicht der Fall sein. Die entsprechende Einstellung nehmen Sie wie folgt vor:<\/p>\n<li>&ouml;ffnen Sie ein beliebiges VBA-Modul (z.B. das Klassenmodul AdressenD)<\/li>\n<li>W&auml;hlen Sie den Men&uuml;punkt Extras\/Optionen aus.<\/li>\n<li>Wechseln Sie in das Register Allgemein.<\/li>\n<li>Aktivieren Sie hier aus der Gruppe Unterbrechen bei Fehlern die Option Bei nicht verarbeiteten Fehlern aus.<\/li>\n<li>Best&auml;tigen Sie mit OK.<\/li>\n<p><b>Pr&uuml;fung beiSpeichervorg&auml;ngen<\/b><\/p>\n<p>Eine etwas ausf&uuml;hrlichere Pr&uuml;fung wird von der Prozedur SaveAdresse vorgenommen (s. Quellcode 8).<\/p>\n<p>Hier wird beispielsweise gepr&uuml;ft, ob entweder ein Firmenname oder ein Nachname vorhanden ist.<\/p>\n<p>Sollte dies nicht der Fall sein, darf der Datensatz nicht gespeichert werden. Auch das Vorhandensein einer Postleitzahl und einer Ortsangabe wird gepr&uuml;ft.<\/p>\n<p><IMG height=\"254\" src=\"..\/fileadmin\/_temp_\/{120694B0-9B4D-4ACF-96DA-4A3B38A5E84E}\/pic004.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4:  Da die Datenbindung erst nach Ausf&uuml;hrung der ersten Suche erfolgt, wird der Detailbereich vorher ausgeblendet. Ansonsten w&auml;re hier der Text #Name# sichtbar, da Access die Felder nicht an eine Datenquelle binden kann.<\/span><\/b><\/p>\n<pre>Private Sub RefreshSuchergebnis()\r\n    On Error GoTo Fehler\r\n    Dim Data As ADODB.Recordset\r\n    With New AdressenB\r\n        Set Data = .GetAdressenSuchergebnis _            (Nz(Me.txtFindFirmenname.Value, \"\"), _            Nz(Me.txtFindNachname.Value, \"\"))\r\n    End With\r\n    Set Me.Recordset = Data\r\n    Me.Section(0).Visible = True\r\n    Exit Sub\r\nFehler:\r\n    MsgBox Err.Description\r\n    Exit Sub\r\nEnd Sub<\/pre>\n<p><b>Quellcode 12<\/b><\/p>\n<pre>Private Sub btnDetails_Click()\r\n    Dim AdresseID As Long\r\n    AdresseID = Me.Recordset.Fields(\"AdresseID\").Value\r\n    DoCmd.OpenForm \"frmAdresseBearbeiten\", acNormal, , , , acDialog, AdresseID\r\n    RefreshSuchergebnis\r\nEnd Sub<\/pre>\n<p><b>Quellcode 13<\/b><\/p>\n<p>Die Meldung von Plausibilit&auml;tsverletzungen an die h&ouml;here Schicht wird wieder mit Hilfe von Laufzeitfehlern bewerkstelligt.<\/p>\n<p>Einen fast identischen Aufbau hat die Prozedur UpdateAdresse, deren Aufbau Sie in der Beispieldatenbank finden.<\/p>\n<p><b>L&ouml;schen einerAdresse<\/b><\/p>\n<p>Die Funktion DeleteAdresse ruft die gleichnamige Prozedur der Datenschicht auf, um einen Datensatz zu l&ouml;schen (s. Quellcode 9). Sollte Ihre Datenbank mit Benutzerrechten arbeiten, k&ouml;nnte die Prozedur noch um eine entsprechende Pr&uuml;fung erweitert werden.<\/p>\n<p>Die Pr&auml;sentationsschicht besteht in diesem Beispiel aus einem Suchformular sowie einem Formular zur Bearbeitung und Neuanlage von Adressen.<\/p>\n<p><b>Das Suchformular<\/b><\/p>\n<p>Das Suchformular ist ein einfaches Endlosformular (siehe Bild 3). <\/p>\n<p>Im Kopf befinden sich die zwei Textfelder txtFindFirmenname und txtFindNachname zur Eingabe der Suchkriterien.<\/p>\n<p>Mit der Schaltfl&auml;che btnSuchen wird die Suche gestartet. Die Schaltfl&auml;che btnNeu legt eine neue Adresse an.<\/p>\n<p>Im Detailbereich sind die Felder Firmenname, Nachname, Vorname und PLZ als Suchergebnis aufgelistet. Die einzelnen Steuerelemente sind &uuml;ber die Steuerelementinhalt-Eigenschaft an die betreffenden Felder gebunden.<\/p>\n<p>Diese Bindung muss jedoch von Hand erfolgen, da unter der Datenherkunft-Eigenschaft des Formulars weder eine Abfrage noch eine Tabelle eingetragen ist und damit die automatischen Access-Funktionen nicht zum Zuge kommen. Rechts neben den Feldern ist eine Schaltfl&auml;che namens btnDetails platziert. Hiermit kann in die Bearbeitungsmaske gesprungen werden.<\/p>\n<p><b>Funktionsweise des Suchformulars<\/b><\/p>\n<p>Beim &ouml;ffnen des Formulars wird zun&auml;chst einmal der Detailbereich unsichtbar gemacht (s. Quellcode 10). Dies ist erforderlich, da hier aufgrund der fehlenden Datenbindung der Text #Name# angezeigt wird (siehe Bild 4).<\/p>\n<p>Klickt der Benutzer auf die Suchen-Schaltfl&auml;che, wird der Suchvorgang gestartet (s. Quellcode 11). Die Unterprozedur RefreshSuchergebnis hat den Aufbau aus Quellcode 12.<\/p>\n<p>Zun&auml;chst wird ein neues Recordset dimensioniert und mittels GetAdressenSuchergebnis-Funktion der Business-Schicht mit Daten gef&uuml;llt. Die Eingaben der beiden Suchfelder werden hierbei als Parameter &uuml;bergeben, wobei die Nz-Funktion NULL-Werte in Leerstrings umwandelt.<\/p>\n<p>Anschlie&szlig;end wird dieses Recordset der Recordset-Eigenschaft des Formulars zugewiesen, wodurch letztendlich die Datenbindung erfolgt.<\/p>\n<h3>Hinweis<\/h3>\n<p>Wchtig ist hierbei, dass dies nur mit Access 2000 oder Access XP m&ouml;glich ist. Bei fr&uuml;heren Versionen von Access ist diese Eigenschaft schreibgesch&uuml;tzt. <\/p>\n<h3>Hinweis<\/h3>\n<p>Zuletzt wird noch der Detailbereich eingeblendet, damit die Daten sichtbar werden.<\/p>\n<p><IMG height=\"254\" src=\"..\/fileadmin\/_temp_\/{120694B0-9B4D-4ACF-96DA-4A3B38A5E84E}\/pic005.png\" width=\"418\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5:  Das Formular zur Bearbeitung von Daten.<\/span><\/b><\/p>\n<p>Die komplette Prozedur ist in eine Fehlerbehandlungsroutine eingerahmt. Zur Erinnerung: Die Business-Schicht meldet einen Fehler, falls weder ein Firmenname noch ein Nachname angegeben ist. Da dies verh&auml;ltnism&auml;&szlig;ig h&auml;ufig auftreten d&uuml;rfte, ist eine Fehlerbehandlung insbesondere bei dieser Prozedur und generell bei allen Aufrufen der Business-Schicht sehr wichtig.<\/p>\n<p><b>&ouml;ffnen von Details und Neuanlage<\/b><\/p>\n<p>Bei einem Klick auf die Detail-Schaltfl&auml;che wird die Prozedur aus Quellcode 13 ausgef&uuml;hrt.<\/p>\n<p>Zun&auml;chst wird die AdresseID aus dem aktuellen Datensatz ausgelesen. Diese wird anschlie&szlig;end als &ouml;ffnungsargument an das Formular frmAdresseBearbeiten &uuml;bergeben.<\/p>\n<p>Da das Bearbeitungsformular als Dialog ge&ouml;ffnet wird, kann anschlie&szlig;end noch das Suchergebnis aktualisiert werden.<\/p>\n<p>Beim Klick auf die Neu-Schaltfl&auml;che wird als AdresseID der Wert 0 &uuml;bergeben (s. Quellcode 14).<\/p>\n<pre>Private Sub btnNeu_Click()\r\n    DoCmd.OpenForm _        \"frmAdresseBearbeiten\", _        acNormal, , , , acDialog, 0\r\nEnd Sub<\/pre>\n<p><b>Quellcode 14<\/b><\/p>\n<p><b>Das Formular frmAdresseBearbeiten<\/b><\/p>\n<p>Das Formular frmAdresseBearbeiten (siehe Bild 5) enth&auml;lt zu jedem Feld der Tabelle ein entsprechendes Eingabefeld. Hier erfolgt jedoch keine Feldbindung mittels Steuerelementinhalt-Eigenschaft.<\/p>\n<p>Dar&uuml;ber hinaus stehen drei Schaltfl&auml;chen mit den Namen btnOK, btnAbbrechen und btnL&ouml;schen zur Verf&uuml;gung.<\/p>\n<p>Beim Laden des Formulars wird das &ouml;ffnungsargument &uuml;berpr&uuml;ft, der Wert in der privaten Variablen m_AdresseID abgelegt und der entsprechende Datensatz von der Business-Schicht angefordert (s. Quellcode 15). Sollte die &uuml;bergebene AdressenID einen Wert ungleich 0 haben, werden die Inhalte des Recordsets in die einzelnen Textfelder geschrieben. <\/p>\n<p>Leider ist hierbei keine Datenbindung &uuml;ber die Recordset-Eigenschaft m&ouml;glich, da Access 2000 keine Aktualisierungen zul&auml;sst. Hierbei handelt es sich ebenfalls um eine Unzul&auml;nglichkeit, die Microsoft bei Access XP behoben hat.<\/p>\n<pre>Private m_AdresseID As Long \r\n. . .\r\nPrivate Sub Form_Load()\r\n    On Error GoTo Fehler\r\n    m_AdresseID = Val(Me.OpenArgs)\r\n    With New AdressenB\r\n        If m_AdresseID = 0 Then\r\n            Me.btnL&ouml;schen.Enabled = False\r\n        Else\r\n            Dim Data As ADODB.Recordset\r\n            Set Data = .GetAdresse(m_AdresseID)\r\n            Me.txtFirmenname = Data!Firmenname\r\n            Me.txtNachname = Data!Nachname\r\n            Me.txtVorname = Data!Vorname\r\n            Me.txtStrasse = Data!Strasse\r\n            Me.txtPLZ = Data!PLZ\r\n            Me.txtOrt = Data!Ort\r\n        End If\r\n    End With\r\n    Exit Sub\r\nFehler:\r\n    MsgBox Err.Description\r\n    Exit Sub\r\nEnd Sub<\/pre>\n<p><b>Quellcode 15<\/b><\/p>\n<pre>Private Sub btnOK_Click()\r\n    On Error GoTo Fehler\r\n    If m_AdresseID = 0 Then\r\n        ''Neu\r\n        With New AdressenB\r\n            .SaveAdresse Nz(Me.txtFirmenname), _                 Nz(Me.txtNachname), _                 Nz(Me.txtVorname), Nz(Me.txtStrasse), _                 Nz(Me.txtPLZ), Nz(Me.txtOrt)\r\n        End With\r\n    Else<\/pre>\n<p><b>Quellcode 16<\/b><\/p>\n<p>Sollte der Wert dagegen gleich 0 sein, werden lediglich leere Textfelder zur Erfassung der neuen Adresse angezeigt. Zus&auml;tzlich wird noch die L&ouml;schen-Schaltfl&auml;che deaktiviert.<\/p>\n<p><b>Speichern der Adressdaten &uuml;ber das Formular<\/b><\/p>\n<p>Die Speicherfunktion des Formulars liegt hinter der OK-Schaltfl&auml;che (s. Quellcode 16).<\/p>\n<p>Die Prozedur pr&uuml;ft anhand der Variablen m_AdresseID, ob der Datensatz neu angelegt oder lediglich aktualisiert werden soll. Dementsprechend ruft sie die passende Prozedur der Business-Schicht auf.<\/p>\n<p>Anschlie&szlig;end wird das Formular geschlossen.<\/p>\n<p><b>L&ouml;schen einer    Adresse<\/b><\/p>\n<p>Zum L&ouml;schen einer Adresse wird ebenfalls die passende Prozedur der Business-Schicht aufgerufen (s. Quellcode 17).<\/p>\n<p>Vorher erfolgt noch eine entsprechende Sicherheitsabfrage.<\/p>\n<pre>        ''Update\r\n        With New AdressenB\r\n            .UpdateAdresse m_AdresseID, Nz(Me.txtFirmenname), _                Nz(Me.txtNachname), Nz(Me.txtVorname), _                Nz(Me.txtStrasse), Nz(Me.txtPLZ), Nz(Me.txtOrt)\r\n        End With\r\n    End If\r\n    DoCmd.Close acForm, Me.Name\r\n    Exit Sub\r\nFehler:\r\n    MsgBox Err.Description\r\n    Exit Sub\r\nEnd Sub<\/pre>\n<p><b>Quellcode 16 (Fortsetzung)<\/b><\/p>\n<pre>Private Sub btnL&ouml;schen_Click()\r\n    On Error GoTo Fehler\r\n    If MsgBox(\"M&ouml;chten Sie diese Adresse wirklich l&ouml;schen\", _        vbQuestion + vbYesNo) = vbYes Then\r\n         With New AdressenB\r\n            .DeleteAdresse (m_AdresseID)\r\n            DoCmd.Close acForm, Me.Name\r\n         End With\r\n    End If\r\n    Exit Sub\r\nFehler:\r\n    MsgBox Err.Description\r\n    Exit Sub\r\nEnd Sub<\/pre>\n<p><b>Quellcode 17<\/b><\/p>\n<p>Die in diesem Artikel beschriebene Software-Architektur ist auf den ersten Blick deutlich aufwendiger als der herk&ouml;mmliche Weg.<\/p>\n<p>Sp&auml;testens aber bei gro&szlig;en Projekten mit vielen &auml;nderungen werden Sie diese Architektur zu sch&auml;tzen wissen.<\/p>\n<p>Schlie&szlig;lich ist sie schon lange etabliert und wird &#8211; nat&uuml;rlich in optimierter Form &#8211; bei fast allen gr&ouml;&szlig;eren Datenbankanwendungen eingesetzt (z. B. SAP R\/3, wobei die &#8222;3&#8220; auch f&uuml;r das Dreischicht-Modell steht).<\/p>\n<p>Ein gro&szlig;er Pluspunkt ist beispielsweise auch, dass Sie die Daten- und die Business-Schicht fast eins zu eins nach Visual Basic &uuml;bernehmen k&ouml;nnen. Dort besteht die M&ouml;glichkeit, entsprechende DLLs zu kompilieren.<\/p>\n<p>Diese k&ouml;nnten dann zentral auf einem Server laufen. Die DLLs k&ouml;nnten Sie dann in Ihre Access-Front-Ends einbinden und per DCom auf die Objekte des Servers zugreifen.<\/p>\n<p>Dies entlastet den Client erheblich. Auch der Austausch des Back-Ends gegen den MS SQL-Server oder Oracle wird durch alleinige Anpassung der Datenschicht zum Kinderspiel.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Klassen00.mdb<\/p>\n<p>KlassenXP.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/BD301FE2-FE12-487D-B6B8-29BFFEF14636\/aiu_82.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was Access von anderen Entwicklungsumgebungen unterscheidet, ist insbesondere die einfache und schnelle Entwicklung kompletter Anwendungen ohne viel Programmcode. Eine einfache Datenbank ist so in vielen F&auml;llen bereits nach wenigen Stunden in den Grundz&uuml;gen fertig gestellt. Sobald die Datenbank aber w&auml;chst, werden die ersten Schw&auml;chen und Probleme deutlich. Dieser Artikel zeigt Ihnen anhand eines Beispiels f&uuml;r Access 2000, wie Sie diese Schw&auml;chen vermeiden.<\/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":[662002,66052002,44000025],"tags":[],"class_list":["post-55000082","post","type-post","status-publish","format-standard","hentry","category-662002","category-66052002","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Datenzugriff im Schichtbetrieb - 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\/Datenzugriff_im_Schichtbetrieb\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenzugriff im Schichtbetrieb\" \/>\n<meta property=\"og:description\" content=\"Was Access von anderen Entwicklungsumgebungen unterscheidet, ist insbesondere die einfache und schnelle Entwicklung kompletter Anwendungen ohne viel Programmcode. Eine einfache Datenbank ist so in vielen F&auml;llen bereits nach wenigen Stunden in den Grundz&uuml;gen fertig gestellt. Sobald die Datenbank aber w&auml;chst, werden die ersten Schw&auml;chen und Probleme deutlich. Dieser Artikel zeigt Ihnen anhand eines Beispiels f&uuml;r Access 2000, wie Sie diese Schw&auml;chen vermeiden.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-02-10T20:16:32+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenzugriff im Schichtbetrieb\",\"datePublished\":\"2021-02-10T20:16:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/\"},\"wordCount\":2743,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/2579a141e9614125b3d4d6531d82a29d\",\"articleSection\":[\"2002\",\"5\\\/2002\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/\",\"name\":\"Datenzugriff im Schichtbetrieb - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/2579a141e9614125b3d4d6531d82a29d\",\"datePublished\":\"2021-02-10T20:16:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/2579a141e9614125b3d4d6531d82a29d\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/2579a141e9614125b3d4d6531d82a29d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenzugriff_im_Schichtbetrieb\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenzugriff im Schichtbetrieb\"}]},{\"@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":"Datenzugriff im Schichtbetrieb - 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\/Datenzugriff_im_Schichtbetrieb\/","og_locale":"de_DE","og_type":"article","og_title":"Datenzugriff im Schichtbetrieb","og_description":"Was Access von anderen Entwicklungsumgebungen unterscheidet, ist insbesondere die einfache und schnelle Entwicklung kompletter Anwendungen ohne viel Programmcode. Eine einfache Datenbank ist so in vielen F&auml;llen bereits nach wenigen Stunden in den Grundz&uuml;gen fertig gestellt. Sobald die Datenbank aber w&auml;chst, werden die ersten Schw&auml;chen und Probleme deutlich. Dieser Artikel zeigt Ihnen anhand eines Beispiels f&uuml;r Access 2000, wie Sie diese Schw&auml;chen vermeiden.","og_url":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-02-10T20:16:32+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenzugriff im Schichtbetrieb","datePublished":"2021-02-10T20:16:32+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/"},"wordCount":2743,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d","articleSection":["2002","5\/2002","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/","url":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/","name":"Datenzugriff im Schichtbetrieb - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d","datePublished":"2021-02-10T20:16:32+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/2579a141e9614125b3d4d6531d82a29d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenzugriff_im_Schichtbetrieb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenzugriff im Schichtbetrieb"}]},{"@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\/55000082","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=55000082"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000082\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}