EREKZ并不是“有没有做过发票校验”的标志,而是“这张 PO 行项目被手工勾选为‘最终发票’(Final Invoice)”的标记。
只要你在 MIRO 里没点过菜单项发票 → 最终发票(或代码里没把XBLNR-FINAL置位),它就永远空。
所以做了 1 张、10 张发票,只要没人为去勾最终,EREKZ 仍是空——这就是你看到的“不对”的根源。
三个字段别混
| 字段 | 中文短名 | 何时回写 | 业务含义 | |----|--------|---------|---------| |EREKZ| 最终发票标识 | MIRO 勾“最终发票”或批量设置 | 告诉系统:以后再也不接受这张 PO 的发票了,剩余金额全部结清。 | |DABMG| 已开票数量 | 每张 MIRO 过账时累加 | 数量维度“已开多少”。 | |WRBTR/DMBTR| 已开票金额 | 同上 | 价值维度“已开多少”。 |
正确判断“发票是否做完”
业务上99% 的场景只要比较:
剩余可开票数量 = PO 数量 – DABMG 剩余可开票金额 = 行净值 – 累计发票金额(EKBE-WRBTR 汇总)当剩余数量 ≤ 0 且剩余金额 ≤ 0 时,就是“做完发票”。
系统状态看EKPO-STATU:
C已完成(数量角度)L最后发票已入账(需同时满足数量+金额+EREKZ='X' 才出现)
快速取数代码(无金额差异版)
SELECT SINGLE ekpo~ebeln, ekpo~ebelp, ekpo~menge AS po_qty, ekpo~netwr AS po_val, ( SELECT SUM( dabmg ) FROM ekbe WHERE ebeln = ekpo~ebeln AND ebelp = ekpo~ebelp AND vgabe = '2' ) AS inv_qty, ( SELECT SUM( wrbtr ) FROM ekbe WHERE ebeln = ekpo~ebeln AND ebelp = ekpo~ebelp AND vgabe = '2' ) AS inv_val INTO @DATA(ls_stat) FROM ekpo WHERE ebeln = @lv_ebeln AND ebelp = @lv_ebelp. IF ls_stat-po_qty <= ls_stat-inv_qty AND ls_stat-po_val <= ls_stat-inv_val. "=== 发票已完成 === ENDIF.什么时候才需要
EREKZ
做寄售/管道结算(MRKO)前,系统会强制把对应结算行标成最终发票;
项目或政府合同,审计要求“一张 PO 只能对应一张发票”时,由用户手工勾;
写报表只关心“再也不会有发票进来”才用
EREKZ='X'当过滤条件。
结论EREKZ='X'≠ 已做发票;
想看“发票是否做完”直接比较DABMG vs MENGE(数量)+ 累计发票金额(价值),或者看STATU = 'L'。