Export von Daten in das DATEV-Format

Um Daten Ihrer eigenen Software so zu exportieren, dass Ihr Steuerberater diese in das DATEV-System einlesen kann, benötigen Sie gar nicht mal so viel Know-how. Die wesentlichen Informationen finden wir auf der Webseite von DATEV. Dieser Beitrag zeigt, wie Sie Daten im DATEV-Format exportieren und was dabei zu beachten ist. Die so entstandene Datei kann der Steuerberater dann per Importfunktion in das DATEV Rechnungswesen einlesen.

Die grundlegenden Informationen finden Sie in der öffentlich verfügbaren Webseite unter folgender Adresse:

https://developer.datev.de/portal/de/dtvf

Dieser Beitrag beschränkt sich auf die Zusammenstellung einer Datei mit den Header-Daten und Daten im Format Buchungsstapel.

Grundlegender Aufbau einer DATEV-Datei

Die DATEV-Datei enthält immer eine Zeile mit Daten im Format Header. Danach folgt eine Zeile mit den Spaltenüberschriften für die Buchungsdaten und schließlich eine oder mehrere Zeilen mit den eigentlichen Buchungsdaten.

Verschiedene Formate

Das DATEV-Format besteht aus verschiedenen Formatbeschreibungen. Verschiedene deshalb, weil es verschiedenartige Informationen gibt, die Sie damit beschreiben können. Wir wollen uns auf die wesentlichen Elemente beschränken – die übrigen können Sie mit dem Know-how aus diesem Beitrag und der Dokumentation dann leicht selbst realisieren.

Es gibt die folgenden Formatsätze:

  • Header: Erste Zeile der CSV-Datei mit den Informationen zur Verarbeitung der Datei
  • Buchungsstapel: Enthält die eigentlichen Buchungen, in der Regel für einen bestimmten Zeitraum je Datei, zum Beispiel monatlich.
  • Weitere Formatsätze, die dieser Beitrag nicht behandelt: Wiederkehrende Buchungen, Debitoren/Kreditoren, Sachkontenbeschriftungen, Zahlungsbedingungen und Diverse Adressen.

Zusammenstellen der Header-Zeile

Die Beschreibung des Satzaufbaus für die Header-Zeile finden Sie hier:

https://developer.datev.de/portal/de/dtvf/formate/header

Die Tabelle auf dieser Seite enthält die Überschriften und die Beschreibung der möglichen Werte als regulärer Ausdruck.

Eine Header-Zeile sieht beispielsweise wie folgt aus:

"EXTF";700;21;"Buchungsstapel";12;20211007000000000;4;"Bu-
chungen_Konto1";1;"EUR"

Dabei entsprechen die einzelnen Elemente diesen Feldern:

  • Kennzeichen: EXTF oder DTVF (hier EXTF für Export aus einer 3rd-Party-Anwendung)
  • Versionsnummer: aktuell 700 (dient der Sicherstellung von Abwärtskompatibilität)
  • Formatkategorie: Gibt an, in welchem Format die folgenden Daten sind (im Falle des Buchungsstapels, mit dem wir uns hier beschäftigen, nutzen wir den Wert 21)
  • Formatname: Name des Formats, hier Buchungsstapel
  • Formatversion: Auch hier kommt ein Zahlenwert für Buchungsstapel zum Einsatz, in diesem Fall 12.
  • Erzeugt am: Datum, an dem die Datei erzeugt wurde, im Format YYYYMMDDHHMMSSFFF.

Es gibt noch einige weitere Felder, die wir weiter unten berücksichtigen.

Tabelle für Headerdaten

Wie speichern wir die Headerdaten am einfachsten Wenn sie aus ihrer selbstprogrammierten Buchhaltungsdatenbank die Buchungsdaten für den Import in die DATEV-Software Ihres Steuerberaters exportieren wollen, werden Sie das regelmäßig erledigen – beispielsweise monatlich oder einmal je Quartal.

Die Felder des Headers enthalten Daten, die wir über eine Tabelle namens tblHeader erfassen (Entwurf siehe Bild 1). Diese enthält nicht genau die Felder, die in der Header-Datei gespeichert werden sollen. Die Felder ID und Referenzbezeichnung sind das Primärschüsselfeld sowie ein Feld für eine interne Bezeichnung, zum Beispiel Export 12/2021. Die übrigen Felder nehmen meist direkt die benötigten Daten auf, einige jedoch sind Fremdschlüsselfelder, welche zur Auswahl von Daten aus Lookuptabellen dienen.

Entwurf der Tabelle tblHeader

Bild 1: Entwurf der Tabelle tblHeader

Diese Lookuptabellen stellen wir in Bild 2 übersichtlich dar.

Übersicht des Datenmodells

Bild 2: Übersicht des Datenmodells

