☰
SAP MB1B库存调拨:移动类型、二步转储与在途库存对账
2026/10/31 3:38:33 网站建设 项目流程

简介:围绕SAP MM模块库存调拨与发货流程的实操文档,面向SAP顾问、库存与仓储管理人员及MM初学者,用于理清一步转储、二步转储及工厂间调拨的业务差异与后台配置要点。内容以MB1B为主线,覆盖311库存地直转、313/315二步转储与在途库存、301/303/305工厂间转储,并延伸至309物料到物料、344/343状态转变,同时说明MMBE、MB52、MB5T的查询场景及转储订单对MRP运算的影响。资源包仅含1个docx,大小约2.25MB,便于集中阅读和按主题检索,适合作为流程梳理与配置对照的案头资料。已有1522人学习,文档结合事务代码、后台凭证类型、SD装运数据与UB配置等细节,可帮助读者快速建立从业务操作到后台参数的完整认知,减少调拨发货环节的配置盲区。

1. 90 个只到账 80 个:MB1B 里那 10 个库存去哪了

第一次在生产账套里做库存调拨,是 A 库存地的 90 个半成品转到 B 库存地。转出侧一次减掉 90,转入侧只到账 80,剩下 10 个在 MB52 的任何一行库存地里都翻不出来。当时第一反应是过账错了,回头把物料凭证打开才明白:那 10 个没丢,它们卡在 313 发货和 315 收货之间,属于在途库存,只存在于 MMBE 和 MB5T 里,任何一个库存地都查不到。

MB1B 下面那一串 311、313、315、301、303、305、309 不是编号游戏。选哪一个,决定了库存是不是要在半路上停一手、MRP 要不要认这笔供应、价差会不会被记进科目。这篇按「移动类型怎么选 → 二步转储怎么跑 → 工厂间转储订单怎么配 → 对不上账怎么查」的顺序拆开讲,能照着复现。

2. 移动类型选型:311、313/315、301、303/305 各自动了哪张表

2.1 一步与二步的账务差别:数 MSEG 的行数

判断一笔调拨是几步骤,最快的办法不是看前台界面,而是看 MSEG 里这张凭证有几行。MSEG 是物料凭证的行项目表,一笔过账在这里留下几行、每行的借贷标识是什么,比任何文档都直观。常用的几个字段值得背下来:MBLNR(物料凭证号)、MJAHR(年度)、ZEILE(行号)、BWART(移动类型)、SHKZG(借贷标识)、MENGE(数量)、MATNR(物料)、WERKS/LGORT(转出工厂/库存地点)、UMWRK/UMLGO(接收工厂/库存地点)、UMMAT(接收物料,309 用)。

一步转储的典型特征是同一张物料凭证里两行。311 转储时,你会看到一行 SHKZG = 'S' 表示从 A 库存地发出,紧接着一行 SHKZG = 'H' 表示 B 库存地接收,两行数量相等、方向相抵,一提交库存就整体搬完了,中间没有任何空档。这种结构的好处是账实永远同步,坏处是没有中间态可用,一旦货在半路上出事,系统里查不到任何痕迹。

二步转储正好相反,是两张凭证、各行一行。第一张凭证只有 S 行(313 发货,或 303 工厂间发货),此时转出方库存已经扣了,但接收方一分钱没加;第二张凭证只有 H 行(315 收货,或 305 收货),这时接收方才真正拿到货。两张凭证之间的这段时间差,就是「在途库存」的全部含义。它不是一张实体表里的一条记录,而是转出已扣、转入未加的差额,系统用这个差额算出来的。

为什么要把简单的事情拆成两步?因为现实里的货确实要在路上走。跨库区搬运、跨厂区运输、甚至跨城市调拨,实物不可能瞬移。如果强行用一步过账,转出方账上已经没了,货却还在车上,盘点必炸;接收方账上已经加了,货没到,车间按账领料就会扑空。二步转储的价值就在于把「责任在谁手上」这件事记进系统:313 过完,货算转出方的在途责任;315 过完,责任才转移到接收方。这是流程设计,不是技术炫技。

