[Gelöst] Artikelverfolgungszeilen per Quelltext verändern

13. November 2008 17:05

Mein Ziel ist es, per Quelltext eine bereits ermittelte Anzahl von Chargen bestehenden Umlagerungsauftragszeilen zuzuordnen.

Hat jemand von euch Erfahrung in der Nachbildung von Artikelverfolgungen und kann mir einen Tipp geben? Habe ich vielleicht eine Funktionalität im Standard übersehen, die ich nutzen kann?
Der "echte" Weg über Codeunit "Create Reserv. Entry" ist deutlich zu aufwändig ...

Momentan bliebe mir nur der Weg, zwei Reservierungsposten hart zu erstellen. Als Vorbild dienen mir zwei Reservierungsposten, die sich bei manueller Zuweisung einer Charge in einen Umlagerungsauftrag gebildet haben.

Das kanns doch nicht sein, oder??

Außerdem fände ich es schön, in diesem Thema überhaupt die Programmierung von Artikelverfolgung zu sammeln, nicht nur für Umlagerungsaufträge, nicht nur das Hinzufügen.

Re: Artikelverfolgungszeilen per Quelltext verändern

14. November 2008 13:55

Hallo Natalie,

probiere es mal über die Codeunit 99000845 Reservation Management. Dort gibt es die Funktion SetTransferLine und SetSerialLotNo. Über ähnliche Funktionen habe ich für die Sales Line schon mal Chargen zugewiesen und reserviert.

Tschau

Peter

Re: Artikelverfolgungszeilen per Quelltext verändern

14. November 2008 14:11

Ah, danke!
Durch die genannten Funktionen wird ja die Variable CalcReservEntry passend gefüllt.
Aber was soll dann damit passieren?

Re: Artikelverfolgungszeilen per Quelltext verändern

14. November 2008 14:27

Danach müssen dann die Funktionen UpdateStatistics und AutoReservOneLine aufegrufen werden.
Ist bei mir aber schon ein wenig her und in einem 4.03 Projekt gewesen.

Einer Umlagerungszeile eine Artikelverfolgung übergeben

18. November 2008 12:43

So in etwa konnte ich es jetzt lösen, hier am Beispiel der Transfer Line, die Verfolgungszeilen anhand des kompletten Lagerbestandes erhalten soll.

Prinzip: Fülle eine temporäre Tabelle (Tracking Specification), übergebe diese an Form 6510 und lasse diese Form (Funktion RegisterItemTrackingLines) die Artikelverfolgung erstellen.

(Funktion wird in der Tabelle Transfer Line aufgerufen, daher Rec = Ziel-Umlagerungszeile)
Code:
GetItem;
IF Item."Item Tracking Code" = '' THEN
  EXIT;
 
GetTransHeader;
TransHeader.TESTFIELD("Posting Date");

TestStatusOpen;

TempTrkgSpec.RESET;
TempTrkgSpec.DELETEALL;
CLEAR(ReserveTransferLine);
ReserveTransferLine.InitTrackingSpecification(
  Rec,
  SourceTrkgSpec,
  AvailDate,
  0 {Direction::Outbound});
NextTrackingNo := 1;

ReserveTransferLine.DeleteLine(Rec);

IF NOT ItemTrkgMgtPhysInvtLine.LocationIsBinMandatory("Transfer-from Code") THEN BEGIN
  ItemLedgEntry.RESET;

  ItemLedgEntry.SETCURRENTKEY(
    "Item No.", "Entry Type", "Variant Code", "Drop Shipment", "Location Code", "Posting Date");
  ItemLedgEntry.SETRANGE("Item No.", "Item No.");
  ItemLedgEntry.SETRANGE("Variant Code", "Variant Code");
  ItemLedgEntry.SETRANGE("Location Code", "Transfer-from Code");
  ItemLedgEntry.SETRANGE("Posting Date", 0D, TransHeader."Posting Date");
  IF ItemLedgEntry.FIND('-') THEN REPEAT
    IF NOT FindTrackingSpec(SourceTrkgSpec, ItemLedgEntry."Serial No.", ItemLedgEntry."Lot No.", TempTrkgSpec)
    THEN BEGIN
      TempTrkgSpec := SourceTrkgSpec;
      TempTrkgSpec.VALIDATE("Lot No.", ItemLedgEntry."Lot No.");
      TempTrkgSpec.VALIDATE("Serial No.", ItemLedgEntry."Serial No.");
      TempTrkgSpec.VALIDATE("Quantity (Base)", ItemLedgEntry.Quantity);
      TempTrkgSpec."Entry No." := NextTrackingNo;
      TempTrkgSpec.INSERT;
      NextTrackingNo += 1;
    END ELSE BEGIN
      TempTrkgSpec."Quantity (Base)" += ItemLedgEntry.Quantity;
      TempTrkgSpec.VALIDATE("Quantity (Base)");
      TempTrkgSpec.MODIFY;
    END;

  UNTIL ItemLedgEntry.NEXT = 0;