Die Beziehungen zwischen der Tabelle tblHeader und den übrigen Tabellen haben wir jeweils als Nachschlage-feld definiert.

Formular zur Eingabe der Headerdaten

Damit der Benutzer die Headerdaten einfach eingeben kann, haben wir dazu ein eigenes Formular bereitgestellt. Dieses heißt frmHeader und verwendet die Tabelle tblHeader als Datensatzquelle. Wir haben alle Felder der Tabelle aus der Feldliste in den Formularentwurf gezogen, die in der Dokumentation nicht als Leerfeld gekennzeichnet sind (siehe Bild 3).

Entwurf des Formulars zum Eingeben der Headerdaten

Bild 3: Entwurf des Formulars zum Eingeben der Headerdaten

Hier sehen Sie bereits, dass die Felder, für die wir Lookuptabellen angelegt haben, auch im Formularentwurf als Nachschlagefelder angelegt werden.

Nach dem Wechsel in die Formularansicht können Sie die Daten direkt in das Formular eingeben beziehungsweise mit den Nachschlagefeldern auswählen (siehe Bild 4).

Eingabe der Headerdaten

Bild 4: Eingabe der Headerdaten

Nachdem wir diese Eingabemöglichkeit geschaffen haben, wollen wir daraus noch die Headerdatei exportieren. Dazu sehen wir eine Schaltfläche namens cmdHeaderdateiErzeugen vor, die wir unten im Formular platzieren.

Diese Schaltfläche ruft die Prozedur aus Listing 1 auf.

Private Sub cmdHeaderdateiErzeugen_Click()
     Dim strHeader As String
     Dim strDateiname As String
     strDateiname = CurrentProject.Path & "\DTVF_" & Me!Dateiname & ".csv"
     On Error Resume Next
     Kill strDateiname
     On Error GoTo 0
     strHeader = strHeader & """" & Me!Kennzeichen & """;"
     strHeader = strHeader & Me!Versionsnummer & ";"
     strHeader = strHeader & Me!FormatkategorieID & ";"
     strHeader = strHeader & DLookup("Formatversion", "tblFormatversionen", "FormatversionID = " & Me!Formatversion) & ";"
     strHeader = strHeader & Me!Formatversion & ";"
     strHeader = strHeader & Format(Me!ErzeugtAm, "YYYYMMDDHHNNSS000") & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & Me!Beraternummer & ";"
     strHeader = strHeader & Me!Mandantennummer & ";"
     strHeader = strHeader & Format(Me!Wirtschaftsjahresbeginn, "YYYYMMDD") & ";"
     strHeader = strHeader & Me!Sachkontenlaenge & ";"
     strHeader = strHeader & Format(Me!DatumVon, "YYYYMMDD") & ";"
     strHeader = strHeader & Format(Me!DatumBis, "YYYYMMDD") & ";"
     strHeader = strHeader & Me!Bezeichnung & ";"
     strHeader = strHeader & Me!Diktatkuerzel & ";"
     strHeader = strHeader & Me!Buchungstyp & ";"
     strHeader = strHeader & Me!Rechnungslegungszweck & ";"
     strHeader = strHeader & Me!Festschreibung & ";"
     strHeader = strHeader & Me!Waehrungskennzeichen & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & Me!Sachkontenrahmen & ";"
     strHeader = strHeader & Me!IDDerBranchenLoesung & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & ";"
     strHeader = strHeader & Me!Anwendungsinformationen
     Open strDateiname For Append As #1
     Print #1, strHeader
     Close #1
End Sub

Listing 1: Prozedur zum Erzeugen der Headerdatei

Die Prozedur deklariert zwei Variablen, von denen eine die zu speichernde Headerzeile aufnimmt und die andere den Dateinamen.

Den Dateinamen setzt die Prozedur aus dem Pfad der aktuellen Datenbankdatei, dem Präfix DTVF_, dem Inhalt des Feldes Dateiname und der Dateiendung .csv zusammen.

Bevor wir richtig loslegen, löscht die Prozedur eine eventuell bereits vorhandene Datei mit dem Namen aus strDateiname. Dabei deaktivieren wir die eingebaute Fehlerbehandlung, da die Kill-Anweisung beim Fehlen der angegebenen Datei einen Fehler auslöst.

Die folgenden Zeilen setzen den Inhalt der Headerdatei zusammen.

Dabei sind folgende Besonderheiten zu beachten (in allen anderen Fällen landet einfach der eingegebene Wert zwischen zwei Semikola):

  • Das Kennzeichen wird in Anführungszeichen eingefasst.
  • Den Wert des Feldes Formatname lesen wir aus der Lookuptabelle tblFormatversionen ein.
  • Den Wert für das Feld Erzeugt am formatieren wir im Format YYYYMMDDHHNNSS000.
  • Den Wert für das Feld Wirtschaftsjahresbeginn formatieren wir mit dem Format YYYYMMDD.
  • Die Werte für die Felder Datum von und Datum bis formatieren wir ebenfalls mit YYYYMMDD.

