SAP ABAP 收款流程接口

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.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值