SAP_常用BAPI_创建修改物料主数据(BAPI_MATERIAL_SAVEDATA)

本文详细介绍了如何使用 BAPI(Material Savedata) 函数进行物料数据的批量处理,包括判断是否需要扩展物料记录、处理物料描述、单位、国际编号等关键信息,并通过流程控制确保数据的一致性和完整性。

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



BAPI_MATERIAL_SAVEDATA

  LOOP AT pt_out.
    CLEARls_headdata,ls_return.
    REFRESHlt_extensionin,lt_extensioninx.

    "---判断是否需要扩展修改
    READ TABLE gt_mard WITH KEY matnr pt_out-matnr
                                werks pt_out-werks
                                lgort pt_out-lgort
                                BINARY SEARCH.
    IF sy-subrc EQ AND gt_mard-lgort1 EQ pt_out-lgort1 AND gt_mard-lgort2 EQ pt_out-lgort2.
      l_proc_n_lines l_proc_n_lines + 1.   "无需处理
      pt_out-bz '无需扩展'.
      MODIFY pt_out TRANSPORTING bz.
      CONTINUE.
    ENDIF.

    ls_headdata-material pt_out-matnr.
    ls_headdata-storage_view  'X'.

    ls_bapi_te_mard-plant pt_out-werks.
    ls_bapi_te_mard-stge_loc pt_out-lgort.
    ls_bapi_te_mard-lgort1 pt_out-lgort1.
    ls_bapi_te_mard-lgort2 pt_out-lgort2.

    ls_bapi_te_mardx-plant pt_out-werks.
    ls_bapi_te_mardx-stge_loc pt_out-lgort.
    ls_bapi_te_mardx-lgort1 'X'.
    ls_bapi_te_mardx-lgort2 'X'.

    lt_extensionin-structure 'BAPI_TE_MARD'.
    lt_extensionin-valuepart1 ls_bapi_te_mard.
    APPEND lt_extensionin.
    CLEAR lt_extensionin.

    lt_extensioninx-structure 'BAPI_TE_MARDX'.
    lt_extensioninx-valuepart1 ls_bapi_te_mardx.
    APPEND lt_extensioninx.
    CLEAR lt_extensioninx.

    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        headdata             ls_headdata
*       CLIENTDATA           =
*       CLIENTDATAX          =
*       PLANTDATA            =
*       PLANTDATAX           =
*       FORECASTPARAMETERS   =
*       FORECASTPARAMETERSX  =
*       PLANNINGDATA         =
*       PLANNINGDATAX        =
*       storagelocationdata  =
*       storagelocationdatax =
*       VALUATIONDATA        =
*       VALUATIONDATAX       =
*       WAREHOUSENUMBERDATA  =
*       WAREHOUSENUMBERDATAX =
*       SALESDATA            =
*       SALESDATAX           =
*       STORAGETYPEDATA      =
*       STORAGETYPEDATAX     =
*       FLAG_ONLINE          = ''
*       FLAG_CAD_CALL        = ' '
*       NO_DEQUEUE           = ''
*       NO_ROLLBACK_WORK     = ''
      IMPORTING
        return               ls_return
      TABLES
*       MATERIALDESCRIPTION  =
*       UNITSOFMEASURE       =
*       UNITSOFMEASUREX      =
*       INTERNATIONALARTNOS  =
*       MATERIALLONGTEXT     =
*       TAXCLASSIFICATIONS   =
*       RETURNMESSAGES       =
*       PRTDATA              =
*       PRTDATAX             =
        extensionin          lt_extensionin
        extensioninx         lt_extensioninx.
    IF ls_return-type CA 'EA'.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CONCATENATE ls_return-message ls_return-message_v1
        ls_return-message_v2 ls_return-message_v3
        ls_return-message_v4 INTO pt_out-bz.
      l_proc_f_lines l_proc_f_lines + 1.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait c_strx.
      pt_out-bz '扩展成功'.
      l_proc_s_lines l_proc_s_lines + 1.
    ENDIF.
    "---已处理标识
    gt_out-flag '2'.  "导入数据已处理
    MODIFY pt_out TRANSPORTING bz flag.
  ENDLOOP.

