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.
View Code
复制代码
复制代码

结构:ZRFC_FIS001

 

 

其中FI_ITEMS_CHANGE也可以更改会计凭证,直接提示 '无法更改栏位 ZTERM 的内容',估计也是要改增强,这里就不做测试和增强查找了。

 

posted @   蛀牙首领  阅读(1132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示