简介:这是一份SAP生产预留操作指引,面向制造企业的生产计划、物料管理人员及SAP实施顾问,用于解决生产预留从后台配置到前台操作的关键问题。文档从预留背景入手,系统梳理预留编码OMC2、缺省值、工厂级预留参数配置与可用性检查机制;实操层面重点讲解MB21手动创建、MB23按预留编号查询、MB25按物料查询及MBBR批量创建等常用事务码,同时也介绍了批量处理MBVR与生产自动预留等进阶内容。资源为单个docx格式文档,压缩包内共1个文件,大小约836KB,便于直接查阅使用。通过约14页的说明,读者可掌握OMC2编码含义、工厂级参数配置方法、可用性检查逻辑,并按步骤完成预留的创建、查询和批量处理,从而减少缺料风险、提升生产准备效率。目前已有693人学习浏览,适合SAP生产模块初学者系统学习,也可作为企业内部培训与日常操作的手册。
1. 生产预留到底管什么:一个被 MRP 纳入考虑的需求计划机制
做 SAP 生产、物料或仓储模块的同事,对“预留”这个词应该都不陌生。很多人起初会以为,预留只是给某张工单锁住一批库存,等发货时再抵消掉;真正配置起来才发现,SAP 生产预留是一个被 MRP 纳入需求计算、能提前占用可用库存、还能控制发货时点的完整机制。手动入口是 MB21,自动来源是工单下达,特殊场景可以用 MBBR 批量生成。这套机制配置点分散在 SPRO 物料管理和生产模块下,真正让人翻车的往往不是功能不会用,而是后台参数没成串,加上没人定期跑 MBVR 清理,导致超期预留越积越多、可用库存被悄悄占满。下面按配置、手动操作、自动预留、常见坑和底表验证的顺序,把这条链路完整拆一遍。
2. 预留参数配置:OMC2 号码段、缺省值与可用性检查的三个决定项
2.1 预留编码 OMC2:号码分配的配置位置与常见错误
预留的凭证号不是随便生成的,系统靠一套号码段统一分配。配置路径在 SPRO:物料管理-库存管理和实际库存-号码分配-为预留定义号码分配,这组配置的事务代码是 OMC2。打开后能看到内部编号和外部编号的设置,工厂创建的每张预留凭证都会从设定号码段内自动取号。生产环境下这张凭证号会出现在 MB21 创建完成后的提示栏、MB23 查询界面的抬头,以及后续 MIGO 发货选择预留的清单里,链路上到处都要用它,所以号码段配置最好在项目初始化阶段一次规划好。
实务里的常见问题是号码段还没到上限就报“号码范围用尽”。这时候优先去 OMC2 看范围上限,再看当前号码状态已经跑到多少。如果范围上限留得不够宽,生产订单一多、预留一夜间激增,几天就能把号码空间耗尽。我一般建议在这种内部编号场景下把范围留到 9 个 9 的规模,并且上线初期一次性多定义几个号码区间,避免后期不停追加配置。数量统计类报表如果按凭证号段做分区,也要提前跟开发确认好预留号的范围,防止报表写死区间后新加号段查不到数据。
2.2 缺省值:天数 M、保持期与 MRA 分别控制什么
SPRO 路径:物料管理-库存管理和实际库存-预留,里面的一组缺省值参数值得逐字段理解。很多实施文档只是让照着填,没人解释这三个参数之间的配合关系,结果上线后不是提前发货被拦,就是旧预留清不掉。这里的核心参数用一张表可以看得更清楚。
| 参数 | 典型值 | 作用 |
|---|---|---|
| 允许移动的天数 M | 10 天(工作日) | 允许在需求日期之前提前多久发货 |
| 保持期间 | 30 天 | 预留最多保留多少天,超期后交给 MBVR 物理删除 |
| MRA | 勾选 | 为预留自动创建存储地点库存数据 |
M 和保持期是一对配合使用的规则,不是独立开关。原文里说的“如果此处值为 10 天,可以提前发货的天数 10 天”,意思是需求日期还在 10 个工作日之外的预留,系统不允许你提前把货发给生产;一旦进入这 10 天的窗口,且预留行项目勾选了 M,MIGO 发货就能放行。保持期 30 天则针对历史遗留数据:以基准日期为准,过去的需求日期已经超过 30 天的预留会被判定为过期记录,等待 MBVR 清理。两者同时成立时,一个负责“未来临近放行”,一个负责“过去超期删除”。
MRA 的作用很多人忽略:勾选后,系统会为预留自动创建存储地点的库存数据。日常业务中,如果某张预留对应多个存储地点,没有 MRA,仓库做发货准备时可能找不到存储地点的备货记录。另有一个细节是界面上 MVT 相关勾选项,前台路径在 MB21 的菜单“编辑-附加功能-用于所有项目-移动开关”,它控制当前界面多行项目是否统一勾选 M。不要以为勾了后台缺省值,前台的预留行项目会自动带出 M;这个开关是会话级的,进一次 MB21 就要确认一次。
2.3 工厂级预留参数:和订单类型参数的区别
后台还有一个节点容易和前面的缺省值混淆:物料管理-库存管理和实际库存-工厂参数。这里的配置范围是“工厂级”,影响当前工厂下所有预留数据的行为规则;而 OPL8 里定义的预留生成策略是按生产订单类型生效的。两者层级不同,却经常被放在一起讨论。发生过不止一次的项目现场:工厂级配置已经调好,某类生产订单却一直不生成预留,查到最后是 OPL8 对应订单类型的“生成预留”选项配成了“从不”。所以配置顺序我建议先配工厂参数,再逐订单类型核对 OPL8,最后用一张测试订单走一遍下达流程验收。
工厂参数里还能维护一些和预留相关的默认值,比如移动类型缺省值、是否需要可用性检查提示等。这部分配置与具体业务规范关系很大,没有一个放之四海皆准的模板;关键是确认它不要与前台 MB21 的输入项冲突。比如前台明明选择了成本中心 201 的移动类型,工厂参数里却把默认移动类型强制成 261,保存时就会出现物料凭证过账归集对象和原始预期不一致的情况。此类问题经常要翻 20 多张表才能定位,不如配置时就把边界理清。
2.4 预留可用性检查:02 与 03 规则怎么决定 MB21/MB22
可用性检查配置在 SPRO:物料管理-库存管理和实际库存-预留-设置动态可用性检查。这个配置决定的不是“要不要查库存”,而是“按什么规则查”。系统在 MB21 创建或 MB22 修改预留时,会读取物料主档 MRP3 视图中的“可用性检查”字段,再结合 SPRO 里维护的动态可用性检查规则,两者共同决定检查行为。原文特别点明:02 和 03 决定了 MB21 / MB22 的可用性检查规则。
02 号检查规则通常对应“仅检查库存”的场景,它只看当前工厂和存储地点的可用库存,不纳入在途采购、生产订单收货这些将来的供应。03 号规则覆盖范围更宽,会把采购订单、计划订单的收货数量一并算进去,适合供应来源较多的物料。遇到“手工创建预留总被拦”的反馈,不要只守在 SPRO 里改规则,先打开物料主档 MRP3 视图看对应工厂行的可用性检查字段是什么。很多时候物料主档里是 02,SPRO 动态可用性检查跑的是 03 规则,两边没对上,外表看就是“配置了但总是不生效”的玄学问题。
注意:可用性检查规则一旦改了,会影响所有使用该规则的物料和移动类型。上线后调整要挑业务低峰期,并在测试工厂先验证再传输。
3. 手动预留操作链路:MB21 创建、查询与批量工具的完整流程
3.1 MB21 创建预留:移动类型选择、M 勾选与界面操作
手动创建预留的典型业务场景是新品研发:研发阶段没有正式生产工单,但研发领料消耗需要纳入 SAP 系统做全局控制,这时候就可以申请创建成本中心预留。另一种常见场景是转储和成本中心投料,用到的移动类型会按业务目的区分为:成本中心投料 201、生产投料 261、研发类消耗可以自定义一个移动类型,比如文档中提到的 Y10。移动类型不同,后续财务过账方向不同:201 会把消耗归集到成本中心,261 会归集到生产订单,研发用的自定义移动类型则单独统计,不进生产成本。
操作路径是后勤-物料管理-库存管理-预留-MB21-创建。创建界面依次填物料、工厂、数量、需求日期、移动类型,以及目标对象——成本中心预留填成本中心号,生产预留填订单号或 WBS 元素。保存后系统返回预留号。创建过程里最重要的一个操作是勾选 M。原文的说法很直接:勾选 M 就可以随时发货,即使一个月以后发货,一般临近才勾选;不勾选不可用。其中的业务含义是,M 代表了“允许移动”的放行标记,后台允许提前 10 天的规则,只是给了窗口,真正决定这张预留能否提前发货的是行项目上的 M 标记。
用户一次输入十几行物料时,逐行勾选 M 容易漏。前台菜单“编辑-附加功能-用于所有项目-移动开关”可以把 M 批量应用到当前界面的全部行项目。注意这只是当前界面会话的操作,不改变后台缺省值,下次再进 MB21 仍要重新处理。
3.2 查询链路:MB23 按预留编号、MB25 按物料、MMBE 看库存
预留创建之后,日常操作会频繁用到三个查询入口。MB23 按预留编号查预留抬头和行项目:输入预留号回车,可以看到物料、数量、需求日期、移动类型、可用性检查结果以及实际发货数量;MB23 还能看到这条预留是手工创建还是自动生成,判断依据是界面上的修改状态和来源标识,这类信息在做问题排查时非常有用。MB25 按物料查预留:不确定预留号、只知道物料号时使用,输入工厂和物料号,系统列出该工厂下所有包含此物料的预留清单,方便批量核对和筛选。
MMBE 查库存则是确认“库存总数”和“已预留数”的关键入口。MMBE 的显示结果会列出库存总数,如果要进一步确认预留占用情况,需要切换到对应页签查看。创建预留后建议养成一个习惯:用 MB23 看一眼预留号,用 MMBE 看可用库存变化,再去 MD04 里看这条预留是否进入需求清单。三步下来,预留的状态基本就清楚了。
3.3 MBBR 批量创建预留:适合什么场景,怎么控制边界
MBBR 是预留的批量创建入口,适合手动一条条敲 MB21 太慢的场景,比如月末补录大批量成本中心预留或研发领料预留。常见做法是在初始屏幕先按工厂、移动类型、需求日期和维护状态过滤,再录入物料清单和数量。MBBR 的界面逻辑和 MB21 蹲在同一个数据模型上,系统校验规则也一样,但界面交互更简略,不熟悉的用户容易漏看后台返回的错误消息。
批量工具的坑集中在两点。第一,行项目 M 状态不一致,某几行没勾选 M,导致后续 MIGO 发货时部分行被拦截,报“预留不允许移动”。第二,需求日期和允许提前天数匹配不上,批量导入时用户常常把需求日期填得很远,系统运行可用性检查时不满足提前窗口,即使有 M 也过不去。处理办法都是用“编辑-附加功能-用于所有项目-移动开关”批量修正,再用 MB23 抽查行项目确认;需求日期本身填错的,必须回到 MBBR 调整后再重新创建,不要试图在前台硬改。
3.4 MRP 与预留的关系:预留被需求计划纳入后的实际影响
预留不是仓库里的一张静态占用记录,它会作为独立需求进入 MRP 运算。系统在跑 MRP 时会把未删除的预留纳入净需求计算,这意味着预留数量会参与生成采购申请、计划订单和后续的生产订单。原文“预留会被 MRP 考虑,这意味着被需求的物料在出库时将被及时获得”就是这个逻辑:物料计划员在 MD04 里看到的需求清单,其中会有一行来自预留。如果预留没有被及时清理或完成发货,MRP 会认为该需求仍然存在,反复触发补货建议。
很多用户只盯着 MB21 里的数量和库存,忽略了预留对 MRP 的牵引作用。一条长期挂在那里的研发预留,可能让计划员多下了好几笔采购申请。处理办法是做完手动预留后,再到 MD04 中核对物料的需求清单,确认预留行的数量和需求日期正确。如果预留已经使用完毕,用 MB22 把剩余数量改成 0 或直接删除,MRP 的净需求计算会立刻修正。
4. 自动预留与批量清理:OPL8 控制点、MBVR 定时 JOB 与修改边界
4.1 OPL8 控制预留生成时机:从不、下达后与立即的选择逻辑
生产订单的预留不是手工做的,而是由系统按订单组件自动生成。控制这个行为的配置点在 SPRO:生产-生产线控制-主数据-订单-定义订单类型的相关参数,事务代码 OPL8。配置页里有一个控制“是否生成预留”的选项,原文列了三个值:从不、下达后、立即,语义差异很大。
“从不”表示该订单类型永远不会自动生成预留,适合测试性订单或借用流程场景,生产投料需要走无预留发货。“下达后”是最常用的设置:订单状态变成 REL 后,系统才根据 BOM 组件生成预留;排产人员确认订单可执行后下发,仓库看到预留已建立,就知道可以去备料了。“立即”表示创建订单的同时就生成预留,不等状态变更。这个选项适合需求紧急、必须在审批流程完成前就占住库存的关键物料。选择哪个值,取决于业务对“预留出现时点”的要求;如果关单太多、预留却早已生成,可以检查是否有订单类型误配成了“立即”。
4.2 工单自动预留与承诺量的差异,以及为什么不能用 MB22 改
生产订单根据 BOM 展开自动生成预留后,很多人会问:“订单里的承诺量不也是需求吗,和预留有什么区别?”原文明确提醒了一句:承诺量与预留不一样。承诺量是物料可用性检查层面给出的 ATP 结果,基于可用量计算得出,主要服务销售和计划的交期确认;预留是执行层用来占库存、发料的记录,直接对应仓库的发货动作。两者数据源不同,一个在可用性检查结果里,一个落在 RESB 表上,不能混着解释。CO03 查看订单的物料组件页签,能看到组件行的需求数量;MB23 查看预留,则能看到具体的预留数量、已发货量和剩余量。
自动预留是系统依据 BOM 展开生成的,MB22 对它基本只读。自动产生的预留无法修改,这是 SAP 的默认保护逻辑,因为它的数据源头是订单 BOM 组件,改了预留行也很快会被重新同步覆盖。想做数量调整,正确做法是回到生产订单 CO02 里改组件数量,保存后系统重新生成或更新预留。如果订单已经部分发货,直接改组件数量会带来已发货量与 BOM 数量不一致的问题,需要先检查 MIGO 的发货历史再做调整。最忌讳的做法是绕过应用层直接去 UPDATE RESB 表,这种操作一旦和订单数据不同步,月结差异会非常难查。
4.3 MBVR 清理逻辑:前后 30 天与 10 天的两组规则
MBVR 的存在就是为了解决一个长期痛点:系统不会自动清除超期的预留。很多项目上线时配了“允许移动 10 天”“保持期 30 天”,但没人排后台 JOB,半年后一查,一大把一年多以前的预留还挂在系统里。MBVR 批量处理预留的机制,原文描述得很明确:以基准日期为准,过去的需求日期距离基准日期超过 30 天的预留,运行 MBVR 时会被物理删除;将来的需求日期距离基准日期不足 10 天的预留,运行 MBVR 时会被自动勾选“允许的移动”。也就是说,这个程序干的是两类相反方向的事:清理老数据和放行临近需求。
实际实施中,最常见的落地方案是在后台配置两个定时 JOB,一个处理“30 天外删除”,一个处理“10 天内放行”,每天分别跑一次。JOB 频率建议日粒度,因为预留的状态每天都在变化,隔天跑容易让临近 10 天窗口的预留不能被及时勾选 M,仓库就无法提前备货。配置完成后一定要用真实数据验证:手工造一条需求日期在 40 天前的预留,跑完删除 JOB 后去 MB23 查记录,确认已经物理消失;再造一条需求日期在 5 天后的预留,跑完放行 JOB 后确认 M 已被勾上。
4.4 自动预留的修改边界:MB22 能改什么,不能改什么
MB22 是修改预留的标准事务码,但“能改什么”完全取决于预留的类型。手工创建的预留,抬头和行项目大多可改:数量、需求日期、移动类型、目标成本中心或订单号,改完后可用量会重新计算,可用性检查也会重新执行,检查失败时系统会给出提示或警告。自动产生的预留则不一样,移动类型、数量、需求日期基本都是灰的,原因前面说过,它是生产订单 BOM 组件的镜像。
区分一条预留是手工创建还是自动生成,最简单的方法是 MB23 查看行项目来源字段,或者留意创建者与订单号是否关联。遇到用户反馈“MB22 改了数量但 MB23 查出来没变”时,先判断是不是自动预留;如果是,回订单 CO02 改组件数量。如果是手工预留但改了没变,再检查是不是只改了抬头没改行项目,或者界面没点保存就离开。自动预留另一个操作限制是不能直接删除,因为只要订单还是下达状态,预留会反复生成。想彻底清掉,要么取消订单下达,要么修改 BOM 组件后再重新展开。
5. 生产预留常见问题与避坑:五个高频翻车点的排查记录
5.1 现象一:库存明明充足,MB21 却提示预留数超限
现象:创建预留时,库存显示有一千多件,但数量填到一千零几件就报错,提示预留数不能超过库存数量。
原因:系统计算的不是“库存总数”,而是“可用库存”。可用库存等于库存总数减去已经被其他预留占用的数量,还要扣除质检、冻结等非自由库存状态。原文给出了完整例子:库存总数 1001,已有预留 2,可用就是 999,新预留最多只能建 999,建第 1000 个就报错。用户只看总库存,没看预留占用,自然觉得是系统出了问题。
解决:用 MMBE 查看预留占用情况,把已经不需要的旧预留删掉或改小,释放可用量后再创建。库存紧张且必须预留的场景,用 MD04 检查物料需求全貌,确认是否有并行的其他预留、订单或计划订单占用了同一批库存。超期预留较多时,先跑一遍 MBVR 清理再操作,通常能立刻释放出一批可用量。
5.2 现象二:MBVR 跑了 JOB,超期预留还躺在系统里
现象:后台 JOB 明明每天都跑 MBVR,但 MB23 里查几个月前的老预留还在,数量也没变化。
原因:MBVR 的两个动作都依赖条件。删除逻辑只处理过去需求日期距离基准日期超过 30 天的预留;放行逻辑只处理未来需求日期距离基准日期不足 10 天的预留。如果那张预留的需求日期不在“过去 30 天之外”,而是在一两周之后,它不会被删除,只会被动等待临近日期后勾选 M。很多人以为“跑了 MBVR 就会清理所有超期预留”,其实程序里几乎没有“无条件清理全部”的选项。
解决:先确认预留的需求日期在过去还是未来;过去的需求日期才可能触发删除,未来的需求日期只会触发勾选 M。再检查 JOB 里调用的程序变式选对没有,删除和放行要分别建变式,别把两个逻辑混在一个 JOB 里跑。最后核对基准日期参数,基准日期设置不对,前后窗口的计算结果会整体偏移。
5.3 现象三:工单下达了,预留没有按预期生成
现象:生产订单从 CRTE 改成 REL,状态已经是下达,但 MB23 查不到这张订单的预留。
原因:常见原因有三个。一是 OPL8 的订单类型把预留选项设成了“从不”;二是订单的 BOM 没有有效展开或组件状态异常,系统没拿到组件数据自然生成不了预留;三是下达动作的保存过程被自定义增强截断,预留生成功能代码没被执行到,这个比较隐蔽。
解决:先查 OPL8 订单类型的预留设置,再看 CO03 的 BOM 展开页面,确认组件行正常显示且数量正确。如果 BOM 没问题,运行事务代码 CO41 或重新下达订单触发一次组件展开,观察是否生成预留。自定义增强场景需要启用调试模式跟踪 BDC 调用,定位到具体增强再处理。
5.4 现象四:MB22 改不了自动预留,用户反复报错
现象:用户用 MB22 修改工单自动生成的预留数量,系统报错或字段呈灰色不可输入。
原因:自动预留的源头是生产订单 BOM 组件,系统对这些数据加了保护标识,MB22 只读。用户不了解“自动预留不可改”的边界,从 MB23 直接点修改,自然碰壁。
解决:明确告知用户不要用 MB22 改自动预留。数量调整回 CO02 订单组件页面操作,保存后系统重新同步预留。如果只是发货数量与预留数量有偏差,用 MIGO 按预留发货时修正发货数量即可;差异较大的,先检查订单已发货量,再决定是否做无预留发货的 261 移动类型补充过账。
5.5 现象五:MBBR 导入后部分预留无法发货
现象:批量创建预留后,MIGO 按预留发货时,部分行提示“预留不允许移动”或可用性检查不通过,但 MB23 里数据看起来是正常的。
原因:MBBR 批量创建时,行项目的 M 标记没有被完整写入,或者写入时需求日期与允许提前天数的窗口不匹配。M 标记缺失,系统认为该预留不允许提前发货;需求日期超出 10 天提前窗口,即使有 M 也无法通过可用性检查。
解决:在 MB21 或 MBBR 菜单里使用“编辑-附加功能-用于所有项目-移动开关”统一勾选全部行项目,随后用 MB23 抽查几条确认 M 已置上。需求日期和发货日期距离过大的,先调整需求日期或让仓库等待临近窗口,不要强行修改表数据跳过检查。
6. 用预留底表做验证:RKPF/RESB 反查预留数与超限控制
6.1 RKPF 与 RESB:凭证头和行项目的分工
预留的前台查询只适合少量数据,真正做月度核对或报表开发,重心在底表。预留凭证头存在 RKPF,行项目存在 RESB,两张表通过预留号 RS 号关联。要统计某物料在某工厂一共被多少条预留占用数量和已发货量,直接读 RESB 的行项目数据即可,不用先查头表。RKPF 主要负责存放凭证级别的属性,比如创建日期、创建者、凭证抬头文本;数量的计算全部落在 RESB 上,这是做开发前必须分清的分工。
6.2 一段可复用的 ABAP 查询:从 RESB 反查预留占用
下面这段查询示例可以在 SE38 里直接运行,入参是工厂和物料,输出未删除预留的行项目及数量。
SELECT resb~rsnum " 预留号 resb~rspos " 行项目号 resb~matnr " 物料号 resb~werks " 工厂 resb~bdmng " 原始需求数量 resb~enmng " 已提货数量 resb~shkzg " 发货/收货标识 FROM resb INTO TABLE @DATA(lt_resb) WHERE resb~werks = @p_werks AND resb~matnr = @p_matnr AND resb~kzear = ''.逻辑说明:查询条件是工厂和物料,过滤掉已删除的预留行(kzear 空值)。bdmng 是预留的原始需求数量,enmng 是已经发货的数量,两者相减就是这条预留尚未发出的数量,也是仍然占用可用库存的部分。shkzg 用来区分正常投料和退货,通常取空值或 H。
参数说明:p_werks 和 p_matnr 是自定义选择屏幕参数,可以在程序里声明为 PARAMETERS;kzear 是删除标识字段,SAP 标记为删除的行不会物理消失,但不应参与可用量计算。enmng 在个别转储场景可能包含其他来源的收货数量,做报表核对时要注意区分,不能直接把 enmng 全部当作已发货量。数据库迁移到 HANA 后也可以用 SQL 汇总,但 ABAP 报表走 Open SQL 兼容性更稳,调试和传输都方便。
6.3 预留数不超过库存数的验证思路
“预留数不能超过库存数”这个约束,业务上靠可用性检查落地,不在数据库层面做硬校验。验证步骤是:先确认物料主档 MRP3 的可用性检查字段,再看 SPRO 动态可用性检查规则,然后 MB21 创建一条超过可用库存的预留测试规则是否生效。测试时选一张不重要的物料,避免影响正式 MRP 运算。从那以后我每次新工厂上线,都强制把 OPL8、MBVR 变式、可用性检查和 RESB 校验走一遍再放给用户用;月结前也习惯拉一次预留占用与可用库存的对比表,把超限记录逐条处理掉,希望帮到你。
本文还有配套的精品资源,点击获取