BAPI_ACC_GL_POSTING_POST生成财务预制凭证

本文介绍如何通过增强SAP BAPI功能来生成预制凭证。主要步骤包括设置凭证抬头状态值并填充凭证行项目的特定字段。此外,还提供了一个测试程序示例。

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

利用此BAPI生成预制凭证,首先要在如下用户出口做一个简单增强:

ACBAPI01 会计核算: 对 BAPI 界面的客户增强功能

对应的出口函数是:EXIT_SAPLACC4_001

相应的代码如下,核心内容是要让凭证抬头中的status_new值为2,即可生成预制凭证:

 READ TABLE extension WITH KEY field1 = 'BAPI-PARK'.
IF sy-subrc = 0 .
  MOVE 2 TO t_acchd-status_new. "to mark this is Park Document
ENDIF.

*此部分内容为BAPI标准参数中没有的字段,四个Field字段都是char250,如果字段太多,

可利用处理字符串拆分的方法进行

LOOP AT extension.
  READ TABLE t_accit WITH KEY posnr = extension-field1.
  IF sy-subrc = 0.
    t_accit-bschl = extension-field2.   "记帐码
    t_accit-rstgr = extension-field3.   "原因代码
    t_accit-umskz = extension-field4.   "特殊总帐标识

    MODIFY t_accit INDEX sy-tabix.
  ENDIF.

*在自己的程序或接口代码中调用BAPI,测试程序如下:

 *&---------------------------------------------------------------------*
*& Report  ZT_TEST_PARK_DOCUMENT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zt_test_park_document1 NO STANDARD PAGE HEADING.

TABLES: bkpf,
        bseg,
        bsec,
        bset,
        bsez.

DATA: header LIKE bapiache08,
      accountgl LIKE STANDARD TABLE OF      bapiacgl08 WITH HEADER LINE,
      currencyamount LIKE STANDARD TABLE OF bapiaccr08 WITH HEADER LINE,
      extension1 LIKE STANDARD TABLE OF     bapiextc   WITH HEADER LINE,
      return     LIKE STANDARD TABLE OF     bapiret2   WITH HEADER LINE.

DATA: loc_cnt TYPE posnr_acc,
      loc_amt TYPE bapiwrbtr.

DATA: obj_key  LIKE bapiache02-obj_key,
      obj_type LIKE bapiache02-obj_type,
      obj_sys  LIKE bapiache02-obj_sys.

START-OF-SELECTION.

  header-username   = sy-uname.
  header-comp_code  = '1200'.
  header-fisc_year  = sy-datum+0(4).
  header-doc_date   = sy-datum.
  header-pstng_date = sy-datum.
  header-fis_period = sy-datum+4(2).
  header-doc_type   = 'SA'.

  accountgl-itemno_acc = '1'.
  accountgl-gl_account = '6602070000 ' .
  accountgl-costcenter = '1200AA01'.
  accountgl-item_text  = 'Test Bapi SGTXT'.
  accountgl-alloc_nmbr = 'Test Bapi ZUONR'.
  APPEND accountgl.
  CLEAR accountgl.

  extension1-field1 = '1'."Item No
  extension1-field2 = '40'."记帐码

  APPEND extension1.

  loc_cnt = 1.
  loc_cnt  = loc_cnt + 1.
  accountgl-itemno_acc = loc_cnt.
  accountgl-gl_account = '1001010000' .
*  accountgl-comp_code  = '1200'.
*  accountgl-pstng_date = sy-datum.
*  accountgl-doc_type   = 'SA'.
*  accountgl-fisc_year  = sy-datum+0(4).
*  accountgl-fis_period = sy-datum+4(2).
*  accountgl-costcenter = ‘13100’.
  accountgl-item_text  = 'Test Bapi SGTXT'.
  accountgl-alloc_nmbr = 'Test Bapi ZUONR'.
  APPEND accountgl.
  CLEAR accountgl.

  extension1-field1 = '2'.  "Item No
  extension1-field2 = '50'. "记帐码
  extension1-field3 = '999'."原因代码

  APPEND extension1.

  loc_amt = 1111.

  currencyamount-itemno_acc = '1'.
  currencyamount-currency  = 'CNY'.
  currencyamount-amt_doccur = loc_amt. "( For  Debit / ‘S’)
  APPEND currencyamount.

  CLEAR currencyamount.

  currencyamount-itemno_acc = '2'.
  currencyamount-currency  = 'CNY'.
  currencyamount-amt_doccur =  ( -1 ) * ( loc_amt ). " ( For credit /‘H’)
  APPEND currencyamount.

  CLEAR currencyamount.

  extension1-field1 =  'BAPI-PARK'.
  APPEND extension1.

  CALL FUNCTION 'BAPI_ACC_GL_POSTING_POST'
    EXPORTING
      documentheader = header
    IMPORTING
      obj_type       = obj_type
      obj_key        = obj_key
      obj_sys        = obj_sys
    TABLES
      accountgl      = accountgl
      currencyamount = currencyamount
      return         = return
      extension1     = extension1.

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


