ABAP 会计凭证创建BAPI【BAPI_ACC_DOCUMENT_POST】

这篇文章详细介绍了如何在SAP系统中通过BAPI接口处理无法直接导入的字段,需要通过SE19进行增强实现。具体步骤包括创建日志记录实例,设置凭证抬头和行项目,处理总账科目、货币项目、供应商和税值等信息,并在遇到错误时进行事务回滚或提交。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有些字段无法通过BAPI导入,需要经过SE19增强实施激活才行
增强参考博客:
https://blog.youkuaiyun.com/stone0823/article/details/96843146

  "bapi参数
  "表头
  DATA: ls_header TYPE bapiache09.
  "总账科目
  DATA:lt_accountgl TYPE TABLE OF bapiacgl09,
       ls_accountgl TYPE  bapiacgl09.
  "货币项目
  DATA: lt_currency TYPE TABLE OF bapiaccr09,
        ls_currency TYPE bapiaccr09.
  "供应商
  DATA: lt_vendor TYPE TABLE OF bapiacap09,
        ls_vendor TYPE bapiacap09.
  "税值
  DATA:lt_accounttax TYPE TABLE OF bapiactx09,
       ls_accounttax TYPE bapiactx09.
  "返回值
  DATA: lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
        ls_return TYPE bapiret2.
*  "增强字段
  DATA:ls_zexten TYPE zfis003c,
       lt_ext2   LIKE TABLE OF bapiparex  WITH HEADER LINE.
  "记账码
  DATA: ls_bschl    TYPE bschl.
  "行项目号
  DATA: lv_buzei  TYPE buzei.
  DATA: lv_key      TYPE bapiache09-obj_key.
  DATA: lv_posid  TYPE PRPS-POSID.

*&--- 创建日志记录实例
  DATA:lv_act TYPE zel_ifact.
 
  " 凭证抬头
  ls_header-username   = sy-uname.
  ls_header-doc_type   = 'Z1'.           " 凭证类型,默认Z1
  ls_header-doc_date   = is_input-bldat. " 凭证日期
  ls_header-pstng_date = is_input-budat. " 记账日期
  ls_header-comp_code  = is_input-bukrs. " 公司代码
  ls_header-ref_doc_no = is_input-xblnr. " 参考
  ls_header-header_txt = is_input-bktxt. " 抬头文本

  lv_buzei = '000'.

  " 凭证行项目
  LOOP AT it_input INTO DATA(ls_input).

    lv_buzei = lv_buzei + 10.

    IF ls_input-hkont IS NOT INITIAL.
      ls_zexten-bschl = '40'.

      "总账
      ls_accountgl-itemno_acc = lv_buzei.
      ls_accountgl-gl_account = ls_input-hkont.   " 科目
      ls_accountgl-tax_code   = ls_input-mwskz.   " 税码
      ls_accountgl-wbs_element = ls_input-projk.  " wbs
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' " 成本中心
        EXPORTING
          input  = ls_input-kostl
        IMPORTING
          output = ls_accountgl-costcenter.
      ls_accountgl-func_area   = ls_input-fkber.    " 功能范围
      ls_accountgl-item_text   = ls_input-sgtxt.    " 文本摘要
      ls_accountgl-alloc_nmbr  = ls_input-zuonr.    " 分配号码
      ls_accountgl-ref_key_2   = ls_input-xref2.    " 参考代码2
      APPEND ls_accountgl TO lt_accountgl.

      "金额
      ls_currency-itemno_acc = lv_buzei.
      ls_currency-currency   = is_input-waers.
      ls_currency-amt_doccur = ls_input-wrbtr .
      APPEND ls_currency TO lt_currency.

    ELSEIF ls_input-lifnr IS NOT INITIAL.
      ls_zexten-bschl = '31'.
      " 供应商
      CLEAR ls_vendor.
      ls_vendor-itemno_acc = lv_buzei.
      ls_vendor-gl_account = ls_input-hkont." 费用科目
      ls_vendor-vendor_no  = ls_input-lifnr." 供应商编码
      ls_vendor-vendor_no  = |{ ls_vendor-vendor_no ALPHA = IN }|.
      ls_vendor-bline_date = is_input-budat.  " 付款起算时间
      ls_vendor-pymt_meth  = 'T'.             " 付款方式
      ls_vendor-item_text  = ls_input-sgtxt.  " 文本摘要
      ls_vendor-alloc_nmbr = ls_input-zuonr.  " 分配号码
      ls_vendor-ref_key_2  = ls_input-xref2.  " 参考代码2
      ls_vendor-bline_date = is_input-budat.  " 付款起算时间
      ls_vendor-pymt_meth  = 'T' .            " 付款方式
      APPEND ls_vendor TO lt_vendor.

      "金额
      ls_currency-itemno_acc = lv_buzei.
      ls_currency-currency   = is_input-waers.
      ls_currency-amt_doccur = 0 - ls_input-wrbtr .
      APPEND ls_currency TO lt_currency.
    ENDIF.

    " 增强字段
    ls_zexten-posnr = lv_buzei.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = ls_input-kostl
      IMPORTING
        output = ls_zexten-kostl.
    ls_zexten-zuonr = ls_input-zuonr.
    ls_zexten-sgtxt = ls_input-sgtxt.
    lt_ext2-structure  = 'ZFIS003C'.
    lt_ext2-valuepart1 = ls_zexten.
    APPEND  lt_ext2.

  ENDLOOP.

  "创建会计凭证
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader = ls_header
    IMPORTING
      obj_key        = lv_key
    TABLES
      accountgl      = lt_accountgl
      accountpayable = lt_vendor
      accounttax     = lt_accounttax
      currencyamount = lt_currency
      return         = lt_return
      extension2     = lt_ext2.

  READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
  IF sy-subrc = 0.  " 创建失败,存在异常
    LOOP AT lt_return WHERE type = 'E'.
      IF es_output-message IS INITIAL.
        es_output-message = lt_return-message.
      ELSE.
        CONCATENATE lt_return-message es_output-message INTO es_output-message SEPARATED BY ';'.
      ENDIF.
    ENDLOOP.
    es_output-okey = '0'.
    es_output-message = TEXT-m02 && ';' && es_output-message. " 创建失败
    lr_log->modify_header( i_statu = 'E' i_ifmsg = TEXT-m02 ). " 创建失败
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE. " 创建成功
    es_output-okey = '1'.
    es_output-message = TEXT-m03 . " 创建成功
    lr_log->modify_header( i_statu = 'S' i_ifmsg = TEXT-m03 ). " 创建成功
    es_output-belnr =  lv_key+0(10).  " 凭证号
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值