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

为何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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:02