SAP:MM03 BAPI_MATERIAL_SAVEDATA

本文详细介绍了物料信息导入及数据维护的过程,包括内表清空、基本信息录入、销售视图、税分类、工厂数据维护等关键步骤。通过一系列操作确保物料数据的准确性和完整性,以支持后续的业务流程。

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

**清空内表
    CLEAR:   it_rount,
             it_bapiret2,
             it_head,
             it_clinetdata,
             it_clinetdatax,
             it_salesdata,
             it_salesdatax,
             it_plantdata,
             it_plantdatax,
             it_storagelocationdata,
             it_storagelocationdatax,
             it_valuationdata,
             it_valuationdatax.
    it_head-material it_matnr.       "物料号*


*基本数据录入

    IF itab_ext-magrv <> ''.
      it_head-basic_view 'X'.         "基本数据视图
      it_clinetdata-mat_grp_sm itab_ext-magrv.      "进口/国产
      it_clinetdatax-mat_grp_sm 'X'.
    ENDIF.
    IF itab_ext-matkl <> ''.
      it_head-basic_view 'X'.         "基本数据视图
      it_clinetdata-matl_group itab_ext-matkl.    "物料组*
      it_clinetdatax-matl_group 'X'.
    ENDIF.
    IF itab_ext-spart <> ''.
      it_head-basic_view 'X'.         "基本数据视图
      it_clinetdata-division itab_ext-spart.      "产品组
      it_clinetdatax-division 'X'.
    ENDIF.

*销售视图录入
    IF itab_ext-vkorg <> '' AND itab_ext-vtweg <> ''.
      it_head-sales_view 'X'.         "销售视图
      it_salesdata-sales_org itab_ext-vkorg.    "销售组织*
      it_salesdata-distr_chan itab_ext-vtweg.   "分销渠道*
      it_salesdata-delyg_plnt itab_ext-dwerk.   "交货工厂
      it_salesdata-acct_assgt itab_ext-ktgrm.   "科目设置组
      it_salesdata-mat_pr_grp itab_ext-kondm.     "物料定价组
      it_salesdata-matl_stats itab_ext-versg.   "物料统计组
      it_clinetdata-trans_grp itab_ext-tragr.   "运输组*
      it_plantdata-loadinggrp itab_ext-ladgr.   "装载组*
      it_plantdata-availcheck itab_ext-mtvfp.   "可用性检查*

      it_salesdatax-sales_org  itab_ext-vkorg.
      it_salesdatax-distr_chan itab_ext-vtweg.
      it_salesdatax-delyg_plnt 'X'.
      it_salesdatax-acct_assgt 'X'.
      it_salesdatax-mat_pr_grp   'X'.
      it_salesdatax-matl_stats 'X'.
      it_clinetdatax-trans_grp 'X'.
      it_plantdatax-loadinggrp 'X'.
      it_plantdatax-availcheck 'X'.
    ENDIF.
*税分类
    IF itab_ext-taxkm <> ''.
      it_mlan-depcountry 'CN'.  "发货国(由该国家发货)
      it_mlan-tax_type_1 'MWSI'."税类别(销项税)
      it_mlan-taxclass_1 itab_ext-taxkm.
      APPEND it_mlan.
    ENDIF.
**&&&工厂数据维护
    IF itab_ext-werks <> ''.
      it_plantdata-plant itab_ext-werks."工厂
      it_plantdatax-plant itab_ext-werks.
      it_valuationdata-val_area   itab_ext-werks.   "估价范围(工厂)
      it_valuationdatax-val_area   itab_ext-werks.


*6采购视图录入
      IF itab_ext-ekgrp <> '' OR itab_ext-kordb <> ''
      OR itab_ext-usequ <> ''.
        it_head-purchase_view 'X'.      "采购视图
        it_plantdata-pur_group itab_ext-ekgrp.                "采购组
        it_plantdata-sourcelist itab_ext-kordb.               "货源清单
        it_plantdata-quotausage itab_ext-usequ.               "配额
        it_plantdatax-pur_group   'X'.
        it_plantdatax-sourcelist  'X'.
        it_plantdatax-quotausage 'X'.
      ENDIF.
*MRP录入
      IF itab_ext-dismm <> ''.
        it_head-mrp_view 'X'.           "物料需求计划(MRP)视图
        it_plantdata-mrp_type itab_ext-dismm.      "MRP类型*_A
        it_plantdata-mrp_ctrler itab_ext-dispo.    "MRP控制者*
        it_plantdata-lotsizekey itab_ext-disls.    "批量*
        it_plantdata-minlotsize itab_ext-bstmi.    "最小批量
        it_plantdata-abc_id itab_ext-maabc.        "ABC标识
        it_plantdata-pur_status itab_ext-mmsta.    "特定工厂的物料状态
        it_plantdatax-mrp_type   'X'.
        it_plantdatax-mrp_ctrler 'X'.
        it_plantdatax-lotsizekey 'X'.
        it_plantdatax-minlotsize 'X'.
        it_plantdatax-abc_id 'X'.
        it_plantdatax-pur_status 'X'.

        IF itab_ext-beskz <> ''.
          it_plantdata-proc_type itab_ext-beskz.     "获取(采购)类型*_B
          it_plantdata-spproctype itab_ext-sobsl.    "特殊采购类型
          it_plantdata-backflush itab_ext-rgekz.     "反冲
          it_plantdata-iss_st_loc itab_ext-lgpro.     "生产仓储地点
          it_plantdata-sloc_exprc itab_ext-lgfsb.     "外部采购仓储地点
          it_plantdata-inhseprodt itab_ext-dzeit.    "内部生产(自制)时间?
          it_plantdata-plnd_delry itab_ext-plifz.    "计划交货时间
          it_plantdata-sm_key itab_ext-fhori.        "计划边际码
          it_plantdata-safety_stk itab_ext-eisbe.    "安全库存
          it_plantdatax-proc_type  'X'.
          it_plantdatax-spproctype 'X'.
          it_plantdatax-backflush  'X'.
          it_plantdatax-iss_st_loc 'X'.
          it_plantdatax-sloc_exprc 'X'.
          it_plantdatax-inhseprodt 'X'.
          it_plantdatax-plnd_delry 'X'.
          it_plantdatax-sm_key     'X'.
          it_plantdatax-safety_stk 'X'.
        ENDIF.

        IF itab_ext-vrmod <> ''.
          it_plantdata-period_ind 'M'.             "期间标识
          it_plantdata-availcheck itab_ext-mtvfp.    "可用性检查*
          it_plantdata-consummode itab_ext-vrmod.    "消耗模式
          it_plantdata-bwd_cons   itab_ext-vint1.    "逆向消耗模式
          it_plantdata-fwd_cons   itab_ext-vint2.    "向前消耗模式
          it_plantdatax-period_ind 'X'.
          it_plantdatax-availcheck 'X'.
          it_plantdatax-consummode 'X'.
          it_plantdatax-bwd_cons   'X'.
          it_plantdatax-fwd_cons   'X'.
        ENDIF.

        it_plantdata-dep_req_id itab_ext-sbdkz.    "独立/集中
        it_plantdatax-dep_req_id 'X'.
      ENDIF.
*8工作计划录入
      IF itab_ext-beskz 'E' OR itab_ext-beskz 'X'.
        it_head-work_sched_view 'X'.    "工作计划视图
        it_plantdata-serno_prof itab_ext-sernp.    "序列号参数文件
        it_plantdata-profit_ctr itab_ext-prctr.    "利润中心
        it_plantdatax-serno_prof =  'X'.
        it_plantdatax-profit_ctr 'X'.
      ENDIF.
*9工厂数据/存储录入
      IF itab_ext-lgort <> ''.
        it_head-storage_view 'X'.       "存储视图
        it_storagelocationdata-plant itab_ext-werks.       "工厂
        it_storagelocationdata-stge_loc itab_ext-lgort.    "库存地点
        it_storagelocationdata-stge_bin itab_ext-lgpbe.    "仓位_A
        it_storagelocationdatax-plant itab_ext-werks.
        it_storagelocationdatax-stge_loc itab_ext-lgort.
        it_storagelocationdatax-stge_bin 'X'.
      ENDIF.

      IF itab_ext-sernp <> ''.
        it_head-storage_view 'X'.       "存储视图
        it_plantdata-serno_prof itab_ext-sernp.            "序列号参数文件
        it_plantdatax-serno_prof 'X'.
      ENDIF.
      IF itab_ext-prctr <> ''.
        it_head-storage_view 'X'.       "存储视图
        it_plantdata-profit_ctr itab_ext-prctr.    "利润中心
        it_plantdatax-profit_ctr 'X'.
      ELSEIF itab_ext-prctr ''.
        it_head-storage_view 'X'.       "存储视图
        it_plantdata-profit_ctr '0000209001'.
        it_plantdatax-profit_ctr 'X'.
      ENDIF.
**会计录入
      IF itab_ext-bklas <> ''.
        it_head-account_view 'X'.       "会计视图
        it_valuationdata-val_class itab_ext-bklas.    "评估类
        it_valuationdata-price_unit itab_ext-peinh.   "价格单位
        it_valuationdata-std_price itab_ext-stprs_1.    "标准价


        it_valuationdatax-val_class  'X'.
        it_valuationdatax-price_unit 'X'.
        it_valuationdatax-std_price  'X'.
      ENDIF.
*成本录入
      it_head-cost_view 'X'.          "成本视图
      it_plantdata-variance_key itab_ext-awsls.      "差异码A
      it_valuationdata-orig_mat itab_ext-hkmat.      "物料来源
      it_plantdatax-variance_key 'X'.
      it_valuationdatax-orig_mat 'X'.
    ENDIF.
*调用函数,保存数据
    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        headdata             it_head
        clientdata           it_clinetdata
        clientdatax          it_clinetdatax
        salesdata            it_salesdata
        salesdatax           it_salesdatax
        plantdata            it_plantdata
        plantdatax           it_plantdatax
        storagelocationdata  it_storagelocationdata
        storagelocationdatax it_storagelocationdatax
        valuationdata        it_valuationdata
        valuationdatax       it_valuationdatax
      IMPORTING
        return               it_bapiret2
      TABLES
        taxclassifications   it_mlan.

    IF  it_bapiret2-type CA 'EA'.
      SUPPRESS DIALOG.
      WRITE: /'添加物料信息出错!物料号为:',it_matnr1,it_bapiret2-message.
      CONCATENATE '添加物料信息出错!物料号为:'  it_matnr1 ';' it_bapiret2-message INTO it_error-message.
    ELSE.
      COMMIT WORK.
      SUPPRESS DIALOG.
      IF itab_ext-zpslx '' OR itab_ext-zpslx '1' OR itab_ext-zpslx '2' OR itab_ext-zpslx '3' ).
*        UPDATE marc SET zpslx = itab_ext-zpslx
*             WHERE matnr = itab_ext-matnr AND
*                   werks = itab_ext-werks .
      ENDIF.
      WRITE: /'物料已成功导入!物料号为:',it_matnr1.
*          LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0101.
      CONCATENATE '物料已成功导入!物料号为:' it_matnr1 INTO it_error-message.
    ENDIF.
    APPEND it_error.
  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、付费专栏及课程。

余额充值