Dynamics 365 Business Central AL Code 公司间物料同步的Code参考

#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...

你可能感兴趣的:(Dynamics,365,Business,Central,D365,BC,ERP,Dynamics,365)