原文:http://hi.baidu.com/tsingwa/item/4142800c54893a10addc7094

<think>我们正在解决SAP BAPI_ACC_DOCUMENT_POST报错“不一致的数量”问题。根据之前的分析,主要原因包括物料凭证与会计凭证数量不匹配、移动类型配置缺失、增强程序干扰和单位换算错误。解决方案包括检查基础配置、核对数量字段、验证单位换算、排查增强干扰和使用BAPI调试工具。 现在,用户提供了新的参考信息(引用[1]),其中提到在资产过账时遇到问题,通过调试和增强解决了凭证类型未定义的问题。但用户当前的问题仍然是“不一致的数量”,因此我们需要专注于数量不一致的问题,而不是凭证类型。 结合引用[1]中提到的增强接口和调试经验,我们可以推断:在解决BAPI_ACC_DOCUMENT_POST问题时,增强程序(BADI)可能是关键点。特别是当标准逻辑被增强修改时,可能会导致数量不一致。 因此,我们应重点检查是否有增强程序修改了数量字段(如MSEG-BPMNG或ACCOUNTGL-QUANTITY)。此外,引用[1]中提到的调试方法(如使用BAPI_ACC_DOCUMENT_CHECK先检查)也是重要步骤。 以下是对原有解决方案的补充和调整: ### 补充解决方案: #### 步骤6:检查资产相关过账的特殊性(如果涉及资产) 如果报错发生在资产过账(如资产购置、折旧等)时,需注意: - 资产过账通常不涉及物料数量,但如果业务涉及物料消耗与资产相关(如用材料建造资产),则可能触发数量校验。 - 确保资产交易类型(如业务类型)在会计凭证抬头中正确传递(参考引用[1]中提到的`TACCOUNTGL-CS_TRANS_T`赋值问题)。但数量问题更可能出现在行项目。 #### 步骤7:通过增强传递正确的数量(参考引用[1]的经验) 引用[1]中提到在增强里解决了问题。因此,我们可以考虑在增强中显式设置数量: 1. 使用`EXTENSIONIN`参数传递自定义字段(如果标准字段无法满足)。 2. 在增强`AC_DOCUMENT`(会计凭证增强)或`MB_DOCUMENT_BADI`(物料凭证增强)中,确保数量同步。 示例代码(在物料凭证增强中同步数量到会计凭证): ```abap METHOD if_ex_mb_document_badi~document_before_save. DATA: ls_extension TYPE bapiextc, ls_extension2 TYPE bapiextc2. " 假设需要传递的数量字段为自定义字段ZQUANTITY LOOP AT c_extension2 INTO ls_extension2. IF ls_extension2-structure = 'BAPI_EXTENSION2'. " 从物料凭证中获取基本数量(MSEG-BPMNG) ls_extension2-valuepart1 = 'ZQUANTITY'. " 自定义字段名 ls_extension2-valuepart2 = imseg-bpmng. " 数量值 MODIFY c_extension2 FROM ls_extension2. ENDIF. ENDLOOP. ENDMETHOD. ``` 然后在调用BAPI时,将这个扩展字段的值赋给`ACCOUNTGL-QUANTITY`(通过映射): ```abap DATA: lt_extension2 TYPE TABLE OF bapiextc2, ls_extension2 TYPE bapiextc2. " 准备会计凭证行项目 ls_accountgl-quantity = 0. " 先置0,后面通过扩展赋值 " 构建扩展字段(将自定义字段ZQUANTITY的值映射到QUANTITY) ls_extension2-structure = 'BAPI_EXTENSION2'. ls_extension2-valuepart1 = 'QUANTITY_FIELD_MAPPING'. " 映射标识 ls_extension2-valuepart2 = 'ZQUANTITY_TO_QUANTITY'. " 映射逻辑(在增强中处理) APPEND ls_extension2 TO lt_extension2. " 调用BAPI CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' EXPORTING documentheader = ls_docheader TABLES accountgl = lt_accountgl extension2 = lt_extension2 " 传递扩展字段 return = lt_return. ``` 注意:上述代码仅为示例,实际需要根据增强实现的具体逻辑来编写。 #### 步骤8:参考SAP Note - 检查SAP Note 2092366(引用[1]中提到的)关于S4中预制凭证的设置,但该Note主要针对凭证状态,与数量问题可能无关。 - 搜索与数量不一致相关的Note,例如:使用关键字“BAPI_ACC_DOCUMENT_POST inconsistent quantity”在SAP支持门户查找。 ### 最终建议 如果以上步骤仍无法解决,建议在测试环境中使用调试模式(/H)跟踪以下函数: - `MB_POST_BATCH`(物料凭证过账) - `POSTING_INTERFACE_DOCUMENT`(会计凭证过账核心函数) 重点关注数量字段(如BPMNG, QUANTITY)的传递路径,以及是否有增强程序修改了这些字段。 ### 总结 “不一致的数量”错误通常源于物料凭证和会计凭证之间的数量不一致。必须确保: 1. 物料凭证的基本数量(MSEG-BPMNG)等于会计凭证行项目的数量(ACCOUNTGL-QUANTITY)。 2. 单位换算正确,且增强程序没有破坏这种一致性。 通过仔细检查配置、数量传递、单位换算和增强程序,通常可以定位并解决问题。 --- §§相关问题§§ 1. 如何调试SAP BAPI执行时的隐式增强逻辑? 2. 物料移动单位与财务单位不一致时,如何避免会计凭证报错? 3. `BAPI_ACC_DOCUMENT_POST`报错“凭证类型未定义”应如何解决? 4. SAP中如何通过批次特征自动更新会计凭证字段? [^1]: SAP Note 2092366 - S4H: Document status for parked documents in document header</think>### SAP `BAPI_ACC_DOCUMENT_POST` 报错"不一致的数量"原因与解决方案 #### 核心问题根源 当物料移动(如MIGO发货)触发自动会计凭证时,系统强制要求: - **物料凭证数量** (`MSEG-BPMNG`) - **会计凭证数量** (`ACCOUNTGL-QUANTITY`) 必须**完全一致**。任何差异会导致报错"数量不一致"。 --- ### 关键原因分析 1. **单位换算错误** - 物料主数据中基本单位(如EA)与移动单位(如KG)的转换率未维护或错误 - 例:移动单位KG→基本单位EA的转换率 `UMREN/UMREZ` 配置错误 2. **增强程序干扰** - 自定义BADI(如 `MB_DOCUMENT_BADI`)修改了 `MSEG-BPMNG` 但未同步更新 `ACCOUNTGL-QUANTITY` - 会计凭证增强 `AC_DOCUMENT` 覆盖了数量值 3. **配置缺失** - 移动类型(如261)在 `OBYC` 中未配置自动过账科目 ```abap T-CODE: OBYC //检查移动类型科目配置 T-CODE: OMJJ //验证移动类型激活状态 ``` 4. **批次/分割评估场景** - 启用批次管理时,批次特征未传递到会计凭证 - 分割评估导致数量被拆分但未正确传递 --- ### 分步解决方案 #### 步骤1:验证单位换算 1. 检查物料主数据单位: ```abap MM03 → 查看基本单位 & 订单单位 ``` 2. 验证单位转换率: ```abap T-CODE: CUNI //检查单位换算关系 ``` - 确保 `UMREN` (分子) 和 `UMREZ` (分母) 正确 - 例:1 KG = 10 EA 需配置 `UMREN=10, UMREZ=1` #### 步骤2:检查增强程序 1. 临时停用关键BADI: - `MB_DOCUMENT_BADI` - `AC_DOCUMENT` - `MB_CFC_BADI` 2. 在增强点添加同步逻辑: ```abap METHOD if_ex_mb_document_badi~document_before_save. " 同步物料凭证数量到会计凭证 ls_accountgl-quantity = imseg-bpmng. ENDMETHOD. ``` #### 步骤3:核对数量字段 通过调试检查数值传递: 1. 获取物料凭证数量: ```abap MSEG-BPMNG //基本单位数量 ``` 2. 确保BAPI参数一致: ```abap ACCOUNTGL-QUANTITY = MSEG-BPMNG ``` - 差异超过0.001即报错 #### 步骤4:特殊场景处理 - **批次管理**:传递批次特征到会计凭证 ```abap ACCOUNTGL-BATCH = MSEG-CHARG ``` - **分割评估**:按评估类型拆分数量 ```abap LOOP AT lt_split ASSIGNING FIELD-SYMBOL(<fs>). ACCOUNTGL-QUANTITY = <fs>-split_qty ENDLOOP. ``` #### 步骤5:使用BAPI调试工具 ```abap DATA: lt_return TYPE TABLE OF bapiret2. CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK' EXPORTING documentheader = ls_header TABLES accountgl = lt_gl return = lt_return. " 捕获错误明细 LOOP AT lt_return ASSIGNING FIELD-SYMBOL(<err>) WHERE id = 'F5' OR id = 'F8'. " 数量相关错误 MESSAGE <err>-message TYPE 'E'. ENDLOOP. ``` --- ### 关键注意事项 1. **扩展字段使用规范** 自定义数量字段必须通过 `EXTENSIONIN` 传递: ```abap EXTENSIONIN-STRUCTURE = 'BAPI_EXTENSION2' EXTENSIONIN-VALUEPART1 = 'ZQUANTITY' //自定义字段 EXTENSIONIN-VALUEPART2 = '100.000' //数量值 ``` 2. **调试建议** - 在 `POSTING_INTERFACE_DOCUMENT` 设置断点 - 检查结构 `ACGL_WITH_REF` 的 `QUANTITY` 字段 3. **参考配置** - S4HANA预制凭证状态需在 `DOCHEADER-DOC_STATUS` 设置[^1] - 资产过账需传递业务类型到 `TACCOUNTGL-CS_TRANS_T`[^1] > **案例**:某项目因增强程序将 `MSEG-BPMNG` 乘以汇率,但未更新 `ACCOUNTGL-QUANTITY`,导致差异10倍。通过在 `MB_MIGO_BADI` 添加同步逻辑解决。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值