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 *" 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. 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. * WHERE belnr EQ '0090002477' * 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 = '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 ls_fldtab. ls_fldtab-fname = 'ZTERM'. APPEND ls_fldtab TO lt_fldtab. 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. ENDDO. MOVE-CORRESPONDING ls_bseg TO et_out. CALL FUNCTION 'FI_ITEMS_MASS_CHANGE' EXPORTING s_bseg = l_bseg TABLES it_buztab = lt_buztab it_fldtab = lt_fldtab EXCEPTIONS bdc_errors = 1 OTHERS = 2. IF sy-subrc EQ 0. COMMIT WORK AND WAIT. et_out-ztype = 'S'. ELSE. ROLLBACK WORK. et_out-ztype = 'E'. ENDIF. 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. ENDLOOP. ENDIF. ENDLOOP. ENDFUNCTION.
结构:ZRFC_FIS001
其中FI_ITEMS_CHANGE也可以更改会计凭证,直接提示 '无法更改栏位 ZTERM 的内容',估计也是要改增强,这里就不做测试和增强查找了。
post SAP-Garson
原文链接:https://www.cnblogs.com/chaguoguo/p/16576504.html文章来自于网络,如果侵犯了您的权益,请联系站长删除!