OBJECT Codeunit 8 AccSchedManagement { OBJECT-PROPERTIES { Date=; Time=; Version List=; } PROPERTIES { TableNo=85; OnRun=BEGIN END; } CODE { VAR Text000@1000 : TextConst 'ENU=DEFAULT'; Text001@1001 : TextConst 'ENU=Default Schedule'; Text002@1002 : TextConst 'ENU=Default Columns'; Text012@1006 : TextConst 'ENU=You have entered an illegal value or a nonexistent row number.'; Text013@1007 : TextConst 'ENU=You have entered an illegal value or a nonexistent column number.'; Text014@1008 : TextConst 'ENU='; Text016@1003 : TextConst '@@@=No translation required, keep as is;ENU=%1\\ %2 %3 %4'; Text017@1011 : TextConst 'ENU=The error occurred when the program tried to calculate:\'; Text018@1012 : TextConst '@@@="%1 = Row No., %2= Line No., %3 = Totaling";ENU="Acc. Sched. Line: Row No. = %1, Line No. = %2, Totaling = %3\"'; Text019@1013 : TextConst '@@@="%1 = Column No., %2= Line No., %3 = Formula";ENU="Acc. Sched. Column: Column No. = %1, Line No. = %2, Formula = %3"'; Text020@1014 : TextConst 'ENU=Because of circular references, the program cannot calculate a formula.'; AccSchedName@1015 : Record 84; AccountScheduleLine@1016 : Record 85; ColumnLayoutName@1039 : Record 333; AccSchedCellValue@1017 : TEMPORARY Record 342; CurrExchRate@1018 : Record 330; GLSetup@1019 : Record 98; AddRepCurrency@1035 : Record 4; AnalysisView@1036 : Record 363; AnalysisViewRead@1037 : Boolean; StartDate@1020 : Date; EndDate@1021 : Date; FiscalStartDate@1022 : Date; DivisionError@1023 : Boolean; PeriodError@1034 : Boolean; CallLevel@1024 : Integer; CallingAccSchedLineID@1025 : Integer; CallingColumnLayoutID@1026 : Integer; OldAccSchedLineFilters@1027 : Text; OldColumnLayoutFilters@1028 : Text; OldAccSchedLineName@1029 : Code[10]; OldColumnLayoutName@1030 : Code[10]; OldCalcAddCurr@1031 : Boolean; NormalFormatString@1032 : Text[80]; GLSetupRead@1033 : Boolean; Text021@1040 : TextConst 'ENU=Conversion of dimension totaling filter %1 results in a filter that becomes too long.'; BasePercentLine@1038 : ARRAY [50] OF Integer; Text022@1041 : TextConst 'ENU=You cannot have more than %1 lines with %2 of %3.'; Text023@1042 : TextConst 'ENU=Formulas ending with a percent sign require %2 %1 on a line before it.'; Text024@1043 : TextConst 'ENU=The %1 %3 on the %2 must equal the %4 %6 on the %5 when any Dimension Totaling is used in any Column.'; ColumnFormulaMsg@1005 : TextConst 'ENU=Column formula: %1.'; PROCEDURE OpenSchedule@1(VAR CurrentSchedName@1000 : Code[10];VAR AccSchedLine@1001 : Record 85); BEGIN CheckTemplateName(CurrentSchedName); AccSchedLine.FILTERGROUP(2); AccSchedLine.SETRANGE("Schedule Name",CurrentSchedName); AccSchedLine.FILTERGROUP(0); END; PROCEDURE CheckTemplateName@2(VAR CurrentSchedName@1000 : Code[10]); VAR AccSchedName@1001 : Record 84; BEGIN IF NOT AccSchedName.GET(CurrentSchedName) THEN BEGIN IF NOT AccSchedName.FINDFIRST THEN BEGIN AccSchedName.INIT; AccSchedName.Name := Text000; AccSchedName.Description := Text001; AccSchedName.INSERT; COMMIT; END; CurrentSchedName := AccSchedName.Name; END; END; PROCEDURE CheckName@3(CurrentSchedName@1000 : Code[10]); VAR AccSchedName@1001 : Record 84; BEGIN AccSchedName.GET(CurrentSchedName); END; PROCEDURE SetName@4(CurrentSchedName@1000 : Code[10];VAR AccSchedLine@1001 : Record 85); BEGIN AccSchedLine.FILTERGROUP(2); AccSchedLine.SETRANGE("Schedule Name",CurrentSchedName); AccSchedLine.FILTERGROUP(0); IF AccSchedLine.FIND('-') THEN; END; PROCEDURE LookupName@5(CurrentSchedName@1000 : Code[10];VAR EntrdSchedName@1001 : Text[10]) : Boolean; VAR AccSchedName@1002 : Record 84; BEGIN AccSchedName.Name := CurrentSchedName; IF PAGE.RUNMODAL(0,AccSchedName) <> ACTION::LookupOK THEN EXIT(FALSE); EntrdSchedName := AccSchedName.Name; EXIT(TRUE); END; PROCEDURE OpenColumns@16(VAR CurrentColumnName@1000 : Code[10];VAR ColumnLayout@1001 : Record 334); BEGIN CheckColumnTemplateName(CurrentColumnName); ColumnLayout.FILTERGROUP(2); ColumnLayout.SETRANGE("Column Layout Name",CurrentColumnName); ColumnLayout.FILTERGROUP(0); END; PROCEDURE CheckColumnTemplateName@15(VAR CurrentColumnName@1000 : Code[10]); VAR ColumnLayoutName@1001 : Record 333; BEGIN IF NOT ColumnLayoutName.GET(CurrentColumnName) THEN BEGIN IF NOT ColumnLayoutName.FINDFIRST THEN BEGIN ColumnLayoutName.INIT; ColumnLayoutName.Name := Text000; ColumnLayoutName.Description := Text002; ColumnLayoutName.INSERT; COMMIT; END; CurrentColumnName := ColumnLayoutName.Name; END; END; PROCEDURE CheckColumnName@14(CurrentColumnName@1000 : Code[10]); VAR ColumnLayoutName@1001 : Record 333; BEGIN ColumnLayoutName.GET(CurrentColumnName); END; PROCEDURE SetColumnName@13(CurrentColumnName@1000 : Code[10];VAR ColumnLayout@1001 : Record 334); BEGIN ColumnLayout.RESET; ColumnLayout.FILTERGROUP(2); ColumnLayout.SETRANGE("Column Layout Name",CurrentColumnName); ColumnLayout.FILTERGROUP(0); END; PROCEDURE CopyColumnsToTemp@21(NewColumnName@1000 : Code[10];VAR TempColumnLayout@1001 : Record 334); VAR ColumnLayout@1002 : Record 334; BEGIN TempColumnLayout.DELETEALL; ColumnLayout.SETRANGE("Column Layout Name",NewColumnName); IF ColumnLayout.FIND('-') THEN REPEAT TempColumnLayout := ColumnLayout; TempColumnLayout.INSERT; UNTIL ColumnLayout.NEXT = 0; IF TempColumnLayout.FIND('-') THEN; END; PROCEDURE LookupColumnName@11(CurrentColumnName@1000 : Code[10];VAR EntrdColumnName@1001 : Text[10]) : Boolean; VAR ColumnLayoutName@1002 : Record 333; BEGIN ColumnLayoutName.Name := CurrentColumnName; IF PAGE.RUNMODAL(0,ColumnLayoutName) <> ACTION::LookupOK THEN EXIT(FALSE); EntrdColumnName := ColumnLayoutName.Name; EXIT(TRUE); END; PROCEDURE CheckAnalysisView@36(CurrentSchedName@1000 : Code[10];CurrentColumnName@1001 : Code[10];TestColumnName@1002 : Boolean); VAR ColumnLayout2@1003 : Record 334; AnyColumnDimensions@1004 : Boolean; BEGIN IF NOT AnalysisViewRead THEN BEGIN AnalysisViewRead := TRUE; IF CurrentSchedName <> AccSchedName.Name THEN BEGIN CheckTemplateName(CurrentSchedName); AccSchedName.GET(CurrentSchedName); END; IF TestColumnName THEN IF CurrentColumnName <> ColumnLayoutName.Name THEN BEGIN CheckColumnTemplateName(CurrentColumnName); ColumnLayoutName.GET(CurrentColumnName); END; IF AccSchedName."Analysis View Name" = '' THEN BEGIN IF NOT GLSetupRead THEN GLSetup.GET; GLSetupRead := TRUE; AnalysisView.INIT; AnalysisView."Dimension 1 Code" := GLSetup."Global Dimension 1 Code"; AnalysisView."Dimension 2 Code" := GLSetup."Global Dimension 2 Code"; END ELSE AnalysisView.GET(AccSchedName."Analysis View Name"); IF AccSchedName."Analysis View Name" <> ColumnLayoutName."Analysis View Name" THEN BEGIN AnyColumnDimensions := FALSE; ColumnLayout2.SETRANGE("Column Layout Name",ColumnLayoutName.Name); IF ColumnLayout2.FIND('-') THEN REPEAT AnyColumnDimensions := (ColumnLayout2."Dimension 1 Totaling" <> '') OR (ColumnLayout2."Dimension 2 Totaling" <> '') OR (ColumnLayout2."Dimension 3 Totaling" <> '') OR (ColumnLayout2."Dimension 4 Totaling" <> ''); UNTIL AnyColumnDimensions OR (ColumnLayout2.NEXT = 0); IF AnyColumnDimensions THEN ERROR( Text024, AccSchedName.FIELDCAPTION("Analysis View Name"), AccSchedName.TABLECAPTION, AccSchedName."Analysis View Name", ColumnLayoutName.FIELDCAPTION("Analysis View Name"), ColumnLayoutName.TABLECAPTION, ColumnLayoutName."Analysis View Name"); END; END; END; PROCEDURE FindFiscalYear@10(BalanceDate@1000 : Date) : Date; VAR AccountingPeriod@1001 : Record 50; BEGIN AccountingPeriod.SETRANGE("New Fiscal Year",TRUE); AccountingPeriod.SETRANGE("Starting Date",0D,BalanceDate); IF AccountingPeriod.FINDLAST THEN EXIT(AccountingPeriod."Starting Date"); AccountingPeriod.RESET; AccountingPeriod.FINDFIRST; EXIT(AccountingPeriod."Starting Date"); END; LOCAL PROCEDURE FindEndOfFiscalYear@27(BalanceDate@1000 : Date) : Date; VAR AccountingPeriod@1001 : Record 50; BEGIN AccountingPeriod.SETRANGE("New Fiscal Year",TRUE); AccountingPeriod.SETFILTER("Starting Date",'>%1',FindFiscalYear(BalanceDate)); IF AccountingPeriod.FINDFIRST THEN EXIT(CALCDATE('<-1D>',AccountingPeriod."Starting Date")); EXIT(31129999D); END; LOCAL PROCEDURE AccPeriodStartEnd@26(Formula@1002 : Code[20];Date@1000 : Date;VAR StartDate@1013 : Date;VAR EndDate@1014 : Date); VAR ColumnLayout@1006 : Record 334; AccountingPeriod@1001 : Record 50; AccountingPeriodFY@1007 : Record 50; Steps@1005 : Integer; Type@1004 : ' ,Period,Fiscal year,Fiscal Halfyear,Fiscal Quarter'; CurrentPeriodNo@1003 : Integer; RangeFromType@1012 : 'Int,CP,LP'; RangeToType@1011 : 'Int,CP,LP'; RangeFromInt@1010 : Integer; RangeToInt@1009 : Integer; BEGIN IF Formula = '' THEN EXIT; ColumnLayout.ParsePeriodFormula( Formula,Steps,Type,RangeFromType,RangeToType,RangeFromInt,RangeToInt); // Find current period AccountingPeriod.SETFILTER("Starting Date",'<=%1',Date); IF NOT AccountingPeriod.FIND('+') THEN BEGIN AccountingPeriod.RESET; IF Steps < 0 THEN AccountingPeriod.FIND('-') ELSE AccountingPeriod.FIND('+') END; AccountingPeriod.RESET; CASE Type OF Type::Period: BEGIN IF AccountingPeriod.NEXT(Steps) <> Steps THEN PeriodError := TRUE; StartDate := AccountingPeriod."Starting Date"; EndDate := AccPeriodEndDate(StartDate); END; Type::"Fiscal year": BEGIN AccountingPeriodFY := AccountingPeriod; WHILE NOT AccountingPeriodFY."New Fiscal Year" DO IF AccountingPeriodFY.FIND('<') THEN CurrentPeriodNo += 1 ELSE AccountingPeriodFY."New Fiscal Year" := TRUE; AccountingPeriodFY.SETRANGE("New Fiscal Year",TRUE); AccountingPeriodFY.NEXT(Steps); AccPeriodStartOrEnd(AccountingPeriodFY,CurrentPeriodNo,RangeFromType,RangeFromInt,FALSE,StartDate); AccPeriodStartOrEnd(AccountingPeriodFY,CurrentPeriodNo,RangeToType,RangeToInt,TRUE,EndDate); END; END; END; LOCAL PROCEDURE AccPeriodEndDate@29(StartDate@1000 : Date) : Date; VAR AccountingPeriod@1001 : Record 50; BEGIN AccountingPeriod."Starting Date" := StartDate; IF AccountingPeriod.FIND('>') THEN EXIT(AccountingPeriod."Starting Date" - 1); EXIT(31129999D); END; LOCAL PROCEDURE AccPeriodGetPeriod@35(VAR AccountingPeriod@1001 : Record 50;AccPeriodNo@1000 : Integer) : Date; BEGIN CASE TRUE OF AccPeriodNo > 0: BEGIN AccountingPeriod.NEXT(AccPeriodNo); EXIT; END; AccPeriodNo = 0: EXIT; AccPeriodNo < 0: BEGIN AccountingPeriod.SETRANGE("New Fiscal Year",TRUE); IF NOT AccountingPeriod.FIND('>') THEN BEGIN AccountingPeriod.RESET; AccountingPeriod.FIND('+'); EXIT; END; AccountingPeriod.RESET; AccountingPeriod.FIND('<'); EXIT; END; END; END; LOCAL PROCEDURE AccPeriodStartOrEnd@30(AccountingPeriod@1000 : Record 50;CurrentPeriodNo@1007 : Integer;RangeType@1006 : 'Int,CP,LP';RangeInt@1009 : Integer;EndDate@1003 : Boolean;VAR Date@1002 : Date); BEGIN CASE RangeType OF RangeType::CP: AccPeriodGetPeriod(AccountingPeriod,CurrentPeriodNo); RangeType::LP: AccPeriodGetPeriod(AccountingPeriod,-1); RangeType::Int: AccPeriodGetPeriod(AccountingPeriod,RangeInt - 1); END; IF EndDate THEN Date := AccPeriodEndDate(AccountingPeriod."Starting Date") ELSE Date := AccountingPeriod."Starting Date"; END; LOCAL PROCEDURE InitBasePercents@33(AccSchedLine@1000 : Record 85;ColumnLayout@1001 : Record 334); VAR BaseIdx@1002 : Integer; BEGIN CLEAR(BasePercentLine); BaseIdx := 0; WITH AccSchedLine DO BEGIN SETRANGE("Schedule Name","Schedule Name"); IF FIND('-') THEN REPEAT IF "Totaling Type" = "Totaling Type"::"Set Base For Percent" THEN BEGIN BaseIdx := BaseIdx + 1; IF BaseIdx > ARRAYLEN(BasePercentLine) THEN ShowError( STRSUBSTNO(Text022,ARRAYLEN(BasePercentLine),FIELDCAPTION("Totaling Type"),"Totaling Type"), AccSchedLine,ColumnLayout); BasePercentLine[BaseIdx] := "Line No."; END; UNTIL NEXT = 0; END; IF BaseIdx = 0 THEN BEGIN AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Set Base For Percent"; ShowError( STRSUBSTNO(Text023,AccSchedLine.FIELDCAPTION("Totaling Type"),AccSchedLine."Totaling Type"), AccSchedLine,ColumnLayout); END; END; LOCAL PROCEDURE GetBasePercentLine@34(AccSchedLine@1000 : Record 85;ColumnLayout@1001 : Record 334) : Integer; VAR BaseIdx@1002 : Integer; BEGIN IF BasePercentLine[1] = 0 THEN InitBasePercents(AccSchedLine,ColumnLayout); BaseIdx := ARRAYLEN(BasePercentLine); REPEAT IF BasePercentLine[BaseIdx] <> 0 THEN IF BasePercentLine[BaseIdx] < AccSchedLine."Line No." THEN EXIT(BasePercentLine[BaseIdx]); BaseIdx := BaseIdx - 1; UNTIL BaseIdx = 0; AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Set Base For Percent"; ShowError( STRSUBSTNO(Text023,AccSchedLine.FIELDCAPTION("Totaling Type"),AccSchedLine."Totaling Type"), AccSchedLine,ColumnLayout); END; PROCEDURE CalcCell@8(VAR AccSchedLine@1000 : Record 85;VAR ColumnLayout@1001 : Record 334;CalcAddCurr@1002 : Boolean) : Decimal; VAR Result@1003 : Decimal; BEGIN AccountScheduleLine.COPYFILTERS(AccSchedLine); StartDate := AccountScheduleLine.GETRANGEMIN("Date Filter"); IF EndDate <> AccountScheduleLine.GETRANGEMAX("Date Filter") THEN BEGIN EndDate := AccountScheduleLine.GETRANGEMAX("Date Filter"); FiscalStartDate := FindFiscalYear(EndDate); END; DivisionError := FALSE; PeriodError := FALSE; CallLevel := 0; CallingAccSchedLineID := AccSchedLine."Line No."; CallingColumnLayoutID := ColumnLayout."Line No."; IF (OldAccSchedLineFilters <> AccSchedLine.GETFILTERS) OR (OldColumnLayoutFilters <> ColumnLayout.GETFILTERS) OR (OldAccSchedLineName <> AccSchedLine."Schedule Name") OR (OldColumnLayoutName <> ColumnLayout."Column Layout Name") OR (OldCalcAddCurr <> CalcAddCurr) THEN BEGIN AccSchedCellValue.RESET; AccSchedCellValue.DELETEALL; CLEAR(BasePercentLine); OldAccSchedLineFilters := AccSchedLine.GETFILTERS; OldColumnLayoutFilters := ColumnLayout.GETFILTERS; OldAccSchedLineName := AccSchedLine."Schedule Name"; OldColumnLayoutName := ColumnLayout."Column Layout Name"; OldCalcAddCurr := CalcAddCurr; END; Result := CalcCellValue(AccSchedLine,ColumnLayout,CalcAddCurr); WITH ColumnLayout DO BEGIN CASE Show OF Show::"When Positive": IF Result < 0 THEN Result := 0; Show::"When Negative": IF Result > 0 THEN Result := 0; END; IF "Show Opposite Sign" THEN Result := -Result; END; IF AccSchedLine."Show Opposite Sign" THEN Result := -Result; EXIT(Result); END; LOCAL PROCEDURE CalcCellValue@6(AccSchedLine@1000 : Record 85;ColumnLayout@1001 : Record 334;CalcAddCurr@1002 : Boolean) : Decimal; VAR GLAcc@1004 : Record 15; CostType@1005 : Record 1103; CFAccount@1003 : Record 841; Result@1015 : Decimal; HistoricGLAcc@1100000 : Record 10721; AccSchedName@1100001 : Record 84; BEGIN Result := 0; IF AccSchedLine.Totaling <> '' THEN IF AccSchedCellValue.GET(AccSchedLine."Line No.",ColumnLayout."Line No.") THEN BEGIN Result := AccSchedCellValue.Value; DivisionError := DivisionError OR AccSchedCellValue."Has Error"; PeriodError := PeriodError OR AccSchedCellValue."Period Error"; END ELSE BEGIN IF ColumnLayout."Column Type" = ColumnLayout."Column Type"::Formula THEN Result := EvaluateExpression( FALSE,ColumnLayout.Formula,AccSchedLine,ColumnLayout,CalcAddCurr) ELSE IF AccSchedLine."Totaling Type" IN [AccSchedLine."Totaling Type"::Formula,AccSchedLine."Totaling Type"::"Set Base For Percent"] THEN Result := EvaluateExpression( TRUE,AccSchedLine.Totaling,AccSchedLine,ColumnLayout,CalcAddCurr) ELSE IF (StartDate = 0D) OR (EndDate = 0D) OR (EndDate = 31129999D) THEN BEGIN Result := 0; PeriodError := TRUE; END ELSE BEGIN IF AccSchedLine."Totaling Type" IN [AccSchedLine."Totaling Type"::"Posting Accounts",AccSchedLine."Totaling Type"::"Total Accounts"] THEN BEGIN AccSchedLine.COPYFILTERS(AccountScheduleLine); IF AccSchedName.GET(AccSchedLine."Schedule Name") AND AccSchedName."Acc. No. Referred to old Acc." THEN BEGIN SetHistoricGLAccRowFilters(HistoricGLAcc,AccSchedLine); SetHistoricGLAccColumnFilters(HistoricGLAcc,AccSchedLine,ColumnLayout); IF (AccSchedLine."Totaling Type" = AccSchedLine."Totaling Type"::"Posting Accounts") AND (STRLEN(AccSchedLine.Totaling) <= MAXSTRLEN(HistoricGLAcc.Totaling)) AND (STRPOS(AccSchedLine.Totaling,'*') = 0) THEN BEGIN HistoricGLAcc."Account Type" := HistoricGLAcc."Account Type"::"2"; HistoricGLAcc.Totaling := AccSchedLine.Totaling; Result := Result + CalcHistoricGLAcc(HistoricGLAcc,AccSchedLine,ColumnLayout,CalcAddCurr); END ELSE IF HistoricGLAcc.FIND('-') THEN REPEAT Result := Result + CalcHistoricGLAcc(HistoricGLAcc,AccSchedLine,ColumnLayout,CalcAddCurr); UNTIL HistoricGLAcc.NEXT = 0; END ELSE BEGIN SetGLAccRowFilters(GLAcc,AccSchedLine); SetGLAccColumnFilters(GLAcc,AccSchedLine,ColumnLayout); IF (AccSchedLine."Totaling Type" = AccSchedLine."Totaling Type"::"Posting Accounts") AND (STRLEN(AccSchedLine.Totaling) <= MAXSTRLEN(GLAcc.Totaling)) AND (STRPOS(AccSchedLine.Totaling,'*') = 0) THEN BEGIN GLAcc."Account Type" := GLAcc."Account Type"::"2"; GLAcc.Totaling := AccSchedLine.Totaling; Result := Result + CalcGLAcc(GLAcc,AccSchedLine,ColumnLayout,CalcAddCurr); END ELSE IF GLAcc.FIND('-') THEN REPEAT Result := Result + CalcGLAcc(GLAcc,AccSchedLine,ColumnLayout,CalcAddCurr); UNTIL GLAcc.NEXT = 0; END; END; IF AccSchedLine."Totaling Type" IN [AccSchedLine."Totaling Type"::"Cost Type",AccSchedLine."Totaling Type"::"Cost Type Total"] THEN BEGIN AccSchedLine.COPYFILTERS(AccountScheduleLine); SetCostTypeRowFilters(CostType,AccSchedLine,ColumnLayout); SetCostTypeColumnFilters(CostType,AccSchedLine,ColumnLayout); IF (AccSchedLine."Totaling Type" = AccSchedLine."Totaling Type"::"Cost Type") AND (STRLEN(AccSchedLine.Totaling) <= MAXSTRLEN(GLAcc.Totaling)) AND (STRPOS(AccSchedLine.Totaling,'*') = 0) THEN BEGIN CostType.Type := CostType.Type::Total; CostType.Totaling := AccSchedLine.Totaling; Result := Result + CalcCostType(CostType,AccSchedLine,ColumnLayout,CalcAddCurr); END ELSE BEGIN IF CostType.FIND('-') THEN REPEAT Result := Result + CalcCostType(CostType,AccSchedLine,ColumnLayout,CalcAddCurr); UNTIL CostType.NEXT = 0; END; END; IF AccSchedLine."Totaling Type" IN [AccSchedLine."Totaling Type"::"Cash Flow Entry Accounts",AccSchedLine."Totaling Type"::"Cash Flow Total Accounts"] THEN BEGIN AccSchedLine.COPYFILTERS(AccountScheduleLine); SetCFAccRowFilter(CFAccount,AccSchedLine); SetCFAccColumnFilter(CFAccount,AccSchedLine,ColumnLayout); IF (AccSchedLine."Totaling Type" = AccSchedLine."Totaling Type"::"Cash Flow Entry Accounts") AND (STRLEN(AccSchedLine.Totaling) <= 30) THEN BEGIN CFAccount."Account Type" := CFAccount."Account Type"::Total; CFAccount.Totaling := AccSchedLine.Totaling; Result := Result + CalcCFAccount(CFAccount,AccSchedLine,ColumnLayout); END ELSE IF CFAccount.FIND('-') THEN REPEAT Result := Result + CalcCFAccount(CFAccount,AccSchedLine,ColumnLayout); UNTIL CFAccount.NEXT = 0; END; END; AccSchedCellValue."Row No." := AccSchedLine."Line No."; AccSchedCellValue."Column No." := ColumnLayout."Line No."; AccSchedCellValue.Value := Result; AccSchedCellValue."Has Error" := DivisionError; AccSchedCellValue."Period Error" := PeriodError; AccSchedCellValue.INSERT; END; IF AccSchedLine."Reverse Sign" THEN Result := -Result; IF AccSchedLine."Positive Only" AND (Result < 0) THEN Result := 0; EXIT(Result); END; LOCAL PROCEDURE CalcGLAcc@7(VAR GLAcc@1001 : Record 15;VAR AccSchedLine@1002 : Record 85;VAR ColumnLayout@1003 : Record 334;CalcAddCurr@1004 : Boolean) ColValue@1000 : Decimal; VAR GLEntry@1005 : Record 17; GLBudgEntry@1006 : Record 96; AnalysisViewEntry@1007 : Record 365; AnalysisViewBudgetEntry@1008 : Record 366; AmountType@1009 : 'Net Amount,Debit Amount,Credit Amount'; TestBalance@1010 : Boolean; Balance@1011 : Decimal; UseBusUnitFilter@1111 : Boolean; UseDimFilter@1012 : Boolean; BEGIN ColValue := 0; UseDimFilter := FALSE; IF AccSchedName.Name <> AccSchedLine."Schedule Name" THEN AccSchedName.GET(AccSchedLine."Schedule Name"); IF ConflictAmountType(AccSchedLine,ColumnLayout."Amount Type",AmountType) THEN EXIT(0); TestBalance := AccSchedLine.Show IN [AccSchedLine.Show::"When Positive Balance",AccSchedLine.Show::"When Negative Balance"]; IF ColumnLayout."Column Type" <> ColumnLayout."Column Type"::Formula THEN BEGIN UseBusUnitFilter := (AccSchedLine.GETFILTER("Business Unit Filter") <> '') OR (ColumnLayout."Business Unit Totaling" <> ''); UseDimFilter := HasDimFilter(AccSchedLine,ColumnLayout); CASE ColumnLayout."Ledger Entry Type" OF ColumnLayout."Ledger Entry Type"::Entries: BEGIN IF AccSchedName."Analysis View Name" = '' THEN WITH GLEntry DO BEGIN IF UseBusUnitFilter THEN IF UseDimFilter THEN SETCURRENTKEY( "G/L Account No.","Business Unit Code","Global Dimension 1 Code","Global Dimension 2 Code") ELSE SETCURRENTKEY( "G/L Account No.","Business Unit Code","Posting Date") ELSE IF UseDimFilter THEN SETCURRENTKEY("G/L Account No.","Global Dimension 1 Code","Global Dimension 2 Code") ELSE SETCURRENTKEY("G/L Account No.","Posting Date"); IF GLAcc.Totaling = '' THEN SETRANGE("G/L Account No.",GLAcc."No.") ELSE SETFILTER("G/L Account No.",GLAcc.Totaling); GLAcc.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Global Dimension 1 Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Global Dimension 2 Code"); FILTERGROUP(2); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); FILTERGROUP(8); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN IF CalcAddCurr THEN BEGIN CALCSUMS("Additional-Currency Amount"); ColValue := "Additional-Currency Amount"; END ELSE BEGIN CALCSUMS(Amount); ColValue := Amount; END; Balance := ColValue; END; AmountType::"Debit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Currency Debit Amount","Additional-Currency Amount"); Balance := "Additional-Currency Amount"; END ELSE CALCSUMS("Add.-Currency Debit Amount"); ColValue := "Add.-Currency Debit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Debit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Debit Amount"); ColValue := "Debit Amount"; END; END; AmountType::"Credit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Currency Credit Amount","Additional-Currency Amount"); Balance := "Additional-Currency Amount"; END ELSE CALCSUMS("Add.-Currency Credit Amount"); ColValue := "Add.-Currency Credit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Credit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Credit Amount"); ColValue := "Credit Amount"; END; END; END; END ELSE WITH AnalysisViewEntry DO BEGIN SETRANGE("Analysis View Code",AccSchedName."Analysis View Name"); SETRANGE("Account Source","Account Source"::"G/L Account"); IF GLAcc.Totaling = '' THEN SETRANGE("Account No.",GLAcc."No.") ELSE SETFILTER("Account No.",GLAcc.Totaling); GLAcc.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Dimension 1 Value Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Dimension 2 Value Code"); AccSchedLine.COPYFILTER("Dimension 3 Filter","Dimension 3 Value Code"); AccSchedLine.COPYFILTER("Dimension 4 Filter","Dimension 4 Value Code"); FILTERGROUP(2); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,AccSchedLine."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,AccSchedLine."Dimension 4 Totaling")); FILTERGROUP(8); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,ColumnLayout."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,ColumnLayout."Dimension 4 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN IF CalcAddCurr THEN BEGIN CALCSUMS("Add.-Curr. Amount"); ColValue := "Add.-Curr. Amount"; END ELSE BEGIN CALCSUMS(Amount); ColValue := Amount; END; Balance := ColValue; END; AmountType::"Debit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Curr. Debit Amount","Add.-Curr. Amount"); Balance := "Add.-Curr. Amount"; END ELSE CALCSUMS("Add.-Curr. Debit Amount"); ColValue := "Add.-Curr. Debit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Debit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Debit Amount"); ColValue := "Debit Amount"; END; END; AmountType::"Credit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Curr. Credit Amount","Add.-Curr. Amount"); Balance := "Add.-Curr. Amount"; END ELSE CALCSUMS("Add.-Curr. Credit Amount"); ColValue := "Add.-Curr. Credit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Credit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Credit Amount"); ColValue := "Credit Amount"; END; END; END; END; END; ColumnLayout."Ledger Entry Type"::"Budget Entries": BEGIN IF AccSchedName."Analysis View Name" = '' THEN WITH GLBudgEntry DO BEGIN IF UseBusUnitFilter OR UseDimFilter THEN SETCURRENTKEY( "Budget Name","G/L Account No.","Business Unit Code", "Global Dimension 1 Code","Global Dimension 2 Code", "Budget Dimension 1 Code","Budget Dimension 2 Code", "Budget Dimension 3 Code","Budget Dimension 4 Code",Date) ELSE SETCURRENTKEY("Budget Name","G/L Account No.",Date); IF GLAcc.Totaling = '' THEN SETRANGE("G/L Account No.",GLAcc."No.") ELSE SETFILTER("G/L Account No.",GLAcc.Totaling); GLAcc.COPYFILTER("Date Filter",Date); AccSchedLine.COPYFILTER("G/L Budget Filter","Budget Name"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Global Dimension 1 Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Global Dimension 2 Code"); FILTERGROUP(2); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); FILTERGROUP(8); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; END; AmountType::"Debit Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; IF ColValue < 0 THEN ColValue := 0; END; AmountType::"Credit Amount": BEGIN CALCSUMS(Amount); ColValue := -Amount; IF ColValue < 0 THEN ColValue := 0; END; END; Balance := Amount; END ELSE WITH AnalysisViewBudgetEntry DO BEGIN IF GLAcc.Totaling = '' THEN SETRANGE("G/L Account No.",GLAcc."No.") ELSE SETFILTER("G/L Account No.",GLAcc.Totaling); SETRANGE("Analysis View Code",AccSchedName."Analysis View Name"); GLAcc.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("G/L Budget Filter","Budget Name"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Dimension 1 Value Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Dimension 2 Value Code"); AccSchedLine.COPYFILTER("Dimension 3 Filter","Dimension 3 Value Code"); AccSchedLine.COPYFILTER("Dimension 4 Filter","Dimension 4 Value Code"); FILTERGROUP(2); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,AccSchedLine."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,AccSchedLine."Dimension 4 Totaling")); FILTERGROUP(8); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,ColumnLayout."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,ColumnLayout."Dimension 4 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; END; AmountType::"Debit Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; IF ColValue < 0 THEN ColValue := 0; END; AmountType::"Credit Amount": BEGIN CALCSUMS(Amount); ColValue := -Amount; IF ColValue < 0 THEN ColValue := 0; END; END; Balance := Amount; END; IF CalcAddCurr THEN BEGIN IF NOT GLSetupRead THEN BEGIN GLSetup.GET; GLSetupRead := TRUE; IF GLSetup."Additional Reporting Currency" <> '' THEN AddRepCurrency.GET(GLSetup."Additional Reporting Currency"); END; IF GLSetup."Additional Reporting Currency" <> '' THEN ColValue := ROUND(ExchangeAmtAddCurrToLCY(ColValue),AddRepCurrency."Amount Rounding Precision") ELSE ColValue := 0; END; END; END; IF TestBalance THEN BEGIN IF AccSchedLine.Show = AccSchedLine.Show::"When Positive Balance" THEN IF Balance < 0 THEN EXIT(0); IF AccSchedLine.Show = AccSchedLine.Show::"When Negative Balance" THEN IF Balance > 0 THEN EXIT(0); END; END; EXIT(ColValue); END; LOCAL PROCEDURE CalcCFAccount@39(VAR CFAccount@1000 : Record 841;VAR AccSchedLine@1001 : Record 85;VAR ColumnLayout@1002 : Record 334) ColValue@1003 : Decimal; VAR CFForecastEntry@1004 : Record 847; AnalysisViewEntry@1007 : Record 365; AmountType@1009 : 'Net Amount,Debit Amount,Credit Amount'; BEGIN ColValue := 0; IF AccSchedName.Name <> AccSchedLine."Schedule Name" THEN AccSchedName.GET(AccSchedLine."Schedule Name"); IF ConflictAmountType(AccSchedLine,ColumnLayout."Amount Type",AmountType) THEN EXIT(0); IF ColumnLayout."Column Type" <> ColumnLayout."Column Type"::Formula THEN CASE ColumnLayout."Ledger Entry Type" OF ColumnLayout."Ledger Entry Type"::Entries: BEGIN IF AccSchedName."Analysis View Name" = '' THEN WITH CFForecastEntry DO BEGIN SETCURRENTKEY( "Cash Flow Account No.","Cash Flow Forecast No.","Global Dimension 1 Code", "Global Dimension 2 Code","Cash Flow Date"); IF CFAccount.Totaling = '' THEN SETRANGE("Cash Flow Account No.",CFAccount."No.") ELSE SETFILTER("Cash Flow Account No.",CFAccount.Totaling); CFAccount.COPYFILTER("Date Filter","Cash Flow Date"); AccSchedLine.COPYFILTER("Cash Flow Forecast Filter","Cash Flow Forecast No."); AccSchedLine.COPYFILTER("Dimension 1 Filter","Global Dimension 1 Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Global Dimension 2 Code"); FILTERGROUP(2); SETFILTER("Global Dimension 1 Code",AccSchedLine."Dimension 1 Totaling"); SETFILTER("Global Dimension 2 Code",AccSchedLine."Dimension 2 Totaling"); FILTERGROUP(8); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); FILTERGROUP(0); CASE ColumnLayout."Amount Type" OF ColumnLayout."Amount Type"::"Net Amount": BEGIN CALCSUMS("Amount (LCY)"); ColValue := "Amount (LCY)"; END; END; END ELSE WITH AnalysisViewEntry DO BEGIN SETRANGE("Analysis View Code",AccSchedName."Analysis View Name"); SETRANGE("Account Source","Account Source"::"Cash Flow Account"); IF CFAccount.Totaling = '' THEN SETRANGE("Account No.",CFAccount."No.") ELSE SETFILTER("Account No.",CFAccount.Totaling); CFAccount.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("Cash Flow Forecast Filter","Cash Flow Forecast No."); AccSchedLine.COPYFILTER("Dimension 1 Filter","Dimension 1 Value Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Dimension 2 Value Code"); AccSchedLine.COPYFILTER("Dimension 3 Filter","Dimension 3 Value Code"); AccSchedLine.COPYFILTER("Dimension 4 Filter","Dimension 4 Value Code"); FILTERGROUP(2); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,AccSchedLine."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,AccSchedLine."Dimension 4 Totaling")); FILTERGROUP(8); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,ColumnLayout."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,ColumnLayout."Dimension 4 Totaling")); FILTERGROUP(0); CASE ColumnLayout."Amount Type" OF ColumnLayout."Amount Type"::"Net Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; END; END; END; END; END; EXIT(ColValue); END; PROCEDURE SetGLAccRowFilters@17(VAR GLAcc@1000 : Record 15;VAR AccSchedLine2@1001 : Record 85); BEGIN WITH AccSchedLine2 DO CASE "Totaling Type" OF "Totaling Type"::"Posting Accounts": BEGIN GLAcc.SETFILTER("No.",Totaling); GLAcc.SETRANGE("Account Type",GLAcc."Account Type"::Posting); END; "Totaling Type"::"Total Accounts": BEGIN GLAcc.SETFILTER("No.",Totaling); GLAcc.SETFILTER("Account Type",'<>%1',GLAcc."Account Type"::Posting); END; END; END; PROCEDURE SetCFAccRowFilter@817(VAR CFAccount@1000 : Record 841;VAR AccSchedLine2@1001 : Record 85); BEGIN WITH AccSchedLine2 DO BEGIN COPYFILTER("Cash Flow Forecast Filter",CFAccount."Cash Flow Forecast Filter"); CASE "Totaling Type" OF "Totaling Type"::"Cash Flow Entry Accounts": BEGIN CFAccount.SETFILTER("No.",Totaling); CFAccount.SETRANGE("Account Type",CFAccount."Account Type"::Entry); END; "Totaling Type"::"Cash Flow Total Accounts": BEGIN CFAccount.SETFILTER("No.",Totaling); CFAccount.SETFILTER("Account Type",'<>%1',CFAccount."Account Type"::Entry); END; END; END; END; PROCEDURE SetGLAccColumnFilters@20(VAR GLAcc@1000 : Record 15;AccSchedLine2@1005 : Record 85;VAR ColumnLayout@1001 : Record 334); VAR FromDate@1002 : Date; ToDate@1003 : Date; FiscalStartDate2@1004 : Date; BEGIN WITH ColumnLayout DO BEGIN CalcColumnDates("Comparison Date Formula","Comparison Period Formula",FromDate,ToDate,FiscalStartDate2); CASE "Column Type" OF "Column Type"::"Net Change": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": GLAcc.SETRANGE("Date Filter",FromDate,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": GLAcc.SETFILTER("Date Filter",'<%1',FromDate); // always includes closing date AccSchedLine2."Row Type"::"Balance at Date": GLAcc.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Balance at Date": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Beginning Balance" THEN GLAcc.SETRANGE("Date Filter",0D) // Force a zero return ELSE GLAcc.SETRANGE("Date Filter",0D,ToDate); "Column Type"::"Beginning Balance": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Balance at Date" THEN GLAcc.SETRANGE("Date Filter",0D) // Force a zero return ELSE GLAcc.SETRANGE( "Date Filter",0D,CLOSINGDATE(FromDate - 1)); "Column Type"::"Year to Date": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": GLAcc.SETRANGE("Date Filter",FiscalStartDate2,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": GLAcc.SETFILTER("Date Filter",'<%1',FiscalStartDate2); // always includes closing date AccSchedLine2."Row Type"::"Balance at Date": GLAcc.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Rest of Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": GLAcc.SETRANGE( "Date Filter",CALCDATE('<+1D>',ToDate),FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": GLAcc.SETRANGE("Date Filter",0D,ToDate); AccSchedLine2."Row Type"::"Balance at Date": GLAcc.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; "Column Type"::"Entire Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": GLAcc.SETRANGE( "Date Filter", FiscalStartDate2, FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": GLAcc.SETFILTER("Date Filter",'<%1',FiscalStartDate2); // always includes closing date AccSchedLine2."Row Type"::"Balance at Date": GLAcc.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; END; END; END; PROCEDURE SetCFAccColumnFilter@38(VAR CFAccount@1000 : Record 841;AccSchedLine2@1005 : Record 85;VAR ColumnLayout2@1001 : Record 334); VAR FromDate@1002 : Date; ToDate@1003 : Date; FiscalStartDate2@1004 : Date; BEGIN WITH ColumnLayout2 DO BEGIN IF (FORMAT("Comparison Date Formula") <> '0') AND (FORMAT("Comparison Date Formula") <> '') THEN BEGIN FromDate := CALCDATE("Comparison Date Formula",StartDate); IF (StartDate = CALCDATE('<-CM>',StartDate)) AND (FromDate = CALCDATE('<-CM>',FromDate)) AND (EndDate = CALCDATE('',EndDate)) THEN ToDate := CALCDATE('',ToDate) ELSE ToDate := CALCDATE("Comparison Date Formula",EndDate); FiscalStartDate2 := FindFiscalYear(ToDate); END ELSE IF "Comparison Period Formula" <> '' THEN BEGIN AccPeriodStartEnd("Comparison Period Formula",StartDate,FromDate,ToDate); FiscalStartDate2 := FindFiscalYear(ToDate); END ELSE BEGIN FromDate := StartDate; ToDate := EndDate; FiscalStartDate2 := FiscalStartDate; END; CASE "Column Type" OF "Column Type"::"Net Change": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CFAccount.SETRANGE("Date Filter",FromDate,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": CFAccount.SETFILTER("Date Filter",'<%1',FromDate); AccSchedLine2."Row Type"::"Balance at Date": CFAccount.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Balance at Date": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Beginning Balance" THEN CFAccount.SETRANGE("Date Filter",0D) // Force a zero return ELSE CFAccount.SETRANGE("Date Filter",0D,ToDate); "Column Type"::"Beginning Balance": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Balance at Date" THEN CFAccount.SETRANGE("Date Filter",0D) // Force a zero return ELSE CFAccount.SETRANGE( "Date Filter",0D,CALCDATE('<-1D>',FromDate)); "Column Type"::"Year to Date": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CFAccount.SETRANGE("Date Filter",FiscalStartDate2,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": CFAccount.SETFILTER("Date Filter",'<%1',FiscalStartDate2); AccSchedLine2."Row Type"::"Balance at Date": CFAccount.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Rest of Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CFAccount.SETRANGE( "Date Filter", CALCDATE('<+1D>',ToDate),FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": CFAccount.SETRANGE("Date Filter",0D,ToDate); AccSchedLine2."Row Type"::"Balance at Date": CFAccount.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; "Column Type"::"Entire Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CFAccount.SETRANGE( "Date Filter", FiscalStartDate2,FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": CFAccount.SETFILTER("Date Filter",'<%1',FiscalStartDate2); AccSchedLine2."Row Type"::"Balance at Date": CFAccount.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; END; END; END; LOCAL PROCEDURE EvaluateExpression@9(IsAccSchedLineExpression@1000 : Boolean;Expression@1001 : Text[250];AccSchedLine@1002 : Record 85;ColumnLayout@1003 : Record 334;CalcAddCurr@1004 : Boolean) : Decimal; VAR AccSchedLine2@1018 : Record 85; Result@1005 : Decimal; Parantheses@1006 : Integer; Operator@1007 : Char; LeftOperand@1008 : Text[80]; RightOperand@1009 : Text[80]; LeftResult@1010 : Decimal; RightResult@1011 : Decimal; i@1012 : Integer; IsExpression@1013 : Boolean; IsFilter@1014 : Boolean; Operators@1015 : Text[8]; OperatorNo@1016 : Integer; AccSchedLineID@1017 : Integer; BEGIN Result := 0; CallLevel := CallLevel + 1; IF CallLevel > 25 THEN ShowError(Text020, AccSchedLine,ColumnLayout); Expression := DELCHR(Expression,'<>',' '); IF STRLEN(Expression) > 0 THEN BEGIN Parantheses := 0; IsExpression := FALSE; Operators := '+-*/^%'; OperatorNo := 1; REPEAT i := STRLEN(Expression); REPEAT IF Expression[i] = '(' THEN Parantheses := Parantheses + 1 ELSE IF Expression[i] = ')' THEN Parantheses := Parantheses - 1; IF (Parantheses = 0) AND (Expression[i] = Operators[OperatorNo]) THEN IsExpression := TRUE ELSE i := i - 1; UNTIL IsExpression OR (i <= 0); IF NOT IsExpression THEN OperatorNo := OperatorNo + 1; UNTIL (OperatorNo > STRLEN(Operators)) OR IsExpression; IF IsExpression THEN BEGIN IF i > 1 THEN LeftOperand := COPYSTR(Expression,1,i - 1) ELSE LeftOperand := ''; IF i < STRLEN(Expression) THEN RightOperand := COPYSTR(Expression,i + 1) ELSE RightOperand := ''; Operator := Expression[i]; LeftResult := EvaluateExpression( IsAccSchedLineExpression,LeftOperand,AccSchedLine,ColumnLayout,CalcAddCurr); IF (RightOperand = '') AND (Operator = '%') AND NOT IsAccSchedLineExpression AND (AccSchedLine."Totaling Type" <> AccSchedLine."Totaling Type"::"Set Base For Percent") THEN BEGIN AccSchedLine2.COPY(AccSchedLine); AccSchedLine2."Line No." := GetBasePercentLine(AccSchedLine,ColumnLayout); AccSchedLine2.FIND; RightResult := EvaluateExpression( IsAccSchedLineExpression,LeftOperand,AccSchedLine2,ColumnLayout,CalcAddCurr); END ELSE RightResult := EvaluateExpression( IsAccSchedLineExpression,RightOperand,AccSchedLine,ColumnLayout,CalcAddCurr); CASE Operator OF '^': Result := POWER(LeftResult,RightResult); '%': IF RightResult = 0 THEN BEGIN Result := 0; DivisionError := TRUE; END ELSE Result := 100 * LeftResult / RightResult; '*': Result := LeftResult * RightResult; '/': IF RightResult = 0 THEN BEGIN Result := 0; DivisionError := TRUE; END ELSE Result := LeftResult / RightResult; '+': Result := LeftResult + RightResult; '-': Result := LeftResult - RightResult; '[': IF RightResult >= 0 THEN Result := LeftResult + RightResult ELSE Result := LeftResult; END; END ELSE IF (Expression[1] = '(') AND (Expression[STRLEN(Expression)] = ')') THEN Result := EvaluateExpression( IsAccSchedLineExpression,COPYSTR(Expression,2,STRLEN(Expression) - 2), AccSchedLine,ColumnLayout,CalcAddCurr) ELSE BEGIN IsFilter := (STRPOS(Expression,'..') + STRPOS(Expression,'|') + STRPOS(Expression,'<') + STRPOS(Expression,'>') + STRPOS(Expression,'&') + STRPOS(Expression,'=') > 0); IF (STRLEN(Expression) > 10) AND (NOT IsFilter) THEN EVALUATE(Result,Expression) ELSE IF IsAccSchedLineExpression THEN BEGIN AccSchedLine.SETRANGE("Schedule Name",AccSchedLine."Schedule Name"); AccSchedLine.SETFILTER("Row No.",Expression); AccSchedLineID := AccSchedLine."Line No."; IF AccSchedLine.FIND('-') THEN REPEAT IF AccSchedLine."Line No." <> AccSchedLineID THEN Result := Result + CalcCellValue(AccSchedLine,ColumnLayout,CalcAddCurr); UNTIL AccSchedLine.NEXT = 0 ELSE IF IsFilter OR (NOT EVALUATE(Result,Expression)) THEN ShowError(Text012,AccSchedLine,ColumnLayout); END ELSE BEGIN ColumnLayout.SETRANGE("Column Layout Name",ColumnLayout."Column Layout Name"); ColumnLayout.SETFILTER("Column No.",Expression); AccSchedLineID := ColumnLayout."Line No."; IF ColumnLayout.FIND('-') THEN REPEAT IF ColumnLayout."Line No." <> AccSchedLineID THEN Result := Result + CalcCellValue(AccSchedLine,ColumnLayout,CalcAddCurr); UNTIL ColumnLayout.NEXT = 0 ELSE IF IsFilter OR (NOT EVALUATE(Result,Expression)) THEN ShowError(Text013,AccSchedLine,ColumnLayout); END; END; END; CallLevel := CallLevel - 1; EXIT(Result); END; PROCEDURE FormatCellAsText@24(VAR ColumnLayout2@1000 : Record 334;Value@1001 : Decimal) : Text[30]; VAR GLSetup@1100010 : Record 98; ValueAsText@1003 : Text[30]; Currency@1100011 : Record 4; BEGIN IF NormalFormatString = '' THEN BEGIN IF NOT GLSetupRead THEN BEGIN GLSetup.GET; GLSetupRead := TRUE; END; NormalFormatString := Text014 + GLSetup."Amount Decimal Places" + Text015; IF OldCalcAddCurr THEN BEGIN GLSetup.TESTFIELD("Additional Reporting Currency"); Currency.SETRANGE(Code,GLSetup."Additional Reporting Currency"); IF Currency.FINDFIRST THEN NormalFormatString := Text014 + Currency."Amount Decimal Places" + Text015; END ELSE NormalFormatString := Text014 + GLSetup."Amount Decimal Places" + Text015; END; WITH ColumnLayout2 DO IF Value <> 0 THEN BEGIN CASE "Rounding Factor" OF "Rounding Factor"::None: ValueAsText := FORMAT(Value,0,NormalFormatString); "Rounding Factor"::"1": ValueAsText := FORMAT(ROUND(Value,1)); "Rounding Factor"::"1000": ValueAsText := FORMAT(ROUND(Value / 1000,1)); "Rounding Factor"::"1000000": ValueAsText := FORMAT(ROUND(Value / 1000000,1)); END; IF ("Column Type" = "Column Type"::Formula) AND (STRPOS(Formula,'%') > 1) THEN ValueAsText := ValueAsText + '%'; END; EXIT(ValueAsText); END; PROCEDURE GetDivisionError@18() : Boolean; BEGIN EXIT(DivisionError); END; PROCEDURE GetPeriodError@31() : Boolean; BEGIN EXIT(PeriodError); END; PROCEDURE ShowError@19(MessageLine@1000 : Text[100];VAR AccSchedLine@1001 : Record 85;VAR ColumnLayout@1002 : Record 334); BEGIN AccSchedLine.SETRANGE("Schedule Name",AccSchedLine."Schedule Name"); AccSchedLine.SETRANGE("Line No.",CallingAccSchedLineID); IF AccSchedLine.FINDFIRST THEN; ColumnLayout.SETRANGE("Column Layout Name",ColumnLayout."Column Layout Name"); ColumnLayout.SETRANGE("Line No.",CallingColumnLayoutID); IF ColumnLayout.FINDFIRST THEN; ERROR( STRSUBSTNO( Text016, MessageLine, Text017, STRSUBSTNO(Text018,AccSchedLine."Row No.",AccSchedLine."Line No.",AccSchedLine.Totaling), STRSUBSTNO(Text019,ColumnLayout."Column No.",ColumnLayout."Line No.",ColumnLayout.Formula))); END; PROCEDURE InsertGLAccounts@12(VAR AccSchedLine@1000 : Record 85); VAR GLAcc@1001 : Record 15; GLAccList@1002 : Page 18; AccCounter@1003 : Integer; AccSchedLineNo@1004 : Integer; BEGIN GLAccList.LOOKUPMODE(TRUE); IF GLAccList.RUNMODAL = ACTION::LookupOK THEN BEGIN GLAccList.SetSelection(GLAcc); AccCounter := GLAcc.COUNT; IF AccCounter > 0 THEN BEGIN AccSchedLineNo := AccSchedLine."Line No."; MoveAccSchedLines(AccSchedLine,AccCounter); IF GLAcc.FINDSET THEN REPEAT AccSchedLine.INIT; AccSchedLineNo := AccSchedLineNo + 10000; AccSchedLine."Line No." := AccSchedLineNo; AccSchedLine.Description := GLAcc.Name; IF GLAcc."Account Type" IN [GLAcc."Account Type"::Posting,GLAcc."Account Type"::Heading] THEN BEGIN AccSchedLine.Totaling := GLAcc."No."; AccSchedLine."Row No." := COPYSTR(GLAcc."No.",1,MAXSTRLEN(AccSchedLine."Row No.")); END; IF GLAcc."Account Type" = GLAcc."Account Type"::Heading THEN AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Total Accounts" ELSE AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Posting Accounts"; AccSchedLine.INSERT; UNTIL GLAcc.NEXT = 0; END; END; END; PROCEDURE InsertCFAccounts@47(VAR AccSchedLine@1000 : Record 85); VAR CashFlowAcc@1001 : Record 841; CashFlowAccList@1002 : Page 855; AccCounter@1003 : Integer; AccSchedLineNo@1004 : Integer; BEGIN CashFlowAccList.LOOKUPMODE(TRUE); IF CashFlowAccList.RUNMODAL = ACTION::LookupOK THEN BEGIN CashFlowAccList.SetSelection(CashFlowAcc); AccCounter := CashFlowAcc.COUNT; IF AccCounter > 0 THEN BEGIN AccSchedLineNo := AccSchedLine."Line No."; MoveAccSchedLines(AccSchedLine,AccCounter); IF CashFlowAcc.FINDSET THEN REPEAT AccSchedLine.INIT; AccSchedLineNo := AccSchedLineNo + 10000; AccSchedLine."Line No." := AccSchedLineNo; AccSchedLine.Description := CashFlowAcc.Name; IF CashFlowAcc."Account Type" IN [CashFlowAcc."Account Type"::Entry,CashFlowAcc."Account Type"::Total,CashFlowAcc."Account Type"::"End-Total"] THEN BEGIN AccSchedLine.Totaling := CashFlowAcc."No."; AccSchedLine."Row No." := COPYSTR(CashFlowAcc."No.",1,MAXSTRLEN(AccSchedLine."Row No.")); END; IF CashFlowAcc."Account Type" IN [CashFlowAcc."Account Type"::Total,CashFlowAcc."Account Type"::"End-Total"] THEN AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Cash Flow Total Accounts" ELSE AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Cash Flow Entry Accounts"; AccSchedLine.INSERT; UNTIL CashFlowAcc.NEXT = 0; END; END; END; PROCEDURE InsertCostTypes@43(VAR AccSchedLine@1000 : Record 85); VAR CostType@1001 : Record 1103; CostTypeList@1002 : Page 1124; AccCounter@1003 : Integer; AccSchedLineNo@1004 : Integer; BEGIN CostTypeList.LOOKUPMODE(TRUE); IF CostTypeList.RUNMODAL = ACTION::LookupOK THEN BEGIN CostTypeList.SetSelection(CostType); AccCounter := CostType.COUNT; IF AccCounter > 0 THEN BEGIN AccSchedLineNo := AccSchedLine."Line No."; MoveAccSchedLines(AccSchedLine,AccCounter); IF CostType.FINDSET THEN REPEAT AccSchedLine.INIT; AccSchedLineNo := AccSchedLineNo + 10000; AccSchedLine."Line No." := AccSchedLineNo; AccSchedLine.Description := CostType.Name; IF CostType.Type IN [CostType.Type::"Cost Type",CostType.Type::Total,CostType.Type::"End-Total"] THEN BEGIN AccSchedLine.Totaling := CostType."No."; AccSchedLine."Row No." := COPYSTR(CostType."No.",1,MAXSTRLEN(AccSchedLine."Row No.")); END; IF CostType.Type IN [CostType.Type::Total,CostType.Type::"End-Total"] THEN AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Cost Type Total" ELSE AccSchedLine."Totaling Type" := AccSchedLine."Totaling Type"::"Cost Type"; AccSchedLine.INSERT; UNTIL CostType.NEXT = 0; END; END; END; LOCAL PROCEDURE ExchangeAmtAddCurrToLCY@23(AmountLCY@1000 : Decimal) : Decimal; BEGIN IF NOT GLSetupRead THEN BEGIN GLSetup.GET; GLSetupRead := TRUE; END; EXIT( CurrExchRate.ExchangeAmtLCYToFCY( WORKDATE,GLSetup."Additional Reporting Currency",AmountLCY, CurrExchRate.ExchangeRate(WORKDATE,GLSetup."Additional Reporting Currency"))); END; PROCEDURE SetAccSchedName@22(VAR NewAccSchedName@1000 : Record 84); BEGIN AccSchedName := NewAccSchedName; END; PROCEDURE GetDimTotalingFilter@32(DimNo@1001 : Integer;DimTotaling@1000 : Text[250]) : Text[1024]; VAR DimTotaling2@1002 : Text[250]; DimTotalPart@1005 : Text[250]; ResultFilter@1003 : Text[1024]; ResultFilter2@1006 : Text[1024]; i@1004 : Integer; BEGIN IF DimTotaling = '' THEN EXIT(DimTotaling); DimTotaling2 := DimTotaling; REPEAT i := STRPOS(DimTotaling2,'|'); IF i > 0 THEN BEGIN DimTotalPart := COPYSTR(DimTotaling2,1,i - 1); IF i < STRLEN(DimTotaling2) THEN DimTotaling2 := COPYSTR(DimTotaling2,i + 1) ELSE DimTotaling2 := ''; END ELSE DimTotalPart := DimTotaling2; ResultFilter2 := ConvDimTotalingFilter(DimNo,DimTotalPart); IF ResultFilter2 <> '' THEN IF STRLEN(ResultFilter) + STRLEN(ResultFilter2) + 1 > MAXSTRLEN(ResultFilter) THEN ERROR(Text021,DimTotaling); IF ResultFilter <> '' THEN ResultFilter := ResultFilter + '|'; ResultFilter := COPYSTR(ResultFilter + ResultFilter2,1,MAXSTRLEN(ResultFilter)); UNTIL i <= 0; EXIT(ResultFilter); END; LOCAL PROCEDURE ConvDimTotalingFilter@28(DimNo@1000 : Integer;DimTotaling@1001 : Text[250]) : Text[1024]; VAR DimVal@1003 : Record 349; CostAccSetup@1006 : Record 1108; DimCode@1002 : Code[20]; ResultFilter@1004 : Text[1024]; DimValTotaling@1005 : Boolean; BEGIN IF CostAccSetup.GET THEN; IF DimTotaling = '' THEN EXIT(DimTotaling); CheckAnalysisView(AccSchedName.Name,'',FALSE); CASE DimNo OF 1: DimCode := AnalysisView."Dimension 1 Code"; 2: DimCode := AnalysisView."Dimension 2 Code"; 3: DimCode := AnalysisView."Dimension 3 Code"; 4: DimCode := AnalysisView."Dimension 4 Code"; 5: DimCode := CostAccSetup."Cost Center Dimension"; 6: DimCode := CostAccSetup."Cost Object Dimension"; END; IF DimCode = '' THEN EXIT(DimTotaling); DimVal.SETRANGE("Dimension Code",DimCode); DimVal.SETFILTER(Code,DimTotaling); IF DimVal.FIND('-') THEN REPEAT DimValTotaling := DimVal."Dimension Value Type" IN [DimVal."Dimension Value Type"::Total,DimVal."Dimension Value Type"::"End-Total"]; IF DimValTotaling AND (DimVal.Totaling <> '') THEN BEGIN IF STRLEN(ResultFilter) + STRLEN(DimVal.Totaling) + 1 > MAXSTRLEN(ResultFilter) THEN ERROR(Text021,DimTotaling); IF ResultFilter <> '' THEN ResultFilter := ResultFilter + '|'; ResultFilter := ResultFilter + DimVal.Totaling; END; UNTIL (DimVal.NEXT = 0) OR NOT DimValTotaling; IF DimValTotaling THEN EXIT(ResultFilter); EXIT(DimTotaling); END; LOCAL PROCEDURE CalcCostType@25(VAR CostType@1000 : Record 1103;VAR AccSchedLine@1001 : Record 85;VAR ColumnLayout@1002 : Record 334;CalcAddCurr@1003 : Boolean) ColValue@1004 : Decimal; VAR CostEntry@1005 : Record 1104; CostBudgEntry@1006 : Record 1109; AmountType@1008 : 'Net Amount,Debit Amount,Credit Amount'; UseDimFilter@1007 : Boolean; TestBalance@1009 : Boolean; Balance@1010 : Decimal; BEGIN ColValue := 0; IF AccSchedName.Name <> AccSchedLine."Schedule Name" THEN AccSchedName.GET(AccSchedLine."Schedule Name"); IF ConflictAmountType(AccSchedLine,ColumnLayout."Amount Type",AmountType) THEN EXIT(0); TestBalance := AccSchedLine.Show IN [AccSchedLine.Show::"When Positive Balance",AccSchedLine.Show::"When Negative Balance"]; IF ColumnLayout."Column Type" <> ColumnLayout."Column Type"::Formula THEN BEGIN UseDimFilter := HasDimFilter(AccSchedLine,ColumnLayout) OR HasCostDimFilter(AccSchedLine); IF ColumnLayout."Ledger Entry Type" = ColumnLayout."Ledger Entry Type"::Entries THEN BEGIN WITH CostEntry DO BEGIN IF UseDimFilter THEN SETCURRENTKEY("Cost Type No.","Cost Center Code","Cost Object Code") ELSE SETCURRENTKEY("Cost Type No.","Posting Date"); IF CostType.Totaling = '' THEN SETRANGE("Cost Type No.",CostType."No.") ELSE SETFILTER("Cost Type No.",CostType.Totaling); CostType.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("Cost Center Filter","Cost Center Code"); AccSchedLine.COPYFILTER("Cost Object Filter","Cost Object Code"); FILTERGROUP(2); SETFILTER("Cost Center Code",GetDimTotalingFilter(5,AccSchedLine."Cost Center Totaling")); SETFILTER("Cost Object Code",GetDimTotalingFilter(6,AccSchedLine."Cost Object Totaling")); FILTERGROUP(8); SETFILTER("Cost Center Code",GetDimTotalingFilter(5,ColumnLayout."Cost Center Totaling")); SETFILTER("Cost Object Code",GetDimTotalingFilter(6,ColumnLayout."Cost Object Totaling")); FILTERGROUP(0); END; CASE AmountType OF AmountType::"Net Amount": BEGIN IF CalcAddCurr THEN BEGIN CostEntry.CALCSUMS("Additional-Currency Amount"); ColValue := CostEntry."Additional-Currency Amount"; END ELSE BEGIN CostEntry.CALCSUMS(Amount); ColValue := CostEntry.Amount; END; Balance := ColValue; END; AmountType::"Debit Amount": BEGIN IF CalcAddCurr THEN BEGIN CostEntry.CALCSUMS("Add.-Currency Debit Amount","Additional-Currency Amount"); IF TestBalance THEN Balance := CostEntry."Additional-Currency Amount"; ColValue := CostEntry."Add.-Currency Debit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CostEntry.CALCSUMS("Debit Amount",Amount); Balance := CostEntry.Amount; END ELSE CostEntry.CALCSUMS("Debit Amount"); ColValue := CostEntry."Debit Amount"; END; END; AmountType::"Credit Amount": BEGIN IF CalcAddCurr THEN BEGIN CostEntry.CALCSUMS("Add.-Currency Credit Amount","Additional-Currency Amount"); IF TestBalance THEN Balance := CostEntry."Additional-Currency Amount"; ColValue := CostEntry."Add.-Currency Credit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CostEntry.CALCSUMS("Credit Amount",Amount); Balance := CostEntry.Amount; END ELSE CostEntry.CALCSUMS("Credit Amount"); ColValue := CostEntry."Credit Amount"; END; END; END; END; IF ColumnLayout."Ledger Entry Type" = ColumnLayout."Ledger Entry Type"::"Budget Entries" THEN BEGIN WITH CostBudgEntry DO BEGIN SETCURRENTKEY("Budget Name","Cost Type No.","Cost Center Code","Cost Object Code",Date); IF CostType.Totaling = '' THEN SETRANGE("Cost Type No.",CostType."No.") ELSE SETFILTER("Cost Type No.",CostType.Totaling); CostType.COPYFILTER("Date Filter",Date); AccSchedLine.COPYFILTER("Cost Budget Filter","Budget Name"); AccSchedLine.COPYFILTER("Cost Center Filter","Cost Center Code"); AccSchedLine.COPYFILTER("Cost Object Filter","Cost Object Code"); FILTERGROUP(2); SETFILTER("Cost Center Code",GetDimTotalingFilter(5,AccSchedLine."Cost Center Totaling")); SETFILTER("Cost Object Code",GetDimTotalingFilter(6,AccSchedLine."Cost Object Totaling")); FILTERGROUP(8); FILTERGROUP(0); END; CostBudgEntry.CALCSUMS(Amount); CASE AmountType OF AmountType::"Net Amount": ColValue := CostBudgEntry.Amount; AmountType::"Debit Amount": IF CostBudgEntry.Amount > 0 THEN ColValue := CostBudgEntry.Amount; AmountType::"Credit Amount": IF CostBudgEntry.Amount < 0 THEN ColValue := CostBudgEntry.Amount; END; Balance := CostBudgEntry.Amount; END; IF TestBalance THEN BEGIN IF AccSchedLine.Show = AccSchedLine.Show::"When Positive Balance" THEN IF Balance < 0 THEN EXIT(0); IF AccSchedLine.Show = AccSchedLine.Show::"When Negative Balance" THEN IF Balance > 0 THEN EXIT(0); END; END; EXIT(ColValue); END; PROCEDURE SetCostTypeRowFilters@37(VAR CostType@1000 : Record 1103;VAR AccSchedLine2@1001 : Record 85;VAR ColumnLayout@1002 : Record 334); BEGIN WITH AccSchedLine2 DO BEGIN CASE "Totaling Type" OF "Totaling Type"::"Cost Type": BEGIN CostType.SETFILTER("No.",Totaling); CostType.SETRANGE(Type,CostType.Type::"Cost Type"); END; "Totaling Type"::"Cost Type Total": BEGIN CostType.SETFILTER("No.",Totaling); CostType.SETFILTER(Type,'<>%1',CostType.Type::"Cost Type"); END; END; CostType.SETFILTER("Cost Center Filter",GETFILTER("Cost Center Filter")); CostType.SETFILTER("Cost Object Filter",GETFILTER("Cost Object Filter")); IF ColumnLayout."Ledger Entry Type" = ColumnLayout."Ledger Entry Type"::"Budget Entries" THEN CostType.SETFILTER("Budget Filter",GETFILTER("Cost Budget Filter")); END; END; PROCEDURE SetCostTypeColumnFilters@838(VAR CostType@1000 : Record 1103;AccSchedLine2@1001 : Record 85;VAR ColumnLayout@1002 : Record 334); VAR FromDate@1003 : Date; ToDate@1004 : Date; FiscalStartDate2@1005 : Date; BEGIN WITH ColumnLayout DO BEGIN CalcColumnDates("Comparison Date Formula","Comparison Period Formula",FromDate,ToDate,FiscalStartDate2); CASE "Column Type" OF "Column Type"::"Net Change": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CostType.SETRANGE("Date Filter",FromDate,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": CostType.SETFILTER("Date Filter",'<%1',FromDate); AccSchedLine2."Row Type"::"Balance at Date": CostType.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Balance at Date": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Beginning Balance" THEN CostType.SETRANGE("Date Filter",0D) // Force a zero return ELSE CostType.SETRANGE("Date Filter",0D,ToDate); "Column Type"::"Beginning Balance": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Balance at Date" THEN CostType.SETRANGE("Date Filter",0D) // Force a zero return ELSE CostType.SETRANGE( "Date Filter",0D,CALCDATE('<-1D>',FromDate)); "Column Type"::"Year to Date": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CostType.SETRANGE("Date Filter",FiscalStartDate2,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": CostType.SETFILTER("Date Filter",'<%1',FiscalStartDate2); AccSchedLine2."Row Type"::"Balance at Date": CostType.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Rest of Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CostType.SETRANGE( "Date Filter",CALCDATE('<+1D>',ToDate),FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": CostType.SETRANGE("Date Filter",0D,ToDate); AccSchedLine2."Row Type"::"Balance at Date": CostType.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; "Column Type"::"Entire Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": CostType.SETRANGE( "Date Filter",FiscalStartDate2,FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": CostType.SETFILTER("Date Filter",'<%1',FiscalStartDate2); AccSchedLine2."Row Type"::"Balance at Date": CostType.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; END; END; END; LOCAL PROCEDURE HasDimFilter@42(VAR AccSchedLine@1001 : Record 85;VAR ColumnLayout@1000 : Record 334) : Boolean; BEGIN EXIT((AccSchedLine."Dimension 1 Totaling" <> '') OR (AccSchedLine."Dimension 2 Totaling" <> '') OR (AccSchedLine."Dimension 3 Totaling" <> '') OR (AccSchedLine."Dimension 4 Totaling" <> '') OR (AccSchedLine.GETFILTER("Dimension 1 Filter") <> '') OR (AccSchedLine.GETFILTER("Dimension 2 Filter") <> '') OR (AccSchedLine.GETFILTER("Dimension 3 Filter") <> '') OR (AccSchedLine.GETFILTER("Dimension 4 Filter") <> '') OR (ColumnLayout."Dimension 1 Totaling" <> '') OR (ColumnLayout."Dimension 2 Totaling" <> '') OR (ColumnLayout."Dimension 3 Totaling" <> '') OR (ColumnLayout."Dimension 4 Totaling" <> '') OR (ColumnLayout."Cost Center Totaling" <> '') OR (ColumnLayout."Cost Object Totaling" <> '')); END; LOCAL PROCEDURE HasCostDimFilter@40(VAR AccSchedLine@1001 : Record 85) : Boolean; BEGIN EXIT((AccSchedLine."Cost Center Totaling" <> '') OR (AccSchedLine."Cost Object Totaling" <> '') OR (AccSchedLine.GETFILTER("Cost Center Filter") <> '') OR (AccSchedLine.GETFILTER("Cost Object Filter") <> '')); END; PROCEDURE CalcColumnDates@41(ComparisonDateFormula@1000 : DateFormula;ComparisonPeriodFormula@1006 : Code[20];VAR FromDate@1001 : Date;VAR ToDate@1002 : Date;VAR FiscalStartDate2@1005 : Date); BEGIN IF (FORMAT(ComparisonDateFormula) <> '0') AND (FORMAT(ComparisonDateFormula) <> '') THEN BEGIN FromDate := CALCDATE(ComparisonDateFormula,StartDate); ToDate := CALCDATE(ComparisonDateFormula,EndDate); IF (StartDate = CALCDATE('<-CM>',StartDate)) AND (FromDate = CALCDATE('<-CM>',FromDate)) AND (EndDate = CALCDATE('',EndDate)) THEN ToDate := CALCDATE('',ToDate); FiscalStartDate2 := FindFiscalYear(ToDate); END ELSE IF ComparisonPeriodFormula <> '' THEN BEGIN AccPeriodStartEnd(ComparisonPeriodFormula,StartDate,FromDate,ToDate); FiscalStartDate2 := FindFiscalYear(ToDate); END ELSE BEGIN FromDate := StartDate; ToDate := EndDate; FiscalStartDate2 := FiscalStartDate; END; END; LOCAL PROCEDURE MoveAccSchedLines@44(VAR AccSchedLine@1000 : Record 85;Place@1001 : Integer); VAR AccSchedLineNo@1002 : Integer; I@1003 : Integer; BEGIN AccSchedLineNo := AccSchedLine."Line No."; AccSchedLine.SETRANGE("Schedule Name",AccSchedLine."Schedule Name"); IF AccSchedLine.FIND('+') THEN REPEAT I := AccSchedLine."Line No."; IF I > AccSchedLineNo THEN BEGIN AccSchedLine.DELETE; AccSchedLine."Line No." := I + 10000 * Place; AccSchedLine.INSERT; END; UNTIL (I <= AccSchedLineNo) OR (AccSchedLine.NEXT(-1) = 0); END; PROCEDURE SetStartDateEndDate@50(NewStartDate@1000 : Date;NewEndDate@1001 : Date); BEGIN StartDate := NewStartDate; EndDate := NewEndDate; END; PROCEDURE SetHistoricGLAccRowFilters@1100001(VAR HistoricGLAcc@1000 : Record 10721;VAR AccSchedLine2@1001 : Record 85); BEGIN WITH AccSchedLine2 DO CASE "Totaling Type" OF "Totaling Type"::"Posting Accounts": BEGIN HistoricGLAcc.SETFILTER("No.",Totaling); HistoricGLAcc.SETRANGE("Account Type",HistoricGLAcc."Account Type"::Posting); END; "Totaling Type"::"Total Accounts": BEGIN HistoricGLAcc.SETFILTER("No.",Totaling); HistoricGLAcc.SETFILTER("Account Type",'<>%1',HistoricGLAcc."Account Type"::Posting); END; END; END; PROCEDURE SetHistoricGLAccColumnFilters@1100000(VAR HistoricGLAcc@1000 : Record 10721;AccSchedLine2@1005 : Record 85;VAR ColumnLayout@1001 : Record 334); VAR FromDate@1002 : Date; ToDate@1003 : Date; FiscalStartDate2@1004 : Date; BEGIN WITH ColumnLayout DO BEGIN IF (FORMAT("Comparison Date Formula") <> '0') AND (FORMAT("Comparison Date Formula") <> '') THEN BEGIN FromDate := CALCDATE("Comparison Date Formula",StartDate); IF (StartDate = CALCDATE('<-CM>',StartDate)) AND (FromDate = CALCDATE('<-CM>',FromDate)) AND (EndDate = CALCDATE('',EndDate)) THEN ToDate := CALCDATE('',ToDate) ELSE ToDate := CALCDATE("Comparison Date Formula",EndDate); FiscalStartDate2 := FindFiscalYear(ToDate); END ELSE IF "Comparison Period Formula" <> '' THEN BEGIN AccPeriodStartEnd("Comparison Period Formula",StartDate,FromDate,ToDate); FiscalStartDate2 := FindFiscalYear(ToDate); END ELSE BEGIN FromDate := StartDate; ToDate := EndDate; FiscalStartDate2 := FiscalStartDate; END; CASE "Column Type" OF "Column Type"::"Net Change": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": HistoricGLAcc.SETRANGE("Date Filter",FromDate,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": HistoricGLAcc.SETFILTER("Date Filter",'<%1',FromDate); // always includes closing date AccSchedLine2."Row Type"::"Balance at Date": HistoricGLAcc.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Balance at Date": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Beginning Balance" THEN HistoricGLAcc.SETRANGE("Date Filter",0D) // Force a zero return ELSE HistoricGLAcc.SETRANGE("Date Filter",0D,ToDate); "Column Type"::"Beginning Balance": IF AccSchedLine2."Row Type" = AccSchedLine2."Row Type"::"Balance at Date" THEN HistoricGLAcc.SETRANGE("Date Filter",0D) // Force a zero return ELSE HistoricGLAcc.SETRANGE( "Date Filter",0D,CLOSINGDATE(FromDate - 1)); "Column Type"::"Year to Date": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": HistoricGLAcc.SETRANGE("Date Filter",FiscalStartDate2,ToDate); AccSchedLine2."Row Type"::"Beginning Balance": HistoricGLAcc.SETFILTER("Date Filter",'<%1',FiscalStartDate2); // always includes closing date AccSchedLine2."Row Type"::"Balance at Date": HistoricGLAcc.SETRANGE("Date Filter",0D,ToDate); END; "Column Type"::"Rest of Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": HistoricGLAcc.SETRANGE( "Date Filter",CALCDATE('<+1D>',ToDate),FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": HistoricGLAcc.SETRANGE("Date Filter",0D,ToDate); AccSchedLine2."Row Type"::"Balance at Date": HistoricGLAcc.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; "Column Type"::"Entire Fiscal Year": CASE AccSchedLine2."Row Type" OF AccSchedLine2."Row Type"::"Net Change": HistoricGLAcc.SETRANGE( "Date Filter", FiscalStartDate2, FindEndOfFiscalYear(FiscalStartDate2)); AccSchedLine2."Row Type"::"Beginning Balance": HistoricGLAcc.SETFILTER("Date Filter",'<%1',FiscalStartDate2); // always includes closing date AccSchedLine2."Row Type"::"Balance at Date": HistoricGLAcc.SETRANGE("Date Filter",0D,FindEndOfFiscalYear(ToDate)); END; END; END; END; LOCAL PROCEDURE CalcHistoricGLAcc@1100002(VAR HistoricGLAcc@1001 : Record 10721;VAR AccSchedLine@1002 : Record 85;VAR ColumnLayout@1003 : Record 334;CalcAddCurr@1004 : Boolean) ColValue@1000 : Decimal; VAR GLEntry@1005 : Record 17; GLBudgEntry@1006 : Record 96; AnalysisViewEntry@1007 : Record 365; AnalysisViewBudgetEntry@1008 : Record 366; AmountType@1009 : 'Net Amount,Debit Amount,Credit Amount'; TestBalance@1010 : Boolean; Balance@1011 : Decimal; UseBusUnitFilter@1111 : Boolean; UseDimFilter@1012 : Boolean; BEGIN ColValue := 0; IF AccSchedName.Name <> AccSchedLine."Schedule Name" THEN AccSchedName.GET(AccSchedLine."Schedule Name"); AmountType := ColumnLayout."Amount Type"; CASE AccSchedLine."Amount Type" OF AccSchedLine."Amount Type"::"Debit Amount": CASE AmountType OF AmountType::"Net Amount": AmountType := AmountType::"Debit Amount"; AmountType::"Credit Amount": EXIT(0); END; AccSchedLine."Amount Type"::"Credit Amount": CASE AmountType OF AmountType::"Net Amount": AmountType := AmountType::"Credit Amount"; AmountType::"Debit Amount": EXIT(0); END; END; TestBalance := AccSchedLine.Show IN [AccSchedLine.Show::"When Positive Balance",AccSchedLine.Show::"When Negative Balance"]; IF ColumnLayout."Column Type" <> ColumnLayout."Column Type"::Formula THEN BEGIN UseBusUnitFilter := (AccSchedLine.GETFILTER("Business Unit Filter") <> '') OR (ColumnLayout."Business Unit Totaling" <> ''); UseDimFilter := (AccSchedLine."Dimension 1 Totaling" <> '') OR (AccSchedLine."Dimension 2 Totaling" <> '') OR (AccSchedLine."Dimension 3 Totaling" <> '') OR (AccSchedLine."Dimension 4 Totaling" <> '') OR (AccSchedLine.GETFILTER("Dimension 1 Filter") <> '') OR (AccSchedLine.GETFILTER("Dimension 2 Filter") <> '') OR (AccSchedLine.GETFILTER("Dimension 3 Filter") <> '') OR (AccSchedLine.GETFILTER("Dimension 4 Filter") <> '') OR (ColumnLayout."Dimension 1 Totaling" <> '') OR (ColumnLayout."Dimension 2 Totaling" <> '') OR (ColumnLayout."Dimension 3 Totaling" <> '') OR (ColumnLayout."Dimension 4 Totaling" <> ''); CASE ColumnLayout."Ledger Entry Type" OF ColumnLayout."Ledger Entry Type"::Entries: BEGIN IF AccSchedName."Analysis View Name" = '' THEN WITH GLEntry DO BEGIN IF UseBusUnitFilter THEN IF UseDimFilter THEN SETCURRENTKEY( "Old G/L Account No.","Business Unit Code","Global Dimension 1 Code","Global Dimension 2 Code") ELSE SETCURRENTKEY( "Old G/L Account No.","Business Unit Code","Posting Date") ELSE IF UseDimFilter THEN SETCURRENTKEY("Old G/L Account No.","Global Dimension 1 Code","Global Dimension 2 Code") ELSE SETCURRENTKEY("Old G/L Account No.","Posting Date"); IF HistoricGLAcc.Totaling = '' THEN SETRANGE("Old G/L Account No.",HistoricGLAcc."No.") ELSE SETFILTER("Old G/L Account No.",HistoricGLAcc.Totaling); HistoricGLAcc.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Global Dimension 1 Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Global Dimension 2 Code"); FILTERGROUP(2); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); FILTERGROUP(6); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN IF CalcAddCurr THEN BEGIN CALCSUMS("Additional-Currency Amount"); ColValue := "Additional-Currency Amount"; END ELSE BEGIN CALCSUMS(Amount); ColValue := Amount; END; Balance := ColValue; END; AmountType::"Debit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Currency Debit Amount","Additional-Currency Amount"); Balance := "Additional-Currency Amount"; END ELSE CALCSUMS("Add.-Currency Debit Amount"); ColValue := "Add.-Currency Debit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Debit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Debit Amount"); ColValue := "Debit Amount"; END; END; AmountType::"Credit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Currency Credit Amount","Additional-Currency Amount"); Balance := "Additional-Currency Amount"; END ELSE CALCSUMS("Add.-Currency Credit Amount"); ColValue := "Add.-Currency Credit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Credit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Credit Amount"); ColValue := "Credit Amount"; END; END; END; END ELSE WITH AnalysisViewEntry DO BEGIN SETRANGE("Analysis View Code",AccSchedName."Analysis View Name"); IF HistoricGLAcc.Totaling = '' THEN SETRANGE("Old G/L Account No.",HistoricGLAcc."No.") ELSE SETFILTER("Old G/L Account No.",HistoricGLAcc.Totaling); HistoricGLAcc.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Dimension 1 Value Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Dimension 2 Value Code"); AccSchedLine.COPYFILTER("Dimension 3 Filter","Dimension 3 Value Code"); AccSchedLine.COPYFILTER("Dimension 4 Filter","Dimension 4 Value Code"); FILTERGROUP(2); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,AccSchedLine."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,AccSchedLine."Dimension 4 Totaling")); FILTERGROUP(6); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,ColumnLayout."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,ColumnLayout."Dimension 4 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN IF CalcAddCurr THEN BEGIN CALCSUMS("Add.-Curr. Amount"); ColValue := "Add.-Curr. Amount"; END ELSE BEGIN CALCSUMS(Amount); ColValue := Amount; END; Balance := ColValue; END; AmountType::"Debit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Curr. Debit Amount","Add.-Curr. Amount"); Balance := "Add.-Curr. Amount"; END ELSE CALCSUMS("Add.-Curr. Debit Amount"); ColValue := "Add.-Curr. Debit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Debit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Debit Amount"); ColValue := "Debit Amount"; END; END; AmountType::"Credit Amount": BEGIN IF CalcAddCurr THEN BEGIN IF TestBalance THEN BEGIN CALCSUMS("Add.-Curr. Credit Amount","Add.-Curr. Amount"); Balance := "Add.-Curr. Amount"; END ELSE CALCSUMS("Add.-Curr. Credit Amount"); ColValue := "Add.-Curr. Credit Amount"; END ELSE BEGIN IF TestBalance THEN BEGIN CALCSUMS("Credit Amount",Amount); Balance := Amount; END ELSE CALCSUMS("Credit Amount"); ColValue := "Credit Amount"; END; END; END; END; END; ColumnLayout."Ledger Entry Type"::"Budget Entries": BEGIN IF AccSchedName."Analysis View Name" = '' THEN WITH GLBudgEntry DO BEGIN IF UseBusUnitFilter OR UseDimFilter THEN SETCURRENTKEY( "Budget Name","Old G/L Account No.","Business Unit Code", "Global Dimension 1 Code","Global Dimension 2 Code", "Budget Dimension 1 Code","Budget Dimension 2 Code", "Budget Dimension 3 Code","Budget Dimension 4 Code",Date) ELSE SETCURRENTKEY("Budget Name","Old G/L Account No.",Date); IF HistoricGLAcc.Totaling = '' THEN SETRANGE("Old G/L Account No.",HistoricGLAcc."No.") ELSE SETFILTER("Old G/L Account No.",HistoricGLAcc.Totaling); HistoricGLAcc.COPYFILTER("Date Filter",Date); AccSchedLine.COPYFILTER("G/L Budget Filter","Budget Name"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Global Dimension 1 Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Global Dimension 2 Code"); FILTERGROUP(2); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); FILTERGROUP(6); SETFILTER("Global Dimension 1 Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Global Dimension 2 Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; END; AmountType::"Debit Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; IF ColValue < 0 THEN ColValue := 0; END; AmountType::"Credit Amount": BEGIN CALCSUMS(Amount); ColValue := -Amount; IF ColValue < 0 THEN ColValue := 0; END; END; Balance := Amount; END ELSE WITH AnalysisViewBudgetEntry DO BEGIN IF HistoricGLAcc.Totaling = '' THEN SETRANGE("Old G/L Account No.",HistoricGLAcc."No.") ELSE SETFILTER("Old G/L Account No.",HistoricGLAcc.Totaling); SETRANGE("Analysis View Code",AccSchedName."Analysis View Name"); HistoricGLAcc.COPYFILTER("Date Filter","Posting Date"); AccSchedLine.COPYFILTER("G/L Budget Filter","Budget Name"); AccSchedLine.COPYFILTER("Business Unit Filter","Business Unit Code"); AccSchedLine.COPYFILTER("Dimension 1 Filter","Dimension 1 Value Code"); AccSchedLine.COPYFILTER("Dimension 2 Filter","Dimension 2 Value Code"); AccSchedLine.COPYFILTER("Dimension 3 Filter","Dimension 3 Value Code"); AccSchedLine.COPYFILTER("Dimension 4 Filter","Dimension 4 Value Code"); FILTERGROUP(2); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,AccSchedLine."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,AccSchedLine."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,AccSchedLine."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,AccSchedLine."Dimension 4 Totaling")); FILTERGROUP(6); SETFILTER("Dimension 1 Value Code",GetDimTotalingFilter(1,ColumnLayout."Dimension 1 Totaling")); SETFILTER("Dimension 2 Value Code",GetDimTotalingFilter(2,ColumnLayout."Dimension 2 Totaling")); SETFILTER("Dimension 3 Value Code",GetDimTotalingFilter(3,ColumnLayout."Dimension 3 Totaling")); SETFILTER("Dimension 4 Value Code",GetDimTotalingFilter(4,ColumnLayout."Dimension 4 Totaling")); SETFILTER("Business Unit Code",ColumnLayout."Business Unit Totaling"); FILTERGROUP(0); CASE AmountType OF AmountType::"Net Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; END; AmountType::"Debit Amount": BEGIN CALCSUMS(Amount); ColValue := Amount; IF ColValue < 0 THEN ColValue := 0; END; AmountType::"Credit Amount": BEGIN CALCSUMS(Amount); ColValue := -Amount; IF ColValue < 0 THEN ColValue := 0; END; END; Balance := Amount; END; IF CalcAddCurr THEN BEGIN IF NOT GLSetupRead THEN BEGIN GLSetup.GET; GLSetupRead := TRUE; IF GLSetup."Additional Reporting Currency" <> '' THEN AddRepCurrency.GET(GLSetup."Additional Reporting Currency"); END; IF GLSetup."Additional Reporting Currency" <> '' THEN ColValue := ROUND(ExchangeAmtAddCurrToLCY(ColValue),AddRepCurrency."Amount Rounding Precision") ELSE ColValue := 0; END; END; END; IF TestBalance THEN BEGIN IF AccSchedLine.Show = AccSchedLine.Show::"When Positive Balance" THEN IF Balance < 0 THEN EXIT(0); IF AccSchedLine.Show = AccSchedLine.Show::"When Negative Balance" THEN IF Balance > 0 THEN EXIT(0); END; END; EXIT(ColValue); END; LOCAL PROCEDURE ConflictAmountType@45(AccSchedLine@1000 : Record 85;ColumnLayoutAmtType@1001 : 'Net Amount,Debit Amount,Credit Amount';VAR AmountType@1002 : Option) : Boolean; BEGIN IF (ColumnLayoutAmtType = AccSchedLine."Amount Type") OR (AccSchedLine."Amount Type" = AccSchedLine."Amount Type"::"Net Amount") THEN AmountType := ColumnLayoutAmtType ELSE IF ColumnLayoutAmtType = ColumnLayoutAmtType::"Net Amount" THEN AmountType := AccSchedLine."Amount Type" ELSE EXIT(TRUE); EXIT(FALSE); END; PROCEDURE DrillDown@52(TempColumnLayout@1001 : TEMPORARY Record 334;VAR AccScheduleLine@1000 : Record 85); VAR AccScheduleOverview@1002 : Page 490; BEGIN WITH AccScheduleLine DO BEGIN IF TempColumnLayout."Column Type" = TempColumnLayout."Column Type"::Formula THEN BEGIN MESSAGE(ColumnFormulaMsg,TempColumnLayout.Formula); EXIT; END; IF "Totaling Type" IN ["Totaling Type"::Formula,"Totaling Type"::"Set Base For Percent"] THEN BEGIN AccScheduleOverview.SetAccSchedName("Schedule Name"); AccScheduleOverview.SETTABLEVIEW(AccScheduleLine); AccScheduleOverview.SETRECORD(AccScheduleLine); AccScheduleOverview.RUN; EXIT; END; IF Totaling = '' THEN EXIT; IF "Totaling Type" IN ["Totaling Type"::"Cash Flow Entry Accounts","Totaling Type"::"Cash Flow Total Accounts"] THEN DrillDownOnCFAccount(TempColumnLayout,AccScheduleLine) ELSE DrillDownOnGLAccount(TempColumnLayout,AccScheduleLine); END; END; LOCAL PROCEDURE DrillDownOnGLAccount@51(TempColumnLayout@1007 : TEMPORARY Record 334;VAR AccScheduleLine@1003 : Record 85); VAR GLAcc@1006 : Record 15; GLAccAnalysisView@1005 : Record 376; CostType@1004 : Record 1103; ChartOfAccsAnalysisView@1002 : Page 569; BEGIN WITH AccScheduleLine DO IF "Totaling Type" IN ["Totaling Type"::"Cost Type","Totaling Type"::"Cost Type Total"] THEN BEGIN SetCostTypeRowFilters(CostType,AccScheduleLine,TempColumnLayout); SetCostTypeColumnFilters(CostType,AccScheduleLine,TempColumnLayout); COPYFILTER("Cost Center Filter",CostType."Cost Center Filter"); COPYFILTER("Cost Object Filter",CostType."Cost Object Filter"); COPYFILTER("Cost Budget Filter",CostType."Budget Filter"); PAGE.RUN(PAGE::"Chart of Cost Types",CostType); END ELSE BEGIN COPYFILTER("Business Unit Filter",GLAcc."Business Unit Filter"); COPYFILTER("G/L Budget Filter",GLAcc."Budget Filter"); SetGLAccRowFilters(GLAcc,AccScheduleLine); SetGLAccColumnFilters(GLAcc,AccScheduleLine,TempColumnLayout); AccSchedName.GET("Schedule Name"); IF AccSchedName."Analysis View Name" = '' THEN BEGIN COPYFILTER("Dimension 1 Filter",GLAcc."Global Dimension 1 Filter"); COPYFILTER("Dimension 2 Filter",GLAcc."Global Dimension 2 Filter"); COPYFILTER("Business Unit Filter",GLAcc."Business Unit Filter"); GLAcc.FILTERGROUP(2); GLAcc.SETFILTER("Global Dimension 1 Filter",GetDimTotalingFilter(1,"Dimension 1 Totaling")); GLAcc.SETFILTER("Global Dimension 2 Filter",GetDimTotalingFilter(2,"Dimension 2 Totaling")); GLAcc.FILTERGROUP(8); GLAcc.SETFILTER("Business Unit Filter",TempColumnLayout."Business Unit Totaling"); GLAcc.SETFILTER( "Global Dimension 1 Filter",GetDimTotalingFilter(1,TempColumnLayout."Dimension 1 Totaling")); GLAcc.SETFILTER( "Global Dimension 2 Filter",GetDimTotalingFilter(2,TempColumnLayout."Dimension 2 Totaling")); GLAcc.FILTERGROUP(0); PAGE.RUN(PAGE::"Chart of Accounts (G/L)",GLAcc) END ELSE BEGIN GLAcc.COPYFILTER("Date Filter",GLAccAnalysisView."Date Filter"); GLAcc.COPYFILTER("Budget Filter",GLAccAnalysisView."Budget Filter"); GLAcc.COPYFILTER("Business Unit Filter",GLAccAnalysisView."Business Unit Filter"); GLAccAnalysisView.SETRANGE("Analysis View Filter",AccSchedName."Analysis View Name"); COPYFILTER("Dimension 1 Filter",GLAccAnalysisView."Dimension 1 Filter"); COPYFILTER("Dimension 2 Filter",GLAccAnalysisView."Dimension 2 Filter"); COPYFILTER("Dimension 3 Filter",GLAccAnalysisView."Dimension 3 Filter"); COPYFILTER("Dimension 4 Filter",GLAccAnalysisView."Dimension 4 Filter"); GLAccAnalysisView.FILTERGROUP(2); GLAccAnalysisView.SETFILTER("Dimension 1 Filter",GetDimTotalingFilter(1,"Dimension 1 Totaling")); GLAccAnalysisView.SETFILTER("Dimension 2 Filter",GetDimTotalingFilter(2,"Dimension 2 Totaling")); GLAccAnalysisView.SETFILTER("Dimension 3 Filter",GetDimTotalingFilter(3,"Dimension 3 Totaling")); GLAccAnalysisView.SETFILTER("Dimension 4 Filter",GetDimTotalingFilter(4,"Dimension 4 Totaling")); GLAccAnalysisView.FILTERGROUP(8); GLAccAnalysisView.SETFILTER( "Dimension 1 Filter", GetDimTotalingFilter(1,TempColumnLayout."Dimension 1 Totaling")); GLAccAnalysisView.SETFILTER( "Dimension 2 Filter", GetDimTotalingFilter(2,TempColumnLayout."Dimension 2 Totaling")); GLAccAnalysisView.SETFILTER( "Dimension 3 Filter", GetDimTotalingFilter(3,TempColumnLayout."Dimension 3 Totaling")); GLAccAnalysisView.SETFILTER( "Dimension 4 Filter", GetDimTotalingFilter(4,TempColumnLayout."Dimension 4 Totaling")); GLAccAnalysisView.SETFILTER("Business Unit Filter",TempColumnLayout."Business Unit Totaling"); GLAccAnalysisView.FILTERGROUP(0); CLEAR(ChartOfAccsAnalysisView); ChartOfAccsAnalysisView.InsertTempGLAccAnalysisViews(GLAcc); ChartOfAccsAnalysisView.SETTABLEVIEW(GLAccAnalysisView); ChartOfAccsAnalysisView.RUN; END; END; END; LOCAL PROCEDURE DrillDownOnCFAccount@49(TempColumnLayout@1001 : TEMPORARY Record 334;VAR AccScheduleLine@1000 : Record 85); VAR CFAccount@1004 : Record 841; GLAccAnalysisView@1003 : Record 376; ChartOfAccsAnalysisView@1002 : Page 569; BEGIN WITH AccScheduleLine DO BEGIN COPYFILTER("Cash Flow Forecast Filter",CFAccount."Cash Flow Forecast Filter"); SetCFAccRowFilter(CFAccount,AccScheduleLine); SetCFAccColumnFilter(CFAccount,AccScheduleLine,TempColumnLayout); AccSchedName.GET("Schedule Name"); IF AccSchedName."Analysis View Name" = '' THEN BEGIN COPYFILTER("Dimension 1 Filter",CFAccount."Global Dimension 1 Filter"); COPYFILTER("Dimension 2 Filter",CFAccount."Global Dimension 2 Filter"); CFAccount.FILTERGROUP(2); CFAccount.SETFILTER("Global Dimension 1 Filter",GetDimTotalingFilter(1,"Dimension 1 Totaling")); CFAccount.SETFILTER("Global Dimension 2 Filter",GetDimTotalingFilter(2,"Dimension 2 Totaling")); CFAccount.FILTERGROUP(8); CFAccount.SETFILTER( "Global Dimension 1 Filter", GetDimTotalingFilter(1,TempColumnLayout."Dimension 1 Totaling")); CFAccount.SETFILTER( "Global Dimension 2 Filter", GetDimTotalingFilter(2,TempColumnLayout."Dimension 2 Totaling")); CFAccount.FILTERGROUP(0); PAGE.RUN(PAGE::"Chart of Cash Flow Accounts",CFAccount) END ELSE BEGIN CFAccount.COPYFILTER("Date Filter",GLAccAnalysisView."Date Filter"); CFAccount.COPYFILTER("Cash Flow Forecast Filter",GLAccAnalysisView."Cash Flow Forecast Filter"); GLAccAnalysisView.SETRANGE("Analysis View Filter",AccSchedName."Analysis View Name"); COPYFILTER("Dimension 1 Filter",GLAccAnalysisView."Dimension 1 Filter"); COPYFILTER("Dimension 2 Filter",GLAccAnalysisView."Dimension 2 Filter"); COPYFILTER("Dimension 3 Filter",GLAccAnalysisView."Dimension 3 Filter"); COPYFILTER("Dimension 4 Filter",GLAccAnalysisView."Dimension 4 Filter"); GLAccAnalysisView.FILTERGROUP(2); GLAccAnalysisView.SETFILTER("Dimension 1 Filter",GetDimTotalingFilter(1,"Dimension 1 Totaling")); GLAccAnalysisView.SETFILTER("Dimension 2 Filter",GetDimTotalingFilter(2,"Dimension 2 Totaling")); GLAccAnalysisView.SETFILTER("Dimension 3 Filter",GetDimTotalingFilter(3,"Dimension 3 Totaling")); GLAccAnalysisView.SETFILTER("Dimension 4 Filter",GetDimTotalingFilter(4,"Dimension 4 Totaling")); GLAccAnalysisView.FILTERGROUP(8); GLAccAnalysisView.SETFILTER( "Dimension 1 Filter", GetDimTotalingFilter(1,TempColumnLayout."Dimension 1 Totaling")); GLAccAnalysisView.SETFILTER( "Dimension 2 Filter", GetDimTotalingFilter(2,TempColumnLayout."Dimension 2 Totaling")); GLAccAnalysisView.SETFILTER( "Dimension 3 Filter", GetDimTotalingFilter(3,TempColumnLayout."Dimension 3 Totaling")); GLAccAnalysisView.SETFILTER( "Dimension 4 Filter", GetDimTotalingFilter(4,TempColumnLayout."Dimension 4 Totaling")); GLAccAnalysisView.FILTERGROUP(0); CLEAR(ChartOfAccsAnalysisView); ChartOfAccsAnalysisView.InsertTempCFAccountAnalysisVie(CFAccount); ChartOfAccsAnalysisView.SETTABLEVIEW(GLAccAnalysisView); ChartOfAccsAnalysisView.RUN; END; END; END; PROCEDURE FindPeriod@48(VAR AccScheduleLine@1004 : Record 85;SearchText@1003 : Text[3];PeriodType@1000 : 'Day,Week,Month,Quarter,Year,Accounting Period'); VAR Calendar@1002 : Record 2000000007; PeriodFormMgt@1001 : Codeunit 359; BEGIN WITH AccScheduleLine DO BEGIN IF GETFILTER("Date Filter") <> '' THEN BEGIN Calendar.SETFILTER("Period Start",GETFILTER("Date Filter")); IF NOT PeriodFormMgt.FindDate('+',Calendar,PeriodType) THEN PeriodFormMgt.FindDate('+',Calendar,PeriodType::Day); Calendar.SETRANGE("Period Start"); END; PeriodFormMgt.FindDate(SearchText,Calendar,PeriodType); SETRANGE("Date Filter",Calendar."Period Start",Calendar."Period End"); IF GETRANGEMIN("Date Filter") = GETRANGEMAX("Date Filter") THEN SETRANGE("Date Filter",GETRANGEMIN("Date Filter")); END; END; BEGIN END. } }