ABAP 批量更改会计凭证中的付款条件(ZTERM)
一、"根據付款條件和日期,計算新的基準日期和天數。中探這裡的配置一般都是以過賬日期為準
CALL FUNCTION 'FI_FIND_PAYMENT_CONDITIONS'
用法可参考 https://blog.csdn.net/anchangong3418/article/details/101146682/
二、使用FI_ITEMS_MASS_CHANGE更改会计凭证行项目
详细可参考 https://blog.csdn.net/cylcylcylcylwo/article/details/114078988
这里测试的时候,ZTERM(付款条件)没有更改,需要更改增强
se38->LFI_ITEMSF03-> form screen_detail.
或者双击FI_ITEMS_MASS_CHANGE->再双击perform screen_detail
第 199行插入
三、这里其实是跟BDC差不多,所以要前台(FB02)也要能更改才可以,这里需要配置。
路径: 财务会计(新)->财务会计通用设定(新)->会计凭证->用于会计凭证的规则。参考下图
附上测试代码:

FUNCTION zrfc_fi_001. *"---------------------------------------------------------------------- *"*"局部接口: *" IMPORTING *" VALUE(P_KUNNR) TYPE KUNNR OPTIONAL *" VALUE(P_ZTERMN) TYPE DZTERM OPTIONAL *" VALUE(P_BUKRS) TYPE BUKRS OPTIONAL *" TABLES *" ET_OUT STRUCTURE ZRFC_FIS001 OPTIONAL *"---------------------------------------------------------------------- DATA: lt_bkpf TYPE TABLE OF bkpf, lt_bkpf2 TYPE TABLE OF bkpf, ls_bkpf TYPE bkpf, lt_bseg TYPE TABLE OF bseg, lt_bseg2 TYPE TABLE OF bseg, ls_bseg TYPE bseg. DATA: lt_accchg TYPE TABLE OF accchg, ls_accchg TYPE accchg, l_do_commit TYPE boolean. DATA: lt_bsid TYPE TABLE OF bsid, lt_bsid2 TYPE TABLE OF bsid, ls_bsid TYPE bsid. DATA: lv_start TYPE char1, lv_end TYPE char1. DATA:l_zterm TYPE lfb1-zterm. DATA:l_nzterm TYPE lfb1-zterm. DATA:l_nzfbdt TYPE bseg-zfbdt. DATA:l_ozterm TYPE lfb1-zterm. DATA:l_nsklin TYPE sklin, l_osklin TYPE sklin. DATA:l_ozfbdt TYPE bseg-zfbdt. DATA:e_sklin TYPE sklin, e_zfbdt TYPE bseg-zfbdt. DATA: l_bseg TYPE bseg. DATA lt_seqg3 LIKE TABLE OF seqg3 WITH HEADER LINE. DATA lv_garg LIKE lt_seqg3-garg. DATA: lv_tabix1 TYPE sy-tabix, lv_ztype TYPE char1. TYPES: BEGIN OF sy_buztab, bukrs LIKE bseg-bukrs, " Buchungskreis belnr LIKE bseg-belnr, " Belegnummer gjahr LIKE bseg-gjahr, " Geschaeftsjahr buzei LIKE bseg-buzei, " Buchungszeile koart LIKE bseg-koart, " Kontoart umskz LIKE bseg-umskz, " SHB-Kennzeichen bschl LIKE bseg-bschl, " Buchungsschlüssel bstat LIKE bkpf-bstat, " Buchungsstatus mwart LIKE bseg-mwart, " Steuerart, mwskz LIKE skb1-mwskz, " Steuerkategorie, flaen(1) TYPE c, " X = Posten geaendert END OF sy_buztab. TYPES: BEGIN OF sy_fname, fname LIKE t021-fname, aenkz(1) TYPE c, " Aenderungskennzeichen END OF sy_fname. DATA: lt_buztab TYPE TABLE OF sy_buztab."tpit_buztab. DATA: ls_buztab TYPE sy_buztab. DATA: lt_fldtab TYPE STANDARD TABLE OF sy_fname. DATA: ls_fldtab TYPE sy_fname. SELECT bukrs belnr gjahr buzei INTO CORRESPONDING FIELDS OF TABLE lt_bsid FROM bsid WHERE kunnr EQ p_kunnr AND bukrs EQ p_bukrs AND blart EQ 'RV'. * WHERE belnr EQ '0090001594' * AND bukrs EQ '5100' * AND gjahr EQ '2022' * AND buzei EQ '001'. SORT lt_bsid[] BY bukrs gjahr belnr buzei. lt_bsid2[] = lt_bsid[]. DELETE ADJACENT DUPLICATES FROM lt_bsid2[] COMPARING bukrs gjahr belnr. IF lt_bsid2[] IS NOT INITIAL. SELECT * INTO TABLE lt_bkpf2 FROM bkpf FOR ALL ENTRIES IN lt_bsid2 WHERE bukrs EQ lt_bsid2-bukrs AND gjahr EQ lt_bsid2-gjahr AND belnr EQ lt_bsid2-belnr. SELECT * INTO TABLE lt_bseg2 FROM bseg FOR ALL ENTRIES IN lt_bsid WHERE bukrs EQ lt_bsid-bukrs AND gjahr EQ lt_bsid-gjahr AND belnr EQ lt_bsid-belnr AND buzei EQ lt_bsid-buzei. SORT lt_bseg2[] BY bukrs gjahr belnr buzei. ENDIF. LOOP AT lt_bkpf2 INTO ls_bkpf. * CLEAR: lv_start,lv_end. * AT NEW belnr. * lv_start = 'X'. * ENDAT. * AT END OF belnr. * lv_end = 'X'. * ENDAT. * IF lv_end EQ 'X'. * ENDIF. CLEAR: e_zfbdt,e_sklin,lt_bkpf[],lt_bseg[],lt_accchg[]. APPEND ls_bkpf TO lt_bkpf[]. "根據付款條件和日期,計算新的基準日期和天數。這裡的配置一般都是以過賬日期為準 CALL FUNCTION 'FI_FIND_PAYMENT_CONDITIONS' EXPORTING i_zterm = p_ztermn i_bldat = ls_bkpf-bldat i_budat = ls_bkpf-budat i_cpudt = ls_bkpf-cpudt * i_zfbdt = bseg-zfbdt IMPORTING e_zfbdt = e_zfbdt e_sklin = e_sklin EXCEPTIONS terms_incorrect = 1 terms_not_found = 2 no_date_entered = 3 no_day_limit_found = 4 OTHERS = 5. IF e_zfbdt NE space. l_bseg-zfbdt = e_zfbdt."基準日期 ENDIF. l_bseg-zbd1t = e_sklin-ztag1."天数 l_bseg-zbd1p = e_sklin-zprz1."现金折扣百分率 l_bseg-zbd2t = e_sklin-ztag2. "现金折扣天数2 l_bseg-zbd2p = e_sklin-zprz2. "现金折扣百分比2 l_bseg-zbd3t = e_sklin-ztag3."净支付条件期段 l_bseg-zterm = p_ztermn."付款条件 READ TABLE lt_bseg2 WITH KEY bukrs = ls_bkpf-bukrs gjahr = ls_bkpf-gjahr belnr = ls_bkpf-belnr TRANSPORTING NO FIELDS BINARY SEARCH. IF sy-subrc EQ 0. LOOP AT lt_bseg2 INTO ls_bseg FROM sy-tabix. IF ls_bseg-bukrs NE ls_bkpf-bukrs OR ls_bseg-gjahr NE ls_bkpf-gjahr OR ls_bseg-belnr NE ls_bkpf-belnr. EXIT. ENDIF. APPEND ls_bseg TO lt_bseg[]. MOVE-CORRESPONDING ls_bseg TO ls_buztab. APPEND ls_buztab TO lt_buztab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZTERM'. APPEND ls_fldtab TO lt_fldtab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZFBDT'. APPEND ls_fldtab TO lt_fldtab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZBD1T'. APPEND ls_fldtab TO lt_fldtab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZBD1P'. APPEND ls_fldtab TO lt_fldtab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZBD2T'. APPEND ls_fldtab TO lt_fldtab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZBD2P'. APPEND ls_fldtab TO lt_fldtab. CLEAR ls_fldtab. ls_fldtab-fname = 'ZBD3T'. APPEND ls_fldtab TO lt_fldtab. CLEAR lv_tabix1. CONCATENATE sy-mandt ls_bseg-bukrs ls_bseg-belnr ls_bseg-gjahr INTO lv_garg. DO. "等待解锁 CALL FUNCTION 'ENQUEUE_READ' EXPORTING guname = sy-uname TABLES enq = lt_seqg3. READ TABLE lt_seqg3 WITH KEY gname = 'BKPF' garg = lv_garg. IF sy-subrc NE 0. EXIT. ENDIF. WAIT UP TO '1' SECONDS. ADD 1 TO lv_tabix1. IF lv_tabix1 EQ 4. et_out-ztype = 'E'. et_out-zmsg = '長時間被鎖定'. EXIT. ENDIF. ENDDO. MOVE-CORRESPONDING ls_bseg TO et_out. CALL FUNCTION 'ZFI_ITEMS_MASS_CHANGE2' EXPORTING s_bseg = l_bseg TABLES it_buztab = lt_buztab it_fldtab = lt_fldtab EXCEPTIONS bdc_errors = 1 * error_message = 2 OTHERS = 3. IF sy-subrc EQ 0. * COMMIT WORK AND WAIT. et_out-ztype = 'S'. ELSE. * ROLLBACK WORK. et_out-ztype = 'E'. WAIT UP TO '0.5' SECONDS. SELECT COUNT(*) FROM bsid WHERE belnr EQ ls_bseg-belnr AND bukrs EQ ls_bseg-bukrs AND gjahr EQ ls_bseg-gjahr AND buzei EQ ls_bseg-buzei AND zterm EQ p_ztermn. IF sy-subrc EQ 0. et_out-ztype = 'S'. ENDIF. ENDIF. lv_ztype = et_out-ztype. CALL FUNCTION 'MESSAGE_TEXT_BUILD' EXPORTING msgid = sy-msgid msgnr = sy-msgno msgv1 = sy-msgv1 msgv2 = sy-msgv2 msgv3 = sy-msgv3 msgv4 = sy-msgv4 IMPORTING message_text_output = et_out-zmsg. APPEND et_out. CLEAR: et_out,ls_bseg,lt_fldtab[],lt_buztab[]. ENDLOOP. ENDIF. CLEAR:LS_BKPF. ENDLOOP. * IF lv_ztype EQ 'S'. * COMMIT WORK AND WAIT. * ELSE. * ROLLBACK WORK. * ENDIF. ENDFUNCTION.
结构:ZRFC_FIS001
其中FI_ITEMS_CHANGE也可以更改会计凭证,直接提示 '无法更改栏位 ZTERM 的内容',估计也是要改增强,这里就不做测试和增强查找了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」