提示:判断一张历史凭证是一步还是二步,直接 MB03 打开看行数最快。两行同现在一张凭证里是一步,只有一行 S 或一行 H,说明它还有配对的另一半要在 MB51 里按物料和日期捞。

2.2 六个场景的移动类型对照:别在 313 上做 311 的事

移动类型选错是这块最常见的翻车点,而且错得往往很隐蔽——单张凭证能过,库存也动了,只有到月底对账或者 MRP 跑需求时才暴露。下面这张表是我自己贴在工位上的版本,按业务场景倒查移动类型,比背 SAP 菜单靠谱。

业务场景发货类型收货类型是否产生在途是否跨工厂关键注意点
同工厂内库存地互转,货直接到位311同凭证内完成否否接收库存地点必填,否则报「输入接收库存地点」
同工厂内库存地互转,货要在路上走313315 或 MIGO是否在途不进任何库存地,只能用 MMBE 查
工厂间调拨,一次到位301同凭证内完成否是接收工厂必填,且不传递 MRP 需求
工厂间调拨,分两段走303305 或 MIGO是是在途用 MB5T 查,MB52 看不到
物料号发生变化(同物不同编码)309同凭证内完成否可同厂可跨厂两边移动平均价不同会产生价差
库存状态转换(可用/冻结/质检)344 / 343 等同凭证内完成否否只改状态不改数量,不影响总库存

这张表里最容易出问题的是 311 和 313 的混用。有些场景需求方觉得「反正都是同一个工厂里换个库存地,走 311 一步到位多省事」,结果库房实际搬运要两天,第一天过完账转出地已经清零,实物还在货架上,第二天盘点直接对不上。反过来也有把 311 该干的事拆成 313+315 的,凭空多出一笔在途,月末还得专门去清。

301 和 303/305 的取舍逻辑一样,但多了一层组织维度的考量。301 一步过账意味着两个工厂的库存同时变动,谁也没法说「货在途中不归我管」;303/305 则把发货厂和收货厂的责任切开,发货厂 303 一过就完成了自己的动作,收货厂 305 没做之前,这批货在两边工厂的可用库存里都不存在。对于有内部结算关系的两个工厂,这个区分直接影响月底的内部对账口径。

309 要单独说一句。它不是「换个库存地」,而是换物料号,MSEG 里看 UMMAT 字段就能认出来。原物料和目标物料的移动平均价往往不同,过账瞬间差额就要进价差科目。所以原文里那句「一般不建议采用此方式」不是保守,是血泪经验——省下来的操作时间,月底财务对差异的时候要加倍还回去。

2.3 301 与 309 的隐性代价:MRP 需求和移动平均价

301 最容易被低估的问题是它跟 MRP 的关系。库存从 A 工厂搬到 B 工厂,A 的库存降了、B 的库存升了,账面看没问题,但 MRP 运算时的逻辑是:A 工厂少了这批库存,下一轮运算可能直接给 A 下新的采购申请或生产订单;B 工厂多了这批库存,但如果 B 的需求本来就在途,可能出现重复供应。原因在于 301 只是一次库存归属变更,它不生成任何「供应承诺」单据,MRP 看不到「A 答应给 B 一批货」这件事。

这正是工厂间转储要用转储订单(STO)的根本理由。转储订单本质是一张采购订单(EKKO/EKPO,凭证类别 F),只不过供货方是内部工厂而不是外部供应商。它在收货工厂那边生成一条采购需求,参与 MRP 运算,供货工厂因此知道「未来要交这批货」,会提前备料或者调整生产。301 做不到这一点,它是账务动作,不是计划动作。如果贵司的工厂间调拨频率高、批量大,长期用 301 攒下来的 MRP 偏差会非常难清。

309 的代价则落在价值上。移动平均价(V 价)的物料,库存价值 = 总金额 / 总数量,一旦把低价物料转成高价物料,或者反过来,差额必须找科目接住。标准价(S 价)物料稍好一些,价差进差异科目,但同样要在月结时解释。我在一个项目里见过因为频繁用 309 做包装规格切换,导致某物料的价格长期偏离实际采购价,最后不得不做一次彻底的价格重估。能用 BOM 或者 separate 物料号解决的,就别用 309 硬转。

