Verwendung des Ausgabetyps „Codeunit“
Der Ausgabetyp Codeunit kann verwendet werden, um Dokumente über eine benutzerdefinierte Business-Logik zu verarbeiten und zu versenden.
Anstatt Standard-Ausgabetypen wie E-Mail, FTP oder Download zu verwenden, wird eine Codeunit ausgeführt, die die generierten Dokumente an beliebige Ziele übertragen oder weiterverarbeiten kann.
Info
Der Ausgabetyp Codeunit eignet sich besonders für Integrationen, bei denen Dokumente Beispielsweise an externe Systeme oder APIs übertragen werden sollen.
Typische Anwendungsfälle
Mit diesem Feature können Sie beispielsweise:
- Dokumente über externe APIs hochladen (z. B. Dropbox, Google Drive oder eigene Repositories)
- Dokumente an Drittsysteme übertragen (z. B. DMS, Archivsysteme)
- Individuelle Verarbeitungslogik implementieren (z. B. Verschlüsselung, Validierung, Transformation)
- Integration in unternehmenseigene Workflows (z. B. automatische Approval-Prozesse starten)
Einrichtung
Um den Ausgabetyp Codeunit zu verwenden, müssen Sie ein entsprechendes Versandprofil einrichten und die gewünschte Codeunit hinterlegen.
- Öffnen Sie die Seite Versandprofile.
- Erstellen Sie ein neues Profil oder bearbeiten Sie ein bestehendes.
- Wählen Sie im Feld Ausgabetyp die Option Codeunit aus.
- Führen Sie die Aktion Optionen in der Menüleiste aus.
- Geben Sie im Feld Codeunit-ID die Nummer der Codeunit an, die ausgeführt werden soll (z. B.
50000 aus dem untenstehenden Beispiel).
- Konfigurieren Sie unter Versandprofil-Anhänge die Dokumente (Berichte, Dateien etc.), die von der Codeunit verarbeitet werden sollen.
Wenn dieses Versandprofil nun verwendet wird, um Dokumente zu versenden, wird anstelle eines Standardversands (wie E-Mail) die von Ihnen angegebene Codeunit ausgeführt.
Funktionsweise
Wenn ein Queue Entry mit dem Ausgabetyp Codeunit verarbeitet wird, führt Document Dispatch folgende Schritte aus:
- Alle konfigurierten Attachments (Berichte, Dateien, XML, etc.) werden generiert.
- Die im Dispatch Profile hinterlegte Codeunit wird über
CODEUNIT.Run() ausgeführt.
- Die Codeunit erhält Zugriff auf die generierten Dokumente über die Queue Line Einträge.
- Die Codeunit verarbeitet und versendet die Dokumente entsprechend der implementierten Logik (z. B. API-Upload).
Beispiel: Dokumente per API in ein Repository hochladen
Das folgende Beispiel zeigt, wie Dokumente über eine REST API an ein externes Repository übertragen werden können.
Beispiel-Implementation
| AL - Custom Codeunit für API-Upload |
|---|
| codeunit 50000 "Doc. Dispatch API Upload"
{
TableNo = "SIM_EDS Record Attachment";
Permissions = tabledata "SIM_EDS Queue Line" = RIM;
trigger OnRun()
begin
UploadDocumentsToAPI();
end;
var
GlobalCodeunitSIMEDSSI: Codeunit "SIM_EDS SI";
/// <summary>
/// Lädt alle generierten Dokumente über eine API zu einem externen Repository hoch
/// </summary>
procedure UploadDocumentsToAPI()
var
LocalRecordSIMEDSQueueLine: Record "SIM_EDS Queue Line";
LocalRecordSIMEDSQueueEntry: Record "SIM_EDS Queue Entry";
LocalCodeunitBase64Convert: Codeunit "Base64 Convert";
LocalHttpClient: HttpClient;
LocalHttpContent: HttpContent;
LocalHttpResponse: HttpResponseMessage;
LocalHeaders: HttpHeaders;
LocalInStream: InStream;
LocalFileBase64Text: Text;
LocalApiUrlText: Text;
LocalQueueEntryNo: BigInteger;
LocalSuccessBoolean: Boolean;
begin
// Hole Queue Entry No. aus Document Dispatch
LocalQueueEntryNo := GlobalCodeunitSIMEDSSI.GetQueueEntryNo();
if LocalQueueEntryNo = 0 then
Error('Keine Queue Entry gefunden.');
if not LocalRecordSIMEDSQueueEntry.Get(LocalQueueEntryNo) then
Error('Queue Entry %1 nicht gefunden.', LocalQueueEntryNo);
// Alle generierten Queue Lines (= Dokumente) für diesen Queue Entry durchlaufen
LocalRecordSIMEDSQueueLine.SetRange("Queue Entry No.", LocalQueueEntryNo);
LocalRecordSIMEDSQueueLine.SetRange("Attach Tag", true); // Nur markierte Attachments
if LocalRecordSIMEDSQueueLine.FindSet() then
repeat
// Dokument aus Queue Line holen
LocalRecordSIMEDSQueueLine.CalcFields("Document Blob");
if LocalRecordSIMEDSQueueLine."Document Blob".HasValue then begin
// Dokument in Base64 konvertieren für API-Transfer
Clear(LocalInStream);
LocalRecordSIMEDSQueueLine."Document Blob".CreateInStream(LocalInStream);
LocalFileBase64Text := LocalCodeunitBase64Convert.ToBase64(LocalInStream);
// API-Upload durchführen
LocalApiUrlText := GetAPIUploadUrl(); // Ihre API-URL
LocalSuccessBoolean := UploadFileToAPI(
LocalApiUrlText,
LocalRecordSIMEDSQueueLine."Document Name",
LocalFileBase64Text,
LocalRecordSIMEDSQueueEntry
);
if not LocalSuccessBoolean then
Error('Upload fehlgeschlagen für Dokument: %1', LocalRecordSIMEDSQueueLine."Document Name");
end;
until LocalRecordSIMEDSQueueLine.Next() = 0;
Message('Alle Dokumente erfolgreich hochgeladen.');
end;
local procedure UploadFileToAPI(
ParamApiUrl: Text;
ParamFilename: Text;
ParamFileBase64: Text;
ParamQueueEntry: Record "SIM_EDS Queue Entry"
): Boolean
var
LocalHttpClient: HttpClient;
LocalHttpContent: HttpContent;
LocalHttpResponse: HttpResponseMessage;
LocalHeaders: HttpHeaders;
LocalJsonObject: JsonObject;
LocalJsonText: Text;
LocalRequestBody: Text;
begin
// JSON-Payload für API erstellen
LocalJsonObject.Add('filename', ParamFilename);
LocalJsonObject.Add('content', ParamFileBase64);
LocalJsonObject.Add('source_document', Format(ParamQueueEntry."Source ID"));
LocalJsonObject.Add('queue_entry_no', ParamQueueEntry."Entry No.");
LocalJsonObject.WriteTo(LocalJsonText);
// HTTP Request konfigurieren
LocalHttpContent.WriteFrom(LocalJsonText);
LocalHttpContent.GetHeaders(LocalHeaders);
LocalHeaders.Clear();
LocalHeaders.Add('Content-Type', 'application/json');
LocalHeaders.Add('Authorization', GetAPIAuthToken()); // Ihre Auth-Logik
// API Call durchführen
if not LocalHttpClient.Post(ParamApiUrl, LocalHttpContent, LocalHttpResponse) then
exit(false);
// Response prüfen
exit(LocalHttpResponse.IsSuccessStatusCode());
end;
local procedure GetAPIUploadUrl(): Text
var
LocalSetup: Record "Your API Setup"; // Ihre Setup-Tabelle
begin
LocalSetup.Get();
LocalSetup.TestField("API Base URL");
exit(LocalSetup."API Base URL" + '/upload');
end;
local procedure GetAPIAuthToken(): Text
var
LocalSetup: Record "Your API Setup";
begin
LocalSetup.Get();
LocalSetup.TestField("API Token");
exit('Bearer ' + LocalSetup."API Token");
end;
}
|
Vorteile
Wenn Sie den Ausgabetyp Codeunit verwenden, erhalten Sie unter anderem folgende Vorteile:
- Volle Kontrolle: Sie bestimmen, wohin und wie Dokumente gehandhabt werden
- Flexibilität: Jede API, jedes Protokoll, jede Business-Logik möglich
- Integration: Nahtlose Einbindung in den Document Dispatch Queue-Mechanismus
- Fehlerbehandlung: Nutzung der Standard-Error-Handling-Mechanismen von Document Dispatch
- Nachvollziehbarkeit: Uploads werden in der Queue History protokolliert