【问题标题】:SD Invoice with amount 0 EUR not to be transmitted to FI金额为 0 欧元的 SD 发票不会传输给 FI
【发布时间】:2026-01-07 06:10:02
【问题描述】:

我正在尝试修复某个已开发的功能,目标是不应将金额为 0 欧元的 SD 发票传输到 FI。据我了解,以下代码用于从 FI 和 SD 中选择数据:

* 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' ) .
    IF sy-subrc = 0.
* select invoice head status
      SELECT DISTINCT * FROM vbuk APPENDING TABLE gt_vbuk_inv
        FOR ALL ENTRIES IN gt_vbfa_inv
        WHERE vbeln = gt_vbfa_inv-vbeln.                  "#EC CI_SUBRC
    ENDIF.

    SORT gt_vbuk_inv BY vbeln.
    DELETE ADJACENT DUPLICATES FROM gt_vbuk_inv COMPARING vbeln.

    IF me->gv_items = abap_true AND gt_vbuk_inv IS NOT INITIAL.
      SELECT * FROM vbrp INTO TABLE gt_vbrp
        FOR ALL ENTRIES IN gt_vbuk_inv
        WHERE vbeln = gt_vbuk_inv-vbeln.                  "#EC CI_SUBRC
    ENDIF.

据我从上面写的代码可以理解,是VBFA表是用来获取FI的数据,而表VBRP是用来获取数据的获取 SD 的数据。我想要实现的是,当发票号没有FI单据时,发票号为空。

如果使用表 BKPF(用于 FI)和 VBRK(用于 SD),那么我可以尝试这种关系:

vbrk-xblnr=bkpf-xblnr.

但是,这些表并未在函数中使用。请问一下,如何修改代码,使得当发票号没有FI单据时,价值为0欧元的发票不会生成FI单据,那么发票号将为空。

提前谢谢大家!

【问题讨论】:

  • 您写了很多字,但思路不清晰:您想在发货创建 0 个发票时阻止 SD 流?或者您的函数不创建任何内容,只是选择您想要在自定义 FM 中过滤 0 金额发票的现有订单/发票?

标签: oop abap sap-erp


【解决方案1】:

因为目标是

金额为 0 欧元的 SD 发票不应传输至 FI

我想在将 SD 发票发布给会计时,您的代码在某些用户退出或标准程序修改中。如果是这样,BKPF 尚未创建,没有理由选择它。

来自VBFA 的选择未从 FI 中提取数据。从销售订单开始,它正在提取以下 SD 文档(仅限第一个文档流级别)

M   Invoice
N   Invoice Cancellation
P   Debit Memo
5   Intercompany Invoice
6   Intercompany Credit Memo

不包括那些随后取消的发票

N   Invoice Cancellation
S   Credit Memo Cancellation

可以在VBRK 表(SD 发票抬头)中找到这些文档,并选择以下选项

SELECT DISTINCT * FROM vbrk APPENDING TABLE gt_vbrk
        FOR ALL ENTRIES IN gt_vbfa_inv
        WHERE vbeln = gt_vbfa_inv-vbeln.

顺便说一句:我不知道选择VBUK 的原因,因为您没有使用任何文档状态信息

如果您要索取金额为零的 SD 发票,目的是不将它们发布到会计部门(否则它们会在 FI 中产生错误),您不必选择 BKPF,而是检查 VBRK-NETWR = 0对于gt_vbrk 表中的每个条目

【讨论】: