Skip to main content

Anpassung der Dateinamen von Anhängen nach der Validierung

Anpassung der Dateinamen von Anhängen in DEXPRO SQUEEZE

Überblick

Diese Anleitung zeigt, wie Entwickler die Dateinamen von Anhängen in DEXPRO SQUEEZE anpassen können. Das Event OnBeforeAddLineToDocumentJObj wird nach der Plausibilitätsprüfung ausgeführt, sodass alle Belegdaten vollständig validiert und verfügbar sind.

Verfügbares Event

OnBeforeAddLineToDocumentJObj

Für Rechnungen/Gutschriften: Codeunit 70954657 "DXP SQZ P. Inv/Crdt Memo Impl."
Für Bestellbestätigungen: Codeunit 70954658 "DXP SQZ P. Order Conf. Impl."

Wann aufgerufen: Nach Header-Verarbeitung, vor Zeilen-Verarbeitung, nach Plausibilitätsprüfung

Warum dieses Event?

✅ Alle Daten verfügbar: Kreditorennummer, Belegdatum, etc. sind validiert
✅ Nach Plausibilitätsprüfung: Datenqualität ist sichergestellt
✅ Optimaler Zeitpunkt: Header fertig verarbeitet, Anhänge verfügbar

Implementierungsbeispiele

Beispiel 1: Einfacher Kreditorenprefix für Rechnungen/Gutschriften

codeunit 50100 "Custom Invoice Filename"
{
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
    local procedure OnBeforeAddLineToDocumentJObjInvoice(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
    begin
        CustomizeAttachmentFilenames(DocHeader);
    end;

    local procedure CustomizeAttachmentFilenames(DocHeader: Record "DXP SQZ Document Header")
    var
        DocumentAttachment: Record "DXP Document Attachment";
        VendorPrefix: Text;
        NewFileName: Text[1024];
    begin
        // Beenden, wenn keine Kreditorinformationen vorhanden
        if DocHeader."Buy-from Vendor No." = '' then
            exit;

        // Kreditorenprefix erstellen
        VendorPrefix := DocHeader."Buy-from Vendor No." + '_';

        // Alle Anhänge für dieses Dokument bearbeiten
        DocumentAttachment.Reset();
        DocumentAttachment.SetRange("Document No.", DocHeader."Core Document No.");
        
        if DocumentAttachment.FindSet(true) then
            repeat
                // Überspringen, wenn Prefix bereits vorhanden
                if StrPos(DocumentAttachment."File Name", VendorPrefix) <> 1 then begin
                    // Neuen Dateinamen mit Prefix erstellen
                    NewFileName := VendorPrefix + DocumentAttachment."File Name";
                    
                    // Aktualisieren, wenn es passt
                    if StrLen(NewFileName) <= MaxStrLen(DocumentAttachment."File Name") then begin
                        DocumentAttachment."File Name" := CopyStr(NewFileName, 1, MaxStrLen(DocumentAttachment."File Name"));
                        DocumentAttachment.Modify(true);
                    end;
                end;
            until DocumentAttachment.Next() = 0;
    end;
}

Beispiel 2: Bestellbestätigungen - Kreditorenprefix

codeunit 50101 "Custom Order Conf Filename"
{
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Order Conf. Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
    local procedure OnBeforeAddLineToDocumentJObjOrderConf(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
    begin
        CustomizeAttachmentFilenames(DocHeader);
    end;

    local procedure CustomizeAttachmentFilenames(DocHeader: Record "DXP SQZ Document Header")
    var
        DocumentAttachment: Record "DXP Document Attachment";
        VendorPrefix: Text;
        NewFileName: Text[1024];
    begin
        // Beenden, wenn keine Kreditorinformationen vorhanden
        if DocHeader."Buy-from Vendor No." = '' then
            exit;

        // Kreditorenprefix erstellen
        VendorPrefix := DocHeader."Buy-from Vendor No." + '_';

        // Alle Anhänge für dieses Dokument bearbeiten
        DocumentAttachment.Reset();
        DocumentAttachment.SetRange("Document No.", DocHeader."Core Document No.");
        
        if DocumentAttachment.FindSet(true) then
            repeat
                // Überspringen, wenn Prefix bereits vorhanden
                if StrPos(DocumentAttachment."File Name", VendorPrefix) <> 1 then begin
                    // Neuen Dateinamen mit Prefix erstellen
                    NewFileName := VendorPrefix + DocumentAttachment."File Name";
                    
                    // Aktualisieren, wenn es passt
                    if StrLen(NewFileName) <= MaxStrLen(DocumentAttachment."File Name") then begin
                        DocumentAttachment."File Name" := CopyStr(NewFileName, 1, MaxStrLen(DocumentAttachment."File Name"));
                        DocumentAttachment.Modify(true);
                    end;
                end;
            until DocumentAttachment.Next() = 0;
    end;
}

Beispiel 3: Beide Dokumenttypen - Verschiedene Prefixe für Quelldateien

codeunit 50102 "Advanced Filename Handling"
{
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
    local procedure OnBeforeAddLineToDocumentJObjInvoice(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
    begin
        CustomizeFilenamesWithSourceHandling(DocHeader);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Order Conf. Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
    local procedure OnBeforeAddLineToDocumentJObjOrderConf(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
    begin
        CustomizeFilenamesWithSourceHandling(DocHeader);
    end;

    local procedure CustomizeFilenamesWithSourceHandling(DocHeader: Record "DXP SQZ Document Header")
    var
        DocumentAttachment: Record "DXP Document Attachment";
        VendorPrefix: Text;
        SourcePrefix: Text;
        NewFileName: Text[1024];
        PrefixToUse: Text;
    begin
        // Beenden, wenn keine Kreditorinformationen vorhanden
        if DocHeader."Buy-from Vendor No." = '' then
            exit;

        // Prefixe erstellen
        VendorPrefix := DocHeader."Buy-from Vendor No." + '_';
        SourcePrefix := 'ORIGINAL_' + DocHeader."Buy-from Vendor No." + '_';

        // Alle Anhänge bearbeiten
        DocumentAttachment.Reset();
        DocumentAttachment.SetRange("Document No.", DocHeader."Core Document No.");
        
        if DocumentAttachment.FindSet(true) then
            repeat
                // Prefix je nach Dateityp wählen
                if DocumentAttachment."Is Source File" then
                    PrefixToUse := SourcePrefix
                else
                    PrefixToUse := VendorPrefix;

                // Überspringen, wenn Prefix bereits vorhanden
                if StrPos(DocumentAttachment."File Name", PrefixToUse) <> 1 then begin
                    NewFileName := PrefixToUse + DocumentAttachment."File Name";
                    
                    if StrLen(NewFileName) <= MaxStrLen(DocumentAttachment."File Name") then begin
                        DocumentAttachment."File Name" := CopyStr(NewFileName, 1, MaxStrLen(DocumentAttachment."File Name"));
                        DocumentAttachment.Modify(true);
                    end;
                end;
            until DocumentAttachment.Next() = 0;
    end;
}

Praktische Hinweise

Verfügbare Daten zur Event-Zeit:

  • DocHeader."Buy-from Vendor No." - Kreditorennummer (validiert)
  • DocHeader."Document Date" - Belegdatum
  • DocHeader."Document Reference" - Belegnummer
  • DocHeader."Core Document No." - Verknüpfung zu Anhängen
  • Alle anderen Belegfelder sind verfügbar

Beispielresultate:

  • Original"Rechnung_2024_001.pdf"
  • Mit Kreditorenprefix"VEND001_Rechnung_2024_001.pdf"
  • Quelldatei"ORIGINAL_VEND001_Rechnung_2024_001.pdf"

Best Practices:

  • Duplikatprüfung: Immer prüfen, ob Prefix bereits vorhanden
  • Längenvalidierung: Neue Dateinamen dürfen max. 1024 Zeichen haben