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

如何修改ABAP代码实现0 EUR金额的SD Invoice不传输至FI

SAP SD 0金额发票过滤需求实现方案

前置说明

首先纠正原理解误区:VBFA是SD模块的统一凭证流表,并非FI侧数据表。SD发票过账生成FI凭证后,会在VBFA中生成一条**后续凭证类型(VBTYP_N)为R**的关联记录,0金额不会生成FI凭证的发票不会存在该记录,仅依托现有VBFA表即可实现需求,无需引入BKPF、VBRK表。

实现方案

方案1:保留无FI凭证的行,仅置空发票编号

适合需要保留完整数据行、仅清空无效发票编号的场景,在原有查询逻辑后新增如下代码:

* 新增逻辑:批量检查所有发票是否有对应FI凭证记录
IF gt_vbfa_inv IS NOT INITIAL.
  DATA: lt_has_fi TYPE TABLE OF vbeln_vf,
        ls_vbfa_inv LIKE LINE OF gt_vbfa_inv.

* 提前排序内表优化后续查询性能
  SORT gt_vbfa_inv BY vbeln.

* 选出所有有对应FI凭证的发票编号
  SELECT DISTINCT vbelv FROM vbfa
    INTO TABLE lt_has_fi
    FOR ALL ENTRIES IN gt_vbfa_inv
    WHERE vbelv = gt_vbfa_inv-vbeln
      AND vbtyp_n = 'R' " R代表会计凭证
      AND stufe = '00'.

  SORT lt_has_fi BY table_line.

* 把没有FI凭证的发票编号置空
  LOOP AT gt_vbfa_inv INTO ls_vbfa_inv.
    READ TABLE lt_has_fi WITH KEY table_line = ls_vbfa_inv-vbeln BINARY SEARCH.
    IF sy-subrc <> 0.
      CLEAR ls_vbfa_inv-vbeln. " 发票编号置空
      MODIFY gt_vbfa_inv FROM ls_vbfa_inv INDEX sy-tabix.
    ENDIF.
  ENDLOOP.

* 同步处理VBUK表的发票编号
  LOOP AT gt_vbuk_inv INTO DATA(ls_vbuk_inv).
    READ TABLE lt_has_fi WITH KEY table_line = ls_vbuk_inv-vbeln BINARY SEARCH.
    IF sy-subrc <> 0.
      CLEAR ls_vbuk_inv-vbeln.
      MODIFY gt_vbuk_inv FROM ls_vbuk_inv INDEX sy-tabix.
    ENDIF.
  ENDLOOP.

* 同步处理VBRP表的发票编号
  IF me->gv_items = abap_true AND gt_vbrp IS NOT INITIAL.
    LOOP AT gt_vbrp INTO DATA(ls_vbrp).
      READ TABLE lt_has_fi WITH KEY table_line = ls_vbrp-vbeln BINARY SEARCH.
      IF sy-subrc <> 0.
        CLEAR ls_vbrp-vbeln.
        MODIFY gt_vbrp FROM ls_vbrp INDEX sy-tabix.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDIF.

方案2:直接过滤无FI凭证的发票(性能更优)

如果不需要保留无FI凭证的无效发票行,直接修改原有VBFA查询语句,新增过滤条件即可,无需后续循环处理:

* select order-related invoices(修改后)
    SELECT * FROM vbfa AS v INTO TABLE gt_vbfa_inv
      FOR ALL ENTRIES IN gt_vbak
      WHERE vbelv = gt_vbak-vbeln
        AND vbtyp_n IN ('M', 'O', 'P', '5', '6')
        AND stufe = '00'
        AND NOT EXISTS ( SELECT * FROM vbfa
                           WHERE vbelv = v~vbeln
                             AND posnv = v~posnn
                             AND vbtyp_n IN ('N', 'S')
                             AND stufe = '00' )
        " 新增过滤条件:仅保留存在对应FI凭证的发票
        AND EXISTS ( SELECT * FROM vbfa
                       WHERE vbelv = v~vbeln
                         AND vbtyp_n = 'R'
                         AND stufe = '00' ).

注意事项

  • 若业务中存在FI凭证已生成但后续被冲销的场景,可在过滤条件中新增排除凭证类型为S(冲销凭证)的逻辑,进一步保证数据准确性
  • 使用BINARY SEARCH查询前必须提前对目标内表按查询字段排序,避免查询结果错误

内容的提问来源于stack exchange,提问作者Frank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:39:02