至于 344、343 这类状态转换,理解成本最低:它们不改变数量,只改变这批库存在系统里属于「非限制使用」「冻结」「质检」中的哪一档。MMBE 里这几档是分列显示的,所以过完 344 之后你会看到非限制那一列减少、冻结那一列增加,总库存纹丝不动。新手容易在这里误判成「库存没变化,是不是没成功」,其实过账是成功的,只是看错了列。

3. 二步转储实操:313 发货、MIGO 收货与在途库存的三条查看链路

3.1 313 发货的界面路径与六个必填字段

313 的前台路径很固定:MB1B 输入移动类型 313,回车后进入转储过账界面。界面上要填的东西不多,但每一个都有实际约束,少一个就过不去。

第一步是抬头信息:过账日期、凭证日期、抬头文本。抬头文本别偷懒,写清楚「A001 → B001 半成品调拨」这类信息,后面 MB51 里按文本筛选能救命。第二步是行项目,这里六个字段是硬性的:

  1. 物料号:必须是有库存的物料,且在你填的转出工厂/库存地点下确实有可用库存,否则报「库存不足」。
  2. 数量与单位:数量填正数,单位用基本计量单位或订单单位,混用会导致后续报表单位不统一。
  3. 工厂:转出工厂。
  4. 库存地点:转出库存地点,这是被扣减的那一侧。
  5. 接收库存地点:313 里这个字段是必须的,系统要提前知道货最终去哪,才能算在途归到哪条线上。
  6. 批次:批次管理的物料必须指定,否则报「批次是必输项」。

填完检查界面右下角的行项目状态灯,绿色才允许保存。保存后系统给出物料凭证号,记下这个号,收货环节要用它。

注意:313 过账后如果发现填错了接收库存地点,不能直接改凭证。标准做法是先用 314 冲销这笔 313(MBST 冲销物料凭证也可以),再重新过一笔正确的。别想着「反正后面 315 能改」,315 只能按 313 已经指定的接收地点收货。

3.2 315 与 MIGO 参照收货:什么场景必须走 MIGO

收货有两条路:MB1B 直接敲 315,或者 MIGO 参照物料凭证收货。功能上两条路都能把在途清掉,但适用场景差别不小。

MB1B + 315 是手工模式:输入 315,填物料、数量、接收工厂/库存地点,系统做一次 H 方向的过账。它的好处是快,适合数量整齐、没有批次和序列号管理的简单物料。问题也明显——数量靠人手填,跟 313 那笔对不上系统不会拦,90 个发出去、85 个收进来,剩下的 5 个变成永远清不掉的在途尾差。

MIGO 参照收货则把 313 的凭证号带进来,物料、数量、批次、接收地点全部自动带出,操作人只需要确认或者按实际到货数量改。标准的操作序列是:MIGO → 选择「物料凭证」作为参照对象 → 填入 313 的凭证号和年度 → 系统展开行项目 → 核对数量 → 勾选行 → 过账。在批次管理、序列号管理、包装单元(HU)场景下,MIGO 几乎是唯一靠谱的选择,因为它能带出批次拆分和序列号分配界面,MB1B 315 做不了这个。

实际操作里我一般建议:只要 313 涉及批次、序列号或者一次发多个行项目,收货一律走 MIGO。手工 315 留给那种一物一码、数量规整、没有追溯要求的场景,否则后面查批次流向的时候会非常痛苦。

3.3 批量过账:BAPI_GOODSMVT_CREATE 字段映射与返回码处理

调拨量大的时候,前台一笔一笔敲不现实。标准做法是用 BAPI_GOODSMVT_CREATE 做批量过账,它对应 MB1B 的底层过账逻辑,313、315、311、301 都能走。

