简介:围绕SAP MM模块库存调拨与发货流程整理的文档型学习资料,面向已具备一定SAP基础、需要系统梳理库存转移与后台配置逻辑的MM顾问、仓储及供应链业务人员。内容以移动类型为主线,覆盖库存地点之间的一步转储311、二步转储313/315及在途库存查询,工厂间301/303/305转储与转储订单、MRP影响,兼顾309物料到物料和MB1B库存状态转变,并延伸到采购订单凭证类型、工厂装运数据、SD与MM实现差异等后台设置。资源包共1个docx文件,大小约2.25MB,便于集中查阅、离线留存和按主题检索。已有1522人学习,适合作为流程对照、配置排查和知识查漏的参考材料,可帮助读者理清不同转储场景下的移动类型选择、库存查询方式及后台参数之间的关系,也可用于日常业务沟通前的要点复核。
1. 库存调拨的本质:一次由移动类型驱动的库存状态迁移
库存调拨在 SAP 里看起来是最朴素的一个动作:把物料从 A 挪到 B。真正让实施顾问头疼的,恰恰是“挪”这个字背后的一整套状态机——库存去了哪里、什么时候算到账、MRP 有没有看见、财务科目走哪一边。有人把 MB1B 当成一个改库存的按钮按下去,账面平了,业务对不上。库存调拨的底层不是“搬货”,而是一次有凭证、有方向、有时点的库存状态迁移,移动类型(Movement Type)就是这套迁移规则的最小配置单元。搞懂移动类型怎么决定借贷方向、二步转储为什么必须造出一个“在途库存”的中间态、工厂间转储为什么不能一步 301 了事,再回头看你手里的 MB1B,它就不再是一个黑匣子。
2. 一步转储与二步转储:在途库存为什么必须存在
2.1 311 的账务路径:一个凭证、两行、同时生效
先说一步转储。MB1B 输入 311,源存储地 A、目标存储地 B,数量 90。过账后系统生成一个物料凭证(Material Document),抬头是 MKPF,行项目是 MSEG。要看清这次过账到底改了什么,最直接的办法是把凭证行拉出来:
SELECT MBLNR, -- 物料凭证号 MJAHR, -- 凭证年度 ZEILE, -- 行号 BWART, -- 移动类型 MATNR, -- 物料 WERKS, -- 工厂 LGORT, -- 存储地点 UMWRK, -- 接收工厂 UMLGO, -- 接收存储地点 MENGE, -- 数量 SHKZG -- 借贷标识:S=入库(+),H=出库(-) FROM MSEG WHERE MBLNR = '4900000001' ORDER BY ZEILE;对于 311,这个凭证里通常有两行:一行 SHKZG='H',WERKS='1000'、LGORT='0001',表示从 A 扣;另一行 SHKZG='S',WERKS='1000'、LGORT='0002',表示加到 B。两行在同一个凭证里,同一个过账日期,同一时刻生效。
参数说明:BWART 是移动类型,决定了库存更新规则、科目分配和屏幕字段;SHKZG 是借贷标识,S 在库存语境下表示增加,H 表示减少;WERKS 和 LGORT 是发出方,UMWRK 和 UMLGO 是接收方,后者只在转储类移动类型里才有值。
一步的代价在于“同时”这两个字。系统里库存已经到了 B,实物可能还在路上。如果两个存储地跨楼层、跨厂区,盘点的时候 B 的账上有货、现场没有,这就是典型的账实不符。更麻烦的是接收方如果急着发货,系统显示有库存,仓库却拿不出来,销售订单的交期承诺直接翻车。
2.2 313 与 315:库存所有权没变,但位置已经悬空
二步转储解决的就是这个时间差。313 发货,315 收货,中间隔着一个“在途库存”(Stock in Transit)。
313 过账时,系统做两件事:从 A 的非限制库存里扣掉 10 个;把这 10 个记到“在途”这个逻辑容器里,方向是接收存储地 B。注意,这 10 个既不在 A 的非限制里,也不在 B 的非限制里,但它的所有权还在企业内部,没有被消耗掉。315 过账时,在途转成 B 的非限制库存,这批物料才算真正到货。
用 BAPI 走一遍 313,可以看清参数是怎么落到表里的:
DATA: ls_header TYPE bapi2017_gm_head_01, ls_code TYPE bapi2017_gm_code, lt_item TYPE TABLE OF bapi2017_gm_item_create, lt_return TYPE TABLE OF bapiret2. ls_code-gm_code = '04'. " 04 = 转储/调拨类移动 ls_header-pstng_date = sy-datum. " 过账日期 ls_header-doc_date = sy-datum. " 凭证日期 APPEND VALUE #( material = 'MAT-001' " 物料号 plant = '1000' " 发出工厂 stge_loc = '0001' " 发出存储地 move_type = '313' " 313 = 两步转储的发货 entry_qnt = 10 " 数量 entry_uom = 'PC' " 单位 move_plant = '1000' " 接收工厂 move_stloc = '0002' ) " 接收存储地 TO lt_item. CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING goodsmvt_header = ls_header goodsmvt_code = ls_code TABLES goodsmvt_item = lt_item return = lt_return.GM_CODE 填 '04' 对应 MB1B 这一类转储过账;MOVE_PLANT 和 MOVE_STLOC 是关键,它们告诉系统“在途要挂到哪个接收方名下”。如果不填这两个字段,313 就不知道货发往哪里,在途库存无处安放,后续 315 也没法对应。这也解释了一个常见现象:313 过账成功,但 MMBE 在接收方看不到在途,多半是接收方维度没填对。
在途库存的本质是一个逻辑容器。它存在的原因是物理时间和账面时间不一致:货物在路上,所有权没转移,会计上不能确认接收方入库,但发出方又已经出库。如果没有这个容器,要么发出方不敢扣库存、账面虚高,要么接收方提前入账、账面虚低。二步转储把这个矛盾显式化,让系统承认“有一批货正在路上”。
为什么不用 311 加一张手工台账?因为台账不参与 MRP。311 做完,A 的库存少了、B 的多了,MRP 立刻认为 B 有货可用,采购建议被冲掉;而实物还没到,生产计划拿到的是一个空头承诺。二步转储把在途变成系统可见的库存类型,MRP 才能正确地把它当成“即将到货的供给”而不是“现有库存”。
2.3 MMBE、MB52、MB5T 三张报表的分工
库存查询最容易被误用的地方,是把三张报表当成同一件事。
MMBE 是单物料的库存全景。按工厂、存储地点、批次、特殊库存类型逐层展开,能看到非限制、质检、冻结、在途、寄售等所有库存类型,底层读的是存储地点库存、批次库存、特殊库存这些表。查一个物料“到底有多少、都在什么状态”,看 MMBE。
MB52 是按存储地点的库存清单,可以一次查多个物料,输出的是现货视角。它默认展示非限制库存,在途、冻结、质检通常不在默认选择里。所以用 MB52 查二步转储的在途,查不到是正常的——不是发货没成功,而是这张报表本来就不看那个维度。
MB5T 是跨工厂在途库存的专用报表。工厂 A 转到工厂 B,313 已发货、315 未收货,这段在途在 MB5T 里能看到。它的数据来源不是存储地点库存表,而是转储单的发货记录与收货记录的差额。同一工厂内 A 存储地到 B 存储地的在途,MB5T 不管,得用 MMBE 看接收存储地的在途行。
三张表的分工可以这样记:MMBE 看状态全貌,MB52 看可用现货,MB5T 看跨厂在途。查库存调拨的结果,先想清楚要看哪个维度,再选报表,否则很容易得出“货丢了”的错误结论。
注意:MB52 查不到量,不代表库存不存在。先确认查询口径,再怀疑过账。
3. 工厂间转储:301 为什么是最该被约束的移动类型
3.1
本文还有配套的精品资源,点击获取