bapi_acc_document_rev_post
时间: 2023-04-28 11:00:14 浏览: 659
bapi_acc_document_rev_post是一个SAP系统中的BAPI函数,用于反转会计凭证。它可以将已经过账的会计凭证进行反转,使其变为未过账状态,以便进行修改或删除等操作。该函数可以通过SAP系统中的RFC接口进行调用,并且需要传入相关的参数来指定需要反转的会计凭证的凭证号、凭证行号等信息。
相关问题
sap BAPI_DOCUMENT_CHANGE更改会计凭证
<think>好的,我现在需要回答用户关于如何使用SAP的BAPI_DOCUMENT_CHANGE接口来修改会计凭证的问题。首先,我得先理解用户的需求。他们想要一个示例教程,说明如何调用这个BAPI来更改会计凭证。根据用户提供的引用资料,特别是引用[4]和[5],这些涉及到BAPI_ACC_DOCUMENT_POST的使用,但用户现在问的是BAPI_DOCUMENT_CHANGE,可能需要我查找相关资料或者结合现有引用进行分析。
首先,我需要确认是否存在BAPI_DOCUMENT_CHANGE这个BAPI。根据我的知识库,SAP中常用的修改会计凭证的BAPI可能包括BAPI_ACC_DOCUMENT_REV_POST用于冲销,而修改可能需要其他方法。不过用户提到的BAPI_DOCUMENT_CHANGE可能是指某个特定的BAPI,或者可能是一个笔误,比如BAPI_ACC_DOCUMENT_CHECK或BAPI_ACC_DOCUMENT_POST的修改版本。或者,可能用户指的是类似BAPI_SALESORDER_CHANGE(引用[1]和[2])这样的结构,用于销售订单的修改,但会计凭证的修改可能需要不同的BAPI。
查看用户提供的引用,引用[4]中提到使用BAPI_ACC_DOCUMENT_POST来生成会计凭证,而冲销可能需要调整金额字段。引用[5]则讨论了如何生成预制凭证。但是用户现在的问题是关于修改已存在的会计凭证,这可能需要不同的方法,因为通常会计凭证一旦过账后不允许直接修改,而是通过冲销并重新过账。不过可能存在某些字段允许通过BAPI进行修改。
我需要先确定正确的BAPI名称。在SAP中,修改会计凭证通常使用BAPI_ACC_DOCUMENT_REV_POST进行冲销,或者可能需要使用其他BAPI。可能用户提到的BAPI_DOCUMENT_CHANGE实际上是BAPI_ACC_DOCUMENT_CHECK或另一个BAPI。假设用户确实是指修改凭证,可能需要检查是否存在这样的BAPI,或者是否必须通过其他方式实现。
假设存在BAPI_DOCUMENT_CHANGE(可能用户指的是BAPI_ACC_DOCUMENT_CHANGE,但需要验证),或者可能需要通过组合不同的BAPI来实现。例如,先读取凭证数据,修改必要字段,然后再次保存。但通常会计凭证的修改权限有限,可能需要冲销后重新创建。
根据引用[4],BAPI_ACC_DOCUMENT_POST用于过账凭证,而冲销可能需要调整金额等字段。如果用户希望修改已存在的凭证,可能需要冲销原凭证并创建新凭证。但用户明确询问的是更改现有凭证,所以可能需要确认是否有BAPI支持这一点。
可能用户混淆了BAPI的名称,例如销售订单的修改使用BAPI_SALESORDER_CHANGE(引用[1]和[2]),而会计凭证的修改可能需要不同的BAPI。或者,可能会计凭证的修改需要通过增强或特定的配置才能实现。
另外,用户提供的引用中没有直接提到BAPI_DOCUMENT_CHANGE,但引用[3]提到BAPI_ACC_DOCUMENT_POST在过账时缺少某些字段,引用[4]和[5]讨论了使用该BAPI时的注意事项。因此,可能用户需要了解如何通过现有的BAPI来修改凭证,或者可能需要使用其他方法。
在这种情况下,正确的步骤可能是:
1. 确认会计凭证是否允许修改,通常冲销更常见。
2. 如果允许修改,查找正确的BAPI,例如BAPI_ACC_DOCUMENT_REV_POST用于冲销,或者是否有其他BAPI允许修改。
3. 如果必须修改,可能需要使用BAPI_ACC_DOCUMENT_POST重新过账,并调整参数。
4. 或者,使用BAPI_ACC_DOCUMENT_CHECK进行数据检查,再结合其他方法。
但根据我的知识,SAP中的会计凭证一旦过账后通常不能直接修改,只能冲销。因此,正确的方法可能是冲销原凭证,然后创建新凭证。这可能涉及调用冲销BAPI,再调用POST创建新凭证。
然而,用户的问题是明确关于如何通过BAPI_DOCUMENT_CHANGE来修改,所以需要明确这个BAPI是否存在。假设用户可能有误,正确的方法应该是冲销并重新过账,或者是否有其他方式。
或者,可能用户指的是修改预制凭证(尚未过账的凭证),这时候可以使用BAPI_ACC_DOCUMENT_POST的增强来修改预制凭证的状态(如引用[5]所示),但修改凭证内容可能需要其他参数。
综上所述,可能的回答步骤:
- 说明会计凭证修改的常规方法(冲销并重新过账)
- 提供使用BAPI_ACC_DOCUMENT_REV_POST冲销凭证的示例
- 再使用BAPI_ACC_DOCUMENT_POST创建新凭证
- 或者,如果确实存在修改的BAPI,提供示例代码
但根据用户提供的引用和常规SAP知识,修改已过账会计凭证的字段通常不可行,需通过冲销处理。因此,回答应强调冲销和重新过账的流程,并可能提供代码示例。
此外,用户可能需要示例代码,因此需要构造一个示例,展示如何冲销凭证并创建新的。或者,如果用户确实需要修改预制凭证,可以展示如何通过BAPI_ACC_DOCUMENT_POST和状态字段来修改预制凭证。
可能需要参考引用[5],其中提到在增强中设置c_acchd-status_new为2来生成预制凭证,因此修改预制凭证可能需要再次调用BAPI并更新字段。
因此,回答的结构可能是:
1. 说明会计凭证修改的限制,通常需要冲销
2. 提供冲销凭证的BAPI示例(如BAPI_ACC_DOCUMENT_REV_POST)
3. 创建新凭证的示例
4. 如果是修改预制凭证,说明如何通过BAPI_ACC_DOCUMENT_POST更新状态或字段
根据用户问题中的引用,特别是引用[4]和[5],可能用户希望了解如何修改预制凭证,或者如何调整金额等字段。
现在需要整合这些信息,形成一个清晰的步骤说明,并提供代码示例。例如,冲销凭证的步骤,然后创建新凭证的代码。或者,修改预制凭证的代码示例。
可能需要查阅SAP官方文档或相关资料确认正确的BAPI和参数。但根据现有引用和知识,可以构造一个合理的回答。</think>以下是关于如何通过SAP BAPI接口修改会计凭证的步骤说明及示例:
### 步骤说明
1. **会计凭证修改限制**
SAP标准会计凭证(已过账)**不允许直接修改字段**,通常需要通过**冲销+重新过账**实现[^4]。若需调整字段,需按以下流程操作:
- 使用`BAPI_ACC_DOCUMENT_REV_POST`冲销原凭证
- 通过`BAPI_ACC_DOCUMENT_POST`重新过账正确凭证
2. **修改预制凭证(未过账)**
若凭证处于预制状态(未正式过账),可通过以下步骤修改:
- 使用`BAPI_ACC_DOCUMENT_POST`重新提交修改后的数据
- 通过增强设置凭证状态为预制(`status_new = 2`)[^5]
---
### 示例代码
#### 1. 冲销原凭证
```abap
DATA: lv_reversal_reason TYPE BAPIACREV-REASON_REV.
DATA: lt_return TYPE TABLE OF BAPIRET2.
lv_reversal_reason = '01'. "冲销原因码
CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
EXPORTING
reversal_reason = lv_reversal_reason
businessobject = 'RFBU'
objectid = '凭证编号'
fiscalyear = '会计年度'
TABLES
return = lt_return.
IF lt_return[] IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
```
#### 2. 重新过账新凭证
```abap
DATA: lt_document TYPE TABLE OF BAPIACAP09,
lt_return TYPE TABLE OF BAPIRET2.
APPEND VALUE #(
obj_type = 'BKPFF'
obj_key = '凭证号'
obj_sys = '系统ID'
) TO lt_document.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
TABLES
documentheader = lt_document
return = lt_return.
IF lt_return[] IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
```
---
### 关键注意事项
1. **金额平衡**:所有行项目金额总和必须为$0$,借贷方需严格匹配[^4]。
2. **字段增强**:若需修改标准BAPI未提供的字段,需通过增强实现(如创建结构扩展)[^4]。
3. **状态控制**:预制凭证通过`c_acchd-status_new = 2`设置。
帮忙使用ABAP分析以下代码,写的是什么功能*&---------------------------------------------------------------------* *& Report ZMMU099A *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZMMC099D MESSAGE-ID ZMM. *&---------------------------------------------------------------------* * 数据定义部分 * *&---------------------------------------------------------------------* TYPE-POOLS: SLIS,VRM. TABLES: SSCRFIELDS,PROJ,VBAK. DATA: FUNCTXT TYPE SMP_DYNTXT. "批量冲销 DATA:BEGIN OF GS_EXCEL, BUDAT TYPE MKPF-BUDAT, " 过账日期 BLDAT TYPE MKPF-BLDAT, " 凭证日期 MBLNR TYPE MSEG-MBLNR, " 物料凭证编号 ZEILE TYPE MSEG-ZEILE, " 物料凭证编号 END OF GS_EXCEL. DATA: GT_EXCEL LIKE TABLE OF GS_EXCEL. TYPES:BEGIN OF TY_OUT. INCLUDE STRUCTURE GS_EXCEL. TYPES: MBLNRX TYPE MSEG-MBLNR, SEL(1), ICON TYPE ICON_D, MSG(200). TYPES:END OF TY_OUT. DATA: GT_OUT TYPE TABLE OF TY_OUT, GS_OUT TYPE TY_OUT. DATA: GS_FIELDCAT TYPE LVC_S_FCAT, "字段工作区 GT_FIELDCAT TYPE LVC_T_FCAT. DATA: GS_LIST TYPE LVC_S_DROP. DATA: GT_LIST TYPE LVC_T_DROP. DATA: GT_LISTHEADER TYPE SLIS_T_LISTHEADER, "ALV 表头 GS_SETTING TYPE LVC_S_GLAY, GS_LAYOUT TYPE LVC_S_LAYO. "ALV布局工作区 DATA: GS_SORT TYPE LVC_S_SORT, GT_SORT TYPE LVC_T_SORT. DATA: GS_STBL TYPE LVC_S_STBL. DATA: GCL_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA: GT_FILTERED TYPE LVC_T_FIDX . "全选/取消全选 DATA: GS_EVENTS TYPE SLIS_ALV_EVENT, GT_EVENTS TYPE SLIS_T_EVENT. DATA: GS_FIELDINFO TYPE SLIS_FIELDINFO2, GT_FIELDINFO TYPE TABLE OF SLIS_FIELDINFO2. DATA: GV_REPID LIKE SY-REPID. "程序名 DATA: GV_TITLE TYPE LVC_TITLE, "ALV标题 GV_COUNT LIKE SY-INDEX, "记录条数 GV_CNTTX TYPE CHAR10. "记录条数-字符型 DATA:GV_FLAG(1). DATA: GV_FNAME LIKE RLGRAP-FILENAME. DATA MYREF TYPE REF TO CX_SY_ARITHMETIC_ERROR. DATA ERR_TEXT TYPE STRING. DATA RESULT TYPE I. *------------
<think>好的,我需要分析用户提供的ABAP代码的功能,特别是关于批量冲销的部分。首先,用户提到的引用内容中提到了BAdI‘ACC_DOCUMENT’的增强,这可能与财务凭证处理相关。另外,用户提到的程序优化原则和增强开发文档也可能涉及到代码结构和性能方面的考虑。
首先,我会检查代码中是否有使用BAPI或BAdI,例如‘BAPI_ACC_DOCUMENT_POST’或者‘ACC_DOCUMENT’。这些通常用于财务凭证的过账和冲销。接下来,我需要查看是否存在循环处理多个凭证的部分,这可能涉及批量操作。例如,是否有LOOP语句遍历内部表,并调用冲销函数模块。
然后,分析冲销的具体实现。标准冲销可能使用‘BAPI_ACC_DOCUMENT_REV_POST’或其他类似函数。如果在冲销过程中需要处理增强字段,可能会在BAdI‘ACC_DOCUMENT’中进行处理,比如在方法IF_EX_ACC_DOCUMENT~CHANGE中修改凭证数据。
另外,用户提到内存导入(IMPORT ... FROM MEMORY),这可能用于传递参数或缓存数据,优化性能。需要确认代码是否利用内存来暂存冲销所需的凭证编号或其他关键信息,以减少数据库访问次数,提升批量处理的效率。
还要注意代码中的异常处理和日志记录,确保在批量冲销时能够捕获错误并记录结果,保证数据的一致性。例如,使用LOOP内的异常处理块,或者在调用BAPI后检查RETURN结构中的错误消息。
最后,结合用户提供的引用内容,代码可能通过增强点来扩展标准冲销逻辑,比如添加自定义字段或校验规则。需要确认代码中是否有调用CL_EXITHANDLER=>GET_INSTANCE或其他增强相关的语法。
总结步骤:1. 确定使用的BAPI/BAdI;2. 分析循环结构和批量处理逻辑;3. 检查冲销函数和增强点;4. 查看内存使用和性能优化;5. 确认异常处理和日志机制。</think>以下是对ABAP代码功能的逐步分析(重点针对批量冲销):
1. **核心功能定位**
根据引用内容[^1]和[^3],代码可能通过`BAPI_ACC_DOCUMENT_POST`或类似BAPI实现财务凭证冲销,并利用增强BAdI`ACC_DOCUMENT`处理扩展字段。批量冲销通常表现为循环调用冲销函数模块。
2. **批量处理结构**
代码中应包含类似结构:
```abap
LOOP AT it_reversal_list ASSIGNING <fs_doc>.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
EXPORTING
reversal_date = <fs_doc>-date
IMPORTING
return = ls_return.
IF ls_return-type = 'E'.
ROLLBACK WORK.
ELSE.
COMMIT WORK.
ENDIF.
ENDLOOP.
```
这种结构支持批量处理多个凭证冲销请求[^1][^3]。
3. **增强实现细节**
在BAdI`ACC_DOCUMENT`的方法`CHANGE`中,可能包含以下增强逻辑:
```abap
METHOD if_ex_acc_document~change.
IF cs_document-header-doc_type = 'RV'. " 冲销凭证类型
cs_document-extension2 = '自定义现金流量码'. " 扩展字段赋值
ENDIF.
ENDMETHOD.
```
用于处理标准冲销流程无法覆盖的定制字段。
4. **性能优化手段**
根据引用[^2],代码可能采用:
- `IMPORT/EXPORT TO MEMORY`缓存凭证清单
- 批量提交代替单条提交(通过数组操作`BAPI_ACC_DOCUMENT_REV_POST`的`DOCUMENT`参数)
- 使用`COMMIT WORK AND WAIT`控制数据库负载
5. **异常处理机制**
典型代码包含:
```abap
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_commit_return.
IF ls_commit_return-type CA 'AEX'.
" 记录错误日志
ENDIF.
```
通过BAPI返回值结构确保事务完整性[^3]。
阅读全文
相关推荐







