ABAP FB08 凭证冲销(BAPI_ACC_DOCUMENT_REV_POST)

本文介绍了一个ABAP程序,用于处理会计凭证的冲销流程。程序通过读取凭证数据并利用SAP BAPI(Business API)进行冲销操作。在冲销过程中,程序会检查凭证状态,并根据不同的情况更新凭证的状态消息。

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

*&---------------------------------------------------------------------*
*& Form FRM_WRITE_OFF
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_write_off .
  LOOP AT lt_data WHERE box 'X'.
    CASE lt_data-icon.
      WHEN icon_led_green.
        lt_data-zmsg lt_data-zmsg && '该凭证已冲销!!'.
        lt_data-icon icon_led_yellow.
        MODIFY lt_data.
        PERFORM frm_refresh_display.
        CLEAR lt_data.
        CONTINUE.
      WHEN icon_led_yellow.
        CONTINUE.
      WHEN OTHERS.
        CLEAR lt_data-zmsg,lt_data-icon.
    ENDCASE.

*    调用bapi
    PERFORM bapi_acc_document_rev_post CHANGING lt_data.
    MODIFY lt_data.
    PERFORM frm_refresh_display.
    CLEAR lt_data.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BAPI_ACC_DOCUMENT_REV_POST
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_LT_DATA  text
*&---------------------------------------------------------------------*
FORM bapi_acc_document_rev_post  CHANGING p_data TYPE ty_data.
  DATA l_bkpf    TYPE bkpf.
  DATA l_reversal TYPE bapiacrev,
         l_bus_act  TYPE bapiache09-bus_act,
         l_obj_key  TYPE bapiacrev-obj_key,
         gt_return  TYPE TABLE OF bapiret2 WITH HEADER LINE,
         i_return   TYPE bapiret2.

*  获取数据
  SELECT SINGLE FROM bkpf INTO l_bkpf WHERE bukrs p_data-bukrs
                                        AND   belnr p_data-belnr
                                        AND   gjahr p_data-gjahr
                                        AND   xreversal ''.
  IF sy-subrc <> 0.
    p_data-icon icon_led_red.
    p_data-zmsg '表:BKPF(会计核算凭证标题)没有数据或该凭证已冲销!请核查数据!'.
    EXIT.
  ENDIF.

*  bapi 参数赋值
  l_reversal-obj_type     l_bkpf-awtyp.
*  l_reversal-obj_key      = l_bkpf-awkey.
  l_reversal-obj_key_r    l_bkpf-awkey.
  l_reversal-pstng_date   l_bkpf-budat.
  l_reversal-fis_period   l_bkpf-monat.
  l_reversal-comp_code    l_bkpf-bukrs.
*  l_reversal-ac_doc_no    = l_bkpf-belnr.
  l_reversal-reason_rev   '03'.
*   取得系统 LOGICAL SYSTEM
  CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
    IMPORTING
      own_logical_system l_reversal-obj_sys.
*   调用 BAPI 函数,冲销会计凭证
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
    EXPORTING
      reversal l_reversal
      bus_act  l_bkpf-glvor
    IMPORTING
      obj_key  l_obj_key
    TABLES
      return   gt_return.

  READ TABLE gt_return WITH KEY type 'E'.
  IF sy-subrc NE 0.
