Hi Laura
The statement & ageing reports are the least customizable in SAP Business One. The problem is that the layout does not depend on Table & Field values like most other layouts, but calculations that are done and then passed to the layout. As a result you cannot really modify these reports other than make cosmetic changes.
I would suggest writing your own query and adding a report layout to it. Below is a Stored Procedure I wrote years ago:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE proc [dbo].[Ageing_Debtors_Statements]
@FromDate varchar(12) OUTPUT, -- Start of month
@ToDate varchar(12) OUTPUT -- End of month
as
set nocount on
begin
IF OBJECT_ID(N'tempdb..#DEBAGE', N'U') IS NOT NULL
drop table #DEBAGE
SELECT T1.[ShortName] AS [Customer],
CASE WHEN T1.[RefDate] >= (DATEADD(MONTH, -1,DATEADD(DAY, 1,@ToDate))) AND T1.[RefDate] <= (@ToDate)
THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [Current],
CASE WHEN T1.[RefDate] >= (DATEADD(MONTH, -2,DATEADD(DAY, 1,@ToDate))) AND T1.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, 0,@FromDate)))
THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [30Days],
CASE WHEN T1.[RefDate] >= (DATEADD(MONTH, -3,DATEADD(DAY, 1,@ToDate))) AND T1.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -1,@FromDate)))
THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [60Days],
CASE WHEN T1.[RefDate] >= (DATEADD(MONTH, -4,DATEADD(DAY, 1,@ToDate))) AND T1.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -2,@FromDate)))
THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [90Days],
CASE WHEN T1.[RefDate] >= (DATEADD(MONTH, -5,DATEADD(DAY, 1,@ToDate))) AND T1.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -3,@FromDate)))
THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [120Days],
CASE WHEN T1.[RefDate] >= (DATEADD(MONTH, -6,DATEADD(DAY, 1,@ToDate))) AND T1.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -4,@FromDate)))
THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [150Days],
CASE WHEN T1.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -5,@FromDate))) THEN (T1.[BalDueDeb] - T1.[BalDueCred]) ELSE 0 END AS [180Days]
INTO #DEBAGE
FROM JDT1 T1 INNER JOIN OCRD T2 ON T1.ShortName = T2.CardCode AND T2.CardType = 'C'
WHERE T1.[RefDate] <= @ToDate AND T1.[Account] = '4000' -- (Enter Control Account GL Number here)
INSERT #DEBAGE SELECT T2.[ShortName] AS [Customer],
CASE WHEN T0.[RefDate] >= (DATEADD(MONTH, -1,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (@ToDate) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] >= (DATEADD(MONTH, -1,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (@ToDate) AND T2.[IsCredit] = 'C'
THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [Current],
CASE WHEN T0.[RefDate] >= (DATEADD(MONTH, -2,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, 0,@FromDate))) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] >= (DATEADD(MONTH, -2,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, 0,@FromDate))) AND T2.[IsCredit] = 'C'
THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [30Days],
CASE WHEN T0.[RefDate] >= (DATEADD(MONTH, -3,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -1,@FromDate))) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] >= (DATEADD(MONTH, -3,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -1,@FromDate))) AND T2.[IsCredit] = 'C'
THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [60Days],
CASE WHEN T0.[RefDate] >= (DATEADD(MONTH, -4,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -2,@FromDate))) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] >= (DATEADD(MONTH, -4,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -2,@FromDate))) AND T2.[IsCredit] = 'C'
THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [90Days],
CASE WHEN T0.[RefDate] >= (DATEADD(MONTH, -5,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -3,@FromDate))) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] >= (DATEADD(MONTH, -5,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -3,@FromDate))) AND T2.[IsCredit] = 'C'
THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [120Days],
CASE WHEN T0.[RefDate] >= (DATEADD(MONTH, -6,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -4,@FromDate))) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] >= (DATEADD(MONTH, -6,DATEADD(DAY, 1,@ToDate))) AND T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -4,@FromDate))) AND T2.[IsCredit] = 'C'
THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [150Days],
CASE WHEN T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -5,@FromDate))) AND T2.[IsCredit] = 'D'
THEN SUM(T2.[ReconSum])
WHEN T0.[RefDate] <= (DATEADD(DAY, -1,DATEADD(MONTH, -5,@FromDate))) AND T2.[IsCredit] = 'C' THEN -SUM(T2.[ReconSum]) ELSE 0 END AS [180Days]
FROM dbo.ITR1 T2 INNER JOIN dbo.OITR T3 ON T2.[ReconNum] = T3.[ReconNum] LEFT OUTER JOIN JDT1 T0 ON T0.TransId = T2.TransId
WHERE T3.[ReconDate] > @ToDate AND T3.[IsCard] = 'C'
GROUP BY T2.[ShortName], T0.[RefDate], T2.[IsCredit] HAVING SUM(T2.[ReconSum]) <> 0
ORDER BY [Customer]
SELECT [Customer], SUM([Current]) AS [Current], SUM([30Days]) AS [30Days], SUM([60Days]) AS [60Days],
SUM([90Days]) AS [90Days], SUM([120Days]) AS [120Days], SUM([150Days]) AS [150Days], SUM([180Days]) AS [180Days]
FROM #DEBAGE
GROUP BY [Customer]
ORDER BY [Customer]
END
In SAP, add a query to call the SP.
EXEC [Ageing_Debtors_Statements] '2015/12/01', '2015/12/31'
Remember to change the control account in the Stored Procedure. Let me know if you get stuck.
Kind regards
Peter Juby