Automatischer Export von Sachkontenbeschriftungen, Stammdaten und Buchungen
Hinweis
Dieses Feature ist erst ab BC 14 AL verfügbar.
Mit dem automatischen Export lässt sich der Export der SIEVERS DATEV Schnittstelle über eine einzurichtende Aufgabenwarteschlange automatisieren. So können die Dateien im Hintergrund über eine Datumsformel zu einem bestimmten Zeitpunkt erzeugt werden, durch ein Event abgegriffen und durch eine individuell durchzuführende Programmierung am gewünschten Speicherort des Kunden abgelegt werden.
Hinweis
Dieses Feature kann nicht genutzt werden, wenn die App SIEVERS DATEV Buchungsdatenservice installiert ist, da hier bei jedem Export eine Authentifizierung bei der DATEV stattfinden muss. Das kann nicht automatisiert werden.
Erstellung einer Applikation mit Verknüpfung zur SIEVERS DATEV Schnittstelle
Zunächst muss eine neue Applikation erzeugt werden, die eine Verknüpfung zur SIEVERS DATEV Schnittstelle hat. Mit dieser können, nach einem erfolgreichen Export, die Dateien abgegriffen und an einem selbst zu wählenden Speicherort abgelegt werden. Die Ausprogrammierung des vorgegebenen Events obliegt alleinig dem Partner, da es hier unterschiedlichste Kundenanforderungen geben kann.
Erzeugen Sie eine neue Business Central Applikation mit der Abhängigkeit zur SIEVERS DATEV Schnittstelle. Beispielhaft wird hier die Major Version BC 14 verwendet. Es muss zwingend die Schnittstellenversion größer gleich .96 der SIEVERS DATEV Schnittstelle verwendet werden, da hier die Implementierung für den automatischen Export erstmalig eingeführt wurde.
"dependencies": [
{
"appId": "0672b665-308b-4613-bc5e-c7e865740d11",
"name": "SIEVERS DATEV",
"publisher": "SIEVERS-GROUP",
"version": "14.53.1.96"
}
],
Erzeugen Sie danach eine Codeunit mit dem nachfolgend gezeigten Event Subscriber. Dieser ist bereits so weit vorbereitet, dass Sie nach einem erfolgreichen Export die erzeugten Exportdateien in der Schleife abgreifen können. Es wird die Standard-Tabelle Name/Value Buffer verwendet.
Das Feld Name enthält den Dateinamen und das Feld Value BLOB die Exportdatei.
Diese können dann frei dort abgelegt werden, wo es Ihr Kunde wünscht.
codeunit 50100 "DATEV Export Job"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SIEVERS DATEV Automatic Export Mgt", 'OnAfterRunDATEVExportJob', '', false, false)]
local procedure OnAfterRunDATEVExportJob(
DATEVSetupNo: Code[10];
FromPostingDate: Date;
ToPostingDate: Date;
var TempDATEVNameValueBuffer: Record "Name/Value Buffer" temporary
)
begin
if TempDATEVNameValueBuffer.FindSet() then
repeat
// Do something with the file.
until TempDATEVNameValueBuffer.Next() = 0;
end;
}
Einrichtung der Aufgabenwarteschlange für den automatischen Export
Zunächst muss eine DATEV Einrichtung, die für den automatischen Export vorgesehen ist, angelegt werden. Hier muss z.B. eingerichtet werden, welche Exportdateien erzeugt werden sollen. Die Felder von und bis Buchungsdatum werden durch die Aufgabenwarteschlange gesetzt, so dass die Sachposten der vorgegebenen Periode automatisch gefiltert und exportiert werden.
Die Aufgabenwarteschlange kann in der DATEV Einrichtung aufgerufen werden.
Hinweis
Dieser Button ist nur sichtbar, wenn die App SIEVERS DATEV Buchungsdatenservice nicht installiert ist.

Wurde noch keine Applikation mit der Abhängigkeit zur SIEVERS DATEV Schnittstelle und dem Event zum Abgreifen der Exportdateien erzeugt, wird folgender Hinweis ausgegeben:

Dieser Text kann, identisch zum Kapitel Erstellung einer Applikation mit Verknüpfung zur SIEVERS DATEV Schnittstelle kopiert werden und auf dieser Basis die Applikation erstellt werden.
Ist die Applikation erfolgreich erstellt und installiert worden und das Event wird durch die SIEVERS Schnittstelle erkannt, dann wird der Aufgabenwarteschlangenposten erzeugt und angezeigt.

