SAP ABAP创建凭证标准BAPI没有抬头的参考码1字段解决办法

文章介绍了在通过BAPI_ACC_DOCUMENT_POST创建凭证时,如何改用BDC方式来为抬头的参考码1赋值。具体实现包括检查参考码条件,调用FB02事务码,以及一系列的BDC字段操作,最终成功维护凭证。

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


需求

为凭证抬头参考码1赋值
在用标准BAPI:BAPI_ACC_DOCUMENT_POST 创建凭证时无法通过拓展字段为抬头的参考码1赋值
现更换为BDC实现(凭证创建成功后使用BDC方式 调用FB02进行维护)
在这里插入图片描述


实现代码


		  DATA:BDCDATA1 LIKE BDCDATA    OCCURS 0 WITH HEADER LINE.

*          新增参考码1处理
          IF STRLEN( S_HEADER-XREF1_HD ) GE 4.

            IF S_HEADER-XREF1_HD+2(2) EQ 'WB'.   "只有第34位为WB才维护

              DATA LT_MSG1 TYPE STANDARD TABLE OF BDCMSGCOLL.
*                GS_EXTENSION_HEADER-XREF1_HD = S_HEADER-XREF1_HD.

              REFRESH  BDCDATA1.
              PERFORM BDC_DYNPR  USING 'SAPMF05L' '0100'.
              PERFORM BDC_FIELD  USING 'RF05L-BELNR' OBJ_KEY(10).
              PERFORM BDC_FIELD  USING 'RF05L-BUKRS' S_HEADER-BUKRS.
              PERFORM BDC_FIELD  USING 'RF05L-GJAHR' S_HEADER-BUDAT+0(4).
              PERFORM BDC_FIELD  USING 'BDC_OKCODE' '/00'.

              PERFORM BDC_DYNPR USING 'SAPMF05L' '0700'.
              PERFORM BDC_FIELD USING 'BDC_OKCODE' '=VK'.

              PERFORM BDC_DYNPR USING 'SAPMF05L' '1710'.
              PERFORM BDC_FIELD USING 'BDC_CURSOR' 'BKPF-XREF1_HD'.
              PERFORM BDC_FIELD USING 'BKPF-XREF1_HD' S_HEADER-XREF1_HD.
              PERFORM BDC_FIELD USING 'BDC_OKCODE' '=ENTR'.

              PERFORM BDC_DYNPR USING 'SAPMF05L' '0700'.
              PERFORM BDC_FIELD USING 'BDC_OKCODE' '=AE'.

              CLEAR:LT_MSG1.
              CALL TRANSACTION 'FB02' USING BDCDATA1 MODE 'N'
                    UPDATE 'S'
                    MESSAGES INTO LT_MSG1.

**              凭证过账接口返回参数:RESULT请新增会计期间,该字段原来是返回凭证编号+公司代码+会计年度,现在还需要返回会计期间。
*              RESULT = OBJ_KEY(10) && S_HEADER-BUKRS && S_HEADER-BUDAT(4) && S_HEADER-BUDAT+4(2).

            ENDIF.

          ENDIF.
          
		  FORM BDC_DYNPR USING PROGRAM DYNPRO.
		    CLEAR BDCDATA1.
		    BDCDATA1-PROGRAM  = PROGRAM.
		    BDCDATA1-DYNPRO   = DYNPRO.
		    BDCDATA1-DYNBEGIN = 'X'.
		    APPEND BDCDATA1.
		  ENDFORM.                    "bdc_dynpr
		
		  FORM BDC_FIELD USING FNAM FVAL.
		*  IF fval IS NOT INITIAL.
		    CLEAR BDCDATA1.
		    BDCDATA1-FNAM = FNAM.
		    BDCDATA1-FVAL = FVAL.
		    APPEND BDCDATA1.
		*  ENDIF.
		*  CLEAR  fval.
		  ENDFORM.                    "bdc_field

总结

以上

<think>好的,我现在需要回答用户关于如何使用SAPBAPI_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`设置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ggreekn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值