Page 198 Acc. Sched. KPI WS Dimensions, source in 29
Source29
src/Layers/W1/BaseApp/Finance/FinancialReports/AccSchedKPIWSDimensions.Page.al301 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.FinancialReports;
using System.Environment;
/// <summary>
/// Dimension display page for account schedule KPI web service data with drill-down capabilities.
/// Provides read-only view of KPI dimensions and enables dimension-based data filtering and analysis.
/// </summary>
/// <remarks>
/// Temporary table-based page for displaying KPI buffer data with dimension breakdown.
/// Supports dimension drill-down operations and integration with account schedule reporting
/// for detailed dimensional analysis of financial KPIs through web service interfaces.
/// </remarks>
page 198 "Acc. Sched. KPI WS Dimensions"
{
Caption = 'Account Schedule KPI WS Dimensions';
Editable = false;
PageType = List;
SourceTable = "Acc. Sched. KPI Buffer";
SourceTableTemporary = true;
layout
{
area(content)
{
repeater(Group)
{
field(Number; Number)
{
ApplicationArea = Dimensions;
ToolTip = 'Specifies the number of the dimension.';
Visible = false;
}
field("No."; Rec."No.")
{
ApplicationArea = Dimensions;
Visible = false;
}
field(Date; Rec.Date)
{
ApplicationArea = Dimensions;
}
field("Closed Period"; Rec."Closed Period")
{
ApplicationArea = Dimensions;
ToolTip = 'Specifies if the accounting period is closed or locked. KPI data for periods that are not closed or locked will be forecasted values from the general ledger budget.';
}
field("Account Schedule Name"; Rec."Account Schedule Name")
{
ApplicationArea = Dimensions;
}
field("KPI Code"; Rec."KPI Code")
{
ApplicationArea = Dimensions;
ToolTip = 'Specifies a code for the account-schedule KPI web service.';
}
field("KPI Name"; Rec."KPI Name")
{
ApplicationArea = Dimensions;
}
field("Net Change Actual"; Rec."Net Change Actual")
{
ApplicationArea = Dimensions;
}
field("Balance at Date Actual"; Rec."Balance at Date Actual")
{
ApplicationArea = Dimensions;
}
field("Net Change Budget"; Rec."Net Change Budget")
{
ApplicationArea = Dimensions;
}
field("Balance at Date Budget"; Rec."Balance at Date Budget")
{
ApplicationArea = Dimensions;
}
field("Net Change Actual Last Year"; Rec."Net Change Actual Last Year")
{
ApplicationArea = Dimensions;
}
field("Balance at Date Actual Last Year"; Rec."Balance at Date Act. Last Year")
{
ApplicationArea = Dimensions;
}
field("Net Change Budget Last Year"; Rec."Net Change Budget Last Year")
{
ApplicationArea = Dimensions;
}
field("Balance at Date Budget Last Year"; Rec."Balance at Date Bud. Last Year")
{
ApplicationArea = Dimensions;
}
field("Net Change Forecast"; Rec."Net Change Forecast")
{
ApplicationArea = Dimensions;
}
field("Balance at Date Forecast"; Rec."Balance at Date Forecast")
{
ApplicationArea = Dimensions;
}
field("Dimension Set ID"; Rec."Dimension Set ID")
{
ApplicationArea = Dimensions;
}
}
}
}
actions
{
}
trigger OnAfterGetRecord()
begin
Number := Rec."No.";
end;
trigger OnOpenPage()
var
ViewTxt: Text;
begin
ViewTxt := Rec.GetView();
Initialize();
PrecalculateData();
Rec.SetView(ViewTxt);
end;
var
AccSchedKPIWebSrvSetup: Record "Acc. Sched. KPI Web Srv. Setup";
TempAccScheduleLine: Record "Acc. Schedule Line" temporary;
AccSchedKPIDimensions: Codeunit "Acc. Sched. KPI Dimensions";
Number: Integer;
local procedure Initialize()
var
LogInManagement: Codeunit LogInManagement;
begin
if not GuiAllowed then
WorkDate := LogInManagement.GetDefaultWorkDate();
SetupActiveAccSchedLines();
end;
local procedure SetupColumnLayout(var TempColumnLayout: Record "Column Layout" temporary)
begin
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Net Change", TempColumnLayout."Ledger Entry Type"::Entries, false);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Balance at Date", TempColumnLayout."Ledger Entry Type"::Entries, false);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Net Change", TempColumnLayout."Ledger Entry Type"::"Budget Entries", false);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Balance at Date", TempColumnLayout."Ledger Entry Type"::"Budget Entries", false);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Net Change", TempColumnLayout."Ledger Entry Type"::Entries, true);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Balance at Date", TempColumnLayout."Ledger Entry Type"::Entries, true);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Net Change", TempColumnLayout."Ledger Entry Type"::"Budget Entries", true);
InsertTempColumn(TempColumnLayout, TempColumnLayout."Column Type"::"Balance at Date", TempColumnLayout."Ledger Entry Type"::"Budget Entries", true);
end;
local procedure SetupActiveAccSchedLines()
var
AccScheduleLine: Record "Acc. Schedule Line";
AccSchedKPIWebSrvLine: Record "Acc. Sched. KPI Web Srv. Line";
LineNo: Integer;
begin
AccSchedKPIWebSrvSetup.Get();
AccSchedKPIWebSrvLine.FindSet();
AccScheduleLine.SetFilter(Totaling, '<>%1', '');
repeat
AccScheduleLine.SetRange("Schedule Name", AccSchedKPIWebSrvLine."Acc. Schedule Name");
AccScheduleLine.FindSet();
repeat
LineNo += 1;
TempAccScheduleLine := AccScheduleLine;
TempAccScheduleLine."Line No." := LineNo;
TempAccScheduleLine.Insert();
until AccScheduleLine.Next() = 0;
until AccSchedKPIWebSrvLine.Next() = 0;
end;
local procedure InsertTempColumn(var TempColumnLayout: Record "Column Layout" temporary; ColumnType: Enum "Column Layout Type"; EntryType: Enum "Column Layout Entry Type"; LastYear: Boolean)
begin
if TempColumnLayout.FindLast() then;
TempColumnLayout.Init();
TempColumnLayout."Line No." += 10000;
TempColumnLayout."Column Type" := ColumnType;
TempColumnLayout."Ledger Entry Type" := EntryType;
if LastYear then
Evaluate(TempColumnLayout."Comparison Date Formula", '<-1Y>');
TempColumnLayout.Insert();
end;
local procedure PrecalculateData()
var
TempAccSchedKPIBuffer: Record "Acc. Sched. KPI Buffer" temporary;
TempColumnLayout: Record "Column Layout" temporary;
StartDate: Date;
EndDate: Date;
FromDate: Date;
ToDate: Date;
LastClosedDate: Date;
C: Integer;
NoOfPeriods: Integer;
ForecastFromBudget: Boolean;
begin
SetupColumnLayout(TempColumnLayout);
AccSchedKPIWebSrvSetup.GetPeriodLength(NoOfPeriods, StartDate, EndDate);
LastClosedDate := AccSchedKPIWebSrvSetup.GetLastClosedAccDate();
for C := 1 to NoOfPeriods do begin
FromDate := AccSchedKPIWebSrvSetup.CalcNextStartDate(StartDate, C - 1);
ToDate := AccSchedKPIWebSrvSetup.CalcNextStartDate(FromDate, 1) - 1;
TempAccSchedKPIBuffer.Init();
TempAccSchedKPIBuffer.Date := FromDate;
TempAccSchedKPIBuffer."Closed Period" := (FromDate <= LastClosedDate);
ForecastFromBudget :=
((AccSchedKPIWebSrvSetup."Forecasted Values Start" =
AccSchedKPIWebSrvSetup."Forecasted Values Start"::"After Latest Closed Period") and
not TempAccSchedKPIBuffer."Closed Period") or
((AccSchedKPIWebSrvSetup."Forecasted Values Start" =
AccSchedKPIWebSrvSetup."Forecasted Values Start"::"After Current Date") and
(TempAccSchedKPIBuffer.Date > WorkDate()));
TempAccScheduleLine.FindSet();
repeat
if TempAccSchedKPIBuffer."Account Schedule Name" <> TempAccScheduleLine."Schedule Name" then begin
InsertAccSchedulePeriod(TempAccSchedKPIBuffer, ForecastFromBudget);
TempAccSchedKPIBuffer."Account Schedule Name" := TempAccScheduleLine."Schedule Name";
end;
TempAccSchedKPIBuffer."KPI Code" := TempAccScheduleLine."Row No.";
TempAccSchedKPIBuffer."KPI Name" :=
CopyStr(TempAccScheduleLine.Description, 1, MaxStrLen(TempAccSchedKPIBuffer."KPI Name"));
TempAccScheduleLine.SetRange(TempAccScheduleLine."Date Filter", FromDate, ToDate);
TempAccScheduleLine.SetRange(TempAccScheduleLine."G/L Budget Filter", AccSchedKPIWebSrvSetup."G/L Budget Name");
AccSchedKPIDimensions.GetCellDataWithDimensions(TempAccScheduleLine, TempColumnLayout, TempAccSchedKPIBuffer);
until TempAccScheduleLine.Next() = 0;
InsertAccSchedulePeriod(TempAccSchedKPIBuffer, ForecastFromBudget);
end;
Rec.Reset();
Rec.FindFirst();
end;
local procedure InsertAccSchedulePeriod(var TempAccSchedKPIBuffer: Record "Acc. Sched. KPI Buffer" temporary; ForecastFromBudget: Boolean)
var
AccScheduleLine: Record "Acc. Schedule Line";
begin
TempAccSchedKPIBuffer.Reset();
if TempAccSchedKPIBuffer.FindSet() then
repeat
AccScheduleLine.SetRange("Schedule Name", TempAccSchedKPIBuffer."Account Schedule Name");
AccScheduleLine.SetRange("Row No.", TempAccSchedKPIBuffer."KPI Code");
if AccScheduleLine.FindFirst() then;
if AccScheduleLine.Show = "Acc. Schedule Line Show"::Yes then
InsertData(TempAccSchedKPIBuffer, ForecastFromBudget);
until TempAccSchedKPIBuffer.Next() = 0;
TempAccSchedKPIBuffer.DeleteAll();
end;
local procedure InsertData(AccSchedKPIBuffer: Record "Acc. Sched. KPI Buffer"; ForecastFromBudget: Boolean)
var
TempAccScheduleLine2: Record "Acc. Schedule Line" temporary;
begin
Rec.Init();
Rec."No." += 1;
Rec.TransferFields(AccSchedKPIBuffer, false);
TempAccScheduleLine2.Copy(TempAccScheduleLine, true);
TempAccScheduleLine2.SetRange(TempAccScheduleLine2."Schedule Name", AccSchedKPIBuffer."Account Schedule Name");
TempAccScheduleLine2.SetRange(TempAccScheduleLine2."Row No.", AccSchedKPIBuffer."KPI Code");
TempAccScheduleLine2.FindFirst();
Rec."Net Change Actual" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Net Change Actual");
Rec."Balance at Date Actual" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Balance at Date Actual");
Rec."Net Change Budget" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Net Change Budget");
Rec."Balance at Date Budget" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Balance at Date Budget");
Rec."Net Change Actual Last Year" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Net Change Actual Last Year");
Rec."Balance at Date Act. Last Year" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Balance at Date Act. Last Year");
Rec."Net Change Budget Last Year" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Net Change Budget Last Year");
Rec."Balance at Date Bud. Last Year" :=
AccSchedKPIDimensions.PostProcessAmount(TempAccScheduleLine2, Rec."Balance at Date Bud. Last Year");
if ForecastFromBudget then begin
Rec."Net Change Forecast" := Rec."Net Change Budget";
Rec."Balance at Date Forecast" := Rec."Balance at Date Budget";
end else begin
Rec."Net Change Forecast" := Rec."Net Change Actual";
Rec."Balance at Date Forecast" := Rec."Balance at Date Actual";
end;
Rec.Insert();
end;
}