BAPI - BAPI_ACC_DOCUMENT_POST 创建会计凭证,表增强 扩展字段

 使用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 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值