SAP ABAP 财务FI(CO-PA 行项目分录) KE21N创建凭证BAPI及范例


前言

使用BDC可能会遇到错误无法报出,转而使用BAPI

KE21N创建凭证BAPI及范例

使用到的BAPI:
BAPI_COPAACTUALS_POSTCOSTDATA


一、范例代码

DATA:lv_num     TYPE int4,
       lv_op      TYPE bapi0017-op_concern,
       lt_pa_data TYPE STANDARD TABLE OF bapi_copa_data WITH HEADER LINE,
       lt_field   TYPE STANDARD TABLE OF bapi_copa_field WITH HEADER LINE,
       lt_return  TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
       ls_return  TYPE bapiret2,
       l_perio    TYPE jahrper,
       l_flag     TYPE char01.

  lv_op = '1100'.
  lv_num = 1.

LOOP AT i_cwf_in.

    CLEAR ls_ztslot_fee_int.
    MOVE-CORRESPONDING i_cwf_in TO ls_ztslot_fee_int.

    IF i_type IS INITIAL OR i_type = '0' OR i_type = 'A'.
* *  外部接口调用时, 因为前面变过一次符号。 存表时,按着原始数据存储。
      ls_ztslot_fee_int-inttbunkchg = 0 - i_cwf_in-inttbunkchg.
      ls_ztslot_fee_int-loadchg = 0 - i_cwf_in-loadchg.
      ls_ztslot_fee_int-trfchg = 0 - i_cwf_in-trfchg.
      ls_ztslot_fee_int-feetype = '1'.
    ENDIF.

*    BAPI方式POST

    CLEAR:lt_pa_data[],lt_pa_data,lt_field[],lt_field,l_flag.

*    记录类型
    PERFORM frm_add_pa_data USING lv_num 'VRGAR' 'B' '' CHANGING lt_pa_data[] lt_field[].
*    记账日期
    PERFORM frm_add_pa_data USING lv_num 'BUDAT' i_budat '' CHANGING lt_pa_data[] lt_field[].
*    年度期间
    CONCATENATE i_budat+0(4) '0' i_budat+4(2) INTO l_perio.
    PERFORM frm_add_pa_data USING lv_num 'PERIO' l_perio '' CHANGING lt_pa_data[] lt_field[].
*    用户名
    PERFORM frm_add_pa_data USING lv_num 'USNAM' sy-uname '' CHANGING lt_pa_data[] lt_field[].
*    年度
    PERFORM frm_add_pa_data USING lv_num 'GJAHR' i_budat+0(4) '' CHANGING lt_pa_data[] lt_field[].
*    期间
    PERFORM frm_add_pa_data USING lv_num 'PERDE' i_budat+4(2) '' CHANGING lt_pa_data[] lt_field[].
*    公司代码
    PERFORM frm_add_pa_data USING lv_num 'BUKRS' i_cwf_in-comcd '' CHANGING lt_pa_data[] lt_field[].
*    航次
    PERFORM frm_add_pa_data USING lv_num 'WWD34' i_cwf_in-voy '' CHANGING lt_pa_data[] lt_field[].
*    船名
    PERFORM frm_add_pa_data USING lv_num 'WWD36' i_cwf_in-vslcd '' CHANGING lt_pa_data[] lt_field[].
*    航向
    PERFORM frm_add_pa_data USING lv_num 'WWD37' i_cwf_in-leg '' CHANGING lt_pa_data[] lt_field[].
*    挂港
    PERFORM frm_add_pa_data USING lv_num 'WWD42' i_cwf_in-tmpport '' CHANGING lt_pa_data[] lt_field[].
*    航线
    PERFORM frm_add_pa_data USING lv_num 'WWD03' i_cwf_in-service '' CHANGING lt_pa_data[] lt_field[].
*    收入成本属性
    PERFORM frm_add_pa_data USING lv_num 'WWD28' i_cwf_in-arc '' CHANGING lt_pa_data[] lt_field[].
*    币种
    PERFORM frm_add_pa_data USING lv_num 'FRWAE' i_cwf_in-curr '' CHANGING lt_pa_data[] lt_field[].
*    汇率
    PERFORM frm_add_pa_data USING lv_num 'KURSF' i_cwf_in-exchgr '' CHANGING lt_pa_data[] lt_field[].
*    中转费
    PERFORM frm_add_pa_data USING lv_num 'VVC07' i_cwf_in-trfchg i_cwf_in-curr CHANGING lt_pa_data[] lt_field[].
*    内部交易舱位费
    PERFORM frm_add_pa_data USING lv_num 'VVA04' i_cwf_in-inttbunkchg i_cwf_in-curr CHANGING lt_pa_data[] lt_field[].