*     提交凭证过账
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait   'X'
      IMPORTING
        return i_return.
    IF i_return IS INITIAL.
      p_data-zmsg '会计凭证过账成功!会计凭证号:' && l_obj_key(10.

      PERFORM frm_ztfi020_lock.
      UPDATE ztfi020 SET zcxbs 'X' WHERE  belnr p_data-belnr
                                        AND bukrs p_data-bukrs
                                        AND gjahr p_data-gjahr
                                        AND monat p_data-monat.
      IF sy-subrc 0.
        COMMIT WORK.
        p_data-icon icon_led_green.
      ELSE.
        ROLLBACK WORK.
        p_data-icon icon_led_yellow.
        p_data-zmsg p_data-zmsg && '数据库ZTFI020(报废成本分摊表)更新失败,请核查!'.
      ENDIF.
      PERFORM frm_ztfi020_unlock.
    ELSE.
      p_data-icon icon_led_red.
      p_data-zmsg '过账失败,请用事务代码ST22查看详细信息'.
    ENDIF.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    p_data-icon icon_led_red.
    LOOP AT gt_return WHERE type 'A' OR type 'E'.
      p_data-zmsg p_data-zmsg && gt_return-message.
    ENDLOOP.
  ENDIF.
ENDFORM.
<think>好的,用户想了解SAP冲销相关的函数。首先,我需要回顾一下用户提供的引用内容。引用[1]提到FB08和F.80进行整个凭证冲销,而反记账用于部分冲销。引用[2]讨论的是BAPI_GOODSMVT_CANCEL用于物料凭证冲销,以及BAPI调用的参数类型。引用[3]则展示了在FB08中使用BAPI_TRANSACTION_ROLLBACK来回滚事务。 接下来,我需要确定用户的具体需求。用户提到“与SAP冲销相关的函数”,可能包括财务和物料管理模块的不同冲销方法。常见的函数有BAPI_ACC_DOCUMENT_REV_POST用于财务凭证冲销BAPI_GOODSMVT_CANCEL用于物料凭证冲销,还有标准事务码如FB08背后的函数可能涉及。 另外,用户可能需要了解这些函数的使用场景和参数。例如,在财务模块中,使用BAPI时需要指定公司代码、会计年度、凭证编号等。而在物料管理中,可能需要物料凭证号和年份。此外,异常处理也很重要,比如通过EXCEPTIONS参数捕获错误。 还需要注意用户提到的反记账功能,这可能与冲销不同,属于部分冲销的方法。因此,在回答中需要区分整个凭证冲销和部分冲销的不同实现方式。 最后,用户可能希望了解如何调用这些函数,比如在ABAP程序中如何使用CALL FUNCTION,以及如何处理返回值。例如,引用[3]中的代码示例展示了检查返回参数后决定是否回滚事务。 总结需要涵盖财务和物料模块的主要冲销函数,说明其用途、关键参数及调用注意事项,并推荐相关事务码。同时,生成的问题应引导用户进一步探索不同模块的冲销方法和实际应用中的技巧。</think>在SAP系统中实现冲销操作,主要涉及以下函数和实现方式: ### 一、财务凭证冲销相关函数 1. **BAPI_ACC_DOCUMENT_REV_POST** 用于冲销财务会计凭证的关键函数,支持反记账功能。核心参数包括: - `COMPANYCODE`(公司代码) - `FISCALYEAR`(会计年度) - `REVERSALREASON`(冲销原因代码) - `ACCOUNTINGDOCUMENT`(凭证编号) ```abap CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST' EXPORTING reversal_reason = '01' "冲销原因 companycode = '1000' fiscalyear = '2023' accountingdocument = '1900000001'. ``` 2. **FB08事务码底层函数** 标准冲销事务码FB08通过`FI_DOCUMENT_REVERSAL`函数实现,支持错误回滚机制[^3]: ```abap IF return-status = 'E'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' ENDIF. ``` ### 二、物料凭证冲销函数 1. **BAPI_GOODSMVT_CANCEL** 专门用于冲销MIGO事务创建的物料凭证(如收货/发货): - 需传入`MAT_DOCUMENT`(物料凭证号)和`MAT_DOCUMENTYEAR`(凭证年度) - 通过`GOODSMVT_HEADRET`结构返回新生成的冲销凭证号[^2] ### 三、特殊冲销场景 1. **反记账实现** 通过BAPI字段`ITEM_AMOUNT`设置负数金额时,需激活`REVERSE_IND`(反记账标识)[^1] 2. **采购订单冲销** 使用函数`BAPI_PO_CANCEL`,通过设置`PO_NUMBER`和`PO_ITEM`指定冲销行项目 ### 四、调用注意事项 1. 必须处理`RETURN`结构检查执行结果 2. 使用`BAPI_TRANSACTION_COMMIT`提交事务 3. 异常处理需捕获`ERROR_MESSAGE`等异常类型[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值