DATA: ls_header TYPE bapi2017_gm_head_01, ls_code TYPE bapi2017_gm_code, ls_item TYPE bapi2017_gm_item_create, lt_item TYPE TABLE OF bapi2017_gm_item_create, ls_headret TYPE bapi2017_gm_head_ret, lt_return TYPE TABLE OF bapiret2. ls_header-pstng_date = sy-datum. ls_header-doc_date = sy-datum. ls_header-header_txt = 'A001->B001 313发货'. ls_code-gm_code = '04'. " 04 对应 MB1B 转储过账 ls_item-material = 'MAT-1001'. ls_item-plant = '1000'. " 转出工厂 ls_item-stge_loc = 'A001'. " 转出库存地点 ls_item-move_type = '313'. ls_item-entry_qnt = 90. ls_item-entry_uom = 'PC'. ls_item-move_stloc = 'B001'. " 接收库存地点,跨工厂时还要填 MOVE_PLANT ls_item-batch = 'B240901'. APPEND ls_item TO lt_item. CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING goodsmvt_header = ls_header goodsmvt_code = ls_code IMPORTING goodsmvt_headret = ls_headret TABLES goodsmvt_item = lt_item return = lt_return. READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type = 'E'. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. " ls_headret-materialdocument / matdocumentyear 就是物料凭证号和年度 ENDIF.

这段代码有三个点必须说清楚。GM_CODE = '04'是固定映射,对应 MB1B 那张界面,填成 '01'(对应 MB01 收货)会直接过不了。MOVE_STLOC是接收库存地点,走 311/313 必须填;如果是跨工厂的 303/301,还要补MOVE_PLANT填接收工厂,少填就报「输入接收工厂」。最后,COMMIT 必须带WAIT = 'X',不带的话提交是异步的,紧接着去查 MMBE 可能查不到刚过的账,会误以为自己写错了。

返回处理上,LT_RETURN里只要出现 TYPE = 'E' 就必须 ROLLBACK,不能只看 BAPI 的返回结构体,因为部分行项目失败时整体调用仍可能返回成功。批量场景建议一行一个 BAPI 调用,而不是一个调用塞几十行,这样单行失败能定位到具体哪一行物料,回滚粒度也更好控制。

3.4 MMBE、MB52、MB5T 的分工:查不到在途多半是用错了码

这三个事务码看起来都是「查库存」,实际覆盖的范围完全不同,混用就是自找麻烦。

事务码查什么能不能看在途典型用途
MMBE单个物料在指定工厂/库存地点下的库存总览,含非限制、质检、冻结、在途各档能,在途单独一行单物料查账、确认 313 之后在途挂没挂上
MB52按工厂/库存地点批量列库存清单不能,只列实际存放的库存月末盘点、批量核对库存分布
MB5T跨工厂转储的在途明细只能看在途303 之后确认在途金额和数量、清理长期挂账

那个「10 个库存凭空消失」的案例,根因就是用 MB52 去查二步转储。MB52 的定位是「哪个库存地点有多少实物库存」,在途货物不存放在任何库存地点,自然不会出现在结果里。要确认 313 之后的在途,用 MMBE 看该物料在转出工厂那一行的在途档,或者用 MB5T 按物料和工厂对查。

4. 工厂间转储订单:NB/UB 凭证类型与「定义工厂的装运数据」两处配置

4.1 分配凭证类型到工厂/供货工厂:NB 与 UB 的取舍

转储订单要能建出来,前提是后台做了凭证类型分配:告诉系统「1000 工厂向 2000 工厂要货时,默认用哪种采购订单类型」。配置路径在物料管理下的采购订单设置里,找到库存调拨订单相关的分配节点,维护工厂、供货工厂、订单类型三个字段的组合。

订单类型常见的有两个:NB 和 UB。NB 是标准采购订单类型,用它做转储订单也能跑通,缺点是它跟真正的对外采购混在一起,报表筛选时不好区分。UB 是专门给库存转储订单准备的类型,语义更干净,做查询和权限控制时更省事。原文里那个「UB 采购订单」的例子,就是走 UB 这条线,且不启用 SD 方式、不生成出货单的配置。

