#Dynamics 365 BC ERP# #Navision# #Dimension# #AL Code# #AL Language#
在如销售单,采购单,Project(Job)等Document 类型的单据中,并不像Journal 类型的Entry中 分别有Global dimension来保存 Dimension value. 而是在单据中保存一个Dimension SetID, 然后能过这个SetID 关联到子表 Record "Dimension Set Entry"。Dimension Set经常用到的CodeUnit 408是很重要的,里面有很多内置Function。
下面这个代码示例是 在有些客户的咨询过程中,客户希望能过自动增加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中。
初如化预设的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;