将序列化项目跟踪详细信息添加到传输
因此,我们试图通过实施Microsoft Dynamics Business Central 365来弥补一些差距。当前测试V19 W1在本地。我们的用例之一涉及序列化项目。为了帮助快捷过程,由于序列号值在所有项目中都是唯一的,因此我们希望能够在串行级别管理项目。而不是使用首先提供项目编号值的两步过程,然后使用每个交易的序列号值。
这是一个基本示例。在“传输订单”页面中,我们希望将用户条形码扫描或将串行编号手工编号交给新的传输线的项目编号字段。然后,通过我的AL代码,我将序列号值进行回溯到“父”项目编号,临时存储序列号值,然后用适当的项目编号值替换字段内容。那是第一步。
然后,第二步将涉及为基础串行编号添加预订条目行,以便项目跟踪正确反映与传输线相关的串行编号。当我加载Al扩展代码时,由于序列化,我会遇到数量错误。尽管我可以在该特定字段中手动提供相同的确切项目,并且该页面允许我继续提供数量和其他内容。
我被告知我需要通过编程方式创建传输线,因此我试图定义所有相关的属性值。我将粘贴在我的Al代码中,以及验证错误的屏幕截图。一如既往的任何建议将不胜感激!
tableextension 50103 "DchApi_TransferTableExt" extends "Transfer Line"
{
fields
{
modify("Item No.")
{
trigger OnBeforeValidate()
var
Rec_ILE: Record "Item Ledger Entry";
Rec_ResEnt: Record "Reservation Entry" temporary;
Rec_ResEnt_Lu: Record "Reservation Entry";
Rec_TransLine: Record "Transfer Line";
Rec_Item: Record Item;
Rec_TransHdr: Record "Transfer Header";
CreateReservEntry: Codeunit "Create Reserv. Entry";
ItemTrackingMgt: Codeunit "Item Tracking Management";
ReservStatus: Enum "Reservation Status";
CurrentSourceRowID: Text[250];
SecondSourceRowID: Text[250];
SerialNo: Code[20];
ItemNo: Code[20];
ShortDim1Code: Code[20];
ShortDim2Code: Code[20];
Description: Text[100];
GenProdPostGrp: Code[20];
InvPostGrp: Code[20];
ItemCatCode: Code[20];
InTransCode: Code[10];
TransFromCode: Code[10];
TransToCode: Code[10];
LineNo: Integer;
begin
SerialNo := Rec."Item No.";
Rec_ILE.Reset();
Rec_ILE.SetRange("Entry Type", Rec_ILE."Entry Type"::Purchase);
Rec_ILE.SetRange("Item Tracking", Rec_ILE."Item Tracking"::"Serial No.");
Rec_ILE.SetFilter("Serial No.", '%1', SerialNo);
if Rec_ILE.FindFirst() then begin
ItemNo := Rec_ILE."Item No.";
Rec_Item.Reset();
Rec_Item.SetFilter("No.", ItemNo);
if Rec_Item.FindFirst() then begin
ShortDim1Code := Rec_Item."Global Dimension 1 Code";
ShortDim2Code := Rec_Item."Global Dimension 2 Code";
Description := Rec_Item.Description;
GenProdPostGrp := Rec_Item."Gen. Prod. Posting Group";
InvPostGrp := Rec_Item."Inventory Posting Group";
ItemCatCode := Rec_Item."Item Category Code";
Rec_TransHdr.Reset();
Rec_TransHdr.SetRange("No.", Rec."Document No.");
if Rec_TransHdr.FindFirst() then begin
InTransCode := Rec_TransHdr."In-Transit Code";
TransFromCode := Rec_TransHdr."Transfer-from Code";
TransToCode := Rec_TransHdr."Transfer-to Code";
Rec_TransLine.Reset();
Rec_TransLine.SetRange("Document No.", Rec."Document No.");
if Rec_TransLine.FindLast() then
LineNo := Rec_TransLine."Line No." + 10000
else
LineNo := 10000;
Validate(Rec."Document No.");
Validate(Rec."Line No.", LineNo);
Validate(Rec."Item No.", ItemNo);
Validate(Rec."Variant Code", '');
Validate(Rec."Shortcut Dimension 1 Code", ShortDim1Code);
Validate(Rec."Shortcut Dimension 2 Code", ShortDim2Code);
Validate(Rec.Description, Description);
Validate(Rec."Gen. Prod. Posting Group", GenProdPostGrp);
Validate(Rec."Inventory Posting Group", InvPostGrp);
Validate(Rec."Item Category Code", ItemCatCode);
Validate(Rec.Quantity, 1);
Validate(Rec."Unit of Measure Code", 'PCS');
Validate(Rec."Qty. to Ship", 1);
Validate(Rec."Qty. per Unit of Measure", 1);
Validate(Rec.Status, Rec.Status::Open);
Validate(Rec."In-Transit Code", InTransCode);
Validate(Rec."Transfer-from Code", TransFromCode);
Validate(Rec."Transfer-to Code", TransToCode);
Rec.Insert();
Rec_ResEnt.Init();
Rec_ResEnt_Lu.Reset();
if Rec_ResEnt_Lu.FindLast() then
Rec_ResEnt."Entry No." := Rec_ResEnt_Lu."Entry No." + 1
else
Rec_ResEnt."Entry No." := 1;
Rec_ResEnt."Expiration Date" := Today();
Rec_ResEnt.Quantity := 1;
Rec_ResEnt."Serial No." := SerialNo;
Rec_ResEnt.Insert();
CreateReservEntry.SetDates(0D, Rec_ResEnt."Expiration Date");
CreateReservEntry.CreateReservEntryFor(Database::"Transfer Line", 0, Rec."Document No.", '', Rec."Derived From Line No.", Rec."Line No.",
Rec."Qty. per Unit of Measure", Rec_ResEnt.Quantity, Rec."Qty. per Unit of Measure" * Rec_ResEnt.Quantity, Rec_ResEnt);
CreateReservEntry.CreateEntry(Rec."Item No.", Rec."Variant Code", Rec."Transfer-from Code", Rec.Description, Rec."Receipt Date", 0D, 0, ReservStatus::Surplus);
CurrentSourceRowID := ItemTrackingMgt.ComposeRowID(5741, 0, Rec."Document No.", '', 0, Rec."Line No.");
SecondSourceRowID := ItemTrackingMgt.ComposeRowID(5741, 1, Rec."Document No.", '', 0, Rec."Line No.");
ItemTrackingMgt.SynchronizeItemTracking(CurrentSourceRowID, SecondSourceRowID, '');
end;
end;
end;
end;
}
}
}
So we are trying to shore up some gaps with implementing Microsoft Dynamics Business Central 365. Currently testing out v19 W1 on-prem. One of our use cases involves serialized items. To help shortcut the process, since the Serial No. values are unique across all items, we'd like to be able to manage items at the serial level. Rather than employ the two-step process of first providing the Item No. value and then the Serial No. value for each transaction.
Here is a basic example. In the Transfer Order page we'd like to have the user barcode scan or hand-key the Serial No. into the Item No. field for a new transfer line. Through my AL code I'd then take that Serial No. value, backtrace it to the "parent" Item No., temporarily store the Serial No. value, and then replace the field contents with the proper Item No. value. That's step one.
Step two would then involve adding a Reservation Entry line for the underlying Serial No. So that the item tracking would properly reflect the Serial No. that's associated with the transfer line. When I load up my AL extension code I encounter a quantity error, due to serialization. Although I can manually provide the same exact Item No. in that particular field and the page allows me to then proceed along in providing the quantity and whatnot.
I was advised that I need to programmatically create the transfer line, so I have attempted to define all pertinent property values. I'll paste in my AL code, along with a screen shot of the validation error. Any advice would be appreciated, as always!
tableextension 50103 "DchApi_TransferTableExt" extends "Transfer Line"
{
fields
{
modify("Item No.")
{
trigger OnBeforeValidate()
var
Rec_ILE: Record "Item Ledger Entry";
Rec_ResEnt: Record "Reservation Entry" temporary;
Rec_ResEnt_Lu: Record "Reservation Entry";
Rec_TransLine: Record "Transfer Line";
Rec_Item: Record Item;
Rec_TransHdr: Record "Transfer Header";
CreateReservEntry: Codeunit "Create Reserv. Entry";
ItemTrackingMgt: Codeunit "Item Tracking Management";
ReservStatus: Enum "Reservation Status";
CurrentSourceRowID: Text[250];
SecondSourceRowID: Text[250];
SerialNo: Code[20];
ItemNo: Code[20];
ShortDim1Code: Code[20];
ShortDim2Code: Code[20];
Description: Text[100];
GenProdPostGrp: Code[20];
InvPostGrp: Code[20];
ItemCatCode: Code[20];
InTransCode: Code[10];
TransFromCode: Code[10];
TransToCode: Code[10];
LineNo: Integer;
begin
SerialNo := Rec."Item No.";
Rec_ILE.Reset();
Rec_ILE.SetRange("Entry Type", Rec_ILE."Entry Type"::Purchase);
Rec_ILE.SetRange("Item Tracking", Rec_ILE."Item Tracking"::"Serial No.");
Rec_ILE.SetFilter("Serial No.", '%1', SerialNo);
if Rec_ILE.FindFirst() then begin
ItemNo := Rec_ILE."Item No.";
Rec_Item.Reset();
Rec_Item.SetFilter("No.", ItemNo);
if Rec_Item.FindFirst() then begin
ShortDim1Code := Rec_Item."Global Dimension 1 Code";
ShortDim2Code := Rec_Item."Global Dimension 2 Code";
Description := Rec_Item.Description;
GenProdPostGrp := Rec_Item."Gen. Prod. Posting Group";
InvPostGrp := Rec_Item."Inventory Posting Group";
ItemCatCode := Rec_Item."Item Category Code";
Rec_TransHdr.Reset();
Rec_TransHdr.SetRange("No.", Rec."Document No.");
if Rec_TransHdr.FindFirst() then begin
InTransCode := Rec_TransHdr."In-Transit Code";
TransFromCode := Rec_TransHdr."Transfer-from Code";
TransToCode := Rec_TransHdr."Transfer-to Code";
Rec_TransLine.Reset();
Rec_TransLine.SetRange("Document No.", Rec."Document No.");
if Rec_TransLine.FindLast() then
LineNo := Rec_TransLine."Line No." + 10000
else
LineNo := 10000;
Validate(Rec."Document No.");
Validate(Rec."Line No.", LineNo);
Validate(Rec."Item No.", ItemNo);
Validate(Rec."Variant Code", '');
Validate(Rec."Shortcut Dimension 1 Code", ShortDim1Code);
Validate(Rec."Shortcut Dimension 2 Code", ShortDim2Code);
Validate(Rec.Description, Description);
Validate(Rec."Gen. Prod. Posting Group", GenProdPostGrp);
Validate(Rec."Inventory Posting Group", InvPostGrp);
Validate(Rec."Item Category Code", ItemCatCode);
Validate(Rec.Quantity, 1);
Validate(Rec."Unit of Measure Code", 'PCS');
Validate(Rec."Qty. to Ship", 1);
Validate(Rec."Qty. per Unit of Measure", 1);
Validate(Rec.Status, Rec.Status::Open);
Validate(Rec."In-Transit Code", InTransCode);
Validate(Rec."Transfer-from Code", TransFromCode);
Validate(Rec."Transfer-to Code", TransToCode);
Rec.Insert();
Rec_ResEnt.Init();
Rec_ResEnt_Lu.Reset();
if Rec_ResEnt_Lu.FindLast() then
Rec_ResEnt."Entry No." := Rec_ResEnt_Lu."Entry No." + 1
else
Rec_ResEnt."Entry No." := 1;
Rec_ResEnt."Expiration Date" := Today();
Rec_ResEnt.Quantity := 1;
Rec_ResEnt."Serial No." := SerialNo;
Rec_ResEnt.Insert();
CreateReservEntry.SetDates(0D, Rec_ResEnt."Expiration Date");
CreateReservEntry.CreateReservEntryFor(Database::"Transfer Line", 0, Rec."Document No.", '', Rec."Derived From Line No.", Rec."Line No.",
Rec."Qty. per Unit of Measure", Rec_ResEnt.Quantity, Rec."Qty. per Unit of Measure" * Rec_ResEnt.Quantity, Rec_ResEnt);
CreateReservEntry.CreateEntry(Rec."Item No.", Rec."Variant Code", Rec."Transfer-from Code", Rec.Description, Rec."Receipt Date", 0D, 0, ReservStatus::Surplus);
CurrentSourceRowID := ItemTrackingMgt.ComposeRowID(5741, 0, Rec."Document No.", '', 0, Rec."Line No.");
SecondSourceRowID := ItemTrackingMgt.ComposeRowID(5741, 1, Rec."Document No.", '', 0, Rec."Line No.");
ItemTrackingMgt.SynchronizeItemTracking(CurrentSourceRowID, SecondSourceRowID, '');
end;
end;
end;
end;
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我发现了。我将序列号值添加为全局变量,然后将预订条目和项目跟踪列入onafterValidate()触发器。现在一切正常。下面的完整源代码。
I figured it out. I added the Serial No. value as a global variable, and broke out the reservation entry and item tracking into an OnAfterValidate() trigger. Everything works fine now. Full source code below.