使用BAPI创建会计凭证需要注意的一点是,行项目最多不能超过1000行
FUNCTION zyktrfm_acc_document_post.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(IS_HEADER) TYPE ZYKSTR0013
*" REFERENCE(IV_COMMIT) TYPE C DEFAULT 'X'
*" EXPORTING
*" REFERENCE(EV_BELNR) TYPE BELNR_D
*" REFERENCE(EV_GJAHR) TYPE GJAHR
*" TABLES
*" IT_ITEM STRUCTURE ZYKSTR0014 OPTIONAL
*" ET_RET STRUCTURE BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
*凭证抬头
DATA: ls_doc_head TYPE bapiache09.
*总账明细
DATA: ls_gl TYPE bapiacgl09,
lt_gl TYPE TABLE OF bapiacgl09 WITH HEADER LINE.
*金额明细
DATA: ls_amt TYPE bapiaccr09,
lt_amt TYPE TABLE OF bapiaccr09 WITH HEADER LINE.
*客户
DATA: ls_cus TYPE bapiacar09,
lt_cus TYPE TABLE OF bapiacar09 WITH HEADER LINE.
*供应商
DATA: ls_ven TYPE bapiacap09,
lt_ven TYPE TABLE OF bapiacap09 WITH HEADER LINE.
*增强字段
DATA: lt_ext TYPE TABLE OF bapiparex WITH HEADER LINE,
ls_ext TYPE zykstr0008,
ls_new TYPE zykstr0008.
*返回参数
DATA: ls_ret TYPE bapiret2,
lt_ret TYPE TABLE OF bapiret2 WITH HEADER LINE.
*生成的会计凭证号码
DATA: lv_buzei TYPE buzei,
lv_obj_type LIKE bapiache09-obj_type,
lv_obj_key LIKE bapiache09-obj_key,
lv_obj_sys LIKE bapiache09-obj_sys.
"凭证抬头
ls_doc_head-comp_code = is_header-bukrs. "公司代码
ls_doc_head-doc_date = sy-datum. "凭证日期
ls_doc_head-pstng_date = is_header-budat. "过账日期
ls_doc_head-fisc_year = is_header-budat+0(4). "年度
ls_doc_head-fis_period = is_header-budat+4(2). "期间
IF is_header-blart IS INITIAL.
ls_doc_head-doc_type = 'SA'. "凭证类型
ELSE.
ls_doc_head-doc_type = is_header-blart.
ENDIF.
ls_doc_head-header_txt = is_header-bktxt."凭证抬头文本
* IF is_header-usnam IS NOT INITIAL. "用户名
* ls_doc_head-username = is_header-usnam.
* ELSE.
ls_doc_head-username = sy-uname.
* ENDIF.
CLEAR lv_buzei.
LOOP AT it_item INTO DATA(wa_item).
lv_buzei = lv_buzei + 1.
CASE wa_item-koart.
WHEN 'S'."总账项目
ls_gl-itemno_acc = lv_buzei. "凭证行项目
ls_gl-gl_account = wa_item-hkont. "总账科目
ls_gl-profit_ctr = wa_item-prctr. "利润中心
ls_gl-item_text = wa_item-sgtxt. "项目文本
ls_gl-quantity = wa_item-menge. "数量
* ls_gl-funds_ctr = wa_item-fistl. "资金中心
* ls_gl-cmmt_item = wa_item-fipos. "承诺项目
ls_gl-trade_id = wa_item-vbund. "贸易伙伴的公司标识
ls_gl-tax_code = wa_item-mwskz. "销售/购买税代码
* ls_gl-asset_no = wa_item-anln1. "主资产号
IF wa_item-kunnr IS NOT INITIAL.
ls_gl-customer = wa_item-kunnr.
ENDIF.
IF wa_item-lifnr IS NOT INITIAL.
ls_gl-vendor_no = wa_item-lifnr.
ENDIF.
APPEND ls_gl TO lt_gl.
CLEAR ls_gl.
WHEN 'D'."客户
ls_cus-itemno_acc = lv_buzei.
ls_cus-customer = wa_item-kunnr.
ls_cus-gl_account = wa_item-hkont.
ls_cus-profit_ctr = wa_item-prctr.
ls_cus-bline_date = wa_item-zfbdt."到期日期计算的起算日期
APPEND ls_cus TO lt_cus.
WHEN 'K'."供应商
ls_ven-itemno_acc = lv_buzei.
ls_ven-vendor_no = wa_item-lifnr.
ls_ven-gl_account = wa_item-hkont.
ls_ven-profit_ctr = wa_item-prctr.
ls_ven-alloc_nmbr = sy-datum.
* ls_ven-bline_date = sy-datum.
APPEND ls_ven TO lt_ven.
ENDCASE.
IF wa_item-shkzg = 'H'.
wa_item-tsl = - abs( wa_item-tsl ).
wa_item-hsl = - abs( wa_item-tsl ).
ELSE.
wa_item-tsl = abs( wa_item-tsl ).
wa_item-hsl = abs( wa_item-tsl ).
ENDIF.
"货币项目
ls_amt-curr_type = '00'. "凭证货币 交易货币
ls_amt-itemno_acc = lv_buzei. "凭证行项目
ls_amt-currency = wa_item-rtcur. "交易货币码
ls_amt-amt_doccur = wa_item-tsl. "凭证金额
IF is_header-kursf IS NOT INITIAL. "汇率
ls_amt-exch_rate = is_header-kursf.
ENDIF.
APPEND ls_amt TO lt_amt.
CLEAR ls_amt.
ls_amt-curr_type = '10'. "公司代码货币 本位币
ls_amt-itemno_acc = lv_buzei. "凭证行项目
IF wa_item-hsl = 0.
ls_amt-currency = 'CNY'.
ls_amt-amt_doccur = wa_item-tsl.
ELSE.
ls_amt-currency = wa_item-rtcur. "交易货币码
ls_amt-amt_doccur = wa_item-hsl. "本位币金额
ENDIF.
APPEND ls_amt TO lt_amt.
CLEAR ls_amt.
"CodingBlock字段
lt_ext-structure = 'ZYKSTR0008'.
CLEAR ls_ext.
ls_ext-posnr = lv_buzei. "凭证行项目
IF wa_item-shkzg = 'S' AND wa_item-bschl IS INITIAL.
ls_ext-bschl = '40'.
ELSEIF wa_item-shkzg = 'H' AND wa_item-bschl IS INITIAL.
ls_ext-bschl = '50'.
ELSE.
ls_ext-bschl = wa_item-bschl. "记账码
ENDIF.
ls_ext-numpg = is_header-numpg. "发票的页数
ls_ext-rstgr = wa_item-rstgr. "付款原因代码 现金流量
ls_ext-zzfzhslb = wa_item-zzfzhslb. "辅助核算类别
ls_ext-zzfzhsnr = wa_item-zzfzhsnr. "辅助核算内容
IF wa_item-lifnr IS NOT INITIAL.
ls_ext-zzlifnr = wa_item-lifnr.
ELSE.
ls_ext-zzlifnr = wa_item-zzlifnr.
ENDIF.
IF wa_item-kunnr IS NOT INITIAL.
ls_ext-zzkunnr = wa_item-kunnr.
ELSE.
ls_ext-zzkunnr = wa_item-zzkunnr.
ENDIF.
ls_ext-zzsklx = wa_item-zzsklx.
ls_ext-zzhtbh = wa_item-zzhtbh.
ls_ext-zzdyfz1 = wa_item-zzdyfz1.
ls_ext-zzdyfz2 = wa_item-zzdyfz2.
ls_ext-zzdyfz3 = wa_item-zzdyfz3.
ls_ext-zzdyfz4 = wa_item-zzdyfz4.
ls_ext-zzdyfz5 = wa_item-zzdyfz5.
ls_ext-zzhkjsd = wa_item-zzhkjsd.
ls_ext-zzjhnyfjsd = wa_item-zzjhnyfjsd.
ls_ext-zzjhwyfjsd = wa_item-zzjhwyfjsd.
ls_ext-zzsfwqcj = wa_item-zzsfwqcj.
ls_ext-zzzpjh = wa_item-zzzpjh.
ls_ext-zzkhyh = wa_item-zzkhyh.
ls_ext-zzhzbl = wa_item-zzhzbl.
ls_ext-zzfzcch = wa_item-zzfzcch.
ls_ext-zzswlx = wa_item-zzswlx.
ls_ext-zzgrkh = wa_item-zzgrkh.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = ls_ext
IMPORTING
ex_container = lt_ext+30(960)
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
* lt_ext-valuepart1 = ls_ext.
APPEND lt_ext. CLEAR lt_ext.
ENDLOOP.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_doc_head
TABLES
accountgl = lt_gl
accountreceivable = lt_cus
accountpayable = lt_ven
currencyamount = lt_amt
return = lt_ret
extension2 = lt_ext.
IF NOT line_exists( lt_ret[ type = 'E' ] ).
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_doc_head
* CUSTOMERCPD =
* CONTRACTHEADER =
IMPORTING
obj_type = lv_obj_type
obj_key = lv_obj_key
obj_sys = lv_obj_sys
TABLES
accountgl = lt_gl
currencyamount = lt_amt
return = et_ret
extension2 = lt_ext.
IF lv_obj_key IS NOT INITIAL.
ev_belnr = lv_obj_key+0(10).
ev_gjahr = lv_obj_key+14(4).
ls_ret-type = 'S'.
ls_ret-message = '凭证创建成功'.
ls_ret-message_v1 = ev_belnr.
ls_ret-message_v2 = ev_gjahr.
APPEND ls_ret TO et_ret.
IF iv_commit = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ELSE.
et_ret[] = CORRESPONDING #( et_ret[] ).
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ELSE.
et_ret[] = CORRESPONDING #( lt_ret[] ).
ENDIF.
ENDFUNCTION.
SE19实现BADI增强ACC_DOCUMENT,这个增强是用来将BAPI_ACC_DOCUMENT_POST参数表EXTENSION2传入系统表,重写实施IF_EX_ACC_DOCUMENT~CHANGE
DATA: wa_extension TYPE bapiparex,
ext_value(960) TYPE c,
wa_accit TYPE accit,
l_ref TYPE REF TO data.
FIELD-SYMBOLS: <l_struc> TYPE any,
<l_field> TYPE any.
SORT c_extension2 BY structure.
LOOP AT c_extension2 INTO wa_extension.
AT NEW structure.
CREATE DATA l_ref TYPE (wa_extension-structure).
ASSIGN l_ref->* TO <l_struc>.
ENDAT.
* CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2
* wa_extension-valuepart3 wa_extension-valuepart4
* INTO ext_value.
* MOVE ext_value TO <l_struc>.
CALL METHOD cl_abap_container_utilities=>read_container_c
EXPORTING
im_container = wa_extension+30(960)
IMPORTING
ex_value = <l_struc>
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ASSIGN COMPONENT 'POSNR' OF STRUCTURE <l_struc> TO <l_field>.
READ TABLE c_accit WITH KEY posnr = <l_field>
INTO wa_accit.
IF sy-subrc IS INITIAL.
MOVE-CORRESPONDING <l_struc> TO wa_accit.
MODIFY c_accit FROM wa_accit INDEX sy-tabix.
ENDIF.
ENDLOOP.
**凭证预制标志
READ TABLE c_extension2 INTO wa_extension WITH KEY valuepart1 = 'BAPI-PARK' .
IF sy-subrc = 0 .
c_acchd-status_new = 2 .
ENDIF .