Report 7132 Export Item Budget to Excel

App
Base Application
Namespace
Microsoft.Inventory.Analysis
Versions
17-28

Procedures, 5Events, 2Obsolete, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Analysis/ExportItemBudgettoExcel.Report.al384 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.Inventory.Analysis;

using Microsoft.Finance.Analysis;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Enums;
using System.IO;
using System.Utilities;

report 7132 "Export Item Budget to Excel"
{
    Caption = 'Export Item Budget to Excel';
    ProcessingOnly = true;
    UseRequestPage = false;

    dataset
    {
        dataitem("Integer"; "Integer")
        {
            DataItemTableView = sorting(Number) where(Number = const(1));

            trigger OnAfterGetRecord()
            var
                Window: Dialog;
                ClientFileName: Text;
                RecNo: Integer;
                TotalRecNo: Integer;
                RowNo: Integer;
                ColumnNo: Integer;
            begin
                if DoUpdateExistingWorksheet then begin
                    if ServerFileName = '' then
                        ServerFileName := FileMgt.UploadFile(Text002, ExcelFileExtensionTok);
                    if ServerFileName = '' then
                        exit;
                    ClientFileName := FileMgt.GetFileName(ServerFileName);
                    SheetName := TempExcelBuffer.SelectSheetsName(ServerFileName);
                    if SheetName = '' then
                        exit;
                end;

                Window.Open(
                  Text000 +
                  '@1@@@@@@@@@@@@@@@@@@@@@\');

                TempExcelBuffer.DeleteAll();
                Clear(TempExcelBuffer);

                ItemBudgetName.Get(AnalysisArea, BudgetName);
                GLSetup.Get();

                if DateFilter = '' then
                    Error(Text010, Text003);

                if FindLine('-') then
                    repeat
                        TotalRecNo := TotalRecNo + 1;
                    until NextLine(1) = 0;

                RowNo := 1;
                EnterCell(RowNo, 1, Text001, false, false, true, '', TempExcelBuffer."Cell Type"::Text);
                EnterCell(RowNo, 2, '', false, false, true, '', TempExcelBuffer."Cell Type"::Text);

                RowNo := RowNo + 1;
                EnterFilterInCell(RowNo, BudgetName, ItemBudgetName.TableCaption());

                if GlobalDim1Filter <> '' then begin
                    RowNo := RowNo + 1;
                    Dim.Get(GLSetup."Global Dimension 1 Code");
                    EnterFilterInCell(RowNo, GlobalDim1Filter, Dim."Filter Caption");
                end;

                if GlobalDim2Filter <> '' then begin
                    RowNo := RowNo + 1;
                    Dim.Get(GLSetup."Global Dimension 2 Code");
                    EnterFilterInCell(RowNo, GlobalDim2Filter, Dim."Filter Caption");
                end;

                if BudgetDim1Filter <> '' then begin
                    RowNo := RowNo + 1;
                    Dim.Get(ItemBudgetName."Budget Dimension 1 Code");
                    EnterFilterInCell(RowNo, BudgetDim1Filter, Dim."Filter Caption");
                end;

                if BudgetDim2Filter <> '' then begin
                    RowNo := RowNo + 1;
                    Dim.Get(ItemBudgetName."Budget Dimension 2 Code");
                    EnterFilterInCell(RowNo, BudgetDim2Filter, Dim."Filter Caption");
                end;

                if BudgetDim3Filter <> '' then begin
                    RowNo := RowNo + 1;
                    Dim.Get(ItemBudgetName."Budget Dimension 3 Code");
                    EnterFilterInCell(RowNo, BudgetDim3Filter, Dim."Filter Caption");
                end;

                if ItemFilter <> '' then begin
                    RowNo := RowNo + 1;
                    EnterFilterInCell(RowNo, ItemFilter, Text004);
                end;

                if DateFilter <> '' then begin
                    RowNo := RowNo + 1;
                    EnterFilterInCell(RowNo, DateFilter, Text003);
                end;

                if SourceNoFilter <> '' then begin
                    RowNo := RowNo + 1;
                    if SourceTypeFilter = SourceTypeFilter::Customer then
                        EnterFilterInCell(RowNo, SourceNoFilter, Text005)
                    else
                        EnterFilterInCell(RowNo, SourceNoFilter, Text006);
                end;

                RowNo := RowNo + 2;
                EnterFilterInCell(RowNo, LineDimCode, Text008);

                RowNo := RowNo + 1;
                EnterFilterInCell(RowNo, ColumnDimCode, Text009);

                RowNo := RowNo + 1;
                case ValueType of
                    ValueType::"Sales Amount":
                        ShowValueAsText := Text012;
                    ValueType::"Cost Amount":
                        if AnalysisArea = AnalysisArea::Sales then
                            ShowValueAsText := Text014
                        else
                            ShowValueAsText := Text013;
                    ValueType::Quantity:
                        ShowValueAsText := Text015;
                end;
                EnterFilterInCell(RowNo, ShowValueAsText, Text011);

                RowNo := RowNo + 2;
                if FindLine('-') then begin
                    if FindColumn('-') then begin
                        ColumnNo := 1;
                        EnterCell(RowNo, ColumnNo, Text007, false, true, false, '', TempExcelBuffer."Cell Type"::Text);
                        OnOnAfterGetRecordOnAfterEnterTableDataCell(TempExcelBuffer, RowNo, ColumnNo, AnalysisArea, BudgetName);
                        repeat
                            ColumnNo := ColumnNo + 1;
                            EnterCell(RowNo, ColumnNo, ColumnDimCodeBuffer.Code, false, false, false, '', TempExcelBuffer."Cell Type"::Text);
                        until NextColumn(1) = 0;
                    end;
                    repeat
                        RecNo := RecNo + 1;
                        Window.Update(1, Round(RecNo / TotalRecNo * 10000, 1));
                        RowNo := RowNo + 1;
                        ColumnNo := 1;
                        EnterCell(
                          RowNo, ColumnNo, LineDimCodeBuffer.Code, LineDimCodeBuffer."Show in Bold", false, false, '', TempExcelBuffer."Cell Type"::Text);
                        OnOnAfterGetRecordOnAfterEnterLineDimensionCodeCell(TempExcelBuffer, RowNo, ColumnNo, LineDimCodeBuffer, AnalysisArea, BudgetName);
                        if FindColumn('-') then
                            repeat
                                ColumnNo := ColumnNo + 1;
                                ColumnValue :=
                                  ItemBudgetManagement.CalculateAmount(
                                    ValueType, true,
                                    ItemStatisticsBuffer, ItemBudgetName,
                                    ItemFilter, SourceTypeFilter, SourceNoFilter, DateFilter,
                                    GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter,
                                    LineDimType, LineDimCodeBuffer, ColumnDimType, ColumnDimCodeBuffer);
                                EnterCell(
                                  RowNo,
                                  ColumnNo,
                                  MatrixMgt.FormatAmount(ColumnValue, RoundingFactor, false),
                                  LineDimCodeBuffer."Show in Bold",
                                  false,
                                  false,
                                  '',
                                  TempExcelBuffer."Cell Type"::Number)
                            until NextColumn(1) = 0;
                    until NextLine(1) = 0;
                end;
                Window.Close();

                if DoUpdateExistingWorksheet then begin
                    TempExcelBuffer.UpdateBookExcel(ServerFileName, SheetName, false);
                    TempExcelBuffer.WriteSheet('', CompanyName, UserId);
                    TempExcelBuffer.CloseBook();
                    if not TestMode then
                        TempExcelBuffer.OpenExcelWithName(ClientFileName);
                end else begin
                    TempExcelBuffer.CreateBook(ServerFileName, TempExcelBuffer.GetExcelReference(10));
                    TempExcelBuffer.WriteSheet(
                      PadStr(StrSubstNo('%1 %2', ItemBudgetName.Name, ItemBudgetName.Description), 30),
                      CompanyName, UserId);
                    TempExcelBuffer.CloseBook();
                    if not TestMode then
                        TempExcelBuffer.OpenExcel();
                end;
            end;
        }
    }

    requestpage
    {

        layout
        {
        }

        actions
        {
        }
    }

    labels
    {
    }

    var
        ItemBudgetName: Record "Item Budget Name";
        Dim: Record Dimension;
        LineDimCodeBuffer: Record "Dimension Code Buffer";
        ColumnDimCodeBuffer: Record "Dimension Code Buffer";
        ItemStatisticsBuffer: Record "Item Statistics Buffer";
        TempExcelBuffer: Record "Excel Buffer" temporary;
        GLSetup: Record "General Ledger Setup";
        ItemBudgetManagement: Codeunit "Item Budget Management";
        MatrixMgt: Codeunit "Matrix Management";
        FileMgt: Codeunit "File Management";
        LineDimCode: Text[30];
        ColumnDimCode: Text[30];
        DateFilter: Text;
        InternalDateFilter: Text;
        ShowValueAsText: Text[30];
        ServerFileName: Text;
        SheetName: Text[250];
        BudgetName: Code[10];
        GlobalDim1Filter: Text;
        GlobalDim2Filter: Text;
        BudgetDim1Filter: Text;
        BudgetDim2Filter: Text;
        BudgetDim3Filter: Text;
        SourceNoFilter: Text;
        ItemFilter: Text;
        ColumnValue: Decimal;
        AnalysisArea: Enum "Analysis Area Type";
        ValueType: Enum "Item Analysis Value Type";
        SourceTypeFilter: Enum "Analysis Source Type";
        PeriodType: Enum "Analysis Period Type";
        LineDimType: Enum "Item Budget Dimension Type";
        ColumnDimType: Enum "Item Budget Dimension Type";
        RoundingFactor: Enum "Analysis Rounding Factor";
        PeriodInitialized: Boolean;
        DoUpdateExistingWorksheet: Boolean;
        TestMode: Boolean;

#pragma warning disable AA0074
        Text000: Label 'Analyzing Data...\\';
        Text001: Label 'Filters';
        Text002: Label 'Update Workbook';
        Text003: Label 'Date Filter';
        Text004: Label 'Item Filter';
        Text005: Label 'Customer Filter';
        Text006: Label 'Vendor Filter';
        Text007: Label 'Table Data';
        Text008: Label 'Show as Lines';
        Text009: Label 'Show as Columns';
#pragma warning disable AA0470
        Text010: Label '%1 must not be blank.';
#pragma warning restore AA0470
        Text011: Label 'Show Value as';
        Text012: Label 'Sales Amount';
        Text013: Label 'Cost Amount';
        Text014: Label 'COGS Amount';
        Text015: Label 'Quantity';
#pragma warning restore AA0074
        ExcelFileExtensionTok: Label '.xlsx', Locked = true;

    procedure SetParameters(NewAnalysisArea: Enum "Analysis Area Type"; NewBudgName: Code[10]; NewValueType: Enum "Item Analysis Value Type"; NewGlobalDim1Filter: Text; NewGlobalDim2Filter: Text; NewBudgDim1Filter: Text; NewBudgDim2Filter: Text; NewBudgDim3Filter: Text; NewDateFilter: Text; NewSourceTypeFilter: Enum "Analysis Source Type"; NewSourceNoFilter: Text; NewItemFilter: Text; NewInternalDateFilter: Text; NewPeriodInitialized: Boolean; NewPeriodType: Enum "Analysis Period Type"; NewLineDimType: Enum "Item Budget Dimension Type"; NewColumnDimType: Enum "Item Budget Dimension Type"; NewLineDimCode: Text[30]; NewColumnDimCode: Text[30]; NewRoundingFactor: Enum "Analysis Rounding Factor")
    begin
        AnalysisArea := NewAnalysisArea;
        BudgetName := NewBudgName;
        ValueType := NewValueType;
        GlobalDim1Filter := NewGlobalDim1Filter;
        GlobalDim2Filter := NewGlobalDim2Filter;
        BudgetDim1Filter := NewBudgDim1Filter;
        BudgetDim2Filter := NewBudgDim2Filter;
        BudgetDim3Filter := NewBudgDim3Filter;
        DateFilter := NewDateFilter;
        ItemFilter := NewItemFilter;
        SourceTypeFilter := NewSourceTypeFilter;
        SourceNoFilter := NewSourceNoFilter;
        InternalDateFilter := NewInternalDateFilter;
        PeriodInitialized := NewPeriodInitialized;
        PeriodType := NewPeriodType;
        LineDimType := NewLineDimType;
        ColumnDimType := NewColumnDimType;
        LineDimCode := NewLineDimCode;
        ColumnDimCode := NewColumnDimCode;
        RoundingFactor := NewRoundingFactor;
    end;

    local procedure EnterFilterInCell(RowNo: Integer; "Filter": Text; FieldName: Text[100])
    begin
        EnterCell(RowNo, 1, FieldName, false, false, false, '', TempExcelBuffer."Cell Type"::Text);
        EnterCell(RowNo, 2, CopyStr(Filter, 1, 250), false, false, false, '', TempExcelBuffer."Cell Type"::Text);
    end;

    local procedure EnterCell(RowNo: Integer; ColumnNo: Integer; CellValue: Text[250]; Bold: Boolean; Italic: Boolean; UnderLine: Boolean; NumberFormat: Text[30]; CellType: Option)
    begin
        TempExcelBuffer.Init();
        TempExcelBuffer.Validate("Row No.", RowNo);
        TempExcelBuffer.Validate("Column No.", ColumnNo);
        TempExcelBuffer."Cell Value as Text" := CellValue;
        TempExcelBuffer.Formula := '';
        TempExcelBuffer.Bold := Bold;
        TempExcelBuffer.Italic := Italic;
        TempExcelBuffer.Underline := UnderLine;
        TempExcelBuffer.NumberFormat := NumberFormat;
        TempExcelBuffer."Cell Type" := CellType;
        TempExcelBuffer.Insert();
    end;

    local procedure FindLine(Which: Text[1024]): Boolean
    begin
        exit(
          ItemBudgetManagement.FindRecord(
            ItemBudgetName, LineDimType, LineDimCodeBuffer, Which,
            ItemFilter, SourceNoFilter, PeriodType, DateFilter, PeriodInitialized, InternalDateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter));
    end;

    local procedure NextLine(Steps: Integer): Integer
    begin
        exit(
          ItemBudgetManagement.NextRecord(
            ItemBudgetName, LineDimType, LineDimCodeBuffer, Steps,
            ItemFilter, SourceNoFilter, PeriodType, DateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter));
    end;

    local procedure FindColumn(Which: Text[1024]): Boolean
    begin
        exit(
          ItemBudgetManagement.FindRecord(
            ItemBudgetName, ColumnDimType, ColumnDimCodeBuffer, Which,
            ItemFilter, SourceNoFilter, PeriodType, DateFilter, PeriodInitialized, InternalDateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter));
    end;

    local procedure NextColumn(Steps: Integer): Integer
    begin
        exit(
          ItemBudgetManagement.NextRecord(
            ItemBudgetName, ColumnDimType, ColumnDimCodeBuffer, Steps,
            ItemFilter, SourceNoFilter, PeriodType, DateFilter,
            GlobalDim1Filter, GlobalDim2Filter, BudgetDim1Filter, BudgetDim2Filter, BudgetDim3Filter));
    end;

    procedure SetUpdateExistingWorksheet(UpdateExistingWorksheet: Boolean)
    begin
        DoUpdateExistingWorksheet := UpdateExistingWorksheet;
    end;

    procedure SetFileNameSilent(NewFileName: Text)
    begin
        ServerFileName := NewFileName;
    end;

    procedure SetTestMode(NewTestMode: Boolean)
    begin
        TestMode := NewTestMode;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnOnAfterGetRecordOnAfterEnterTableDataCell(var TempExcelBuffer: Record "Excel Buffer" temporary; HeaderRowNo: Integer; var ColumnNo: Integer; AnalysisArea: Enum "Analysis Area Type"; BudgetName: Code[10])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnOnAfterGetRecordOnAfterEnterLineDimensionCodeCell(var TempExcelBuffer: Record "Excel Buffer" temporary; DataRowNo: Integer; var ColumnNo: Integer; LineDimCodeBuffer: Record "Dimension Code Buffer"; AnalysisArea: Enum "Analysis Area Type"; BudgetName: Code[10])
    begin
    end;
}