Codeunit 7153 Item Analysis Management
- App
- Base Application
- Namespace
- Microsoft.Inventory.Analysis
- Versions
- 17-28
Procedures, 29Events, 20Obsolete, 10
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Inventory/Analysis/ItemAnalysisManagement.Codeunit.al965 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.Foundation.Enums;
using Microsoft.Foundation.Period;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using System.Utilities;
codeunit 7153 "Item Analysis Management"
{
trigger OnRun()
begin
end;
var
PrevItemAnalysisView: Record "Item Analysis View";
MatrixMgt: Codeunit "Matrix Management";
#pragma warning disable AA0074
Text000: Label 'Period';
Text001: Label '<Sign><Integer Thousand><Decimals,2>', Locked = true;
#pragma warning disable AA0470
Text003: Label '%1 is not a valid line definition.';
Text004: Label '%1 is not a valid column definition.';
#pragma warning restore AA0470
Text005: Label '1,6,,Dimension 1 Filter';
Text006: Label '1,6,,Dimension 2 Filter';
Text007: Label '1,6,,Dimension 3 Filter';
Text008: Label 'DEFAULT';
Text009: Label 'Default analysis view';
#pragma warning restore AA0074
local procedure DimCodeNotAllowed(DimCode: Text[30]; ItemAnalysisView: Record "Item Analysis View") Result: Boolean
var
Item: Record Item;
Location: Record Location;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeDimCodeNotAllowed(DimCode, ItemAnalysisView, Result, IsHandled);
if IsHandled then
exit(Result);
exit(
not (UpperCase(DimCode) in
[UpperCase(Item.TableCaption()),
UpperCase(Location.TableCaption()),
UpperCase(Text000),
ItemAnalysisView."Dimension 1 Code",
ItemAnalysisView."Dimension 2 Code",
ItemAnalysisView."Dimension 3 Code",
'']));
end;
local procedure DimCodeToType(DimCode: Text[30]; ItemAnalysisView: Record "Item Analysis View") Result: Enum "Item Analysis Dimension Type"
var
Location: Record Location;
Item: Record Item;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeDimCodeToType(DimCode, ItemAnalysisView, Result, IsHandled);
if IsHandled then
exit(Result);
case DimCode of
Item.TableCaption():
exit(Enum::"Item Analysis Dimension Type"::Item);
Text000:
exit(Enum::"Item Analysis Dimension Type"::Period);
Location.TableCaption():
exit(Enum::"Item Analysis Dimension Type"::Location);
ItemAnalysisView."Dimension 1 Code":
exit(Enum::"Item Analysis Dimension Type"::"Dimension 1");
ItemAnalysisView."Dimension 2 Code":
exit(Enum::"Item Analysis Dimension Type"::"Dimension 2");
ItemAnalysisView."Dimension 3 Code":
exit(Enum::"Item Analysis Dimension Type"::"Dimension 3");
else
exit(Enum::"Item Analysis Dimension Type"::Undefined);
end;
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;
end;
local procedure CopyPeriodToBuf(var Period: Record Date; var DimCodeBuf: Record "Dimension Code Buffer"; DateFilter: Text[30])
var
Period2: Record Date;
begin
DimCodeBuf.Init();
DimCodeBuf.Code := Format(Period."Period Start");
DimCodeBuf."Period Start" := Period."Period Start";
DimCodeBuf."Period End" := Period."Period End";
if DateFilter <> '' then begin
Period2.SetFilter("Period End", DateFilter);
if Period2.GetRangeMax("Period End") < DimCodeBuf."Period End" then
DimCodeBuf."Period End" := Period2.GetRangeMax("Period End");
end;
DimCodeBuf.Name := Period."Period Name";
OnAfterCopyPeriodToBuf(Period, DimCodeBuf, DateFilter);
end;
local procedure CopyLocationToBuf(var Location: Record Location; var DimCodeBuf: Record "Dimension Code Buffer")
begin
DimCodeBuf.Init();
DimCodeBuf.Code := Location.Code;
DimCodeBuf.Name := Location.Name;
end;
local procedure CopyDimValueToBuf(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;
local procedure FilterItemAnalyViewEntry(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var ItemAnalysisViewEntry: Record "Item Analysis View Entry")
begin
ItemStatisticsBuffer.CopyFilter("Analysis Area Filter", ItemAnalysisViewEntry."Analysis Area");
ItemStatisticsBuffer.CopyFilter("Analysis View Filter", ItemAnalysisViewEntry."Analysis View Code");
if ItemStatisticsBuffer.GetFilter("Item Filter") <> '' then
ItemStatisticsBuffer.CopyFilter("Item Filter", ItemAnalysisViewEntry."Item No.");
if ItemStatisticsBuffer.GetFilter("Date Filter") <> '' then
ItemStatisticsBuffer.CopyFilter("Date Filter", ItemAnalysisViewEntry."Posting Date");
if ItemStatisticsBuffer.GetFilter("Location Filter") <> '' then
ItemStatisticsBuffer.CopyFilter("Location Filter", ItemAnalysisViewEntry."Location Code");
if ItemStatisticsBuffer.GetFilter("Dimension 1 Filter") <> '' then
ItemStatisticsBuffer.CopyFilter("Dimension 1 Filter", ItemAnalysisViewEntry."Dimension 1 Value Code");
if ItemStatisticsBuffer.GetFilter("Dimension 2 Filter") <> '' then
ItemStatisticsBuffer.CopyFilter("Dimension 2 Filter", ItemAnalysisViewEntry."Dimension 2 Value Code");
if ItemStatisticsBuffer.GetFilter("Dimension 3 Filter") <> '' then
ItemStatisticsBuffer.CopyFilter("Dimension 3 Filter", ItemAnalysisViewEntry."Dimension 3 Value Code");
OnAfterFilterItemAnalyViewEntry(ItemStatisticsBuffer, ItemAnalysisViewEntry);
end;
local procedure FilterItemAnalyViewBudgEntry(var ItemStatisticsBuf: Record "Item Statistics Buffer"; var ItemAnalysisViewBudgEntry: Record "Item Analysis View Budg. Entry")
begin
ItemStatisticsBuf.CopyFilter("Analysis Area Filter", ItemAnalysisViewBudgEntry."Analysis Area");
ItemStatisticsBuf.CopyFilter("Analysis View Filter", ItemAnalysisViewBudgEntry."Analysis View Code");
ItemStatisticsBuf.CopyFilter("Budget Filter", ItemAnalysisViewBudgEntry."Budget Name");
if ItemStatisticsBuf.GetFilter("Item Filter") <> '' then
ItemStatisticsBuf.CopyFilter("Item Filter", ItemAnalysisViewBudgEntry."Item No.");
if ItemStatisticsBuf.GetFilter("Location Filter") <> '' then
ItemStatisticsBuf.CopyFilter("Location Filter", ItemAnalysisViewBudgEntry."Location Code");
if ItemStatisticsBuf.GetFilter("Date Filter") <> '' then
ItemStatisticsBuf.CopyFilter("Date Filter", ItemAnalysisViewBudgEntry."Posting Date");
if ItemStatisticsBuf.GetFilter("Dimension 1 Filter") <> '' then
ItemStatisticsBuf.CopyFilter("Dimension 1 Filter", ItemAnalysisViewBudgEntry."Dimension 1 Value Code");
if ItemStatisticsBuf.GetFilter("Dimension 2 Filter") <> '' then
ItemStatisticsBuf.CopyFilter("Dimension 2 Filter", ItemAnalysisViewBudgEntry."Dimension 2 Value Code");
if ItemStatisticsBuf.GetFilter("Dimension 3 Filter") <> '' then
ItemStatisticsBuf.CopyFilter("Dimension 3 Filter", ItemAnalysisViewBudgEntry."Dimension 3 Value Code");
OnAfterFilterItemAnalyViewBudgEntry(ItemStatisticsBuf, ItemAnalysisViewBudgEntry);
end;
local procedure SetDimFilters(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; DimType: Enum "Item Analysis Dimension Type"; DimCodeBuf: Record "Dimension Code Buffer")
begin
case DimType of
DimType::Item:
ItemStatisticsBuffer.SetRange("Item Filter", DimCodeBuf.Code);
DimType::Period:
ItemStatisticsBuffer.SetRange("Date Filter", DimCodeBuf."Period Start", DimCodeBuf."Period End");
DimType::Location:
ItemStatisticsBuffer.SetRange("Location Filter", DimCodeBuf.Code);
DimType::"Dimension 1":
if DimCodeBuf.Totaling <> '' then
ItemStatisticsBuffer.SetFilter("Dimension 1 Filter", DimCodeBuf.Totaling)
else
ItemStatisticsBuffer.SetRange("Dimension 1 Filter", DimCodeBuf.Code);
DimType::"Dimension 2":
if DimCodeBuf.Totaling <> '' then
ItemStatisticsBuffer.SetFilter("Dimension 2 Filter", DimCodeBuf.Totaling)
else
ItemStatisticsBuffer.SetRange("Dimension 2 Filter", DimCodeBuf.Code);
DimType::"Dimension 3":
if DimCodeBuf.Totaling <> '' then
ItemStatisticsBuffer.SetFilter("Dimension 3 Filter", DimCodeBuf.Totaling)
else
ItemStatisticsBuffer.SetRange("Dimension 3 Filter", DimCodeBuf.Code);
end;
OnAfterSetDimFilters(ItemStatisticsBuffer, DimType, DimCodeBuf);
end;
procedure SetBufferFilters(CurrentAnalysisArea: Enum "Analysis Area Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentAnalysisViewCode: Code[10]; ItemFilter: Text; LocationFilter: Text; DateFilter: Text; Dim1Filter: Text; Dim2Filter: Text; Dim3Filter: Text; BudgetFilter: Text)
begin
ItemStatisticsBuffer.Reset();
ItemStatisticsBuffer.SetRange("Analysis Area Filter", CurrentAnalysisArea);
ItemStatisticsBuffer.SetRange("Analysis View Filter", CurrentAnalysisViewCode);
if ItemFilter <> '' then
ItemStatisticsBuffer.SetFilter("Item Filter", ItemFilter);
if LocationFilter <> '' then
ItemStatisticsBuffer.SetFilter("Location Filter", LocationFilter);
if DateFilter <> '' then
ItemStatisticsBuffer.SetFilter("Date Filter", DateFilter);
if Dim1Filter <> '' then
ItemStatisticsBuffer.SetFilter("Dimension 1 Filter", Dim1Filter);
if Dim2Filter <> '' then
ItemStatisticsBuffer.SetFilter("Dimension 2 Filter", Dim2Filter);
if Dim3Filter <> '' then
ItemStatisticsBuffer.SetFilter("Dimension 3 Filter", Dim3Filter);
if BudgetFilter <> '' then
ItemStatisticsBuffer.SetFilter("Budget Filter", BudgetFilter);
OnAfterSetCommonFilters(CurrentAnalysisArea, ItemStatisticsBuffer, CurrentAnalysisViewCode);
end;
procedure AnalysisViewSelection(CurrentAnalysisArea: Option; var CurrentItemAnalysisViewCode: Code[10]; var ItemAnalysisView: Record "Item Analysis View"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var Dim1Filter: Code[250]; var Dim2Filter: Code[250]; var Dim3Filter: Code[250])
begin
if not ItemAnalysisView.Get(CurrentAnalysisArea, CurrentItemAnalysisViewCode) then begin
ItemAnalysisView.FilterGroup := 2;
ItemAnalysisView.SetRange("Analysis Area", CurrentAnalysisArea);
ItemAnalysisView.FilterGroup := 0;
if not ItemAnalysisView.Find('-') then begin
ItemAnalysisView.Init();
ItemAnalysisView."Analysis Area" := "Analysis Area Type".FromInteger(CurrentAnalysisArea);
ItemAnalysisView.Code := Text008;
ItemAnalysisView.Name := Text009;
ItemAnalysisView.Insert(true);
end;
CurrentItemAnalysisViewCode := ItemAnalysisView.Code;
end;
SetItemAnalysisView(
CurrentAnalysisArea, CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
Dim1Filter, Dim2Filter, Dim3Filter);
end;
procedure CheckAnalysisView(CurrentAnalysisArea: Option; CurrentItemAnalysisViewCode: Code[10]; var ItemAnalysisView: Record "Item Analysis View")
begin
ItemAnalysisView.Get(CurrentAnalysisArea, CurrentItemAnalysisViewCode);
end;
procedure SetItemAnalysisView(CurrentAnalysisArea: Option; CurrentItemAnalysisViewCode: Code[10]; var ItemAnalysisView: Record "Item Analysis View"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var Dim1Filter: Code[250]; var Dim2Filter: Code[250]; var Dim3Filter: Code[250])
begin
ItemStatisticsBuffer.SetRange("Analysis Area Filter", CurrentAnalysisArea);
ItemStatisticsBuffer.SetRange("Analysis View Filter", CurrentItemAnalysisViewCode);
if PrevItemAnalysisView.Code <> '' then begin
if ItemAnalysisView."Dimension 1 Code" <> PrevItemAnalysisView."Dimension 1 Code" then
Dim1Filter := '';
if ItemAnalysisView."Dimension 2 Code" <> PrevItemAnalysisView."Dimension 2 Code" then
Dim2Filter := '';
if ItemAnalysisView."Dimension 3 Code" <> PrevItemAnalysisView."Dimension 3 Code" then
Dim3Filter := '';
end;
ItemStatisticsBuffer.SetFilter("Dimension 1 Filter", Dim1Filter);
ItemStatisticsBuffer.SetFilter("Dimension 2 Filter", Dim2Filter);
ItemStatisticsBuffer.SetFilter("Dimension 3 Filter", Dim3Filter);
PrevItemAnalysisView := ItemAnalysisView;
OnAfterSetItemAnalysisView(CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode);
end;
procedure LookupItemAnalysisView(CurrentAnalysisArea: Option; var CurrentItemAnalysisViewCode: Code[10]; var ItemAnalysisView: Record "Item Analysis View"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var Dim1Filter: Code[250]; var Dim2Filter: Code[250]; var Dim3Filter: Code[250])
var
ItemAnalysisView2: Record "Item Analysis View";
begin
ItemAnalysisView2.Copy(ItemAnalysisView);
ItemAnalysisView2.FilterGroup := 2;
ItemAnalysisView2.SetRange("Analysis Area", CurrentAnalysisArea);
ItemAnalysisView2.FilterGroup := 0;
if PAGE.RunModal(0, ItemAnalysisView2) = ACTION::LookupOK then begin
ItemAnalysisView := ItemAnalysisView2;
CurrentItemAnalysisViewCode := ItemAnalysisView.Code;
SetItemAnalysisView(
CurrentAnalysisArea, CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
Dim1Filter, Dim2Filter, Dim3Filter);
end else
AnalysisViewSelection(
CurrentAnalysisArea, CurrentItemAnalysisViewCode, ItemAnalysisView, ItemStatisticsBuffer,
Dim1Filter, Dim2Filter, Dim3Filter);
end;
procedure LookupDimCode(DimType: Enum "Item Analysis Dimension Type"; DimCode: Text[30]; "Code": Text[30])
var
Item: Record Item;
Location: Record Location;
DimVal: Record "Dimension Value";
DimValList: Page "Dimension Value List";
begin
case DimType of
DimType::Item:
begin
Item.Get(Code);
PAGE.RunModal(0, Item);
end;
DimType::Period:
;
DimType::Location:
begin
Location.Get(Code);
PAGE.RunModal(0, Location);
end;
DimType::"Dimension 1",
DimType::"Dimension 2",
DimType::"Dimension 3":
begin
DimVal.SetRange("Dimension Code", DimCode);
DimVal.Get(DimCode, Code);
Clear(DimValList);
DimValList.SetTableView(DimVal);
DimValList.SetRecord(DimVal);
DimValList.RunModal();
end;
end;
OnAfterLookupDimCode(DimType, DimCode, Code);
end;
procedure LookUpDimFilter(Dim: Code[20]; var Text: Text): Boolean
var
DimVal: Record "Dimension Value";
DimValList: Page "Dimension Value List";
begin
if Dim = '' then
exit(false);
DimValList.LookupMode(true);
DimVal.SetRange("Dimension Code", Dim);
DimValList.SetTableView(DimVal);
if DimValList.RunModal() = ACTION::LookupOK then begin
DimValList.GetRecord(DimVal);
Text := DimValList.GetSelectionFilter();
exit(true);
end;
end;
procedure DrillDownAmount(CurrentAnalysisArea: Enum "Analysis Area Type"; ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10]; ItemFilter: Text; LocationFilter: Text; DateFilter: Text; Dim1Filter: Text; Dim2Filter: Text; Dim3Filter: Text; BudgetFilter: Text; LineDimType: Enum "Item Analysis Dimension Type"; LineDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Analysis Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer"; SetColumnFilter: Boolean; ValueType: Enum "Item Analysis Value Type"; ShowActualBudget: Enum "Item Analysis Show Type")
var
ItemAnalysisViewEntry: Record "Item Analysis View Entry";
ItemAnalysisViewBudgetEntry: Record "Item Analysis View Budg. Entry";
begin
SetBufferFilters(
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, Dim1Filter, Dim2Filter, Dim3Filter, BudgetFilter);
SetDimFilters(ItemStatisticsBuffer, LineDimType, LineDimCodeBuf);
if SetColumnFilter then
SetDimFilters(ItemStatisticsBuffer, ColDimType, ColDimCodeBuf);
case ShowActualBudget of
ShowActualBudget::"Actual Amounts",
ShowActualBudget::Variance,
ShowActualBudget::"Variance%",
ShowActualBudget::"Index%":
begin
FilterItemAnalyViewEntry(ItemStatisticsBuffer, ItemAnalysisViewEntry);
case ValueType of
ValueType::"Sales Amount":
PAGE.Run(0, ItemAnalysisViewEntry, ItemAnalysisViewEntry."Sales Amount (Actual)");
ValueType::"Cost Amount":
PAGE.Run(0, ItemAnalysisViewEntry, ItemAnalysisViewEntry."Cost Amount (Actual)");
ValueType::Quantity:
PAGE.Run(0, ItemAnalysisViewEntry, ItemAnalysisViewEntry.Quantity);
end;
end;
ShowActualBudget::"Budgeted Amounts":
begin
FilterItemAnalyViewBudgEntry(ItemStatisticsBuffer, ItemAnalysisViewBudgetEntry);
case ValueType of
ValueType::"Sales Amount":
PAGE.Run(0, ItemAnalysisViewBudgetEntry, ItemAnalysisViewBudgetEntry."Sales Amount");
ValueType::"Cost Amount":
PAGE.Run(0, ItemAnalysisViewBudgetEntry, ItemAnalysisViewBudgetEntry."Cost Amount");
ValueType::Quantity:
PAGE.Run(0, ItemAnalysisViewBudgetEntry, ItemAnalysisViewBudgetEntry.Quantity);
end;
end;
end;
OnAfterDrillDownAmount(ItemAnalysisViewEntry, ItemStatisticsBuffer, ValueType, ShowActualBudget);
end;
procedure SetLineAndColumnDim(ItemAnalysisView: Record "Item Analysis View"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Analysis Dimension Type"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Analysis Dimension Type")
var
Item: Record Item;
begin
if (LineDimCode = '') and (ColumnDimCode = '') then begin
LineDimCode := Item.TableCaption();
ColumnDimCode := Text000;
end;
OnBeforeSetLineAndColumnDim(ItemAnalysisView, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);
LineDimType := DimCodeToType(LineDimCode, ItemAnalysisView);
ColumnDimType := DimCodeToType(ColumnDimCode, ItemAnalysisView);
OnAfterSetLineAndColumnDim(ItemAnalysisView, LineDimCode, LineDimType, ColumnDimCode, ColumnDimType);
end;
procedure GetDimSelection(OldDimSelCode: Text[30]; var ItemAnalysisView: Record "Item Analysis View"): Text[30]
var
Item: Record Item;
Location: Record Location;
DimSelection: Page "Dimension Selection";
begin
DimSelection.InsertDimSelBuf(false, Item.TableCaption(), Item.TableCaption());
DimSelection.InsertDimSelBuf(false, Location.TableCaption(), Location.TableCaption());
DimSelection.InsertDimSelBuf(false, Text000, Text000);
if ItemAnalysisView."Dimension 1 Code" <> '' then
DimSelection.InsertDimSelBuf(false, ItemAnalysisView."Dimension 1 Code", '');
if ItemAnalysisView."Dimension 2 Code" <> '' then
DimSelection.InsertDimSelBuf(false, ItemAnalysisView."Dimension 2 Code", '');
if ItemAnalysisView."Dimension 3 Code" <> '' then
DimSelection.InsertDimSelBuf(false, ItemAnalysisView."Dimension 3 Code", '');
OnGetDimSelectionOnBeforeDimSelectionRunModal(DimSelection, ItemAnalysisView);
DimSelection.LookupMode := true;
if DimSelection.RunModal() = ACTION::LookupOK then
exit(DimSelection.GetDimSelCode());
exit(OldDimSelCode);
end;
procedure ValidateLineDimTypeAndCode(ItemAnalysisView: Record "Item Analysis View"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Analysis Dimension Type"; ColumnDimType: Enum "Item Analysis Dimension Type"; var InternalDateFilter: Text; var DateFilter: Text; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var PeriodInitialized: Boolean)
begin
if DimCodeNotAllowed(LineDimCode, ItemAnalysisView) then begin
Message(Text003, LineDimCode);
LineDimCode := '';
end;
LineDimType := DimCodeToType(LineDimCode, ItemAnalysisView);
InternalDateFilter := ItemStatisticsBuffer.GetFilter("Date Filter");
if (LineDimType <> LineDimType::Period) and (ColumnDimType <> ColumnDimType::Period) then begin
DateFilter := InternalDateFilter;
if StrPos(DateFilter, '&') > 1 then
DateFilter := CopyStr(DateFilter, 1, StrPos(DateFilter, '&') - 1);
end else
PeriodInitialized := false;
end;
procedure ValidateColumnDimTypeAndCode(ItemAnalysisView: Record "Item Analysis View"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Analysis Dimension Type"; LineDimType: Enum "Item Analysis Dimension Type"; var InternalDateFilter: Text; var DateFilter: Text; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var PeriodInitialized: Boolean)
begin
if DimCodeNotAllowed(ColumnDimCode, ItemAnalysisView) then begin
Message(Text004, ColumnDimCode);
ColumnDimCode := '';
end;
ColumnDimType := DimCodeToType(ColumnDimCode, ItemAnalysisView);
InternalDateFilter := ItemStatisticsBuffer.GetFilter("Date Filter");
if (ColumnDimType <> ColumnDimType::Period) and (LineDimType <> LineDimType::Period) then begin
DateFilter := InternalDateFilter;
if StrPos(DateFilter, '&') > 1 then
DateFilter := CopyStr(DateFilter, 1, StrPos(DateFilter, '&') - 1);
end else
PeriodInitialized := false;
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, Text001);
end;
end;
procedure FindRecord(var ItemAnalysisView: Record "Item Analysis View"; DimType: Enum "Item Analysis Dimension Type"; var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[250]; ItemFilter: Code[250]; LocationFilter: Code[250]; PeriodType: Enum "Analysis Period Type"; var DateFilter: Text[30]; var PeriodInitialized: Boolean; InternalDateFilter: Text[30]; Dim1Filter: Code[250]; Dim2Filter: Code[250]; Dim3Filter: Code[250]): Boolean
var
Item: Record Item;
Location: Record Location;
Period: Record Date;
DimVal: Record "Dimension Value";
PeriodPageMgt: Codeunit PeriodPageManagement;
Found: Boolean;
begin
OnBeforeFindRecord(DimType, DimVal);
case DimType of
DimType::Item:
begin
Item."No." := DimCodeBuf.Code;
if ItemFilter <> '' then
Item.SetFilter("No.", ItemFilter);
Found := Item.Find(Which);
if Found then
CopyItemToBuf(Item, DimCodeBuf);
end;
DimType::Period:
begin
if not PeriodInitialized then
DateFilter := '';
PeriodInitialized := true;
Period."Period Start" := DimCodeBuf."Period Start";
case PeriodType of
PeriodType::Week:
if (InternalDateFilter <> '') then
Period.SetFilter("Period Start", InternalDateFilter)
else
if DateFilter <> '' then
Period.SetFilter("Period Start", DateFilter);
else
if DateFilter <> '' then
Period.SetFilter("Period Start", DateFilter)
else
if InternalDateFilter <> '' then
Period.SetFilter("Period Start", InternalDateFilter);
end;
Found := PeriodPageMgt.FindDate(Which, Period, PeriodType);
if Found then
CopyPeriodToBuf(Period, DimCodeBuf, DateFilter);
end;
DimType::Location:
begin
Location.Code := CopyStr(DimCodeBuf.Code, 1, MaxStrLen(Location.Code));
if LocationFilter <> '' then
Location.SetFilter(Code, LocationFilter);
Found := Location.Find(Which);
if Found then
CopyLocationToBuf(Location, DimCodeBuf);
end;
DimType::"Dimension 1":
begin
if Dim1Filter <> '' then
DimVal.SetFilter(Code, Dim1Filter);
DimVal."Dimension Code" := ItemAnalysisView."Dimension 1 Code";
DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
DimVal.Code := DimCodeBuf.Code;
Found := DimVal.Find(Which);
if Found then
CopyDimValueToBuf(DimVal, DimCodeBuf);
end;
DimType::"Dimension 2":
begin
if Dim2Filter <> '' then
DimVal.SetFilter(Code, Dim2Filter);
DimVal."Dimension Code" := ItemAnalysisView."Dimension 2 Code";
DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
DimVal.Code := DimCodeBuf.Code;
Found := DimVal.Find(Which);
if Found then
CopyDimValueToBuf(DimVal, DimCodeBuf);
end;
DimType::"Dimension 3":
begin
if Dim3Filter <> '' then
DimVal.SetFilter(Code, Dim3Filter);
DimVal."Dimension Code" := ItemAnalysisView."Dimension 3 Code";
DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
DimVal.Code := DimCodeBuf.Code;
Found := DimVal.Find(Which);
if Found then
CopyDimValueToBuf(DimVal, DimCodeBuf);
end;
else
OnFindRecordCaseElse(ItemAnalysisView, DimType, DimCodeBuf, Which, ItemFilter, Found);
end;
exit(Found);
end;
procedure NextRecord(var ItemAnalysisView: Record "Item Analysis View"; DimType: Enum "Item Analysis Dimension Type"; var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer; ItemFilter: Code[250]; LocationFilter: Code[250]; PeriodType: Enum "Analysis Period Type"; DateFilter: Text[30]; Dim1Filter: Code[250]; Dim2Filter: Code[250]; Dim3Filter: Code[250]): Integer
var
Item: Record Item;
Location: Record Location;
Period: Record Date;
DimVal: Record "Dimension Value";
PeriodPageMgt: Codeunit PeriodPageManagement;
ResultSteps: Integer;
begin
OnBeforeNextRecord(DimType, DimVal);
case DimType of
DimType::Item:
begin
Item."No." := DimCodeBuf.Code;
if ItemFilter <> '' then
Item.SetFilter("No.", ItemFilter);
ResultSteps := Item.Next(Steps);
if ResultSteps <> 0 then
CopyItemToBuf(Item, DimCodeBuf);
end;
DimType::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;
DimType::Location:
begin
Location.Code := CopyStr(DimCodeBuf.Code, 1, MaxStrLen(Location.Code));
if LocationFilter <> '' then
Location.SetFilter(Code, LocationFilter);
ResultSteps := Location.Next(Steps);
if ResultSteps <> 0 then
CopyLocationToBuf(Location, DimCodeBuf);
end;
DimType::"Dimension 1":
begin
if Dim1Filter <> '' then
DimVal.SetFilter(Code, Dim1Filter);
DimVal."Dimension Code" := ItemAnalysisView."Dimension 1 Code";
DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
DimVal.Code := DimCodeBuf.Code;
ResultSteps := DimVal.Next(Steps);
if ResultSteps <> 0 then
CopyDimValueToBuf(DimVal, DimCodeBuf);
end;
DimType::"Dimension 2":
begin
if Dim2Filter <> '' then
DimVal.SetFilter(Code, Dim2Filter);
DimVal."Dimension Code" := ItemAnalysisView."Dimension 2 Code";
DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
DimVal.Code := DimCodeBuf.Code;
ResultSteps := DimVal.Next(Steps);
if ResultSteps <> 0 then
CopyDimValueToBuf(DimVal, DimCodeBuf);
end;
DimType::"Dimension 3":
begin
if Dim3Filter <> '' then
DimVal.SetFilter(Code, Dim3Filter);
DimVal."Dimension Code" := ItemAnalysisView."Dimension 3 Code";
DimVal.SetRange("Dimension Code", DimVal."Dimension Code");
DimVal.Code := DimCodeBuf.Code;
ResultSteps := DimVal.Next(Steps);
if ResultSteps <> 0 then
CopyDimValueToBuf(DimVal, DimCodeBuf);
end;
else
OnNextRecordOnCaseElse(ItemAnalysisView, DimType, DimCodeBuf, Steps, ItemFilter, ResultSteps);
end;
exit(ResultSteps);
end;
procedure GetCaptionClass(AnalysisViewDimType: Integer; ItemAnalysisView: Record "Item Analysis View"): Text[250]
begin
case AnalysisViewDimType of
1:
begin
if ItemAnalysisView."Dimension 1 Code" <> '' then
exit('1,6,' + ItemAnalysisView."Dimension 1 Code");
exit(Text005);
end;
2:
begin
if ItemAnalysisView."Dimension 2 Code" <> '' then
exit('1,6,' + ItemAnalysisView."Dimension 2 Code");
exit(Text006);
end;
3:
begin
if ItemAnalysisView."Dimension 3 Code" <> '' then
exit('1,6,' + ItemAnalysisView."Dimension 3 Code");
exit(Text007);
end;
end;
end;
procedure CalculateAmount(ValueType: Enum "Item Analysis Value Type"; SetColumnFilter: Boolean; CurrentAnalysisArea: Enum "Analysis Area Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10]; ItemFilter: Code[250]; LocationFilter: Code[250]; DateFilter: Text[30]; BudgetFilter: Code[250]; Dim1Filter: Code[250]; Dim2Filter: Code[250]; Dim3Filter: Code[250]; LineDimType: Enum "Item Analysis Dimension Type"; LineDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Analysis Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer"; ShowActualBudget: Enum "Item Analysis Show Type"): Decimal
var
Amount: Decimal;
ActualAmt: Decimal;
BudgetAmt: Decimal;
begin
case ShowActualBudget of
ShowActualBudget::"Actual Amounts":
Amount :=
CalcActualAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
ShowActualBudget::"Budgeted Amounts":
Amount :=
CalcBudgetAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
ShowActualBudget::Variance:
begin
ActualAmt :=
CalcActualAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
BudgetAmt :=
CalcBudgetAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
Amount := ActualAmt - BudgetAmt;
end;
ShowActualBudget::"Variance%":
begin
Amount :=
CalcBudgetAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
if Amount <> 0 then begin
ActualAmt :=
CalcActualAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
Amount := Round(100 * (ActualAmt - Amount) / Amount);
end;
end;
ShowActualBudget::"Index%":
begin
Amount :=
CalcBudgetAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
ActualAmt :=
CalcActualAmount(
ValueType, SetColumnFilter,
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, BudgetFilter,
Dim1Filter, Dim2Filter, Dim3Filter,
LineDimType, LineDimCodeBuf,
ColDimType, ColDimCodeBuf);
if Amount <> 0 then
Amount := Round(100 * ActualAmt / Amount);
end;
end;
OnAfterCalcActualAmount(ValueType.AsInteger(), ItemStatisticsBuffer, CurrentItemAnalysisViewCode, Amount);
exit(Amount);
end;
local procedure CalcActualAmount(ValueType: Enum "Item Analysis Value Type"; SetColumnFilter: Boolean; CurrentAnalysisArea: Enum "Analysis Area Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10]; ItemFilter: Code[250]; LocationFilter: Code[250]; DateFilter: Text[30]; BudgetFilter: Code[250]; Dim1Filter: Code[250]; Dim2Filter: Code[250]; Dim3Filter: Code[250]; LineDimType: Enum "Item Analysis Dimension Type"; LineDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Analysis Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer"): Decimal
var
Amount: Decimal;
begin
SetBufferFilters(
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, Dim1Filter, Dim2Filter, Dim3Filter, BudgetFilter);
SetDimFilters(ItemStatisticsBuffer, LineDimType, LineDimCodeBuf);
if SetColumnFilter then
SetDimFilters(ItemStatisticsBuffer, ColDimType, ColDimCodeBuf)
else
case ColDimType of
ColDimType::"Dimension 1":
ItemStatisticsBuffer.SetRange("Dimension 1 Filter");
ColDimType::"Dimension 2":
ItemStatisticsBuffer.SetRange("Dimension 2 Filter");
ColDimType::"Dimension 3":
ItemStatisticsBuffer.SetRange("Dimension 3 Filter");
end;
case ValueType of
ValueType::"Sales Amount":
begin
ItemStatisticsBuffer.CalcFields("Analysis - Sales Amt. (Actual)", "Analysis - Sales Amt. (Exp)");
Amount :=
ItemStatisticsBuffer."Analysis - Sales Amt. (Actual)" +
ItemStatisticsBuffer."Analysis - Sales Amt. (Exp)";
end;
ValueType::"Cost Amount":
begin
ItemStatisticsBuffer.CalcFields(
"Analysis - Cost Amt. (Actual)",
"Analysis - Cost Amt. (Exp)",
"Analysis CostAmt.(Non-Invtbl.)");
Amount :=
ItemStatisticsBuffer."Analysis - Cost Amt. (Actual)" +
ItemStatisticsBuffer."Analysis - Cost Amt. (Exp)" +
ItemStatisticsBuffer."Analysis CostAmt.(Non-Invtbl.)";
end;
ValueType::Quantity:
begin
ItemStatisticsBuffer.CalcFields("Analysis - Quantity");
Amount := ItemStatisticsBuffer."Analysis - Quantity";
end;
end;
exit(Amount);
end;
local procedure CalcBudgetAmount(ValueType: Enum "Item Analysis Value Type"; SetColumnFilter: Boolean; CurrentAnalysisArea: Enum "Analysis Area Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10]; ItemFilter: Code[250]; LocationFilter: Code[250]; DateFilter: Text[30]; BudgetFilter: Code[250]; Dim1Filter: Code[250]; Dim2Filter: Code[250]; Dim3Filter: Code[250]; LineDimType: Enum "Item Analysis Dimension Type"; LineDimCodeBuf: Record "Dimension Code Buffer"; ColDimType: Enum "Item Analysis Dimension Type"; ColDimCodeBuf: Record "Dimension Code Buffer"): Decimal
var
Amount: Decimal;
begin
SetBufferFilters(
CurrentAnalysisArea, ItemStatisticsBuffer, CurrentItemAnalysisViewCode,
ItemFilter, LocationFilter, DateFilter, Dim1Filter, Dim2Filter, Dim3Filter, BudgetFilter);
SetDimFilters(ItemStatisticsBuffer, LineDimType, LineDimCodeBuf);
if SetColumnFilter then
SetDimFilters(ItemStatisticsBuffer, ColDimType, ColDimCodeBuf);
case ValueType of
ValueType::"Sales Amount":
begin
ItemStatisticsBuffer.CalcFields("Analysis - Budgeted Sales Amt.");
Amount := ItemStatisticsBuffer."Analysis - Budgeted Sales Amt.";
end;
ValueType::"Cost Amount":
begin
ItemStatisticsBuffer.CalcFields("Analysis - Budgeted Cost Amt.");
Amount := ItemStatisticsBuffer."Analysis - Budgeted Cost Amt.";
end;
ValueType::Quantity:
begin
ItemStatisticsBuffer.CalcFields("Analysis - Budgeted Quantity");
Amount := ItemStatisticsBuffer."Analysis - Budgeted Quantity";
end;
else
OnCalcBudgetAmountOnValueTypeCaseElse(ValueType, ItemStatisticsBuffer, CurrentItemAnalysisViewCode, Amount);
end;
exit(Amount);
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeSetLineAndColumnDim(ItemAnalysisView: Record "Item Analysis View"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Analysis Dimension Type"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Analysis Dimension Type")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetLineAndColumnDim(ItemAnalysisView: Record "Item Analysis View"; var LineDimCode: Text[30]; var LineDimType: Enum "Item Analysis Dimension Type"; var ColumnDimCode: Text[30]; var ColumnDimType: Enum "Item Analysis Dimension Type")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetItemAnalysisView(CurrentAnalysisArea: Option; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10])
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterCalcActualAmount(ValueType: Option "Sales Amount","Cost Amount",Quantity; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10]; var Amount: Decimal)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterLookupDimCode(DimType: Enum "Item Analysis Dimension Type"; DimCode: Text[30]; "Code": Text[30])
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetCommonFilters(CurrentAnalysisArea: Enum "Analysis Area Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentAnalysisViewCode: Code[10])
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetDimFilters(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; DimType: Enum "Item Analysis Dimension Type"; DimCodeBuffer: Record "Dimension Code Buffer")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFilterItemAnalyViewEntry(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var ItemAnalysisViewEntry: Record "Item Analysis View Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterFilterItemAnalyViewBudgEntry(var ItemStatisticsBuffer: Record "Item Statistics Buffer"; var ItemAnalysisViewBudgEntry: Record "Item Analysis View Budg. Entry")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeDimCodeToType(DimCode: Text[30]; ItemAnalysisView: Record "Item Analysis View"; var Result: Enum "Item Analysis Dimension Type"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeDimCodeNotAllowed(DimCode: Text[30]; ItemAnalysisView: Record "Item Analysis View"; var Result: Boolean; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeFindRecord(DimType: Enum "Item Analysis Dimension Type"; var DimensionValue: Record "Dimension Value")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeNextRecord(DimType: Enum "Item Analysis Dimension Type"; var DimensionValue: Record "Dimension Value")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnFindRecordCaseElse(ItemAnalysisView: Record "Item Analysis View"; DimType: Enum "Item Analysis Dimension Type"; var DimCodeBuf: Record "Dimension Code Buffer"; Which: Text[250]; ItemFilter: Code[250]; var Found: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnGetDimSelectionOnBeforeDimSelectionRunModal(var DimSelection: Page "Dimension Selection"; var ItemAnalysisView: Record "Item Analysis View")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnNextRecordOnCaseElse(ItemAnalysisView: Record "Item Analysis View"; DimType: Enum "Item Analysis Dimension Type"; var DimCodeBuf: Record "Dimension Code Buffer"; Steps: Integer; ItemFilter: Code[250]; var ResultSteps: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterCopyPeriodToBuf(var Period: Record Date; var DimensionCodeBuffer: Record "Dimension Code Buffer"; DateFilter: Text[30])
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterDrillDownAmount(var ItemAnalysisViewEntry: Record "Item Analysis View Entry"; ItemStatisticsBuffer: Record "Item Statistics Buffer"; ItemAnalysisValueType: Enum "Item Analysis Value Type"; ItemAnalysisShowType: Enum "Item Analysis Show Type")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCalcBudgetAmountOnValueTypeCaseElse(ItemAnalysisValueType: Enum "Item Analysis Value Type"; var ItemStatisticsBuffer: Record "Item Statistics Buffer"; CurrentItemAnalysisViewCode: Code[10]; var Amount: Decimal)
begin
end;
}