Skip to main content

Squeeze-Ursprungsanhang anpassen

Übersicht

Das OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment Integration Event ermöglicht es Drittanbieter-Entwicklern, Dokumentenanhang-Datensätze anzupassen, bevor sie während des SQUEEZE-Anhang-Verarbeitungsworkflows modifiziert werden. Ein Ursprungsanhang ist der relevante Anhang, der zur Erstellung eines Belegs führt (z.B. die Rechnung des Lieferanten).

Event-Deklaration

[IntegrationEvent(false, false)]
local procedure OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment(var DocumentAttachment: Record "DXP Document Attachment")
begin
end;

Event-Parameter

Parameter Typ Beschreibung
DocumentAttachment Record "DXP Document Attachment" (var) Der Dokumentenanhang-Datensatz, der modifiziert werden soll. Als Referenz übergeben, wodurch Änderungen möglich sind.

Wann wird dieses Event ausgelöst?

Dieses Event wird während der SaveAttachments-Prozedur ausgelöst, wenn:

  • Ein Anhang von SQUEEZE verarbeitet wird
  • Der Anhang als Ursprungsdatei identifiziert wird (IsOriginFile = true)
  • Das System den Ursprungsdateinamen und das DXP Is Origin File Flag gesetzt hat
  • Kurz vor demDocumentAttachment.Modify(true)-Aufruf

Anwendungsfälle

Dieses Integration Event ist nützlich für:

  • Benutzerdefiniertes Füllen von Feldern: Setzen zusätzlicher benutzerdefinierter Felder im Dokumentenanhang
  • Dateinamen-Transformation: Anwenden benutzerdefinierter Namenskonventionen oder Formatierung
  • Metadaten-Erweiterung: Hinzufügen benutzerdefinierter Metadaten oder Tags zu Anhängen
  • Validierungslogik: Implementierung benutzerdefinierter Validierung vor dem Speichern des Datensatzes
  • Integrationsanforderungen: Vorbereitung von Daten für externe Systemintegrationen

Implementierungsbeispiel

Dateinamen vor Modifikation ändern

[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ API Mgt.", 'OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment', '', false, false)]
local procedure OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment(var DocumentAttachment: Record "DXP Document Attachment")
var
    CoreDocument: Record "DXP Document";
    SQZDocumentHeader: Record "DXP SQZ Document Header";
    Vendor: Record Vendor;
    NewFileName: Text[250];
    VendorPrefix: Text[50];
begin
    // Get the core document using the document attachment's Document No.
    if not CoreDocument.Get(DocumentAttachment."Document No.") then
        exit;

    // Check if the core document has a linked SQUEEZE document
    if IsNullGuid(CoreDocument."Linked-to Record Id") then
        exit;

    // Get the SQZ Document Header using the SystemId from Linked-to Record Id
    if not GetSQZDocumentHeaderFromRecordId(CoreDocument."Linked-to Record Id", SQZDocumentHeader) then
        exit;

    // Check if Buy-from Vendor No. is populated
    if SQZDocumentHeader."Buy-from Vendor No." = '' then
        exit;

    // Get the vendor record
    if not Vendor.Get(SQZDocumentHeader."Buy-from Vendor No.") then
        exit;

    // Create vendor prefix from Search Name (fallback to Name if Search Name is empty)
    if Vendor."Search Name" <> '' then
        VendorPrefix := Vendor."Search Name"
    else
        VendorPrefix := Vendor.Name;

    // Clean the vendor prefix (remove invalid filename characters and limit length)
    VendorPrefix := CleanFilenameText(VendorPrefix, 30);

    // Check if vendor prefix already exists in filename to avoid duplicates
    if DocumentAttachment."File Name".StartsWith(VendorPrefix + '_') then
        exit;

    // Create new filename with vendor prefix
    NewFileName := VendorPrefix + '_' + DocumentAttachment."File Name";

    // Update the attachment filename
    DocumentAttachment."File Name" := NewFileName;
end;

local procedure GetSQZDocumentHeaderFromRecordId(LinkedRecordId: Guid; var SQZDocumentHeader: Record "DXP SQZ Document Header"): Boolean
var
    RecRef: RecordRef;
    SystemIdFieldRef: FieldRef;
begin
    // Method 1: Try to get the record directly if LinkedRecordId is actually a SystemId
    if SQZDocumentHeader.GetBySystemId(LinkedRecordId) then
        exit(true);

    // Method 2: If that fails, we need to find the record another way
    // This assumes the Linked-to Record Id might be stored differently
    SQZDocumentHeader.Reset();
    SQZDocumentHeader.SetRange(SystemId, LinkedRecordId);
    exit(SQZDocumentHeader.FindFirst());
end;

local procedure CleanFilenameText(InputText: Text; MaxLength: Integer): Text
var
    CleanText: Text;
begin
    // Remove invalid filename characters
    CleanText := DelChr(InputText, '=', '<>|"/\:*?');
    
    // Replace spaces with underscores for better filename compatibility
    CleanText := CleanText.Replace(' ', '_');
    
    // Limit length
    CleanText := CopyStr(CleanText, 1, MaxLength);
    
    exit(CleanText);
end;

Wichtige Überlegungen

Datenintegrität

  • Der DocumentAttachment-Datensatz wird als Referenz übergeben, daher werden alle Änderungen gespeichert
  • Berücksichtigen Sie Feldlängenbegrenzungen beim Ändern von Textfeldern

Performance

  • Halten Sie die Verarbeitung schlank, da dieses Event für jeden Ursprungsdatei-Anhang aufgerufen wird
  • Erwägen Sie das Zwischenspeichern häufig verwendeter Daten

Fehlerbehandlung

  • Implementieren Sie ordnungsgemäße Fehlerbehandlung, um zu verhindern, dass der Anhang-Speichervorgang fehlschlägt
  • Verwenden Sie try-Funktionen für riskante Operationen

Verwandte Events

  • OnAfterSaveAttachment: Wird ausgelöst, nachdem jeder Anhang vollständig gespeichert wurde.
  • Erwägen Sie die Verwendung dieses alternativen Events, wenn Sie Aktionen nach dem Speichern des Datensatzes durchführen müssen.

Fehlerbehebung

Wenn Ihr Event Subscriber nicht ausgelöst wird:

  • Testen Sie speziell mit Ursprungsdateien (Nicht-Ursprungsdateien lösen dieses Event nicht aus)