配置项典型值作用填错的表现
工厂1000收货方工厂建单时带不出默认类型,要手工改
供货工厂2000发货方工厂同上,且 MRP 供应关系错位
凭证类型NB 或 UB决定订单走的业务流程后续报表按类型筛选时数据混在一起

这张表看着简单,实际踩坑最多的是「工厂」和「供货工厂」写反。分配关系是收货工厂 → 供货工厂,不是反过来。写反之后单据能建,但 MRP 跑出来的需求方向是倒的,表现为「明明要往 B 厂调货,A 厂却在疯狂采购」。

4.2 装运数据里的工厂客户与一步转储勾选:出货单生成与否的分水岭

第二处配置是「定义工厂的装运数据」,这一处的两个字段直接决定业务形态,比第一处重要得多。

第一个字段是工厂客户。这个字段填了客户号,系统就认为这次工厂间转储要走 SD 流程,收货时会生成出货单(交货单),装运、拣配、发货过账这一整套就都进来了。不填,则走纯 MM 流程,只有物料凭证,没有出货单。原文里「UB 不采用 SD 方式,不生成出货单」说的就是这个:UB 类型的转储订单在装运数据里没填工厂客户,所以收货后不会冒出交货单。反过来,如果这里填了客户号,收完货系统里会多出一张出货单,需要有人去处理发货,流程长度翻倍。

第二个字段是一步转储的勾选框。勾上,转储一次完成,没有在途;不勾,就走二步,发货和收货分开,中间产生在途库存。这个勾选要和移动类型的选型一致:勾了一步,却指望用 303/305 造出在途,是不成立的;不勾一步,却直接用 301 想一次到位,也会被系统按两步逻辑处理。

装运数据字段留空填写/勾选
工厂客户纯 MM,不生成出货单走 SD,收货后生成交货单,需要装运处理
一步转储二步,产生在途,需要发货+收货两次操作一步,一次过账完成
转储单类型建单时手工选类型建单时自动带出默认类型

这两个字段的组合一共四种,实际项目里最常见的是「工厂客户留空 + 不勾一步」,也就是纯 MM 的二步转储,流程可控、不牵扯 SD 用户。什么时候需要填工厂客户?当两个工厂之间有正式的运输安排、需要出货单来驱动拣配和装运的时候。这时候多出来的流程不是负担,是必要的交接凭证。

4.3 351 与凭证编号范围:单据号跑到 4500 段怎么查

转储订单真正过账时,移动类型的选择跟有没有走 SD、是一步还是二步有直接关系。原文里那个「同一公司不同工厂一步转储,发货用 MB1B 351」的例子,说明在这套配置下,转储订单的转储过账用的是 351 这个移动类型,而不是普通的 301。351 属于转储订单场景的专用类型,它背后挂着采购订单号,过账时会回写到订单的收货历史里,这是 301 做不到的。

这里有个容易被忽略的细节:移动类型和订单类型、装运数据是一套联动的配置,不同项目里同一业务动作可能落到不同移动类型上。所以接手一个新账套时,别急着按记忆敲 351,先 MB51 捞一笔历史凭证,看这个客户的系统里实际用的是哪个类型,再照着做。这是最省事的做法,也是我认为最值得养成的习惯。

凭证编号范围的问题也出自这里。原文提到「系统未给转储单分配范围,所以为 4500」。现象是新建转储订单时,单据号不是预期的号段,而是落在 4500 开头的一段上。原因是订单类型对应的编号范围没有分配,或者分配了但区间被占满。排查顺序是:先看订单类型维护里的编号范围分配,再看该编号范围区间是否已存在大量未清单据把号段耗掉了。号段问题不影响业务逻辑,但会影响单据追溯——一批单子散在默认号段里,做报表时很容易漏掉。

4.4 STO 收货:MIGO 101 与 MB1B 351 的操作差异

转储订单的收货,常见两条路:MIGO 对采购订单收货(移动类型 101),或者 MB1B 用 351 做转储过账。区别在于前者是「对外采购收货」的标准逻辑套在内部转储上,后者是转储订单专用逻辑。

