Artikelverfolgung erstellen bei Spezialaufträge

11. Dezember 2025 15:05

Hallo zusammen,

ich habe eine EK Bestellung, welche als Direktlieferung erstellt wurde, wenn ich auf Artikelverfolgungszeilen gehe, und eine Charge anlege, kommt eine Meldung :
Möchten Sie die Artikelverfolgung dieser Zeile mit der Artikelverfolgung der verknüpften Direktlieferung Verkaufszeile synchronisieren?
Klicke ich ja, wird auf VK Seite bei den Zeilen die passenden Artikelverfolgungszeilen angelegt.

Die Abfrage befindet sich in Page 6510 "Item Tracking Lines", im OnClosePage trigger:

Code:
trigger OnClosePage()
    var
        SkipWriteToDatabase: Boolean;
    begin
        SkipWriteToDatabase := false;
        OnBeforeClosePage(Rec, SkipWriteToDatabase, CurrentRunMode, CurrentSourceType, SourceTrackingSpecification, SourceQuantityArray, TotalTrackingSpecification);
        if UpdateUndefinedQty() and not SkipWriteToDatabase then
            WriteToDatabase();
        if CurrentRunMode = CurrentRunMode::"Drop Shipment" then
            case CurrentSourceType of
                Database::"Sales Line":
                    SynchronizeLinkedSources(StrSubstNo(Text015, Text016));
                Database::"Purchase Line":
                    SynchronizeLinkedSources(StrSubstNo(Text015, Text017));
            end;
....



Spricht etwas dagegen wenn man das gleiche für eine EK Bestellung vom Typ Spezialauftrag implementiert?

Würde mich dann im OnBeforeClosePage Event reinhängen und versuchen SynchronizeLinkedSources auszuführen.
Hat jemand eine andere Idee?

Version ist BC 27.1

Vielen Dank

Re: Artikelverfolgung erstellen bei Spezialaufträge

15. Dezember 2025 12:47

Hmm. Das klappt leider nicht, zu viele Abfragen auf "Drop Shipment" überall.

Hat vielleicht noch jemand eine Idee, wie man das angehen könnte ?

Danke

Re: Artikelverfolgung erstellen bei Spezialaufträge

16. Dezember 2025 20:24

Ich hab es mal so versucht, das klappt, weiß aber nicht ob das Negative Auswirkungen haben kann :twisted:

Code:
    #region Sync Charge / Item Tracking


    [EventSubscriber(ObjectType::Codeunit, codeunit::"Purch. Line-Reserve", OnCallItemTrackingOnBeforeItemTrackingFormRunModal, '', false, false)]
    local procedure OnBeforeItemTrackingRunModal(var PurchLine: Record "Purchase Line"; var ItemTrackingForm: Page "Item Tracking Lines")
    begin
        // Nur für Spezialauftrag
        if IsSpecialOrder(PurchLine) then begin

            // Sicherstellen, dass wir im Drop-Shipment-ähnlichen Modus sind
            ItemTrackingForm.SetRunMode(Enum::"Item Tracking Run Mode"::"Drop Shipment");

            // Second Source explizit korrekt setzen
            ItemTrackingForm.SetSecondSourceRowID(ComposeSalesLineRowIDForSpecialOrder(PurchLine));
        end;
    end;

    [EventSubscriber(ObjectType::page, page::"Item Tracking Lines", OnSetSourceSpecOnAfterSetCurrentSourceRowID, '', false, false)]
    local procedure OnSetSourceSpecOnAfterSetCurrentSourceRowID(CurrentRunMode: Enum "Item Tracking Run Mode"; var CurrentSourceRowID: Text[250]; TrackingSpecification: Record "Tracking Specification")
    begin
        if IsSpecialOrder(TrackingSpecification) then begin //ja
            // Drop Shipment erzwingen
            CurrentRunMode := CurrentRunMode::"Drop Shipment";

            // CurrentSourceRowID setzen (Purchase / Special Order)
            CurrentSourceRowID := ComposePurchLineRowIDForSpecialOrder(TrackingSpecification);
        end;
    end;

    local procedure IsSpecialOrder(PurchaseLine: Record "Purchase Line"): Boolean
    begin
        exit(
            PurchaseLine."Special Order" and
            (PurchaseLine."Special Order Sales No." <> '')
        );
    end;

    local procedure IsSpecialOrder(TrackingSpecification: Record "Tracking Specification"): Boolean
    var
        PurchLine: Record "Purchase Line";
    begin
        if TrackingSpecification."Source Type" = DATABASE::"Purchase Line" then begin
            PurchLine.Setrange("Document Type", PurchLine."Document Type"::Order);
            PurchLine.Setrange("Document No.", TrackingSpecification."Source ID");
            PurchLine.SetRange("Line No.", TrackingSpecification."Source Ref. No.");
            if PurchLine.FindLast() then begin
                exit(PurchLine."Special Order" and (PurchLine."Special Order Sales No." <> ''));
            end;
        end;

        exit(false);
    end;

    local procedure ComposePurchLineRowIDForSpecialOrder(TrackingSpecification: Record "Tracking Specification"): Text[250]
    begin
        exit(ItemTrackingManagement.ComposeRowID(
            Database::"Purchase Line",
            TrackingSpecification."Source Subtype",
            TrackingSpecification."Source ID",
            TrackingSpecification."Source Batch Name",
            TrackingSpecification."Source Prod. Order Line",
            TrackingSpecification."Source Ref. No."));
    end;

    local procedure ComposeSalesLineRowIDForSpecialOrder(PurchLine: record "Purchase Line"): Text[250]
    begin
        exit(ItemTrackingManagement.ComposeRowID(
                    Database::"Sales Line",
                    1,
                    PurchLine."Special Order Sales No.",
                    '',
                    0,
                    PurchLine."Special Order Sales Line No.")
        );
    end;

    #endregion

    var
        ItemTrackingManagement: Codeunit "Item Tracking Management";