Dynamics 365 Business Central Dimension Set 维度集 & Default Dimension 预设维的AL Code简介

#Dynamics 365 BC ERP# #Navision# #Dimension# #AL Code# #AL Language#

介绍BC ERP 的维度集。

在如销售单,采购单,Project(Job)等Document 类型的单据中,并不像Journal 类型的Entry中 分别有Global dimension来保存 Dimension value.  而是在单据中保存一个Dimension SetID, 然后能过这个SetID 关联到子表 Record "Dimension Set Entry"。Dimension Set经常用到的CodeUnit 408是很重要的,里面有很多内置Function。

代码示例1:

下面这个代码示例是 在有些客户的咨询过程中,客户希望能过自动增加SO这个Dimension来跟踪 成本费用等。 这种预设给单据编号的AL Code 二次开发,在实际咨询中是很常见的。

//订阅 销售单 客户编号 Validate 事件

    [EventSubscriber(ObjectType::Table, Database::"Sales Header", 'OnAfterValidateEvent', 'Sell-to Customer No.', true, true)]

    local procedure OnAfterSellToCustomerNoValidate(var Rec: Record "Sales Header"; var xRec: Record "Sales Header"; CurrFieldNo: Integer)

    var

        DimMgt: Codeunit "DimensionManagement";

        TempDimSetEntry: Record "Dimension Set Entry" temporary;

        NewCustNo: Code[20];

        OldCustNo: Code[20];

        CustDimSetID: Integer;

        DimVal: Record "Dimension Value";

        IsSONODimensionPresent: Boolean;

        DimSetID: Integer;

    begin

        if rec."Document Type" <> rec."Document Type"::Order then

            exit;

        CustDimSetID := Rec."Dimension Set ID";

 

        // 检查是否存在客户维度集,如果存在则初始化 TempDimSetEntry

        if CustDimSetID <> 0 then

            DimMgt.GetDimensionSet(TempDimSetEntry, CustDimSetID);

 

        // 检查临时表中是否已经存在 'SONO' 维度

        IsSONODimensionPresent := false;

        if TempDimSetEntry.FindSet() then

            repeat

                if TempDimSetEntry."Dimension Code" = 'SONO' then begin

                    IsSONODimensionPresent := true;

                    exit;

                end;

            until TempDimSetEntry.Next() = 0;

 

        // 如果 'SONO' 维度不存在,则创建维度值以及插入新的维度条目

        if not IsSONODimensionPresent then begin

            // 检查并创建维度值

            if not DimVal.Get('SONO', rec."No.") then begin

                DimVal.Init();

                DimVal."Dimension Code" := 'SONO';

                DimVal.Code := rec."No.";

                //DimVal.Description := 'Sales Order No.';

                DimVal.Insert();

            end;

 

            // 初始化新的维度条目

            TempDimSetEntry.INIT;

            TempDimSetEntry."Dimension Code" := 'SONO'; // 确保此代码已经在维度表中定义

            TempDimSetEntry."Dimension Value Code" := rec."No."; // 使用销售订单的编号作为维度值代码

            TempDimSetEntry."Dimension Value ID" := DimVal."Dimension Value ID"; // 获取维度值 ID

            // 插入到临时表中

            TempDimSetEntry.INSERT;

 

            // 获取新的维度集 ID

            DimSetID := DimMgt.GetDimensionSetID(TempDimSetEntry);

 

            // 更新销售订单头的维度集 ID

            if rec."Dimension Set ID" <> DimSetID then begin

                rec.Validate("Dimension Set ID", DimSetID);

                rec.MODIFY;

            end;

        end;

    end;

预设唯的介绍:

在Create 客户,供应商等都可以设定Defautl 唯,然后自动带到相应的Document 或 Journal中。

示例代码2:

初如化预设的Defalut 的维度。如客户,供应商等,这些预设的维度条目就会自动带到相应的Document中。 这个在实际咨询的过程中,也是客户经常提到的。下面代码在新建一个客户时,需要自动创建一个客户维,Value同客户编号;新建一个销售员维,Value 可以取客户里的销售员。

//订阅  Customer Insert 事件

    [EventSubscriber(ObjectType::Table, Database::Customer, 'OnAfterInsertEvent', '', false, false)]

    local procedure OnAfterCustomerInsert(var Rec: Record Customer)

    var

        DimVal: Record "Dimension Value";

        DimMgt: Codeunit "DimensionManagement";

       // TempDimSetEntry: Record "Dimension Set Entry" temporary;

        DefaultDim: Record "Default Dimension";

        NewDimSetID: Integer;

        DimCode: Code[20];

    begin

        DimCode := 'CUSTOMER';

        // 检查并创建维度值

        if not DimVal.Get('CUSTOMER', Rec."No.") then begin

            DimVal.Init();

            DimVal."Dimension Code" := DimCode;

            DimVal.Code := Rec."No.";

            //DimVal.Description := 'Customer No.';

            DimVal.Insert();

        end;

 

        // 初始化客户 维度条目

        DefaultDim.INIT;

        defaultdim."Table ID" := 18;

        defaultdim."No." := Rec."No.";

 

        DefaultDim."Dimension Code" := DimCode;

        DefaultDim."Dimension Value Code" := Rec."No.";

        //DefaultDim."Dimension Value ID" := DimVal."Dimension Value ID";

        DefaultDim.INSERT;

 

        //客户初始化 部门 维度条目

        DefaultDim.INIT;

        defaultdim."Table ID" := 18;

        defaultdim."No." := Rec."No.";

        DefaultDim."Dimension Code" := 'DEPARTMENT';

        DefaultDim."Dimension Value Code" := 'SALES';

        //DefaultDim."Dimension Value ID" := DimVal."Dimension Value ID";

        DefaultDim.INSERT;

        // 更新 销售员 记录的全局维度字段

        if Rec."Global Dimension 1 Code" <> 'SALES' then begin

            Rec."Global Dimension 1 Code" := 'SALES';

            Rec.MODIFY;

        end;

        //客户初始化 销售员 维度条目

        DefaultDim.INIT;

        defaultdim."Table ID" := 18;

        defaultdim."No." := Rec."No.";

        DefaultDim."Dimension Code" := 'SALESPERSON';

        DefaultDim."Dimension Value Code" := 'EM001';

        //DefaultDim."Dimension Value ID" := DimVal."Dimension Value ID";

        DefaultDim.INSERT;

    end;

 

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