Het uitvoertype "Codeunit" gebruiken
Het uitvoertype Codeunit kan worden gebruikt om documenten te verwerken en te verzenden via aangepaste bedrijfslogica.
In plaats van standaard uitvoertypen zoals E-mail, FTP of Download, wordt een codeunit uitgevoerd die de gegenereerde documenten naar elke gewenste bestemming kan overdragen of verder kan verwerken.
Info
Het uitvoertype Codeunit is bijzonder geschikt voor integraties waarbij documenten naar externe systemen of API’s moeten worden overgebracht (bijv. DMS, cloudopslag, archiveringssystemen).
Typische use-cases
Met deze functionaliteit kun je bijvoorbeeld:
- Documenten uploaden via externe API’s (bijv. Dropbox, Google Drive of je eigen repositories)
- Documenten overdragen naar systemen van derden (bijv. DMS, archiveringssystemen)
- Aangepaste verwerkingslogica implementeren (bijv. encryptie, validatie, transformatie)
- Integreren in bedrijfsspecifieke workflows (bijv. automatisch goedkeuringsprocessen starten)
Configuratie
Om het uitvoertype Codeunit te gebruiken, moet je een bijbehorend Dispatch-profiel instellen en de gewenste codeunit opgeven.
- Open de pagina Dispatch Profiles.
- Maak een nieuw profiel aan of bewerk een bestaand profiel.
- Selecteer in het veld Output Type de optie Codeunit.
- Voer de actie Options uit in de menubalk.
- Vul in het veld Codeunit ID het nummer in van de uit te voeren codeunit (bijv.
50000 uit het voorbeeld hieronder).
- Configureer onder Dispatch Profile Attachments de documenten (rapporten, bestanden, enz.) die door de codeunit moeten worden verwerkt.
Wanneer dit dispatch-profiel nu wordt gebruikt om documenten te verzenden, wordt de door jou opgegeven codeunit uitgevoerd.
Hoe het werkt
Wanneer een Queue Entry met het uitvoertype Codeunit wordt verwerkt, voert Document Dispatch de volgende stappen uit:
- Alle geconfigureerde bijlagen (rapporten, bestanden, XML, enz.) worden gegenereerd.
- De codeunit die in het Dispatch-profiel is opgeslagen wordt uitgevoerd via
CODEUNIT.Run().
- De codeunit krijgt toegang tot de gegenereerde documenten via de Queue Line-records.
- De codeunit verwerkt en verzendt de documenten volgens de geïmplementeerde logica (bijv. API-upload).
Voorbeeld: documenten uploaden naar een repository via API
Het volgende voorbeeld laat zien hoe documenten via een REST API naar een externe repository kunnen worden overgezet.
Voorbeeldimplementatie
| AL - Custom Codeunit for 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>
/// Uploads all generated documents to an external repository via an API
/// </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
// Get Queue Entry No. from Document Dispatch
LocalQueueEntryNo := GlobalCodeunitSIMEDSSI.GetQueueEntryNo();
if LocalQueueEntryNo = 0 then
Error('No Queue Entry found.');
if not LocalRecordSIMEDSQueueEntry.Get(LocalQueueEntryNo) then
Error('Queue Entry %1 not found.', LocalQueueEntryNo);
// Iterate through all generated Queue Lines (= documents) for this Queue Entry
LocalRecordSIMEDSQueueLine.SetRange("Queue Entry No.", LocalQueueEntryNo);
LocalRecordSIMEDSQueueLine.SetRange("Attach Tag", true); // Only tagged attachments
if LocalRecordSIMEDSQueueLine.FindSet() then
repeat
// Get document from Queue Line
LocalRecordSIMEDSQueueLine.CalcFields("Document Blob");
if LocalRecordSIMEDSQueueLine."Document Blob".HasValue then begin
// Convert document to Base64 for API transfer
Clear(LocalInStream);
LocalRecordSIMEDSQueueLine."Document Blob".CreateInStream(LocalInStream);
LocalFileBase64Text := LocalCodeunitBase64Convert.ToBase64(LocalInStream);
// Perform API upload
LocalApiUrlText := GetAPIUploadUrl(); // Your API URL
LocalSuccessBoolean := UploadFileToAPI(
LocalApiUrlText,
LocalRecordSIMEDSQueueLine."Document Name",
LocalFileBase64Text,
LocalRecordSIMEDSQueueEntry
);
if not LocalSuccessBoolean then
Error('Upload failed for document: %1', LocalRecordSIMEDSQueueLine."Document Name");
end;
until LocalRecordSIMEDSQueueLine.Next() = 0;
Message('All documents uploaded successfully.');
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
// Create JSON payload for API
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);
// Configure HTTP Request
LocalHttpContent.WriteFrom(LocalJsonText);
LocalHttpContent.GetHeaders(LocalHeaders);
LocalHeaders.Clear();
LocalHeaders.Add('Content-Type', 'application/json');
LocalHeaders.Add('Authorization', GetAPIAuthToken()); // Your auth logic
// Perform API call
if not LocalHttpClient.Post(ParamApiUrl, LocalHttpContent, LocalHttpResponse) then
exit(false);
// Check response
exit(LocalHttpResponse.IsSuccessStatusCode());
end;
local procedure GetAPIUploadUrl(): Text
var
LocalSetup: Record "Your API Setup"; // Your setup table
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;
}
|
Voordelen
Wanneer je het uitvoertype Codeunit gebruikt, krijg je onder andere de volgende voordelen:
- Volledige controle: Jij bepaalt waar en hoe documenten worden afgehandeld.
- Flexibiliteit: Elke API, elk protocol en elke bedrijfslogica is mogelijk.
- Integratie: Naadloze integratie in het Document Dispatch Queue-mechanisme.
- Foutafhandeling: Gebruik van de standaard foutafhandelingsmechanismen van Document Dispatch.
- Traceerbaarheid: Uploads worden gelogd in de Queue History.