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.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部