Page 9239 Sales Budget Overview Matrix

App
Base Application
Namespace
Microsoft.Sales.Analysis
Versions
17-28
Source table
367

Procedures, 5Events, 1Obsolete, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Sales/Analysis/SalesBudgetOverviewMatrix.Page.al593 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.Sales.Analysis;

using Microsoft.Finance.Analysis;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using Microsoft.Inventory.Analysis;

/// <summary>
/// Displays sales budget data in a matrix format for the budget overview page.
/// </summary>
page 9239 "Sales Budget Overview Matrix"
{
    Caption = 'Sales Budget Overview Matrix';
    DeleteAllowed = false;
    InsertAllowed = false;
    LinksAllowed = false;
    PageType = ListPart;
    RefreshOnActivate = true;
    SourceTable = "Dimension Code Buffer";

    layout
    {
        area(content)
        {
            repeater(Control1)
            {
                IndentationColumn = NameIndent;
                IndentationControls = Name;
                ShowCaption = false;
                field("Code"; Rec.Code)
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the dimension value code for the dimension selected in the Show as Lines field.';
                }
                field(Name; Rec.Name)
                {
                    ApplicationArea = Dimensions;
                    Editable = false;
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the name of the dimension value on the line.';
                }
                field(Quantity; Rec.Quantity)
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    Caption = 'Budgeted Quantity';
                    Editable = false;
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the total quantity of the sales budget entries.';
                    Visible = QuantityVisible;

                    trigger OnDrillDown()
                    begin
                        DrillDown(true, ValueType::Quantity);
                    end;
                }
                field(Amount; Rec.Amount)
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    Caption = 'Budgeted Sales Amount';
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the total sales amount of the sales budget entries.';
                    Visible = AmountVisible;

                    trigger OnDrillDown()
                    begin
                        DrillDown(true, ValueType::"Sales Amount");
                    end;
                }
                field(CostAmount; +CalcAmt("Item Analysis Value Type"::"Cost Amount", false))
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    Caption = 'Budgeted Cost Amount';
                    StyleExpr = 'Strong';
                    ToolTip = 'Specifies the total amount of the sales budget entries that represent the cost of goods sold.';
                    Visible = AmountVisible;

                    trigger OnDrillDown()
                    begin
                        DrillDown(true, ValueType::"Cost Amount");
                    end;
                }
                field(Field1; MATRIX_CellData[1])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[1];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(1);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(1);
                    end;
                }
                field(Field2; MATRIX_CellData[2])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[2];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(2);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(2);
                    end;
                }
                field(Field3; MATRIX_CellData[3])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[3];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(3);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(3);
                    end;
                }
                field(Field4; MATRIX_CellData[4])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[4];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(4);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(4);
                    end;
                }
                field(Field5; MATRIX_CellData[5])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[5];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(5);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(5);
                    end;
                }
                field(Field6; MATRIX_CellData[6])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[6];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(6);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(6);
                    end;
                }
                field(Field7; MATRIX_CellData[7])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[7];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(7);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(7);
                    end;
                }
                field(Field8; MATRIX_CellData[8])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[8];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(8);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(8);
                    end;
                }
                field(Field9; MATRIX_CellData[9])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[9];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(9);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(9);
                    end;
                }
                field(Field10; MATRIX_CellData[10])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[10];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(10);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(10);
                    end;
                }
                field(Field11; MATRIX_CellData[11])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[11];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(11);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(11);
                    end;
                }
                field(Field12; MATRIX_CellData[12])
                {
                    ApplicationArea = SalesBudget;
                    AutoFormatExpression = FormatStr();
                    AutoFormatType = 11;
                    BlankZero = true;
                    CaptionClass = '3,' + MATRIX_CaptionSet[12];
                    StyleExpr = 'Strong';

                    trigger OnDrillDown()
                    begin
                        MATRIX_OnDrillDown(12);
                    end;

                    trigger OnValidate()
                    begin
                        UpdateAmount(12);
                    end;
                }
            }
        }
    }

    actions
    {
    }

    trigger OnAfterGetCurrRecord()
    begin
        if AmountVisible then
            Rec.Amount := CalcAmt("Item Analysis Value Type"::"Sales Amount", false);
        if QuantityVisible then
            Rec.Quantity := CalcAmt("Item Analysis Value Type"::Quantity, false);
    end;

    trigger OnAfterGetRecord()
    var
        MATRIX_CurrentColumnOrdinal: Integer;
    begin
        NameIndent := 0;
        if AmountVisible then
            Rec.Amount := MatrixMgt.RoundAmount(CalcAmt(ValueType::"Sales Amount", false), RoundingFactor);
        if QuantityVisible then
            Rec.Quantity := MatrixMgt.RoundAmount(CalcAmt(ValueType::Quantity, false), RoundingFactor);

        MATRIX_CurrentColumnOrdinal := 0;
        while MATRIX_CurrentColumnOrdinal < MATRIX_CurrentNoOfMatrixColumn do begin
            MATRIX_CurrentColumnOrdinal := MATRIX_CurrentColumnOrdinal + 1;
            MATRIX_OnAfterGetRecord(MATRIX_CurrentColumnOrdinal);
        end;

        FormatLine();
        AmountOnFormat(Format(Rec.Amount));
    end;

    trigger OnFindRecord(Which: Text): Boolean
    begin
        exit(
          ItemBudgetManagement.FindRecord(
            ItemBudgetName, LineDimType, Rec, Which,
            ItemFilter, SourceNoFilter, PeriodType, DateFilter, PeriodInitialized, InternalDateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter));
    end;

    trigger OnInit()
    begin
        QuantityVisible := true;
        AmountVisible := true;
    end;

    trigger OnNextRecord(Steps: Integer): Integer
    begin
        exit(
          ItemBudgetManagement.NextRecord(
            ItemBudgetName, LineDimType, Rec, Steps,
            ItemFilter, SourceNoFilter, PeriodType, DateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter));
    end;

    trigger OnOpenPage()
    begin
        ItemBudgetManagement.BudgetNameSelection(
          CurrentAnalysisArea.AsInteger(), CurrentBudgetName, ItemBudgetName, ItemStatisticsBuffer,
          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);

        GLSetup.Get();
        SourceTypeFilter := SourceTypeFilter::Customer;
    end;

    var
        GLSetup: Record "General Ledger Setup";
        ItemStatisticsBuffer: Record "Item Statistics Buffer";
        MatrixRecords: array[12] of Record "Dimension Code Buffer";
        ItemBudgetManagement: Codeunit "Item Budget Management";
        MatrixMgt: Codeunit "Matrix Management";
        CurrentAnalysisArea: Enum "Analysis Area Type";
        CurrentBudgetName: Code[10];
        ValueType: Enum "Item Analysis Value Type";
        RoundingFactor: Enum "Analysis Rounding Factor";
        PeriodType: Enum "Analysis Period Type";
        InternalDateFilter: Text;
        PeriodInitialized: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text002: Label 'You may only edit column 1 to %1.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        MATRIX_CurrentNoOfMatrixColumn: Integer;
        MATRIX_CellData: array[12] of Decimal;
        MATRIX_CaptionSet: array[32] of Text[80];
        RoundingFactorFormatString: Text;
        AmountVisible: Boolean;
        QuantityVisible: Boolean;
        NameIndent: Integer;

    protected var
        ItemBudgetName: Record "Item Budget Name";
        MATRIX_ColumnTempRec: Record "Dimension Code Buffer";
        ItemFilter: Text;
        SourceTypeFilter: Enum "Analysis Source Type";
        SourceNoFilter: Text;
        DateFilter: Text;
        GlobalDim1Filter: Text;
        GlobalDim2Filter: Text;
        BudgetDim1Filter: Text;
        BudgetDim2Filter: Text;
        BudgetDim3Filter: Text;
        LineDimType: Enum "Item Budget Dimension Type";
        ColumnDimType: Enum "Item Budget Dimension Type";

    local procedure CalcAmt(ValueType: Enum "Item Analysis Value Type"; SetColFilter: Boolean): Decimal
    begin
        exit(
          ItemBudgetManagement.CalculateAmount(
            ValueType, SetColFilter,
            ItemStatisticsBuffer, ItemBudgetName,
            ItemFilter, SourceTypeFilter, SourceNoFilter, DateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter,
            LineDimType, Rec, ColumnDimType, MATRIX_ColumnTempRec));
    end;

    local procedure SetAmt(ValueType: Enum "Item Analysis Value Type"; SetColFilter: Boolean; NewAmount: Decimal)
    begin
        ItemBudgetManagement.SetAmount(
          ValueType, SetColFilter,
          ItemStatisticsBuffer, ItemBudgetName,
          ItemFilter, SourceTypeFilter, SourceNoFilter, DateFilter,
          GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter,
          LineDimType, Rec, ColumnDimType, MATRIX_ColumnTempRec, NewAmount);
    end;

    protected procedure DrillDown(OnlyLines: Boolean; ValueType: Enum "Item Analysis Value Type")
    var
        ValueTypeInt: Option;
    begin
        ValueTypeInt := ValueType.AsInteger();
        OnBeforeDrillDown(Rec, OnlyLines, ValueTypeInt);
        ValueType := "Item Analysis Value Type".FromInteger(ValueTypeInt);

        ItemBudgetManagement.DrillDownBudgetAmount(
          ItemBudgetName,
          ItemFilter, SourceTypeFilter, SourceNoFilter, DateFilter,
          GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter,
          LineDimType, Rec,
          ColumnDimType, MATRIX_ColumnTempRec,
          ValueType, OnlyLines);
    end;

    /// <summary>
    /// Loads the matrix with budget data and display settings.
    /// </summary>
    /// <param name="NewMatrixColumns">Array of column captions for the matrix.</param>
    /// <param name="NewMatrixRecords">Array of dimension code buffer records for matrix rows.</param>
    /// <param name="NewCurrentNoOfMatrixColumns">Number of columns to display.</param>
    /// <param name="NewCurrentBudgetName">The budget name to use.</param>
    /// <param name="NewLineDimType">The dimension type for matrix lines.</param>
    /// <param name="NewColumnDimType">The dimension type for matrix columns.</param>
    /// <param name="NewRoundingFactor">The rounding factor for displayed values.</param>
    /// <param name="NewValueType">The type of values to display.</param>
    /// <param name="NewPeriodType">The period type for date calculations.</param>
    procedure LoadMatrix(NewMatrixColumns: array[32] of Text[80]; var NewMatrixRecords: array[12] of Record "Dimension Code Buffer"; NewCurrentNoOfMatrixColumns: Integer; NewCurrentBudgetName: Code[10]; NewLineDimType: Enum "Item Budget Dimension Type"; NewColumnDimType: Enum "Item Budget Dimension Type"; NewRoundingFactor: Enum "Analysis Rounding Factor"; NewValueType: Enum "Item Analysis Value Type"; NewPeriodType: Enum "Analysis Period Type")
    var
        i: Integer;
    begin
        Clear(MATRIX_CellData);

        for i := 1 to 12 do begin
            MATRIX_CaptionSet[i] := NewMatrixColumns[i];
            MatrixRecords[i] := NewMatrixRecords[i];
        end;
        MATRIX_CurrentNoOfMatrixColumn := NewCurrentNoOfMatrixColumns;
        CurrentAnalysisArea := CurrentAnalysisArea::Sales;
        CurrentBudgetName := NewCurrentBudgetName;
        LineDimType := NewLineDimType;
        ColumnDimType := NewColumnDimType;
        RoundingFactor := NewRoundingFactor;
        ValueType := NewValueType;
        PeriodType := NewPeriodType;
        ItemBudgetManagement.BudgetNameSelection(
          CurrentAnalysisArea.AsInteger(), CurrentBudgetName, ItemBudgetName, ItemStatisticsBuffer,
          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        RoundingFactorFormatString := MatrixMgt.FormatRoundingFactor(RoundingFactor, false);
    end;

    /// <summary>
    /// Sets the filter values for the budget matrix display.
    /// </summary>
    /// <param name="_DateFilter">Date filter expression.</param>
    /// <param name="_ItemFilter">Item filter expression.</param>
    /// <param name="_SourceNoFilter">Source number filter expression.</param>
    /// <param name="_GlobalDim1Filter">Global dimension 1 filter expression.</param>
    /// <param name="_GlobalDim2Filter">Global dimension 2 filter expression.</param>
    /// <param name="_BudgetDim1Filter">Budget dimension 1 filter expression.</param>
    /// <param name="_BudgetDim2Filter">Budget dimension 2 filter expression.</param>
    /// <param name="_BudgetDim3Filter">Budget dimension 3 filter expression.</param>
    procedure SetFilters(_DateFilter: Text; _ItemFilter: Text; _SourceNoFilter: Text; _GlobalDim1Filter: Text; _GlobalDim2Filter: Text; _BudgetDim1Filter: Text; _BudgetDim2Filter: Text; _BudgetDim3Filter: Text)
    begin
        DateFilter := _DateFilter;
        ItemFilter := _ItemFilter;
        SourceNoFilter := _SourceNoFilter;
        GlobalDim1Filter := _GlobalDim1Filter;
        GlobalDim2Filter := _GlobalDim2Filter;
        BudgetDim1Filter := _BudgetDim1Filter;
        BudgetDim2Filter := _BudgetDim2Filter;
        BudgetDim3Filter := _BudgetDim3Filter;
    end;

    local procedure MATRIX_OnDrillDown(MATRIX_ColumnOrdinal: Integer)
    begin
        MATRIX_ColumnTempRec := MatrixRecords[MATRIX_ColumnOrdinal];
        DrillDown(false, ValueType);
    end;

    local procedure MATRIX_OnAfterGetRecord(MATRIX_ColumnOrdinal: Integer)
    begin
        MATRIX_ColumnTempRec := MatrixRecords[MATRIX_ColumnOrdinal];
        MATRIX_CellData[MATRIX_ColumnOrdinal] := MatrixMgt.RoundAmount(CalcAmt(ValueType, true), RoundingFactor);
    end;

    local procedure UpdateAmount(MATRIX_ColumnOrdinal: Integer)
    var
        NewAmount: Decimal;
    begin
        ItemBudgetName.TestField(Blocked, false);
        if MATRIX_ColumnOrdinal > MATRIX_CurrentNoOfMatrixColumn then
            Error(Text002, MATRIX_CurrentNoOfMatrixColumn);
        MATRIX_ColumnTempRec := MatrixRecords[MATRIX_ColumnOrdinal];

        NewAmount := FromRoundedValue(MATRIX_CellData[MATRIX_ColumnOrdinal]);
        SetAmt(ValueType, true, NewAmount);
        Rec.Amount := MatrixMgt.RoundAmount(CalcAmt(ValueType::"Sales Amount", false), RoundingFactor);
        Rec.Quantity := MatrixMgt.RoundAmount(CalcAmt(ValueType::Quantity, false), RoundingFactor);
    end;

    local procedure FromRoundedValue(OrgAmount: Decimal): Decimal
    var
        NewAmount: Decimal;
    begin
        NewAmount := OrgAmount;
        case RoundingFactor of
            RoundingFactor::"1000":
                NewAmount := OrgAmount * 1000;
            RoundingFactor::"1000000":
                NewAmount := OrgAmount * 1000000;
        end;
        exit(NewAmount);
    end;

    local procedure FormatLine()
    begin
        NameIndent := Rec.Indentation;
    end;

    local procedure AmountOnFormat(Text: Text[1024])
    begin
        ItemBudgetManagement.FormatToAmount(Text, RoundingFactor);
    end;

    local procedure FormatStr(): Text
    begin
        exit(RoundingFactorFormatString);
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeDrillDown(var DimensionCodeBuffer: Record "Dimension Code Buffer"; var OnlyLines: Boolean; var ValueType: Option "Sales Amount","Cost Amount",Quantity)
    begin
    end;
}