MIGO 101 的操作序列:MIGO → 参照对象选「采购订单」→ 输入转储订单号 → 系统带出订单行、物料、数量、收货工厂 → 确认数量 → 勾选行 → 过账。它会把收货记到订单的收货历史里,订单的已收数量随之更新,未清数量减少。好处是跟采购收货体验一致,用户培训成本低;坏处是如果装运数据里勾了一步转储,101 这一笔就同时完成了发出和接收,中间没有在途,发货工厂那边的库存是被动扣减的,容易出现「收货的人不知道自己在扣别人库存」的沟通问题。

MB1B 351 则更贴近转储语义,适合发货工厂主动发起、收货工厂确认的场景。它同样会回写订单收货历史,但因为走的是转储过账入口,业务人员理解成「调拨发货」比理解成「采购收货」自然得多。选哪条路,本质上是在「统一用户操作习惯」和「贴合业务流程语义」之间做权衡,没有绝对的对错,但一个账套里最好统一,别两种混着用——混用的后果是订单收货历史里两种来源交织,出问题时要花时间分辨。

5. 避坑排查:在途不平、MRP 不看单、价差入账的五种现场

5.1 在途类:313 发了货却查不到,MB52 永远看不见在途

现象:313 已经过账,物料凭证号也有了,但用 MB52 查转出和转入两个库存地点,加起来比调拨前少了 10 个,谁也不知道这 10 个在哪。

原因:MB52 只列实际存放在库存地点的库存,在途库存不归属任何库存地点,天然查不到。这不是数据丢了,是查询工具选错了。

解决:换 MMBE 查该物料在转出工厂那一行的「在途」档,或者用 MB5T 按物料加工厂对查。确认在途金额和数量与 313 凭证一致后,做 315 或者 MIGO 参照收货。要养成习惯:二步转储的中间状态只在 MMBE 和 MB5T 里,别拿 MB52 当万能钥匙。

现象升级版:MB5T 里能查到在途,但数量是 90,实际到货只有 85。这种情况多半是手工 315 填错了数量,且系统不校验。解决方式是先看 313 凭证的原始数量,再核 315 凭证,差额部分要么补收,要么做冲销重来。这类尾差如果长期不处理,会在 MB5T 里堆成历史包袱,年底清理非常费劲。

5.2 需求类:301 走完 MRP 像什么都没发生,收货工厂还在重复采购

现象:A 工厂往 B 工厂用 301 调了一大批库存,账面库存已经过去了,但下一轮 MRP 跑出来,B 工厂该物料仍然有采购申请,A 工厂反而在补货。两边都觉得莫名其妙。

原因:301 只做库存归属变更,不生成任何供应单据,MRP 看不到「A 已经答应给 B 这批货」。B 工厂按自己的需求算,自然继续下单;A 工厂按减少后的库存算,低于安全库存就补。这是移动类型选型的代价,不是 MRP 算错了。

解决:工厂间调拨改用转储订单。订单在收货工厂生成采购需求,参与 MRP,供货工厂的供应承诺也进系统。已经用 301 调过的库存没法追溯补单,只能在下一轮 MRP 之前用 MD04 手工核对两边的供需,把重复的采购申请删掉。这个坑一旦踩过,后面的项目里工厂间调拨我一律先问「走不走 STO」,不问清楚不动手。

配置类变种:转储订单建了、收货也做了,但 MRP 还是不看这张单。检查采购订单行项目里的「收货工厂」字段和凭证类型分配是否一致,以及订单有没有被标记为「不参与 MRP」相关的特殊标识。凭证类型写反是常见原因——收货工厂和供货工厂颠倒了,需求就跑到不该跑的那一边。

5.3 配置与价值类:STO 收完货冒出出货单、309 转出价差、状态转换看不出变化

现象一:转储订单收货之后,系统里多出一张出货单挂在 SD 那边,没人处理,一直挂到月底。原因:装运数据里填了工厂客户,系统判定这次转储走 SD 流程,出货单是必然产物。解决:如果业务上不需要出货单驱动的装运和拣配,把工厂客户字段清空,走纯 MM 流程;如果确实需要 SD,那就得把发货环节纳入流程,安排人处理出货单,不能让它自生自灭。

