Zum Inhalt

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.

  1. Öffnen Sie die Seite Versandprofile.
  2. Erstellen Sie ein neues Profil oder bearbeiten Sie ein bestehendes.
  3. Wählen Sie im Feld Ausgabetyp die Option Codeunit aus.
  4. Führen Sie die Aktion Optionen in der Menüleiste aus.
  5. Geben Sie im Feld Codeunit-ID die Nummer der Codeunit an, die ausgeführt werden soll (z. B. 50000 aus dem untenstehenden Beispiel).
  6. 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:

  1. Alle konfigurierten Attachments (Berichte, Dateien, XML, etc.) werden generiert.
  2. Die im Dispatch Profile hinterlegte Codeunit wird über CODEUNIT.Run() ausgeführt.
  3. Die Codeunit erhält Zugriff auf die generierten Dokumente über die Queue Line Einträge.
  4. 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