Codeunit 424 Export Analysis View
- App
- Base Application
- Namespace
- Microsoft.Finance.Analysis
- Versions
- 17-28
Procedures, 4Events, 8Obsolete, 1
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Finance/Analysis/ExportAnalysisView.Codeunit.al1068 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.Analysis;
using Microsoft.CashFlow.Account;
using Microsoft.Finance.Consolidation;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.Period;
using Microsoft.Utilities;
using System.IO;
/// <summary>
/// Exports analysis view data to Excel format with multi-dimensional layout and hierarchical structure.
/// Provides comprehensive data export capabilities for analysis views with dimension drilling and formatting.
/// </summary>
/// <remarks>
/// Supports export of both G/L account and Cash Flow account analysis data.
/// Creates Excel workbooks with hierarchical dimension layouts and configurable column structures.
/// Integrates with analysis view filtering and dimension parameters for targeted data export.
/// </remarks>
codeunit 424 "Export Analysis View"
{
trigger OnRun()
begin
end;
var
TempDimValue2: Record "Dimension Value" temporary;
TempDimValue3: Record "Dimension Value" temporary;
TempGLAcc2: Record "G/L Account" temporary;
TempGLAcc3: Record "G/L Account" temporary;
TempCFAccount2: Record "Cash Flow Account" temporary;
TempCFAccount3: Record "Cash Flow Account" temporary;
BusUnit: Record "Business Unit";
TempExcelBuffer: Record "Excel Buffer" temporary;
FileMgt: Codeunit "File Management";
NoOfColumns: Integer;
MaxLevel: Integer;
MaxLevelDim: array[4] of Integer;
HasBusinessUnits: Boolean;
GLAccountSource: Boolean;
ServerFileName: Text;
SkipDownload: Boolean;
#pragma warning disable AA0074
Text000: Label 'You can only export Actual amounts and Budgeted amounts.\Please change the option in the Show field.';
Text001: Label 'This combination is not valid. You cannot export Debit and Credit amounts for Budgeted amounts.\Please enter Amount in the Show Amount field.';
Text002: Label 'General Info._';
Text003: Label 'None';
Text004: Label 'Day';
Text005: Label 'Week';
Text006: Label 'Month';
Text007: Label 'Quarter';
Text008: Label 'Year';
Text009: Label 'Accounting Period';
Text011: Label 'Analysis by Dimension ';
Text012: Label 'Amount Type';
Text013: Label 'Net Change';
Text014: Label 'Balance at Date';
Text015: Label 'Date Filter';
Text016: Label 'Budget Filter';
Text116: Label 'Cash Flow Forecast Filter';
Text018: Label 'G/L Account';
Text118: Label 'Cash Flow Account';
Text020: Label 'Budgeted Amount';
Text022: Label 'Level';
Text023: Label 'Analysis View Name';
Text024: Label 'Closing Entries';
Text025: Label 'Included';
Text026: Label 'Excluded';
Text027: Label 'All amounts shown in ';
Text028: Label 'Show Opposite Sign';
Text029: Label 'Yes';
Text030: Label 'No';
Text031: Label 'Data_';
#pragma warning restore AA0074
/// <summary>
/// Exports analysis view entry data to Excel format with dimensional breakdown and hierarchical structure.
/// Creates comprehensive Excel report with configurable dimensions and account groupings.
/// </summary>
/// <param name="AnalysisViewEntry">Analysis view entry records to export</param>
/// <param name="AnalysisByDimParameters">Parameters controlling export format and filtering options</param>
procedure ExportData(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
var
BusUnitFilter: Text;
CashFlowFilter: Text;
begin
GLAccountSource := AnalysisByDimParameters."Analysis Account Source" = AnalysisByDimParameters."Analysis Account Source"::"G/L Account";
CheckCombination(AnalysisByDimParameters."Show Actual/Budgets", AnalysisByDimParameters."Show Amount Field");
BusUnitFilter := '';
CashFlowFilter := '';
SetOtherFilterToCorrectFilter(AnalysisByDimParameters."Bus. Unit Filter", BusUnitFilter, CashFlowFilter);
HasBusinessUnits := not BusUnit.IsEmpty();
ServerFileName := FileMgt.ServerTempFileName('xlsx');
CreateFillGeneralInfoSheet(AnalysisViewEntry, AnalysisByDimParameters);
TempExcelBuffer.CreateBook(ServerFileName, StrSubstNo('%1%2', Text002, AnalysisViewEntry."Analysis View Code"));
TempExcelBuffer.WriteSheet(StrSubstNo('%1%2', Text002, AnalysisViewEntry."Analysis View Code"), CompanyName, UserId);
CreateDataSheet(AnalysisViewEntry, AnalysisByDimParameters);
TempExcelBuffer.SelectOrAddSheet(StrSubstNo('%1%2', Text031, AnalysisViewEntry."Analysis View Code"));
TempExcelBuffer.WriteAllToCurrentSheet(TempExcelBuffer);
TempExcelBuffer.CloseBook();
OnExportDataOnAfterCloseBook(TempExcelBuffer, AnalysisViewEntry, AnalysisByDimParameters);
if not SkipDownload then
TempExcelBuffer.OpenExcel();
OnAfterExportData(TempExcelBuffer, AnalysisViewEntry);
end;
local procedure CreateDataSheet(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
var
AnalysisViewEntry2: Record "Analysis View Entry";
AnalysisView: Record "Analysis View";
BusUnit: Record "Business Unit";
StartDate: Date;
EndDate: Date;
WeekNo: Integer;
Year: Integer;
SignValue: Integer;
NoOfLeadingColumns: Integer;
begin
TempExcelBuffer.DeleteAll();
AnalysisViewEntry2.Copy(AnalysisViewEntry);
AnalysisView.Get(AnalysisByDimParameters."Analysis View Code");
PopulateTempAccountTable(AnalysisByDimParameters."Account Filter");
FindDimLevel(AnalysisView."Dimension 1 Code", AnalysisByDimParameters."Dimension 1 Filter", 1);
FindDimLevel(AnalysisView."Dimension 2 Code", AnalysisByDimParameters."Dimension 2 Filter", 2);
FindDimLevel(AnalysisView."Dimension 3 Code", AnalysisByDimParameters."Dimension 3 Filter", 3);
FindDimLevel(AnalysisView."Dimension 4 Code", AnalysisByDimParameters."Dimension 4 Filter", 4);
SignValue := 1;
if AnalysisByDimParameters."Show Opposite Sign" then
SignValue := -1;
CreateRowWithColumnsCaptions(AnalysisViewEntry2, AnalysisView);
CreateAnalysisViewEntryPart(
AnalysisViewEntry2, AnalysisView, StartDate, EndDate, SignValue, AnalysisByDimParameters);
CreateAnalysisViewBudgetEntryPart(
AnalysisView, StartDate, EndDate, SignValue, AnalysisByDimParameters);
NoOfLeadingColumns := 0;
case AnalysisViewEntry."Account Source" of
AnalysisViewEntry."Account Source"::"G/L Account":
begin
TempGLAcc2.SetRange("Account Type", TempGLAcc2."Account Type"::Posting);
if TempGLAcc2.Find('-') then
repeat
if not TempGLAcc2.Mark() then begin
FillOutGLAcc(TempGLAcc2."No.", AnalysisByDimParameters."Show Column Name");
StartNewRow();
end;
until TempGLAcc2.Next() = 0;
end;
AnalysisViewEntry."Account Source"::"Cash Flow Account":
begin
TempCFAccount2.SetRange("Account Type", TempCFAccount2."Account Type"::Entry);
if TempCFAccount2.Find('-') then
ProcessMarkedTempCFAccountRec(AnalysisByDimParameters."Show Column Name");
end;
end;
NoOfLeadingColumns := MaxLevel + 1;
if HasBusinessUnits then begin
if BusUnit.Find('-') then
repeat
if not BusUnit.Mark() then begin
FillOutBusUnit(BusUnit.Code, AnalysisByDimParameters."Show Column Name");
StartNewRow();
end;
until BusUnit.Next() = 0;
NoOfLeadingColumns := NoOfLeadingColumns + 1;
SetStartColumnNo(NoOfLeadingColumns);
end;
if AnalysisView."Dimension 1 Code" <> '' then
WriteDimLine(1, AnalysisByDimParameters."Dimension 1 Filter", AnalysisView."Dimension 1 Code", NoOfLeadingColumns, AnalysisByDimParameters."Show Column Name");
NoOfLeadingColumns := NoOfLeadingColumns + MaxLevelDim[1] + 1;
if AnalysisView."Dimension 2 Code" <> '' then
WriteDimLine(2, AnalysisByDimParameters."Dimension 2 Filter", AnalysisView."Dimension 2 Code", NoOfLeadingColumns, AnalysisByDimParameters."Show Column Name");
NoOfLeadingColumns := NoOfLeadingColumns + MaxLevelDim[2] + 1;
if AnalysisView."Dimension 3 Code" <> '' then
WriteDimLine(3, AnalysisByDimParameters."Dimension 3 Filter", AnalysisView."Dimension 3 Code", NoOfLeadingColumns, AnalysisByDimParameters."Show Column Name");
NoOfLeadingColumns := NoOfLeadingColumns + MaxLevelDim[3] + 1;
if AnalysisView."Dimension 4 Code" <> '' then
WriteDimLine(4, AnalysisByDimParameters."Dimension 4 Filter", AnalysisView."Dimension 4 Code", NoOfLeadingColumns, AnalysisByDimParameters."Show Column Name");
NoOfLeadingColumns := NoOfLeadingColumns + MaxLevelDim[4] + 1;
WeekNo := Date2DWY(StartDate, 2);
Year := Date2DWY(StartDate, 3);
StartDate := DWY2Date(1, WeekNo, Year);
while StartDate <= EndDate do begin
SetStartColumnNo(NoOfLeadingColumns);
FillNextCellInRow(CalculatePeriodStart(StartDate, 0));
FillNextCellInRow(CalculatePeriodStart(StartDate, 1));
FillNextCellInRow(CalculatePeriodStart(StartDate, 2));
FillNextCellInRow(CalculatePeriodStart(StartDate, 3));
FillNextCellInRow(CalculatePeriodStart(StartDate, 4));
StartNewRow();
StartDate := CalcDate('<1W>', StartDate);
end;
end;
local procedure CreateAnalysisViewEntryPart(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisView: Record "Analysis View"; var StartDate: Date; var EndDate: Date; SignValue: Integer; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
var
AnalysisViewEntry2: Record "Analysis View Entry";
MaxDate: Date;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeCreateAnalysisViewEntryPart(AnalysisViewEntry, AnalysisView, StartDate, EndDate, AnalysisByDimParameters, IsHandled);
if IsHandled then
exit;
StartDate := AnalysisViewEntry."Posting Date";
AnalysisViewEntry2.SetFilter("Posting Date", AnalysisByDimParameters."Date Filter");
if (AnalysisByDimParameters."Date Filter" <> '') and (AnalysisByDimParameters."Amount Type" = "Analysis Amount Type"::"Balance at Date") then begin
MaxDate := AnalysisViewEntry2.GetRangeMax("Posting Date");
AnalysisViewEntry.SetFilter("Posting Date", '<=%1', MaxDate);
end;
if AnalysisByDimParameters."Cash Flow Forecast Filter" <> '' then
AnalysisViewEntry.SetFilter("Cash Flow Forecast No.", AnalysisByDimParameters."Cash Flow Forecast Filter");
if AnalysisViewEntry.FindSet() then
repeat
if (AnalysisByDimParameters."Closing Entries" = 0) or (AnalysisViewEntry."Posting Date" = NormalDate(AnalysisViewEntry."Posting Date")) then begin
if AnalysisViewEntry."Posting Date" >= EndDate then
EndDate := AnalysisViewEntry."Posting Date"
else
if AnalysisViewEntry."Posting Date" <= StartDate then
StartDate := AnalysisViewEntry."Posting Date";
if GLAccountSource then begin
if TempGLAcc2.Get(AnalysisViewEntry."Account No.") then
TempGLAcc2.Mark(true);
FillOutGLAcc(AnalysisViewEntry."Account No.", AnalysisByDimParameters."Show Column Name");
end else begin
if TempCFAccount2.Get(AnalysisViewEntry."Account No.") then
TempCFAccount2.Mark(true);
FillOutCFAccount(AnalysisViewEntry."Account No.", AnalysisByDimParameters."Show Column Name");
end;
if HasBusinessUnits then
FillOutBusUnit(AnalysisViewEntry."Business Unit Code", AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 1 Code" <> '' then
FillOutDim(AnalysisViewEntry."Dimension 1 Value Code", AnalysisView."Dimension 1 Code", 1, AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 2 Code" <> '' then
FillOutDim(AnalysisViewEntry."Dimension 2 Value Code", AnalysisView."Dimension 2 Code", 2, AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 3 Code" <> '' then
FillOutDim(AnalysisViewEntry."Dimension 3 Value Code", AnalysisView."Dimension 3 Code", 3, AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 4 Code" <> '' then
FillOutDim(AnalysisViewEntry."Dimension 4 Value Code", AnalysisView."Dimension 4 Code", 4, AnalysisByDimParameters."Show Column Name");
if not AnalysisByDimParameters."Show In Add. Currency" then begin
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), -1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 0));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 2));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 3));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 4));
FillNextCellInRow(AnalysisViewEntry.Amount * SignValue);
FillNextCellInRow(AnalysisViewEntry."Debit Amount" * SignValue);
FillNextCellInRow(AnalysisViewEntry."Credit Amount" * SignValue);
end else begin
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), -1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 0));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 2));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 3));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewEntry."Posting Date"), 4));
FillNextCellInRow(AnalysisViewEntry."Add.-Curr. Amount" * SignValue);
FillNextCellInRow(AnalysisViewEntry."Add.-Curr. Debit Amount" * SignValue);
FillNextCellInRow(AnalysisViewEntry."Add.-Curr. Credit Amount" * SignValue);
end;
OnCreateAnalysisViewEntryPartOnBeforeStartNewRow(TempExcelBuffer, AnalysisViewEntry, AnalysisByDimParameters);
StartNewRow();
end;
until AnalysisViewEntry.Next() = 0;
end;
local procedure CreateAnalysisViewBudgetEntryPart(AnalysisView: Record "Analysis View"; var StartDate: Date; var EndDate: Date; SignValue: Integer; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
var
Currency: Record Currency;
GLSetup: Record "General Ledger Setup";
CurrExchRate: Record "Currency Exchange Rate";
AnalysisViewBudgetEntry: Record "Analysis View Budget Entry";
MaxDate: Date;
CurrExchDate: Date;
NoOfRows: Integer;
AddRepCurrAmount: Decimal;
begin
AnalysisViewBudgetEntry.SetFilter("Analysis View Code", AnalysisView.Code);
AnalysisViewBudgetEntry.SetFilter("Posting Date", AnalysisByDimParameters."Date Filter");
if (AnalysisByDimParameters."Date Filter" <> '') and (AnalysisByDimParameters."Amount Type" = "Analysis Amount Type"::"Balance at Date") then begin
MaxDate := AnalysisViewBudgetEntry.GetRangeMax(AnalysisViewBudgetEntry."Posting Date");
AnalysisViewBudgetEntry.SetFilter("Posting Date", '<= %1', MaxDate);
end;
AnalysisViewBudgetEntry.SetFilter("G/L Account No.", AnalysisByDimParameters."Account Filter");
AnalysisViewBudgetEntry.SetFilter("Business Unit Code", AnalysisByDimParameters."Bus. Unit Filter");
AnalysisViewBudgetEntry.SetFilter("Budget Name", AnalysisByDimParameters."Budget Filter");
AnalysisViewBudgetEntry.SetFilter("Dimension 1 Value Code", AnalysisByDimParameters."Dimension 1 Filter");
AnalysisViewBudgetEntry.SetFilter("Dimension 2 Value Code", AnalysisByDimParameters."Dimension 2 Filter");
AnalysisViewBudgetEntry.SetFilter("Dimension 3 Value Code", AnalysisByDimParameters."Dimension 3 Filter");
AnalysisViewBudgetEntry.SetFilter("Dimension 4 Value Code", AnalysisByDimParameters."Dimension 4 Filter");
if AnalysisViewBudgetEntry.FindSet() then
repeat
if (AnalysisByDimParameters."Closing Entries" = 1) or (AnalysisViewBudgetEntry."Posting Date" = NormalDate(AnalysisViewBudgetEntry."Posting Date")) then begin
if AnalysisViewBudgetEntry."Posting Date" >= EndDate then
EndDate := AnalysisViewBudgetEntry."Posting Date";
if (AnalysisViewBudgetEntry."Posting Date" <= StartDate) or (StartDate = 0D) then
StartDate := AnalysisViewBudgetEntry."Posting Date";
NoOfRows := NoOfRows + 1;
if TempGLAcc2.Get(AnalysisViewBudgetEntry."G/L Account No.") then
TempGLAcc2.Mark(true);
FillOutGLAcc(AnalysisViewBudgetEntry."G/L Account No.", AnalysisByDimParameters."Show Column Name");
if HasBusinessUnits then
FillOutBusUnit(AnalysisViewBudgetEntry."Business Unit Code", AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 1 Code" <> '' then
FillOutDim(AnalysisViewBudgetEntry."Dimension 1 Value Code", AnalysisView."Dimension 1 Code", 1, AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 2 Code" <> '' then
FillOutDim(AnalysisViewBudgetEntry."Dimension 2 Value Code", AnalysisView."Dimension 2 Code", 2, AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 3 Code" <> '' then
FillOutDim(AnalysisViewBudgetEntry."Dimension 3 Value Code", AnalysisView."Dimension 3 Code", 3, AnalysisByDimParameters."Show Column Name");
if AnalysisView."Dimension 4 Code" <> '' then
FillOutDim(AnalysisViewBudgetEntry."Dimension 4 Value Code", AnalysisView."Dimension 4 Code", 4, AnalysisByDimParameters."Show Column Name");
if not AnalysisByDimParameters."Show In Add. Currency" then begin
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), -1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 0));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 2));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 3));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 4));
FillNextCellInRow('');
FillNextCellInRow('');
FillNextCellInRow('');
FillNextCellInRow(AnalysisViewBudgetEntry.Amount * SignValue);
end else begin
if AnalysisViewBudgetEntry.GetFilter(AnalysisViewBudgetEntry."Posting Date") = '' then
CurrExchDate := WorkDate()
else
CurrExchDate := AnalysisViewBudgetEntry.GetRangeMin(AnalysisViewBudgetEntry."Posting Date");
GLSetup.Get();
if AnalysisByDimParameters."Show In Add. Currency" and Currency.Get(GLSetup."Additional Reporting Currency") then
AddRepCurrAmount :=
Round(
CurrExchRate.ExchangeAmtLCYToFCY(
CurrExchDate, GLSetup."Additional Reporting Currency", AnalysisViewBudgetEntry.Amount,
CurrExchRate.ExchangeRate(
CurrExchDate, GLSetup."Additional Reporting Currency")) * SignValue,
Currency."Amount Rounding Precision")
else
AddRepCurrAmount :=
Round(
CurrExchRate.ExchangeAmtLCYToFCY(
CurrExchDate, GLSetup."Additional Reporting Currency", AnalysisViewBudgetEntry.Amount,
CurrExchRate.ExchangeRate(
CurrExchDate, GLSetup."Additional Reporting Currency")) * SignValue,
GLSetup."Amount Rounding Precision");
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), -1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 0));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 1));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 2));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 3));
FillNextCellInRow(CalculatePeriodStart(NormalDate(AnalysisViewBudgetEntry."Posting Date"), 4));
FillNextCellInRow('');
FillNextCellInRow('');
FillNextCellInRow('');
FillNextCellInRow(AddRepCurrAmount);
end;
StartNewRow();
end;
until AnalysisViewBudgetEntry.Next() = 0;
end;
local procedure CalculatePeriodStart(PostingDate: Date; DateCompression: Integer): Date
var
AccountingPeriod: Record "Accounting Period";
PrevPostingDate: Date;
PrevCalculatedPostingDate: Date;
begin
if PostingDate = ClosingDate(PostingDate) then
exit(PostingDate);
PrevPostingDate := 0D;
case DateCompression of
0:
// Week :
PostingDate := CalcDate('<CW+1D-1W>', PostingDate);
1:
// Month :
PostingDate := CalcDate('<CM+1D-1M>', PostingDate);
2:
// Quarter :
PostingDate := CalcDate('<CQ+1D-1Q>', PostingDate);
3:
// Year :
PostingDate := CalcDate('<CY+1D-1Y>', PostingDate);
4:
// Period :
begin
if PostingDate <> PrevPostingDate then begin
PrevPostingDate := PostingDate;
AccountingPeriod.SetRange("Starting Date", 0D, PostingDate);
if AccountingPeriod.FindLast() then
PrevCalculatedPostingDate := AccountingPeriod."Starting Date"
else
PrevCalculatedPostingDate := PostingDate;
end;
PostingDate := PrevCalculatedPostingDate;
end;
end;
exit(PostingDate);
end;
local procedure CreateFillGeneralInfoSheet(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
var
GLSetup: Record "General Ledger Setup";
AnalysisView: Record "Analysis View";
AnalysisViewFilter: Record "Analysis View Filter";
RowNoCount: Integer;
begin
TempExcelBuffer.Reset();
TempExcelBuffer.DeleteAll();
FillCell(1, 1, AnalysisView.TableCaption());
FillCell(2, 2, AnalysisViewEntry.FieldCaption("Analysis View Code"));
FillCell(2, 3, AnalysisViewEntry."Analysis View Code");
FillCell(3, 2, Text023);
AnalysisView.Get(AnalysisByDimParameters."Analysis View Code");
FillCell(3, 3, AnalysisView.Name);
RowNoCount := 3;
if AnalysisView."Account Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView.FieldCaption("Account Filter"));
FillCell(RowNoCount, 3, AnalysisView."Account Filter");
end;
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView.FieldCaption("Date Compression"));
case AnalysisView."Date Compression" of
0:
FillCell(RowNoCount, 3, Text003);
1:
FillCell(RowNoCount, 3, Text004);
2:
FillCell(RowNoCount, 3, Text005);
3:
FillCell(RowNoCount, 3, Text006);
4:
FillCell(RowNoCount, 3, Text007);
5:
FillCell(RowNoCount, 3, Text008);
6:
FillCell(RowNoCount, 3, Text009);
end;
if AnalysisView."Starting Date" <> 0D then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView.FieldCaption("Starting Date"));
FillCell(RowNoCount, 3, AnalysisView."Starting Date");
end;
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView.FieldCaption("Last Date Updated"));
FillCell(RowNoCount, 3, AnalysisView."Last Date Updated");
AnalysisViewFilter.SetRange("Analysis View Code", AnalysisViewEntry."Analysis View Code");
if AnalysisViewFilter.FindSet() then
repeat
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisViewFilter."Dimension Code");
FillCell(RowNoCount, 3, AnalysisViewFilter."Dimension Value Filter");
until AnalysisViewFilter.Next() = 0;
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 1, Text011);
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text012);
case AnalysisByDimParameters."Amount Type" of
"Analysis Amount Type"::"Net Change":
FillCell(RowNoCount, 3, Text013);
"Analysis Amount Type"::"Balance at Date":
FillCell(RowNoCount, 3, Text014);
end;
if AnalysisByDimParameters."Date Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text015);
FillCell(RowNoCount, 3, AnalysisByDimParameters."Date Filter");
end;
if AnalysisByDimParameters."Account Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView.FieldCaption("Account Filter"));
FillCell(RowNoCount, 3, AnalysisByDimParameters."Account Filter");
end;
if AnalysisByDimParameters."Budget Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text016);
FillCell(RowNoCount, 3, AnalysisByDimParameters."Budget Filter");
end;
if AnalysisByDimParameters."Cash Flow Forecast Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text116);
FillCell(RowNoCount, 3, AnalysisByDimParameters."Cash Flow Forecast Filter");
end;
if AnalysisByDimParameters."Dimension 1 Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView."Dimension 1 Code");
FillCell(RowNoCount, 3, AnalysisByDimParameters."Dimension 1 Filter");
end;
if AnalysisByDimParameters."Dimension 2 Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView."Dimension 2 Code");
FillCell(RowNoCount, 3, AnalysisByDimParameters."Dimension 2 Filter");
end;
if AnalysisByDimParameters."Dimension 3 Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView."Dimension 3 Code");
FillCell(RowNoCount, 3, AnalysisByDimParameters."Dimension 3 Filter");
end;
if AnalysisByDimParameters."Dimension 4 Filter" <> '' then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, AnalysisView."Dimension 4 Code");
FillCell(RowNoCount, 3, AnalysisByDimParameters."Dimension 4 Filter");
end;
if GLAccountSource then begin
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text024);
case AnalysisByDimParameters."Closing Entries" of
0:
FillCell(RowNoCount, 3, Text025);
1:
FillCell(RowNoCount, 3, Text026);
end;
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text027);
GLSetup.Get();
if AnalysisByDimParameters."Show In Add. Currency" then
FillCell(RowNoCount, 3, GLSetup."Additional Reporting Currency")
else
FillCell(RowNoCount, 3, GLSetup."LCY Code");
end;
RowNoCount := RowNoCount + 1;
FillCell(RowNoCount, 2, Text028);
if AnalysisByDimParameters."Show Opposite Sign" then
FillCell(RowNoCount, 3, Text029)
else
FillCell(RowNoCount, 3, Text030);
end;
local procedure CreateRowWithColumnsCaptions(AnalysisViewEntry: Record "Analysis View Entry"; AnalysisView: Record "Analysis View")
var
i: Integer;
begin
for i := 0 to MaxLevel do begin
NoOfColumns := NoOfColumns + 1;
FillCell(1, NoOfColumns, GetPivotFieldAccountIndexValue(i));
end;
if HasBusinessUnits then begin
NoOfColumns := NoOfColumns + 1;
FillCell(1, NoOfColumns, BusUnit.TableCaption());
end;
if AnalysisView."Dimension 1 Code" <> '' then
for i := 0 to MaxLevelDim[1] do begin
NoOfColumns := NoOfColumns + 1;
FillCell(1, NoOfColumns, AnalysisView."Dimension 1 Code" + ' ' + Format(Text022) + ' ' + Format(i));
end;
if AnalysisView."Dimension 2 Code" <> '' then
for i := 0 to MaxLevelDim[2] do begin
NoOfColumns := NoOfColumns + 1;
FillCell(1, NoOfColumns, AnalysisView."Dimension 2 Code" + ' ' + Format(Text022) + ' ' + Format(i));
end;
if AnalysisView."Dimension 3 Code" <> '' then
for i := 0 to MaxLevelDim[3] do begin
NoOfColumns := NoOfColumns + 1;
FillCell(1, NoOfColumns, AnalysisView."Dimension 3 Code" + ' ' + Format(Text022) + ' ' + Format(i));
end;
if AnalysisView."Dimension 4 Code" <> '' then
for i := 0 to MaxLevelDim[4] do begin
NoOfColumns := NoOfColumns + 1;
FillCell(1, NoOfColumns, AnalysisView."Dimension 4 Code" + ' ' + Format(Text022) + ' ' + Format(i));
end;
FillNextCellInRow(Text004);
FillNextCellInRow(Text005);
FillNextCellInRow(Text006);
FillNextCellInRow(Text007);
FillNextCellInRow(Text008);
FillNextCellInRow(Text009);
FillNextCellInRow(AnalysisViewEntry.FieldCaption(Amount));
FillNextCellInRow(AnalysisViewEntry.FieldCaption("Debit Amount"));
FillNextCellInRow(AnalysisViewEntry.FieldCaption("Credit Amount"));
FillNextCellInRow(Text020);
OnCreateRowWithColumnsCaptionsOnBeforeStartNewRow(TempExcelBuffer, AnalysisViewEntry);
StartNewRow();
end;
local procedure FindGLAccountParent(var Account: Code[20])
begin
TempGLAcc3.Get(Account);
if TempGLAcc3.Indentation <> 0 then begin
TempGLAcc3.SetRange(Indentation, TempGLAcc3.Indentation - 1);
TempGLAcc3.Next(-1);
end;
Account := TempGLAcc3."No.";
end;
local procedure FindCFAccountParent(var Account: Code[20])
begin
TempCFAccount3.Get(Account);
if TempCFAccount3.Indentation <> 0 then begin
TempCFAccount3.SetRange(Indentation, TempCFAccount3.Indentation - 1);
TempCFAccount3.Next(-1);
end;
Account := TempCFAccount3."No.";
end;
local procedure FindDimLevel(DimCode: Code[20]; DimFilter: Text; ArrayNo: Integer)
var
DimValue: Record "Dimension Value";
begin
if DimCode = '' then
exit;
DimValue.SetRange("Dimension Code", DimCode);
if DimValue.Find('-') then
repeat
TempDimValue2.Copy(DimValue);
TempDimValue2.Insert();
TempDimValue3.Copy(DimValue);
TempDimValue3.Insert();
until DimValue.Next() = 0;
TempDimValue2.SetFilter(Code, DimFilter);
if TempDimValue2.Find('-') then
repeat
if MaxLevelDim[ArrayNo] < TempDimValue2.Indentation then
MaxLevelDim[ArrayNo] := TempDimValue2.Indentation;
until TempDimValue2.Next() = 0;
end;
local procedure FindDimParent(var Account: Code[20]; DimensionCode: Code[20])
begin
TempDimValue3.Reset();
TempDimValue3.SetRange("Dimension Code", DimensionCode);
TempDimValue3.Get(DimensionCode, Account);
if TempDimValue3.Indentation <> 0 then begin
TempDimValue3.SetRange(Indentation, TempDimValue3.Indentation - 1);
TempDimValue3.Next(-1);
end;
Account := TempDimValue3.Code;
end;
local procedure FillOutDim(DimValueCode: Code[20]; DimCode: Code[20]; DimNo: Integer; ShowName: Boolean)
var
TempParentNameValueBuffer: Record "Name/Value Buffer" temporary;
DimensionValue: Record "Dimension Value";
Indent: Integer;
i: Integer;
DimValueCode2: Code[20];
begin
if DimValueCode <> '' then begin
if TempDimValue2.Get(DimCode, DimValueCode) then
TempDimValue2.Mark(true)
else
TempDimValue2.Init();
DimValueCode2 := DimValueCode;
Indent := TempDimValue2.Indentation;
if (Indent <> 0) and (DimValueCode2 <> '') then
for i := Indent downto 1 do begin
FindDimParent(DimValueCode2, DimCode);
TempDimValue2.Get(DimCode, DimValueCode2);
AddParentToBuffer(TempParentNameValueBuffer, i, TempDimValue2.Code, TempDimValue2.Name);
end;
if TempParentNameValueBuffer.FindSet() then
repeat
AddAcc(ShowName, TempParentNameValueBuffer.Name, TempParentNameValueBuffer.Value);
until TempParentNameValueBuffer.Next() = 0;
if DimensionValue.Get(DimCode, DimValueCode) then;
if DimensionValue.Indentation <> MaxLevelDim[DimNo] then
for i := DimensionValue.Indentation + 1 to MaxLevelDim[DimNo] do
AddAcc(ShowName, DimensionValue.Code, DimensionValue.Name);
AddAcc(ShowName, DimensionValue.Code, DimensionValue.Name);
end else
for i := 0 to MaxLevelDim[DimNo] do
AddAcc(false, '', '');
end;
local procedure FillOutGLAcc(GLAccNo: Code[20]; ShowName: Boolean)
var
GLAccount: Record "G/L Account";
TempParentNameValueBuffer: Record "Name/Value Buffer" temporary;
i: Integer;
Indent: Integer;
Account: Code[20];
begin
Account := GLAccNo;
TempGLAcc3.Get(Account);
TempGLAcc3.Mark(true);
Indent := TempGLAcc3.Indentation;
if Indent <> 0 then
for i := Indent downto 1 do begin
FindGLAccountParent(Account);
TempGLAcc3.Get(Account);
AddParentToBuffer(TempParentNameValueBuffer, i, TempGLAcc3."No.", TempGLAcc3.Name);
end;
if TempParentNameValueBuffer.FindSet() then
repeat
AddAcc(ShowName, TempParentNameValueBuffer.Name, TempParentNameValueBuffer.Value);
until TempParentNameValueBuffer.Next() = 0;
GLAccount.Get(GLAccNo);
if GLAccount.Indentation <> MaxLevel then
for i := GLAccount.Indentation + 1 to MaxLevel do
AddAcc(ShowName, GLAccount."No.", GLAccount.Name);
AddAcc(ShowName, GLAccount."No.", GLAccount.Name);
end;
local procedure FillOutCFAccount(CFAccNo: Code[20]; ShowName: Boolean)
var
CashFlowAccount: Record "Cash Flow Account";
TempParentNameValueBuffer: Record "Name/Value Buffer" temporary;
i: Integer;
Indent: Integer;
Account: Code[20];
begin
Account := CFAccNo;
TempCFAccount3.Get(Account);
TempCFAccount3.Mark(true);
Indent := TempCFAccount2.Indentation;
if Indent <> 0 then
for i := Indent downto 1 do begin
FindCFAccountParent(Account);
TempCFAccount3.Get(Account);
AddParentToBuffer(TempParentNameValueBuffer, i, TempCFAccount3."No.", TempCFAccount3.Name);
end;
if TempParentNameValueBuffer.FindSet() then
repeat
AddAcc(ShowName, TempParentNameValueBuffer.Name, TempParentNameValueBuffer.Value);
until TempParentNameValueBuffer.Next() = 0;
CashFlowAccount.Get(CFAccNo);
if CashFlowAccount.Indentation <> MaxLevel then
for i := CashFlowAccount.Indentation + 1 to MaxLevel do
AddAcc(ShowName, CashFlowAccount."No.", CashFlowAccount.Name);
AddAcc(ShowName, CashFlowAccount."No.", CashFlowAccount.Name);
end;
local procedure FillOutBusUnit(BusUnitCode: Code[20]; ShowName: Boolean)
begin
if BusUnitCode <> '' then begin
BusUnit.Get(BusUnitCode);
BusUnit.Mark(true);
AddAcc(ShowName, BusUnit.Code, BusUnit.Name);
end else
AddAcc(false, '', '');
end;
local procedure FillCell(RowNo: Integer; ColumnNo: Integer; Value: Variant)
begin
TempExcelBuffer.Init();
TempExcelBuffer.Validate("Row No.", RowNo);
TempExcelBuffer.Validate("Column No.", ColumnNo);
case true of
Value.IsDecimal or Value.IsInteger:
TempExcelBuffer.Validate("Cell Type", TempExcelBuffer."Cell Type"::Number);
Value.IsDate:
TempExcelBuffer.Validate("Cell Type", TempExcelBuffer."Cell Type"::Date);
else
TempExcelBuffer.Validate("Cell Type", TempExcelBuffer."Cell Type"::Text);
end;
TempExcelBuffer."Cell Value as Text" := CopyStr(Format(Value), 1, MaxStrLen(TempExcelBuffer."Cell Value as Text"));
TempExcelBuffer.Insert();
end;
local procedure FillNextCellInRow(Value: Variant)
var
RowNo: Integer;
ColumnNo: Integer;
begin
RowNo := TempExcelBuffer."Row No.";
ColumnNo := TempExcelBuffer."Column No." + 1;
TempExcelBuffer.Init();
TempExcelBuffer.Validate("Row No.", RowNo);
TempExcelBuffer.Validate("Column No.", ColumnNo);
case true of
Value.IsDecimal or Value.IsInteger:
TempExcelBuffer.Validate("Cell Type", TempExcelBuffer."Cell Type"::Number);
Value.IsDate:
TempExcelBuffer.Validate("Cell Type", TempExcelBuffer."Cell Type"::Date);
else
TempExcelBuffer.Validate("Cell Type", TempExcelBuffer."Cell Type"::Text);
end;
TempExcelBuffer."Cell Value as Text" := CopyStr(Format(Value), 1, MaxStrLen(TempExcelBuffer."Cell Value as Text"));
TempExcelBuffer.Insert();
end;
local procedure StartNewRow()
var
RowNo: Integer;
begin
RowNo := TempExcelBuffer."Row No." + 1;
TempExcelBuffer.Init();
TempExcelBuffer.Validate("Row No.", RowNo);
TempExcelBuffer.Validate("Column No.", 0);
end;
local procedure SetStartColumnNo(ColumntNo: Integer)
begin
TempExcelBuffer."Column No." := ColumntNo;
end;
local procedure AddAcc(ShowName: Boolean; Account: Text; AccName: Text)
var
CellValueAsText: Text;
begin
if Account = '' then
CellValueAsText := ''
else
if ShowName then
CellValueAsText := Account + ' ' + AccName
else
CellValueAsText := Account;
FillNextCellInRow(CellValueAsText);
end;
local procedure AddParentToBuffer(var NameValueBuffer: Record "Name/Value Buffer"; id: Integer; AccountNumber: Text[250]; AccountName: Text[250])
begin
NameValueBuffer.Init();
NameValueBuffer.ID := id;
NameValueBuffer.Name := AccountNumber;
NameValueBuffer.Value := AccountName;
NameValueBuffer.Insert();
end;
local procedure GetPivotFieldAccountIndexValue(Level: Integer): Text[250]
begin
if GLAccountSource then
exit(Format(Text018) + ' ' + Format(Text022) + ' ' + Format(Level));
exit(Format(Text118) + ' ' + Format(Text022) + ' ' + Format(Level));
end;
local procedure CheckCombination(Show: Enum "Analysis Show Amount Type"; AmountField: Enum "Analysis Show Amount Field")
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeCheckCombination(GLAccountSource, Show.AsInteger(), AmountField.AsInteger(), IsHandled);
if IsHandled then
exit;
if not GLAccountSource then
exit;
if (Show <> "Analysis Show Amount Type"::"Actual Amounts") and (Show <> "Analysis Show Amount Type"::"Budgeted Amounts") then
Error(Text000);
if (Show = "Analysis Show Amount Type"::"Budgeted Amounts") and (AmountField <> "Analysis Show Amount Field"::Amount) then
Error(Text001);
end;
local procedure SetOtherFilterToCorrectFilter(DraftFilter: Text; var BusUnitFilter: Text; var CashFlowFilter: Text)
begin
if GLAccountSource then
BusUnitFilter := DraftFilter
else
CashFlowFilter := DraftFilter;
end;
local procedure PopulateTempAccountTable(AccFilter: Text)
var
GLAcc: Record "G/L Account";
CFAccount: Record "Cash Flow Account";
begin
if GLAccountSource then begin
if GLAcc.Find('-') then
repeat
TempGLAcc3.Copy(GLAcc);
TempGLAcc3.Insert();
until GLAcc.Next() = 0;
TempGLAcc3.SetFilter("No.", AccFilter);
if TempGLAcc3.Find('-') then
repeat
TempGLAcc2.Copy(TempGLAcc3);
TempGLAcc2.Insert();
if MaxLevel < TempGLAcc2.Indentation then
MaxLevel := TempGLAcc2.Indentation;
until TempGLAcc3.Next() = 0;
TempGLAcc3.SetRange("No.");
end else begin
if CFAccount.Find('-') then
repeat
TempCFAccount3.Copy(CFAccount);
TempCFAccount3.Insert();
until CFAccount.Next() = 0;
TempCFAccount3.SetFilter("No.", AccFilter);
if TempCFAccount3.Find('-') then
repeat
TempCFAccount2.Copy(TempCFAccount3);
TempCFAccount2.Insert();
if MaxLevel < TempCFAccount2.Indentation then
MaxLevel := TempCFAccount2.Indentation;
until TempCFAccount3.Next() = 0;
TempCFAccount3.SetRange("No.");
end;
end;
local procedure ProcessMarkedTempCFAccountRec(ShowName: Boolean)
begin
repeat
if not TempCFAccount2.Mark() then begin
FillOutCFAccount(TempCFAccount2."No.", ShowName);
StartNewRow();
end;
until TempCFAccount2.Next() = 0;
end;
local procedure WriteDimLine(DimNo: Integer; DimFilter: Text; DimCode: Code[20]; NoOfLeadingColumns: Integer; ShowName: Boolean)
begin
SetStartColumnNo(NoOfLeadingColumns);
TempDimValue2.SetFilter(Code, DimFilter);
TempDimValue2.SetFilter("Dimension Code", DimCode);
TempDimValue2.SetRange("Dimension Value Type", TempDimValue2."Dimension Value Type"::Standard);
if TempDimValue2.Find('-') then
repeat
if not TempDimValue2.Mark() then begin
FillOutDim(TempDimValue2.Code, DimCode, DimNo, ShowName);
StartNewRow();
SetStartColumnNo(NoOfLeadingColumns);
end;
until TempDimValue2.Next() = 0;
end;
/// <summary>
/// Retrieves the server file name for the exported analysis view file.
/// Returns the full server path and filename of the generated Excel export file.
/// </summary>
/// <returns>Server file path and name of the exported analysis view Excel file</returns>
procedure GetServerFileName(): Text
begin
exit(ServerFileName);
end;
/// <summary>
/// Configures the export process to skip automatic file download after generation.
/// Sets the process to generate the Excel file without triggering browser download dialog.
/// </summary>
procedure SetSkipDownload()
begin
SkipDownload := true;
end;
/// <summary>
/// Integration event raised after completing analysis view data export to Excel buffer.
/// Enables custom post-processing of Excel data before file generation and download.
/// </summary>
/// <param name="varTempExcelBuffer">Temporary Excel Buffer record containing exported data</param>
/// <param name="AnalysisViewEntry">Analysis View Entry record used for export</param>
[IntegrationEvent(false, false)]
local procedure OnAfterExportData(var varTempExcelBuffer: Record "Excel Buffer" temporary; var AnalysisViewEntry: Record "Analysis View Entry")
begin
end;
/// <summary>
/// Integration event raised before starting a new row when creating analysis view entry data part.
/// Enables custom row formatting and data manipulation during Excel export generation.
/// </summary>
/// <param name="TempExcelBuffer">Temporary Excel Buffer record for row creation</param>
/// <param name="AnalysisViewEntry">Analysis View Entry record being processed</param>
/// <param name="AnalysisByDimParameters">Analysis parameters affecting export format</param>
[IntegrationEvent(false, false)]
local procedure OnCreateAnalysisViewEntryPartOnBeforeStartNewRow(var TempExcelBuffer: Record "Excel Buffer" temporary; var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
begin
end;
/// <summary>
/// Integration event raised before starting a new row when creating column captions.
/// Enables custom header formatting and caption manipulation during Excel export generation.
/// </summary>
/// <param name="TempExcelBuffer">Temporary Excel Buffer record for row creation</param>
/// <param name="AnalysisViewEntry">Analysis View Entry record being processed</param>
[IntegrationEvent(false, false)]
local procedure OnCreateRowWithColumnsCaptionsOnBeforeStartNewRow(var TempExcelBuffer: Record "Excel Buffer" temporary; var AnalysisViewEntry: Record "Analysis View Entry")
begin
end;
/// <summary>
/// Integration event raised after closing the Excel workbook during data export.
/// Enables final workbook customization and post-processing before file completion.
/// </summary>
/// <param name="TempExcelBuffer">Temporary Excel Buffer record containing completed workbook</param>
/// <param name="AnalysisViewEntry">Analysis View Entry record used for export</param>
/// <param name="AnalysisByDimParameters">Analysis parameters used in export generation</param>
[IntegrationEvent(false, false)]
local procedure OnExportDataOnAfterCloseBook(var TempExcelBuffer: Record "Excel Buffer" temporary; var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisByDimParameters: Record "Analysis by Dim. Parameters")
begin
end;
/// <summary>
/// Integration event raised before checking combination validity for export settings.
/// Enables custom validation logic for analysis view export parameter combinations.
/// </summary>
/// <param name="GLAccountSource">Boolean indicating G/L Account as data source</param>
/// <param name="Show">Show field option for display configuration</param>
/// <param name="AmountField">Amount field type for export</param>
/// <param name="IsHandled">Set to true to skip standard combination validation</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckCombination(GLAccountSource: Boolean; Show: Integer; AmountField: Integer; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Integration event raised before creating analysis view entry part during export generation.
/// Enables custom date filtering and entry selection logic for analysis view export processing.
/// </summary>
/// <param name="AnalysisViewEntry">Analysis View Entry record being processed</param>
/// <param name="AnalysisView">Analysis View record containing configuration</param>
/// <param name="StartDate">Start date for analysis period, available for modification</param>
/// <param name="EndDate">End date for analysis period, available for modification</param>
/// <param name="AnalysisByDimParameters">Analysis parameters affecting export</param>
/// <param name="IsHandled">Set to true to skip standard entry part creation</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeCreateAnalysisViewEntryPart(var AnalysisViewEntry: Record "Analysis View Entry"; AnalysisView: Record "Analysis View"; var StartDate: Date; var EndDate: Date; AnalysisByDimParameters: Record "Analysis by Dim. Parameters"; var IsHandled: Boolean)
begin
end;
}