Table 1302 Dimensions Template

App
Base Application
Namespace
Microsoft.Finance.Dimension
Versions
17-28

Fields, 7Keys, 1Procedures, 4Events, 2

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/Dimension/DimensionsTemplate.Table.al352 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.Dimension;

using System.IO;

/// <summary>
/// Stores dimension template definitions for automated default dimension assignment during master record creation.
/// Enables configuration of dimension patterns that can be applied to new master data records through templates.
/// </summary>
/// <remarks>
/// Integrates with configuration templates to provide dimension defaults during record setup processes.
/// Supports dimension template inheritance and bulk application for master data initialization workflows.
/// </remarks>
table 1302 "Dimensions Template"
{
    Caption = 'Dimensions Template';
    ReplicateData = true;
    DataClassification = CustomerContent;

    fields
    {
        /// <summary>
        /// Unique identifier for the dimension template configuration.
        /// </summary>
        field(1; "Code"; Code[10])
        {
            Caption = 'Code';
            NotBlank = true;
        }
        /// <summary>
        /// Dimension code for which the template defines default assignment rules.
        /// </summary>
        field(3; "Dimension Code"; Code[20])
        {
            Caption = 'Dimension Code';
            ToolTip = 'Specifies the code for the default dimension.';
            NotBlank = true;
            TableRelation = Dimension;

            trigger OnValidate()
            begin
                if xRec."Dimension Code" <> "Dimension Code" then begin
                    "Dimension Value Code" := '';
                    "Value Posting" := "Value Posting"::" ";
                end;
            end;
        }
        /// <summary>
        /// Specific dimension value code to be assigned when applying this template.
        /// </summary>
        field(4; "Dimension Value Code"; Code[20])
        {
            Caption = 'Dimension Value Code';
            ToolTip = 'Specifies the dimension value code to suggest as the default dimension.';
            TableRelation = "Dimension Value".Code where("Dimension Code" = field("Dimension Code"),
                                                         Blocked = const(false));
        }
        /// <summary>
        /// Posting behavior for the dimension value assignment from this template.
        /// </summary>
        field(5; "Value Posting"; Enum "Default Dimension Value Posting Type")
        {
            Caption = 'Value Posting';
            ToolTip = 'Specifies how default dimensions and their values must be used.';

            trigger OnValidate()
            begin
                if "Value Posting" = "Value Posting"::"No Code" then
                    TestField("Dimension Value Code", '');
            end;
        }
        /// <summary>
        /// Descriptive text for the dimension template configuration and usage purpose.
        /// </summary>
        field(50; Description; Text[100])
        {
            Caption = 'Description';

            trigger OnValidate()
            begin
                Description := GetParentTemplateCode();
            end;
        }
        /// <summary>
        /// Table ID of the master data table for which this dimension template applies.
        /// </summary>
        field(51; "Table Id"; Integer)
        {
            Caption = 'Table Id';

            trigger OnValidate()
            var
                TableIdFilter: Text;
            begin
                if "Table Id" = 0 then begin
                    TableIdFilter := GetFilter("Table Id");
                    Evaluate("Table Id", TableIdFilter);
                end;
            end;
        }
        /// <summary>
        /// Master record template code that this dimension template is associated with for coordinated application.
        /// </summary>
        field(52; "Master Record Template Code"; Code[10])
        {
            Caption = 'Master Record Template Code';
        }
    }

    keys
    {
        key(Key1; "Code")
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    trigger OnDelete()
    var
        ConfigTemplateHeader: Record "Config. Template Header";
    begin
        if ConfigTemplateHeader.Get(Code) then begin
            ConfigTemplateManagement.RemoveRelatedTemplate("Master Record Template Code", Code);
            ConfigTemplateHeader.Delete(true);
        end;
    end;

    trigger OnInsert()
    begin
        "Master Record Template Code" := GetParentTemplateCode();
        Validate(Description);
        Validate("Table Id");
        InsertConfigurationTemplateHeaderAndLines();
    end;

    trigger OnModify()
    var
        FieldRefArray: array[3] of FieldRef;
        RecRef: RecordRef;
    begin
        TestField(Code);
        Validate("Table Id");

        RecRef.GetTable(Rec);
        CreateFieldRefArray(FieldRefArray, RecRef);
        ConfigTemplateManagement.UpdateConfigTemplateAndLines(Code, Description, Database::"Default Dimension", FieldRefArray);
    end;

    var
        ConfigTemplateManagement: Codeunit "Config. Template Management";

    local procedure CreateFieldRefArray(var FieldRefArray: array[3] of FieldRef; RecRef: RecordRef)
    var
        I: Integer;
    begin
        I := 1;

        AddToArray(FieldRefArray, I, RecRef.Field(FieldNo("Dimension Code")));
        AddToArray(FieldRefArray, I, RecRef.Field(FieldNo("Dimension Value Code")));
        AddToArray(FieldRefArray, I, RecRef.Field(FieldNo("Value Posting")));
        OnAfterCreateFieldRefArray(FieldRefArray, RecRef);
    end;

    local procedure AddToArray(var FieldRefArray: array[23] of FieldRef; var I: Integer; CurrFieldRef: FieldRef)
    begin
        FieldRefArray[I] := CurrFieldRef;
        I += 1;
    end;

    /// <summary>
    /// Initializes dimension templates from a master record template for coordinated record creation.
    /// Creates temporary dimension template records based on template configuration relationships.
    /// </summary>
    /// <param name="MasterRecordTemplateCode">Master record template code to process</param>
    /// <param name="TempDimensionsTemplate">Temporary dimension template records to populate</param>
    /// <param name="TableID">Table ID for the target master data table</param>
    procedure InitializeTemplatesFromMasterRecordTemplate(MasterRecordTemplateCode: Code[10]; var TempDimensionsTemplate: Record "Dimensions Template" temporary; TableID: Integer)
    var
        ConfigTemplateHeader: Record "Config. Template Header";
        ConfigTemplateLine: Record "Config. Template Line";
    begin
        ConfigTemplateLine.SetRange("Data Template Code", MasterRecordTemplateCode);
        ConfigTemplateLine.SetRange(Type, ConfigTemplateLine.Type::"Related Template");

        if ConfigTemplateLine.FindSet() then
            repeat
                ConfigTemplateHeader.Get(ConfigTemplateLine."Template Code");
                InitializeTempRecordFromConfigTemplate(TempDimensionsTemplate, ConfigTemplateHeader, MasterRecordTemplateCode, TableID);
            until ConfigTemplateLine.Next() = 0;
    end;

    /// <summary>
    /// Initializes a temporary dimension template record from a configuration template header.
    /// Applies template field values and establishes relationships for dimension automation.
    /// </summary>
    /// <param name="TempDimensionsTemplate">Temporary dimension template record to initialize</param>
    /// <param name="ConfigTemplateHeader">Configuration template header providing field values</param>
    /// <param name="MasterRecordTemplateCode">Master record template code for association</param>
    /// <param name="TableID">Table ID for the target master data table</param>
    procedure InitializeTempRecordFromConfigTemplate(var TempDimensionsTemplate: Record "Dimensions Template" temporary; ConfigTemplateHeader: Record "Config. Template Header"; MasterRecordTemplateCode: Code[10]; TableID: Integer)
    var
        RecRef: RecordRef;
    begin
        TempDimensionsTemplate.Init();
        TempDimensionsTemplate.Code := ConfigTemplateHeader.Code;
        TempDimensionsTemplate.Description := ConfigTemplateHeader.Description;
        TempDimensionsTemplate."Master Record Template Code" := MasterRecordTemplateCode;
        TempDimensionsTemplate."Dimension Code" := GetDefaultDimensionCode(ConfigTemplateHeader);
        TempDimensionsTemplate."Table Id" := TableID;
        TempDimensionsTemplate.Insert();

        RecRef.GetTable(TempDimensionsTemplate);

        ConfigTemplateManagement.ApplyTemplateLinesWithoutValidation(ConfigTemplateHeader, RecRef);

        RecRef.SetTable(TempDimensionsTemplate);
    end;

    local procedure InsertConfigurationTemplateHeaderAndLines()
    var
        FieldRefArray: array[3] of FieldRef;
        RecRef: RecordRef;
    begin
        RecRef.GetTable(Rec);
        CreateFieldRefArray(FieldRefArray, RecRef);
        ConfigTemplateManagement.CreateConfigTemplateAndLines(Code, Description, Database::"Default Dimension", FieldRefArray);
        ConfigTemplateManagement.AddRelatedTemplate(GetParentTemplateCode(), Code);
    end;

    /// <summary>
    /// Inserts default dimensions for a master record using configured dimension templates.
    /// Applies all related dimension templates to establish complete dimension setup for new records.
    /// </summary>
    /// <param name="ConfigTemplateHeader">Configuration template header containing dimension template relationships</param>
    /// <param name="MasterRecordNo">Master record number for dimension assignment</param>
    /// <param name="TableID">Table ID of the master data table</param>
    procedure InsertDimensionsFromTemplates(ConfigTemplateHeader: Record "Config. Template Header"; MasterRecordNo: Code[20]; TableID: Integer)
    var
        ConfigTemplateLine: Record "Config. Template Line";
    begin
        ConfigTemplateLine.SetRange(Type, ConfigTemplateLine.Type::"Related Template");
        ConfigTemplateLine.SetRange("Data Template Code", ConfigTemplateHeader.Code);

        if ConfigTemplateLine.FindSet() then
            repeat
                ConfigTemplateHeader.Get(ConfigTemplateLine."Template Code");
                if ConfigTemplateHeader."Table ID" = Database::"Default Dimension" then
                    InsertDimensionFromTemplate(ConfigTemplateHeader, MasterRecordNo, TableID);
            until ConfigTemplateLine.Next() = 0;
    end;

    local procedure InsertDimensionFromTemplate(ConfigTemplateHeader: Record "Config. Template Header"; MasterRecordNo: Code[20]; TableID: Integer)
    var
        DefaultDimension: Record "Default Dimension";
        ConfigTemplateMgt: Codeunit "Config. Template Management";
        RecRef: RecordRef;
    begin
        DefaultDimension.Init();
        DefaultDimension."No." := MasterRecordNo;
        DefaultDimension."Table ID" := TableID;
        DefaultDimension."Dimension Code" := GetDefaultDimensionCode(ConfigTemplateHeader);
        if not DefaultDimension.Find() then
            DefaultDimension.Insert();

        RecRef.GetTable(DefaultDimension);
        ConfigTemplateMgt.UpdateRecord(ConfigTemplateHeader, RecRef);
        RecRef.SetTable(DefaultDimension);
    end;

    local procedure GetDefaultDimensionCode(ConfigTemplateHeader: Record "Config. Template Header"): Text[20]
    var
        ConfigTemplateLine: Record "Config. Template Line";
    begin
        ConfigTemplateLine.SetRange("Data Template Code", ConfigTemplateHeader.Code);
        ConfigTemplateLine.SetRange("Field ID", FieldNo("Dimension Code"));
        ConfigTemplateLine.FindFirst();

        exit(ConfigTemplateLine."Default Value");
    end;

    local procedure GetParentTemplateCode(): Text[10]
    begin
        exit(GetFilter("Master Record Template Code"));
    end;

    /// <summary>
    /// Creates dimension templates from an existing master record's default dimension configuration.
    /// Enables template generation based on proven dimension setups for replication purposes.
    /// </summary>
    /// <param name="MasterRecordNo">Master record number to copy dimensions from</param>
    /// <param name="MasterRecordTemplateCode">Master record template code for association</param>
    /// <param name="TableID">Table ID of the master data table</param>
    procedure CreateTemplatesFromExistingMasterRecord(MasterRecordNo: Code[20]; MasterRecordTemplateCode: Code[10]; TableID: Integer)
    var
        DefaultDimension: Record "Default Dimension";
    begin
        DefaultDimension.SetRange("No.", MasterRecordNo);
        DefaultDimension.SetRange("Table ID", TableID);

        if DefaultDimension.FindSet() then
            repeat
                CreateTemplateFromExistingDefaultDimension(DefaultDimension, MasterRecordTemplateCode);
            until DefaultDimension.Next() = 0;
    end;

    local procedure CreateTemplateFromExistingDefaultDimension(DefaultDimension: Record "Default Dimension"; MasterRecordTemplateCode: Code[10])
    var
        RecRef: RecordRef;
        FieldRefArray: array[3] of FieldRef;
        NewTemplateCode: Code[10];
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateTemplateFromExistingDefaultDimension(DefaultDimension, MasterRecordTemplateCode, IsHandled);
        if IsHandled then
            exit;

        RecRef.GetTable(DefaultDimension);
        CreateFieldRefArray(FieldRefArray, RecRef);

        ConfigTemplateManagement.CreateConfigTemplateAndLines(
          NewTemplateCode, MasterRecordTemplateCode, Database::"Default Dimension", FieldRefArray);
        ConfigTemplateManagement.AddRelatedTemplate(MasterRecordTemplateCode, NewTemplateCode);
    end;

    [IntegrationEvent(false, false)]
    [Scope('OnPrem')]
    procedure OnAfterCreateFieldRefArray(var FieldRefArray: array[23] of FieldRef; RecRef: RecordRef)
    begin
    end;

    /// <summary>
    /// Integration event raised before creating template from existing default dimension record.
    /// Enables customization of template creation logic for default dimension automation.
    /// </summary>
    /// <param name="DefaultDimension">Default dimension record being processed for template creation</param>
    /// <param name="MasterRecordTemplateCode">Master record template code for association</param>
    /// <param name="IsHandled">Set to true to skip standard template creation processing</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateTemplateFromExistingDefaultDimension(DefaultDimension: Record "Default Dimension"; MasterRecordTemplateCode: Code[10]; var IsHandled: Boolean)
    begin
    end;
}