为何SAP B1存储过程校验UDF失效,无法拦截退货草稿新增?
问题根因与修复方案
代码不生效的核心原因
- 过滤条件错误:WHERE子句中
ISNULL(A.WddStatus,'-') <> '-'仅匹配走审批流程的草稿,未走审批的普通草稿会被直接过滤,查询无结果导致校验逻辑不触发 - 多行单据校验遗漏:现有逻辑仅读取单据最后一行的退货原因值,若存在多行仅最后一行有值时,前面行空值无法被识别
- 变量未初始化风险:未提前声明@LineNum、@ObjType变量,部分SQL Server版本会因变量未定义跳过逻辑执行
修复后完整校验代码
IF (@object_type ='112' AND @transaction_type IN ('A','U')) BEGIN -- 校验是否为退货类型草稿,且存在未填退货原因的行 IF EXISTS ( SELECT 1 FROM ODRF A INNER JOIN DRF1 B ON A.DocEntry = B.DocEntry WHERE A.DocEntry = @list_of_cols_val_tab_del AND A.ObjType = 16 -- 退货单对应的对象类型 AND ISNULL(B.U_RetReas,'') = '' ) BEGIN SET @error = -100018 SET @error_message=N'退货原因为必填项,请补充所有行的退货原因后再提交!' END END
优化说明
- 移除了WddStatus的过滤条件,覆盖所有退货草稿场景,不管是否走审批流程都可触发校验
- 用EXISTS直接判断是否存在空值行,不管单据有多少行,只要有一行没填退货原因就拦截,避免漏判
- 简化了逻辑,不需要额外声明中间变量,减少变量未定义导致的异常
内容的提问来源于stack exchange,提问作者Jaime Dolor jr.
相关产品推荐
相关产品推荐

