ABAP-通過BAPI_ACC_DOCUMENT_POST進行匯票憑證的過賬以及預制憑證的生成


匯票憑證專用事務碼是F-36,預制憑證是F-65

參考了https://mp.weixin.qq.com/s/3PhfUsPmZ0ethWprXpa_dA

FB03查看銀行承兌匯票憑證

 對於特殊總賬類型為W或者S的,雙擊進入可見出票人出票行 票據號等信息

匯票的信息是保存在BSED里的,而bapi沒有提供這些字段信息,所以需要走增強

解決辦法:隱式增強+BADI

增強位置1: FI_DOCUMENT_CHECK

一進來,先檢查是否是W類型特殊總賬  export操作在 調用bapi的時候賦值,推薦使用function函數來做,看的比較直觀

如果是,把char_w 改為U

 在函數最后,改回去

增強位置2:LFACIF5D

form最后的地方

把exten 數據傳過來,傳給bsed數據,傳遞數據可以用memory,也可以通過函數的方式,在函數組里建全局內表,然后調bapi的前面傳數據過去,存到全局內表里,在增強里再調出來

 以上是關於匯票憑證的增強,預制憑證的話也需要做幾個增強

增強BADI為ACC_DOCUMENT

 在自己代碼里把增強結構加上

 以下是完整代碼

FUNCTION ZFIFM0005.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IS_HEADER) TYPE  ZFIS0007 OPTIONAL
*"  EXPORTING
*"     VALUE(ES_RETURN) TYPE  ZBCT0002
*"  TABLES
*"      IT_ITEMS STRUCTURE  ZFIS0008
*"----------------------------------------------------------------------

  DATA:
    LS_DOCUMENTHEADER    LIKE BAPIACHE09,
    LS_BAPIACGL09        LIKE BAPIACGL09,
    LS_CUSTOMERCPD       LIKE BAPIACAR09,
    LS_ZFIS002           TYPE ZFIS0002,
    LS_CURRENCYAMOUNT    TYPE BAPIACCR09,
    LS_EXTENSION2        TYPE  BAPIPAREX,
    LS_RETURN            TYPE BAPIRET2,
    LT_ACCOUNTGL         TYPE TABLE OF BAPIACGL09 WITH HEADER LINE,
    LT_ACCOUNTRECEIVABLE LIKE TABLE OF BAPIACAR09 WITH HEADER LINE,
    LT_CURRENCYAMOUNT    LIKE TABLE OF BAPIACCR09 WITH HEADER LINE,
    LT_RETURN            LIKE TABLE OF BAPIRET2   WITH HEADER LINE, "BAPIRET2
    LT_EXTENSION2        LIKE TABLE OF BAPIPAREX  WITH HEADER LINE.

  DATA M_CURR(13) TYPE C .
*
  DATA: LV_TYPE LIKE LS_DOCUMENTHEADER-OBJ_TYPE,
        LV_KEY  LIKE LS_DOCUMENTHEADER-OBJ_KEY,
        LV_SYS  LIKE LS_DOCUMENTHEADER-OBJ_SYS.

  DATA:LV_SGL_FLD TYPE CHAR1.
  DATA LV_UMSKZ TYPE UMSKZ. "特殊總賬標識
  DATA LV_CUSTOMER TYPE KUNNR.
  DATA LV_ITEMNO_ACC TYPE POSNR_ACC .
  DATA LV_BLART      TYPE BLART.

  DATA LS_ZFIS0009 TYPE ZFIS0009.
  DATA LS_ZFIT0007 TYPE ZFIT0007.
  DATA LS_BKPF TYPE BKPF.
  DATA LS_ITEMS TYPE ZFIS0008.
  DATA LS_ITEMS2 TYPE ZFIS0008.
  DATA LV_MSG TYPE BAPI_MSG.

  CHECK IS_HEADER  IS NOT INITIAL
    AND IT_ITEMS[] IS NOT INITIAL.

* 如果沒輸過賬日期,默認當天
  IF IS_HEADER-BUDAT IS INITIAL.
    IS_HEADER-BUDAT = SY-DATUM.
  ENDIF.

* 如果沒輸貨幣碼,默認CNY
  IF IS_HEADER-WAERS IS INITIAL.
    IS_HEADER-WAERS = 'CNY'.
  ENDIF.

* 如果沒輸憑證類型,默認DZ
  IF IS_HEADER-WAERS IS INITIAL.
    IS_HEADER-BLART = 'DZ'.
  ENDIF.

  CLEAR LS_ZFIT0007.
  MOVE-CORRESPONDING IS_HEADER TO LS_ZFIT0007.
  LS_ZFIT0007-STMPS = SY-DATUM && SY-UZEIT.

  LS_DOCUMENTHEADER-HEADER_TXT = IS_HEADER-BKTXT.
  LS_DOCUMENTHEADER-COMP_CODE  = IS_HEADER-BUKRS.
  LS_DOCUMENTHEADER-DOC_DATE   = IS_HEADER-BUDAT.
  LS_DOCUMENTHEADER-DOC_TYPE   = IS_HEADER-BLART.
  LS_DOCUMENTHEADER-PSTNG_DATE = IS_HEADER-BUDAT.
  LS_DOCUMENTHEADER-USERNAME   = SY-UNAME.
  LS_DOCUMENTHEADER-FISC_YEAR  = IS_HEADER-BUDAT+0(4).
  LS_DOCUMENTHEADER-FIS_PERIOD = IS_HEADER-BUDAT+4(2).