Der Posten wurde bereits voreingestellt und kann über die Datumsformel noch nach eigenen Wünschen angepasst werden.
Parameterzeichenfolge:: Die Nr. der DATEV Einrichtung. So wird bei einem Durchlauf der Warteschlange automatisch die gewählte DATEV Schnittstelleneinrichtung ermittelt.
Frühestes Startdatum: Dient als Filter für das Feld Von Belegdatum in der DATEV Einrichtung.
Datumsformel für nächsten Ausführung: Mit 1M für 1 Monat vorbelegt, aber frei einrichtbar. Füllt das Bis Belegdatum der DATEV Einrichtung, so dass die Sachposten für diese Periode gefiltert werden.
Der Export wird ausgeführt und bei einem fehlerfreien Durchlauf wird das Event OnAfterRunDATEVExportJob angestoßen, so dass die Exportdateien über den Event Subscriber abgegriffen werden können.
Nach einem erfolgreichen Durchlauf stellt die Aufgabenwarteschlange den frühesten Startzeitpunkt automatisch auf das nächste Datum, welches sich durch die Datumsformel ergibt.
Regelmäßige Prüfung der Protokolleinträge
Die Aufgabenwarteschlange erzeugt bei einem Durchlauf Protokolleinträge. Diese müssen regelmäßig gemonitored werden, damit ein Eingriff im Fehlerfall möglich ist.
Das Beispiel im folgenden Screenshot zeigt, dass der DATEV Export eine Ersatzdebitornr. erwartet, die in der DATEV Einrichtung nicht gepflegt wurde. Dadurch kommt es zu einem Fehler und der Export bricht ab.
Nach Korrektur der Einrichtung und Neustart der Aufgabenwarteschlange konnte der Export erfolgreich ausgeführt werden.

Überprüfung der Dateien beim Durchlauf der Warteschlange
Um im ersten Entwicklungsschritt der Speicherung der Dateien zu prüfen, ob die Exportdateien korrekt im Event Subscriber ankommen, kann ein Error eingefügt werden. Beispielsweise so:
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SIEVERS DATEV Automatic Export Mgt", 'OnAfterRunDATEVExportJob', '', false, false)]
local procedure OnAfterRunDATEVExportJob(
DATEVSetupNo: Code[10];
FromPostingDate: Date;
ToPostingDate: Date;
var TempDATEVNameValueBuffer: Record "Name/Value Buffer" temporary
)
var
FileCounter: Integer;
FileName1: Text;
FileName2: Text;
FileName3: Text;
FileLength1: Decimal;
FileLength2: Decimal;
FileLength3: Decimal;
Counter: Integer;
begin
FileCounter := TempDATEVNameValueBuffer.Count();
if TempDATEVNameValueBuffer.FindSet() then
repeat
// Do something with the file.
// Max. three files.
Counter += 1;
TempDATEVNameValueBuffer.CalcFields("Value BLOB");
case Counter of
1:
begin
FileName1 := TempDATEVNameValueBuffer.Name;
FileLength1 := TempDATEVNameValueBuffer."Value BLOB".Length();
end;
2:
begin
FileName2 := TempDATEVNameValueBuffer.Name;
FileLength2 := TempDATEVNameValueBuffer."Value BLOB".Length();
end;
3:
begin
FileName3 := TempDATEVNameValueBuffer.Name;
FileLength3 := TempDATEVNameValueBuffer."Value BLOB".Length();
end;
end;
until TempDATEVNameValueBuffer.Next() = 0;
Error(
'File Counter: %1, Name of file 1: %2, File 1 Length: %3, Name of file 2: %4, File 2 Length: %5, Name of file 3: %6, File 3 Length: %7',
FileCounter,
FileName1,
FileLength1,
FileName2,
FileLength2,
FileName3,
FileLength3
);
end;
Wird nun die Aufgabenwarteschlange ausgeführt und läuft der Export erfolgreich durch, dann wird der Fehler geworfen und im Protokoll der Aufgabenwarteschlange angezeigt.

