WBSTK 为空的场景不仅存在,而且是 SAP 标准设计,跟“有没有财务凭证”毫无关系。下面把逻辑彻底拆一遍,告诉你为什么系统会给出 WBSTK = 空,而且完全正确。
WBSTK 的字段定义
域:LFSTK_WRF(3 位,A/B/C/空)
语义:仅当“存在交货单(LIKP)”时才被使用;
对“没有交货单”的凭证类型,系统硬编码保持 INITIAL。更新逻辑(代码位置:SAPLV60A 例程 RV_DELIVERY_STATUS_UPDATE)
IF 销售凭证类别 = ‘J’(退货)、‘T’(退货贷项)、‘G’(贷项)、‘F’(发票)等
或 开票类别 = ‘F1’(订单发票)、‘G2’(贷项)等
→ 跳过 WBSTK 更新,保持空值。只有下列场景系统才会写 A/B/C:
先建交货单(LF 类型)再开票(F2、LR、LF、LG …)
或订单类型本身需要发货(如标准销售订单 OR、现金销售 BV、紧急订单 SO 等)
因此常见组合
a) 标准销售流程
订单 OR → 交货 LF → 发票 F2
结果:VBUK-WBSTK = C(货已发)
VBUK-FKSTK = C(发票已开)
VBUK-BUCHK = C(财务已过账)b) 订单-直接开票(不交货)
订单 OR → 发票 F1(勾选“直接过账库存”)
库存由开票过账消耗,但系统不会建交货单。
结果:VBUK-WBSTK = 空 (标准设计)
VBUK-FKSTK = C
VBUK-BUCHK = Cc) 贷项通知单(G2)
无交货、无发货,只开一张贷项发票,同样 WBSTK = 空。验证办法
SE38 运行 RV_BILLING_DOCUMENT_STATUS 或者断点
在 include LV60AA12 里可看到:
IF NOT lf_delivery_exists. “没有交货单
CLEAR vbuk-wbstk. “直接清空
ENDIF.
结论
WBSTK 为空并不代表“状态丢失”,而是系统告诉你:
“这张发票走的就是‘无交货单’路线,库存变化由开票过账直接完成,不需要也不应该去看 WBSTK。”
所以——
要判断“库存是否已出库”:先看有没有交货单,有就看 WBSTK;没有交货单,就去物料凭证(MKPF/MSEG)里找移动类型。
要判断“财务是否已记账”:直接看 BUCHK 或 VBRK-BUCHK,与 WBSTK 毫无关系。
之前把“财务记账”和“发货过账”混为一谈,确实错了,感谢指正。