You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAP B1中如何用SQL CASE语句在无匹配记录时返回Unpaid值

问题根因

现有查询直接对JDT1日记账分录明细表加WHERE条件筛选目标客户,当客户无对应分录时,条件匹配不到任何数据行,CASE表达式没有可执行的行载体,自然无法输出'Unpaid'结果。如果直接在现有逻辑上加GROUP BY,无匹配行时聚合逻辑没有计算对象,也无法返回预期的默认值。

解决方案

不要直接从JDT1表过滤取值,改用构造固定默认行、左关联匹配日记账分录的写法,不管有没有匹配到分录都能返回结果,后续加GROUP BY逻辑也不会失效。
针对你给出的特定单据查询场景,可直接使用以下代码:

SELECT 
  CASE
    WHEN T0.Debit = 5921.41 AND T0.RefDate >= [%0] THEN 'Paid'
    ELSE 'Unpaid'
  END AS PaymentStatus
FROM (SELECT 1 AS placeholder) AS dummy
LEFT JOIN JDT1 T0 
  ON T0.[ContraAct] = 'C004166'

如果后续需要加GROUP BY批量统计多客户的付款状态,将客户主数据表作为主表左关联JDT1即可,参考写法:

SELECT 
  T1.CardCode,
  T1.CardName,
  CASE
    WHEN SUM(T0.Debit) = 5921.41 AND MAX(T0.RefDate) >= [%0] THEN 'Paid'
    ELSE 'Unpaid'
  END AS PaymentStatus
FROM OCRD T1 -- 客户主数据表作为主表,保证所有客户都能返回对应行
LEFT JOIN JDT1 T0 
  ON T0.[ContraAct] = T1.CardCode
WHERE T1.CardType = 'C' -- 仅筛选客户类型的业务伙伴
GROUP BY T1.CardCode, T1.CardName
注意事项
  • 不要把JDT1表的过滤条件写在WHERE子句中,否则左关联会退化为内关联,无分录的客户/单据依然不会返回结果
  • SAP B1日记账金额存在浮点数精度误差,不建议直接用等号匹配金额,可改用两值差值小于0.01的方式判断
  • 如果是按单据查询付款状态,建议将对应单据主表(如销售发票表OINV)作为主表左关联收付款分录,逻辑比直接查JDT1更严谨

内容的提问来源于stack exchange,提问作者Nick Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:18:28