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.