Anschließend öffnen wir mit Open eine Datei mit dem Namen aus strDateiname und schreiben mit der Print-Anweisung den Inhalt der Variablen strHeader in die Datei, bevor wir diese mit der Close-Anweisung wieder schließen.

Das Ergebnis sieht für unser Beispiel wie folgt aus:

"EXTF";700;21;Buchungsstapel;12;20211206000000000;;;;;1234567;12345;20210101;4;20211101;20211130;Export 11/2021;AM;1;0;1;EUR;;;;;03;;;;

Damit können wir nun einen Schritt weitergehen – und das Ergebnis mit einem speziell für diesen Zweck vorgesehenen Tool prüfen. Wie das gelingt, erfahren Sie im nächsten Schritt.

Datei im DATEV-Format prüfen

Unter dem folgenden Link finden Sie ein Tool zum Prüfen der Daten im DATEV-Format:

https://developer.datev.de/portal/de/dtvf/tools

Mit diesem können Sie die erstellte Datei öffnen und prüfen. Das Tool zeigt dann an, welche Elemente fehlen oder das falsche Format haben. Es ist daher sehr hilfreich, den Export initial auf Basis von Daten aus der Datenbank zu programmieren und gleich zu testen.

Um die soeben erstellte Headerdatei zu prüfen, wählen Sie im Prüfprogramm den Menübefehl Datei|Öffnen aus.

Im nun erscheinenden Dialog Datev Format Datei öffnen wählen Sie die soeben erstellte Datei aus und bestätigen die Auswahl mit der Schaltfläche Öffnen.

Bild 5 zeigt das Ergebnis für die Eingaben aus dem Beispiel von oben. Hier sehen Sie, dass alle Eingaben korrekt sind. Wäre dies nicht der Fall, würden Sie in der Spalte Meldung hilfreiche Informationen finden, mit denen Sie den Export schnell anpassen und funktionstüchtig machen könnten.

Prüfung des Headers

Bild 5: Prüfung des Headers

Export der Buchungsdaten programmieren

Der Export der Buchungsdaten ist grundsätzlich aufwändiger, weil eine Zeile viel mehr Informationen enthalten kann als die Headerzeile, aber wir reduzieren die auszugebenden Daten auf einige wenige Pflichtdaten.

Als Erstes legen wir wieder eine Tabelle an, welche die zu exportierenden Daten enthält. Diese nennen wir tblBuchungsstapel. Die Tabelle sieht im Entwurf wie in Bild 6 aus.

Entwurf der Tabelle zum Speichern der Buchungsdaten

Bild 6: Entwurf der Tabelle zum Speichern der Buchungsdaten

In der Datenblattansicht zeigt die Tabelle tblBuchungsstapel ihre Daten wie in Bild 7 an. Diese wollen wir nun in geeigneten Formularen anzeigen.

Beispieldaten in der Tabelle tblBuchungsstapel

Bild 7: Beispieldaten in der Tabelle tblBuchungsstapel

Formulare für die Eingabe und den Export der Buchungssätze

Die Headerdaten und die Buchungsdaten sind nicht miteinander verknüpft. Die Buchungsdaten werden aber über das Datum der jeweiligen Headerdatei zugeordnet, sprich: Mit einem Header werden alle Buchungen exportiert, die innerhalb der Datumsangaben der Felder DatumVon und DatumBis liegen.

Wir wollen in dem Formular, mit dem wir den Export steuern wollen, ein Kombinationsfeld zur Auswahl eines Headers anbieten, über das der Benutzer die zu exportierenden Buchungsdatensätze filtern kann.

Ein Unterformular soll die Datensätze der Tabelle tblBuchungsstapel anzeigen, die zu dem Datumsbereich des selektierten Headers passen. Der Entwurf dieser beiden Formulare sieht wie in Bild 8 aus.

Entwurf des Formulars zum Steuern des Datev-Exports

Bild 8: Entwurf des Formulars zum Steuern des Datev-Exports

Das Kombinationsfeld cboHeader verwendet die folgende UNION-Abfrage als Datensatzherkunft:

SELECT 0 AS ID, ''Alle anzeigen'' AS Dateiname 
FROM tblHeader
UNION
SELECT tblHeader.ID, tblHeader.Dateiname
FROM tblHeader;

Dadurch zeigt das Kombinationsfeld den Eintrag Alle anzeigen sowie die Werte des Feldes Dateiname der Tabelle tblHeader an (siehe Bild 9).

Auswahl des Headers

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar