Skip to main content

Anpassung der Dateinamen von Anhängen nach der Validierung

Anpassung der Dateinamen von Anhängen nach der Validierung

Ü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 Dokumentdaten (Kopf) 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

Implementierungsbeispiele

Beispiel 1: Einfacher Kreditorenprefix für Rechnungen/Gutschriften

xxxxxxxxxx
 
1
codeunit 50100 "Custom Invoice Filename"
2
{
3
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
4
    local procedure OnBeforeAddLineToDocumentJObjInvoice(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
5
    begin
6
        CustomizeAttachmentFilenames(DocHeader);
7
    end;
8
9
    local procedure CustomizeAttachmentFilenames(DocHeader: Record "DXP SQZ Document Header")
10
    var
11
        DocumentAttachment: Record "DXP Document Attachment";
12
        VendorPrefix: Text;
13
        NewFileName: Text[1024];
14
    begin
15
        // Beenden, wenn keine Kreditorinformationen vorhanden
16
        if DocHeader."Buy-from Vendor No." = '' then
17
            exit;
18
19
        // Kreditorenprefix erstellen
20
        VendorPrefix := DocHeader."Buy-from Vendor No." + '_';
21
22
        // Alle Anhänge für dieses Dokument bearbeiten
23
        DocumentAttachment.Reset();
24
        DocumentAttachment.SetRange("Document No.", DocHeader."Core Document No.");
25
        
26
        if DocumentAttachment.FindSet(true) then
27
            repeat
28
                // Überspringen, wenn Prefix bereits vorhanden
29
                if StrPos(DocumentAttachment."File Name", VendorPrefix) <> 1 then begin
30
                    // Neuen Dateinamen mit Prefix erstellen
31
                    NewFileName := VendorPrefix + DocumentAttachment."File Name";
32
                    
33
                    // Aktualisieren, wenn es passt
34
                    if StrLen(NewFileName) <= MaxStrLen(DocumentAttachment."File Name") then begin
35
                        DocumentAttachment."File Name" := CopyStr(NewFileName, 1, MaxStrLen(DocumentAttachment."File Name"));
36
                        DocumentAttachment.Modify(true);
37
                    end;
38
                end;
39
            until DocumentAttachment.Next() = 0;
40
    end;
41
}
42

Beispiel 2: Bestellbestätigungen - Kreditorenprefix

xxxxxxxxxx
 
1
codeunit 50101 "Custom Order Conf Filename"
2
{
3
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Order Conf. Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
4
    local procedure OnBeforeAddLineToDocumentJObjOrderConf(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
5
    begin
6
        CustomizeAttachmentFilenames(DocHeader);
7
    end;
8
9
    local procedure CustomizeAttachmentFilenames(DocHeader: Record "DXP SQZ Document Header")
10
    var
11
        DocumentAttachment: Record "DXP Document Attachment";
12
        VendorPrefix: Text;
13
        NewFileName: Text[1024];
14
    begin
15
        // Beenden, wenn keine Kreditorinformationen vorhanden
16
        if DocHeader."Buy-from Vendor No." = '' then
17
            exit;
18
19
        // Kreditorenprefix erstellen
20
        VendorPrefix := DocHeader."Buy-from Vendor No." + '_';
21
22
        // Alle Anhänge für dieses Dokument bearbeiten
23
        DocumentAttachment.Reset();
24
        DocumentAttachment.SetRange("Document No.", DocHeader."Core Document No.");
25
        
26
        if DocumentAttachment.FindSet(true) then
27
            repeat
28
                // Überspringen, wenn Prefix bereits vorhanden
29
                if StrPos(DocumentAttachment."File Name", VendorPrefix) <> 1 then begin
30
                    // Neuen Dateinamen mit Prefix erstellen
31
                    NewFileName := VendorPrefix + DocumentAttachment."File Name";
32
                    
33
                    // Aktualisieren, wenn es passt
34
                    if StrLen(NewFileName) <= MaxStrLen(DocumentAttachment."File Name") then begin
35
                        DocumentAttachment."File Name" := CopyStr(NewFileName, 1, MaxStrLen(DocumentAttachment."File Name"));
36
                        DocumentAttachment.Modify(true);
37
                    end;
38
                end;
39
            until DocumentAttachment.Next() = 0;
40
    end;
41
}
42

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

xxxxxxxxxx
 
1
codeunit 50102 "Advanced Filename Handling"
2
{
3
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
4
    local procedure OnBeforeAddLineToDocumentJObjInvoice(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
5
    begin
6
        CustomizeFilenamesWithSourceHandling(DocHeader);
7
    end;
8
9
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Order Conf. Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
10
    local procedure OnBeforeAddLineToDocumentJObjOrderConf(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
11
    begin
12
        CustomizeFilenamesWithSourceHandling(DocHeader);
13
    end;
14
15
    local procedure CustomizeFilenamesWithSourceHandling(DocHeader: Record "DXP SQZ Document Header")
16
    var
17
        DocumentAttachment: Record "DXP Document Attachment";
18
        VendorPrefix: Text;
19
        SourcePrefix: Text;
20
        NewFileName: Text[1024];
21
        PrefixToUse: Text;
22
    begin
23
        // Beenden, wenn keine Kreditorinformationen vorhanden
24
        if DocHeader."Buy-from Vendor No." = '' then
25
            exit;
26
27
        // Prefixe erstellen
28
        VendorPrefix := DocHeader."Buy-from Vendor No." + '_';
29
        SourcePrefix := 'ORIGINAL_' + DocHeader."Buy-from Vendor No." + '_';
30
31
        // Alle Anhänge bearbeiten
32
        DocumentAttachment.Reset();
33
        DocumentAttachment.SetRange("Document No.", DocHeader."Core Document No.");
34
        
35
        if DocumentAttachment.FindSet(true) then
36
            repeat
37
                // Prefix je nach Dateityp wählen
38
                if DocumentAttachment."Is Source File" then
39
                    PrefixToUse := SourcePrefix
40
                else
41
                    PrefixToUse := VendorPrefix;
42
43
                // Überspringen, wenn Prefix bereits vorhanden
44
                if StrPos(DocumentAttachment."File Name", PrefixToUse) <> 1 then begin
45
                    NewFileName := PrefixToUse + DocumentAttachment."File Name";
46
                    
47
                    if StrLen(NewFileName) <= MaxStrLen(DocumentAttachment."File Name") then begin
48
                        DocumentAttachment."File Name" := CopyStr(NewFileName, 1, MaxStrLen(DocumentAttachment."File Name"));
49
                        DocumentAttachment.Modify(true);
50
                    end;
51
                end;
52
            until DocumentAttachment.Next() = 0;
53
    end;
54
}
55

Verfügbare Daten zur Event-Zeit:

  • DocHeader."Buy-from Vendor No." - Kreditorennummer (validiert)
  • DocHeader."Document Date" - Dokumentdatum
  • DocHeader."Document Reference" - Dokumentreferenz
  • DocHeader."Core Document No." - Verknüpfung zu Anhängen
  • Alle anderen Dokumentfelder 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 habe