如何修改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
相关产品推荐
相关产品推荐

