Page 7117 Sales Analysis Report, source in 29
Source29
src/Layers/W1/BaseApp/Sales/Analysis/SalesAnalysisReport.Page.al634 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.Sales.Analysis;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.Period;
using Microsoft.Inventory.Analysis;
using System.Utilities;
/// <summary>
/// Provides configuration and display of sales analysis reports with line and column templates.
/// </summary>
page 7117 "Sales Analysis Report"
{
Caption = 'Sales Analysis Report';
DataCaptionExpression = GetCaption();
DeleteAllowed = false;
InsertAllowed = false;
LinksAllowed = false;
PageType = Card;
SaveValues = true;
SourceTable = "Analysis Line";
SourceTableView = where("Analysis Area" = const(Sales));
layout
{
area(content)
{
group(General)
{
Caption = 'General';
field(CurrentReportName; CurrentReportName)
{
ApplicationArea = SalesAnalysis;
Caption = 'Analysis Report Name';
ToolTip = 'Specifies the name of the analysis report.';
trigger OnLookup(var Text: Text): Boolean
begin
CurrentAnalysisAreaType := Rec.GetRangeMax("Analysis Area");
if AnalysisReportMgt.LookupAnalysisReportName(CurrentAnalysisAreaType, CurrentReportName) then begin
Text := CurrentReportName;
CurrentReportNameOnAfterValidate();
exit(true);
end;
end;
trigger OnValidate()
begin
AnalysisReportMgt.CheckReportName(CurrentReportName, Rec);
CurrentReportNameOnAfterValidate();
end;
}
field(CurrentLineTemplate; CurrentLineTemplate)
{
ApplicationArea = SalesAnalysis;
Caption = 'Analysis Line Template';
ToolTip = 'Specifies the line template that is used for the analysis view.';
trigger OnLookup(var Text: Text): Boolean
begin
CurrPage.SaveRecord();
AnalysisReportMgt.LookupAnalysisLineTemplName(CurrentLineTemplate, Rec);
ValidateAnalysisTemplateName();
CurrPage.Update(false);
end;
trigger OnValidate()
begin
AnalysisReportMgt.CheckAnalysisLineTemplName(CurrentLineTemplate, Rec);
CurrentLineTemplateOnAfterValidate();
end;
}
field(CurrentColumnTemplate; CurrentColumnTemplate)
{
ApplicationArea = SalesAnalysis;
Caption = 'Analysis Column Template';
ToolTip = 'Specifies the column template that is used for the analysis view.';
trigger OnLookup(var Text: Text): Boolean
begin
CurrentAnalysisAreaType := Rec.GetRangeMax("Analysis Area");
if AnalysisReportMgt.LookupAnalysisColumnName(CurrentAnalysisAreaType, CurrentColumnTemplate) then begin
Text := CurrentColumnTemplate;
CurrentColumnTemplateOnAfterValidate();
exit(true);
end;
end;
trigger OnValidate()
begin
CurrentAnalysisAreaType := Rec.GetRangeMax("Analysis Area");
AnalysisReportMgt.GetColumnTemplate(CurrentAnalysisAreaType.AsInteger(), CurrentColumnTemplate);
CurrentColumnTemplateOnAfterValidate();
end;
}
}
group(Filters)
{
Caption = 'Filters';
field(CurrentSourceTypeFilter; CurrentSourceTypeFilter)
{
ApplicationArea = SalesAnalysis;
Caption = 'Source Type Filter';
ToolTip = 'Specifies filters for what is shown in the analysis view.';
trigger OnValidate()
begin
Rec.SetRange("Source Type Filter", CurrentSourceTypeFilter);
CurrentSourceTypeNoFilter := '';
AnalysisReportMgt.SetSourceNo(Rec, CurrentSourceTypeNoFilter);
CurrentSourceTypeFilterOnAfterValidate();
end;
}
field(CurrentSourceTypeNoFilter; CurrentSourceTypeNoFilter)
{
ApplicationArea = SalesAnalysis;
Caption = 'Source No. Filter';
ToolTip = 'Specifies filters for what is shown in the analysis view.';
trigger OnLookup(var Text: Text): Boolean
begin
AnalysisReportMgt.DoLookupSourceNo(Rec, CurrentSourceTypeFilter, CurrentSourceTypeNoFilter);
CurrPage.Update(false);
end;
trigger OnValidate()
begin
CurrentSourceTypeNoFilterOnAfterValidate();
end;
}
}
group("Matrix Options")
{
Caption = 'Matrix Options';
field(PeriodType; PeriodType)
{
ApplicationArea = SalesAnalysis;
Caption = 'View by';
ToolTip = 'Specifies by which period amounts are displayed.';
trigger OnValidate()
begin
FindPeriod('');
end;
}
field(ColumnsSet; GetColumnsRangeFilter())
{
ApplicationArea = SalesAnalysis;
Caption = 'Column Set';
ToolTip = 'Specifies the range of values that are displayed in the matrix window, for example, the total period. To change the contents of the field, choose Next Set or Previous Set.';
}
}
}
}
actions
{
area(navigation)
{
group("&Actions")
{
Caption = '&Actions';
Image = "Action";
action("Set Up &Lines")
{
ApplicationArea = SalesAnalysis;
Caption = 'Set Up &Lines';
Ellipsis = true;
Image = SetupLines;
ToolTip = 'Open the list of analysis lines that exist for this type of analysis report, for example to set up new lines that you can select from.';
trigger OnAction()
begin
AnalysisReportMgt.OpenAnalysisLinesForm(Rec, CurrentLineTemplate);
CurrPage.Update(false);
end;
}
action("Set Up &Columns")
{
ApplicationArea = SalesAnalysis;
Caption = 'Set Up &Columns';
Ellipsis = true;
Image = SetupColumns;
ToolTip = 'Open the list of analysis columns that exist for this type of analysis report, for example to set up new columns that you can select from.';
trigger OnAction()
begin
AnalysisReportMgt.OpenAnalysisColumnsForm(Rec, CurrentColumnTemplate);
CurrPage.Update(false);
end;
}
separator(Action19)
{
}
group("Export to Excel")
{
Caption = 'Export to Excel';
Image = ExportToExcel;
action("Create New Document")
{
ApplicationArea = SalesAnalysis;
Caption = 'Create New Document';
Image = ExportToExcel;
ToolTip = 'Open the analysis report in a new Excel workbook. This creates an Excel workbook on your device.';
trigger OnAction()
var
ExportAnalysisRepToExcel: Report "Export Analysis Rep. to Excel";
begin
ExportAnalysisRepToExcel.SetOptions(Rec, CurrentColumnTemplate, CurrentLineTemplate);
ExportAnalysisRepToExcel.Run();
end;
}
action("Update Existing Document")
{
ApplicationArea = SalesAnalysis;
Caption = 'Update Existing Document';
Image = ExportToExcel;
ToolTip = 'Refresh the analysis report in an existing Excel workbook. You must specify the workbook that you want to update.';
trigger OnAction()
var
ExportAnalysisRepToExcel: Report "Export Analysis Rep. to Excel";
begin
ExportAnalysisRepToExcel.SetOptions(Rec, CurrentColumnTemplate, CurrentLineTemplate);
ExportAnalysisRepToExcel.SetUpdateExistingWorksheet(true);
ExportAnalysisRepToExcel.Run();
end;
}
}
}
group("&Reports")
{
Caption = '&Reports';
Image = "Report";
action(Print)
{
ApplicationArea = SalesAnalysis;
Caption = 'Print';
Ellipsis = true;
Image = Print;
ToolTip = 'Print the information in the window. A print request window opens where you can specify what to include on the print-out.';
trigger OnAction()
var
AnalysisReport: Report "Analysis Report";
DateFilter: Text;
ItemBudgetFilter: Text;
LocationFilter: Text;
Dim1Filter: Text;
Dim2Filter: Text;
Dim3Filter: Text;
begin
CurrentAnalysisAreaType := Rec.GetRangeMax("Analysis Area");
AnalysisReport.SetParameters(CurrentAnalysisAreaType, CurrentReportName, CurrentLineTemplate, CurrentColumnTemplate);
DateFilter := Rec.GetFilter("Date Filter");
ItemBudgetFilter := Rec.GetFilter("Item Budget Filter");
LocationFilter := Rec.GetFilter("Location Filter");
Dim1Filter := Rec.GetFilter("Dimension 1 Filter");
Dim2Filter := Rec.GetFilter("Dimension 2 Filter");
Dim3Filter := Rec.GetFilter("Dimension 3 Filter");
AnalysisReport.SetFilters(
DateFilter, ItemBudgetFilter, LocationFilter, Dim1Filter, Dim2Filter, Dim3Filter,
CurrentSourceTypeFilter.AsInteger(), CurrentSourceTypeNoFilter);
AnalysisReport.Run();
end;
}
}
}
area(processing)
{
action(ShowMatrix)
{
ApplicationArea = SalesAnalysis;
Caption = '&Show Matrix';
Image = ShowMatrix;
ToolTip = 'View the actual analysis report according to the selected filters and options.';
trigger OnAction()
begin
SetFilters();
Clear(MatrixColumnCaptions);
FillMatrixColumns();
Clear(SalesAnalysisMatrix);
SalesAnalysisMatrix.Load(TempAnalysisColumn, MatrixColumnCaptions, FirstLineNo, LastLineNo);
SalesAnalysisMatrix.SetTableView(AnalysisLine);
SalesAnalysisMatrix.Run();
end;
}
action("Previous Set")
{
ApplicationArea = SalesAnalysis;
Caption = 'Previous Set';
Image = PreviousSet;
ToolTip = 'Go to the previous set of data.';
trigger OnAction()
begin
Direction := Direction::Backward;
SetPointsAnalysisColumn();
end;
}
action("Next Set")
{
ApplicationArea = SalesAnalysis;
Caption = 'Next Set';
Image = NextSet;
ToolTip = 'Go to the next set of data.';
trigger OnAction()
begin
Direction := Direction::Forward;
SetPointsAnalysisColumn();
end;
}
}
area(Promoted)
{
group(Category_Process)
{
Caption = 'Process';
actionref("Previous Set_Promoted"; "Previous Set")
{
}
actionref(ShowMatrix_Promoted; ShowMatrix)
{
}
actionref("Next Set_Promoted"; "Next Set")
{
}
actionref(Print_Promoted; Print)
{
}
}
group(Category_Analysis)
{
Caption = 'Analysis';
actionref("Set Up &Columns_Promoted"; "Set Up &Columns")
{
}
actionref("Set Up &Lines_Promoted"; "Set Up &Lines")
{
}
}
}
}
trigger OnOpenPage()
var
AnalysisLineTemplate: Record "Analysis Line Template";
begin
if (NewCurrentReportName <> '') and (NewCurrentReportName <> CurrentReportName) then begin
CurrentReportName := NewCurrentReportName;
AnalysisReportMgt.CheckReportName(CurrentReportName, Rec);
ValidateReportName();
AnalysisReportMgt.SetAnalysisLineTemplName(CurrentLineTemplate, Rec);
ValidateAnalysisTemplateName();
end;
AnalysisReportMgt.OpenAnalysisLines(CurrentLineTemplate, Rec);
AnalysisReportMgt.OpenColumns(CurrentColumnTemplate, Rec, TempAnalysisColumn);
AnalysisReportMgt.CopyColumnsToTemp(Rec, CurrentColumnTemplate, TempAnalysisColumn);
AnalysisReportMgt.SetSourceType(Rec, CurrentSourceTypeFilter.AsInteger());
AnalysisReportMgt.SetSourceNo(Rec, CurrentSourceTypeNoFilter);
GLSetup.Get();
if AnalysisLineTemplate.Get(Rec.GetRangeMax("Analysis Area"), CurrentLineTemplate) then
if AnalysisLineTemplate."Item Analysis View Code" <> '' then
ItemAnalysisView.Get(Rec.GetRangeMax("Analysis Area"), AnalysisLineTemplate."Item Analysis View Code")
else begin
Clear(ItemAnalysisView);
ItemAnalysisView."Dimension 1 Code" := GLSetup."Global Dimension 1 Code";
ItemAnalysisView."Dimension 2 Code" := GLSetup."Global Dimension 2 Code";
end;
FindPeriod('');
NoOfColumns := SalesAnalysisMatrix.GetMatrixDimension();
Direction := Direction::Forward;
ClearPoints();
SetPointsAnalysisColumn();
end;
var
GLSetup: Record "General Ledger Setup";
TempAnalysisColumn: Record "Analysis Column" temporary;
AnalysisReportMgt: Codeunit "Analysis Report Management";
SalesAnalysisMatrix: Page "Sales Analysis Matrix";
NewCurrentReportName: Code[10];
PeriodType: Enum "Analysis Period Type";
Direction: Option Backward,Forward;
NoOfColumns: Integer;
FirstLineNo: Integer;
LastLineNo: Integer;
FirstColumn: Text[1024];
LastColumn: Text[1024];
MatrixColumnCaptions: array[32] of Text[1024];
protected var
ItemAnalysisView: Record "Item Analysis View";
AnalysisLine: Record "Analysis Line";
CurrentReportName: Code[10];
CurrentColumnTemplate: Code[10];
CurrentLineTemplate: Code[10];
CurrentSourceTypeNoFilter: Text;
CurrentSourceTypeFilter: Enum "Analysis Source Type";
CurrentAnalysisAreaType: Enum "Analysis Area Type";
local procedure FindPeriod(SearchText: Code[3])
var
Calendar: Record Date;
PeriodPageMgt: Codeunit PeriodPageManagement;
begin
if Rec.GetFilter("Date Filter") <> '' then begin
Calendar.SetFilter("Period Start", Rec.GetFilter("Date Filter"));
if not PeriodPageMgt.FindDate('+', Calendar, PeriodType) then
PeriodPageMgt.FindDate('+', Calendar, PeriodType::Day);
Calendar.SetRange("Period Start");
end;
PeriodPageMgt.FindDate(SearchText, Calendar, PeriodType);
Rec.SetRange("Date Filter", Calendar."Period Start", Calendar."Period End");
if Rec.GetRangeMin("Date Filter") = Rec.GetRangeMax("Date Filter") then
Rec.SetRange("Date Filter", Rec.GetRangeMin("Date Filter"));
end;
local procedure ValidateAnalysisTemplateName()
var
AnalysisLineTemplate: Record "Analysis Line Template";
PrevItemAnalysisView: Record "Item Analysis View";
begin
if AnalysisLineTemplate.Get(Rec.GetRangeMax("Analysis Area"), CurrentLineTemplate) then
if (AnalysisLineTemplate."Default Column Template Name" <> '') and
(CurrentColumnTemplate <> AnalysisLineTemplate."Default Column Template Name")
then begin
CurrentColumnTemplate := AnalysisLineTemplate."Default Column Template Name";
AnalysisReportMgt.OpenColumns(CurrentColumnTemplate, Rec, TempAnalysisColumn);
AnalysisReportMgt.CopyColumnsToTemp(Rec, CurrentColumnTemplate, TempAnalysisColumn);
end;
if AnalysisLineTemplate."Item Analysis View Code" <> ItemAnalysisView.Code then begin
PrevItemAnalysisView := ItemAnalysisView;
if AnalysisLineTemplate."Item Analysis View Code" <> '' then
ItemAnalysisView.Get(Rec.GetRangeMax("Analysis Area"), AnalysisLineTemplate."Item Analysis View Code")
else begin
Clear(ItemAnalysisView);
ItemAnalysisView."Dimension 1 Code" := GLSetup."Global Dimension 1 Code";
ItemAnalysisView."Dimension 2 Code" := GLSetup."Global Dimension 2 Code";
end;
if PrevItemAnalysisView."Dimension 1 Code" <> ItemAnalysisView."Dimension 1 Code" then
Rec.SetRange("Dimension 1 Filter");
if PrevItemAnalysisView."Dimension 2 Code" <> ItemAnalysisView."Dimension 2 Code" then
Rec.SetRange("Dimension 2 Filter");
if PrevItemAnalysisView."Dimension 3 Code" <> ItemAnalysisView."Dimension 3 Code" then
Rec.SetRange("Dimension 3 Filter");
end;
end;
local procedure ValidateReportName()
var
AnalysisReportName: Record "Analysis Report Name";
begin
if AnalysisReportName.Get(Rec.GetRangeMax("Analysis Area"), CurrentReportName) then begin
if AnalysisReportName."Analysis Line Template Name" <> '' then
CurrentLineTemplate := AnalysisReportName."Analysis Line Template Name";
if AnalysisReportName."Analysis Column Template Name" <> '' then
CurrentColumnTemplate := AnalysisReportName."Analysis Column Template Name";
end;
end;
local procedure GetCaption(): Text[250]
var
AnalysisReportName: Record "Analysis Report Name";
begin
if CurrentReportName <> '' then
if AnalysisReportName.Get(Rec."Analysis Area"::Sales, CurrentReportName) then
exit(AnalysisReportName.Name + ' ' + AnalysisReportName.Description);
end;
/// <summary>
/// Sets filters on the analysis columns and lines based on current template selections.
/// </summary>
procedure SetFilters()
begin
TempAnalysisColumn.Reset();
TempAnalysisColumn.SetRange("Analysis Area", Rec."Analysis Area"::Sales);
TempAnalysisColumn.SetRange("Analysis Column Template", CurrentColumnTemplate);
AnalysisLine.Copy(Rec);
AnalysisLine.SetRange("Analysis Area", Rec."Analysis Area"::Sales);
AnalysisLine.SetRange("Analysis Line Template Name", CurrentLineTemplate);
end;
local procedure GetColumnsRangeFilter(): Text
begin
if FirstColumn = LastColumn then
exit(FirstColumn);
exit(FirstColumn + '..' + LastColumn);
end;
local procedure SetPointsAnalysisColumn()
var
AnalysisColumn2: Record "Analysis Column";
tmpFirstColumn: Text[80];
tmpLastColumn: Text[80];
tmpFirstLineNo: Integer;
tmpLastLineNo: Integer;
begin
AnalysisColumn2.SetRange("Analysis Area", AnalysisColumn2."Analysis Area"::Sales);
AnalysisColumn2.SetRange("Analysis Column Template", CurrentColumnTemplate);
if (Direction = Direction::Forward) or
(FirstColumn = '')
then begin
if LastColumn = '' then begin
AnalysisColumn2.Find('-');
tmpFirstColumn := AnalysisColumn2."Column Header";
tmpFirstLineNo := AnalysisColumn2."Line No.";
AnalysisColumn2.Next(NoOfColumns - 1);
tmpLastColumn := AnalysisColumn2."Column Header";
tmpLastLineNo := AnalysisColumn2."Line No.";
end else begin
if AnalysisColumn2.Get(AnalysisColumn2."Analysis Area"::Sales, CurrentColumnTemplate, LastLineNo) then;
AnalysisColumn2.Next(1);
tmpFirstColumn := AnalysisColumn2."Column Header";
tmpFirstLineNo := AnalysisColumn2."Line No.";
AnalysisColumn2.Next(NoOfColumns - 1);
tmpLastColumn := AnalysisColumn2."Column Header";
tmpLastLineNo := AnalysisColumn2."Line No.";
end;
end else begin
if AnalysisColumn2.Get(AnalysisColumn2."Analysis Area"::Sales, CurrentColumnTemplate, FirstLineNo) then;
AnalysisColumn2.Next(-1);
tmpLastColumn := AnalysisColumn2."Column Header";
tmpLastLineNo := AnalysisColumn2."Line No.";
AnalysisColumn2.Next(-NoOfColumns + 1);
tmpFirstColumn := AnalysisColumn2."Column Header";
tmpFirstLineNo := AnalysisColumn2."Line No.";
end;
if (tmpFirstColumn = tmpLastColumn) and
((tmpLastColumn = LastColumn) or (tmpFirstColumn = FirstColumn))
then
exit;
FirstColumn := tmpFirstColumn;
LastColumn := tmpLastColumn;
FirstLineNo := tmpFirstLineNo;
LastLineNo := tmpLastLineNo;
end;
local procedure FillMatrixColumns()
var
AnalysisColumn2: Record "Analysis Column";
i: Integer;
begin
AnalysisColumn2.SetRange("Analysis Area", AnalysisColumn2."Analysis Area"::Sales);
AnalysisColumn2.SetRange("Analysis Column Template", CurrentColumnTemplate);
AnalysisColumn2.SetRange("Line No.", FirstLineNo, LastLineNo);
AnalysisColumn2.SetFilter(Show, '<>%1', AnalysisColumn2.Show::Never);
i := 1;
if AnalysisColumn2.FindSet() then
repeat
MatrixColumnCaptions[i] := AnalysisColumn2."Column Header";
i := i + 1;
until (AnalysisColumn2.Next() = 0) or (i > ArrayLen(MatrixColumnCaptions));
end;
local procedure ClearPoints()
begin
Clear(FirstColumn);
Clear(LastColumn);
end;
/// <summary>
/// Sets the analysis report name to be used when the page opens.
/// </summary>
/// <param name="NewReportName">The report name code to set.</param>
procedure SetReportName(NewReportName: Code[10])
begin
NewCurrentReportName := NewReportName;
end;
local procedure CurrentReportNameOnAfterValidate()
begin
CurrPage.SaveRecord();
ValidateReportName();
AnalysisReportMgt.SetAnalysisLineTemplName(CurrentLineTemplate, Rec);
ValidateAnalysisTemplateName();
AnalysisReportMgt.CopyColumnsToTemp(Rec, CurrentColumnTemplate, TempAnalysisColumn);
CurrPage.Update(false);
ClearPoints();
SetPointsAnalysisColumn();
end;
local procedure CurrentLineTemplateOnAfterValidate()
begin
CurrPage.SaveRecord();
AnalysisReportMgt.SetAnalysisLineTemplName(CurrentLineTemplate, Rec);
ValidateAnalysisTemplateName();
CurrPage.Update(false);
end;
local procedure CurrentColumnTemplateOnAfterValidate()
begin
AnalysisReportMgt.CopyColumnsToTemp(Rec, CurrentColumnTemplate, TempAnalysisColumn);
CurrPage.Update(false);
ClearPoints();
SetPointsAnalysisColumn();
end;
local procedure CurrentSourceTypeNoFilterOnAfterValidate()
begin
AnalysisReportMgt.SetSourceNo(Rec, CurrentSourceTypeNoFilter);
CurrPage.Update(false);
end;
local procedure CurrentSourceTypeFilterOnAfterValidate()
begin
CurrPage.Update(false);
end;
}