SAP ABAP 付款流程接口

METHOD zii_si_fii008_s4_ib_syn~si_fii008_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_item  TYPE zdt_fii008_s4_req_item,
     lv_shkzg TYPE shkzg,
     lv_str   TYPE string,
     ls_ext   TYPE zsfi004,
     lt_out   TYPE zdt_fii008_s4_res_return_i_tab,
     ls_out   TYPE zdt_fii008_s4_res_return_item.

*-------------------------------------------------------------------
" 抬头信息
ls_header-comp_code = input-mt_fii008_s4_req-head-bukrs. "公司代码
ls_header-doc_type = input-mt_fii008_s4_req-head-blart. "凭证类型
ls_header-doc_date = input-mt_fii008_s4_req-head-bldat. "凭证日期
ls_header-pstng_date = input-mt_fii008_s4_req-head-budat. "过账日期
ls_header-header_txt = input-mt_fii008_s4_req-head-bktxt. "抬头文本
ls_header-ref_doc_no = input-mt_fii008_s4_req-head-xblnr. "参考
ls_header-username = sy-uname. "用户名

" 表头必输校验
IF input-mt_fii008_s4_req-head-bukrs IS INITIAL.
  ls_out-type = 'E'.
  ls_out-mess = '公司代码必填;'.
ENDIF.
IF input-mt_fii008_s4_req-head-blart IS INITIAL.
  ls_out-type = 'E'.
  ls_out-mess = ls_out-mess && '凭证类型必填;'.
ENDIF.
IF input-mt_fii008_s4_req-head-bldat IS INITIAL.
  ls_out-type = 'E'.
  ls_out-mess = ls_out-mess && '凭证日期必填;'.
ENDIF.
IF input-mt_fii008_s4_req-head-budat IS INITIAL.
  ls_out-type = 'E'.
  ls_out-mess = ls_out-mess && '过账日期必填;'.
ENDIF.
IF input-mt_fii008_s4_req-head-bktxt IS INITIAL.
  ls_out-type = 'E'.
  ls_out-mess = ls_out-mess && '抬头文本必填;'.
ENDIF.
IF input-mt_fii008_s4_req-head-xblnr IS INITIAL.
  ls_out-type = 'E'.
  ls_out-mess = ls_out-mess && '参考必填;'.
ENDIF.
IF input-mt_fii008_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.

*-------------------------------------------------------------------
" 行项目信息
LOOP AT input-mt_fii008_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 ls_item-shkzg IS INITIAL.
      ls_out-mess = ls_out-mess && '借方/贷方标识,'.
    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-lifnr 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-costcenter = ls_item-kostl.      "成本中心
    ls_accountgl-costcenter = |{ ls_accountgl-costcenter ALPHA = IN }|.
  •    ls_accountgl-profit_ctr = ls_item-prctr.       "利润中心
      ls_accountgl-orderid    = ls_item-aufnr.      "内部订单号
      ls_accountgl-orderid = |{ ls_accountgl-orderid 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-po_number   = ls_item-ebeln.      "采购订单
      ls_accountgl-po_number = |{ ls_accountgl-po_number ALPHA = IN }|.
      ls_accountgl-po_item   = ls_item-ebelp.      "采购订单行项目
      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-lifnr IS NOT INITIAL AND ls_item-hkont IS INITIAL.
      " 供应商行项目
      ls_acc_lifnr-itemno_acc = ls_item-posnr.    "项目编号
      ls_acc_lifnr-vendor_no  = ls_item-lifnr .   "供应商
      ls_acc_lifnr-vendor_no  = |{ ls_acc_lifnr-vendor_no ALPHA = IN }|.
      ls_acc_lifnr-alloc_nmbr = ls_item-zuonr.     "分配
      ls_acc_lifnr-item_text  = ls_item-sgtxt.      "文本
      ls_acc_lifnr-tax_code   = ls_item-mwskz.     "税码
      ls_acc_lifnr-bline_date = ls_item-zfbdt.   "到期日计算的基限日期
      ls_acc_lifnr-sp_gl_ind  =  ls_item-newum.    "特别总账标识
      ls_acc_lifnr-bus_area = ls_item-gsber.      "业务范围
      APPEND ls_acc_lifnr TO lt_acc_lifnr.
      CLEAR ls_acc_lifnr.
    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_fii008_s4_req-head-waers.        "货币码
    IF input-mt_fii008_s4_req-head-kursf IS INITIAL.
      ls_mount-exch_rate  = 1.        "汇率
    ELSE.
      ls_mount-exch_rate  = input-mt_fii008_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. "现金流量码
    
    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.
    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.
    

    ENDIF.

    " 变量清空
    CLEAR:ls_header,ls_return.
    REFRESH:lt_accountgl,lt_acc_kunnr,lt_acc_lifnr,lt_maount,lt_return , lt_extension.

*-------------------------------------------------------------------
" 消息反馈
output-mt_fii008_s4_res-return_item = lt_out.

ENDMETHOD.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值