<think>好的,我现在需要解决用户的问题:在使用SAPBAPI_MATERIAL_GETINTNUMBER获取内部编号后,如果后续使用BAPI_MATERIAL_SAVEDATA创建物料失败,是否会导致占号的情况。我需要一步步分析这个问题,确保回答准确且符合用户需求。 首先,我得回忆一下这两个BAPI的作用。BAPI_MATERIAL_GETINTNUMBER是用来预分配内部物料号的,也就是在正式创建物料之前先获取一个号码。而BAPI_MATERIAL_SAVEDATA则是实际创建修改物料主数据的主要函数模块。用户担心的是,如果在获取内部号后,创建失败,这个号码会不会被占用,导致后续无法使用或出现间隙号。 接下来,我需要确认这两个BAPI的工作流程。通常,BAPI_MATERIAL_GETINTNUMBER会生成一个内部号码,并将其保留在系统中。但此时物料主数据并未创建,只是号码被预留了。这时候,如果紧接着调用BAPI_MATERIAL_SAVEDATA创建物料,但失败的话,这个预留的号码会如何处理? 根据SAP的标准逻辑,号码分配通常是在保存时才会最终确定。但BAPI_MATERIAL_GETINTNUMBER的设计可能不同。可能需要检查SAP的文档或相关资料,确认这个预分配的号码是否会被占用,即使后续保存失败。 另外,实际测试可能更直接。可以模拟一个场景:调用GETINTNUMBER获取号码,然后故意在SAVEDATA时触发错误(比如必填字段未填),然后检查该号码是否被标记为已使用或不可用。如果再次调用GETINTNUMBER,是否会得到相同的号码?或者系统是否会跳过该号码? 还需要考虑事务提交的问题。如果这两个BAPI在同一个事务中调用,但SAVEDATA失败导致事务回滚,那么GETINTNUMBER分配的号码是否也会被回滚?如果是的话,可能不会占号。但如果在GETINTNUMBER调用后立即提交,号码可能就会被占用,即使后续SAVEDATA失败。 用户可能需要了解如何避免这种情况,比如是否应该在确认SAVEDATA成功后再提交,或者如何处理已分配但未使用的号码。此外,是否需要手动清理这些占用的号码,或者系统有自动回收机制? 总结可能的要点: 1. BAPI_MATERIAL_GETINTNUMBER预分配号码后立即保留,即使后续SAVEDATA失败,该号码可能仍被占用。 2. 事务处理流程(是否提交)会影响号码的保留状态。 3. 号码分配配置(内部还是外部)也可能影响结果。 4. 系统可能存在号码间隔,导致失败后号码不会被回收,形成间隙。 需要验证这些点,并给出用户明确的结论和建议,比如在同一个事务中处理,确保SAVEDATA成功后再提交,或者检查号码分配配置是否为外部,以避免占号问题。</think>在SAP中,使用`BAPI_MATERIAL_GETINTNUMBER`预分配物料内部编号后,若`BAPI_MATERIAL_SAVEDATA`创建物料失败,**是否会导致占号**,需分以下情况分析: --- ### 1. **占号的逻辑与原因** - **预分配机制**: `BAPI_MATERIAL_GETINTNUMBER`的作用是预生成一个内部编号(如`MATNR`),该操作会直接占用编号池中的号码。即使后续`BAPI_MATERIAL_SAVEDATA`失败,**此号码仍会被标记为“已分配”**,导致占号。 - **事务提交影响**: - 若预分配和创建在**同一事务**中(未显式提交),失败时事务回滚,**号码不会被占用**。 - 若预分配后已提交(如通过`BAPI_TRANSACTION_COMMIT`),即使创建失败,**号码将永久占用**。 --- ### 2. **系统配置的影响** - **内部编号范围**: - 若使用**内部编号分配**(系统自动生成),占号会导致“间隙”(即跳号)。 - 若为**外部编号分配**(手动输入),预分配无意义,需直接通过`BAPI_MATERIAL_SAVEDATA`指定编号。 - **间隔管理**: SAP通常不会回收已分配的编号,因此占号后需手动处理或接受间隙。 --- ### 3. **解决方案建议** - **绑定事务流程**: 将`BAPI_MATERIAL_GETINTNUMBER`和`BAPI_MATERIAL_SAVEDATA`放在同一事务中,确保失败时整体回滚。 ```abap CALL FUNCTION 'BAPI_MATERIAL_GETINTNUMBER' ... IF sy-subrc = 0. CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' ... IF sy-subrc <> 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. ENDIF. ENDIF. ``` - **手动释放号码(谨慎操作)**: 若已提交且需释放占号,需通过后台表(如`NRIV`)调整编号范围状态,或联系BASIS团队处理。 - **改用外部编号**: 若业务允许,直接通过`BAPI_MATERIAL_SAVEDATA`指定外部编号,规避预分配风险。 --- ### 4. **验证方法** - 测试场景: 1. 调用`BAPI_MATERIAL_GETINTNUMBER`获取编号(如`MATNR=000000000000001234`)。 2. 故意触发`BAPI_MATERIAL_SAVEDATA`错误(如漏填必填字段)。 3. 检查表`MARA`中是否存在该`MATNR`,若存在则占号;若不存在且无法再次分配相同号,则说明号码被标记为已用。 --- ### 总结 若未合理控制事务提交,**预分配的号码会被永久占用**。建议通过事务绑定、改用外部编号或调整编号范围配置来规避问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值