金额为 0 欧元的 SD 发票不会传输到 FI

SD Invoice with amount 0 EUR not to be transmitted to FI

我正在尝试修复某个已开发的功能,目标是金额为 0 欧元的 SD 发票不应传输到 FI。据我了解,以下代码用于 select 来自 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.

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

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

vbrk-xblnr=bkpf-xblnr.

但是,那些table在函数中没有使用。请问,如何修改代码,当发票号没有FI单据时,0欧元的发票不会生成FI单据,那么发票号就会为空。

提前谢谢大家!

因为目标是

the SD Invoice with amount 0 EUR should not be transmitted to FI

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

来自 VBFA 的 select 没有从 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 table(SD 发票抬头)中找到这些文件,其中 select

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

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

如果您要求金额为零的 SD 发票,目的是不将它们释放到会计(否则它们会在 FI 中产生错误),您不必 select BKPF 但检查 VBRK-NETWR = 0 gt_vbrk table

中的每个条目