1. The Challenge (The Pain Points)
In SAP Business One, tracking Tax Deducted at Source (TDS) efficiently was bottlenecked by two system limitations. First, standard SAP queries lacked the ability to consolidate TDS transactions across all independent General Ledger (G/L) account heads simultaneously, forcing repetitive manual querying. Second, because of our organization's booking structure, TDS is processed by appending an additional row to transactions rather than creating a separate document. The TDS ledger code is selected, and a custom Cost Center (OcrCode2) holds the specific company details. This creates a high risk of mismatch where the booked TDS code might not align with the actual master vendor profile (OCRD).
2. The Solution (How the SQL Code Works)
3. Optimized Engine Query Blueprint
SELECT
T0.[TransId] AS [Transaction Number],
T4.[DocEntry] AS [Internal Number],
T0.[RefDate] AS [Posting Date],
CASE
WHEN T4.[CANCELED] = 'Y' THEN 'Canceled'
WHEN T4.[DocStatus] = 'C' THEN 'Closed'
WHEN T4.[DocStatus] = 'O' THEN 'Open'
ELSE 'Other'
END AS [DocStatus],
CASE T1.[TransType]
WHEN 18 THEN 'A/P Invoice'
WHEN 30 THEN 'Journal Entry'
WHEN 46 THEN 'Outgoing Payment'
ELSE ''
END AS [DocTypeName],
T1.[Account] AS [Account Code],
T2.[AcctName] AS [Account Name],
T4.[U_PANNo] AS [PAN No.],
Exp.[AcctName] AS [Expense Name],
T1.[Project] AS [Project Code],
T1.[OcrCode2] AS [Costing Code 2],
DR2.[OcrName] AS [TDS Party Name],
CASE
WHEN CA.NetTDS > 0 THEN ROUND(T1.[U_TDSGrossAmt], 4)
ELSE -ROUND(T1.[U_TDSGrossAmt], 4)
END AS [F_GrossValue],
T1.[Debit] AS [Debit TDS Amt],
T1.[Credit] AS [Credit TDS Amt],
(ISNULL(T1.[U_TDSGrossAmt], 0) - ISNULL(T1.[Credit], 0)) AS [Payable Amt],
T1.[LineMemo] AS [Row Details],
T5.[U_NAME] AS [User Name],
ROUND(T1.[U_TDSGrossAmt], 4) AS TDSGrossValue,
CA.NetTDS,
CA.TDSPer,
CONVERT(varchar(16), CAST(ROUND(CA.TDSPer * 100.0, 2) AS DECIMAL(10,2))) + ' %' AS TDSPct,
HX.Helper,
SUM(CA.NetTDS) OVER (
PARTITION BY HX.Helper
ORDER BY T0.[RefDate], T0.[TransId], T1.[Line_ID]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS CumulativeNetTDS,
DR2.[U_PANNO] AS TDSPANNo,
BP.[CardName] AS BPName,
BP.[U_PANNo] AS BPPAN,
CASE
WHEN DR2.[U_PANNO] IS NOT NULL
AND UPPER(LTRIM(RTRIM(BP.[U_PANNo]))) = UPPER(LTRIM(RTRIM(DR2.[U_PANNO])))
THEN 'Y' ELSE 'N'
END AS PANMatch,
CASE WHEN T1.[TransType] = 18 THEN EG.EntryGrossValue ELSE NULL END AS EntryGrossValue,
CASE
WHEN T1.[TransType] = 18 AND ROUND(T1.[U_TDSGrossAmt], 4) = EG.EntryGrossValue THEN 'Y'
WHEN T1.[TransType] = 18 THEN 'N'
ELSE NULL
END AS GVCheck
FROM OJDT T0
JOIN JDT1 T1 ON T0.[TransId] = T1.[TransId]
JOIN OACT T2 ON T1.[Account] = T2.[AcctCode]
LEFT JOIN OPCH T4 ON T4.[TransId] = T0.[TransId]
JOIN OUSR T5 ON T0.[UserSign] = T5.[USERID]
LEFT JOIN OOCR DR2 ON DR2.[OcrCode] = T1.[OcrCode2] AND DR2.[DimCode] = 2
LEFT JOIN OCRD BP ON BP.[CardCode] = T4.[CardCode] AND BP.[CardType] = 'S'
OUTER APPLY (
SELECT TOP (1) O2.[AcctName]
FROM JDT1 J
JOIN OACT O2 ON O2.[AcctCode] = J.[Account]
WHERE J.[TransId] = T1.[TransId]
AND (
O2.[AcctCode] LIKE '53%' OR O2.[AcctCode] LIKE '52%' OR
O2.[AcctCode] LIKE '117%' OR O2.[AcctCode] LIKE '224%' OR
O2.[AcctCode] LIKE '11%' OR O2.[AcctCode] LIKE '12%'
)
ORDER BY
CASE
WHEN O2.[AcctCode] LIKE '53%' OR O2.[AcctCode] LIKE '52%' THEN 0
WHEN O2.[AcctCode] LIKE '117%' THEN 1
WHEN O2.[AcctCode] LIKE '224%' THEN 2
WHEN O2.[AcctCode] LIKE '11%' THEN 3
WHEN O2.[AcctCode] LIKE '12%' THEN 4
ELSE 5
END,
O2.[AcctCode]
) AS Exp
CROSS APPLY (
SELECT
NetTDS = ISNULL(T1.[Credit], 0) - ISNULL(T1.[Debit], 0),
TDSPer = CASE
WHEN NULLIF(T1.[U_TDSGrossAmt], 0) IS NULL THEN NULL
ELSE (ISNULL(T1.[Credit], 0) - ISNULL(T1.[Debit], 0)) / NULLIF(T1.[U_TDSGrossAmt], 0)
END
) AS CA
CROSS APPLY (
SELECT Helper = CONCAT(
T2.[AcctName], '-', ISNULL(T1.[OcrCode2], ''), '-',
CONVERT(varchar(32), CAST(CA.TDSPer AS DECIMAL(18,6)))
)
) AS HX
OUTER APPLY (
SELECT
CASE WHEN T1.[Credit] <> 0 THEN SUM(J.[Debit]) ELSE SUM(J.[Credit]) END AS EntryGrossValue
FROM JDT1 J
JOIN OACT OA ON OA.[AcctCode] = J.[Account]
WHERE J.[TransId] = T1.[TransId]
AND UPPER(LTRIM(RTRIM(OA.[AcctName]))) NOT IN ('VALUE ADDED TAX', 'VAT PROVISION A/C')
) AS EG
WHERE
T0.[RefDate] >= [%0]
AND T0.[RefDate] <= [%1]
AND (
(NULLIF('[%2]', '') IS NULL AND T1.[Account] IN ('2232500','2232400','2232300','2230027','2230025','2235000','2234000','2232904','2230031'))
OR (NULLIF('[%2]', '') IS NOT NULL AND T2.[AcctName] = '[%2]')
)
ORDER BY
T2.[AcctName] ASC,
T1.[OcrCode2] ASC,
CA.TDSPer ASC,
T0.[RefDate] ASC,
T0.[TransId] ASC,
T1.[Line_ID] ASC;
4. Impact & Results