关于销售与分销过程中的状态管理(SD-SLS-GF-ST)
众所周知,在SD的流程中,很多处理是跟订单的状态息息相关的,比如参照一张销售订单来做发货单的时候,系统需要检查销售订单里面的交货状态是否是A(没有处理)或者B(部分处理),如果是空白(不相关)或者已经是C(完全处理)了,那么系统会报错来通知用户这张销售订单的明细已经不能用来做发货了。那么在这篇日志中,我们就主要讨论一下状态管理中的常见问题。
如果觉得一张销售订单的状态不正确,如何来证实呢?
在标准系统里有一个报表叫做SDVBUK00,这个报表是用来修正销售订单的错误信息的,在它的执行界面上有一个项目叫“测试运行未更新”,如果选择上这个项目,就只会显示重新计算的状态,而不会修正。也就是说,我们可以用这个报表来验证我们的猜想,如果执行结果跟我们的判断一致,那就可以把项目“测试运行未更新”留空,正式运行这个报表来修正销售订单的状态。还有一个方法可以重新触发状态的再次计算,就是VA02修改一个订单的时候,选择项目,转到-〉项目-〉状态,然后保存这张订单。
需要注意的是SDVBUK00是用来修正某一个特定的有错误的销售订单的,这个报表不应该被作为每天运行的报表。
Note 67742是关于SDVBUK00的说明文档,如果是出具发票计划相关的订单请看Note88633,如果是表头状态相关的问题,请看一下Note84272,如果是不完全状态,请参照Note 88511.
那么如果SDVBUK00显示这张订单的状态没有问题,那么就证明当前的状态是正确的,就要进一步分析为何系统会计算出这样的状态。
Debug是分析状态决定的最好的方式,下面是相关的表和程序:
表
VBUP 项目状态
VBUK 表头状态
Function module:
RV_XVBUP_MAINTAIN 决定项目状态
RV_XVBUK_MAINTAIN 决定表头状态
我们更关注RV_XVBUP_MAINTAIN,因为表头的状态都是各个项目状态的汇总。
那么每一个状态都有决定它的subroutine,命名规则是
VBUP-XXXXX_ERMITTELN 是决定项目状态XXXXX的subroutine
VBUK-XXXXX_ERMITTELN 是决定表头状态XXXXX的subroutine
此篇日志我们来说一下用户常见的一些状态相关的问题以及分析方法。
问题一,为什么一张销售订单项目已经全数发货,但是发货状态(VBUP-LFSTA)还是未处理?
回答:请打开销售订单,转到->项目->装运->
检查”部分交货/项目”是否被设置成了”D”. 如果是的话,那么这个现象就是正常的。
除非设置“拒绝原因”,不然这个项目永远都不会变成“已完成”。
如果此项目没有被设置成D,请参照上一篇日志,运行报表SDVBUK00.
问题二,我在T-code VOV7中更改了项目类别的”出具发票相关”的值,但是旧的销售凭证还是保留了原来的值,怎么办?
回答:在创建订单的时候,VOV7中的值会被拷贝到VBAP-FKREL当中并且保存在数据库表上。也就是说客户化的改动是不会影响已经创建的订单的。
如果先跟更新旧订单当中的值,请参照Note 127514来创建并运行报表ZZFKREL0。
请在运行此报表之后运行SDVBUK00以确保订单中的状态得到更新。
问题三,当给订单项目设置拒绝原因以后,我发现不同的订单的整体状态和项目状态有所不同,我希望知道标准系统正常的现象是怎样的?
回答:“出具发票相关”的值会影响设置拒绝原因以后项目以及订单的状态。拒绝原因的定义(T-code OVAG)中”BLC”的设置也会影响最终结果。
具体请参照Note 203182 和 210885。
问题四,我系统里存在一些销售订单,明明后续的交货和开票都进行完了,整个订单的状态还是处理中,为什么?
回答:最有可能的原因就是用户错误的给订单中的项目类别设置了“完成规则”。请检查T-code VOV7。
“完成规则”只是为契约类型的订单,例如报价单,数量合同之类的订单类型设计的,请把销售订单中用到的项目类型的“完成规则”设置成空,这样新建的销售订单就不会有问题了。对于旧订单,请参照Note 323048进行修正。
如果在您的系统中并没有设置“完成规则”,那么请您参照上一篇日志来运行报表SDVBUK00. 或者进入T-code VA02,来debug为何系统决定出来的状态是处理中。