Page 490 Acc. Schedule Overview, source in 29
Source29
src/Layers/W1/BaseApp/Finance/FinancialReports/AccScheduleOverview.Page.al2611 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 Microsoft.CashFlow.Forecast;
using Microsoft.CostAccounting.Account;
using Microsoft.Finance.Analysis;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.Period;
using System.Reflection;
using System.Telemetry;
using System.Text;
using System.Utilities;
/// <summary>
/// Provides comprehensive account schedule overview interface with matrix-style financial data presentation.
/// Supports interactive financial reporting with multi-column layouts, drill-down capabilities, and dynamic filtering.
/// </summary>
/// <remarks>
/// Primary interface for account schedule analysis with integrated column layout display.
/// Supports financial report configuration, period-based analysis, dimension filtering, and export capabilities.
/// Matrix-style presentation with configurable columns and real-time calculation updates.
/// </remarks>
page 490 "Acc. Schedule Overview"
{
AboutTitle = 'About financial report';
AboutText = 'On this page, you can run a financial report and see data based on filter values. You can also export the data to Excel or get a PDF version (or print it). When the page is in "Edit mode", you can also change the report definition, such as the choice of column and row definitions used.';
Caption = 'Financial Report';
DeleteAllowed = false;
InsertAllowed = false;
LinksAllowed = false;
ModifyAllowed = false;
PageType = List;
SaveValues = true;
ShowFilter = false;
SourceTable = "Acc. Schedule Line";
RefreshOnActivate = true;
UsageCategory = None;
layout
{
area(content)
{
group(General)
{
Caption = 'Options';
Visible = (not ViewOnlyMode or (ViewLayout = "Financial Report View Layout"::"Show All"));
field(FinancialReportName; TempFinancialReport.Name)
{
ApplicationArea = Basic, Suite;
Caption = 'Name';
Tooltip = 'Specifies the name (code) of the financial report.';
trigger OnValidate()
var
FinancialReport: Record "Financial Report";
ConfirmMgt: Codeunit "Confirm Management";
NewName: Code[10];
RenameQst: Label 'Your change might update related records, which can take a while. Do you want to continue?';
begin
if not FinancialReport.Get(FinancialReportCode) then
Error('');
if FinancialReport.Name = TempFinancialReport.Name then
Error('');
if not ConfirmMgt.GetResponse(RenameQst) then
Error('');
NewName := TempFinancialReport.Name;
TempFinancialReport.Name := FinancialReport.Name;
SaveStateToFinancialReport();
SaveStateToUserFilters();
FinancialReport.Find();
FinancialReport.Rename(NewName);
FinancialReportCode := NewName;
ReloadPage();
end;
}
field(FinancialReportDesc; TempFinancialReport.Description)
{
ApplicationArea = Basic, Suite;
Caption = 'Display Title';
Editable = not ViewOnlyMode;
ToolTip = 'Specifies a title of the financial report. The text is shown as a title on the final report when you run it to get a PDF or to print it.';
}
field(CategoryCode; TempFinancialReport.CategoryCode)
{
ApplicationArea = Basic, Suite;
Caption = 'Category';
Editable = not ViewOnlyMode;
Importance = Additional;
TableRelation = "Financial Report Category";
ToolTip = 'Specifies the category code for the financial report.';
}
field(CurrentSchedName; TempFinancialReport."Financial Report Row Group")
{
ApplicationArea = Basic, Suite;
Editable = (not ViewOnlyMode or (ViewLayout = "Financial Report View Layout"::"Show All"));
Caption = 'Row Definition';
Importance = Additional;
Lookup = true;
LookupPageID = "Account Schedule Names";
Style = Attention;
StyleExpr = RowDefinitionBlocked;
ToolTip = 'Specifies the name (code) of the row definition to be used for the report.';
AboutTitle = 'About row definition';
AboutText = 'Change the row definition of the report. You can use the built-in row definitions, or create your own';
trigger OnLookup(var Text: Text): Boolean
var
FinancialReportRowGroup: Text[10];
Result: Boolean;
begin
FinancialReportRowGroup := CopyStr(Text, 1, MaxStrLen(FinancialReportRowGroup));
Result := AccSchedManagement.LookupName(TempFinancialReport."Financial Report Row Group", FinancialReportRowGroup);
TempFinancialReport."Financial Report Row Group" := FinancialReportRowGroup;
Text := TempFinancialReport."Financial Report Row Group";
CurrentSchedNameOnAfterValidate();
exit(Result);
end;
trigger OnValidate()
begin
AccSchedManagement.CheckName(TempFinancialReport."Financial Report Row Group");
CurrentSchedNameOnAfterValidate();
end;
}
group(RowBlocked)
{
ShowCaption = false;
InstructionalText = 'The current row definition has a blocked status.';
Visible = RowDefinitionBlocked;
}
field(CurrentColumnName; TempFinancialReport."Financial Report Column Group")
{
ApplicationArea = Basic, Suite;
Editable = (not ViewOnlyMode or (ViewLayout = "Financial Report View Layout"::"Show All"));
Caption = 'Column Definition';
Importance = Additional;
Lookup = true;
LookupPageId = "Column Layout Names";
Style = Attention;
StyleExpr = ColDefinitionBlocked;
ToolTip = 'Specifies the name (code) of the column definition to be used for the report.';
AboutTitle = 'About column definition';
AboutText = 'Change the column definition of the report. You can use the built-in column definitions, or create your own.';
trigger OnLookup(var Text: Text): Boolean
var
FinancialReportColumnGroup: Text[10];
Result: Boolean;
begin
FinancialReportColumnGroup := CopyStr(Text, 1, MaxStrLen(FinancialReportColumnGroup));
Result := AccSchedManagement.LookupColumnName(TempFinancialReport."Financial Report Column Group", FinancialReportColumnGroup);
TempFinancialReport."Financial Report Column Group" := FinancialReportColumnGroup;
// Every change to FinancialReportTemp."Financial Report Column Group" must be kept in sync with CurrentColumnName
CurrentColumnName := TempFinancialReport."Financial Report Column Group";
Text := TempFinancialReport."Financial Report Column Group";
CurrentColumnNameOnAfterValidate();
exit(Result);
end;
trigger OnValidate()
begin
AccSchedManagement.CheckColumnName(TempFinancialReport."Financial Report Column Group");
// Every change to FinancialReportTemp."Financial Report Column Group" must be kept in sync with CurrentColumnName
CurrentColumnName := TempFinancialReport."Financial Report Column Group";
CurrentColumnNameOnAfterValidate();
end;
}
group(ColBlocked)
{
ShowCaption = false;
InstructionalText = 'The current column definition has a blocked status.';
Visible = ColDefinitionBlocked;
}
field(DimPerspectiveName; TempFinancialReport.DimPerspective)
{
ApplicationArea = Basic, Suite;
Caption = 'Dimension Perspective';
Editable = (not ViewOnlyMode or (ViewLayout = "Financial Report View Layout"::"Show All"));
Importance = Additional;
TableRelation = "Dimension Perspective Name";
ToolTip = 'Specifies the name (code) of the dimension perspective to be used for the report.';
trigger OnAfterLookup(Selected: RecordRef)
var
DimPerspectiveName: Record "Dimension Perspective Name";
begin
DimPerspectiveName := Selected;
TempFinancialReport.DimPerspective := DimPerspectiveName.Name;
if not ViewOnlyMode then
SaveStateToFinancialReport();
end;
trigger OnValidate()
begin
if not ViewOnlyMode then
SaveStateToFinancialReport();
end;
}
field(UseAmtsInAddCurr; TempFinancialReport.UseAmountsInAddCurrency)
{
ApplicationArea = Suite;
Caption = 'Show Amounts in Add. Reporting Currency';
MultiLine = true;
ToolTip = 'Specifies if the reported amounts are shown in the additional reporting currency.';
Visible = UseAmtsInAddCurrVisible;
trigger OnValidate()
begin
// Every change to FinancialReportTemp.UseAmountsInAddCurrency must be kept in sync with UseAmtsInAddCurr
UseAmtsInAddCurr := TempFinancialReport.UseAmountsInAddCurrency;
CurrPage.Update();
end;
}
#if not CLEAN28
field(NegativeAmountFormat; TempFinancialReport.NegativeAmountFormat)
{
ApplicationArea = Basic, Suite;
Caption = 'Negative Amount Format';
Importance = Additional;
ToolTip = 'Specifies how negative amounts are displayed on the financial report.';
ObsoleteState = Pending;
ObsoleteReason = 'This has been replaced by the NegativeAmountFormatDefault field.';
ObsoleteTag = '28.0';
Visible = not FinancialReportDefaultsEnabled;
trigger OnValidate()
begin
CurrPage.Update();
end;
}
#endif
field(NegativeAmountFormatDefault; TempFinancialReport.NegativeAmountFormatDefault)
{
ApplicationArea = Basic, Suite;
Caption = 'Negative Amount Format';
Importance = Additional;
ToolTip = 'Specifies how negative amounts are displayed on the financial report.';
#if not CLEAN28
Visible = FinancialReportDefaultsEnabled;
#endif
trigger OnValidate()
begin
CurrPage.Update();
end;
}
#if not CLEAN28
field(PeriodType; TempFinancialReport.PeriodType)
{
ApplicationArea = Basic, Suite;
Caption = 'View by';
Importance = Promoted;
ToolTip = 'Specifies by which period amounts are displayed.';
ObsoleteState = Pending;
ObsoleteReason = 'This has been replaced by the PeriodTypeDefault field.';
ObsoleteTag = '28.0';
Visible = not FinancialReportDefaultsEnabled;
trigger OnValidate()
begin
AccSchedManagement.FindPeriod(Rec, '', TempFinancialReport.PeriodType);
DateFilter := Rec.GetFilter("Date Filter");
UpdateColumnCaptions();
CurrPage.Update();
end;
}
#endif
field(PeriodTypeDefault; TempFinancialReport.PeriodTypeDefault)
{
ApplicationArea = Basic, Suite;
Caption = 'View by';
Importance = Promoted;
ToolTip = 'Specifies by which period amounts are displayed.';
#if not CLEAN28
Visible = FinancialReportDefaultsEnabled;
#endif
trigger OnValidate()
begin
AccSchedManagement.FindPeriod(Rec, '', TempFinancialReport.GetEffectivePeriodType());
DateFilter := Rec.GetFilter("Date Filter");
CurrPage.Update();
end;
}
field(DateFilter; DateFilter)
{
ApplicationArea = Basic, Suite;
Caption = 'Date Filter';
Importance = Promoted;
ToolTip = 'Specifies the dates that will be used to filter the amounts in the window.';
trigger OnValidate()
var
FilterTokens: Codeunit "Filter Tokens";
begin
FilterTokens.MakeDateFilter(DateFilter);
if DateFilter = '' then begin
TempFinancialReport.DateFilter := '';
FinReportMgt.CalcAccScheduleLineDateFilter(TempFinancialReport, Rec);
end else
Rec.SetFilter("Date Filter", DateFilter);
DateFilter := Rec.GetFilter("Date Filter");
TempFinancialReport.DateFilter := DateFilter;
UpdateColumnCaptions();
CurrPage.Update();
end;
}
field(StartDateFilterFormula; TempFinancialReport.StartDateFilterFormula)
{
ApplicationArea = Basic, Suite;
Caption = 'Start Date Filter Formula';
ToolTip = 'Specifies the date formula used to automatically calculate the start date of the date filter.';
Visible = not ViewOnlyMode;
trigger OnValidate()
begin
ValidateStartEndDateFilterFormula();
end;
}
field(EndDateFilterFormula; TempFinancialReport.EndDateFilterFormula)
{
ApplicationArea = Basic, Suite;
Caption = 'End Date Filter Formula';
ToolTip = 'Specifies the date formula used to automatically calculate the end date of the date filter.';
Visible = not ViewOnlyMode;
trigger OnValidate()
begin
ValidateStartEndDateFilterFormula();
end;
}
field(DateFilterPeriodFormula; TempFinancialReport.DateFilterPeriodFormula)
{
ApplicationArea = Basic, Suite;
Caption = 'Date Filter Period Formula';
ToolTip = 'Specifies the period formula used to automatically calculate the date filter.';
Importance = Additional;
Visible = not ViewOnlyMode;
trigger OnValidate()
begin
ValidateDateFilterPeriodFormula();
end;
}
field(ShowLinesWithShowNo; TempFinancialReport.ShowLinesWithShowNo)
{
ApplicationArea = Basic, Suite;
Caption = 'Show All Lines';
Importance = Additional;
ToolTip = 'Specifies whether the page should display all lines, including lines where No is chosen in the Show field, as well as lines with values outside the range to be displayed. Those lines are still not included in the printed report.';
trigger OnValidate()
begin
ApplyShowFilter();
CurrPage.Update();
end;
}
field(ExcelTemplateCode; TempFinancialReport."Excel Template Code")
{
ApplicationArea = Basic, Suite;
Caption = 'Default Excel Layout';
Importance = Additional;
ToolTip = 'Specifies the Excel layout that will be used when exporting to Excel.';
trigger OnLookup(var Text: Text): Boolean
var
FinReportExcelTemplate: Record "Fin. Report Excel Template";
FinReportExcelTemplates: Page "Fin. Report Excel Templates";
begin
FinReportExcelTemplates.SetSource(TempFinancialReport, Rec);
FinReportExcelTemplates.LookupMode(true);
if FinReportExcelTemplates.RunModal() = Action::LookupOK then begin
FinReportExcelTemplates.GetRecord(FinReportExcelTemplate);
TempFinancialReport."Excel Template Code" := FinReportExcelTemplate.Code;
Text := FinReportExcelTemplate.Code;
exit(true);
end;
end;
trigger OnValidate()
var
FinReportExcelTemplate: Record "Fin. Report Excel Template";
begin
if TempFinancialReport."Excel Template Code" <> '' then
FinReportExcelTemplate.Get(TempFinancialReport.Name, TempFinancialReport."Excel Template Code");
end;
}
field(LogoPositionDefault; TempFinancialReport.LogoPositionDefault)
{
ApplicationArea = Basic, Suite;
Caption = 'Logo Position';
ToolTip = 'Specifies how your company logo is displayed on the financial report.';
Visible = not ViewOnlyMode;
trigger OnValidate()
begin
SaveStateToFinancialReport();
CurrPage.Update();
end;
}
field(FinancialReportStatus; TempFinancialReport.Status)
{
ApplicationArea = Basic, Suite;
Caption = 'Status';
Editable = not ViewOnlyMode;
TableRelation = "Financial Report Status";
ToolTip = 'Specifies the status code for the financial report. The status code helps you organize the lifecycle of your financial reports.';
}
field(InternalDescription; TempFinancialReport."Internal Description")
{
ApplicationArea = Basic, Suite;
Caption = 'Internal Description';
ToolTip = 'Specifies the internal description of this financial report.';
MultiLine = true;
Editable = not ViewOnlyMode;
}
field("Last Run by User"; TempFinancialReport."Last Run by User")
{
ApplicationArea = Basic, Suite;
Caption = 'Your Last Run';
ToolTip = 'Specifies the last date-time this report was run by you.';
Editable = false;
trigger OnDrillDown()
var
FinReportAuditLog: Record "Financial Report Audit Log";
begin
FinReportAuditLog.SetRange("Report Name", TempFinancialReport.Name);
FinReportAuditLog.SetRange(User, UserId());
Page.Run(0, FinReportAuditLog);
end;
}
}
group(IntroductoryParagraphGroup)
{
Caption = 'Introductory paragraph';
Visible = ViewOnlyMode and (IntroductoryParagraph <> '');
field(IntroductoryParagraph; IntroductoryParagraph)
{
ApplicationArea = Basic, Suite;
ShowCaption = false;
ToolTip = 'Specifies the Introductory paragraph displayed on the Financial Report, when it is printed to PDF or exported to Excel.';
MultiLine = true;
Editable = false;
}
}
group("Dimension Filters")
{
Caption = 'Dimensions';
Visible = ((ViewLayout <> "Financial Report View Layout"::"Show None") or (not ViewOnlyMode));
field(Dim1Filter; TempFinancialReport.Dim1Filter)
{
ApplicationArea = Dimensions;
CaptionClass = FormGetCaptionClass(1);
Caption = 'Dimension 1 Filter';
Enabled = Dim1FilterEnable;
Importance = Promoted;
ToolTip = 'Specifies a filter for the Dimension 1 for which entries will be shown in the matrix window.';
Visible = Dim1FilterEnable;
trigger OnLookup(var Text: Text): Boolean
var
DimValue: Record "Dimension Value";
Result: Boolean;
begin
Result := DimValue.LookUpDimFilter(AnalysisView."Dimension 1 Code", Text);
SetDimFilters(1, CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim1Filter)));
TempFinancialReport.Dim1Filter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim1Filter));
exit(Result);
end;
trigger OnValidate()
begin
SetDimFilters(1, TempFinancialReport.Dim1Filter);
end;
}
field(Dim2Filter; TempFinancialReport.Dim2Filter)
{
ApplicationArea = Dimensions;
CaptionClass = FormGetCaptionClass(2);
Caption = 'Dimension 2 Filter';
Enabled = Dim2FilterEnable;
Importance = Promoted;
ToolTip = 'Specifies a filter for the Dimension 2 for which entries will be shown in the matrix window.';
Visible = Dim2FilterEnable;
trigger OnLookup(var Text: Text): Boolean
var
DimValue: Record "Dimension Value";
Result: Boolean;
begin
Result := DimValue.LookUpDimFilter(AnalysisView."Dimension 2 Code", Text);
SetDimFilters(2, CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim2Filter)));
TempFinancialReport.Dim2Filter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim2Filter));
exit(Result);
end;
trigger OnValidate()
begin
SetDimFilters(2, TempFinancialReport.Dim2Filter);
end;
}
field(Dim3Filter; TempFinancialReport.Dim3Filter)
{
ApplicationArea = Dimensions;
CaptionClass = FormGetCaptionClass(3);
Caption = 'Dimension 3 Filter';
Enabled = Dim3FilterEnable;
Importance = Promoted;
ToolTip = 'Specifies a filter for the Dimension 3 for which entries will be shown in the matrix window.';
Visible = Dim3FilterEnable;
trigger OnLookup(var Text: Text): Boolean
var
DimValue: Record "Dimension Value";
Result: Boolean;
begin
Result := DimValue.LookUpDimFilter(AnalysisView."Dimension 3 Code", Text);
SetDimFilters(3, CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim1Filter)));
TempFinancialReport.Dim3Filter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim3Filter));
exit(Result);
end;
trigger OnValidate()
begin
SetDimFilters(3, TempFinancialReport.Dim3Filter);
end;
}
field(Dim4Filter; TempFinancialReport.Dim4Filter)
{
ApplicationArea = Dimensions;
CaptionClass = FormGetCaptionClass(4);
Caption = 'Dimension 4 Filter';
Enabled = Dim4FilterEnable;
Importance = Promoted;
ToolTip = 'Specifies a filter for the Dimension 4 for which entries will be shown in the matrix window.';
Visible = Dim4FilterEnable;
trigger OnLookup(var Text: Text): Boolean
var
DimValue: Record "Dimension Value";
Result: Boolean;
begin
Result := DimValue.LookUpDimFilter(AnalysisView."Dimension 4 Code", Text);
SetDimFilters(4, CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim1Filter)));
TempFinancialReport.Dim4Filter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.Dim4Filter));
exit(Result);
end;
trigger OnValidate()
begin
SetDimFilters(4, TempFinancialReport.Dim4Filter);
end;
}
field(CostCenterFilter; TempFinancialReport.CostCenterFilter)
{
ApplicationArea = CostAccounting;
Caption = 'Cost Center Filter';
Importance = Additional;
ToolTip = 'Specifies a cost center for which you want to view account amounts.';
trigger OnLookup(var Text: Text): Boolean
var
CostCenter: Record "Cost Center";
Result: Boolean;
begin
Result := CostCenter.LookupCostCenterFilter(Text);
TempFinancialReport.CostCenterFilter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.CostCenterFilter));
ValidateCostCenterFilter();
exit(Result);
end;
trigger OnValidate()
begin
ValidateCostCenterFilter();
end;
}
field(CostObjectFilter; TempFinancialReport.CostObjectFilter)
{
ApplicationArea = CostAccounting;
Caption = 'Cost Object Filter';
Importance = Additional;
ToolTip = 'Specifies a cost object for which you want to view account amounts.';
trigger OnLookup(var Text: Text): Boolean
var
CostObject: Record "Cost Object";
Result: Boolean;
begin
Result := CostObject.LookupCostObjectFilter(Text);
TempFinancialReport.CostObjectFilter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.CostObjectFilter));
ValidateCostObjectFilter();
exit(Result);
end;
trigger OnValidate()
begin
ValidateCostObjectFilter();
end;
}
field(CashFlowFilter; TempFinancialReport.CashFlowFilter)
{
ApplicationArea = Dimensions;
Caption = 'Cash Flow Filter';
Importance = Additional;
ToolTip = 'Specifies a dimension filter for the cash flow, for which you want to view account amounts.';
trigger OnLookup(var Text: Text): Boolean
var
CashFlowForecast: Record "Cash Flow Forecast";
Result: Boolean;
begin
Result := CashFlowForecast.LookupCashFlowFilter(Text);
TempFinancialReport.CashFlowFilter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.CashFlowFilter));
ValidateCashFlowFilter();
exit(Result);
end;
trigger OnValidate()
begin
ValidateCashFlowFilter();
end;
}
field("G/LBudgetFilter"; TempFinancialReport.GLBudgetFilter)
{
ApplicationArea = Suite;
Caption = 'G/L Budget Filter';
Importance = Promoted;
ToolTip = 'Specifies a code for a general ledger budget that the account schedule line will be filtered on.';
trigger OnLookup(var Text: Text): Boolean
var
Result: Boolean;
begin
Result := Rec.LookupGLBudgetFilter(Text);
TempFinancialReport.GLBudgetFilter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.GLBudgetFilter));
ValidateGLBudgetFilter();
exit(Result);
end;
trigger OnValidate()
begin
ValidateGLBudgetFilter();
end;
}
field(CostBudgetFilter; TempFinancialReport.CostBudgetFilter)
{
ApplicationArea = CostAccounting;
Caption = 'Cost Budget Filter';
Importance = Additional;
ToolTip = 'Specifies a code for a cost budget that the account schedule line will be filtered on.';
trigger OnLookup(var Text: Text): Boolean
var
Result: Boolean;
begin
Result := Rec.LookupCostBudgetFilter(Text);
TempFinancialReport.CostBudgetFilter := CopyStr(Text, 1, MaxStrLen(TempFinancialReport.CostBudgetFilter));
ValidateCostBudgetFilter();
exit(Result);
end;
trigger OnValidate()
begin
ValidateCostBudgetFilter();
end;
}
}
repeater(Control48)
{
Editable = false;
IndentationColumn = Rec.Indentation;
IndentationControls = Description;
ShowCaption = false;
field("Row No."; Rec."Row No.")
{
ApplicationArea = Basic, Suite;
Visible = false;
}
field(Description; Rec.Description)
{
ApplicationArea = Basic, Suite;
Style = Strong;
StyleExpr = Rec.Bold;
ToolTip = 'Specifies text that will appear on the account schedule line.';
}
field(ColumnValues1; ColumnValues[1])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(1);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[1];
StyleExpr = ColumnStyle1;
trigger OnDrillDown()
begin
DrillDown(1);
end;
}
field(ColumnValues2; ColumnValues[2])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(2);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[2];
StyleExpr = ColumnStyle2;
Visible = NoOfColumns >= 2;
trigger OnDrillDown()
begin
DrillDown(2);
end;
}
field(ColumnValues3; ColumnValues[3])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(3);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[3];
StyleExpr = ColumnStyle3;
Visible = NoOfColumns >= 3;
trigger OnDrillDown()
begin
DrillDown(3);
end;
}
field(ColumnValues4; ColumnValues[4])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(4);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[4];
StyleExpr = ColumnStyle4;
Visible = NoOfColumns >= 4;
trigger OnDrillDown()
begin
DrillDown(4);
end;
}
field(ColumnValues5; ColumnValues[5])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(5);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[5];
StyleExpr = ColumnStyle5;
Visible = NoOfColumns >= 5;
trigger OnDrillDown()
begin
DrillDown(5);
end;
}
field(ColumnValues6; ColumnValues[6])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(6);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[6];
StyleExpr = ColumnStyle6;
Visible = NoOfColumns >= 6;
trigger OnDrillDown()
begin
DrillDown(6);
end;
}
field(ColumnValues7; ColumnValues[7])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(7);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[7];
StyleExpr = ColumnStyle7;
Visible = NoOfColumns >= 7;
trigger OnDrillDown()
begin
DrillDown(7);
end;
}
field(ColumnValues8; ColumnValues[8])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(8);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[8];
StyleExpr = ColumnStyle8;
Visible = NoOfColumns >= 8;
trigger OnDrillDown()
begin
DrillDown(8);
end;
}
field(ColumnValues9; ColumnValues[9])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(9);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[9];
StyleExpr = ColumnStyle9;
Visible = NoOfColumns >= 9;
trigger OnDrillDown()
begin
DrillDown(9);
end;
}
field(ColumnValues10; ColumnValues[10])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(10);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[10];
StyleExpr = ColumnStyle10;
Visible = NoOfColumns >= 10;
trigger OnDrillDown()
begin
DrillDown(10);
end;
}
field(ColumnValues11; ColumnValues[11])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(11);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[11];
StyleExpr = ColumnStyle11;
Visible = NoOfColumns >= 11;
trigger OnDrillDown()
begin
DrillDown(11);
end;
}
field(ColumnValues12; ColumnValues[12])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(12);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[12];
StyleExpr = ColumnStyle12;
Visible = NoOfColumns >= 12;
trigger OnDrillDown()
begin
DrillDown(12);
end;
}
field(ColumnValues13; ColumnValues[13])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(13);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[13];
StyleExpr = ColumnStyle13;
Visible = NoOfColumns >= 13;
ToolTip = 'Column title';
trigger OnDrillDown()
begin
DrillDown(13);
end;
}
field(ColumnValues14; ColumnValues[14])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(14);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[14];
StyleExpr = ColumnStyle14;
Visible = NoOfColumns >= 14;
ToolTip = 'Column title';
trigger OnDrillDown()
begin
DrillDown(14);
end;
}
field(ColumnValues15; ColumnValues[15])
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = FormatStr(15);
AutoFormatType = 11;
BlankZero = true;
CaptionClass = '3,' + ColumnCaptions[15];
StyleExpr = ColumnStyle15;
Visible = NoOfColumns >= 15;
ToolTip = 'Column title';
trigger OnDrillDown()
begin
DrillDown(15);
end;
}
}
group(ClosingParagraphGroup)
{
Caption = 'Closing paragraph';
Visible = ViewOnlyMode and (ClosingParagraph <> '');
field(ClosingParagraph; ClosingParagraph)
{
ApplicationArea = Basic, Suite;
ShowCaption = false;
ToolTip = 'Specifies the closing paragraph displayed on the Financial Report, when it is printed to PDF or exported to Excel.';
MultiLine = true;
Editable = false;
}
}
}
}
actions
{
area(processing)
{
group("F&unctions")
{
Caption = 'F&unctions';
Image = "Action";
}
action(Print)
{
ApplicationArea = Basic, Suite;
Caption = 'Print';
Ellipsis = true;
Image = Print;
ToolTip = 'Get a PDF or print the financial report. A print request window opens where you can specify what to include in the PDF/print-out.';
trigger OnAction()
var
AccSched: Report "Account Schedule";
DateFilter2: Text;
GLBudgetFilter2: Text;
BusUnitFilter: Text;
CostBudgetFilter2: Text;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforePrint(Rec, TempFinancialReport."Financial Report Column Group", IsHandled, TempFinancialReport);
if IsHandled then
exit;
if TempFinancialReport.Name <> '' then
AccSched.SetFinancialReportName(TempFinancialReport.Name);
if TempFinancialReport."Financial Report Row Group" <> '' then
AccSched.SetAccSchedName(TempFinancialReport."Financial Report Row Group");
if TempFinancialReport."Financial Report Column Group" <> '' then
AccSched.SetColumnLayoutName(TempFinancialReport."Financial Report Column Group");
if TempFinancialReport.DimPerspective <> '' then
AccSched.SetDimPerspectiveName(TempFinancialReport.DimPerspective);
DateFilter2 := Rec.GetFilter("Date Filter");
GLBudgetFilter2 := Rec.GetFilter("G/L Budget Filter");
CostBudgetFilter2 := Rec.GetFilter("Cost Budget Filter");
BusUnitFilter := Rec.GetFilter("Business Unit Filter");
AccSched.SetFilters(
DateFilter2, GLBudgetFilter2, CostBudgetFilter2, BusUnitFilter,
TempFinancialReport.Dim1Filter, TempFinancialReport.Dim2Filter, TempFinancialReport.Dim3Filter, TempFinancialReport.Dim4Filter, TempFinancialReport.CashFlowFilter,
TempFinancialReport.GetEffectiveNegativeAmountFormat());
AccSched.Run();
end;
}
action(PreviousColumn)
{
ApplicationArea = Basic, Suite;
Caption = 'Previous Column';
Image = PreviousRecord;
ToolTip = 'Go to the previous column.';
trigger OnAction()
begin
AdjustColumnOffset(-1);
end;
}
action(NextPeriod)
{
ApplicationArea = Basic, Suite;
Caption = 'Next Period';
Image = NextRecord;
ToolTip = 'Show the information based on the next period. If you set the View by field to Day, the date filter changes to the day before.';
trigger OnAction()
begin
AccSchedManagement.FindPeriod(Rec, '>=', TempFinancialReport.GetEffectivePeriodType());
DateFilter := Rec.GetFilter("Date Filter");
UpdateColumnCaptions();
CurrPage.Update();
end;
}
action(PreviousPeriod)
{
ApplicationArea = Basic, Suite;
Caption = 'Previous Period';
Image = PreviousRecord;
ToolTip = 'Show the information based on the previous period. If you set the View by field to Day, the date filter changes to the day before.';
trigger OnAction()
begin
AccSchedManagement.FindPeriod(Rec, '<=', TempFinancialReport.GetEffectivePeriodType());
DateFilter := Rec.GetFilter("Date Filter");
UpdateColumnCaptions();
CurrPage.Update();
end;
}
action(NextColumn)
{
ApplicationArea = Basic, Suite;
Caption = 'Next Column';
Image = NextRecord;
ToolTip = 'Go to the next column.';
trigger OnAction()
begin
AdjustColumnOffset(1);
end;
}
action(Recalculate)
{
ApplicationArea = Basic, Suite;
Caption = 'Recalculate';
Image = Refresh;
ToolTip = 'Update the financial report data based on recent changes.';
trigger OnAction()
begin
AccSchedManagement.ForceRecalculate(true);
PreserveCurrentPageFilters := true;
ReloadPage();
end;
}
action(RestoreFinRepFilters)
{
ApplicationArea = Basic, Suite;
Caption = 'Revert to defaults';
Image = Restore;
ToolTip = 'Restore the user defined filters to the default filters stored on the financial report';
Visible = ViewOnlyMode;
trigger OnAction()
begin
RestoreFinancialReportUserFilters();
end;
}
action(EditDefinition)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit report definition';
Image = Edit;
ToolTip = 'Edit the report definition for all users';
Enabled = ViewOnlyMode;
trigger OnAction()
var
AccScheduleOverview: Page "Acc. Schedule Overview";
begin
CurrPage.Close();
AccScheduleOverview.SetViewOnlyMode(false);
AccScheduleOverview.SetFinancialReportName(TempFinancialReport.Name);
AccScheduleOverview.Run();
end;
}
action(EditRowDefinition)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit row definition';
Image = Edit;
ToolTip = 'Edit the row definition of this financial report.';
trigger OnAction()
var
AccSchedule: Page "Account Schedule";
begin
AccSchedule.SetAccSchedName(TempFinancialReport."Financial Report Row Group");
AccSchedule.Run();
end;
}
action(EditColumnDefinition)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit column definition';
Image = Edit;
ToolTip = 'Create or edit the column definition of this financial report.';
trigger OnAction()
var
ColumnLayout: Page "Column Layout";
begin
ColumnLayout.SetColumnLayoutName(TempFinancialReport."Financial Report Column Group");
ColumnLayout.Run();
end;
}
action(EditDimPerspective)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit dimension perspective';
Image = Edit;
ToolTip = 'Edit the dimension perspective of this financial report.';
trigger OnAction()
var
DimPerspectiveLine: Record "Dimension Perspective Line";
begin
TempFinancialReport.TestField(DimPerspective);
DimPerspectiveLine.SetRange(Name, TempFinancialReport.DimPerspective);
Page.Run(0, DimPerspectiveLine);
end;
}
action(EditIntroductoryClosingParagraph)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit introductory/closing paragraphs';
Image = Edit;
ToolTip = 'Edit the introductory and closing paragraphs of this financial report.';
trigger OnAction()
var
EditFinancialReportText: Page "Edit Financial Report Text";
begin
EditFinancialReportText.SetText(IntroductoryParagraph, ClosingParagraph);
if EditFinancialReportText.RunModal() = Action::Ok then begin
EditFinancialReportText.GetText(IntroductoryParagraph, ClosingParagraph);
SaveStateToFinancialReport();
end;
end;
}
action(EditCategory)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit Category';
Image = Edit;
ToolTip = 'Edit the category of the current financial report.';
trigger OnAction()
var
FinancialReportCategory: Record "Financial Report Category";
begin
if FinancialReportCategory.Get(TempFinancialReport.CategoryCode) then
Page.Run(Page::"Financial Report Category", FinancialReportCategory);
end;
}
group(DisplayOptions)
{
Caption = 'Show';
Enabled = ViewOnlyMode;
AboutTitle = 'Toggle between different display options in view mode';
AboutText = 'From this menu, select one of three view options. The first option None will hide everything besides the sheet. The second option Show Filters will show the dimension filters and the sheet. The third option All will show the Options for Row, Column and Periods and the dimension filters';
action(DisplayNone)
{
Caption = 'Hide options';
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies that the page should be viewed with no filter options displayed';
Enabled = ViewLayout <> "Financial Report View Layout"::"Show None";
Image = ClearFilter;
trigger OnAction()
begin
ViewLayout := "Financial Report View Layout"::"Show None";
CurrPage.Update(false);
end;
}
action(DisplayFiltersOnly)
{
Caption = 'Show filters';
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies that the page should be viewed with dimension filter options displayed';
Enabled = ViewLayout <> "Financial Report View Layout"::"Show Filters Only";
Image = Filter;
trigger OnAction()
begin
ViewLayout := "Financial Report View Layout"::"Show Filters Only";
CurrPage.Update(false);
end;
}
action(DisplayAll)
{
Caption = 'Show all options';
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies that the page should be viewed with options and dimension filters';
Enabled = ViewLayout <> "Financial Report View Layout"::"Show All";
Image = FilterLines;
trigger OnAction()
begin
ViewLayout := "Financial Report View Layout"::"Show All";
CurrPage.Update(false);
end;
}
}
action(Schedules)
{
ApplicationArea = Basic, Suite;
Caption = 'Schedules';
ToolTip = 'View or edit schedules for this financial report. This allows you to schedule the financial report to be exported or emailed on a regular basis. You can also customize the filters and recipients for each schedule.';
Image = CheckList;
trigger OnAction()
var
FinancialReportSchedule: Record "Financial Report Schedule";
begin
FinancialReportSchedule.SetRange("Financial Report Name", TempFinancialReport.Name);
Page.Run(0, FinancialReportSchedule);
end;
}
group(Excel)
{
Caption = 'Excel';
group("Export to Excel")
{
Caption = 'Export to Excel';
Image = ExportToExcel;
action(ExportToExcel)
{
ApplicationArea = Basic, Suite;
Caption = 'Open in Excel (using layout)';
ToolTip = 'Open the financial report in a new Excel workbook. This will use the default Excel layout specified on the financial report.';
Image = ExportToExcel;
trigger OnAction()
var
FinReportExcelTemplate: Record "Fin. Report Excel Template";
ExportAccSchedToExcel: Report "Export Acc. Sched. to Excel";
begin
ExportAccSchedToExcel.SetOptions(
Rec, TempFinancialReport."Financial Report Column Group", TempFinancialReport.UseAmountsInAddCurrency,
TempFinancialReport.Name, TempFinancialReport.DimPerspective);
if TempFinancialReport."Excel Template Code" <> '' then begin
FinReportExcelTemplate.Get(TempFinancialReport.Name, TempFinancialReport."Excel Template Code");
ExportAccSchedToExcel.SetUseExistingTemplate(FinReportExcelTemplate);
end;
ExportAccSchedToExcel.Run();
end;
}
action(ExcelTemplates)
{
ApplicationArea = Basic, Suite;
Caption = 'Excel Layouts';
ToolTip = 'View or edit Excel layout for this financial report.';
Image = Report;
trigger OnAction()
var
FinReportExcelTemplates: Page "Fin. Report Excel Templates";
begin
FinReportExcelTemplates.SetSource(TempFinancialReport, Rec);
FinReportExcelTemplates.Run();
end;
}
}
}
action("Audit Logs")
{
ApplicationArea = Basic, Suite;
Caption = 'Audit Logs';
Image = Log;
ToolTip = 'Opens the Financial Report Audit Logs for the selected report.';
trigger OnAction()
var
FinReportAuditLog: Record "Financial Report Audit Log";
begin
FinReportAuditLog.SetRange("Report Name", TempFinancialReport.Name);
Page.Run(0, FinReportAuditLog);
end;
}
}
area(Promoted)
{
group(Category_Process)
{
Caption = 'Process', Comment = 'Generated from the PromotedActionCategories property index 1.';
actionref(Recalculate_Promoted; Recalculate) { }
actionref(RestoreFinRepFilters_Promoted; RestoreFinRepFilters) { }
}
group(DisplayPromoted)
{
Caption = 'Show';
ShowAs = SplitButton;
actionref(ShowNone_Promoted; DisplayNone) { }
actionref(ShowFiltersOnly_Promoted; DisplayFiltersOnly) { }
actionref(ShowAll_Promoted; DisplayAll) { }
}
group(Category_Category4)
{
Caption = 'Column', Comment = 'Generated from the PromotedActionCategories property index 3.';
actionref(PreviousColumn_Promoted; PreviousColumn) { }
actionref(NextColumn_Promoted; NextColumn) { }
}
group(Category_Category5)
{
Caption = 'Period', Comment = 'Generated from the PromotedActionCategories property index 4.';
actionref(PreviousPeriod_Promoted; PreviousPeriod) { }
actionref(NextPeriod_Promoted; NextPeriod) { }
}
group("Category_Export to Excel")
{
Caption = 'Export to Excel/Print';
actionref(ExportToExcel_Promoted; ExportToExcel)
{
}
actionref(Print_Promoted; Print)
{
}
}
group(Category_Definitions)
{
Caption = 'Definitions';
actionref(EditDefinition_Promoted; EditDefinition) { }
actionref(EditRowDefinition_Promoted; EditRowDefinition) { }
actionref(EditColumnDefinition_Promoted; EditColumnDefinition) { }
actionref(EditDimPerspective_Promoted; EditDimPerspective) { }
actionref(EditCategory_Promoted; EditCategory) { }
actionref(EditIntroductoryClosingParagraph_Promoted; EditIntroductoryClosingParagraph) { }
actionref(ExcelTemplates_Promoted; ExcelTemplates) { }
actionref(Schedules_Promoted; Schedules) { }
}
group(Category_Report)
{
Caption = 'Report', Comment = 'Generated from the PromotedActionCategories property index 2.';
}
actionref("Audit Logs_Promoted"; "Audit Logs") { }
}
}
trigger OnClosePage()
begin
// In View mode without a Financial report, the page closes without saving anything
if ViewOnlyMode and (TempFinancialReport.Name = '') then
exit;
// In Edit mode changes are saved to the corresponding FinancialReport and the filters for this user are removed
if not ViewOnlyMode then begin
if not StateHasUserChanges() then
exit;
SaveStateToFinancialReport();
RemoveUserFilters();
exit;
end;
// In View mode with a Financial Report, if the user made changes, we save the changes made by the user to user filters
if StateHasUserChanges() then
SaveStateToUserFilters();
end;
trigger OnFindRecord(Which: Text): Boolean
begin
exit(MarkAndFilterRowsOnFind(Which));
end;
trigger OnAfterGetRecord()
begin
LoadColumns();
end;
trigger OnInit()
begin
Dim4FilterEnable := true;
Dim3FilterEnable := true;
Dim2FilterEnable := true;
Dim1FilterEnable := true;
end;
trigger OnOpenPage()
var
FinancialReportAuditing: Codeunit "Financial Report Auditing";
begin
Clear(Rec);
Clear(TempFinancialReport);
ViewLayout := ViewLayout::"Show All";
ReloadPage();
LogUsageTelemetry();
FinancialReportAuditing.LogReportUsage(TempFinancialReport.Name, Enum::"Financial Report Format"::View);
#if not CLEAN28
FinancialReportDefaultsEnabled := FeatureFinancialReportDef.IsDefaultsFeatureEnabled();
#endif
end;
var
// Filters set in this page
// Helper records keeping computed state of the page
AccSchedName: Record "Acc. Schedule Name";
GLSetup: Record "General Ledger Setup";
// Helper codeunits
MatrixMgt: Codeunit "Matrix Management";
DimensionManagement: Codeunit DimensionManagement;
FinReportMgt: Codeunit "Financial Report Mgt.";
#if not CLEAN28
#pragma warning disable AL0432
FeatureFinancialReportDef: Codeunit "Feature - Fin. Report Default";
#pragma warning restore AL0432
#endif
// Filter set in this page
DateFilter: Text;
// Helper page state variables
ViewLayout: Enum "Financial Report View Layout";
ViewOnlyModeSet: Boolean;
ColumnLayoutArr: array[15] of Record "Column Layout";
ColumnValues: array[15] of Decimal;
ColumnCaptions: array[15] of Text;
UseAmtsInAddCurrVisible: Boolean;
NoOfColumns: Integer;
ColumnOffset: Integer;
// Constants
Text000Tok: Label 'DEFAULT', MaxLength = 10;
#pragma warning disable AA0470
Text005Tok: Label '1,6,,Dimension %1 Filter';
#pragma warning restore AA0470
#pragma warning disable AA0074
EditModeMessage: Label 'All changes made to this page are persistent and visible to all users immediately';
#pragma warning restore AA0074
PageRunEventTxt: Label 'Financial Report run on-screen: %1', Comment = '%1 = financial report name', Locked = true;
// Other page state
Dim1FilterEnable: Boolean;
Dim2FilterEnable: Boolean;
Dim3FilterEnable: Boolean;
Dim4FilterEnable: Boolean;
ColumnStyle1: Text;
ColumnStyle2: Text;
ColumnStyle3: Text;
ColumnStyle4: Text;
ColumnStyle5: Text;
ColumnStyle6: Text;
ColumnStyle7: Text;
ColumnStyle8: Text;
ColumnStyle9: Text;
ColumnStyle10: Text;
ColumnStyle11: Text;
ColumnStyle12: Text;
ColumnStyle13: Text;
ColumnStyle14: Text;
ColumnStyle15: Text;
IntroductoryParagraph, ClosingParagraph : Text;
#if not CLEAN28
FinancialReportDefaultsEnabled: Boolean;
#endif
RowDefinitionBlocked: Boolean;
ColDefinitionBlocked: Boolean;
PreserveCurrentPageFilters: Boolean;
protected var
AnalysisView: Record "Analysis View";
TempColumnLayout: Record "Column Layout" temporary;
TempFinancialReport: Record "Financial Report" temporary;
AccSchedManagement: Codeunit AccSchedManagement;
// These variables are unused but kept in sync for retrocompatibility purposes
FinancialReportCode: Code[10];
CurrentColumnName: Code[10];
UseAmtsInAddCurr: Boolean;
// Page setup variables: Set by the user through public procedures to alter the OnOpen of this page
NewCurrentSchedName: Code[10];
NewCurrentColumnName: Code[10];
ModifiedPeriodType: Enum "Analysis Period Type";
ViewOnlyMode: Boolean;
/// <summary>
/// Sets the financial report code for the overview page initialization.
/// Configures the primary financial report context for display and analysis.
/// </summary>
/// <param name="NewFinancialReport">Financial report code to set as default</param>
procedure SetFinancialReportName(NewFinancialReport: Code[10])
begin
FinancialReportCode := NewFinancialReport;
end;
/// <summary>
/// Sets the column definition for the overview page layout.
/// Configures the column layout name for matrix display initialization.
/// </summary>
/// <param name="ColumnLayoutName">Column layout name to set as default</param>
procedure SetColumnDefinition(ColumnLayoutName: Code[10])
begin
NewCurrentColumnName := ColumnLayoutName;
end;
/// <summary>
/// Sets the account schedule name for the overview page context.
/// Configures the row definition for financial report display initialization.
/// </summary>
/// <param name="NewAccSchedName">Account schedule name to set as default</param>
procedure SetAccSchedName(NewAccSchedName: Code[10])
begin
NewCurrentSchedName := NewAccSchedName;
end;
/// <summary>
/// Sets the period type for the overview page analysis.
/// Configures the temporal analysis scope for financial data presentation.
/// </summary>
/// <param name="NewPeriodType">Period type option to set for analysis</param>
procedure SetPeriodType(NewPeriodType: Option)
begin
ModifiedPeriodType := "Analysis Period Type".FromInteger(NewPeriodType);
end;
/// <summary>
/// Sets the view-only mode for the overview page interface.
/// Controls whether the page allows editing or provides read-only access to financial data.
/// </summary>
/// <param name="NewViewOnlyMode">True for read-only mode, false for editing capabilities</param>
procedure SetViewOnlyMode(NewViewOnlyMode: Boolean)
begin
ViewOnlyMode := NewViewOnlyMode;
ViewOnlyModeSet := true;
end;
local procedure MarkAndFilterRowsOnFind(Which: Text): Boolean
var
AccScheduleLine: Record "Acc. Schedule Line";
SelectedRecordMarked: Boolean;
ColumnNo: Integer;
begin
Rec.MarkedOnly(false);
AccScheduleLine := Rec;
if not TempFinancialReport.ShowLinesWithShowNo then begin
if Rec.FindSet() then
repeat
if Rec.Show = Rec.Show::Yes then
Rec.Mark(true)
else begin
Rec.Mark(false);
LoadColumns();
ColumnNo := 1;
while ColumnNo <= ArrayLen(ColumnValues) do begin
ColumnValues[ColumnNo] *= Rec."Show Opposite Sign" ? -1 : 1;
case Rec.Show of
Rec.Show::"If Any Column Not Zero":
if ColumnValues[ColumnNo] <> 0 then
Rec.Mark(true);
Rec.Show::"When Positive Balance":
if ColumnValues[ColumnNo] > 0 then
Rec.Mark(true);
Rec.Show::"When Negative Balance":
if ColumnValues[ColumnNo] < 0 then
Rec.Mark(true);
end;
if Rec.Mark() then
ColumnNo := ArrayLen(ColumnValues);
ColumnNo += 1;
end;
end;
if Rec.Mark() and (AccScheduleLine.SystemId = Rec.SystemId) then
SelectedRecordMarked := true;
until Rec.Next() = 0
else
exit(false);
Rec.MarkedOnly(true);
if SelectedRecordMarked then
Rec := AccScheduleLine;
end;
exit(Rec.Find(Which));
end;
local procedure ReloadPage()
var
EditModeNotification: Notification;
begin
EditModeNotification.Message := EditModeMessage;
EditModeNotification.Scope := NotificationScope::LocalScope;
if not ViewOnlyModeSet then
ViewOnlyMode := true;
if not ViewOnlyMode then
EditModeNotification.Send();
LoadPageState();
end;
protected procedure LoadPageState()
var
ColumnLayoutName: Record "Column Layout Name";
IsHandled: Boolean;
begin
GLSetup.Get();
UseAmtsInAddCurrVisible := GLSetup."Additional Reporting Currency" <> '';
if FinancialReportCode = '' then
FinancialReportCode := TempFinancialReport.Name;
// `FinancialReportTemp` contains the state of the filters the user interacts with
// `LoadFinancialReportFiltersOrDefault` loads this temporary record considering user overriden filters (if any).
if PreserveCurrentPageFilters then
PreserveCurrentPageFilters := false
else
LoadFinancialReportFiltersOrDefault(TempFinancialReport);
// Afterwards, we update all page state variables
SetFinancialReportTxt();
IsHandled := false;
Rec.SetLoadFields("Row No.", "Description", "Totaling", "Totaling Type", "Dimension 1 Totaling", "Dimension 2 Totaling", "Dimension 3 Totaling", "Dimension 4 Totaling", Bold, "Show Opposite Sign", "Row Type", "Amount Type");
OnLoadPageStateOnBeforeCopyColumnsToTemp(CurrentColumnName, TempColumnLayout, TempFinancialReport."Financial Report Row Group", Rec, IsHandled);
if not IsHandled then begin
AccSchedManagement.CopyColumnsToTemp(TempFinancialReport."Financial Report Column Group", TempColumnLayout);
AccSchedManagement.OpenSchedule(TempFinancialReport."Financial Report Row Group", Rec);
end;
AccSchedManagement.OpenColumns(TempFinancialReport."Financial Report Column Group", TempColumnLayout);
AccSchedManagement.CheckAnalysisView(TempFinancialReport."Financial Report Row Group", TempFinancialReport."Financial Report Column Group", true);
SetLoadedDimFilters();
SetLoadedOtherFilters();
AccSchedName.SetAutoCalcFields("Status Blocked");
if AccSchedName.Get(TempFinancialReport."Financial Report Row Group") then begin
if AccSchedName."Analysis View Name" <> '' then
AnalysisView.Get(AccSchedName."Analysis View Name")
else begin
Clear(AnalysisView);
AnalysisView."Dimension 1 Code" := GLSetup."Global Dimension 1 Code";
AnalysisView."Dimension 2 Code" := GLSetup."Global Dimension 2 Code";
end;
RowDefinitionBlocked := AccSchedName."Status Blocked";
end;
ColumnLayoutName.SetAutoCalcFields("Status Blocked");
if ColumnLayoutName.Get(TempFinancialReport."Financial Report Column Group") then
ColDefinitionBlocked := ColumnLayoutName."Status Blocked";
FinReportMgt.CalcAccScheduleLineDateFilter(TempFinancialReport, Rec);
ApplyShowFilter();
UpdateDimFilterControls();
DateFilter := Rec.GetFilter("Date Filter");
UpdateColumnCaptions();
FinReportMgt.CheckStatus(TempFinancialReport.TableCaption(), TempFinancialReport.Status);
OnBeforeCurrentColumnNameOnAfterValidate(TempFinancialReport."Financial Report Column Group");
OnAfterOnOpenPage(Rec, TempFinancialReport."Financial Report Column Group");
end;
local procedure LoadColumns()
var
ColumnNo: Integer;
begin
Clear(ColumnValues);
if (Rec.Totaling = '') or (not TempColumnLayout.FindSet()) or (Rec."Schedule Name" <> TempFinancialReport."Financial Report Row Group") then
exit;
repeat
ColumnNo := ColumnNo + 1;
if (ColumnNo > ColumnOffset) and (ColumnNo - ColumnOffset <= ArrayLen(ColumnValues)) then begin
ColumnValues[ColumnNo - ColumnOffset] :=
RoundIfNotNone(
MatrixMgt.RoundAmount(
AccSchedManagement.CalcCell(Rec, TempColumnLayout, TempFinancialReport.UseAmountsInAddCurrency),
TempColumnLayout."Rounding Factor"),
TempColumnLayout."Rounding Factor");
OnOnAfterGetRecordOnAfterAssignColumnValue(ColumnValues, ColumnNo, ColumnOffset, TempColumnLayout, TempFinancialReport.UseAmountsInAddCurrency);
ColumnLayoutArr[ColumnNo - ColumnOffset] := TempColumnLayout;
GetStyle(ColumnNo - ColumnOffset, Rec."Line No.", TempColumnLayout."Line No.");
end;
until TempColumnLayout.Next() = 0;
AccSchedManagement.ForceRecalculate(false);
end;
local procedure ValidateStartEndDateFilterFormula()
begin
if (Format(TempFinancialReport.StartDateFilterFormula) = '') and
(Format(TempFinancialReport.EndDateFilterFormula) = '')
then
exit;
Clear(TempFinancialReport.DateFilterPeriodFormula);
Clear(TempFinancialReport.DateFilterPeriodFormulaLID);
CalcDateFilterAndUpdate();
end;
local procedure ValidateDateFilterPeriodFormula()
var
PeriodFormulaParser: Codeunit "Period Formula Parser";
begin
if TempFinancialReport.DateFilterPeriodFormula = '' then
exit;
PeriodFormulaParser.ValidatePeriodFormula(
TempFinancialReport.DateFilterPeriodFormula, TempFinancialReport.DateFilterPeriodFormulaLID);
Clear(TempFinancialReport.StartDateFilterFormula);
Clear(TempFinancialReport.EndDateFilterFormula);
CalcDateFilterAndUpdate();
end;
local procedure CalcDateFilterAndUpdate()
begin
FinReportMgt.CalcAccScheduleLineDateFilter(TempFinancialReport, Rec);
DateFilter := Rec.GetFilter("Date Filter");
UpdateColumnCaptions();
CurrPage.Update();
end;
local procedure LoadFinancialReportFilters(FinancialReportCode: Code[10]; var FinancialReportToLoadTemp: Record "Financial Report" temporary): Boolean
var
FinancialReport: Record "Financial Report";
FinancialReportUserFilters: Record "Financial Report User Filters";
Field: Record "Field";
RecordRefFinancialReport: RecordRef;
RecordRefUserFilters: RecordRef;
FieldRefFinancialReport: FieldRef;
FieldRefUserFilters: FieldRef;
UserIDCode: Code[50];
begin
if not FinancialReport.Get(FinancialReportCode) then
exit(false);
// Transfer filters from FinancialReport
FinancialReportToLoadTemp.Init();
FinancialReportToLoadTemp.TransferFields(FinancialReport);
FinancialReportToLoadTemp.CalcFields("Last Run by User");
IntroductoryParagraph := FinancialReport.GetIntroductoryParagraph();
ClosingParagraph := FinancialReport.GetClosingParagraph();
if not ViewOnlyMode then
exit(true);
UserIDCode := CopyStr(UserId(), 1, MaxStrLen(UserIDCode));
if not FinancialReportUserFilters.Get(UserIDCode, FinancialReport.Name) then
exit(true);
// Override custom user filters
Field.SetRange(TableNo, Database::"Financial Report User Filters");
Field.SetFilter("No.", '<>%1', FinancialReportUserFilters.FieldNo("User ID"));
Field.SetFilter("No.", '<>%1 & <>%2 & < %3', FinancialReportUserFilters.FieldNo("User ID"), FinancialReportUserFilters.FieldNo("Financial Report Name"), 2000000000);
Field.SetFilter(ObsoleteState, '<>%1', Field.ObsoleteState::Removed);
RecordRefUserFilters.GetTable(FinancialReportUserFilters);
if Field.FindSet() then
repeat
// We go through each of the user filter fields
FieldRefUserFilters := RecordRefUserFilters.Field(Field."No.");
if FieldRefNotBlank(FieldRefUserFilters) then begin
// If it is not empty we set the corresponding value in FinancialReportToLoadTemp
RecordRefFinancialReport.GetTable(FinancialReportToLoadTemp);
FieldRefFinancialReport := RecordRefFinancialReport.Field(Field."No.");
FieldRefFinancialReport.Value(FieldRefUserFilters.Value);
RecordRefFinancialReport.SetTable(FinancialReportToLoadTemp);
end
until Field.Next() = 0;
RecordRefFinancialReport.Close();
RecordRefUserFilters.Close();
exit(true);
end;
local procedure LoadFinancialReportFiltersOrDefault(var FinancialReportToLoadTemp: Record "Financial Report" temporary)
begin
LoadFinancialReportFiltersOrDefault(FinancialReportCode, FinancialReportToLoadTemp);
end;
local procedure LoadFinancialReportFiltersOrDefault(FinancialReportToLoadCode: Code[10]; var FinancialReportToLoadTemp: Record "Financial Report" temporary)
var
FinancialReportLoaded: Boolean;
begin
// Every filter the user interacts with in this page is kept in FinancialReportTemp
FinancialReportLoaded := LoadFinancialReportFilters(FinancialReportToLoadCode, FinancialReportToLoadTemp);
if not FinancialReportLoaded then begin
// If no financial report is set, view mode is forced
ViewOnlyMode := true;
FinancialReportToLoadTemp.Init();
// We get values from the other page setup variables
if NewCurrentSchedName = '' then
NewCurrentSchedName := CopyStr(Text000Tok, 1, 10);
if NewCurrentColumnName = '' then
NewCurrentColumnName := CopyStr(Text000Tok, 1, 10);
FinancialReportToLoadTemp."Financial Report Row Group" := NewCurrentSchedName;
FinancialReportToLoadTemp."Financial Report Column Group" := NewCurrentColumnName;
// (Every change to FinancialReportTemp."Financial Report Column Group" must be kept in sync with CurrentColumnName)
CurrentColumnName := NewCurrentColumnName;
#if not CLEAN28
if not FeatureFinancialReportDef.IsDefaultsFeatureEnabled() then
FinancialReportToLoadTemp.PeriodType := ModifiedPeriodType
else
#endif
FinancialReportToLoadTemp.PeriodTypeDefault := "Financial Report Period Type".FromInteger(ModifiedPeriodType.AsInteger());
FinancialReportToLoadTemp.UseAmountsInAddCurrency := false;
// (Every change to FinancialReportTemp.UseAmountsInAddCurrency must be kept in sync with UseAmtsInAddCurr)
UseAmtsInAddCurr := false;
end;
// Default values
if FinancialReportToLoadTemp."Financial Report Column Group" = '' then begin
FinancialReportToLoadTemp."Financial Report Column Group" := CopyStr(Text000Tok, 1, 10);
// (Every change to FinancialReportTemp."Financial Report Column Group" must be kept in sync with CurrentColumnName)
CurrentColumnName := CopyStr(Text000Tok, 1, 10);
end;
end;
local procedure RestoreFinancialReportUserFilters()
var
FinancialReportUserFilters: Record "Financial Report User Filters";
UserIDCode: Code[50];
begin
UserIDCode := CopyStr(UserId(), 1, MaxStrLen(UserIDCode));
if FinancialReportUserFilters.Get(UserIDCode, TempFinancialReport.Name) then
FinancialReportUserFilters.Delete();
LoadPageState();
end;
local procedure SetFinancialReportTxt()
var
CurrentPageCaption: Text;
begin
if TempFinancialReport.Description <> '' then
CurrentPageCaption := StrSubstNo('%1 (%2)', TempFinancialReport.Description, TempFinancialReport.Name)
else
CurrentPageCaption := TempFinancialReport.Name;
CurrPage.Caption(CurrentPageCaption);
end;
[TryFunction]
local procedure FieldRefNotBlank(FieldRef: FieldRef)
begin
FieldRef.TestField();
end;
local procedure ValidateCostCenterFilter()
var
CurrentCostCenterFilter: Text;
CurrentDim1Filter: Text;
begin
if TempFinancialReport.CostCenterFilter = '' then
Rec.SetRange("Cost Center Filter")
else
Rec.SetFilter("Cost Center Filter", TempFinancialReport.CostCenterFilter);
CurrentCostCenterFilter := TempFinancialReport.CostCenterFilter;
CurrentDim1Filter := TempFinancialReport.Dim1Filter;
OnAfterValidateCostCenterFilter(Rec, CurrentCostCenterFilter, CurrentDim1Filter);
TempFinancialReport.CostCenterFilter := CopyStr(CurrentCostCenterFilter, 1, MaxStrLen(TempFinancialReport.CostCenterFilter));
TempFinancialReport.Dim1Filter := CopyStr(CurrentDim1Filter, 1, MaxStrLen(TempFinancialReport.Dim1Filter));
end;
local procedure ValidateCostObjectFilter()
var
CurrentCostObjectFilter: Text;
CurrentDim2Filter: Text;
begin
if TempFinancialReport.CostObjectFilter = '' then
Rec.SetRange("Cost Object Filter")
else
Rec.SetFilter("Cost Object Filter", TempFinancialReport.CostObjectFilter);
CurrentCostObjectFilter := TempFinancialReport.CostObjectFilter;
CurrentDim2Filter := TempFinancialReport.Dim2Filter;
OnAfterValidateCostObjectFilter(Rec, CurrentCostObjectFilter, CurrentDim2Filter);
TempFinancialReport.CostObjectFilter := CopyStr(CurrentCostObjectFilter, 1, MaxStrLen(TempFinancialReport.CostObjectFilter));
TempFinancialReport.Dim2Filter := CopyStr(CurrentDim2Filter, 1, MaxStrLen(TempFinancialReport.Dim2Filter));
CurrPage.Update();
end;
local procedure ValidateCashFlowFilter()
begin
if TempFinancialReport.CashFlowFilter = '' then
Rec.SetRange("Cash Flow Forecast Filter")
else
Rec.SetFilter("Cash Flow Forecast Filter", TempFinancialReport.CashFlowFilter);
CurrPage.Update();
end;
local procedure ValidateGLBudgetFilter()
begin
if TempFinancialReport.GLBudgetFilter = '' then
Rec.SetRange("G/L Budget Filter")
else
Rec.SetFilter("G/L Budget Filter", TempFinancialReport.GLBudgetFilter);
CurrPage.Update();
end;
local procedure ValidateCostBudgetFilter()
begin
if TempFinancialReport.CostBudgetFilter = '' then
Rec.SetRange("Cost Budget Filter")
else
Rec.SetFilter("Cost Budget Filter", TempFinancialReport.CostBudgetFilter);
CurrPage.Update();
end;
local procedure SetLoadedDimFilters()
begin
SetDimFilters(1, TempFinancialReport.Dim1Filter);
SetDimFilters(2, TempFinancialReport.Dim2Filter);
SetDimFilters(3, TempFinancialReport.Dim3Filter);
SetDimFilters(4, TempFinancialReport.Dim4Filter);
end;
local procedure SetLoadedOtherFilters()
begin
ValidateGLBudgetFilter();
ValidateCashFlowFilter();
ValidateCostBudgetFilter();
ValidateCostCenterFilter();
ValidateCostObjectFilter();
end;
/// <summary>
/// Sets dimension filters for the specified dimension number in financial analysis.
/// Applies dimensional filtering to account schedule calculations and reporting.
/// </summary>
/// <param name="DimNo">Dimension number (1-8) to set filter for</param>
/// <param name="DimValueFilter">Dimension value filter expression to apply</param>
procedure SetDimFilters(DimNo: Integer; DimValueFilter: Text)
var
CurrentCostCenterFilter: Text;
CurrentCostObjectFilter: Text;
CurrentCostBudgetFilter: Text;
CurrentCashFlowFilter: Text;
CurrentGLBudgetFilter: Text;
begin
case DimNo of
1:
if DimValueFilter = '' then
Rec.SetRange("Dimension 1 Filter")
else begin
DimensionManagement.ResolveDimValueFilter(DimValueFilter, AnalysisView."Dimension 1 Code");
Rec.SetFilter("Dimension 1 Filter", DimValueFilter);
end;
2:
if DimValueFilter = '' then
Rec.SetRange("Dimension 2 Filter")
else begin
DimensionManagement.ResolveDimValueFilter(DimValueFilter, AnalysisView."Dimension 2 Code");
Rec.SetFilter("Dimension 2 Filter", DimValueFilter);
end;
3:
if DimValueFilter = '' then
Rec.SetRange("Dimension 3 Filter")
else begin
DimensionManagement.ResolveDimValueFilter(DimValueFilter, AnalysisView."Dimension 3 Code");
Rec.SetFilter("Dimension 3 Filter", DimValueFilter);
end;
4:
if DimValueFilter = '' then
Rec.SetRange("Dimension 4 Filter")
else begin
DimensionManagement.ResolveDimValueFilter(DimValueFilter, AnalysisView."Dimension 4 Code");
Rec.SetFilter("Dimension 4 Filter", DimValueFilter);
end;
end;
CurrentCostCenterFilter := TempFinancialReport.CostCenterFilter;
CurrentCostObjectFilter := TempFinancialReport.CostObjectFilter;
CurrentCostBudgetFilter := TempFinancialReport.CostBudgetFilter;
CurrentGLBudgetFilter := TempFinancialReport.GLBudgetFilter;
CurrentCashFlowFilter := TempFinancialReport.CashFlowFilter;
OnAfterSetDimFilters(
Rec, DimNo, DimValueFilter, CurrentCostCenterFilter, CurrentCostObjectFilter, CurrentCostBudgetFilter,
CurrentGLBudgetFilter, CurrentCashFlowFilter, AnalysisView, TempFinancialReport);
TempFinancialReport.CostCenterFilter := CopyStr(CurrentCostCenterFilter, 1, MaxStrLen(TempFinancialReport.CostCenterFilter));
TempFinancialReport.CostObjectFilter := CopyStr(CurrentCostObjectFilter, 1, MaxStrLen(TempFinancialReport.CostObjectFilter));
TempFinancialReport.CostBudgetFilter := CopyStr(CurrentCostBudgetFilter, 1, MaxStrLen(TempFinancialReport.CostBudgetFilter));
TempFinancialReport.GLBudgetFilter := CopyStr(CurrentGLBudgetFilter, 1, MaxStrLen(TempFinancialReport.GLBudgetFilter));
TempFinancialReport.CashFlowFilter := CopyStr(CurrentCashFlowFilter, 1, MaxStrLen(TempFinancialReport.CashFlowFilter));
CurrPage.Update();
end;
local procedure FormGetCaptionClass(DimNo: Integer) Result: Text[250]
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeGetCaptionClass(AnalysisView, DimNo, Result, IsHandled);
if IsHandled then
exit(Result);
case DimNo of
1:
begin
if AnalysisView."Dimension 1 Code" <> '' then
exit('1,6,' + AnalysisView."Dimension 1 Code");
exit(StrSubstNo(Text005Tok, DimNo));
end;
2:
begin
if AnalysisView."Dimension 2 Code" <> '' then
exit('1,6,' + AnalysisView."Dimension 2 Code");
exit(StrSubstNo(Text005Tok, DimNo));
end;
3:
begin
if AnalysisView."Dimension 3 Code" <> '' then
exit('1,6,' + AnalysisView."Dimension 3 Code");
exit(StrSubstNo(Text005Tok, DimNo));
end;
4:
begin
if AnalysisView."Dimension 4 Code" <> '' then
exit('1,6,' + AnalysisView."Dimension 4 Code");
exit(StrSubstNo(Text005Tok, DimNo));
end;
5:
exit(Rec.FieldCaption("Date Filter"));
6:
exit(Rec.FieldCaption("Cash Flow Forecast Filter"));
end;
end;
local procedure DrillDown(ColumnNo: Integer)
var
PeriodTypeOpt: Option;
begin
TempColumnLayout := ColumnLayoutArr[ColumnNo];
AccSchedManagement.DrillDownFromOverviewPage(TempColumnLayout, Rec, TempFinancialReport.GetEffectivePeriodType().AsInteger());
PeriodTypeOpt := TempFinancialReport.GetEffectivePeriodType().AsInteger();
OnAfterDrillDown(ColumnNo, TempColumnLayout, PeriodTypeOpt);
#if not CLEAN28
if not FeatureFinancialReportDef.IsDefaultsFeatureEnabled() then
TempFinancialReport.PeriodType := "Analysis Period Type".FromInteger(PeriodTypeOpt)
else
#endif
TempFinancialReport.PeriodTypeDefault := "Financial Report Period Type".FromInteger(PeriodTypeOpt);
end;
protected procedure UpdateColumnCaptions()
var
#if not CLEAN27
ColumnCaptions80: array[15] of Text[80];
#endif
ColumnNo: Integer;
i: Integer;
IsHandled: Boolean;
begin
#if not CLEAN27
#pragma warning disable AL0432
for i := 1 to ArrayLen(ColumnCaptions) do
ColumnCaptions80[i] := CopyStr(ColumnCaptions[i], 1, MaxStrLen(ColumnCaptions80[i]));
OnBeforeUpdateColumnCaptions(ColumnCaptions80, ColumnOffset, TempColumnLayout, NoOfColumns, IsHandled);
if IsHandled then begin
for i := 1 to ArrayLen(ColumnCaptions80) do
ColumnCaptions[i] := ColumnCaptions80[i];
exit;
end;
#pragma warning restore AL0432
#else
IsHandled := false;
OnBeforeUpdateColumnCaptions(ColumnCaptions, ColumnOffset, TempColumnLayout, NoOfColumns, IsHandled);
if IsHandled then
exit;
#endif
Clear(ColumnCaptions);
if TempColumnLayout.FindSet() then
repeat
ColumnNo := ColumnNo + 1;
if (ColumnNo > ColumnOffset) and (ColumnNo - ColumnOffset <= ArrayLen(ColumnCaptions)) then
ColumnCaptions[ColumnNo - ColumnOffset] := AccSchedManagement.CalcColumnHeader(Rec, TempColumnLayout);
until (ColumnNo - ColumnOffset = ArrayLen(ColumnCaptions)) or (TempColumnLayout.Next() = 0);
// Set unused columns to blank to prevent RTC to display control ID as caption
for i := ColumnNo - ColumnOffset + 1 to ArrayLen(ColumnCaptions) do
ColumnCaptions[i] := ' ';
NoOfColumns := ColumnNo;
end;
local procedure AdjustColumnOffset(Delta: Integer)
var
OldColumnOffset: Integer;
begin
OldColumnOffset := ColumnOffset;
ColumnOffset := ColumnOffset + Delta;
if ColumnOffset + ArrayLen(ColumnLayoutArr) > TempColumnLayout.Count then
ColumnOffset := TempColumnLayout.Count - ArrayLen(ColumnLayoutArr);
if ColumnOffset < 0 then
ColumnOffset := 0;
if ColumnOffset <> OldColumnOffset then begin
UpdateColumnCaptions();
CurrPage.Update(false);
end;
end;
local procedure SaveStateToFinancialReport()
var
FinancialReport: Record "Financial Report";
begin
if not FinancialReport.Get(TempFinancialReport.Name) then
exit;
FinancialReport.TransferFields(TempFinancialReport, false);
FinancialReport.SetIntroductionParagraph(IntroductoryParagraph);
FinancialReport.SetClosingParagraph(ClosingParagraph);
FinancialReport.Modify();
end;
local procedure RemoveUserFilters()
var
FinancialReportUserFilters: Record "Financial Report User Filters";
UserIDCode: Code[50];
begin
UserIDCode := CopyStr(UserId(), 1, MaxStrLen(UserIDCode));
if not FinancialReportUserFilters.Get(UserIDCode, TempFinancialReport.Name) then
exit;
FinancialReportUserFilters.Delete();
end;
local procedure BlankFieldRef(var TargetFieldRef: FieldRef)
begin
if (TargetFieldRef.Type = TargetFieldRef.Type::Code) or
(TargetFieldRef.Type = TargetFieldRef.Type::Text)
then begin
TargetFieldRef.Value('');
exit;
end;
if TargetFieldRef.Type = TargetFieldRef.Type::Boolean then begin
TargetFieldRef.Value(false);
exit;
end;
if TargetFieldRef.Type = TargetFieldRef.Type::Integer then begin
TargetFieldRef.Value(0);
exit;
end;
end;
local procedure SaveStateToUserFilters()
var
FinancialReportUserFilters: Record "Financial Report User Filters";
FinancialReport: Record "Financial Report";
Field: Record "Field";
RecordRefFinancialReport: RecordRef;
RecordRefUserFilters: RecordRef;
RecordRefFinancialReportTemp: RecordRef;
FieldRefFinancialReport: FieldRef;
FieldRefUserFilters: FieldRef;
FieldRefFinancialReportTemp: FieldRef;
UserIDCode: Code[50];
FiltersAreDifferent: Boolean;
begin
if not FinancialReport.Get(TempFinancialReport.Name) then
exit; // This condition should be unreachable through OnClose as the user is not able to modify Name
UserIDCode := CopyStr(UserId(), 1, MaxStrLen(UserIDCode));
if not FinancialReportUserFilters.Get(UserIDCode, TempFinancialReport.Name) then begin
FinancialReportUserFilters.Init();
FinancialReportUserFilters."Financial Report Name" := TempFinancialReport.Name;
FinancialReportUserFilters."User ID" := UserIDCode;
FinancialReportUserFilters.Insert();
Commit();
end;
// We only tranfer values to `FinancialReportUserFilters` if they differ from the
// value stored in the original definition of the corresponding `FinancialReport`.
// If they are the same, we blank them
RecordRefFinancialReport.GetTable(FinancialReport);
RecordRefUserFilters.GetTable(FinancialReportUserFilters);
RecordRefFinancialReportTemp.GetTable(TempFinancialReport);
Field.SetRange(TableNo, Database::"Financial Report User Filters");
Field.SetFilter("No.", '<>%1 & <>%2 & < %3', FinancialReportUserFilters.FieldNo("User ID"), FinancialReportUserFilters.FieldNo("Financial Report Name"), 2000000000);
Field.SetFilter(ObsoleteState, '<>%1', Field.ObsoleteState::Removed);
FiltersAreDifferent := false;
if Field.FindSet() then
repeat
FieldRefFinancialReport := RecordRefFinancialReport.Field(Field."No.");
FieldRefUserFilters := RecordRefUserFilters.Field(Field."No.");
FieldRefFinancialReportTemp := RecordRefFinancialReportTemp.Field(Field."No.");
// If the values modified in the page are different to the ones stored in the financial report
// we store the modified value in the user filters
if FieldRefFinancialReportTemp.Value <> FieldRefFinancialReport.Value then begin
FieldRefUserFilters.Value(FieldRefFinancialReportTemp.Value);
FiltersAreDifferent := true;
end
else // if they are the same, we blank such field in the user filters
BlankFieldRef(FieldRefUserFilters);
until Field.Next() = 0;
RecordRefUserFilters.Modify();
RecordRefFinancialReport.Close();
RecordRefUserFilters.Close();
RecordRefFinancialReportTemp.Close();
if FiltersAreDifferent then
exit;
Commit();
if FinancialReportUserFilters.Get(UserIDCode, TempFinancialReport.Name) then
FinancialReportUserFilters.Delete();
end;
local procedure StateHasUserChanges(): Boolean
var
TempOriginalFinancialReport: Record "Financial Report" temporary;
Field: Record "Field";
RecordRefFinancialReport: RecordRef;
RecordRefOriginalFinancialReport: RecordRef;
FieldRefFinancialReport: FieldRef;
FieldRefOriginalFinancialReport: FieldRef;
begin
// To determine whether changes were made, we load the original definition
LoadFinancialReportFiltersOrDefault(TempFinancialReport.Name, TempOriginalFinancialReport);
Field.SetRange(TableNo, Database::"Financial Report");
Field.SetFilter(ObsoleteState, '<>%1', Field.ObsoleteState::Removed);
RecordRefOriginalFinancialReport.GetTable(TempOriginalFinancialReport);
RecordRefFinancialReport.GetTable(TempFinancialReport);
// And then we compare each field of the current `FinancialReportTemp`
if Field.FindSet() then
repeat
FieldRefOriginalFinancialReport := RecordRefOriginalFinancialReport.Field(Field."No.");
FieldRefFinancialReport := RecordRefFinancialReport.Field(Field."No.");
// If there is any of those different, the user made a change
if FieldRefFinancialReport.Value <> FieldRefOriginalFinancialReport.Value then begin
RecordRefFinancialReport.Close();
RecordRefOriginalFinancialReport.Close();
exit(true);
end;
until Field.Next() = 0;
RecordRefFinancialReport.Close();
RecordRefOriginalFinancialReport.Close();
exit(false);
end;
local procedure ApplyShowFilter()
begin
if not TempFinancialReport.ShowLinesWithShowNo then
Rec.SetFilter(Show, '<>%1', Rec.Show::No)
else
Rec.SetRange(Show);
end;
local procedure UpdateDimFilterControls()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeUpdateDimFilterControls(Rec, AnalysisView, IsHandled);
if IsHandled then
exit;
TempFinancialReport.Dim1Filter := CopyStr(Rec.GetFilter("Dimension 1 Filter"), 1, MaxStrLen(TempFinancialReport.Dim1Filter));
TempFinancialReport.Dim2Filter := CopyStr(Rec.GetFilter("Dimension 2 Filter"), 1, MaxStrLen(TempFinancialReport.Dim2Filter));
TempFinancialReport.Dim3Filter := CopyStr(Rec.GetFilter("Dimension 3 Filter"), 1, MaxStrLen(TempFinancialReport.Dim3Filter));
TempFinancialReport.Dim4Filter := CopyStr(Rec.GetFilter("Dimension 4 Filter"), 1, MaxStrLen(TempFinancialReport.Dim4Filter));
Dim1FilterEnable := AnalysisView."Dimension 1 Code" <> '';
Dim2FilterEnable := AnalysisView."Dimension 2 Code" <> '';
Dim3FilterEnable := AnalysisView."Dimension 3 Code" <> '';
Dim4FilterEnable := AnalysisView."Dimension 4 Code" <> '';
OnAfterUpdateDimFilterControls(Dim4FilterEnable);
end;
local procedure CurrentSchedNameOnAfterValidate()
var
AccSchedName2: Record "Acc. Schedule Name";
PrevAnalysisView: Record "Analysis View";
begin
AccSchedManagement.SetName(TempFinancialReport."Financial Report Row Group", Rec);
AccSchedManagement.SetAnalysisViewRead(false);
AccSchedManagement.CheckAnalysisView(TempFinancialReport."Financial Report Row Group", TempFinancialReport."Financial Report Column Group", true);
if AccSchedName2."Analysis View Name" <> AnalysisView.Code then begin
PrevAnalysisView := AnalysisView;
if AccSchedName2."Analysis View Name" <> '' then
AnalysisView.Get(AccSchedName2."Analysis View Name")
else begin
Clear(AnalysisView);
AnalysisView."Dimension 1 Code" := GLSetup."Global Dimension 1 Code";
AnalysisView."Dimension 2 Code" := GLSetup."Global Dimension 2 Code";
end;
if PrevAnalysisView."Dimension 1 Code" <> AnalysisView."Dimension 1 Code" then
Rec.SetRange("Dimension 1 Filter");
if PrevAnalysisView."Dimension 2 Code" <> AnalysisView."Dimension 2 Code" then
Rec.SetRange("Dimension 2 Filter");
if PrevAnalysisView."Dimension 3 Code" <> AnalysisView."Dimension 3 Code" then
Rec.SetRange("Dimension 3 Filter");
if PrevAnalysisView."Dimension 4 Code" <> AnalysisView."Dimension 4 Code" then
Rec.SetRange("Dimension 4 Filter");
end;
UpdateDimFilterControls();
TempFinancialReport.CostCenterFilter := '';
TempFinancialReport.CostObjectFilter := '';
TempFinancialReport.CashFlowFilter := '';
TempFinancialReport.GLBudgetFilter := '';
TempFinancialReport.CostBudgetFilter := '';
if not ViewOnlyMode then
SaveStateToFinancialReport();
CurrPage.Update(false);
end;
protected procedure CurrentColumnNameOnAfterValidate()
begin
OnBeforeCurrentColumnNameOnAfterValidate(TempFinancialReport."Financial Report Column Group");
AccSchedManagement.CopyColumnsToTemp(TempFinancialReport."Financial Report Column Group", TempColumnLayout);
AccSchedManagement.SetColumnName(TempFinancialReport."Financial Report Column Group", TempColumnLayout);
AccSchedManagement.SetAnalysisViewRead(false);
AccSchedManagement.CheckAnalysisView(TempFinancialReport."Financial Report Row Group", TempFinancialReport."Financial Report Column Group", true);
ColumnOffset := 0;
UpdateColumnCaptions();
CurrPage.Update(false);
if not ViewOnlyMode then
SaveStateToFinancialReport();
end;
/// <summary>
/// Formats column values according to column layout formatting specifications.
/// Returns formatted string representation of financial data for display purposes.
/// </summary>
/// <param name="ColumnNo">Column number to format</param>
/// <returns>Formatted string value for the specified column</returns>
procedure FormatStr(ColumnNo: Integer): Text
var
AddCurrency: Boolean;
Result: Text;
IsHandled: Boolean;
begin
GLSetup.Get();
AddCurrency := TempFinancialReport.UseAmountsInAddCurrency and (GLSetup."Additional Reporting Currency" <> '');
OnAfterFormatStr(ColumnLayoutArr, UseAmtsInAddCurr, ColumnNo, TempFinancialReport.GetEffectiveNegativeAmountFormat(), Result, IsHandled);
if IsHandled then
exit(Result);
exit(MatrixMgt.FormatRoundingFactor(ColumnLayoutArr[ColumnNo]."Rounding Factor", UseAmtsInAddCurr, TempFinancialReport.GetEffectiveNegativeAmountFormat()));
end;
/// <summary>
/// Applies rounding to decimal values based on specified rounding factor.
/// Returns either original value or rounded value depending on factor configuration.
/// </summary>
/// <param name="Value">Decimal value to potentially round</param>
/// <param name="RoundingFactor">Rounding factor enum determining rounding behavior</param>
/// <returns>Value rounded according to specified factor, or original value if None</returns>
procedure RoundIfNotNone(Value: Decimal; RoundingFactor: Enum "Analysis Rounding Factor"): Decimal
begin
if RoundingFactor <> RoundingFactor::None then
exit(Value);
exit(Round(Value));
end;
local procedure GetStyle(ColumnNo: Integer; RowLineNo: Integer; ColumnLineNo: Integer)
var
ColumnStyle: Text;
ErrorType: Option "None","Division by Zero","Period Error",Both;
begin
AccSchedManagement.CalcFieldError(ErrorType, RowLineNo, ColumnLineNo);
if ErrorType > ErrorType::None then
ColumnStyle := 'Unfavorable'
else
if Rec.Bold then
ColumnStyle := 'Strong'
else
ColumnStyle := 'Standard';
OnGetStyleOnBeforeAssignColumnStyle(Rec, ColumnNo, RowLineNo, ColumnLineNo, ColumnStyle, ColumnValues);
case ColumnNo of
1:
ColumnStyle1 := ColumnStyle;
2:
ColumnStyle2 := ColumnStyle;
3:
ColumnStyle3 := ColumnStyle;
4:
ColumnStyle4 := ColumnStyle;
5:
ColumnStyle5 := ColumnStyle;
6:
ColumnStyle6 := ColumnStyle;
7:
ColumnStyle7 := ColumnStyle;
8:
ColumnStyle8 := ColumnStyle;
9:
ColumnStyle9 := ColumnStyle;
10:
ColumnStyle10 := ColumnStyle;
11:
ColumnStyle11 := ColumnStyle;
12:
ColumnStyle12 := ColumnStyle;
13:
ColumnStyle13 := ColumnStyle;
14:
ColumnStyle14 := ColumnStyle;
15:
ColumnStyle15 := ColumnStyle;
end;
end;
local procedure LogUsageTelemetry()
var
FeatureTelemetry: Codeunit "Feature Telemetry";
TelemetryDimensions: Dictionary of [Text, Text];
begin
TelemetryDimensions.Add('ReportDefinitionCode', TempFinancialReport.Name);
TelemetryDimensions.Add('RowDefinitionCode', TempFinancialReport."Financial Report Row Group");
TelemetryDimensions.Add('ColumnDefinitionCode', TempFinancialReport."Financial Report Column Group");
TelemetryDimensions.Add('DateFilter', DateFilter);
TelemetryDimensions.Add('GLBudgetFilter', TempFinancialReport.GLBudgetFilter);
TelemetryDimensions.Add('CostBudgetFilter', TempFinancialReport.CostBudgetFilter);
TelemetryDimensions.Add('Dim1Filter', TempFinancialReport.Dim1Filter);
TelemetryDimensions.Add('Dim2Filter', TempFinancialReport.Dim2Filter);
TelemetryDimensions.Add('Dim3Filter', TempFinancialReport.Dim3Filter);
TelemetryDimensions.Add('Dim4Filter', TempFinancialReport.Dim4Filter);
FeatureTelemetry.LogUsage('0000OKU', 'Financial Report', StrSubstNo(PageRunEventTxt, TempFinancialReport.Name), TelemetryDimensions);
end;
/// <summary>
/// Integration event raised after setting dimension filters for account schedule lines.
/// Enables custom dimension filter processing and validation in account schedule overview.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for dimension filter application</param>
/// <param name="DimNo">Dimension number being processed for filtering</param>
/// <param name="DimValueFilter">Dimension value filter text to apply</param>
/// <param name="CostCenterFilter">Cost center filter for cost accounting integration</param>
/// <param name="CostObjectFilter">Cost object filter for cost accounting integration</param>
/// <param name="CurrentCostBudgetFilter">Current cost budget filter for budget analysis</param>
/// <param name="CurrentGLBudgetFilter">Current G/L budget filter for budget analysis</param>
/// <param name="CurrentCashFlowFilter">Current cash flow filter for cash flow analysis</param>
/// <param name="AnalysisView">Analysis view record for dimension validation</param>
/// <param name="TempFinancialReport">Temporary financial report record for context</param>
[IntegrationEvent(false, false)]
local procedure OnAfterSetDimFilters(var AccScheduleLine: Record "Acc. Schedule Line"; var DimNo: Integer; var DimValueFilter: Text; var CostCenterFilter: Text; var CostObjectFilter: Text; var CurrentCostBudgetFilter: Text; var CurrentGLBudgetFilter: Text; var CurrentCashFlowFilter: Text; AnalysisView: Record "Analysis View"; var TempFinancialReport: Record "Financial Report" temporary)
begin
end;
/// <summary>
/// Integration event raised after validating cost center filter in account schedule overview.
/// Enables custom cost center filter validation and dimension synchronization.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for cost center validation</param>
/// <param name="CostCenterFilter">Cost center filter text being validated</param>
/// <param name="Dim1Filter">Dimension 1 filter synchronized with cost center</param>
[IntegrationEvent(false, false)]
local procedure OnAfterValidateCostCenterFilter(var AccScheduleLine: Record "Acc. Schedule Line"; var CostCenterFilter: Text; var Dim1Filter: Text)
begin
end;
/// <summary>
/// Integration event raised after validating cost object filter in account schedule overview.
/// Enables custom cost object filter validation and dimension synchronization.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for cost object validation</param>
/// <param name="CostObjectFilter">Cost object filter text being validated</param>
/// <param name="Dim2Filter">Dimension 2 filter synchronized with cost object</param>
[IntegrationEvent(false, false)]
local procedure OnAfterValidateCostObjectFilter(var AccScheduleLine: Record "Acc. Schedule Line"; var CostObjectFilter: Text; var Dim2Filter: Text)
begin
end;
/// <summary>
/// Integration event raised after updating dimension filter controls in account schedule overview.
/// Enables custom control state management for dimension filtering interface.
/// </summary>
/// <param name="Dim4FilterEnable">Variable to control Dimension 4 filter control enablement</param>
[IntegrationEvent(true, false)]
local procedure OnAfterUpdateDimFilterControls(var Dim4FilterEnable: Boolean)
begin
end;
/// <summary>
/// Integration event raised after drill-down operation in account schedule overview.
/// Enables custom drill-down processing and navigation logic for account schedule data.
/// </summary>
/// <param name="ColumnNo">Column number where drill-down was triggered</param>
/// <param name="TempColumnLayout">Temporary column layout record for drill-down context</param>
/// <param name="PeriodType">Period type option for drill-down data filtering</param>
[IntegrationEvent(true, false)]
local procedure OnAfterDrillDown(ColumnNo: Integer; var TempColumnLayout: Record "Column Layout" temporary; var PeriodType: Option)
begin
end;
/// <summary>
/// Integration event raised after opening account schedule overview page.
/// Enables custom page initialization and data setup logic.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for page initialization</param>
/// <param name="CurrentColumnName">Current column layout name for page setup</param>
[IntegrationEvent(true, false)]
local procedure OnAfterOnOpenPage(var AccScheduleLine: Record "Acc. Schedule Line"; var CurrentColumnName: Code[10])
begin
end;
/// <summary>
/// Integration event raised after assigning column values in account schedule overview record processing.
/// Enables custom column value calculation and formatting logic.
/// </summary>
/// <param name="ColumnValues">Array of decimal values for account schedule columns</param>
/// <param name="ColumnNo">Current column number being processed</param>
/// <param name="ColumnOffset">Column offset for array positioning</param>
/// <param name="TempColumnLayout">Temporary column layout record for value calculation</param>
/// <param name="UseAmtsInAddCurr">Whether to use amounts in additional currency</param>
[IntegrationEvent(true, false)]
local procedure OnOnAfterGetRecordOnAfterAssignColumnValue(var ColumnValues: array[15] of Decimal; var ColumnNo: Integer; var ColumnOffset: Integer; var TempColumnLayout: Record "Column Layout" temporary; var UseAmtsInAddCurr: Boolean)
begin
end;
/// <summary>
/// Integration event raised before printing account schedule reports from overview page.
/// Enables custom print preparation and report parameter validation.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for print operation</param>
/// <param name="ColumnLayoutName">Column layout name for report printing</param>
/// <param name="IsHandled">Set to true to skip standard print processing</param>
/// <param name="TempFinancialReport">Temporary financial report record for print context</param>
[IntegrationEvent(false, false)]
local procedure OnBeforePrint(var AccScheduleLine: Record "Acc. Schedule Line"; ColumnLayoutName: Code[10]; var IsHandled: Boolean; var TempFinancialReport: Record "Financial Report" temporary)
begin
end;
/// <summary>
/// Integration event raised before validating column name changes in account schedule overview.
/// Enables custom column name validation and pre-processing logic.
/// </summary>
/// <param name="CurrentColumnName">Column layout name being validated</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeCurrentColumnNameOnAfterValidate(var CurrentColumnName: Code[10])
begin
end;
/// <summary>
/// Integration event raised before getting caption class for dimension controls in account schedule overview.
/// Enables custom caption generation for dimension filter controls.
/// </summary>
/// <param name="AnalysisView">Analysis view record for caption context</param>
/// <param name="DimNo">Dimension number for caption generation</param>
/// <param name="Result">Variable to receive custom caption class text</param>
/// <param name="IsHandled">Set to true to skip standard caption class processing</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeGetCaptionClass(AnalysisView: Record "Analysis View"; DimNo: Integer; var Result: Text[250]; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Integration event raised before updating column captions in account schedule overview.
/// Enables custom column caption generation and formatting logic.
/// </summary>
/// <param name="ColumnCaptions">Array of column caption texts to update</param>
/// <param name="ColumnOffset">Column offset for caption array positioning</param>
/// <param name="TempColumnLayout">Temporary column layout record for caption generation</param>
/// <param name="NoOfColumns">Number of columns to process for caption update</param>
/// <param name="IsHandled">Set to true to skip standard caption update processing</param>
[IntegrationEvent(false, false)]
#if not CLEAN27
[Obsolete('The ColumnCaptions parameter will be changed to array[15] of Text in a future release.', '27.0')]
local procedure OnBeforeUpdateColumnCaptions(var ColumnCaptions: array[15] of Text[80]; ColumnOffset: Integer; var TempColumnLayout: Record "Column Layout" temporary; NoOfColumns: Integer; var IsHandled: Boolean)
#else
local procedure OnBeforeUpdateColumnCaptions(var ColumnCaptions: array[15] of Text; ColumnOffset: Integer; var TempColumnLayout: Record "Column Layout" temporary; NoOfColumns: Integer; var IsHandled: Boolean)
#endif
begin
end;
/// <summary>
/// Integration event raised before updating dimension filter controls in account schedule overview.
/// Enables custom dimension filter control state management and validation.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for dimension filter setup</param>
/// <param name="AnalysisView">Analysis view record for dimension control configuration</param>
/// <param name="IsHandled">Set to true to skip standard dimension filter control update</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeUpdateDimFilterControls(var AccScheduleLine: Record "Acc. Schedule Line"; AnalysisView: Record "Analysis View"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Integration event raised before assigning column style in account schedule overview display formatting.
/// Enables custom styling and conditional formatting for account schedule columns.
/// </summary>
/// <param name="AccScheduleLine">Account schedule line record for style determination</param>
/// <param name="ColumnNo">Column number being styled</param>
/// <param name="RowLineNo">Row line number for style context</param>
/// <param name="ColumnLineNo">Column line number for style context</param>
/// <param name="ColumnStyle">Variable to receive custom column style</param>
/// <param name="ColumnValues">Array of column values for conditional formatting</param>
[IntegrationEvent(true, false)]
local procedure OnGetStyleOnBeforeAssignColumnStyle(AccScheduleLine: Record "Acc. Schedule Line"; ColumnNo: Integer; RowLineNo: Integer; ColumnLineNo: Integer; var ColumnStyle: Text; ColumnValues: array[15] of Decimal);
begin
end;
/// <summary>
/// Integration event raised after formatting decimal values to text in account schedule overview.
/// Enables custom number formatting and display logic for account schedule columns.
/// </summary>
/// <param name="ColumnLayoutArr">Array of column layout records for formatting context</param>
/// <param name="UseAmtsInAddCurr">Whether amounts are displayed in additional currency</param>
/// <param name="ColumnNo">Column number being formatted</param>
/// <param name="NegativeAmountFormatting">Negative amount formatting enumeration option</param>
/// <param name="Result">Variable to receive custom formatted text result</param>
/// <param name="IsHandled">Set to true to skip standard formatting processing</param>
[IntegrationEvent(false, false)]
local procedure OnAfterFormatStr(ColumnLayoutArr: array[15] of Record "Column Layout"; UseAmtsInAddCurr: Boolean; ColumnNo: Integer; NegativeAmountFormatting: Enum "Analysis Negative Format"; var Result: Text; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Integration event raised before copying columns to temporary table during page state loading.
/// Enables custom column layout processing and filtering during page initialization.
/// </summary>
/// <param name="CurrentColumnName">Current column layout name for page initialization</param>
/// <param name="TempColumnLayout">Temporary column layout record for data copying</param>
/// <param name="CurrentSchedName">Current account schedule name for context</param>
/// <param name="AccScheduleLine">Account schedule line record for initialization</param>
/// <param name="IsHandled">Set to true to skip standard column copying processing</param>
[IntegrationEvent(false, false)]
local procedure OnLoadPageStateOnBeforeCopyColumnsToTemp(CurrentColumnName: Code[10]; var TempColumnLayout: Record "Column Layout" temporary; var CurrentSchedName: Code[10]; var AccScheduleLine: Record "Acc. Schedule Line"; var IsHandled: Boolean)
begin
end;
}