Codeunit 7130 Item Budget Management

App
Base Application
Namespace
Microsoft.Inventory.Analysis
Versions
17-28

Procedures, 29Events, 15Obsolete, 11

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Analysis/ItemBudgetManagement.Codeunit.al842 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.Inventory.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.Item;
using Microsoft.Inventory.Location;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using System.Utilities;

codeunit 7130 "Item Budget Management"
{

    trigger OnRun()
    begin
    end;

    var
        GLSetup: Record "General Ledger Setup";
        PrevItemBudgetName: Record "Item Budget Name";
        MatrixMgt: Codeunit "Matrix Management";
        GLSetupRead: Boolean;
        GlobalDimType: Enum "Item Budget Dimension Type";

#pragma warning disable AA0074
        Text001: Label 'DEFAULT';
        Text002: Label 'Default budget';
        Text003: Label 'Period';
#pragma warning disable AA0470
        Text004: Label '%1 is not a valid line definition.';
        Text005: Label '%1 is not a valid column definition.';
#pragma warning restore AA0470
        Text006: Label 'Do you want to delete the budget entries shown?';
        Text007: Label '<Sign><Integer Thousand><Decimals,2>', Locked = true;
#pragma warning restore AA0074

    procedure BudgetNameSelection(CurrentAnalysisArea: Option; var CurrentItemBudgetName: Code[10]; var ItemBudgetName: Record "Item Budget Name"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var BudgetDim1Filter: Text; var BudgetDim2Filter: Text; var BudgetDim3Filter: Text)
    begin
        if not ItemBudgetName.Get(CurrentAnalysisArea, CurrentItemBudgetName) then begin
            ItemBudgetName.FilterGroup := 2;
            ItemBudgetName.SetRange("Analysis Area", CurrentAnalysisArea);
            ItemBudgetName.FilterGroup := 0;
            if not ItemBudgetName.Find('-') then begin
                ItemBudgetName.Init();
                ItemBudgetName."Analysis Area" := "Analysis Area Type".FromInteger(CurrentAnalysisArea);
                ItemBudgetName.Name := Text001;
                ItemBudgetName.Description := Text002;
                ItemBudgetName.Insert(true);
            end;
            CurrentItemBudgetName := ItemBudgetName.Name;
        end;

        SetItemBudgetName(
          CurrentItemBudgetName, ItemBudgetName, ItemStatisticsBuffer,
          BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
    end;

    procedure CheckBudgetName(CurrentAnalysisType: Option; CurrentItemBudgetName: Code[10]; var ItemBudgetName: Record "Item Budget Name")
    begin
        ItemBudgetName.Get(CurrentAnalysisType, CurrentItemBudgetName);
    end;

    procedure SetItemBudgetName(CurrentItemBudgetName: Code[10]; var ItemBudgetName: Record "Item Budget Name"; var ItemStatisticsBuf: Record "Item Statistics Buffer"; var BudgetDim1Filter: Text; var BudgetDim2Filter: Text; var BudgetDim3Filter: Text)
    begin
        ItemStatisticsBuf.SetRange("Budget Filter", CurrentItemBudgetName);
        if PrevItemBudgetName.Name <> '' then begin
            if ItemBudgetName."Budget Dimension 1 Code" <> PrevItemBudgetName."Budget Dimension 1 Code" then
                BudgetDim1Filter := '';
            if ItemBudgetName."Budget Dimension 2 Code" <> PrevItemBudgetName."Budget Dimension 2 Code" then
                BudgetDim2Filter := '';
            if ItemBudgetName."Budget Dimension 3 Code" <> PrevItemBudgetName."Budget Dimension 3 Code" then
                BudgetDim3Filter := '';
        end;
        ItemStatisticsBuf.SetFilter("Dimension 1 Filter", BudgetDim1Filter);
        ItemStatisticsBuf.SetFilter("Dimension 2 Filter", BudgetDim2Filter);
        ItemStatisticsBuf.SetFilter("Dimension 3 Filter", BudgetDim3Filter);

        PrevItemBudgetName := ItemBudgetName;
    end;

    procedure LookupItemBudgetName(var CurrentItemBudgetName: Code[10]; var ItemBudgetName: Record "Item Budget Name"; var ItemStatisticsBuf: Record "Item Statistics Buffer"; var BudgetDim1Filter: Text; var BudgetDim2Filter: Text; var BudgetDim3Filter: Text)
    var
        ItemBudgetName2: Record "Item Budget Name";
    begin
        ItemBudgetName2.Copy(ItemBudgetName);
        ItemBudgetName2.FilterGroup := 2;
        ItemBudgetName2.SetRange("Analysis Area", ItemBudgetName2."Analysis Area");
        ItemBudgetName2.FilterGroup := 0;
        if PAGE.RunModal(0, ItemBudgetName2) = ACTION::LookupOK then begin
            ItemBudgetName := ItemBudgetName2;
            CurrentItemBudgetName := ItemBudgetName.Name;
            SetItemBudgetName(
              CurrentItemBudgetName, ItemBudgetName, ItemStatisticsBuf,
              BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        end else
            BudgetNameSelection(
              ItemBudgetName."Analysis Area".AsInteger(), CurrentItemBudgetName, ItemBudgetName, ItemStatisticsBuf,
              BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
    end;

    procedure SetLineAndColumnDim(ItemBudgetName: Record "Item Budget Name"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Budget Dimension Type"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Budget Dimension Type")
    var
        Item: Record Item;
    begin
        if (LineDimCode = '') and (ColumnDimCode = '') then begin
            LineDimCode := Item.TableCaption();
            ColumnDimCode := Text003;
        end;

        OnBeforeSetLineAndColumnDim(ItemBudgetName, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);

        LineDimType := DimCodeToType(LineDimCode, ItemBudgetName);
        ColumnDimType := DimCodeToType(ColumnDimCode, ItemBudgetName);

        OnAfterSetLineAndColumnDim(ItemBudgetName, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);
    end;

    procedure FindRecord(ItemBudgetName: Record "Item Budget Name"; DimType: Enum "Item Budget Dimension Type"; var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[250]; ItemFilter: Text; SourceNoFilter: Text; PeriodType: Enum "Analysis Period Type"; DateFilter: Text; var PeriodInitialized: Boolean; InternalDateFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text): Boolean
    var
        Item: Record Item;
        Cust: Record Customer;
        Vend: Record Vendor;
        Location: Record Location;
        Period: Record Date;
        PeriodPageMgt: Codeunit PeriodPageManagement;
        Found: Boolean;
    begin
        GetGLSetup();
        case DimType of
            GlobalDimType::Item:
                begin
                    Item."No." := DimCodeBuf.Code;
                    if ItemFilter <> '' then
                        Item.SetFilter("No.", ItemFilter);
                    OnFindRecOnBeforeItemFind(Item);
                    Found := Item.Find(Which);
                    if Found then
                        CopyItemToBuf(Item, DimCodeBuf);
                end;
            GlobalDimType::Customer:
                begin
                    Cust."No." := DimCodeBuf.Code;
                    if SourceNoFilter <> '' then
                        Cust.SetFilter("No.", SourceNoFilter);
                    Found := Cust.Find(Which);
                    if Found then
                        CopyCustToBuf(Cust, DimCodeBuf);
                end;
            GlobalDimType::Vendor:
                begin
                    Vend."No." := DimCodeBuf.Code;
                    if SourceNoFilter <> '' then
                        Vend.SetFilter("No.", SourceNoFilter);
                    Found := Vend.Find(Which);
                    if Found then
                        CopyVendToBuf(Vend, DimCodeBuf);
                end;
            GlobalDimType::Period:
                begin
                    Period."Period Start" := DimCodeBuf."Period Start";
                    if DateFilter <> '' then
                        Period.SetFilter("Period Start", DateFilter)
                    else
                        if not PeriodInitialized and (InternalDateFilter <> '') then
                            Period.SetFilter("Period Start", InternalDateFilter);
                    Found := PeriodPageMgt.FindDate(Which, Period, PeriodType);
                    if Found then
                        CopyPeriodToBuf(Period, DimCodeBuf, DateFilter);
                    PeriodInitialized := true;
                end;
            GlobalDimType::Location:
                begin
                    Location.Code := DimCodeBuf.Code;
                    if SourceNoFilter <> '' then
                        Location.SetFilter(Code, SourceNoFilter);
                    Found := Location.Find(Which);
                    if Found then
                        CopyLocationToBuf(Location, DimCodeBuf);
                end;
            GlobalDimType::"Global Dimension 1":
                Found := FindDim(DimCodeBuf, Which, GlobalDim1Filter, GLSetup."Global Dimension 1 Code");
            GlobalDimType::"Global Dimension 2":
                Found := FindDim(DimCodeBuf, Which, GlobalDim2Filter, GLSetup."Global Dimension 2 Code");
            GlobalDimType::"Budget Dimension 1":
                Found := FindDim(DimCodeBuf, Which, BudgetDim1Filter, ItemBudgetName."Budget Dimension 1 Code");
            GlobalDimType::"Budget Dimension 2":
                Found := FindDim(DimCodeBuf, Which, BudgetDim2Filter, ItemBudgetName."Budget Dimension 2 Code");
            GlobalDimType::"Budget Dimension 3":
                Found := FindDim(DimCodeBuf, Which, BudgetDim3Filter, ItemBudgetName."Budget Dimension 3 Code");
        end;
        exit(Found);
    end;

    local procedure FindDim(var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[250]; DimFilter: Text; DimCode: Code[20]): Boolean
    var
        DimVal: Record "Dimension Value";
    begin
        if DimFilter <> '' then
            DimVal.SetFilter(Code, DimFilter);
        DimVal."Dimension Code" := DimCode;
        DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
        DimVal.Code := DimCodeBuf.Code;
        if DimVal.Find(Which) then begin
            CopyDimValToBuf(DimVal, DimCodeBuf);
            exit(true);
        end
    end;

    procedure NextRecord(ItemBudgetName: Record "Item Budget Name"; DimType: Enum "Item Budget Dimension Type"; var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer; ItemFilter: Text; SourceNoFilter: Text; PeriodType: Enum "Analysis Period Type"; DateFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text): Integer
    var
        Item: Record Item;
        Cust: Record Customer;
        Vend: Record Vendor;
        Location: Record Location;
        Period: Record Date;
        PeriodPageMgt: Codeunit PeriodPageManagement;
        ResultSteps: Integer;
    begin
        GetGLSetup();
        case DimType of
            GlobalDimType::Item:
                begin
                    Item."No." := DimCodeBuf.Code;
                    if ItemFilter <> '' then
                        Item.SetFilter("No.", ItemFilter);
                    OnNextRecOnBeforeItemFind(Item);
                    ResultSteps := Item.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyItemToBuf(Item, DimCodeBuf);
                end;
            GlobalDimType::Customer:
                begin
                    Cust."No." := DimCodeBuf.Code;
                    if SourceNoFilter <> '' then
                        Cust.SetFilter("No.", SourceNoFilter);
                    OnNextRecOnBeforeCustomerFindNext(Cust);
                    ResultSteps := Cust.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyCustToBuf(Cust, DimCodeBuf);
                end;
            GlobalDimType::Vendor:
                begin
                    Vend."No." := DimCodeBuf.Code;
                    if SourceNoFilter <> '' then
                        Vend.SetFilter("No.", SourceNoFilter);
                    OnNextRecOnBeforeVendorFindNext(Vend);
                    ResultSteps := Vend.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyVendToBuf(Vend, DimCodeBuf);
                end;
            GlobalDimType::Period:
                begin
                    if DateFilter <> '' then
                        Period.SetFilter("Period Start", DateFilter);
                    Period."Period Start" := DimCodeBuf."Period Start";
                    ResultSteps := PeriodPageMgt.NextDate(Steps, Period, PeriodType);
                    if ResultSteps <> 0 then
                        CopyPeriodToBuf(Period, DimCodeBuf, DateFilter);
                end;
            GlobalDimType::Location:
                begin
                    Location.Code := DimCodeBuf.Code;
                    if SourceNoFilter <> '' then
                        Location.SetFilter(Code, SourceNoFilter);
                    ResultSteps := Location.Next(Steps);
                    if ResultSteps <> 0 then
                        CopyLocationToBuf(Location, DimCodeBuf);
                end;
            GlobalDimType::"Global Dimension 1":
                ResultSteps := NextDim(DimCodeBuf, Steps, GlobalDim1Filter, GLSetup."Global Dimension 1 Code");
            GlobalDimType::"Global Dimension 2":
                ResultSteps := NextDim(DimCodeBuf, Steps, GlobalDim2Filter, GLSetup."Global Dimension 2 Code");
            GlobalDimType::"Budget Dimension 1":
                ResultSteps := NextDim(DimCodeBuf, Steps, BudgetDim1Filter, ItemBudgetName."Budget Dimension 1 Code");
            GlobalDimType::"Budget Dimension 2":
                ResultSteps := NextDim(DimCodeBuf, Steps, BudgetDim2Filter, ItemBudgetName."Budget Dimension 2 Code");
            GlobalDimType::"Budget Dimension 3":
                ResultSteps := NextDim(DimCodeBuf, Steps, BudgetDim3Filter, ItemBudgetName."Budget Dimension 3 Code");
        end;
        exit(ResultSteps);
    end;

    local procedure NextDim(var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer; DimFilter: Text; DimCode: Code[20]): Integer
    var
        DimVal: Record "Dimension Value";
        ActualSteps: Integer;
    begin
        if DimFilter <> '' then
            DimVal.SetFilter(Code, DimFilter);
        DimVal."Dimension Code" := DimCode;
        DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
        DimVal.Code := DimCodeBuf.Code;
        ActualSteps := DimVal.Next(Steps);
        if ActualSteps <> 0 then
            CopyDimValToBuf(DimVal, DimCodeBuf);
        exit(ActualSteps);
    end;

    procedure SetBufferFilters(var ItemStatisticsBuf: Record "Item Statistics Buffer"; ItemBudgetName: Record "Item Budget Name"; ItemFilter: Text; SourceTypeFilter: Enum "Analysis Source Type"; SourceNoFilter: Text; DateFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text)
    begin
        ItemStatisticsBuf.Reset();
        ItemStatisticsBuf.SetRange("Analysis Area Filter", ItemBudgetName."Analysis Area");
        ItemStatisticsBuf.SetRange("Budget Filter", ItemBudgetName.Name);
        if ItemFilter <> '' then
            ItemStatisticsBuf.SetFilter("Item Filter", ItemFilter);
        if SourceNoFilter <> '' then begin
            ItemStatisticsBuf.SetFilter("Source Type Filter", '%1', SourceTypeFilter);
            ItemStatisticsBuf.SetFilter("Source No. Filter", SourceNoFilter);
        end;
        if DateFilter <> '' then
            ItemStatisticsBuf.SetFilter("Date Filter", DateFilter);
        if GlobalDim1Filter <> '' then
            ItemStatisticsBuf.SetFilter("Global Dimension 1 Filter", GlobalDim1Filter);
        if GlobalDim2Filter <> '' then
            ItemStatisticsBuf.SetFilter("Global Dimension 2 Filter", GlobalDim2Filter);
        if BudgetDim1Filter <> '' then
            ItemStatisticsBuf.SetFilter("Dimension 1 Filter", BudgetDim1Filter);
        if BudgetDim2Filter <> '' then
            ItemStatisticsBuf.SetFilter("Dimension 2 Filter", BudgetDim2Filter);
        if BudgetDim3Filter <> '' then
            ItemStatisticsBuf.SetFilter("Dimension 3 Filter", BudgetDim3Filter);
    end;

    procedure SetDimensionFilters(var ItemStatisticsBuf: Record "Item Statistics Buffer"; DimType: Enum "Item Budget Dimension Type"; DimCodeBuf: Record "Dimension Code Buffer")
    begin
        case DimType of
            GlobalDimType::Item:
                ItemStatisticsBuf.SetRange("Item Filter", DimCodeBuf.Code);
            GlobalDimType::Customer:
                begin
                    ItemStatisticsBuf.SetRange("Source Type Filter", ItemStatisticsBuf."Source Type Filter"::Customer);
                    ItemStatisticsBuf.SetRange("Source No. Filter", DimCodeBuf.Code);
                end;
            GlobalDimType::Vendor:
                begin
                    ItemStatisticsBuf.SetRange("Source Type Filter", ItemStatisticsBuf."Source Type Filter"::Vendor);
                    ItemStatisticsBuf.SetRange("Source No. Filter", DimCodeBuf.Code);
                end;
            GlobalDimType::Location:
                ItemStatisticsBuf.SetRange("Location Filter", DimCodeBuf.Code);
            GlobalDimType::Period:
                ItemStatisticsBuf.SetRange("Date Filter", DimCodeBuf."Period Start", DimCodeBuf."Period End");
            GlobalDimType::"Global Dimension 1":
                if DimCodeBuf.Totaling <> '' then
                    ItemStatisticsBuf.SetFilter("Global Dimension 1 Filter", DimCodeBuf.Totaling)
                else
                    ItemStatisticsBuf.SetRange("Global Dimension 1 Filter", DimCodeBuf.Code);
            GlobalDimType::"Global Dimension 2":
                if DimCodeBuf.Totaling <> '' then
                    ItemStatisticsBuf.SetFilter("Global Dimension 2 Filter", DimCodeBuf.Totaling)
                else
                    ItemStatisticsBuf.SetRange("Global Dimension 2 Filter", DimCodeBuf.Code);
            GlobalDimType::"Budget Dimension 1":
                if DimCodeBuf.Totaling <> '' then
                    ItemStatisticsBuf.SetFilter("Dimension 1 Filter", DimCodeBuf.Totaling)
                else
                    ItemStatisticsBuf.SetRange("Dimension 1 Filter", DimCodeBuf.Code);
            GlobalDimType::"Budget Dimension 2":
                if DimCodeBuf.Totaling <> '' then
                    ItemStatisticsBuf.SetFilter("Dimension 2 Filter", DimCodeBuf.Totaling)
                else
                    ItemStatisticsBuf.SetRange("Dimension 2 Filter", DimCodeBuf.Code);
            GlobalDimType::"Budget Dimension 3":
                if DimCodeBuf.Totaling <> '' then
                    ItemStatisticsBuf.SetFilter("Dimension 3 Filter", DimCodeBuf.Totaling)
                else
                    ItemStatisticsBuf.SetRange("Dimension 3 Filter", DimCodeBuf.Code);
        end;
    end;

    local procedure DimCodeToType(DimCode: Code[20]; ItemBudgetName: Record "Item Budget Name") Result: Enum "Item Budget Dimension Type"
    var
        Location: Record Location;
        Item: Record Item;
        Cust: Record Customer;
        Vend: Record Vendor;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeDimCodeToType(DimCode, ItemBudgetName, Result, IsHandled);
        if IsHandled then
            exit(Result);

        GetGLSetup();
        case DimCode of
            '':
                exit(Enum::"Item Budget Dimension Type"::Undefined);
            UpperCase(Item.TableCaption()):
                exit(Enum::"Item Budget Dimension Type"::Item);
            UpperCase(Cust.TableCaption()):
                exit(Enum::"Item Budget Dimension Type"::Customer);
            UpperCase(Vend.TableCaption()):
                exit(Enum::"Item Budget Dimension Type"::Vendor);
            UpperCase(Text003):
                exit(Enum::"Item Budget Dimension Type"::Period);
            UpperCase(Location.TableCaption()):
                exit(Enum::"Item Budget Dimension Type"::Location);
            GLSetup."Global Dimension 1 Code":
                exit(Enum::"Item Budget Dimension Type"::"Global Dimension 1");
            GLSetup."Global Dimension 2 Code":
                exit(Enum::"Item Budget Dimension Type"::"Global Dimension 2");
            ItemBudgetName."Budget Dimension 1 Code":
                exit(Enum::"Item Budget Dimension Type"::"Budget Dimension 1");
            ItemBudgetName."Budget Dimension 2 Code":
                exit(Enum::"Item Budget Dimension Type"::"Budget Dimension 2");
            ItemBudgetName."Budget Dimension 3 Code":
                exit(Enum::"Item Budget Dimension Type"::"Budget Dimension 3");
            else
                exit(Enum::"Item Budget Dimension Type"::Undefined);
        end;
    end;

    procedure GetDimSelection(OldDimSelCode: Text[30]; ItemBudgetName: Record "Item Budget Name"): Text[30]
    var
        Item: Record Item;
        Cust: Record Customer;
        Vend: Record Vendor;
        Location: Record Location;
        DimSelection: Page "Dimension Selection";
    begin
        GetGLSetup();
        DimSelection.InsertDimSelBuf(false, Item.TableCaption(), Item.TableCaption());
        DimSelection.InsertDimSelBuf(false, Cust.TableCaption(), Cust.TableCaption());
        DimSelection.InsertDimSelBuf(false, Location.TableCaption(), Location.TableCaption());
        DimSelection.InsertDimSelBuf(false, Vend.TableCaption(), Vend.TableCaption());
        DimSelection.InsertDimSelBuf(false, Text003, Text003);
        if GLSetup."Global Dimension 1 Code" <> '' then
            DimSelection.InsertDimSelBuf(false, GLSetup."Global Dimension 1 Code", '');
        if GLSetup."Global Dimension 2 Code" <> '' then
            DimSelection.InsertDimSelBuf(false, GLSetup."Global Dimension 2 Code", '');
        if ItemBudgetName."Budget Dimension 1 Code" <> '' then
            DimSelection.InsertDimSelBuf(false, ItemBudgetName."Budget Dimension 1 Code", '');
        if ItemBudgetName."Budget Dimension 2 Code" <> '' then
            DimSelection.InsertDimSelBuf(false, ItemBudgetName."Budget Dimension 2 Code", '');
        if ItemBudgetName."Budget Dimension 3 Code" <> '' then
            DimSelection.InsertDimSelBuf(false, ItemBudgetName."Budget Dimension 3 Code", '');

        OnGetDimSelectionOnBeforeDimSelectionRunModal(DimSelection, ItemBudgetName);
        DimSelection.LookupMode := true;
        if DimSelection.RunModal() = ACTION::LookupOK then
            exit(DimSelection.GetDimSelCode());
        exit(OldDimSelCode);
    end;

    procedure ValidateLineDimTypeAndCode(ItemBudgetName: Record "Item Budget Name"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Budget Dimension Type"; ColumnDimType: Enum "Item Budget Dimension Type"; var InternalDateFilter: Text; var DateFilter: Text; var ItemStatisticsBuf: Record "Item Statistics Buffer"; var PeriodInitialized: Boolean)
    begin
        if DimCodeNotAllowed(LineDimCode, ItemBudgetName) then begin
            Message(Text004, LineDimCode);
            LineDimCode := '';
        end;
        LineDimType := DimCodeToType(LineDimCode, ItemBudgetName);
        InternalDateFilter := ItemStatisticsBuf.GetFilter("Date Filter");
        if (not OptionIsPeriod(LineDimType)) and (not OptionIsPeriod(ColumnDimType)) then begin
            DateFilter := InternalDateFilter;
            if StrPos(DateFilter, '&') > 1 then
                DateFilter := CopyStr(DateFilter, 1, StrPos(DateFilter, '&') - 1);
        end else
            PeriodInitialized := false;
    end;

    procedure ValidateColumnDimTypeAndCode(ItemBudgetName: Record "Item Budget Name"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Budget Dimension Type"; LineDimType: Enum "Item Budget Dimension Type"; var InternalDateFilter: Text; var DateFilter: Text; var ItemStatisticsBuf: Record "Item Statistics Buffer"; var PeriodInitialized: Boolean)
    begin
        if DimCodeNotAllowed(ColumnDimCode, ItemBudgetName) then begin
            Message(Text005, ColumnDimCode);
            ColumnDimCode := '';
        end;
        ColumnDimType := DimCodeToType(ColumnDimCode, ItemBudgetName);
        InternalDateFilter := ItemStatisticsBuf.GetFilter("Date Filter");
        if (not OptionIsPeriod(ColumnDimType)) and (not OptionIsPeriod(LineDimType)) then begin
            DateFilter := InternalDateFilter;
            if StrPos(DateFilter, '&') > 1 then
                DateFilter := CopyStr(DateFilter, 1, StrPos(DateFilter, '&') - 1);
        end else
            PeriodInitialized := false;
    end;

    procedure DimCodeNotAllowed(DimCode: Text[30]; ItemBudgetName: Record "Item Budget Name") Result: Boolean
    var
        Item: Record Item;
        Cust: Record Customer;
        Vend: Record Vendor;
        Location: Record Location;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeDimCodeNotAllowed(DimCode, ItemBudgetName, Result, IsHandled);
        if IsHandled then
            exit(Result);

        GetGLSetup();
        exit(
          not (UpperCase(DimCode) in
               [UpperCase(Item.TableCaption()),
                UpperCase(Cust.TableCaption()),
                UpperCase(Vend.TableCaption()),
                UpperCase(Location.TableCaption()),
                UpperCase(Text003),
                ItemBudgetName."Budget Dimension 1 Code",
                ItemBudgetName."Budget Dimension 2 Code",
                ItemBudgetName."Budget Dimension 3 Code",
                GLSetup."Global Dimension 1 Code",
                GLSetup."Global Dimension 2 Code",
                '']));
    end;

    procedure FormatToAmount(var AmountAsText: Text[250]; RoundingFactor: Enum "Analysis Rounding Factor")
    var
        Amount: Decimal;
    begin
        if (AmountAsText = '') or (RoundingFactor = RoundingFactor::None) then
            exit;
        Evaluate(Amount, AmountAsText);
        Amount := MatrixMgt.RoundAmount(Amount, RoundingFactor);
        if Amount = 0 then
            AmountAsText := ''
        else
            case RoundingFactor of
                RoundingFactor::"1":
                    AmountAsText := Format(Amount);
                RoundingFactor::"1000", RoundingFactor::"1000000":
                    AmountAsText := Format(Amount, 0, Text007);
            end;
    end;

    procedure DrillDownBudgetAmount(ItemBudgetName: Record "Item Budget Name"; ItemFilter: Text; SourceTypeFilter: Enum "Analysis Source Type"; SourceNoFilter: Text; DateFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text; RowDimType: Enum "Item Budget Dimension Type"; RowDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Budget Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer"; ValueType: Enum "Item Analysis Value Type"; LinesOnly: Boolean)
    var
        ItemStatisticsBuf: Record "Item Statistics Buffer";
        ItemBudgetEntry: Record "Item Budget Entry";
    begin
        SetBufferFilters(
          ItemStatisticsBuf, ItemBudgetName,
          ItemFilter, SourceTypeFilter, SourceNoFilter, DateFilter,
          GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        SetDimensionFilters(ItemStatisticsBuf, RowDimType, RowDimCodeBuf);
        if not LinesOnly then
            SetDimensionFilters(ItemStatisticsBuf, ColDimType, ColDimCodeBuf);

        ItemBudgetEntry.SetRange("Analysis Area", ItemBudgetName."Analysis Area");
        ItemBudgetEntry.SetRange("Budget Name", ItemBudgetName.Name);

        if ItemStatisticsBuf.GetFilter("Item Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Item Filter", ItemBudgetEntry."Item No.");
        if ItemStatisticsBuf.GetFilter("Global Dimension 1 Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Global Dimension 1 Filter", ItemBudgetEntry."Global Dimension 1 Code");
        if ItemStatisticsBuf.GetFilter("Global Dimension 2 Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Global Dimension 2 Filter", ItemBudgetEntry."Global Dimension 2 Code");
        if ItemStatisticsBuf.GetFilter("Dimension 1 Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Dimension 1 Filter", ItemBudgetEntry."Budget Dimension 1 Code");
        if ItemStatisticsBuf.GetFilter("Dimension 2 Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Dimension 2 Filter", ItemBudgetEntry."Budget Dimension 2 Code");
        if ItemStatisticsBuf.GetFilter("Dimension 3 Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Dimension 3 Filter", ItemBudgetEntry."Budget Dimension 3 Code");
        if ItemStatisticsBuf.GetFilter("Location Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Location Filter", ItemBudgetEntry."Location Code");
        if ItemStatisticsBuf.GetFilter("Date Filter") <> '' then
            ItemStatisticsBuf.CopyFilter("Date Filter", ItemBudgetEntry.Date)
        else
            ItemBudgetEntry.SetRange(Date, 0D, DMY2Date(31, 12, 9999));

        if ItemStatisticsBuf.GetFilter("Source No. Filter") <> '' then begin
            ItemStatisticsBuf.CopyFilter("Source Type Filter", ItemBudgetEntry."Source Type");
            ItemStatisticsBuf.CopyFilter("Source No. Filter", ItemBudgetEntry."Source No.");
            ItemBudgetEntry.SetCurrentKey("Analysis Area", "Budget Name", "Source Type", "Source No.", "Item No.");
        end else
            ItemBudgetEntry.SetCurrentKey("Analysis Area", "Budget Name", "Item No.");

        case ValueType of
            ValueType::"Sales Amount":
                PAGE.Run(0, ItemBudgetEntry, ItemBudgetEntry."Sales Amount");
            ValueType::"Cost Amount":
                PAGE.Run(0, ItemBudgetEntry, ItemBudgetEntry."Cost Amount");
            ValueType::Quantity:
                PAGE.Run(0, ItemBudgetEntry, ItemBudgetEntry.Quantity);
            else
                OnDrillDownBudgetAmountOnValueTypeCaseElse(ValueType, ItemBudgetEntry);
        end;
    end;

    procedure DeleteBudget(AnalysisArea: Integer; ItemBudgetName: Code[10]; ItemFilter: Text; DateFilter: Text; SourceTypeFilter: Option; SourceNoFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text)
    var
        ItemBudgetEntry: Record "Item Budget Entry";
        UpdateItemAnalysisView: Codeunit "Update Item Analysis View";
    begin
        if Confirm(Text006) then begin
            ItemBudgetEntry.SetRange("Analysis Area", AnalysisArea);
            ItemBudgetEntry.SetRange("Budget Name", ItemBudgetName);
            if ItemFilter <> '' then
                ItemBudgetEntry.SetFilter("Item No.", ItemFilter);
            if DateFilter <> '' then
                ItemBudgetEntry.SetFilter(Date, DateFilter);
            if SourceNoFilter <> '' then begin
                ItemBudgetEntry.SetRange("Source Type", SourceTypeFilter);
                ItemBudgetEntry.SetFilter("Source No.", SourceNoFilter);
            end;
            if GlobalDim1Filter <> '' then
                ItemBudgetEntry.SetFilter("Global Dimension 1 Code", GlobalDim1Filter);
            if GlobalDim2Filter <> '' then
                ItemBudgetEntry.SetFilter("Global Dimension 2 Code", GlobalDim2Filter);
            if BudgetDim1Filter <> '' then
                ItemBudgetEntry.SetFilter("Budget Dimension 1 Code", BudgetDim1Filter);
            if BudgetDim2Filter <> '' then
                ItemBudgetEntry.SetFilter("Budget Dimension 2 Code", BudgetDim2Filter);
            if BudgetDim3Filter <> '' then
                ItemBudgetEntry.SetFilter("Budget Dimension 3 Code", BudgetDim3Filter);
            ItemBudgetEntry.SetCurrentKey("Entry No.");
            if ItemBudgetEntry.FindFirst() then
                UpdateItemAnalysisView.SetLastBudgetEntryNo(ItemBudgetEntry."Entry No." - 1);
            ItemBudgetEntry.SetCurrentKey("Analysis Area", ItemBudgetEntry."Budget Name");
            ItemBudgetEntry.DeleteAll(true);
        end;
    end;

    local procedure GetGLSetup()
    begin
        if GLSetupRead then
            exit;
        GLSetup.Get();
        GLSetupRead := true;
    end;

    local procedure CopyItemToBuf(var Item: Record Item; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
        DimCodeBuf.Init();
        DimCodeBuf.Code := Item."No.";
        DimCodeBuf.Name := Item.Description;

        OnAfterCopyItemToBuf(Item, DimCodeBuf);
    end;

    local procedure CopyCustToBuf(var Cust: Record Customer; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
        DimCodeBuf.Init();
        DimCodeBuf.Code := Cust."No.";
        DimCodeBuf.Name := Cust.Name;
    end;

    local procedure CopyVendToBuf(var Vend: Record Vendor; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
        DimCodeBuf.Init();
        DimCodeBuf.Code := Vend."No.";
        DimCodeBuf.Name := Vend.Name;
    end;

    local procedure CopyPeriodToBuf(var DatePeriod: Record Date; var DimCodeBuf: Record "Dimension Code Buffer"; DateFilter: Text)
    var
        DatePeriod2: Record Date;
    begin
        DimCodeBuf.Init();
        DimCodeBuf.Code := Format(DatePeriod."Period Start");
        DimCodeBuf."Period Start" := DatePeriod."Period Start";
        DimCodeBuf."Period End" := DatePeriod."Period End";
        if DateFilter <> '' then begin
            DatePeriod2.SetFilter("Period End", DateFilter);
            if DatePeriod2.GetRangeMax("Period End") < DimCodeBuf."Period End" then
                DimCodeBuf."Period End" := DatePeriod2.GetRangeMax("Period End");
        end;
        DimCodeBuf.Name := DatePeriod."Period Name";
    end;

    local procedure CopyLocationToBuf(var Location: Record Location; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
        DimCodeBuf.Init();
        DimCodeBuf.Code := Location.Code;
        if Location.Name <> '' then
            DimCodeBuf.Name := Location.Name
    end;

    local procedure CopyDimValToBuf(var DimVal: Record "Dimension Value"; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
        DimCodeBuf.Init();
        DimCodeBuf.Code := DimVal.Code;
        DimCodeBuf.Name := DimVal.Name;
        DimCodeBuf.Totaling := DimVal.Totaling;
        DimCodeBuf.Indentation := DimVal.Indentation;
        DimCodeBuf."Show in Bold" := DimVal."Dimension Value Type" <> DimVal."Dimension Value Type"::Standard;
    end;

    procedure CalculateAmount(ValueType: Enum "Item Analysis Value Type"; SetColumnFilter: Boolean; var ItemStatisticsBuf: Record "Item Statistics Buffer"; ItemBudgetName: Record "Item Budget Name"; ItemFilter: Text; SourceTypeFilter: Enum "Analysis Source Type"; SourceNoFilter: Text; DateFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text; RowDimType: Enum "Item Budget Dimension Type"; RowDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Budget Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer") Result: Decimal
    var
        IsHandled: Boolean;
    begin
        SetBufferFilters(
          ItemStatisticsBuf, ItemBudgetName, ItemFilter, SourceTypeFilter, SourceNoFilter,
          DateFilter, GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        SetDimensionFilters(ItemStatisticsBuf, RowDimType, RowDimCodeBuf);
        if SetColumnFilter then
            SetDimensionFilters(ItemStatisticsBuf, ColDimType, ColDimCodeBuf);

        IsHandled := false;
        OnCalculateAmountOnBeforeValueTypeCase(ValueType, ItemStatisticsBuf, Result, IsHandled);
        if IsHandled then
            exit(Result);

        case ValueType of
            ValueType::"Sales Amount":
                begin
                    ItemStatisticsBuf.CalcFields("Budgeted Sales Amount");
                    exit(ItemStatisticsBuf."Budgeted Sales Amount");
                end;
            ValueType::"Cost Amount":
                begin
                    ItemStatisticsBuf.CalcFields("Budgeted Cost Amount");
                    exit(ItemStatisticsBuf."Budgeted Cost Amount");
                end;
            ValueType::Quantity:
                begin
                    ItemStatisticsBuf.CalcFields("Budgeted Quantity");
                    exit(ItemStatisticsBuf."Budgeted Quantity");
                end;
            else begin
                OnCalculateAmountOnValueTypeCaseElse(ValueType, ItemStatisticsBuf, Result);
                exit(Result);
            end;
        end;
    end;

    procedure SetAmount(ValueType: Enum "Item Analysis Value Type"; SetColumnFilter: Boolean; var ItemStatisticsBuf: Record "Item Statistics Buffer"; ItemBudgetName: Record "Item Budget Name"; ItemFilter: Text; SourceTypeFilter: Enum "Analysis Source Type"; SourceNoFilter: Text; DateFilter: Text; GlobalDim1Filter: Text; GlobalDim2Filter: Text; BudgetDim1Filter: Text; BudgetDim2Filter: Text; BudgetDim3Filter: Text; RowDimType: Enum "Item Budget Dimension Type"; RowDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Budget Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer"; NewAmount: Decimal)
    var
        IsHandled: Boolean;
    begin
        SetBufferFilters(
          ItemStatisticsBuf, ItemBudgetName, ItemFilter, SourceTypeFilter, SourceNoFilter,
          DateFilter, GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter);
        SetDimensionFilters(ItemStatisticsBuf, RowDimType, RowDimCodeBuf);
        if SetColumnFilter then
            SetDimensionFilters(ItemStatisticsBuf, ColDimType, ColDimCodeBuf);

        IsHandled := false;
        OnSetAmountOnBeforeValueTypeCase(ValueType, ItemStatisticsBuf, NewAmount, IsHandled);
        if IsHandled then
            exit;

        case ValueType of
            ValueType::"Sales Amount":
                begin
                    ItemStatisticsBuf.CalcFields("Budgeted Sales Amount");
                    ItemStatisticsBuf.Validate("Budgeted Sales Amount", NewAmount);
                end;
            ValueType::"Cost Amount":
                begin
                    ItemStatisticsBuf.CalcFields("Budgeted Cost Amount");
                    ItemStatisticsBuf.Validate("Budgeted Cost Amount", NewAmount);
                end;
            ValueType::Quantity:
                begin
                    ItemStatisticsBuf.CalcFields("Budgeted Quantity");
                    ItemStatisticsBuf.Validate("Budgeted Quantity", NewAmount);
                end;
            else
                OnSetAmountOnValueTypeCaseElse(ValueType, ItemStatisticsBuf);
        end;
    end;

    local procedure OptionIsPeriod(DimOption: Enum "Item Budget Dimension Type"): Boolean
    begin
        exit(DimOption = GlobalDimType::Period);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyItemToBuf(var Item: Record Item; var DimCodeBuf: Record "Dimension Code Buffer")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindRecOnBeforeItemFind(var Item: Record Item)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnNextRecOnBeforeItemFind(var Item: Record Item)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnNextRecOnBeforeCustomerFindNext(var Customer: Record Customer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnNextRecOnBeforeVendorFindNext(var Vendor: Record Vendor)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDimCodeToType(DimCode: Text[30]; ItemBudgetName: Record "Item Budget Name"; var Result: Enum "Item Budget Dimension Type"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetDimSelectionOnBeforeDimSelectionRunModal(var DimensionSelection: Page "Dimension Selection"; var ItemBudgetName: Record "Item Budget Name")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDimCodeNotAllowed(DimCode: Text[30]; ItemBudgetName: Record "Item Budget Name"; var Result: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetLineAndColumnDim(ItemBudgetName: Record "Item Budget Name"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Budget Dimension Type"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Budget Dimension Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetLineAndColumnDim(ItemBudgetName: Record "Item Budget Name"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Budget Dimension Type"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Budget Dimension Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDrillDownBudgetAmountOnValueTypeCaseElse(ItemAnalysisValueType: Enum "Item Analysis Value Type"; var ItemBudgetEntry: Record "Item Budget Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCalculateAmountOnValueTypeCaseElse(ItemAnalysisValueType: Enum "Item Analysis Value Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var Result: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetAmountOnValueTypeCaseElse(ItemAnalysisValueType: Enum "Item Analysis Value Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCalculateAmountOnBeforeValueTypeCase(ValueType: Enum "Item Analysis Value Type"; ItemStatisticsBuf: Record "Item Statistics Buffer"; var Result: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetAmountOnBeforeValueTypeCase(ValueType: Enum "Item Analysis Value Type"; var ItemStatisticsBuf: Record "Item Statistics Buffer"; var NewAmount: Decimal; var IsHandled: Boolean)
    begin
    end;
}