Report 26 Copy Account Schedule, source in 29
Source29
src/Layers/W1/BaseApp/Finance/FinancialReports/CopyAccountSchedule.Report.al202 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.FinancialReports;
using System.Telemetry;
/// <summary>
/// Creates copy of existing account schedule with all associated line definitions.
/// Enables duplication of row structure for new financial report configurations.
/// </summary>
report 26 "Copy Account Schedule"
{
Caption = 'Copy Rows';
ProcessingOnly = true;
dataset
{
dataitem(SourceAccScheduleName; "Acc. Schedule Name")
{
DataItemTableView = sorting(Name) order(ascending);
trigger OnAfterGetRecord()
var
SourceAccScheduleLine: Record "Acc. Schedule Line";
AccScheduleName: Record "Acc. Schedule Name";
begin
AccScheduleName.Get(CopySourceAccScheduleName);
CreateNewAccountScheduleName(NewAccScheduleName, AccScheduleName);
SourceAccScheduleLine.SetRange("Schedule Name", AccScheduleName.Name);
if SourceAccScheduleLine.FindSet() then
repeat
CreateNewAccountScheduleLine(NewAccScheduleName, SourceAccScheduleLine);
until SourceAccScheduleLine.Next() = 0;
end;
trigger OnPreDataItem()
begin
AssertNewAccountScheduleNameNotEmpty();
AssertNewAccountScheduleNameNotExisting();
AssertSourceAccountScheduleNameNotEmpty();
AssertSourceAccountScheduleNameExists(SourceAccScheduleName);
end;
}
}
requestpage
{
layout
{
area(content)
{
group(Options)
{
Caption = 'Options';
field(NewAccountScheduleName; NewAccScheduleName)
{
ApplicationArea = Basic, Suite;
Caption = 'New Rows Definition Name';
NotBlank = true;
ToolTip = 'Specifies the name of the new rows definition after copying.';
}
field(SourceAccountScheduleName; CopySourceAccScheduleName)
{
ApplicationArea = Basic, Suite;
Caption = 'Source Rows Definition Name';
Enabled = false;
NotBlank = true;
ToolTip = 'Specifies the name of the existing rows definition to copy from.';
}
}
}
}
actions
{
}
trigger OnOpenPage()
begin
AssertSourceAccountScheduleNameOnlyOne(SourceAccScheduleName);
if SourceAccScheduleName.FindFirst() then
CopySourceAccScheduleName := SourceAccScheduleName.Name;
end;
}
labels
{
}
trigger OnPostReport()
begin
Message(CopySuccessMsg);
end;
var
NewAccScheduleName: Code[10];
CopySuccessMsg: Label 'The new rows definition has been created successfully.';
MissingSourceErr: Label 'Could not find a rows definition with the specified name to copy from.';
NewNameExistsErr: Label 'The new rows definition already exists.';
NewNameMissingErr: Label 'You must specify a name for the new rows definition.';
CopySourceAccScheduleName: Code[10];
CopySourceNameMissingErr: Label 'You must specify a valid name for the source rows definition to copy from.';
MultipleSourcesErr: Label 'You can only copy one rows definition at a time.';
CopyEventTxt: Label 'Financial Report Row Definition copied: %1', Comment = '%1 = rows definition name', Locked = true;
/// <summary>
/// Returns the name of the newly created account schedule after copy operation.
/// </summary>
/// <returns>New account schedule name as Code[10]</returns>
procedure GetNewAccountScheduleName(): Code[10]
begin
exit(NewAccScheduleName);
end;
local procedure AssertNewAccountScheduleNameNotEmpty()
begin
if IsEmptyName(NewAccScheduleName) then
Error(NewNameMissingErr);
end;
local procedure AssertNewAccountScheduleNameNotExisting()
var
AccScheduleName: Record "Acc. Schedule Name";
begin
if AccScheduleName.Get(NewAccScheduleName) then
Error(NewNameExistsErr);
end;
local procedure CreateNewAccountScheduleName(NewName: Code[10]; FromAccScheduleName: Record "Acc. Schedule Name")
var
AccScheduleName: Record "Acc. Schedule Name";
begin
if AccScheduleName.Get(NewName) then
exit;
AccScheduleName.Init();
AccScheduleName.TransferFields(FromAccScheduleName);
AccScheduleName.Name := NewName;
AccScheduleName.Insert();
LogUsageTelemetry(FromAccScheduleName.Name, NewName);
end;
local procedure CreateNewAccountScheduleLine(NewName: Code[10]; FromAccScheduleLine: Record "Acc. Schedule Line")
var
AccScheduleLine: Record "Acc. Schedule Line";
begin
if AccScheduleLine.Get(NewName, FromAccScheduleLine."Line No.") then
exit;
AccScheduleLine.Init();
AccScheduleLine.TransferFields(FromAccScheduleLine);
AccScheduleLine."Schedule Name" := NewName;
AccScheduleLine.Insert();
end;
local procedure IsEmptyName(ScheduleName: Code[10]) IsEmpty: Boolean
begin
IsEmpty := ScheduleName = '';
end;
local procedure AssertSourceAccountScheduleNameNotEmpty()
begin
if IsEmptyName(CopySourceAccScheduleName) then
Error(CopySourceNameMissingErr);
end;
local procedure AssertSourceAccountScheduleNameExists(FromAccScheduleName: Record "Acc. Schedule Name")
begin
if not FromAccScheduleName.Get(CopySourceAccScheduleName) then
Error(MissingSourceErr);
end;
local procedure AssertSourceAccountScheduleNameOnlyOne(var FromAccScheduleName: Record "Acc. Schedule Name")
var
AccScheduleName: Record "Acc. Schedule Name";
begin
AccScheduleName.CopyFilters(FromAccScheduleName);
if AccScheduleName.Count > 1 then
Error(MultipleSourcesErr);
end;
local procedure LogUsageTelemetry(SourceCode: Code[10]; NewCode: Code[10])
var
FeatureTelemetry: Codeunit "Feature Telemetry";
TelemetryDimensions: Dictionary of [Text, Text];
begin
TelemetryDimensions.Add('ReportId', Format(CurrReport.ObjectId(false), 0, 9));
TelemetryDimensions.Add('ReportName', CurrReport.ObjectId(true));
TelemetryDimensions.Add('UseRequestPage', Format(CurrReport.UseRequestPage()));
TelemetryDimensions.Add('SourceRowDefinitionCode', SourceCode);
TelemetryDimensions.Add('NewRowDefinitionCode', NewCode);
FeatureTelemetry.LogUsage('0000OKV', 'Financial Report', StrSubstNo(CopyEventTxt, SourceCode), TelemetryDimensions);
end;
}