*   装卸费
    PERFORM frm_add_pa_data USING lv_num 'VVC03' i_cwf_in-loadchg i_cwf_in-curr CHANGING lt_pa_data[] lt_field[].

    REFRESH lt_return.

*    POST
    CALL FUNCTION 'BAPI_COPAACTUALS_POSTCOSTDATA'
      EXPORTING
        operatingconcern = lv_op
        testrun          = ''
      TABLES
        inputdata        = lt_pa_data
        fieldlist        = lt_field
        return           = lt_return.

    READ TABLE lt_return WITH KEY type = 'E' .
    IF sy-subrc = 0.
      l_flag = 'X'.
    ENDIF.
    READ TABLE lt_return WITH KEY type = 'A'.
    IF sy-subrc = 0.
      l_flag = 'X'.
    ENDIF.

    IF l_flag = 'X'."FAIL

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .

      lv_message = '生成失败!'.
      LOOP AT lt_return[] INTO ls_return.

        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = ls_return-id
            msgnr               = ls_return-number
            msgv1               = ls_return-message_v1
            msgv2               = ls_return-message_v2
            msgv3               = ls_return-message_v3
            msgv4               = ls_return-message_v4
          IMPORTING
            message_text_output = lv_message.
        CONCATENATE lv_message ls_ztslot_fee_int-message INTO ls_ztslot_fee_int-message SEPARATED BY '/'.

      ENDLOOP.

      IF i_type = 'A'.
        ls_ztslot_fee_int-status = 'A'.
      ELSE.
        ls_ztslot_fee_int-status = '0'.
      ENDIF.

    ELSE. "SEC

      wmsg-msgtyp = 'S'.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      lv_message = '生成成功!'.
      READ TABLE lt_return[] INTO ls_return INDEX 1.
      IF sy-subrc EQ 0.

        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            msgid               = ls_return-id
            msgnr               = ls_return-number
            msgv1               = ls_return-message_v1
            msgv2               = ls_return-message_v2
            msgv3               = ls_return-message_v3
            msgv4               = ls_return-message_v4
          IMPORTING
            message_text_output = lv_message.
        CONCATENATE lv_message ls_ztslot_fee_int-message INTO ls_ztslot_fee_int-message SEPARATED BY '/'.

      ENDIF.
      IF i_type = 'A'.
        ls_ztslot_fee_int-status = 'S'.
        ls_ztslot_fee_int-ke21ndoc3 = ls_return-message_v1.
      ELSE.
        ls_ztslot_fee_int-status = '0'.
        ls_ztslot_fee_int-ke21ndoc1 = ls_return-message_v1.
      ENDIF.

    ENDIF.

*    END  ADD

    ls_ztslot_fee_int-budat = i_budat.
    ls_ztslot_fee_int-upd_time = sy-uzeit.
    ls_ztslot_fee_int-upd_date = sy-datum.
    MODIFY  ztslot_fee_int FROM ls_ztslot_fee_int.

    IF sy-subrc = 0.
      COMMIT WORK.
    ELSE.
      ROLLBACK WORK.
    ENDIF.

    MOVE-CORRESPONDING i_cwf_in TO ls_fee_internal_ret.
    IF  wmsg-msgtyp <> 'S'.
      ls_fee_internal_ret-status = 'E'.
    ELSE.
      ls_fee_internal_ret-status = 'S'.
    ENDIF.
    ls_fee_internal_ret-message = ls_ztslot_fee_int-message.
    APPEND ls_fee_internal_ret TO e_fee_internal.
    CLEAR ls_fee_internal_ret.
  ENDLOOP.

FORM frm_add_pa_data  USING    iv_num
                               iv_fieldname
                               iv_value
                               iv_currency
                      CHANGING ct_pa_data LIKE pa_data
                               ct_field LIKE pa_field.

  DATA:ls_data  TYPE bapi_copa_data,
       ls_field TYPE bapi_copa_field.

  ls_data-record_id = iv_num.
  ls_data-fieldname = iv_fieldname.
  ls_data-value = iv_value.
  ls_data-currency = iv_currency.
  APPEND ls_data TO ct_pa_data.

  ls_field-fieldname = iv_fieldname.
  APPEND ls_field TO ct_field.

ENDFORM.


二、获取凭证号

使用这个BAPI会有一个问题 成功以后不会返回凭证编号
RETURN内表也为空

如果需要凭证号,得去做增强
有两种方法 具体可参照传送门
https://community.sap.com/t5/application-development-blog-posts/to-get-copa-document-number-returned-by-quot-bapi-copaactuals-postcostdata/ba-p/13249862

总结

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ggreekn

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值