Page 7138 Purchase Budget Overview, source in 29

Source29

src/Layers/W1/BaseApp/Purchases/Analysis/PurchaseBudgetOverview.Page.al1007 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.Purchases.Analysis;

using Microsoft.Finance.Analysis;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.Period;
using Microsoft.Inventory.Analysis;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using System.Text;
using System.Utilities;

page 7138 "Purchase Budget Overview"
{
    Caption = 'Purchase Budget Overview';
    DeleteAllowed = false;
    InsertAllowed = false;
    LinksAllowed = false;
    PageType = ListPlus;
    SaveValues = true;

    layout
    {
        area(content)
        {
            group(General)
            {
                Caption = 'General';
                field(CurrentBudgetName; CurrentBudgetName)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Item Budget Name';
                    ToolTip = 'Specifies the name of the budget to be shown in the window.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        ItemBudgetManagement.LookupItemBudgetName(
                          CurrentBudgetName, ItemBudgetName, ItemStatisticsBuffer,
                          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
                        ItemBudgetManagement.ValidateLineDimTypeAndCode(
                          ItemBudgetName, LineDimCode, LineDimType, ColumnDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        ItemBudgetManagement.ValidateColumnDimTypeAndCode(
                          ItemBudgetName, ColumnDimCode, ColumnDimType, LineDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        UpdateDimCtrls();
                        UpdateMatrixSubForm();
                        CurrPage.Update(false);
                    end;

                    trigger OnValidate()
                    begin
                        ItemBudgetManagement.CheckBudgetName(CurrentAnalysisArea.AsInteger(), CurrentBudgetName, ItemBudgetName);
                        UpdateMatrixSubForm();
                        CurrentBudgetNameOnAfterValida();
                    end;
                }
                field(LineDimCode; LineDimCode)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Show as Lines';
                    ToolTip = 'Specifies which values you want to show as lines in the window. This allows you to see the same matrix window from various perspectives, especially when you use both the Show as Lines field and the Show as Columns field.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        NewCode: Text[30];
                    begin
                        NewCode := ItemBudgetManagement.GetDimSelection(LineDimCode, ItemBudgetName);
                        if NewCode <> LineDimCode then begin
                            Text := NewCode;
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    begin
                        if (UpperCase(LineDimCode) = UpperCase(ColumnDimCode)) and (LineDimCode <> '') then begin
                            ColumnDimCode := '';
                            ItemBudgetManagement.ValidateColumnDimTypeAndCode(
                              ItemBudgetName, ColumnDimCode, ColumnDimType, LineDimType,
                              InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        end;
                        ItemBudgetManagement.ValidateLineDimTypeAndCode(
                          ItemBudgetName, LineDimCode, LineDimType, ColumnDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        LineDimCodeOnAfterValidate();
                    end;
                }
                field(ColumnDimCode; ColumnDimCode)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Show as Columns';
                    ToolTip = 'Specifies which values you want to show as columns in the window. This allows you to see the same matrix window from various perspectives, especially when you use both the Show as Lines field and the Show as Columns field.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        NewCode: Text[30];
                    begin
                        NewCode := ItemBudgetManagement.GetDimSelection(ColumnDimCode, ItemBudgetName);
                        if NewCode <> ColumnDimCode then begin
                            Text := NewCode;
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    begin
                        if (UpperCase(LineDimCode) = UpperCase(ColumnDimCode)) and (LineDimCode <> '') then begin
                            LineDimCode := '';
                            ItemBudgetManagement.ValidateLineDimTypeAndCode(
                              ItemBudgetName, LineDimCode, LineDimType, ColumnDimType,
                              InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        end;
                        ItemBudgetManagement.ValidateColumnDimTypeAndCode(
                          ItemBudgetName, ColumnDimCode, ColumnDimType, LineDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);

                        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        ColumnDimCodeOnAfterValidate();
                    end;
                }
                field(ValueType; ValueType)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Show Value as';
                    ToolTip = 'Specifies if you want to view the item values by cost amount or by quantity.';

                    trigger OnValidate()
                    begin
                        ValueTypeOnAfterValidate();
                    end;
                }
                field(PeriodType; PeriodType)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'View by';
                    ToolTip = 'Specifies by which period amounts are displayed.';

                    trigger OnValidate()
                    begin
                        FindPeriod('');
                        PeriodTypeOnAfterValidate();
                    end;
                }
                field(RoundingFactor; RoundingFactor)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Rounding Factor';
                    ToolTip = 'Specifies the factor that is used to round the amounts in the columns.';

                    trigger OnValidate()
                    begin
                        RoundingFactorOnAfterValidate();
                    end;
                }
                field(ShowColumnName; ShowColumnName)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Show Column Name';
                    ToolTip = 'Specifies that the names of columns are shown in the matrix window.';

                    trigger OnValidate()
                    begin
                        ShowColumnNameOnAfterValidate();
                    end;
                }
            }
            part(MATRIX; "Purch. Budget Overview Matrix")
            {
                ApplicationArea = PurchaseBudget;
            }
            group(Filters)
            {
                Caption = 'Filters';
                field(DateFilter; DateFilter)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Date Filter';
                    ToolTip = 'Specifies a date filter by which budget amounts are displayed.';

                    trigger OnValidate()
                    var
                        FilterTokens: Codeunit "Filter Tokens";
                    begin
                        FilterTokens.MakeDateFilter(DateFilter);
                        ItemStatisticsBuffer.SetFilter("Date Filter", DateFilter);
                        DateFilter := ItemStatisticsBuffer.GetFilter("Date Filter");
                        InternalDateFilter := DateFilter;
                        DateFilterOnAfterValidate();
                    end;
                }
                field(SalesCodeFilterCtrl; SourceNoFilter)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Vendor Filter';
                    ToolTip = 'Specifies that the budget is delimited by the vendors from whom items are purchased.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        CustList: Page "Customer List";
                        VendList: Page "Vendor List";
                    begin
                        case SourceTypeFilter of
                            SourceTypeFilter::Customer:
                                begin
                                    CustList.LookupMode := true;
                                    if CustList.RunModal() = ACTION::LookupOK then
                                        Text := CustList.GetSelectionFilter()
                                    else
                                        exit(false);
                                end;
                            SourceTypeFilter::Vendor:
                                begin
                                    VendList.LookupMode := true;
                                    if VendList.RunModal() = ACTION::LookupOK then
                                        Text := VendList.GetSelectionFilter()
                                    else
                                        exit(false);
                                end;
                        end;

                        exit(true);
                    end;

                    trigger OnValidate()
                    begin
                        SourceNoFilterOnAfterValidate();
                    end;
                }
                field(ItemFilter; ItemFilter)
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Item Filter';
                    ToolTip = 'Specifies which items to include in the budget overview.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        ItemList: Page "Item List";
                    begin
                        ItemList.LookupMode(true);
                        if ItemList.RunModal() = ACTION::LookupOK then begin
                            Text := ItemList.GetSelectionFilter();
                            exit(true);
                        end;
                    end;

                    trigger OnValidate()
                    begin
                        ItemFilterOnAfterValidate();
                    end;
                }
                field(BudgetDim1Filter; BudgetDim1Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = GetCaptionClass(1);
                    Caption = 'Budget Dimension 1 Filter';
                    Enabled = BudgetDim1FilterEnable;
                    ToolTip = 'Specifies a filter by a budget dimension. ';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(LookUpDimFilter(ItemBudgetName."Budget Dimension 1 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        BudgetDim1FilterOnAfterValidat();
                    end;
                }
                field(BudgetDim2Filter; BudgetDim2Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = GetCaptionClass(2);
                    Caption = 'Budget Dimension 2 Filter';
                    Enabled = BudgetDim2FilterEnable;
                    ToolTip = 'Specifies a second filter by a budget dimension. ';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(LookUpDimFilter(ItemBudgetName."Budget Dimension 2 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        BudgetDim2FilterOnAfterValidat();
                    end;
                }
                field(BudgetDim3Filter; BudgetDim3Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = GetCaptionClass(3);
                    Caption = 'Budget Dimension 3 Filter';
                    Enabled = BudgetDim3FilterEnable;
                    ToolTip = 'Specifies a third filter by a budget dimension. ';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(LookUpDimFilter(ItemBudgetName."Budget Dimension 3 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        BudgetDim3FilterOnAfterValidat();
                    end;
                }
                field(GlobalDim1Filter; GlobalDim1Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = '1,3,1';
                    Caption = 'Global Dimension 1 Filter';
                    ToolTip = 'Specifies by which global dimension data is shown. Global dimensions are the dimensions that you analyze most frequently. Two global dimensions, typically for the company''s most important activities, are available on all cards, documents, reports, and lists.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(LookUpDimFilter(GLSetup."Global Dimension 1 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        GlobalDim1FilterOnAfterValidat();
                    end;
                }
                field(GlobalDim2Filter; GlobalDim2Filter)
                {
                    ApplicationArea = Dimensions;
                    CaptionClass = '1,3,2';
                    Caption = 'Global Dimension 2 Filter';
                    ToolTip = 'Specifies by which global dimension data is shown. Global dimensions are the dimensions that you analyze most frequently. Two global dimensions, typically for the company''s most important activities, are available on all cards, documents, reports, and lists.';

                    trigger OnLookup(var Text: Text): Boolean
                    begin
                        exit(LookUpDimFilter(GLSetup."Global Dimension 2 Code", Text));
                    end;

                    trigger OnValidate()
                    begin
                        GlobalDim2FilterOnAfterValidat();
                    end;
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
            group("F&unctions")
            {
                Caption = 'F&unctions';
                Image = "Action";
                action("Reverse Lines and Columns")
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Reverse Lines and Columns';
                    Image = Undo;
                    ToolTip = 'Change the display of the matrix by inverting the values in the Show as Lines and Show as Columns fields.';

                    trigger OnAction()
                    var
                        TempDimCode: Text[30];
                    begin
                        TempDimCode := ColumnDimCode;
                        ColumnDimCode := LineDimCode;
                        LineDimCode := TempDimCode;
                        ItemBudgetManagement.ValidateLineDimTypeAndCode(
                          ItemBudgetName, LineDimCode, LineDimType, ColumnDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        ItemBudgetManagement.ValidateColumnDimTypeAndCode(
                          ItemBudgetName, ColumnDimCode, ColumnDimType, LineDimType,
                          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
                        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
                        UpdateMatrixSubForm();
                    end;
                }
                separator(Action53)
                {
                }
                action("Delete Budget")
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Delete Budget';
                    Image = Delete;
                    ToolTip = 'Delete the current budget.';

                    trigger OnAction()
                    begin
                        ItemBudgetManagement.DeleteBudget(
                          CurrentAnalysisArea.AsInteger(), CurrentBudgetName,
                          ItemFilter, DateFilter,
                          SourceTypeFilter.AsInteger(), SourceNoFilter,
                          GlobalDim1Filter, GlobalDim2Filter,
                          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
                    end;
                }
                separator(Action55)
                {
                }
            }
            group(Excel)
            {
                Caption = 'Excel';
                group("Export to Excel")
                {
                    Caption = 'Export to Excel';
                    Image = ExportToExcel;
                    action("Create New Document")
                    {
                        ApplicationArea = PurchaseBudget;
                        Caption = 'Create New Document';
                        Image = ExportToExcel;
                        ToolTip = 'Open the analysis report in a new Excel workbook. This creates an Excel workbook on your device.';

                        trigger OnAction()
                        var
                            ExportItemBudgetToExcel: Report "Export Item Budget to Excel";
                        begin
                            ExportItemBudgetToExcel.SetParameters(
                              CurrentAnalysisArea, CurrentBudgetName, ValueType,
                              GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter,
                              DateFilter, SourceTypeFilter, SourceNoFilter, ItemFilter,
                              InternalDateFilter, PeriodInitialized, PeriodType,
                              LineDimType, ColumnDimType, LineDimCode, ColumnDimCode, RoundingFactor);
                            ExportItemBudgetToExcel.Run();
                        end;
                    }
                    action("Update Existing Document")
                    {
                        ApplicationArea = PurchaseBudget;
                        Caption = 'Update Existing Document';
                        Image = ExportToExcel;
                        ToolTip = 'Refresh the data in an existing Excel workbook. You must specify the workbook that you want to update.';

                        trigger OnAction()
                        var
                            ExportItemBudgetToExcel: Report "Export Item Budget to Excel";
                        begin
                            ExportItemBudgetToExcel.SetParameters(
                              CurrentAnalysisArea, CurrentBudgetName, ValueType,
                              GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter,
                              DateFilter, SourceTypeFilter, SourceNoFilter, ItemFilter,
                              InternalDateFilter, PeriodInitialized, PeriodType,
                              LineDimType, ColumnDimType, LineDimCode, ColumnDimCode, RoundingFactor);
                            ExportItemBudgetToExcel.SetUpdateExistingWorksheet(true);
                            ExportItemBudgetToExcel.Run();
                        end;
                    }
                }
                action("Import from Excel")
                {
                    ApplicationArea = PurchaseBudget;
                    Caption = 'Import from Excel';
                    Ellipsis = true;
                    Image = ImportExcel;
                    ToolTip = 'Import a budget that you exported to Excel earlier.';

                    trigger OnAction()
                    var
                        ImportItemBudgetFromExcel: Report "Import Item Budget from Excel";
                    begin
                        ImportItemBudgetFromExcel.SetParameters(CurrentBudgetName, CurrentAnalysisArea.AsInteger(), ValueType.AsInteger());
                        ImportItemBudgetFromExcel.RunModal();
                        Clear(ImportItemBudgetFromExcel);
                    end;
                }
            }
            action("Next Period")
            {
                ApplicationArea = PurchaseBudget;
                Caption = 'Next Period';
                Image = NextRecord;
                ToolTip = 'Show the information based on the next period. If you set the View by field to Day, the date filter changes to the day before.';

                trigger OnAction()
                begin
                    if (LineDimType = LineDimType::Period) or (ColumnDimType = ColumnDimType::Period) then
                        exit;
                    FindPeriod('>');
                    CurrPage.Update();
                    UpdateMatrixSubForm();
                end;
            }
            action("Previous Period")
            {
                ApplicationArea = PurchaseBudget;
                Caption = 'Previous Period';
                Image = PreviousRecord;
                ToolTip = 'Show the information based on the previous period. If you set the View by field to Day, the date filter changes to the day before.';

                trigger OnAction()
                begin
                    if (LineDimType = LineDimType::Period) or (ColumnDimType = ColumnDimType::Period) then
                        exit;
                    FindPeriod('<');
                    CurrPage.Update();
                    UpdateMatrixSubForm();
                end;
            }
            action("Previous Set")
            {
                ApplicationArea = PurchaseBudget;
                Caption = 'Previous Set';
                Image = PreviousSet;
                ToolTip = 'Go to the previous set of data.';

                trigger OnAction()
                begin
                    GenerateColumnCaptions("Matrix Page Step Type"::Previous);
                    UpdateMatrixSubForm();
                end;
            }
            action("Previous Column")
            {
                ApplicationArea = PurchaseBudget;
                Caption = 'Previous Column';
                Image = PreviousRecord;
                ToolTip = 'Go to the previous column.';

                trigger OnAction()
                begin
                    GenerateColumnCaptions("Matrix Page Step Type"::PreviousColumn);
                    UpdateMatrixSubForm();
                end;
            }
            action("Next Column")
            {
                ApplicationArea = PurchaseBudget;
                Caption = 'Next Column';
                Image = NextRecord;
                ToolTip = 'Go to the next column.';

                trigger OnAction()
                begin
                    GenerateColumnCaptions("Matrix Page Step Type"::NextColumn);
                    UpdateMatrixSubForm();
                end;
            }
            action("Next Set")
            {
                ApplicationArea = PurchaseBudget;
                Caption = 'Next Set';
                Image = NextSet;
                ToolTip = 'Go to the next set of data.';

                trigger OnAction()
                begin
                    GenerateColumnCaptions("Matrix Page Step Type"::Next);
                    UpdateMatrixSubForm();
                end;
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process';

                actionref("Previous Set_Promoted"; "Previous Set")
                {
                }
                actionref("Previous Column_Promoted"; "Previous Column")
                {
                }
                actionref("Next Column_Promoted"; "Next Column")
                {
                }
                actionref("Next Set_Promoted"; "Next Set")
                {
                }
                actionref("Previous Period_Promoted"; "Previous Period")
                {
                }
                actionref("Next Period_Promoted"; "Next Period")
                {
                }
            }
            group("Category_Import/Export")
            {
                Caption = 'Import/Export';

                group("Category_Export to Excel")
                {
                    Caption = 'Export to Excel';

                    actionref("Create New Document_Promoted"; "Create New Document")
                    {
                    }
                    actionref("Update Existing Document_Promoted"; "Update Existing Document")
                    {
                    }
                }
                actionref("Import from Excel_Promoted"; "Import from Excel")
                {
                }
            }
        }
    }

    trigger OnInit()
    begin
        BudgetDim3FilterEnable := true;
        BudgetDim2FilterEnable := true;
        BudgetDim1FilterEnable := true;
    end;

    trigger OnOpenPage()
    begin
        if ValueType = ValueType::"Sales Amount" then
            ValueType := ValueType::"Cost Amount";
        CurrentAnalysisArea := CurrentAnalysisArea::Purchase;
        ItemBudgetManagement.BudgetNameSelection(
          CurrentAnalysisArea.AsInteger(), CurrentBudgetName, ItemBudgetName, ItemStatisticsBuffer,
          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);

        if (NewBudgetName <> '') and (CurrentBudgetName <> NewBudgetName) then begin
            CurrentBudgetName := NewBudgetName;
            ItemBudgetManagement.CheckBudgetName(CurrentAnalysisArea.AsInteger(), CurrentBudgetName, ItemBudgetName);
            ItemBudgetManagement.SetItemBudgetName(
              CurrentBudgetName, ItemBudgetName, ItemStatisticsBuffer,
              BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        end;

        ItemBudgetManagement.SetLineAndColumnDim(
          ItemBudgetName, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);

        GLSetup.Get();
        SourceTypeFilter := SourceTypeFilter::Vendor;

        UpdateDimCtrls();

        FindPeriod('');
        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    var
        GLSetup: Record "General Ledger Setup";
        ItemBudgetName: Record "Item Budget Name";
        ItemStatisticsBuffer: Record "Item Statistics Buffer";
        MATRIX_MatrixRecords: array[32] of Record "Dimension Code Buffer";
        ItemBudgetManagement: Codeunit "Item Budget Management";
        MATRIX_CaptionSet: array[32] of Text[80];
        MATRIX_CaptionRange: Text;
        FirstColumn: Text;
        LastColumn: Text;
        MATRIX_PrimKeyFirstCaptionInCu: Text;
        MATRIX_CurrentNoOfColumns: Integer;
        CurrentAnalysisArea: Enum "Analysis Area Type";
        SourceTypeFilter: Enum "Analysis Source Type";
        SourceNoFilter: Text;
        ItemFilter: Text;
        LineDimType: Enum "Item Budget Dimension Type";
        ColumnDimType: Enum "Item Budget Dimension Type";
        GlobalDim1Filter: Text;
        GlobalDim2Filter: Text;
        BudgetDim1Filter: Text;
        BudgetDim2Filter: Text;
        BudgetDim3Filter: Text;
        DateFilter: Text;
        InternalDateFilter: Text;
        PeriodInitialized: Boolean;
#pragma warning disable AA0074
        Text003: Label '1,6,,Budget Dimension 1 Filter';
        Text004: Label '1,6,,Budget Dimension 2 Filter';
        Text005: Label '1,6,,Budget Dimension 3 Filter';
        Text100: Label 'Period';
#pragma warning restore AA0074
        NewBudgetName: Code[10];
        BudgetDim1FilterEnable: Boolean;
        BudgetDim2FilterEnable: Boolean;
        BudgetDim3FilterEnable: Boolean;

    protected var
        CurrentBudgetName: Code[10];
        LineDimCode: Text[30];
        ColumnDimCode: Text[30];
        PeriodType: Enum "Analysis Period Type";
        RoundingFactor: Enum "Analysis Rounding Factor";
        ValueType: Enum "Item Analysis Value Type";
        ShowColumnName: Boolean;

    local procedure GenerateColumnCaptions(StepType: Enum "Matrix Page Step Type")
    var
        Item: Record Item;
        Customer: Record Customer;
        Vendor: Record Vendor;
        Location: Record Location;
        MATRIX_PeriodRecords: array[32] of Record Date;
        MatrixMgt: Codeunit "Matrix Management";
        RecRef: RecordRef;
        FieldRef: FieldRef;
        i: Integer;
    begin
        Clear(MATRIX_CaptionSet);
        Clear(MATRIX_MatrixRecords);
        FirstColumn := '';
        LastColumn := '';
        MATRIX_CurrentNoOfColumns := 12;

        if ColumnDimCode = '' then
            exit;

        case ColumnDimCode of
            Text100:  // Period
                begin
                    MatrixMgt.GeneratePeriodMatrixData(
                      StepType.AsInteger(), 12, ShowColumnName,
                      PeriodType, DateFilter, MATRIX_PrimKeyFirstCaptionInCu,
                      MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns, MATRIX_PeriodRecords);
                    for i := 1 to 12 do begin
                        MATRIX_MatrixRecords[i]."Period Start" := MATRIX_PeriodRecords[i]."Period Start";
                        MATRIX_MatrixRecords[i]."Period End" := MATRIX_PeriodRecords[i]."Period End";
                    end;
                    FirstColumn := Format(MATRIX_PeriodRecords[1]."Period Start");
                    LastColumn := Format(MATRIX_PeriodRecords[MATRIX_CurrentNoOfColumns]."Period End");
                end;
            Location.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    RecRef.GetTable(Location);
                    RecRef.SetTable(Location);
                    MatrixMgt.GenerateMatrixData(
                      RecRef, StepType.AsInteger(), 12, 1,
                      MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                          RecRef, "Matrix Page Step Type"::Same.AsInteger(), 12, 2,
                          MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            Item.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    RecRef.GetTable(Item);
                    RecRef.SetTable(Item);
                    if ItemFilter <> '' then begin
                        FieldRef := RecRef.Field(Item.FieldNo("No."));
                        FieldRef.SetFilter(ItemFilter);
                    end;
                    MatrixMgt.GenerateMatrixData(
                      RecRef, StepType.AsInteger(), 12, 1,
                      MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                          RecRef, "Matrix Page Step Type"::Same.AsInteger(), 12, 3,
                          MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            Customer.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    RecRef.GetTable(Customer);
                    RecRef.SetTable(Customer);
                    MatrixMgt.GenerateMatrixData(
                      RecRef, StepType.AsInteger(), 12, 1,
                      MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                          RecRef, "Matrix Page Step Type"::Same.AsInteger(), 12, 2,
                          MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            Vendor.TableCaption:
                begin
                    Clear(MATRIX_CaptionSet);
                    RecRef.GetTable(Vendor);
                    RecRef.SetTable(Vendor);
                    if SourceNoFilter <> '' then begin
                        FieldRef := RecRef.Field(Vendor.FieldNo("No."));
                        FieldRef.SetFilter(SourceNoFilter);
                    end;
                    MatrixMgt.GenerateMatrixData(
                      RecRef, StepType.AsInteger(), 12, 1,
                      MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                    for i := 1 to MATRIX_CurrentNoOfColumns do
                        MATRIX_MatrixRecords[i].Code := MATRIX_CaptionSet[i];
                    if ShowColumnName then
                        MatrixMgt.GenerateMatrixData(
                          RecRef, "Matrix Page Step Type"::Same.AsInteger(), 12, 2,
                          MATRIX_PrimKeyFirstCaptionInCu, MATRIX_CaptionSet, MATRIX_CaptionRange, MATRIX_CurrentNoOfColumns);
                end;
            GLSetup."Global Dimension 1 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  GLSetup."Global Dimension 1 Code",
                  GlobalDim1Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaptionInCu, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
            GLSetup."Global Dimension 2 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  GLSetup."Global Dimension 2 Code",
                  GlobalDim2Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaptionInCu, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
            ItemBudgetName."Budget Dimension 1 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  ItemBudgetName."Budget Dimension 1 Code",
                  BudgetDim1Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaptionInCu, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
            ItemBudgetName."Budget Dimension 2 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  ItemBudgetName."Budget Dimension 2 Code",
                  BudgetDim2Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaptionInCu, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
            ItemBudgetName."Budget Dimension 3 Code":
                MatrixMgt.GenerateDimColumnCaption(
                  ItemBudgetName."Budget Dimension 3 Code",
                  BudgetDim3Filter, StepType.AsInteger(), MATRIX_PrimKeyFirstCaptionInCu, FirstColumn, LastColumn,
                  MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns, ShowColumnName, MATRIX_CaptionRange);
        end;
    end;

    local procedure FindPeriod(SearchText: Code[3])
    var
        PeriodPageMgt: Codeunit PeriodPageManagement;
    begin
        PeriodPageMgt.FindPeriodOnMatrixPage(
          DateFilter, InternalDateFilter, SearchText, PeriodType,
          (LineDimType <> LineDimType::Period) and (ColumnDimType <> ColumnDimType::Period));
    end;

    local procedure GetCaptionClass(BudgetDimType: Integer): Text[250]
    begin
        if ItemBudgetName.Name <> CurrentBudgetName then
            ItemBudgetName.Get(CurrentAnalysisArea, CurrentBudgetName);
        case BudgetDimType of
            1:
                begin
                    if ItemBudgetName."Budget Dimension 1 Code" <> '' then
                        exit('1,6,' + ItemBudgetName."Budget Dimension 1 Code");
                    exit(Text003);
                end;
            2:
                begin
                    if ItemBudgetName."Budget Dimension 2 Code" <> '' then
                        exit('1,6,' + ItemBudgetName."Budget Dimension 2 Code");
                    exit(Text004);
                end;
            3:
                begin
                    if ItemBudgetName."Budget Dimension 3 Code" <> '' then
                        exit('1,6,' + ItemBudgetName."Budget Dimension 3 Code");
                    exit(Text005);
                end;
        end;
    end;

    local procedure LookUpDimFilter(Dim: Code[20]; var Text: Text[250]): Boolean
    var
        DimVal: Record "Dimension Value";
        DimValList: Page "Dimension Value List";
    begin
        if Dim = '' then
            exit(false);
        DimVal.SetRange("Dimension Code", Dim);
        DimValList.SetTableView(DimVal);
        DimValList.LookupMode(true);
        if DimValList.RunModal() = ACTION::LookupOK then begin
            DimValList.GetRecord(DimVal);
            Text := DimValList.GetSelectionFilter();
        end;
        exit(true);
    end;

    local procedure UpdateDimCtrls()
    begin
        BudgetDim1FilterEnable := ItemBudgetName."Budget Dimension 1 Code" <> '';
        BudgetDim2FilterEnable := ItemBudgetName."Budget Dimension 2 Code" <> '';
        BudgetDim3FilterEnable := ItemBudgetName."Budget Dimension 3 Code" <> '';
    end;

    procedure SetNewBudgetName(NewPurchBudgetName: Code[10])
    begin
        NewBudgetName := NewPurchBudgetName;
    end;

    local procedure UpdateMatrixSubForm()
    begin
        CurrPage.MATRIX.PAGE.SetFilters(
          DateFilter, ItemFilter, SourceNoFilter,
          GlobalDim1Filter, GlobalDim2Filter,
          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        CurrPage.MATRIX.PAGE.LoadMatrix(
          MATRIX_CaptionSet, MATRIX_MatrixRecords, MATRIX_CurrentNoOfColumns,
          CurrentBudgetName, LineDimType, ColumnDimType, RoundingFactor, ValueType, PeriodType);
        CurrPage.Update(false);
    end;

    local procedure CurrentBudgetNameOnAfterValida()
    begin
        ItemBudgetManagement.SetItemBudgetName(
          CurrentBudgetName, ItemBudgetName, ItemStatisticsBuffer,
          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        ItemBudgetManagement.ValidateLineDimTypeAndCode(
          ItemBudgetName, LineDimCode, LineDimType, ColumnDimType,
          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
        ItemBudgetManagement.ValidateColumnDimTypeAndCode(
          ItemBudgetName, ColumnDimCode, ColumnDimType, LineDimType,
          InternalDateFilter, DateFilter, ItemStatisticsBuffer, PeriodInitialized);
        UpdateDimCtrls();
        CurrPage.Update(false);
    end;

    local procedure ColumnDimCodeOnAfterValidate()
    begin
        FindPeriod('');
        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure LineDimCodeOnAfterValidate()
    begin
        FindPeriod('');
        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure ValueTypeOnAfterValidate()
    begin
        FindPeriod('');
        GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure PeriodTypeOnAfterValidate()
    begin
        if ColumnDimType = ColumnDimType::Period then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure ShowColumnNameOnAfterValidate()
    begin
        GenerateColumnCaptions("Matrix Page Step Type"::Same);
        UpdateMatrixSubForm();
    end;

    local procedure RoundingFactorOnAfterValidate()
    begin
        UpdateMatrixSubForm();
    end;

    local procedure BudgetDim3FilterOnAfterValidat()
    begin
        if ColumnDimType = ColumnDimType::"Budget Dimension 3" then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure BudgetDim2FilterOnAfterValidat()
    begin
        if ColumnDimType = ColumnDimType::"Budget Dimension 2" then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure BudgetDim1FilterOnAfterValidat()
    begin
        if ColumnDimType = ColumnDimType::"Budget Dimension 1" then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure GlobalDim2FilterOnAfterValidat()
    begin
        if ColumnDimType = ColumnDimType::"Global Dimension 2" then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure GlobalDim1FilterOnAfterValidat()
    begin
        if ColumnDimType = ColumnDimType::"Global Dimension 1" then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure SourceNoFilterOnAfterValidate()
    begin
        if ColumnDimType = ColumnDimType::Vendor then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure ItemFilterOnAfterValidate()
    begin
        if ColumnDimType = ColumnDimType::Item then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;

    local procedure DateFilterOnAfterValidate()
    begin
        if ColumnDimType = ColumnDimType::Period then
            GenerateColumnCaptions("Matrix Page Step Type"::Initial);
        UpdateMatrixSubForm();
    end;
}