#BC ERP# #D365 ERP# #Navision#
前言
在BC实施过程中,经常会碰到客户有多个公司,但物料是相同的。因为都在BC平台,用Power Automate方案也是可行,但往往用AL Code实现更容易。
CodeUnit 实现Sync item to Other company
codeunit 50100 ItemSyncSubscriber
{
Subtype = EventSubscriber;
[EventSubscriber(ObjectType::Table, Database::Item, 'OnAfterInsertEvent', '', false, false)]
local procedure OnItemInsert(var Rec: Record Item)
begin
//这里的exit很有必要,注意不要陷入事务循环中
if not IsSourceCompanyA() then
exit;
SyncItemToCompanies(Rec);
end;
[EventSubscriber(ObjectType::Table, Database::Item, 'OnAfterModifyEvent', '', false, false)]
local procedure OnItemModify(var Rec: Record Item)
begin
if not IsSourceCompanyA() then
exit;
SyncItemToCompanies(Rec);
end;
[EventSubscriber(ObjectType::Table, Database::Item, 'OnAfterDeleteEvent', '', false, false)]
local procedure OnItemDelete(var Rec: Record Item)
begin
if not IsSourceCompanyA() then
exit;
DeleteItemInCompanies(Rec."No.");
end;
local procedure SyncItemToCompanies(SourceItem: Record Item)
var
CompanyList: List of [Text];
TargetItem: Record Item;
TargetCompany: Text;
begin
CompanyList.Add('公司B');
CompanyList.Add('公司C');
foreach TargetCompany in CompanyList do begin
TargetItem.CHANGECOMPANY(TargetCompany);
if TargetItem.Get(SourceItem."No.") then begin
TargetItem.TransferFields(SourceItem);
TargetItem.Modify();
end else begin
TargetItem.Init();
TargetItem.TransferFields(SourceItem);
TargetItem.Insert();
end;
end;
end;
local procedure DeleteItemInCompanies(ItemNo: Code[20])
var
CompanyList: List of [Text];
TargetItem: Record Item;
TargetCompany: Text;
begin
CompanyList.Add('公司B');
CompanyList.Add('公司C');
foreach TargetCompany in CompanyList do begin
TargetItem.CHANGECOMPANY(TargetCompany);
if TargetItem.Get(ItemNo) then
TargetItem.Delete();
end;
end;
local procedure IsSourceCompanyA(): Boolean
begin
exit(COMPANYNAME = '公司A');
end;
}
扩展Item Page
只有母公司的物料卡可以编辑,其它公司的物料不可以编辑。根据业务需要。
trigger OnOpenPage()
begin
IsEditable := (COMPANYNAME = '公司A');
end;
***特别注意,如果要用此功能,请注意各个setting要一置。如currency, payterms,salesperson...