冲销会计凭证的通用FM

1 背景:业务要求需要创建一个批量冲销会计凭证的FM,包括多种会计凭证,但是MRKO产生的凭证并没有标准事务进行冲销。

2 实现:

2.1 创建FM入参:

 2.2 代码范例:


  DATA: wa_bapidochdrr TYPE bapiacrev,
        lt_return          TYPE TABLE OF bapiret2 WITH HEADER LINE.
  DATA l_obj_key  TYPE bapiacrev-obj_key .

  DATA l_error TYPE char1 ."错误标志位
  DATA ls_bkpf TYPE bkpf .
  DATA l_belnr TYPE bkpf-belnr .
  DATA l_bukrs TYPE bkpf-bukrs .
  DATA l_belnr_cx TYPE bkpf-belnr .


  CHECK pt_table[] IS NOT INITIAL .

  LOOP AT pt_table .


    CLEAR : wa_bapidochdrr , lt_return[] , l_error  , ls_bkpf , l_belnr , l_bukrs , l_belnr_cx ,l_obj_key  .


    l_belnr = pt_table-belnr .
    l_bukrs = pt_table-bukrs .

    "前导0
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = l_belnr
      IMPORTING
        output = l_belnr.

    SELECT SINGLE * FROM  bkpf INTO  ls_bkpf
      WHERE bukrs = l_bukrs
      AND belnr = l_belnr
      AND gjahr =  pt_table-gjahr .
    IF sy-subrc <> 0 .
      pt_table-status = 'E' .                                "
      pt_table-message = '未找到凭证:' && pt_table-belnr.
      MODIFY pt_table  .
      CONTINUE .
    ENDIF.

*   给 BAPI 函数相应的参数赋值
    wa_bapidochdrr-obj_type     = ls_bkpf-awtyp.
    wa_bapidochdrr-obj_key      = ls_bkpf-awkey.
    wa_bapidochdrr-obj_key_r    = ls_bkpf-awkey.
    wa_bapidochdrr-pstng_date   = pt_table-budat.
    wa_bapidochdrr-fis_period   = pt_table-budat+4(2).
    wa_bapidochdrr-comp_code    = ls_bkpf-bukrs.
    IF ls_bkpf-awtyp = 'BKPFF'.
      wa_bapidochdrr-ac_doc_no    = '$'. "OBJ_KEY字段已经包含了需要冲销凭证编号 ,所以不需要
    ENDIF.

    wa_bapidochdrr-reason_rev   =  pt_table-stgrd."冲销原因
*   取得系统 LOGICAL SYSTEM
    CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
      IMPORTING
        own_logical_system = wa_bapidochdrr-obj_sys.
*   调用 BAPI 函数,冲销会计凭证

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
      EXPORTING
        reversal = wa_bapidochdrr
        bus_act  = ls_bkpf-glvor
      IMPORTING
        obj_key  = l_obj_key
      TABLES
        return   = lt_return.

    READ TABLE lt_return WITH KEY type = 'S' id = 'RW' number = '605' .
    IF sy-subrc = 0.
*     提交凭证过账
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
      IF ls_bkpf-awtyp = 'BKPFF'.
        l_belnr_cx = l_obj_key(10).
      ELSE.
        SELECT SINGLE stblg INTO l_belnr_cx
          FROM bkpf
          WHERE bukrs = l_bukrs
          AND belnr = l_belnr
          AND gjahr = pt_table-gjahr .
      ENDIF.

      IF i_type = 'V'.
        UPDATE rkwa SET status = '00'
                        belnr = ''
                        gjahr = '0000'
                        buzei = '000000'
                        WHERE bukrs = l_bukrs
                        AND belnr = l_belnr
                        AND gjahr = pt_table-gjahr .
        COMMIT WORK AND WAIT .
      ENDIF.

      pt_table-stblg = l_belnr_cx ..
      pt_table-status = 'S' .                                "
      pt_table-message =  '冲销成功!'.
    ELSE.
      l_error = 'X'.
    ENDIF.

*   将返回信息添加到结果
    IF l_error = 'X'.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      SORT lt_return BY message .
      DELETE ADJACENT DUPLICATES FROM  lt_return COMPARING  message .
      LOOP AT lt_return WHERE type CA 'AEX' .
        IF lt_return-id = 'RW'.
          IF  lt_return-number = 609 OR lt_return-number = 632 .
            CONTINUE .
          ENDIF.
        ENDIF.
        pt_table-status = 'E' .
        pt_table-message =  pt_table-message &&  ' ' && lt_return-id  &&
                       lt_return-number && '/'  && lt_return-message .

      ENDLOOP.
    ENDIF.

    MODIFY pt_table  .
  ENDLOOP.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值