ABAP BAPI_ACC_DOCUMENT_POST创建会计凭证
记录下项目过程中用到BAPI_ACC_DOCUMENT_POST时的问题
1.凭证货币与本币 不一致时,在curr_type 里区分本币金额和凭证金额(汇率会自己换算)
如果不区分本币和凭证货币,在处理外币时 报错消息如下:
Inconsistent currency information(货币信息不一致)
2.记账码是供应商类型时,供应商的前导0需要添加处理,报错消息如下:
Vendor 970773 is not defined in company code 1000(公司代码1000中未定义供应商970773)
3.部分字段在标准bapi结构中没有找到,需要增强里去处理,然后传入的结构中增加。
增强:
参考:link
4.传入的客户,填在accountgl里,需要区分清楚供应商和客户(前台过的去,BAPI过不去,搞半天原来是客户,前台双击对应的供应商/客户,跳转后显示供应商/客户)
5.有些字段前台有,在BAPI字段里找,却没有(例如:付款参考,在供应商的字段里有,但是在总账里却没有),这种情况需要在extension2里传进去就OK了

接口的代码如下。
CLASS zfi_feikong_item DEFINITION FINAL.PUBLIC SECTION.DATA:gl_account TYPE hkont, "总分类帐帐目costcenter TYPE kostl, "成本中心item_text TYPE sgtxt, "项目文本alloc_nmbr TYPE acpi_zuonr, "分配号tr_part_ba TYPE pargb, "贸易伙伴的业务范围amt_doccur TYPE bapidoccur, "本币金额wrbtr TYPE wrbtr, "凭证金额currency TYPE waers, "货币码rstgr TYPE rstgr, "付款原因代码bschl TYPE bschl, "记帐代码umskz TYPE umskz, "特别总账标识quantity TYPE menge_d, "数量base_uom TYPE meins, "基本计量单位tax_code TYPE mwskz, "销售/购买税代码material TYPE matnr, "物料编号zterm TYPE dzterm, "付款条件代码zfbdt TYPE dzfbdt, "到期日期计算的起算日期zbd1t TYPE dzbd1t, "现金折扣天数 1zbd2t TYPE dzbd2t, "现金折扣天数 2skfbt TYPE acfbt, "以货币类型中的货币计的现金折扣金额合法化rmvct TYPE rmvct, "事务类型vendor_no TYPE lifnr. "供应商或债权人的帐号
ENDCLASS.CLASS zfi_feikong_req DEFINITION FINAL.PUBLIC SECTION.DATA:username TYPE usnam, "录入用户(必输)comp_code TYPE bukrs, "公司代码(必输)doc_date TYPE bldat, "凭证日期(必输)pstng_date TYPE budat, "过账日期(必输)doc_type TYPE blart, "凭证类型(必输)header_txt TYPE bktxt, "凭证抬头文本ppnam TYPE usnam, "预制人lt_item TYPE STANDARD TABLE OF REF TO zfi_feikong_item.
ENDCLASS.CLASS zfi_feikong_cl DEFINITION FINAL.PUBLIC SECTION.DATA: interfaceid TYPE string.DATA: reqdata TYPE REF TO zfi_feikong_req.
ENDCLASS.FUNCTION zfi_feikong.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(INJSON) TYPE STRING
*" EXPORTING
*" VALUE(O_CODE) TYPE CHAR1
*" VALUE(O_DESC) TYPE CHAR100
*" VALUE(OUTJSON) TYPE STRING
*"----------------------------------------------------------------------DATA tp_input TYPE REF TO zfi_feikong_cl.DATA: gd_documentheader LIKE bapiache09,lt_accountgl LIKE TABLE OF bapiacgl09WITH HEADER LINE,lt_accountpayable LIKE TABLE OF bapiacap09WITH HEADER LINE,lt_currencyamount LIKE TABLE OF bapiaccr09WITH HEADER LINE,lt_return LIKE TABLE OF bapiret2WITH HEADER LINE.DATA: lw_extension TYPE bapiextc,lt_extension TYPE STANDARD TABLE OF bapiparexWITH HEADER LINE.DATA: ls_zcos0002 LIKE zcos0002.DATA: e_monat LIKE bkpf-monat,e_gjahr LIKE bkpf-gjahr.DATA: ld_item TYPE i .DATA lv_belnr TYPE belnr_d.* 传入参数转换判断IF injson IS INITIAL.o_code = 'E'.o_desc = 'Query ParamData is Required!'.ELSE./ui2/cl_json=>deserialize( EXPORTING json = injson pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = tp_input ).IF tp_input IS NOT INITIAL.ASSIGN tp_input->reqdata TO FIELD-SYMBOL().REFRESH : lt_accountgl[],lt_currencyamount[],lt_extension[].REFRESH : lt_return[].CLEAR : gd_documentheader.e_gjahr = ->pstng_date+0(4).e_monat = ->pstng_date+4(2).gd_documentheader-username = ->username. "录入用户(必输)gd_documentheader-comp_code = ->comp_code. "公司代码(必输)gd_documentheader-doc_date = ->doc_date. "凭证日期(必输)gd_documentheader-pstng_date = ->pstng_date. "过账日期(必输)gd_documentheader-doc_type = ->doc_type. "凭证类型(必输)gd_documentheader-fis_period = e_monat. "过账期间(必输)gd_documentheader-fisc_year = e_gjahr. "会计年度gd_documentheader-header_txt = ->header_txt. "凭证抬头文本
* GD_DOCUMENTHEADER-BUS_ACT = 'RMWE'. "业务事务
* GD_DOCUMENTHEADER-OBJ_TYPE = 'BKPFF'. "参考交易LOOP AT ->lt_item INTO DATA(ls_item).ADD 1 TO ld_item.IF ls_item->gl_account IS NOT INITIAL.lt_accountgl-itemno_acc = ld_item. "会计凭证行项目编号lt_accountgl-gl_account = ls_item->gl_account. "总分类帐帐目"lt_accountgl-VENDOR_NO = ls_item->gl_account. "总分类帐帐目"lt_accountgl-costcenter = ls_item->costcenter. "成本中心
* LT_ACCOUNTGL-BUS_AREA = P_WS_COS-GSBER. "业务范围lt_accountgl-item_text = ls_item->item_text. "项目文本lt_accountgl-alloc_nmbr = ls_item->alloc_nmbr. "分配lt_accountgl-tr_part_ba = ls_item->tr_part_ba. "贸易伙伴的业务范围lt_accountgl-quantity = ls_item->quantity. "数量lt_accountgl-base_uom = ls_item->base_uom. "基本计量单位lt_accountgl-tax_code = ls_item->tax_code. "销售/购买税代码lt_accountgl-material = ls_item->material. "物料编号lt_accountgl-customer = |{ ls_item->customer ALPHA = IN }|. "客户编号APPEND lt_accountgl.CLEAR lt_accountgl.ENDIF.IF ls_item->vendor_no IS NOT INITIAL.lt_accountpayable-itemno_acc = ld_item.lt_accountpayable-vendor_no = |{ ls_item->vendor_no ALPHA = IN }|..lt_accountpayable-comp_code = ->comp_code.APPEND lt_accountpayable.CLEAR lt_accountpayable.ENDIF."添加金额lt_currencyamount-itemno_acc = ld_item.lt_currencyamount-amt_doccur = ls_item->amt_doccur. "本币金额lt_currencyamount-curr_type = '10'.lt_currencyamount-currency = 'CNY'."ls_item->currency.APPEND lt_currencyamount.CLEAR lt_currencyamount."添加金额(**重复添加金额就是解决不能冲销的问题**)lt_currencyamount-itemno_acc = ld_item.lt_currencyamount-amt_doccur = ls_item->wrbtr."amt_doccur. "凭证货币金额lt_currencyamount-curr_type = '00'.lt_currencyamount-currency = ls_item->currency.APPEND lt_currencyamount.CLEAR lt_currencyamount."添加记账码ls_zcos0002-posnr = ld_item. "Item Nols_zcos0002-bschl = ls_item->bschl. "记帐码ls_zcos0002-umskz = ls_item->umskz. "特别总账标识ls_zcos0002-rstgr = ls_item->rstgr. "付款原因代码ls_zcos0002-zterm = ls_item->zterm. "付款条件代码ls_zcos0002-zfbdt = ls_item->zfbdt. "到期日期计算的起算日期ls_zcos0002-zbd1t = ls_item->zbd1t. "现金折扣天数1ls_zcos0002-zbd2t = ls_item->zbd2t. "现金折扣天数2ls_zcos0002-skfbt = ls_item->skfbt. "以货币类型中的货币计的现金折扣金额合法化ls_zcos0002-rmvct = ls_item->rmvct. "事务类型*是否创建预制凭证,否则凭证直接过账lt_extension-structure = 'ZCOS0002'.lt_extension-valuepart1 = ls_zcos0002.APPEND lt_extension.CLEAR : lt_extension,ls_zcos0002.ENDLOOP.ENDIF.CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'EXPORTINGdocumentheader = gd_documentheaderTABLESaccountgl = lt_accountglaccountpayable = lt_accountpayablecurrencyamount = lt_currencyamountreturn = lt_returnextension2 = lt_extension.READ TABLE lt_return WITH KEY type = 'E'.
* BREAK-POINT.IF sy-subrc <> 0.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGwait = 'X'.o_code = 'S'.o_desc = 'Acc_Document Create Success!'.READ TABLE lt_return INTO DATA(ls_return) INDEX 1.lv_belnr = ls_return-message_v2+(10).SELECT SINGLE belnr INTO @DATA(lv_c_belnr)FROM bkpfWHERE belnr = @lv_belnrAND gjahr = @e_gjahr.IF sy-subrc EQ 0.IF IS ASSIGNED.UPDATE bkpf SET ppnam = ->ppnam WHERE belnr = lv_c_belnr AND gjahr = e_gjahr.COMMIT WORK.ENDIF.ENDIF.ELSE.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.o_code = 'E'.o_desc = 'Acc_Document Create Failed!'.ENDIF.ENDIF.* 返回结果数据JSON封装outjson = /ui2/cl_json=>serialize( data = lt_return[] pretty_name = /ui2/cl_json=>pretty_mode-none numc_as_string = abap_true ).outjson = '{"RETURNCODE":"' && o_code && '", "MESSAGE":"' && o_desc && '", "DATA":' && outjson && '}'.ENDFUNCTION.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