*LS_DOCUMENTHEADER-BUS_ACT    = 'RFBU'.         "業務事務

  LOOP AT IT_ITEMS INTO LS_ITEMS.
*   行項目號
    LV_ITEMNO_ACC = SY-TABIX.

    CLEAR:LV_CUSTOMER,
          LV_SGL_FLD,
          LS_ZFIS002.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = LS_ITEMS-NEWKO
      IMPORTING
        OUTPUT = LV_CUSTOMER.

*    PERFORM FRM_GET_BSCHL USING IS_HEADER-BLART LS_ITEMS-NEWUM CHANGING LV_BSCHL LV_CUSTOMER.

    LS_CUSTOMERCPD-ITEMNO_ACC = LV_ITEMNO_ACC.

*   判斷記賬碼
    CASE LS_ITEMS-BSCHL.
      WHEN '09' OR '11'.
        CLEAR LS_CUSTOMERCPD.
        LS_CUSTOMERCPD-ITEMNO_ACC  = LV_ITEMNO_ACC.      "行項目
        LS_CUSTOMERCPD-CUSTOMER    = LV_CUSTOMER.        "客戶編號
*        LS_CUSTOMERCPD-GL_ACCOUNT  = L_ZDHKONT.           "總分類帳帳目
        LS_CUSTOMERCPD-COMP_CODE = IS_HEADER-BUKRS.      "公司代碼
        LS_CUSTOMERCPD-ALLOC_NMBR = LS_ITEMS-ZUONR.      "分配
        LS_CUSTOMERCPD-BLINE_DATE = LS_ITEMS-ZFBDT.      "基准日期
        LS_CUSTOMERCPD-ITEM_TEXT  = LS_ITEMS-SGTXT.      "項目文本
*       判斷結算方式
        IF LS_ITEMS-BSCHL = '09'.
          IF IS_HEADER-CSSCODE IS NOT INITIAL.
*           商業承兌
            IF IS_HEADER-CSSCODE = '04'.
*              LS_CUSTOMERCPD-SP_GL_IND   = 'W'.    "特別總賬標識
*             匯票需要的數據
              LV_SGL_FLD = 'W'.
              EXPORT LV_SGL_FLD TO MEMORY ID 'LV_SGL_FLD'.
              MOVE-CORRESPONDING LS_ITEMS TO LS_ZFIS0009.
              APPEND LS_ZFIS0009 TO GT_BSED.
*           銀行承兌
            ELSEIF IS_HEADER-CSSCODE = '06'.
*              LS_CUSTOMERCPD-SP_GL_IND   = 'S'.    "特別總賬標識
*             匯票需要的數據
              LV_SGL_FLD = 'S'.
              EXPORT LV_SGL_FLD TO MEMORY ID 'LV_SGL_FLD'.
              MOVE-CORRESPONDING LS_ITEMS TO LS_ZFIS0009.
              APPEND LS_ZFIS0009 TO GT_BSED.
            ENDIF.
          ENDIF.
        ENDIF.

        APPEND LS_CUSTOMERCPD TO LT_ACCOUNTRECEIVABLE.
      WHEN '40' OR '50'.
        CLEAR LS_BAPIACGL09.
        LS_BAPIACGL09-ITEMNO_ACC  = LV_ITEMNO_ACC.   "行項目
        LS_BAPIACGL09-GL_ACCOUNT = LV_CUSTOMER.      "總賬科目
        LS_BAPIACGL09-PROFIT_CTR = LS_ITEMS-PRCTR.   "利潤中心
        LS_BAPIACGL09-COMP_CODE  = IS_HEADER-BUKRS.  "公司代碼
        LS_BAPIACGL09-VALUE_DATE = LS_ITEMS-VALUT.   "起息日
        LS_BAPIACGL09-ITEM_TEXT  = LS_ITEMS-SGTXT.   "行項目文本

        APPEND LS_BAPIACGL09 TO LT_ACCOUNTGL.
    ENDCASE.

    "貸項金額判斷
    IF LS_ITEMS-BSCHL EQ 50 OR LS_ITEMS-BSCHL EQ 11.
      LS_ITEMS-WRBTR = -1 * LS_ITEMS-WRBTR.
    ENDIF.

    LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
    LS_CURRENCYAMOUNT-CURRENCY   = IS_HEADER-WAERS.
    LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ITEMS-WRBTR.
    APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
    CLEAR LS_CURRENCYAMOUNT.
