{"id":55000219,"date":"2004-06-01T00:00:00","date_gmt":"2020-05-06T15:17:45","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=219"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Fahrtenbuch_mit_Import_und_Stornierungsfunktion","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/","title":{"rendered":"Fahrtenbuch mit Import- und Stornierungsfunktion"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Andr&eacute; Minhorst, Duisburg<\/b><\/p>\n<p><b>Bei der Arbeit mit Computeranwendungen treten zwangsl&auml;ufig Eingabefehler auf und es gibt keine Validierung, die hundertprozentig vor nicht gew&uuml;nschten Eingaben sch&uuml;tzt. So auch beim Fahrtenbuch, das in Ausgabe 2\/2003 von Access im Unternehmen vorgestellt wurde: Man kann einmal eingegebene Fahrten nicht mehr stornieren, und somit mussten die Daten noch einmal neu eingegeben werden. Um dieses Manko zu beheben, lernen Sie im vorliegenden Beitrag einige Erweiterungen f&uuml;r das Fahrtenbuch kennen.<\/b><\/p>\n<p>Die neue Version des Fahrtenbuchs enth&auml;lt einige &auml;nderungen. Die wichtigste &auml;nderung ist, dass es von nun an die M&ouml;glichkeit gibt, den letzten eingegebenen Datensatz zu stornieren und noch einmal an der Stelle vor Eingabe des letzten Datensatzes zu beginnen.<\/p>\n<p>Au&szlig;erdem gibt es zwei kleinere &auml;nderungen: Wenn man mit der bisherigen Version des Fahrtenbuchs die Fahrten, den Verbrauchsbericht oder die Ausgaben ausgeben wollte, wurde die Berichtsvorschau nur in verkleinerter Ansicht angezeigt. Nun k&ouml;nnen Sie alle Berichte in beliebiger Gr&ouml;&szlig;e anzeigen, bevor Sie den Druckvorgang mit der entsprechenden Schaltfl&auml;che initiieren. Au&szlig;erdem zeigte die Verbrauchs&uuml;bersicht bisher in manchen F&auml;llen den Wert #Fehler an. Auch dieser Fehler ist behoben. Und wenn Sie schon mit der Vorg&auml;ngerversion des Fahrtenbuchs gearbeitet haben, m&ouml;chten Sie vermutlich nicht alle Daten erneut mit der neuen Version eingeben. In dem Fall finden Sie eine Import-Funktion f&uuml;r die einfache und schnelle &uuml;bernahme Ihrer bestehenden Daten.<\/p>\n<p>Die erste Version des Fahrtenbuchs, das Sie im Beitrag Fahrtenbuch in Ausgabe 2\/2003 kennen lernen konnten und das auch unter www.access-im-unternehmen.de als Businessl&ouml;sung zum Download bereitsteht, enth&auml;lt keine M&ouml;glichkeit, einmal get&auml;tigte Eingaben zu redigieren. Diese Einstellung hat den Sinn, die Anwendung &#8222;finanzamttauglich&#8220; zu machen.<\/p>\n<p>Damit das Fahrtenbuch in elektronischer Form dort anerkannt wird, darf es entweder gar keine M&ouml;glichkeit geben, einmal eingegebene Fahrten nachtr&auml;glich zu manipulieren, oder die &auml;nderungen m&uuml;ssen als solche gekennzeichnet werden. Unter der Pr&auml;misse, dass eine auff&auml;llig gestaltete Sicherheitsabfrage bez&uuml;glich der Richtigkeit der Daten ausreichen w&uuml;rde, um Fehleingaben zu vermeiden, wurde damals erstere Variante aufgegriffen.<\/p>\n<p>Im Laufe der Zeit wandelt sich jedoch auch das Best&auml;tigen der R&uuml;ckfrage vor dem Speichern von Daten in das nervige Wegklicken einer nicht mehr gelesenen Meldung; die erste Eingabe einer Fahrt mit 1000 statt 100 gefahrenen Kilometern l&auml;sst nicht mehr lange auf sich warten.<\/p>\n<h3>Hinweis<\/h3>\n<p>Die erste in Access im Unternehmen 2\/2003 vorgestellte Version des Fahrtenbuchs und die unter der Rubrik Businessl&ouml;sungen auf www.access-im-unternehmen.de ver&ouml;ffentlichte Version unterscheiden sich bereits enorm voneinander. Der vorliegende Beitrag beschreibt die &auml;nderungen, die an der letzten Version der Businessl&ouml;sung vorgenommen werden, um den in diesem Beitrag beschriebenen Stand zu erreichen. Auch die Beschreibung der Routine zum Import bestehender Daten bezieht sich auf den Import von der Fahrtenbuch-Businessl&ouml;sung. Diese kann aber leicht der Version aus Heft 2\/2003 angepasst werden. <\/p>\n<h3>Stornieren des letzten Datensatzes<\/h3>\n<p>Damit man die Daten nicht nach jedem Eingabefehler erneut in eine blanko Fahrtenbuchdatenbank eingeben muss, enth&auml;lt die nachfolgend vorgestellte neue Version des Fahrtenbuchs zwei &auml;nderungen:<\/p>\n<li>Der Benutzer kann den jeweils letzten Eintrag f&uuml;r ein Fahrzeug stornieren. Das bedeutet keinesfalls, dass der letzte Datensatz gel&ouml;scht wird &#8211; es wird lediglich ein Ja\/Nein-Feld namens Storniert auf den Wert Ja gesetzt, um stornierte Datens&auml;tze zu kennzeichnen.<\/li>\n<li>Falls Sie mit der unter Businessl&ouml;sungen ver&ouml;ffentlichten Version des Fahrtenbuchs oder der in Access im Unternehmen 2\/2003 ver&ouml;ffentlichten Version arbeiten, finden Sie in der neuen Variante eine Funktion zum Import der Daten des bestehenden Fahrtenbuchs.<\/li>\n<h3>Finanzamttauglichkeit<\/h3>\n<p>Die Finanzamttauglichkeit der Anwendung lassen Sie sich am besten vor der Benutzung von Ihrem Finanzamt best&auml;tigen. <\/p>\n<p>Da der letzte eingegebene Datensatz f&uuml;r jedes Fahrzeug storniert werden kann, bedingt dies nat&uuml;rlich eine nachtr&auml;gliche &auml;nderung dieses Datensatzes.<\/p>\n<p>Um den Anforderungen einer finanzamttauglichen Fahrtenbuchanwendung gerecht zu werden und stornierte Datens&auml;tze nach wie vor auszugeben und noch dazu als storniert zu kennzeichnen, gehen Sie folgenderma&szlig;en vor:<\/p>\n<li>Die Tabelle tblFahrten erh&auml;lt ein zus&auml;tzliches Feld namens Storniert mit dem Datentyp Ja\/Nein.<\/li>\n<li>Die Anwendung erh&auml;lt eine neue Tabelle namens frmLetzteFahrt, die den jeweils letzten Fahrtdatensatz f&uuml;r jedes Fahrzeug enth&auml;lt.<\/li>\n<li>Das Formular frmFahrten erh&auml;lt eine zus&auml;tzliche Schaltfl&auml;che zum Stornieren der jeweils letzten Fahrt.<\/li>\n<li>Das Formular zeigt stornierte Fahrten aus Gr&uuml;nden der &uuml;bersicht nicht mehr an.<\/li>\n<li>Der Bericht zur Ausgabe des Fahrtenbuchs f&uuml;r ein Fahrzeug gibt die stornierten Fahrten deutlich als &#8222;storniert&#8220; markiert aus.<\/li>\n<p>M&ouml;glicherweise fragen Sie sich, warum eine neue Tabelle f&uuml;r das Speichern der letzten Fahrt f&uuml;r jedes Fahrzeug herhalten muss und diese nicht direkt in die Tabelle tblFahrten eingetragen wird.<\/p>\n<p>Der Grund ist, dass einmal in die Tabelle tblFahrten eingetragene Fahrten nicht mehr ge&auml;ndert oder gel&ouml;scht werden k&ouml;nnen. Da aber die letzte Fahrt eines jeden Fahrzeugs noch als &#8222;Storniert&#8220; gekennzeichnet werden k&ouml;nnen soll, wird diese in einer separaten Tabelle gespeichert. <\/p>\n<p>Erst wenn der n&auml;chste Fahrtdatensatz f&uuml;r ein Fahrzeug eingegeben wurde, wird der aktuelle letzte Datensatz in die Tabelle tblFahrten geschrieben. <\/p>\n<p>Und wenn der letzte Datensatz storniert werden soll, wird zun&auml;chst dessen Feld Storniert auf den Wert Ja gesetzt, der Datensatz in die Tabelle tblFahrten kopiert und aus der Tabelle tblLetzteFahrt gel&ouml;scht.<\/p>\n<h2>Anpassen der Tabelle tblFahrten<\/h2>\n<p>Beginnen Sie mit dem ersten Schritt, der Anpassung der Tabelle tblFahrten. Das Hinzuf&uuml;gen des zus&auml;tzlichen Feldes stellt keine sonderlich gro&szlig;e H&uuml;rde dar. Der Entwurf der Tabelle sieht anschlie&szlig;end wie in Bild 1 aus.<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    If IstFormularGeoeffnet(\"frmFahrten\") = 0 Or IsNull(Me.OpenArgs) Then\r\n        MsgBox \"Dieses Formular kann nur vom Hauptformular aus ge&ouml;ffnet werden.\", _            vbExclamation + vbOKOnly, \"Fahrtenbuch\"\r\n        Cancel = True\r\n    End If\r\n    Me.txtFahrzeug = Forms!frmFahrten!txtFahrzeug\r\n    Me.txtStartDatum = Date\r\n    Me.txtZielDatum = Date\r\n    If DCount(\"FahrtID\", \"qryFahrten\", \"Kennzeichen = ''\" & Me.txtFahrzeug & \"''\") = 0 _        Then\r\n        Me.txtStartkmStand = DLookup(\"Startkilometerstand\", \"tblFahrzeuge\", _            \"Kennzeichen = ''\" & Me.txtFahrzeug & \"''\")\r\n    Else\r\n        Me.txtStartkmStand = DMax(\"ZielkmStand\", \"qryFahrten\", \"Kennzeichen = ''\" _            & Me.txtFahrzeug & \"'' AND Storniert = False\")\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 1<\/b><\/p>\n<p><IMG height=\"270\" src=\"..\/fileadmin\/_temp_\/{7826140B-8099-4D08-BBAB-D8C08170B184}\/pic001.png\" width=\"286\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1:  Angepasstes Datenmodell der Tabelle tblFahrten<\/span><\/b><\/p>\n<h2>Tabelle zum Speichern der letzten Fahrt<\/h2>\n<p>Die Tabelle tblLetzteFahrt hat die gleichen Felder wie die Tabelle tblFahrten. Der einzige Unterschied ist, dass die Daten der Tabelle nicht vor dem Bearbeiten und L&ouml;schen gesch&uuml;tzt sind.<\/p>\n<h2>Anpassen des Vorgangs zumAnlegen neuer Fahrten<\/h2>\n<p>Neue Fahrten werden in der neuen Fassung des Fahrtenbuchs nicht mehr direkt in die Tabelle tblFahrten geschrieben, sondern zun&auml;chst in der Tabelle tblLetzteFahrt gespeichert. Dementsprechend muss das Formular zum Anlegen neuer Fahrten angepasst werden.<\/p>\n<p>Das beginnt mit der Prozedur, die beim &ouml;ffnen des Formulars gestartet wird und die zur Ermittlung des Zielkilometerstands der alten und damit des Startkilometerstands der neuen Fahrt dient. Die Prozedur sieht nun wie in Quellcode 1 aus. Nach dem Eintragen des aktuellen Fahrzeugs sowie des Start- und Enddatums in das Formular &uuml;berpr&uuml;ft die Prozedur, ob bereits eine Fahrt f&uuml;r das aktuelle Fahrzeug vorhanden ist. Falls nein, wird der Kilometerstand aus der Tabelle tblFahrzeuge bei Aufnahme des Fahrzeugs in das Fahrtenbuch als Startkilometerstand ermittelt. Falls ja, wird der aktuell h&ouml;chste Kilometerstand f&uuml;r das aktuelle Fahrzeug aus der Abfrage qryFahrten ermittelt. Diese Abfrage ist eine Union-Abfrage und enth&auml;lt alle Datens&auml;tze der Tabelle tblLetzteFahrt und der Tabelle tblFahrten, deren Feld Storniert den Wert False hat.<\/p>\n<h2>Speichern einer neuen Fahrt<\/h2>\n<p>Die Prozedur zum Speichern kann aus Platzgr&uuml;nden an dieser Stelle nicht abgedruckt werden. Die dortigen &auml;nderungen beziehen sich auf den Teil, der den neuen Datensatz speichert. In der neuen Version besteht dieser Speichervorgang aus mehreren Schritten:<\/p>\n<li>Kopieren des zuletzt angelegten Datensatzes f&uuml;r dieses Fahrzeug von der Tabelle tblLetzteFahrt in die Tabelle tblFahrten<\/li>\n<li>L&ouml;schen dieses Datensatzes aus der Tabelle tblLetzteFahrt<\/li>\n<li>Anlegen des neuen Datensatzes in der Tabelle tblLetzteFahrt<\/li>\n<pre>Private Sub Form_Open(Cancel As Integer)<\/pre>\n<h2>Datensatzherkunft des Listenfeldes anpassen<\/h2>\n<p>Da die Daten f&uuml;r das Listenfeld zur Anzeige der Fahrten eines Fahrzeuges nunmehr aus zwei Tabellen kommen, m&uuml;ssen Sie nat&uuml;rlich auch die Datensatzherkunft des Listenfeldes anpassen. Da diese per Code beim &ouml;ffnen des Formulars festgelegt wird, setzen Sie den Hebel in der Prozedur an, die beim &ouml;ffnen des Formulars frmFahrten ausgel&ouml;st wird (s. Quellcode 2). Die Datensatzherkunft besteht nicht mehr nur aus Daten der Tabelle tblFahrten. Zus&auml;tzlich kommt noch der Datensatz hinzu, der f&uuml;r das aktuelle Fahrzeug in der Tabelle tblLetzteFahrt gespeichert ist. Dort ist nicht zwangsl&auml;ufig ein Datensatz f&uuml;r das aktuelle Fahrzeug gespeichert, da beispielsweise entweder noch gar kein Datensatz f&uuml;r dieses Fahrzeug angelegt wurde oder der letzte Datensatz dieser Tabelle storniert und damit in die Tabelle tblFahrten verschoben wurde.<\/p>\n<pre>    Dim Kennzeichen As String\r\n    Dim AktuelleFahrtID As Integer\r\n    Dim IstStorno As Boolean\r\n    Kennzeichen = AktuellesFahrzeug\r\n    Me.txtFahrzeug = Kennzeichen\r\n    If DCount(\"FahrzeugID\", \"tblFahrzeuge\") = 0 Then\r\n        Me.cmdNeueFahrt.Enabled = False\r\n    End If\r\n    Me.lstFahrten.RowSource = \"SELECT Kennzeichen, Fahrer, StartDatum, \" _\r\n    & \"StartkmStand, StartOrt, ZielDatum, ZielkmStand, ZielOrt, \" _    & \"[ZielkmStand]-[StartkmStand] AS Strecke, Nutzungsart, Fahrtzweck \" _\r\n    & \"FROM tblFahrten WHERE Kennzeichen = ''\" & Kennzeichen _    & \"'' AND Storniert = False \" _\r\n    & \"UNION \" _\r\n    & \"SELECT Kennzeichen, Fahrer, StartDAtum, StartkmStand, StartOrt, Zieldatum, \" _    & \"ZielkmStand, ZielOrt, [ZielkmStand] - [StartkmStand] AS Strecke, \" _    & \"Nutzungsart, Fahrtzweck FROM tblLetzteFahrt WHERE Kennzeichen = ''\" _    & Kennzeichen & \"''\"\r\n    IstStorno = Nz(DCount(\"FahrtID\", \"tblLetzteFahrt\", \"Kennzeichen = ''\" _    & Kennzeichen & \"''\"), 0)\r\n    Me.cmdStornieren.Enabled = IstStorno\r\nEnd Sub<\/pre>\n<p><b>Quellcode 2<\/b><\/p>\n<p>Au&szlig;erdem enth&auml;lt der erste Teil der UNION-Abfrage, der die Daten der Tabelle tblFahrten enth&auml;lt, nun eine Bedingung, die alle Datens&auml;tze ausschlie&szlig;t, deren Feld Storniert den Wert True enth&auml;lt. Auf diese Weise zeigt das Listenfeld keine stornierten Fahrten an.<\/p>\n<h2>Schaltfl&auml;che zum Stornieren von Fahrten<\/h2>\n<p><!--30percent--><\/p>\n<p>Zum Stornieren von Fahrten legen Sie im Formular frmFahrten eine neue Schaltfl&auml;che mit<br \/>\nder Beschriftung Letzte Fahrt stornieren an (siehe Bild 2).<\/p>\n<p><IMG height=\"249\" src=\"..\/fileadmin\/_temp_\/{7826140B-8099-4D08-BBAB-D8C08170B184}\/pic002.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2:  &uuml;bersicht der Fahrten mit neuer &#8222;Stornieren&#8220;-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che l&ouml;st die Prozedur aus Quellcode 3 aus. Die Prozedur fragt zun&auml;chst den Benutzer, ob er den Datensatz wirklich stornieren m&ouml;chte. Falls ja, f&uuml;hrt die Prozedur folgende Schritte durch:<\/p>\n<li>Ermitteln des letzten Datensatzes f&uuml;r das aktuelle Fahrzeug aus der Tabelle tblLetzteFahrt<\/li>\n<li>&auml;ndern des Feldwertes des Feldes Storniert auf True<\/li>\n<li>Kopieren des Inhalts des kompletten Datensatzes von der Tabelle tblLetzteFahrt in die Tabelle tblFahrten<\/li>\n<li>L&ouml;schen des Datensatzes aus der Tabelle tblLetzteFahrt<\/li>\n<li>Deaktivieren der Schaltfl&auml;che zum Stornieren von Fahrten<\/li>\n<pre>Private Sub cmdStornieren_Click()\r\n  If MsgBox(\"M&ouml;chten Sie die letzte in der Liste angezeigt Fahrt wirklich \" _    & \"stornieren\", vbYesNo + vbExclamation, \"Fahrt stornieren\") = vbYes Then\r\n    Dim strSQL As String\r\n    Dim db As Database\r\n    Dim rst As Recordset\r\n    Dim AktuelleFahrtID As Integer\r\n    Dim IstStorno As Boolean\r\n    Dim Kennzeichen As String\r\n    On Error GoTo cmdStornieren_Click_Err\r\n    Kennzeichen = AktuellesFahrzeug\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(\"SELECT TOP 1 * FROM tblLetzteFahrt WHERE \" _      & \"Kennzeichen = ''\" & Kennzeichen & \"'' ORDER BY FahrtID DESC\", dbOpenDynaset)\r\n    strSQL = \"UPDATE tblLetzteFahrt SET Storniert = TRUE WHERE FahrtID = \" _      & rst!FahrtID\r\n    db.Execute strSQL, dbFailOnError\r\n    strSQL = \"INSERT INTO tblFahrten(Kennzeichen, StartDatum, StartkmStand, \" _      & \"StartOrt, ZielDatum, ZielkmStand, ZielOrt, Fahrer, Nutzungsart, \" _      & \"Fahrtzweck, Bemerkungen, Storniert) SELECT Kennzeichen, StartDatum, \" _      & \"StartkmStand, StartOrt, ZielDatum, ZielkmStand, ZielOrt, Fahrer, \" _      & \"Nutzungsart, Fahrtzweck, Bemerkungen, Storniert FROM tblLetzteFahrt \" _      & \"WHERE FahrtID = \" & rst!FahrtID\r\n    db.Execute strSQL, dbFailOnError\r\n    strSQL = \"DELETE FROM tblLetzteFahrt WHERE FahrtID = \" & rst!FahrtID\r\n    db.Execute strSQL, dbFailOnError\r\n    Me.lstFahrten.Requery\r\n    Me.cmdNeueFahrt.SetFocus\r\n    IstStorno = DCount(\"FahrtID\", \"tblLetzteFahrt\", \"Kennzeichen = ''\" & Kennzeichen _      & \"''\") &gt; 0\r\n    Me.cmdStornieren.Enabled = IstStorno\r\n  End If\r\ncmdStornieren_Click_Exit:\r\n  rst.Close\r\n  Set rst = Nothing\r\n  Set db = Nothing\r\n  Exit Sub\r\ncmdStornieren_Click_Err:\r\n  Debug.Print Err.Number, Err.Description\r\n  GoTo cmdStornieren_Click_Exit\r\nEnd Sub<\/pre>\n<p><b>Quellcode 3<\/b><\/p>\n<li>Aktualisieren des Listenfeldes zur Anzeige von Fahrten<\/li>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, _    PrintCount As Integer)\r\n    If Me!Storniert = True Then\r\n        If Not Nz(Me.Bemerkungen, \"\") = \"\" Then\r\n            Me.Line (0, 415)-(Me.Width, 415), 0\r\n        End If\r\n        Me.Line (0, 125)-(Me.Width, 125), 0\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<h2>Ausgabe des Fahrtenbuchs mit Stornierungen<\/h2>\n<p>Nachdem die Stornierungen in den Formularen sauber eingegeben und angezeigt werden, fehlt noch deren Anzeige im Bericht und damit der f&uuml;r das Finanzamt relevante Ausdruck.<\/p>\n<p>Sie k&ouml;nnten nun nat&uuml;rlich einfach das Feld Storniert hinzuf&uuml;gen, sodass stornierte Datens&auml;tze einfach durch ein H&auml;kchen in diesem Feld als solche markiert werden. Das w&auml;re aber ein wenig zu trivial. Statt dessen werden Sie den Bericht so anpassen, dass die stornierten Fahrten durchgestrichen angezeigt werden (siehe Bild 3).<\/p>\n<p><IMG height=\"268\" src=\"..\/fileadmin\/_temp_\/{7826140B-8099-4D08-BBAB-D8C08170B184}\/pic003.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3:  Das Fahrtenbuch mit einem stornierten Eintrag<\/span><\/b><\/p>\n<p>Um diese Anpassung vorzunehmen, m&uuml;ssen Sie noch nicht einmal in das Layout des Berichts eingreifen. Die Linie zum Durchstreichen des Fahrtenbucheintrags k&ouml;nnen Sie n&auml;mlich ganz einfach mit der Line-Methode in der Prozedur erstellen, die durch die Ereigniseigenschaft Beim Drucken ausgel&ouml;st wird.<\/p>\n<h3>Hinweis<\/h3>\n<p>Die Line-Methode und verschiedene M&ouml;glichkeiten zur Verwendung von Linien und Rechtecken in Berichten finden Sie im Beitrag Malen nach Zahlen in der vorliegenden Ausgabe von Access im Unternehmen.<\/p>\n<p>Genaugenommen ben&ouml;tigen Sie f&uuml;r das Fahrtenbuch unter Umst&auml;nden zwei Linien &#8211; eine zum Durchstreichen der Zeile mit den Fahrtinformationen und eine, falls zu der Fahrt noch eine Bemerkung hinzugef&uuml;gt wurde, die in der Berichtsausgabe unterhalb des entsprechenden Fahrtenbucheintrags erfolgt. Beides erledigt die Prozedur aus Quellcode 4.<\/p>\n<pre>Private Sub cmdImportieren_Click()\r\n    Dim strFehler As String\r\n    If Nz(Dir(Me.txtDatei), \"\") &lt;&gt; \"\" Then\r\n        strFehler = ImportFahrtenbuch(Me.txtDatei)\r\n        MenueleisteAktualisieren\r\n        If Len(strFehler) &gt; 0 Then\r\n            MsgBox strFehler\r\n        Else\r\n            MsgBox \"Der Import war erfolgreich.\"\r\n        End If\r\n        DoCmd.Close acForm, Me.Name\r\n    Else\r\n        MsgBox \"Die angegebene Datei kann nicht \" _            & \"gefunden werden.\"\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Quellcode 4<\/b><\/p>\n<p>Schlie&szlig;lich m&uuml;ssen Sie noch die Prozedur anpassen, die beim &ouml;ffnen des Berichts ausgel&ouml;st wird.<\/p>\n<p>Hier sind jedoch nur zwei Felder zu der SQL-Anweisung hinzuzuf&uuml;gen, die der Bericht als Datenherkunft verwendet. F&uuml;r weitere Einzelheiten konsultieren Sie einfach das entsprechende Klassenmodul des Berichts rptFahrtenbuch.<\/p>\n<h2>Anpassen der Summen im Berichtsfu&szlig;<\/h2>\n<p>Der Bericht enth&auml;lt neben der Auflistung der Fahrten noch die Summe der privaten und beruflichen Fahrten sowie der Fahrten von und zur Arbeitsst&auml;tte. Da der Bericht die stornierten Fahrten immer noch anzeigt, werden diese nat&uuml;rlich auch noch berechnet.<\/p>\n<p>Dadurch enthalten die Summen sowohl die stornierten als auch die nicht stornierten Fahrten. Damit nur die nicht stornierten Fahrten addiert werden, verwenden Sie die folgenden drei Ausdr&uuml;cke f&uuml;r die drei Felder:<\/p>\n<table border=1>\n<tr>\n<td>\n<p><b>Feldname<\/b><\/p>\n<\/td>\n<td>\n<p><b>Steuerelementinhalt<\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>txtStreckePrivatSumme<\/p>\n<\/td>\n<td>\n<p>=Summe(Wenn([Nutzungsart]=&#8220;Privat&#8220;;Wenn([Storniert]=Falsch;[Strecke];0);0))<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>txtStreckeDienstlichSumme<\/p>\n<\/td>\n<td>\n<p>=Summe(Wenn([Nutzungsart]=&#8220;dienstlich&#8220;;Wenn([Storniert]=Falsch;[Strecke];0);0))<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>txtSummeStreckeNichtPrivat<\/p>\n<\/td>\n<td>\n<p>=Summe(Wenn([Nutzungsart]=&#8220;Fahrt von und zur Arbeit&#8220;;Wenn(Storniert=Falsch;[Strecke];0);0))<\/p>\n<\/td>\n<\/tr>\n<\/table>\n<p><b>Tab. 1: Summenfelder im Bericht zur Anzeige des Fahrtenbuchs<\/b><\/p>\n<p>Wenn Sie nun schon eine neue Version des elektronischen Fahrtenbuchs mit &uuml;berarbeiteten und erweiterten Funktionen besitzen, m&ouml;chten Sie vermutlich auch die bestehenden Daten aus der vorherigen Version weiterverwenden.<\/p>\n<p>Um das zu tun, gibt es grob zwei M&ouml;glichkeiten: Bei der ersten nehmen Sie einfach die bestehende Datenbankanwendung und pflegen die hier beschriebenen &auml;nderungen unter Beibehaltung des Datenbestandes ein.<\/p>\n<p>Da aber gegebenenfalls auch Leute mit der Anwendung arbeiten, die zuf&auml;lligerweise kein Access-Entwickler sind, lernen Sie hier einen Weg kennen, &uuml;ber den Sie einfach die vorherige Version des Fahrtenbuchs per Datei &ouml;ffnen-Dialog ausw&auml;hlen und deren Daten automatisch importieren k&ouml;nnen.<\/p>\n<h2>Analyse des Datenmodells<\/h2>\n<p>Vor der Erstellung der Importroutine ist ein Blick auf das Datenmodell des Fahrtenbuchs notwendig. Das Datenmodell sieht ja im Vergleich zu dem herk&ouml;mmlicher relationaler Datenbanken teilweise etwas ungew&ouml;hnlich aus, da beispielsweise die Tabelle tblFahrten in keiner Weise mit anderen Tabellen wie tblFahrer oder tblFahrzeuge verkn&uuml;pft ist. Der Grund liegt &#8211; wer den ersten Beitrag zum Thema Fahrtenbuch kennt, erinnert sich vielleicht &#8211; darin, dass die zu den einzelnen Fahrten gespeicherten Informationen nach dem Anlegen nicht mehr ge&auml;ndert werden d&uuml;rfen.<\/p>\n<p>Eine relationale Beziehung der Fahrtentabelle zur Verkn&uuml;pfung mit anderen Tabellen wie beispielsweise der Fahrer- oder Fahrzeugtabelle w&uuml;rde mit sich bringen, dass sich beispielsweise die Namens&auml;nderung eines Fahrers auch auf die bestehenden Fahrtdaten auswirkt.<\/p>\n<p>Daher werden alle Daten zu einer Fahrt zu dem Zeitpunkt, an dem die Fahrt angelegt wird, komplett in der Tabelle tblFahrten gespeichert und auch nicht mehr ver&auml;ndert.<\/p>\n<p>Die Daten der nicht mit anderen Tabellen verkn&uuml;pften Tabellen k&ouml;nnen ohne Weiteres direkt in die neue Datenbank importiert werden. Bei den verkn&uuml;pften Tabellen ist Vorsicht geboten, da die Prim&auml;rschl&uuml;sselfelder ihren Wert meistens durch die Einstellung des Felddatentyps Autowert erhalten.<\/p>\n<p>Damit die Verkn&uuml;pfungen nach dem Import noch stimmen, m&uuml;ssen Sie also zun&auml;chst die 1-Seite einer 1:n-Beziehung importieren. Erst danach importieren Sie die Daten der n-Seite der Beziehung und verwenden dabei in Fremdschl&uuml;sselfeldern, die auf die zuvor importierten Tabellen verweisen, die beim Import neu angelegten Prim&auml;rschl&uuml;sselwerte.<\/p>\n<p>Beim Datenmodell aus Bild 4 m&uuml;ssen Sie also zun&auml;chst die beiden Tabellen tblTreibstoffarten und tblFahrzeuge und erst anschlie&szlig;end die Tabellen tblTankvorgaenge und tblAusgaben importieren. Die anderen, nicht verkn&uuml;pften Tabellen k&ouml;nnen Sie in beliebiger Reihenfolge importieren.<\/p>\n<p><IMG height=\"409\" src=\"..\/fileadmin\/_temp_\/{7826140B-8099-4D08-BBAB-D8C08170B184}\/pic004.png\" width=\"500\" border=\"0\"><\/p>\n<p><b><\/b><b>Abb. 4: Datenmodell des Fahrtenbuchs<\/b><\/p>\n<h3>Hinweis<\/h3>\n<p>Im Beitrag Von Datenbank zu Datenbank der vorliegenden Ausgabe von Access im Unternehmen finden Sie eine detaillierte Beschreibung des Imports verkn&uuml;pfter Tabellen in eine neue Datenbank. Nachfolgend finden Sie daher nur eine Beschreibung der Aufrufe der in diesem Beitrag vorgestellten Funktionen und der dabei auftretenden Besonderheiten.<\/p>\n<p>Der Import der Daten aus einem anderen Fahrtenbuch wird vom Formular frmImport aus gesteuert. Dieses Formular kann der Benutzer &uuml;ber den Men&uuml;eintrag Datei\/Import &ouml;ffnen.<\/p>\n<p>Dieser Eintrag ist aber deaktiviert, sobald die Datenbank auch nur einen Fahrt-Datensatz enth&auml;lt. Der Grund ist, dass die Integrit&auml;t der Daten nicht mehr gew&auml;hrleistet ist, wenn Sie beispielsweise zweimal die gleichen Daten aus einer anderen Datenbank importieren.<\/p>\n<p>Der Import erfordert lediglich die Angabe des Dateinamens des Fahrtenbuchs, aus dem die Daten importiert werden sollen.<\/p>\n<p>Mit einem Klick auf die Schaltfl&auml;che Import starten Sie schlie&szlig;lich die Prozedur aus Quellcode 4. Die Prozedur &uuml;berpr&uuml;ft zun&auml;chst, ob die angegebene Datei &uuml;berhaupt existiert. Anschlie&szlig;end ruft sie die Funktion ImportFahrtenbuch auf, die den eigentlichen Import durchf&uuml;hrt. Die Funktion gibt gegebenenfalls eine Fehlermeldung zur&uuml;ck, die dann in einem Meldungsfenster ausgegeben wird.<\/p>\n<h2>Import des Fahrtenbuchs<\/h2>\n<p>Der eigentliche Import findet in der Funktion ImportFahrtenbuch statt (s. Quellcode 5). Die Funktion ruft f&uuml;r jede zu importierende Tabelle je einmal die Funktion ImportTable auf, deren Ablauf im Beitrag Von Datenbank zu Datenbank in der vorliegenden Ausgabe von Access im Unternehmen genau erl&auml;utert wird.<\/p>\n<p>Die einzelnen Funktionsaufrufe werden zu einer Transaktion zusammengefasst. Das bedeutet, dass vor der ersten Aktionsabfrage mit der Methode BeginTrans des aktuellen Workspace eine Transaktion gestartet wird, die in Abh&auml;ngigkeit davon, ob alle sechs Aktionsabfragen fehlerfrei durchgef&uuml;hrt werden konnten, nach der letzten Aktionsabfrage entweder mit der Methode CommitTrans abgeschlossen oder mit der Methode Rollback r&uuml;ckg&auml;ngig gemacht wird.<\/p>\n<p><IMG height=\"143\" src=\"..\/fileadmin\/_temp_\/{7826140B-8099-4D08-BBAB-D8C08170B184}\/pic005.png\" width=\"400\" border=\"0\"><\/p>\n<p><b><\/b><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5:  Import der Daten aus einer &auml;lteren Version des Fahrtenbuchs<\/span><\/b><\/p>\n<p>Das bedeutet, dass der komplette Import r&uuml;ckg&auml;ngig gemacht wird, wenn in einer der enthaltenen Aktionen ein Fehler auftritt.<\/p>\n<p>Die einzelnen Aufrufe der Funktion ImportTable bed&uuml;rfen noch der einen oder anderen Erl&auml;uterung. Der erste Aufruf importiert die in der Tabelle tblFahrten enthaltenen Daten.<\/p>\n<pre>Public Function ImportFahrtenbuch(strDatei As String)\r\n  Dim strFehler As String\r\n  Dim wrk As Workspace\r\n  Set wrk = DBEngine.Workspaces(0)\r\n  wrk.BeginTrans\r\n  If ImportTable(strDatei, \"tblFahrten\", \"tblFahrten\", \"tblFahrtenTemp\", _    & \"INSERT INTO tblFahrten(Kennzeichen, StartDatum, StartKmStand, StartOrt, \" _    & \"ZielDatum, ZielkmStand, ZielOrt, Fahrer, Nutzungsart, Fahrtzweck, \" _    & \"Bemerkungen) SELECT Kennzeichen, StartDatum, StartKmStand, StartOrt, \" _    & \"ZielDatum, ZielkmStand, ZielOrt, Fahrer, Nutzungsart, Fahrtzweck, \" _    & \"Bemerkungen FROM tblFahrtenTemp\") = -1 Then\r\n      strFehler = strFehler & \"-Fahrten\" & vbCrLf\r\n  End If\r\n  If ImportTable(strDatei, \"tblFahrer\", \"tblFahrer\", \"tblFahrerTemp\", \"INSERT INTO \" _    & \" tblFahrer(Vorname, Nachname) SELECT Vorname, Nachname FROM tblFahrerTemp \" _    & \"WHERE Vorname & Nachname NOT IN (SELECT Vorname & Nachname FROM tblFahrer)\") _    = -1 Then\r\n    strFehler = strFehler & \"-Fahrer\" & vbCrLf\r\n  End If\r\n  If ImportTable(strDatei, \"tblTreibstoffarten\", \"tblTreibstoffarten\", _    & \"tblTreibstoffartenTemp\", \"INSERT INTO tblTreibstoffarten(Treibstoffart, \" _    & \" TreibstoffartIDTemp) SELECT Treibstoffart, TreibstoffartID FROM \" _    & \"tblTreibstoffartenTemp WHERE Treibstoffart NOT IN (SELECT Treibstoffart \" _    & \"FROM tblTreibstoffarten)\") = -1 Then\r\n    strFehler = strFehler & \"-Treibstoffarten\" & vbCrLf\r\n  End If\r\n  If ImportTable(strDatei, \"tblTreibstoffarten\", \"tblTreibstoffarten\", _    & \"tblTreibstoffartenTemp\", \"UPDATE tblTreibstoffarten AS t1, \" _    & \"tblTreibstoffartenTemp AS t2 SET t1.TreibstoffartIDTemp = \" _    & \"t2.TreibstoffartID WHERE t2.Treibstoffart = t1.Treibstoffart\") Then\r\n    strFehler = strFehler & \"-Treibstoffarten\" & vbCrLf\r\n  End If\r\n  If ImportTable(strDatei, \"tblFahrzeuge\", \"tblFahrzeuge\", \"tblFahrzeugeTemp\", _    & \"INSERT INTO tblFahrzeuge(Kennzeichen, Fahrzeug, StartKilometerstand, \" _    & \"FahrzeugIDTemp) SELECT Kennzeichen, Fahrzeug, StartKilometerstand, \" _    & \"FahrzeugID FROM tblFahrzeugeTemp WHERE Kennzeichen NOT IN (SELECT \" _    & \"Kennzeichen FROM tblFahrzeuge)\") = -1 Then\r\n    strFehler = strFehler & \"-Fahrzeuge\" & vbCrLf\r\n  End If\r\n  If ImportTable(strDatei, \"tblFahrzeuge\", \"tblFahrzeuge\", \"tblFahrzeugeTemp\", _    \"UPDATE tblFahrzeuge AS t1, tblFahrzeugeTemp AS t2 SET t1.FahrzeugIDTemp = \" _    & \"t2.FahrzeugID WHERE t1.Kennzeichen = t2.Kennzeichen\") = -1 Then\r\n    strFehler = strFehler & \"-Fahrzeuge\" & vbCrLf\r\n  End If<\/pre>\n<p><b>Quellcode 5 (Teil 1)<\/b><\/p>\n<p>Da die Tabelle nicht mit anderen Tabellen verkn&uuml;pft ist, k&ouml;nnen die Daten einfach von der Quell- in die Zieltabelle kopiert werden. Weil der gesamte Importvorgang nur gestartet werden kann, wenn die Tabelle tblFahrten in der Zieldatenbank leer ist, k&ouml;nnen hier bei konsistenter Quelltabelle keine Fehler auftreten. Der zweite Aufruf importiert die Fahrer in die Datenbank. Dabei k&ouml;nnen durchaus bereits Fahrer eingegeben worden sein und Fahrer aus einem bestehenden Fahrtenbuch hinzugef&uuml;gt werden. Die INSERT-Abfrage f&uuml;gt n&auml;mlich nur solche Datens&auml;tze ein, die noch nicht in der Zieldatenbank vorhanden sind. Dazu setzt sie Vor- und Nachnamen der Fahrer der Datenbanken zusammen und vergleicht sie miteinander. Bereits vorhandene Fahrer werden einfach nicht importiert.<\/p>\n<p>Auch die Treibstoffarten werden importiert, da ja durchaus in einer &auml;lteren Fahrtenbuchversion seltene Treibstoffarten zur Anwendung gekommen sein k&ouml;nnen. Diese Tabelle ist mit anderen Tabellen verkn&uuml;pft, daher muss hier die TreibstoffartID aus dem alten Fahrtenbuch mitkopiert und in dem Feld TreibstoffartIDTemp gespeichert werden. N&auml;here Informationen hierzu finden Sie in oben genanntem Beitrag Von Datenbank zu Datenbank.<\/p>\n<pre>  If ImportTable(strDatei, \"tblAusgaben\", \"tblAusgaben\", \"tblAusgabenTemp\", _    & \"INSERT INTO tblAusgaben(Ausgabe, Datum, Preis, Bemerkung, FahrzeugID) \" _    & \"SELECT Ausgabe, Datum, Preis, Bemerkung, (SELECT FahrzeugID FROM \" _    & \"tblFahrzeuge AS t2 WHERE t2.FahrzeugIDTemp = t1.FahrzeugID) FROM \" _    & \"tblAusgabenTemp AS t1\") = -1 Then\r\n    strFehler = strFehler & \"-Ausgaben\" & vbCrLf\r\n  End If\r\n  If ImportTable(strDatei, \"tblTankvorgaenge\", \"tblTankvorgaenge\", _    \"tblTankvorgaengeTemp\", \"INSERT INTO tblTankvorgaenge(TreibstoffartID, \" _    & \"Datum, kmStand, FahrzeugID, PreisJeLiter, Liter, Vollgetankt) SELECT \" _    & \"(SELECT TreibstoffartID FROM tblTreibstoffarten AS t2 WHERE \" _    & \"t2.TreibstoffartIDTemp = t1.TreibstoffartID), Datum, kmStand, (SELECT \" _    & \"FahrzeugID FROM tblFahrzeuge AS t3 WHERE t3.FahrzeugIDTemp = \" _    & \"t1.FahrzeugID), PreisJeLiter, Liter, Vollgetankt FROM tblTankvorgaengeTemp \" _    & \"AS t1\") = -1 Then\r\n    strFehler = strFehler & \"-Tankvorg&auml;nge\" & vbCrLf\r\n  End If\r\n  If Len(strFehler) &gt; 0 Then\r\n    ImportFahrtenbuch = \"Beim Import folgender Daten sind Fehler aufgetreten:\" _      & vbCrLf & strFehler & vbCrLf & \"Der Import wurde nicht durchgef&uuml;hrt.\"\r\n    wrk.Rollback\r\n  Else\r\n    ImportFahrtenbuch = \"\"\r\n    wrk.CommitTrans\r\n  End If\r\nEnd Function<\/pre>\n<p><b>Quellcode 5 (Fortsetzung)<\/b><\/p>\n<p>Nun kann es vorkommen, dass zwar alle Treibstoffarten des alten Fahrtenbuchs schon in der neuen Datenbank enthalten sind.<\/p>\n<p>Da deren Prim&auml;rindexfeld aber unter Umst&auml;nden andere Werte enth&auml;lt als das Prim&auml;rindexfeld des alten Fahrtenbuchs, m&uuml;ssen die Werte des Prim&auml;rindexfeldes des alten Fahrtenbuchs dennoch in das Feld TreibstoffartIDTemp der Tabelle tblTreibstoffarten des neuen Fahrtenbuchs eingef&uuml;gt werden, damit nachfolgend importierte Datens&auml;tze der Tabelle tblTankvorgaenge auch anhand der im Feld TreibstoffartIDTemp gespeicherten Werte an die Prim&auml;rindexwerte der neuen Tabelle angepasst werden k&ouml;nnen. Das h&ouml;rt sich kompliziert an, deshalb noch einmal in Einzelschritten:<\/p>\n<p>Sie importieren Daten der Tabellen tblTankvorgaenge und tblTreibstoffarten. Die Daten der beiden Tabellen sind &uuml;ber das Fremdschl&uuml;sselfeld TreibstoffartID der Tabelle tblTankvorgaenge miteinander verkn&uuml;pft.<\/p>\n<p>Die Treibstoffarten haben in der neuen Datenbank unter Umst&auml;nden andere Werte f&uuml;r das Feld TreibstoffartID als in der alten Datenbank.<\/p>\n<p>Daher m&uuml;ssen beim Import der Tankvorg&auml;nge die Werte des Fremdschl&uuml;sselfeldes TreibstoffartID der Tabelle tblTankvorgaenge an die nun anders lautenden Werte der Tabelle tblTreibstoffarten angepasst werden.<\/p>\n<p>Dazu speichern Sie beim Import der Tabelle tblTreibstoffarten die Werte des Feldes TreibstoffartID aus der alten Tabelle in dem Feld TreibstoffartIDTemp der entsprechenden Datens&auml;tze der neuen Tabelle.<\/p>\n<p>Beim Importieren schauen Sie dann, dass der Wert des Fremdschl&uuml;sselfeldes TreibstoffartID der Tabelle tblTankvorgaenge auf den Wert des gleichnamigen Feldes der Tabelle tblTreibstoffarten eingestellt wird, dessen Feld TreibstoffartIDTemp den Wert des Fremdschl&uuml;sselfeldes des gleichen Datensatzes in der Herkunftstabelle hat.<\/p>\n<p>Wenn Sie das verstanden haben, durchschauen Sie auch die nachfolgenden Aktionsabfragen der Prozedur ImportFahrtenbuch.<\/p>\n<p>Falls nicht, schicken Sie eine E-Mail an info@access-im-unternehmen.de, dort wird dann bei ausreichendem Interesse eine ausf&uuml;hrlichere Erl&auml;uterung dieser nicht ganz einfachen Vorgehensweise ver&ouml;ffentlicht.<\/p>\n<p>Nachfolgend finden Sie zwei weitere kleinere Anpassungen des Fahrtenbuchs.<\/p>\n<h2>Drucken-Dialog unterbinden<\/h2>\n<p>Der beim Anzeigen der Berichtsvorschau angezeigte Drucken-Dialog sollte dem Anwender eigentlich einen Schritt abnehmen. Access zeigt diesen Dialog allerdings immer so an, dass der Benutzer zur gleichen Zeit keine anderen Aktionen durchf&uuml;hren kann &#8211; der Benutzer kann also beispielsweise nicht die Gr&ouml;&szlig;e der Berichtsvorschau anpassen, um einen genaueren Blick darauf zu werfen. Damit Access den Drucken-Dialog nicht mehr anzeigt, entfernen Sie einfach die folgende Anweisung aus den drei Prozeduren, die beim Anzeigen der Berichtsvorschau ausgel&ouml;st werden:<\/p>\n<pre>RunCommand acCmdPrint<\/pre>\n<h2>Korrekte Anzeige derVerbrauchsdaten<\/h2>\n<p>Die Anzeige der Tankvorg&auml;nge enth&auml;lt unter anderem die Anzeige von Verbrauchsdaten zwischen zwei Vollbetankungen. Wenn die erste Vollbetankung nicht im ersten Tankvorgang-Datensatz erfolgte, zeigen das Formular frmVerbrauchsdaten und auch der Bericht repTankinformationen den Ausdruck #Fehler an. Um die Anzeige dieses Ausdrucks zu umgehen, sind lediglich zwei kleine &auml;nderungen an dem Steuerelementinhalt der jeweiligen Felder erforderlich. Der bisher im Formular frmVerbrauchsdaten angegebene Ausdruck f&uuml;r den Steuerelementeninhalt lautete folgenderma&szlig;en:<\/p>\n<pre>=Wenn([kmstand] Ist Null;Null;[Verbrauch])<\/pre>\n<p>Ersetzen Sie diesen Ausdruck durch den folgenden:<\/p>\n<pre>=Wenn([kmstand] Ist Null;Null;Wenn(IsError([Verbrauch]);Null;[Verbrauch]))<\/pre>\n<p>Die IsError-Funktion &uuml;berpr&uuml;ft, ob der als Parameter angegebene Ausdruck einen fehlerhaften Wert enth&auml;lt und zeigt in dem Fall den im zweiten Parameter der Wenn-Funktion angegebenen Wert an.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei der Arbeit mit Computeranwendungen treten zwangsl&auml;ufig Eingabefehler auf und es gibt keine Validierung, die hundertprozentig vor nicht gew&uuml;nschten Eingaben sch&uuml;tzt. So auch beim Fahrtenbuch, das in Ausgabe 2\/2003 von Access im Unternehmen vorgestellt wurde: Man kann einmal eingegebene Fahrten nicht mehr stornieren, und somit mussten die Daten noch einmal neu eingegeben werden. Um dieses Manko zu beheben, lernen Sie im vorliegenden Beitrag einige Erweiterungen f&uuml;r das Fahrtenbuch kennen.<\/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":[662004,66032004,44000027],"tags":[],"class_list":["post-55000219","post","type-post","status-publish","format-standard","hentry","category-662004","category-66032004","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Fahrtenbuch mit Import- und Stornierungsfunktion - 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\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fahrtenbuch mit Import- und Stornierungsfunktion\" \/>\n<meta property=\"og:description\" content=\"Bei der Arbeit mit Computeranwendungen treten zwangsl&auml;ufig Eingabefehler auf und es gibt keine Validierung, die hundertprozentig vor nicht gew&uuml;nschten Eingaben sch&uuml;tzt. So auch beim Fahrtenbuch, das in Ausgabe 2\/2003 von Access im Unternehmen vorgestellt wurde: Man kann einmal eingegebene Fahrten nicht mehr stornieren, und somit mussten die Daten noch einmal neu eingegeben werden. Um dieses Manko zu beheben, lernen Sie im vorliegenden Beitrag einige Erweiterungen f&uuml;r das Fahrtenbuch kennen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:17:45+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Fahrtenbuch mit Import- und Stornierungsfunktion\",\"datePublished\":\"2020-05-06T15:17:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/\"},\"wordCount\":3560,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/57f66908c2d14dfca8aa63234a2f2670\",\"articleSection\":[\"2004\",\"3\\\/2004\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/\",\"name\":\"Fahrtenbuch mit Import- und Stornierungsfunktion - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/57f66908c2d14dfca8aa63234a2f2670\",\"datePublished\":\"2020-05-06T15:17:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/57f66908c2d14dfca8aa63234a2f2670\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/57f66908c2d14dfca8aa63234a2f2670\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fahrtenbuch mit Import- und Stornierungsfunktion\"}]},{\"@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":"Fahrtenbuch mit Import- und Stornierungsfunktion - 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\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/","og_locale":"de_DE","og_type":"article","og_title":"Fahrtenbuch mit Import- und Stornierungsfunktion","og_description":"Bei der Arbeit mit Computeranwendungen treten zwangsl&auml;ufig Eingabefehler auf und es gibt keine Validierung, die hundertprozentig vor nicht gew&uuml;nschten Eingaben sch&uuml;tzt. So auch beim Fahrtenbuch, das in Ausgabe 2\/2003 von Access im Unternehmen vorgestellt wurde: Man kann einmal eingegebene Fahrten nicht mehr stornieren, und somit mussten die Daten noch einmal neu eingegeben werden. Um dieses Manko zu beheben, lernen Sie im vorliegenden Beitrag einige Erweiterungen f&uuml;r das Fahrtenbuch kennen.","og_url":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:17:45+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Fahrtenbuch mit Import- und Stornierungsfunktion","datePublished":"2020-05-06T15:17:45+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/"},"wordCount":3560,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670","articleSection":["2004","3\/2004","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/","url":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/","name":"Fahrtenbuch mit Import- und Stornierungsfunktion - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670","datePublished":"2020-05-06T15:17:45+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/57f66908c2d14dfca8aa63234a2f2670"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Fahrtenbuch_mit_Import_und_Stornierungsfunktion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Fahrtenbuch mit Import- und Stornierungsfunktion"}]},{"@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\/55000219","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=55000219"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000219\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}