Es sollten die drei Dateien für die Sachpostenbeschriftungen, die Stammdaten und die Buchungen exportiert werden. Alle drei Dateien müssen eine Länge größer 0 haben, dann war der Export erfolgreich. Diese Dateien können dann weiterverarbeitet werden und an dem gewünschten Ablageort abgelegt werden.
Alternativer Aufruf des DATEV Exports ohne vorgegebene Aufgabenwarteschlange
Falls Sie die Aufgabenwarteschlange nicht verwenden wollen, den Export aber trotzdem im Hintergrund ausführen wollen, dann verwenden Sie folgende Funktion und folgende zwei Events in Ihrer Applikation mit Verknüpfung zur SIEVERS DATEV Schnittstelle.
local procedure StartDATEVExport()
var
SNCDatevSetup: Record "SIEVERS DATEV Setup";
TempDATEVNameValueBuffer: Record "Name/Value Buffer" temporary;
SNCDATEVAutomaticExportMgt: Codeunit "SIEVERS DATEV Automatic Export Mgt";
FromPostingDate: Date;
ToPostingDate: Date;
begin
SNCDatevSetup.Get('DTV');
FromPostingDate := DMY2Date(01, 01, 2024);
ToPostingDate := DMY2Date(31, 01, 2024);
if SNCDATEVAutomaticExportMgt.SetDATEVSetupAndRunExport(
SNCDatevSetup."No.",
FromPostingDate,
ToPostingDate,
TempDATEVNameValueBuffer
)
then
if TempDATEVNameValueBuffer.FindSet() then
repeat
// Do something with the file.
until TempDATEVNameValueBuffer.Next() = 0;
end;
Mit dieser Funktion wird die benötigte DATEV Einrichtung ermittelt und der DATEV Export ausgeführt.
Hier müssen Sie die korrekte Nr. der DATEV Einrichtung eintragen. Über diese Einrichtung wird der Export später ausgeführt. Diese muss korrekt eingerichtet sein.
Der Exportzeitraum muss über die Variablen FromPostingDate und ToPostingDate festgelegt werden. Dieser wird dann an die DATEV Einrichtung übergeben und die Sachposten anhand dieser Werte gefiltert und exportiert. Die Funktion prüft, ob es für den Zeitraum Sachposten für den Export gibt.
Nach einem erfolgreichen Export sind die Dateien in der temporären Tabelle TempDATEVNameValueBuffer verfügbar.
[EventSubscriber(ObjectType::Report, Report::"SIEVERS DATEV Export", 'OnPostReportShowComment', '', false, false)]
local procedure OnPostReportShowCommentInDatevExport(
var ShowNoComment: Boolean;
DatevSetupNo: Code[10]
)
begin
if DatevSetupNo = DATEVSetupNoGlobal then
ShowNoComment := true;
end;
Dieser Event Subscriber wird benötigt, damit das Protokoll am Ende des Exports nicht angezeigt wird.
Sie müssen sich dazu in Ihrer Codeunit eine globale Variable DATEVSetupNoGlobal anlegen, die die Nr. der DATEV Einrichtung enthält, mit der der Export ausgeführt werden soll. Da dieses Event bei allen DATEV Exporten ausgeführt wird, wird so sichergestellt, dass bei einem manuellen Export über eine andere DATEV Einrichtung das Protokoll am Ende des Exports angezeigt wird.
[EventSubscriber(ObjectType::Report, Report::"SIEVERS DATEV Export", 'OnPostReportBeforeDownloadFiles', '', false, false)]
local procedure OnPostReportBeforeDownloadFilesInDatevExport(
DatevSetupNo: Code[10];
var DatevNameValueBuffer: Record "Name/Value Buffer" temporary;
var DoNotDownloadFileWithBrowser: Boolean
)
begin
if DatevSetupNo = DATEVSetupNoGlobal then
DoNotDownloadFileWithBrowser := true;
end;
Dieses Event wird benötigt, damit die Exportdateien nicht über den Browser heruntergeladen werden, sondern über die temporäre Tabelle an die aufrufende Funktion übergeben werden.
Sie müssen sich dazu in Ihrer Codeunit eine globale Variable DATEVSetupNoGlobal anlegen, die die Nr. der DATEV Einrichtung enthält, mit der der Export ausgeführt werden soll. Da dieses Event bei allen DATEV Exporten ausgeführt wird, wird so sichergestellt, dass bei einem manuellen Export über eine andere DATEV Einrichtung die Exportdateien über den Browser heruntergeladen werden.