END ELSE BEGIN
  WhseEntry.RESET;
  WhseEntry.SETCURRENTKEY(
    "Location Code", "Bin Code", "Item No.", "Variant Code");
  WhseEntry.SETRANGE("Location Code", "Transfer-from Code");
  WhseEntry.SETRANGE("Bin Code", "Transfer-from Bin Code");
  WhseEntry.SETRANGE("Item No.", "Item No.");
  WhseEntry.SETRANGE("Variant Code", "Variant Code");
  WhseEntry.SETRANGE("Registering Date", 0D, TransHeader."Posting Date");
  IF WhseEntry.FIND('-') THEN
    REPEAT
      IF NOT FindTrackingSpec(SourceTrkgSpec, WhseEntry."Serial No.", WhseEntry."Lot No.", TempTrkgSpec)
      THEN BEGIN
        TempTrkgSpec := SourceTrkgSpec;
        TempTrkgSpec.VALIDATE("Lot No.", WhseEntry."Lot No.");     
        TempTrkgSpec.VALIDATE("Serial No.", WhseEntry."Serial No.");
        TempTrkgSpec.VALIDATE("Quantity (Base)", WhseEntry."Qty. (Base)");
        TempTrkgSpec."Entry No." := NextTrackingNo;
        TempTrkgSpec.INSERT;
        NextTrackingNo += 1;
      END ELSE BEGIN
        TempTrkgSpec."Quantity (Base)" += WhseEntry."Qty. (Base)";
        TempTrkgSpec.VALIDATE("Quantity (Base)");
        TempTrkgSpec.MODIFY;
      END;
    UNTIL WhseEntry.NEXT = 0;
END;

// Necessary in order not to reserve Lot Nos. with Quantity = 0
// Notwendig für individuelll angepasste Funktion
// ItemTrkgLines.RegisterItemTrackingLines
TempTrkgSpec.RESET;
IF TempTrkgSpec.FINDSET THEN
  REPEAT
    IF TempTrkgSpec."Quantity (Base)" <> 0 THEN BEGIN
      i += 1;
      TempTrkgSpec2 := TempTrkgSpec;
      TempTrkgSpec2."Entry No." := i;
      TempTrkgSpec2.INSERT;
    END;
  UNTIL TempTrkgSpec.NEXT = 0;

CLEAR(ItemTrkgLines);
ItemTrkgLines.SetBlockCommit(TRUE);
ItemTrkgLines.RegisterItemTrackingLines(SourceTrkgSpec, AvailDate, TempTrkgSpec2); // Hier Anpassungen notwendig


Variablen:
SourceTrkgSpec -> Record "Tracking Specification"
TempTrkgSpec -> Record "Tracking Specification", temporär
ItemTrkgMgtPhysInvtLine -> Codeunit "Item Track. Mgt. Ph. Inv. Line"
ReserveTransferLine -> Codeunit "Transfer Line-Reserve"
ItemTrkgLines -> Form 6510

Funktion FindTrackingSpec
Code:
// Parameter:
// SourceTrkgSpec : Record "Tracking Specification";
// SerialNo : Code[20];
// LotNo : Code[30];
// VAR TempTargetTrkgSpec : TEMPORARY Record "Tracking Specification"

WITH TempTargetTrkgSpec DO BEGIN
  RESET;
  SETRANGE("Source Type", SourceTrkgSpec."Source Type");
  SETRANGE("Source Subtype", SourceTrkgSpec."Source Subtype");
  SETRANGE("Source ID", SourceTrkgSpec."Source ID");
  SETRANGE("Source Ref. No.", SourceTrkgSpec."Source Ref. No.");
  SETRANGE("Serial No.", SerialNo);
  SETRANGE("Lot No.", LotNo);
  EXIT(FINDFIRST);
END;


Der Aufruf
Code:
ItemTrkgLines.RegisterItemTrackingLines
ist in Wirklichkeit bei uns per Branchenlösung angepasst, daher möchte ich ihn hier nicht veröffentlichen. Er soll aber allen anderen Ahnungslosen wie mich einen Ansatz bieten, wie es generell funktioniert.

Dieses Prinzip ist auf alle anderen Tabellen anwendbar, die im Standard über eine eigene Reservierungscodeunit verfügugen, z.B. für Sales Line, die die Codeunit "Sales Line-Reserve" mit der Funktion "InitTrackingSpecification" hat.

Alle Angaben ohne Gewähr! ;-)