匯票憑證專用事務碼是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.