From a07c31633d8dfdfbca595c3e676ef3c2c9cf4e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joshua=20Mart=C3=ADnez=20Pineda?= Date: Fri, 26 Jun 2026 13:21:11 +0200 Subject: [PATCH] fix for edge case when balance of a posting account at ending date is zero Production-only backport for 28.0: keeps every account/dimension combination that has entries (dropping the CheckAllZero guard) and Init()s the buffer record when the second pass re-creates a zero-net-at-end combination. Tests are omitted on 28.0 as the test infrastructure differs from later releases. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/Financials/TrialBalance.Codeunit.al | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Apps/W1/ExcelReports/App/src/Financials/TrialBalance.Codeunit.al b/src/Apps/W1/ExcelReports/App/src/Financials/TrialBalance.Codeunit.al index 9ae62f192c..8103a71592 100644 --- a/src/Apps/W1/ExcelReports/App/src/Financials/TrialBalance.Codeunit.al +++ b/src/Apps/W1/ExcelReports/App/src/Financials/TrialBalance.Codeunit.al @@ -234,12 +234,11 @@ codeunit 4410 "Trial Balance" // And also in Net Change (which will have later the value at the starting date subtracted) TrialBalanceData.Validate("Net Change", EXRTrialBalanceQuery.Amount); TrialBalanceData.Validate("Net Change (ACY)", EXRTrialBalanceQuery.ACYAmount); - TrialBalanceData.CheckAllZero(); - if not TrialBalanceData."All Zero" then begin - TrialBalanceData.Insert(true); - InsertUsedDimensionValue(1, TrialBalanceData."Dimension 1 Code", Dimension1Values); - InsertUsedDimensionValue(2, TrialBalanceData."Dimension 2 Code", Dimension2Values); - end; + // Every combination the query returns has entries, so it represents real activity and is kept even when it + // nets to zero. The second pass adjusts any that also have an opening balance. + TrialBalanceData.Insert(true); + InsertUsedDimensionValue(1, TrialBalanceData."Dimension 1 Code", Dimension1Values); + InsertUsedDimensionValue(2, TrialBalanceData."Dimension 2 Code", Dimension2Values); end; EXRTrialBalanceQuery.Close(); @@ -250,7 +249,9 @@ codeunit 4410 "Trial Balance" TrialBalanceData.SetRange("G/L Account No.", EXRTrialBalanceQuery.AccountNumber); TrialBalanceData.SetRange("Dimension 1 Code", EXRTrialBalanceQuery.DimensionValue1Code); TrialBalanceData.SetRange("Dimension 2 Code", EXRTrialBalanceQuery.DimensionValue2Code); - if not TrialBalanceData.FindFirst() then begin // This shouldn't happen, but we consider it regardless + if not TrialBalanceData.FindFirst() then begin + // This shouldn't happen now that the first pass inserts every combination with entries up to the ending date, but we Init() and consider it regardless. + TrialBalanceData.Init(); TrialBalanceData."G/L Account No." := EXRTrialBalanceQuery.AccountNumber; TrialBalanceData."Dimension 1 Code" := EXRTrialBalanceQuery.DimensionValue1Code; TrialBalanceData."Dimension 2 Code" := EXRTrialBalanceQuery.DimensionValue2Code; @@ -286,12 +287,11 @@ codeunit 4410 "Trial Balance" TrialBalanceData.Validate("Balance (ACY)", EXRTrialBalanceBUQuery.ACYAmount); TrialBalanceData.Validate("Net Change", EXRTrialBalanceBUQuery.Amount); TrialBalanceData.Validate("Net Change (ACY)", EXRTrialBalanceBUQuery.ACYAmount); - TrialBalanceData.CheckAllZero(); - if not TrialBalanceData."All Zero" then begin - TrialBalanceData.Insert(true); - InsertUsedDimensionValue(1, TrialBalanceData."Dimension 1 Code", Dimension1Values); - InsertUsedDimensionValue(2, TrialBalanceData."Dimension 2 Code", Dimension2Values); - end; + // Every combination the query returns has entries, so it represents real activity and is kept even when it + // nets to zero. The second pass adjusts any that also have an opening balance. + TrialBalanceData.Insert(true); + InsertUsedDimensionValue(1, TrialBalanceData."Dimension 1 Code", Dimension1Values); + InsertUsedDimensionValue(2, TrialBalanceData."Dimension 2 Code", Dimension2Values); end; EXRTrialBalanceBUQuery.Close(); @@ -304,6 +304,8 @@ codeunit 4410 "Trial Balance" TrialBalanceData.SetRange("Dimension 2 Code", EXRTrialBalanceBUQuery.DimensionValue2Code); TrialBalanceData.SetRange("Business Unit Code", EXRTrialBalanceBUQuery.BusinessUnitCode); if not TrialBalanceData.FindFirst() then begin + // This shouldn't happen now that the first pass inserts every combination with entries up to the ending date, but we Init() and consider it regardless. + TrialBalanceData.Init(); TrialBalanceData."G/L Account No." := EXRTrialBalanceBUQuery.AccountNumber; TrialBalanceData."Dimension 1 Code" := EXRTrialBalanceBUQuery.DimensionValue1Code; TrialBalanceData."Dimension 2 Code" := EXRTrialBalanceBUQuery.DimensionValue2Code;