*
******增強擴展字段
    LS_EXTENSION2-STRUCTURE = 'ZFIS0002' .
    LS_ZFIS002-POSNR = LV_ITEMNO_ACC .
    IF NOT LS_ITEMS-NEWUM IS INITIAL.
      LS_ZFIS002-UMSKZ = LS_ITEMS-NEWUM .
    ENDIF.
    LS_ZFIS002-RSTGR = LS_ITEMS-RSTGR."'A01'.
    LS_ZFIS002-BSCHL = LS_ITEMS-BSCHL. "LV_BSCHL .
    LS_EXTENSION2-VALUEPART1 = LS_ZFIS002 .
    APPEND LS_EXTENSION2 TO  LT_EXTENSION2.
    CLEAR  LS_EXTENSION2.

    CLEAR:LV_ITEMNO_ACC,LS_ITEMS.

  ENDLOOP.

  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      DOCUMENTHEADER    = LS_DOCUMENTHEADER
    TABLES
      ACCOUNTGL         = LT_ACCOUNTGL
      ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
      CURRENCYAMOUNT    = LT_CURRENCYAMOUNT
      RETURN            = LT_RETURN
      EXTENSION2        = LT_EXTENSION2.

  READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'S'
                                             NUMBER = '614'.

  IF SY-SUBRC EQ 0 .
*   如果不是承兌,生成預制憑證
    IF IS_HEADER-CSSCODE IS INITIAL.
      CLEAR LS_EXTENSION2.
      LS_EXTENSION2-STRUCTURE = 'PARK'.
      LS_EXTENSION2-VALUEPART1 = 'PARK'.
      APPEND LS_EXTENSION2 TO LT_EXTENSION2.
    ENDIF.

    CLEAR LT_RETURN.
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        DOCUMENTHEADER    = LS_DOCUMENTHEADER
      IMPORTING
        OBJ_TYPE          = LV_TYPE
        OBJ_KEY           = LV_KEY
        OBJ_SYS           = LV_SYS
      TABLES
        ACCOUNTGL         = LT_ACCOUNTGL
        ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
        CURRENCYAMOUNT    = LT_CURRENCYAMOUNT
        RETURN            = LT_RETURN
        EXTENSION2        = LT_EXTENSION2.
    IF LINE_EXISTS( LT_RETURN[ TYPE = 'S' ] ).

      ES_RETURN-TYPE = 'S'.
      ES_RETURN-MESSAGE = LV_KEY+0(10).

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      LS_ZFIT0007-BELNR   = LV_KEY+0(10).
      LS_ZFIT0007-TYPE    ='S'.
      LS_ZFIT0007-MESSAGE ='接口調用成功'.
    ELSE.
      SORT LT_RETURN BY TYPE ID NUMBER.
      DELETE ADJACENT DUPLICATES FROM  LT_RETURN COMPARING TYPE ID NUMBER.

      ES_RETURN-TYPE = 'E'.
      LOOP AT LT_RETURN INTO LS_RETURN.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            MSGID               = LS_RETURN-ID
            MSGNR               = LS_RETURN-NUMBER
            MSGV1               = LS_RETURN-MESSAGE_V1
            MSGV2               = LS_RETURN-MESSAGE_V2
            MSGV3               = LS_RETURN-MESSAGE_V3
            MSGV4               = LS_RETURN-MESSAGE_V4
          IMPORTING
            MESSAGE_TEXT_OUTPUT = LV_MSG.

        CONCATENATE ES_RETURN-MESSAGE LV_MSG INTO ES_RETURN-MESSAGE.

        CLEAR :LV_MSG,LS_RETURN.

      ENDLOOP.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LS_ZFIT0007-BELNR   = SPACE.
      LS_ZFIT0007-TYPE    ='E'.
      LS_ZFIT0007-MESSAGE = ES_RETURN-MESSAGE.

    ENDIF.
  ELSE.
    ES_RETURN-TYPE = 'E'.
    LOOP AT LT_RETURN INTO LS_RETURN.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          MSGID               = LS_RETURN-ID
          MSGNR               = LS_RETURN-NUMBER
          MSGV1               = LS_RETURN-MESSAGE_V1
          MSGV2               = LS_RETURN-MESSAGE_V2
          MSGV3               = LS_RETURN-MESSAGE_V3
          MSGV4               = LS_RETURN-MESSAGE_V4
        IMPORTING
          MESSAGE_TEXT_OUTPUT = LV_MSG.

      CONCATENATE ES_RETURN-MESSAGE LV_MSG INTO ES_RETURN-MESSAGE.

      CLEAR :LV_MSG,LS_RETURN.
    ENDLOOP.

    LS_ZFIT0007-BELNR   = SPACE.
    LS_ZFIT0007-TYPE    ='E'.
    LS_ZFIT0007-MESSAGE = ES_RETURN-MESSAGE.
  ENDIF.

  MODIFY ZFIT0007 FROM LS_ZFIT0007.
ENDFUNCTION.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM