SAP BAPI-MM模块-物料主数据内部给号-BAPI_MATERIAL_GETINTNUMBER-SE37函数测试(事务码MMNR MM01&后台表NRIV SNRO)超级干货系列

目录

业务说明

1 BAPI注意事项

2 BAPI基础数据

3 BAPI数据结构

4 BAPI函数调用

5 BAPI必要数据

事务码MB23进入界面

SE38调用BAPI-物料主数据内部给号

6 BAPI执行测试

入参-MATERIAL_TYPE-物料类型

入参-INDUSTRY_SECTOR-行业领域

入参-REQUIRED_NUMBERS-需求数量

BAPI执行

7 后台表查看更新

后台表NRIV-编码范围表


业务说明

在实战项目上,存在外部接口业务或批导或功能程序时,需要在开发程序中调用SAP标准业务应用程序接口,就是经常听到的BAPI。SAP给常用的业务都预定义了BAPI,所以有需要的时候,就要找到对应的BAPI。需要对BAPI的结构和字段非常熟悉,否则不能正确的使用BAPI,从而导致各种报错。为了降低测试过程中的报错,需要在写程序前,将需要调用的BAPI使用事务码SE37进行相关测试,以掌握具体的入参和出参等详细数据。

1 BAPI注意事项

物料主数据内部给号,需要通过下面1个BAPI可以实现。

物料主数据内部给号-输入: 

BAPI_RESERVATION_DELETE

2 BAPI基础数据

BAPI功能:物料主数据内部给号

BAPI:BAPI_RESERVATION_DELETE

对应前台事务码:MM01

后台表:

MARA - 物料基础数据表

NRIV - 物料主数据编码范围(对象名称:MATERIALNR)

3 BAPI数据结构

EXPORTING:程序将值传给函数模块的导入参数(入参)。
IMPORTING:实际参数会分配给函数模块的导出参数(出参)。
TABLE:函数模块中传递和处理多个记录的数据。
EXCEPTIONS:函数中定义的异常自动分配不同数值(异常)。

4 BAPI函数调用

物料主数据内部给号BAPI: BAPI_MATERIAL_GETINTNUMBER

CALL FUNCTION 'BAPI_MATERIAL_GETINTNUMBER'
  EXPORTING
    material_type          =
*   INDUSTRY_SECTOR        = ' '
*   REQUIRED_NUMBERS       = 1
* IMPORTING
*   RETURN                 =
  tables
    material_number        =
          .

5 BAPI必要数据

如何快速在BAPI中找到对应的BAPI组件并输入正确的值,就需要弄清楚每个组

<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、付费专栏及课程。

余额充值