ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SAP MM 物料主数据编号范围配置:MATERIALNR 与物料类型绑定及排错指南

SAP MM 物料主数据编号范围配置:MATERIALNR 与物料类型绑定及排错指南 简介这份资源聚焦SAP系统后台物料主数据的编号范围维护面向SAP MM模块顾问、实施人员及需要配置物料编码规则的运维学习者。内容围绕号码组与内部段、外部段的创建与分配展开涵盖冲突检查、物料类型分派及MMNR、SNRO、SUNM等事务码的进入方式并附有ERP 6.0 EHP7环境下的完整示范截图可帮助读者掌握编号范围配置的完整流程与排错思路。资源包共1个docx文档约494KB以图文步骤形式呈现便于对照系统界面逐步操作。目前已有807人学习下载适合需要快速上手物料编号范围配置或查漏补缺的SAP从业者参考。1. 物料主数据编号范围一个被低估的 MM 配置入口做 SAP MM 顾问的人大多有过这样的经历业务方说“新建物料时系统不给号了”或者“物料号怎么跳到 900000 了”又或者“我们想按物料类型分开编号现在全挤在一个区间里”。这些问题最后都指向同一个配置点——物料主数据的编号范围。它藏在 SPRO 的 MM 配置树里平时没人动一旦出问题就是全公司新建物料停摆。编号范围Number Range本质上是给物料号分配一组可用的数字区间SAP 通过编号范围对象MATERIALNR来管理配合物料类型决定“这类物料用哪段号、是内部给号还是外部给号”。它解决的是物料号唯一性、可读性和分段管理的问题适合 MM 顾问、主数据管理员以及需要批量导入物料的 ABAP 开发。理解它比记住事务码更重要。2. 编号范围对象 MATERIALNR 与物料类型的绑定逻辑2.1 编号范围对象和区间的基本概念SAP 里每个需要自动编号的业务对象都有一个编号范围对象物料主数据对应的是MATERIALNR。这个对象下可以挂多个编号范围区间Number Range Interval每个区间由“编号范围号 起始号 截止号 当前编号状态”组成。物料号在数据库里以字符形式存储但编号范围本身是按数字区间来管理的所以区间边界必须是数字。常见的做法是给原材料、半成品、成品、包装材料各分一段比如 100000-199999 给原材料200000-299999 给半成品。这样从物料号就能大致判断物料类别报表和接口处理时也方便做前缀过滤。编号范围对象和物料类型之间不是直接绑定的中间隔了一层“物料类型 → 编号范围”的分配。事务码MMNR就是维护这层关系的入口它同时展示编号范围对象、区间列表和物料类型分配。很多人只记得MMNR能改号段却忽略了它右侧的物料类型分配区域结果改完区间发现新建物料还是走老号段原因就是物料类型没重新分配。2.2 用 MMNR 查看和维护编号范围区间进入MMNR后左上角是编号范围对象默认就是MATERIALNR。中间是区间列表显示每个区间号、起始号、截止号和当前状态。状态分两种0表示未使用1表示已占用已经有物料号落在这个区间。新增区间点“插入行”填区间号和起止号即可。修改已有区间的截止号要谨慎如果新截止号小于当前已用的最大号系统会报错。事务码MMNR 编号范围对象MATERIALNR 操作路径区间列表 → 插入行 → 输入区间号/起始号/截止号 → 保存 请求号自动弹出归入对应的定制请求这里的关键参数是区间号和起止号。区间号只是内部标识不体现在物料号上起止号决定实际可用的数字范围。保存时会要求挂到定制请求上所以生产系统操作前要确认请求号归属避免混进无关请求。保存成功后状态列会从0变成1的前提是该区间已经被分配且被使用过单纯建区间不会立刻变1。2.3 物料类型与编号范围的分配关系区间建好后要在MMNR右侧的“物料类型 → 编号范围”区域把物料类型指到对应区间。比如把ROH原材料指到区间 01把FERT成品指到区间 02。一个物料类型只能分配一个编号范围但一个编号范围可以被多个物料类型共用。如果某个物料类型没有分配编号范围新建物料时会直接报错“没有为物料类型 XXX 定义编号范围”。物料类型典型含义建议编号范围给号方式ROH原材料100000-199999内部HALB半成品200000-299999内部FERT成品300000-399999内部VERP包装材料400000-499999内部DIEN服务500000-599999外部这张表是常见做法不是标准答案。实际分段要结合公司物料号编码规则如果已有历史号段新增区间要避开已用范围。给号方式在物料类型层面通过“内部/外部”标识控制内部给号由系统自动取下一个可用号外部给号允许用户手工输入物料号但输入值必须落在分配的区间内。3. 内部给号与外部给号的配置差异及批量导入影响3.1 内部给号和外部给号的判定位置给号方式不在MMNR里改而是在物料类型的定义里。事务码OMS2进入物料类型配置选中某个物料类型后双击在“基本数据”视图里有一个“内部编号分配”和“外部编号分配”的勾选项。两个都勾表示两种方式都允许新建物料时用户可以选择只勾内部表示系统强制给号只勾外部表示必须手工输入。很多公司为了物料号规范只勾内部禁止业务手工造号。事务码OMS2 路径物料类型 → 选中类型 → 双击 → 基本数据 1 关键字段内部编号分配 / 外部编号分配这里有个容易踩的坑如果只勾了外部给号但用户新建物料时没输物料号系统会报“请输入物料号”。反过来只勾内部给号时用户在 MM01 初始屏幕输入的物料号会被忽略系统仍然自动给号。判断当前物料类型是哪种方式看OMS2里的勾选状态最直接不要靠猜。3.2 外部给号时区间校验的边界行为外部给号时用户输入的物料号必须落在该物料类型分配的编号区间内否则报错“物料号 XXX 不在编号范围 XX 内”。但有一个细节如果输入的号已经被占用系统报“物料号 XXX 已存在”这个校验优先于区间校验。另外外部给号不会更新编号范围的当前编号状态也就是说外部给号用掉的号不会让内部给号的“下一个号”跳过去两者在编号状态上是独立的。这会导致一种情况外部给号用了 150000内部给号的下一个号可能还是 100001直到内部给号也走到 150000 时才会发现冲突。提示混用内部和外部给号时建议定期用报表检查区间占用情况避免外部给号悄悄吃掉内部号段。3.3 批量导入物料时的编号范围处理用 LSMW 或 BDC 批量导入物料时编号范围的处理方式取决于给号方式。内部给号时导入模板里物料号字段留空系统逐条自动给号外部给号时模板里必须填物料号且要保证不重复、不越界。批量导入前最好先查一下当前区间的最大已用号估算剩余容量。 查询 MATERIALNR 编号范围当前状态 DATA: lt_nriv TYPE TABLE OF nriv. CALL FUNCTION NUMBER_RANGE_INTERVAL_LIST EXPORTING object MATERIALNR TABLES interval_list lt_nriv. lt_nriv 中 FROMNUMBER / TONUMBER / NRLEVEL 分别表示起止号和当前号这段代码调用NUMBER_RANGE_INTERVAL_LIST读取编号范围区间列表NRLEVEL字段就是当前已用的最大号。批量导入前跑一次能清楚知道还剩多少号可用。如果剩余容量不足要么扩截止号要么新建区间并重新分配物料类型。注意扩截止号时不能小于NRLEVEL否则系统拒绝保存。4. 编号范围常见报错、传输与生产环境排错4.1 新建物料报“编号范围已满”的定位步骤报“编号范围已满”说明当前区间的NRLEVEL已经等于TONUMBER。定位步骤是先用MMNR看区间列表找到状态为1且截止号最小的那个区间再看它分配给了哪些物料类型。如果确认是容量问题扩截止号即可如果发现号段被某个异常物料类型占用要检查是不是分配错了。还有一种情况是区间号段本身设得太小比如只给了 1000 个号业务量一大就满。排查顺序 1. MMNR 查看区间列表和 NRLEVEL 2. 确认报错物料类型对应的编号范围 3. 检查该区间是否被多个物料类型共用 4. 扩截止号或新建区间并重新分配扩截止号时要注意新截止号必须大于当前NRLEVEL且不能和相邻区间重叠。如果相邻区间已经存在要么改相邻区间的起始号要么把新号段放到末尾。生产系统操作前先在测试系统验证确认不影响已有物料号。4.2 编号范围配置的传输请求处理编号范围的配置属于定制请求MMNR保存时会记录到请求里。传输时要注意两点一是区间数据和物料类型分配都在同一个请求里传输后目标系统会覆盖原有配置二是如果目标系统已经有物料号落在某个区间传输过去的区间起止号不能小于目标系统的NRLEVEL否则传输会失败或导致号段冲突。跨系统传输编号范围最稳妥的做法是传输前在目标系统查一遍NRLEVEL确认新配置兼容。传输场景风险点处理方式测试→生产生产已有物料号先查 NRLEVEL再决定是否传输开发→测试区间号重复传输后检查区间列表是否重叠新建区间物料类型未分配传输后补分配或一并传输传输请求里如果只包含区间不包含物料类型分配目标系统会出现“有区间但没分配”的状态新建物料仍然报错。所以传输前确认请求内容完整或者传输后手工补分配。4.3 编号范围与物料类型增强的交互有些项目会对物料主数据做屏幕增强比如在 MM01 新建屏幕上加自定义字段。这类增强如果涉及物料号字段的逻辑要注意编号范围的给号时机。内部给号是在保存时才真正取号屏幕上的物料号字段在新建时是空的增强逻辑不能假设物料号已经存在。外部给号时物料号在初始屏幕就输入了增强可以读取但要做区间校验的二次确认。ABAP 增强里如果需要提前知道物料号可以用NUMBER_GET_NEXT预取但预取会占用号取而不用的号就浪费了一般不推荐。注意屏幕增强里不要硬编码编号范围区间号区间号在不同系统可能不同硬编码会导致传输后逻辑错乱。5. 用 NUMBER_GET_NEXT 和报表监控编号范围使用率5.1 在自定义程序里安全地取物料号如果自开发程序需要生成物料号不要自己拼数字应该调用NUMBER_GET_NEXT从MATERIALNR取号。这样取到的号和 MM01 内部给号走同一套逻辑不会冲突。DATA: lv_material TYPE matnr, lv_rc TYPE inri-returncode. CALL FUNCTION NUMBER_GET_NEXT EXPORTING nr_range_nr 01 编号范围区间号 object MATERIALNR IMPORTING number lv_material returncode lv_rc. lv_rc 0 表示取号成功lv_material 是带前导零的字符号nr_range_nr填的是区间号不是物料类型。取号前要确认该区间已经分配给目标物料类型否则取出来的号可能落在别的物料类型号段里。returncode非 0 时要处理异常常见的是区间已满。取号成功后lv_material是带前导零的 18 位字符写入物料主数据前一般要去掉前导零或按业务要求处理。5.2 用报表监控各区间使用率编号范围用满不是一瞬间发生的定期监控使用率可以提前扩容。写一个简单报表读取MATERIALNR的所有区间计算NRLEVEL和TONUMBER的比值超过 80% 就预警。DATA: lt_nriv TYPE TABLE OF nriv. CALL FUNCTION NUMBER_RANGE_INTERVAL_LIST EXPORTING object MATERIALNR TABLES interval_list lt_nriv. LOOP AT lt_nriv INTO DATA(ls_nriv). DATA(lv_used) ls_nriv-nrlevel - ls_nriv-fromnumber. DATA(lv_total) ls_nriv-tonumber - ls_nriv-fromnumber. IF lv_total 0 AND lv_used * 100 / lv_total 80. WRITE: / 区间, ls_nriv-nrrangenr, 使用率超过 80%. ENDIF. ENDLOOP.这段逻辑遍历区间列表用NRLEVEL减起始号得到已用数量除以总容量得到使用率。超过 80% 输出预警。实际使用时可以包成后台作业每天跑一次结果发邮件给主数据管理员。注意NRLEVEL在区间未被使用时可能等于起始号减一计算时要处理边界避免出现负数。5.3 编号范围调整后的验证清单调整编号范围后不要只看MMNR保存成功就结束。验证清单包括新建一个测试物料确认给号落在新区间检查物料类型分配是否生效用NUMBER_RANGE_INTERVAL_LIST确认NRLEVEL正确如果是生产系统确认传输请求已释放且目标系统配置一致。外部给号场景还要测一次越界输入确认系统正确报错。这套验证做完编号范围调整才算真正落地。本文还有配套的精品资源点击获取
返回列表