现象二:用 309 做了物料到物料的转储,库存数量对得上,但财务那边多出一笔价差凭证,月结时要解释。原因:两个物料的移动平均价不同,309 过账时差额必须进价差科目。解决:先确认这笔价差是不是业务上可接受的,金额小的走标准价差科目即可;金额大或者频繁发生的,应该考虑改用 BOM 或者统一物料号,从源头取消 309 的使用场景。我自己经手的一个项目就是因为包装规格切换频繁用 309,最后不得不做一次价格重估,代价比一开始就用两个物料号大得多。

现象三:用 344 把非限制库存转成冻结库存,过完账去 MMBE 一看,总库存数字没变,以为没成功,又过了一遍。原因:状态转换不改变数量,只改变库存在哪一档里。MMBE 里非限制、质检、冻结是分列的,总库存当然不变。解决:看 MMBE 的分列数字,非限制那一列减、冻结那一列加,就说明过账成功了。重复过账会造成冻结库存翻倍,冲销起来更麻烦。这条坑的本质是看错了报表列,不是系统问题。

6. 收账自检:三步对账法与一条按移动类型汇总的 ABAP

调拨做完不算完,真正省时间的是过完账立刻自检。我现在的习惯是三步,每步一分钟内能做完,能把上面九成的坑挡在外面。

第一步,查凭证行数。MB03 打开刚生成的物料凭证,看 MSEG 有几行。311、301、309 应该是一对 S/H 行,313、303 应该只有一行 S,315、305 应该只有一行 H。行数不对,说明移动类型或者过账逻辑选错了,立刻冲销重来,别留着过夜。

第二步,查在途是否清零。二步转储的场景,收货做完后立刻 MMBE 看转出工厂该物料的在途档,或者 MB5T 按物料对查。在途应该是 0。如果不是 0,说明还有未收完的尾差,当天就找出来处理掉。挂着过夜的在途,第二天就会被忘掉。

第三步,查两地净变化。用 MB52 查转出和转入两个库存地点该物料的库存,调拨前后的净变化量应该正好等于调拨数量。这一步能抓出「一步转储被误当二步做」或者「重复过账」这类问题。

三步之外,我会跑一段按移动类型汇总的查询,把一张凭证的收发数量相抵,看是否为 0。这段代码很轻,适合挂在自建的对账报表里:

SELECT bwart, SUM( CASE WHEN shkzg = 'S' THEN menge ELSE 0 END ) AS qty_out, SUM( CASE WHEN shkzg = 'H' THEN menge ELSE 0 END ) AS qty_in FROM mseg WHERE mblnr = @lv_mblnr AND mjahr = @lv_mjahr GROUP BY bwart INTO TABLE @DATA(lt_stat). " 311/301/309 期望:qty_out = qty_in " 313/303 期望:只有 qty_out,qty_in = 0 " 315/305 期望:只有 qty_in,qty_out = 0 LOOP AT lt_stat INTO DATA(ls_stat). WRITE: / ls_stat-bwart, ls_stat-qty_out, ls_stat-qty_in. ENDLOOP.

参数就三个:物料凭证号、年度、按移动类型分组。SHKZG = 'S' 是发出方向,'H' 是接收方向,两列相抵就是净效果。这段查询比 MM03 一页页翻快得多,尤其是批量调拨之后,一次能筛出所有方向异常的行。

提示:把这三步和这段查询做成一个 Z 事务码挂在收藏夹里,比记在笔记本上管用。人对自己的记忆力总是过于自信。

有一年年底清账,我在 MB5T 里翻出十几笔三个月前的在途,最早的一笔是六月发出去的,收货人换了岗,没人知道货去哪了,最后只能走盘亏。从那以后,我每次做完二步转储,都会在当天把 MMBE 的在途档截图存档,把它当成过账流程的一部分,而不是事后补救。这个习惯听起来笨,但确实帮我省掉了很多解释的功夫。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询