METHOD zii_si_fii009_s4_ib_syn~si_fii009_s4_ib_syn.
*** **** INSERT IMPLEMENTATION HERE **** ***
DATA:ls_header TYPE bapiache09,
lt_accountgl TYPE STANDARD TABLE OF bapiacgl09,
ls_accountgl TYPE bapiacgl09,
lt_acc_kunnr TYPE STANDARD TABLE OF bapiacar09,
ls_acc_kunnr TYPE bapiacar09,
lt_acc_lifnr TYPE STANDARD TABLE OF bapiacap09,
ls_acc_lifnr TYPE bapiacap09,
lt_maount TYPE STANDARD TABLE OF bapiaccr09,
ls_mount TYPE bapiaccr09,
lt_extension TYPE STANDARD TABLE OF bapiparex,
ls_extension TYPE bapiparex,
lt_return TYPE STANDARD TABLE OF bapiret2,
ls_return TYPE bapiret2.
DATA: ls_acc_sp_h TYPE zsfi_acc_sp_h,
ls_acc_sp TYPE zsfi_acc_sp,
lt_acc_sp TYPE TABLE OF zsfi_acc_sp,
ls_acc_sp_return TYPE zsfi_acc_sp_return.
DATA:ls_item TYPE zdt_fii009_s4_req_item,
lv_shkzg TYPE shkzg,
lv_str TYPE string,
ls_ext TYPE zsfi004,
lt_out TYPE zdt_fii009_s4_res_return_tab,
ls_out TYPE zdt_fii009_s4_res_return.
*-------------------------------------------------------------------
" 抬头信息
ls_header-comp_code = input-mt_fii009_s4_req-head-bukrs. "公司代码
ls_header-doc_type = input-mt_fii009_s4_req-head-blart. "凭证类型
ls_header-doc_date = input-mt_fii009_s4_req-head-bldat. "凭证日期
ls_header-pstng_date = input-mt_fii009_s4_req-head-budat. "过账日期
ls_header-header_txt = input-mt_fii009_s4_req-head-bktxt. "抬头文本
ls_header-ref_doc_no = input-mt_fii009_s4_req-head-xblnr. "参考
select single bname into ls_header-username from USER_ADDRP
where NAME_TEXT = input-mt_fii009_s4_req-head-uname. "用户名
- ls_header-username = sy-uname. "用户名
" 表头必输校验
IF input-mt_fii009_s4_req-head-bukrs IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = '公司代码必填;'.
ENDIF.
IF input-mt_fii009_s4_req-head-blart IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '凭证类型必填;'.
ENDIF.
IF input-mt_fii009_s4_req-head-bldat IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '凭证日期必填;'.
ENDIF.
IF input-mt_fii009_s4_req-head-budat IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '过账日期必填;'.
ENDIF.
IF input-mt_fii009_s4_req-head-bktxt IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '抬头文本必填;'.
ENDIF.
IF input-mt_fii009_s4_req-head-xblnr IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '参考必填;'.
ENDIF.
IF input-mt_fii009_s4_req-head-waers IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '货币码必填;'.
ENDIF.
IF ls_out IS NOT INITIAL.
APPEND ls_out TO lt_out.
CLEAR:ls_out.
ENDIF.
*-------------------------------------------------------------------
CLEAR: ls_item.
READ TABLE input-mt_fii009_s4_req-head-item INTO ls_item WITH KEY newum = ‘W’.
IF sy-subrc <> 0.
READ TABLE input-mt_fii009_s4_req-head-item INTO ls_item WITH KEY newum = ‘B’.
ENDIF.
IF sy-subrc = 0 AND ( ls_item-newum = ‘W’ OR ls_item-newum = ‘B’ ).
"BDC 创建
CLEAR: ls_acc_sp_h.
MOVE-CORRESPONDING input-mt_fii009_s4_req-head TO ls_acc_sp_h.
MOVE-CORRESPONDING input-mt_fii009_s4_req-head-item[] TO lt_acc_sp[].
CALL FUNCTION 'ZFI_ACC_SP_CREATE1'
EXPORTING
is_head = ls_acc_sp_h
IMPORTING
es_return = ls_acc_sp_return
TABLES
it_item = lt_acc_sp.
CLEAR: ls_out.
MOVE-CORRESPONDING ls_acc_sp_return TO ls_out.
ELSE.
" 行项目信息
LOOP AT input-mt_fii009_s4_req-head-item INTO ls_item.
" 项目必输校验
IF ls_item-posnr IS INITIAL OR ls_item-bschl IS INITIAL OR ls_item-shkzg IS INITIAL
OR ls_item-dmbtr IS INITIAL OR ls_item-sgtxt IS INITIAL OR ls_item-zuonr IS INITIAL.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '行' && ls_item-posnr && ':'.
IF ls_item-posnr IS INITIAL.
ls_out-mess = ls_out-mess && '行号,'.
ENDIF.
IF ls_item-bschl IS INITIAL.
ls_out-mess = ls_out-mess && '过账码,'.
ENDIF.
IF NOT ( ls_item-shkzg = 'H' OR ls_item-shkzg = 'S' ).
ls_out-mess = ls_out-mess && '借方S/贷方H标识,'.
ENDIF.
IF ls_item-dmbtr IS INITIAL.
ls_out-mess = ls_out-mess && '金额,'.
ENDIF.
IF ls_item-sgtxt IS INITIAL.
ls_out-mess = ls_out-mess && '项目文本,'.
ENDIF.
IF ls_item-zuonr IS INITIAL.
ls_out-mess = ls_out-mess && '分配编号,'.
ENDIF.
ls_out-mess = ls_out-mess && '必填'.
APPEND ls_out TO lt_out.
CLEAR:ls_out.
CONTINUE.
ENDIF.
IF ls_item-hkont IS NOT INITIAL AND ls_item-kunnr IS INITIAL.
" 总帐行项目
ls_accountgl-itemno_acc = ls_item-posnr. "项目编号
ls_accountgl-gl_account = ls_item-hkont . "总账科目
ls_accountgl-gl_account = |{ ls_accountgl-gl_account ALPHA = IN }|.
ls_accountgl-item_text = ls_item-sgtxt. "文本
ls_accountgl-alloc_nmbr = ls_item-zuonr. "分配
ls_accountgl-bus_area = ls_item-gsber. "业务范围
ls_accountgl-tax_code = ls_item-mwskz. "税码
ls_accountgl-sales_ord = ls_item-vbeln. "销售订单
ls_accountgl-sales_ord = |{ ls_accountgl-sales_ord ALPHA = IN }|.
ls_accountgl-s_ord_item = ls_item-posnr1. "销售订单行项目
ls_accountgl-material = ls_item-matnr. "物料编码
ls_accountgl-material = |{ ls_accountgl-material ALPHA = IN }|.
CONDENSE ls_item-menge NO-GAPS.
ls_accountgl-quantity = ls_item-menge. "数量
ls_accountgl-base_uom = ls_item-meins. "单位
ls_accountgl-base_uom = |{ ls_accountgl-base_uom ALPHA = IN }|.
APPEND ls_accountgl TO lt_accountgl.
CLEAR ls_accountgl.
ELSEIF ls_item-kunnr IS NOT INITIAL AND ls_item-hkont IS INITIAL.
" 客户行项目
ls_acc_kunnr-itemno_acc = ls_item-posnr. "项目编号
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_item-kunnr
IMPORTING
output = ls_acc_kunnr-customer. "客户
ls_acc_kunnr-customer = |{ ls_acc_kunnr-customer ALPHA = IN }|.
ls_acc_kunnr-sales_ord = ls_item-vbeln. "销售订单
ls_acc_kunnr-sales_ord = |{ ls_acc_kunnr-sales_ord ALPHA = IN }|.
ls_acc_kunnr-s_ord_item = ls_item-posnr1. "销售订单行项目
ls_acc_kunnr-alloc_nmbr = ls_item-zuonr. "分配
ls_acc_kunnr-item_text = ls_item-sgtxt. "文本
ls_acc_kunnr-bus_area = ls_item-gsber. "业务范围
ls_acc_kunnr-tax_code = ls_item-mwskz. "税码
ls_acc_kunnr-bline_date = ls_item-zfbdt. "到期日计算的基限日期
ls_acc_kunnr-sp_gl_ind = ls_item-newum. "特别总账标识
APPEND ls_acc_kunnr TO lt_acc_kunnr.
CLEAR ls_acc_kunnr.
ELSE.
ls_out-type = 'E'.
ls_out-mess = ls_out-mess && '行' && ls_item-posnr && ':客户/科目必填且只填其中一个'.
APPEND ls_out TO lt_out.
CLEAR:ls_out.
CONTINUE.
ENDIF.
" 项目金额
CLEAR:lv_shkzg.
ls_mount-itemno_acc = ls_item-posnr. "项目编号
ls_mount-currency = input-mt_fii009_s4_req-head-waers. "货币码
IF input-mt_fii009_s4_req-head-kursf IS INITIAL.
ls_mount-exch_rate = 1. "汇率
ELSE.
ls_mount-exch_rate = input-mt_fii009_s4_req-head-kursf. "汇率
ENDIF.
-
SELECT SINGLE shkzg INTO l_shkzg FROM tbsl WHERE bschl = lw_upload-bschl. lv_shkzg = ls_item-shkzg. CONDENSE ls_item-dmbtr NO-GAPS. IF lv_shkzg = 'H'. ls_mount-amt_doccur = ls_item-dmbtr * ( -1 ). "货币金额 ELSEIF lv_shkzg = 'S'. ls_mount-amt_doccur = ls_item-dmbtr . "货币金额 ENDIF. APPEND ls_mount TO lt_maount. CLEAR ls_mount. " 拓展字段 ls_ext-posnr = ls_item-posnr. ls_ext-bschl = ls_item-bschl. "过账码 ls_ext-umskz = ls_item-newum. "特别总账标识 ls_ext-zzxjllm = ls_item-zzxjllm. "现金流量码 ls_ext-zzxmbm = ls_item-zprono. "项目号 CLEAR: lv_str. CALL METHOD cl_abap_container_utilities=>fill_container_c EXPORTING im_value = ls_ext IMPORTING ex_container = lv_str EXCEPTIONS illegal_parameter_type = 1 OTHERS = 2. DATA(lv_len) = strlen( lv_str ). CLEAR: ls_extension. DO 4 TIMES. IF lv_len <= 0. EXIT. ENDIF. CASE sy-index. WHEN 1. ls_extension-valuepart1 = lv_str. WHEN 2. ls_extension-valuepart2 = lv_str+240. WHEN 3. ls_extension-valuepart3 = lv_str+480. WHEN 4. ls_extension-valuepart4 = lv_str+720. WHEN OTHERS. ENDCASE. SUBTRACT 240 FROM lv_len. ENDDO. ls_extension-structure = 'ZSFI004'. APPEND ls_extension TO lt_extension. ENDLOOP.
*-------------------------------------------------------------------
IF lt_out IS INITIAL.
" 创建会计凭证
CALL FUNCTION ‘BAPI_ACC_DOCUMENT_POST’
EXPORTING
documentheader = ls_header
-
CUSTOMERCPD =
-
CONTRACTHEADER =
-
IMPORTING
-
OBJ_TYPE =
-
OBJ_KEY = LV_OBJKEY
-
OBJ_SYS = TABLES accountgl = lt_accountgl accountreceivable = lt_acc_kunnr accountpayable = lt_acc_lifnr
-
accounttax = currencyamount = lt_maount
-
criteria = lt_criteria[]
-
VALUEFIELD =
-
EXTENSION1 = return = lt_return
-
PAYMENTCARD =
-
CONTRACTITEM = extension2 = lt_extension
-
REALESTATE =
-
ACCOUNTWT = . CLEAR: ls_out. LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'. ls_out-type = 'E'. IF ls_out-mess IS INITIAL. ls_out-mess = ls_return-message. ELSE. ls_out-mess = ls_out-mess && ';' && ls_return-message. ENDIF. ENDLOOP. IF ls_out-type = 'E'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ELSE. ls_out-type = 'S'. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. READ TABLE lt_return INTO ls_return INDEX 1. ls_out-belnr = ls_return-message_v2+0(10). ls_out-bukrs = ls_header-comp_code. ls_out-mess = ls_out-belnr && '会计凭证创建成功'. ENDIF. ENDIF.
ENDIF.
IF ls_out IS INITIAL.
ls_out-type = ‘E’.
ls_out-mess = ‘会计凭证创建失败’.
ENDIF.IF ls_out IS NOT INITIAL.
APPEND ls_out TO lt_out.
ENDIF." 变量清空
CLEAR:ls_header,ls_return.
REFRESH:lt_accountgl,lt_acc_kunnr,lt_acc_lifnr,lt_maount,lt_return , lt_extension.
*-------------------------------------------------------------------
" 消息反馈
output-mt_fii009_s4_res-return = lt_out.
ENDMETHOD.