惯例闲话:2024年在不知不自觉中已经到来,之前闲人也聊起过2023年是忙碌和收获的一年。今年的任务初步排一下,也基本上排到年底去了,又会是忙碌的一年。虽然忙碌,但是今年对于自己而言,有更加重要的事情要去做,闲人和朋友一起合作,计划要做一件有价值的事,给自己这些年从业SAP做一次总结和回顾。虽然前路曲折,但已经迈开第一步,希望能坚持下去。
闲话到此为止,这次借着开发项目库存周转率分析功能,和大家聊聊项目物料移动中,2个WBS所代表的意义。
项目库存
项目库存移动,操作角度,相比通用库存,需要多录入WBS和Q特殊库存标识,这是对项目库存移动较为常见的理解。
从数据结构的角度来看,则是增加了WBS的维度。这也容易理解,从SAP的项目库存设计来看,也验证了这一观点。可以看到MSRP实时库存表、QBEW项目库存评估表中,特殊库存标识和WBS作为主键。
从2张表可以看出,对于项目库存,SAP把物料编码+WBS作为一个独立的对象来管理,库存数量、金额都属性作为重要信息,也是很多项目企业的内部管理报表中需要提取的。这些年的项目实践经验中,很多顾问对这类应用很熟悉,以上,似乎并没什么特别。如果这是最终结论,那么项目库存的故事也差不多到这里可以结束了。
后续的故事来源于一个常见而难以实现的需求——按项目分析库存周转率。业务部门需求如下:物料入库原材料库后,从原材料到线边仓,从线边仓反冲消耗,这2个环节均要分析库存周转率。周转率报表的实现在于2个要点:
1、周转率的分析维度
2、历史期初、期末库存的记录。
项目库存的复杂度
但是任何对象增加作为一个独立维度,那么复杂度也同时上升一个数量级。对于项目库存的入和出,不同的移动类型产生的,有由于增加了WBS维度,显而易见的变化是,库存条目的数量级将呈现几何级的增加。所以,为何在SAP之前的R3,ECC时代中没有标准的项目库存周转率报表的原因之一。在S4时代,系统性能大幅度上升的时代,我们则可以考虑在系统去实现。不过这不是本文的重点,还是回到我们要说的主题,物料移动的WBS。这是库存周转等相关库存分析的源头。
当增加了WBS维度之后,出入库发生数来源则出现了不同于通用库存之外的情况,典型的415转WBS。
如上图,通过415Q移动类型,P001-A库存+1个,P001-B库存-1个。此类业务对应项目型企业中常见的物料在不同项目间的借料场景。
其他的如411项目转通用,412通用转项目库存,都会对WBS库存产生波动。这就产生了2个WBS。从MSEG表中可以看到这2个WBS字段存在,这就是我们今天要闲谈的主题,这2个WBS代表的意义。
MSEG-PS_PSP_PNR
MSEG-MAT_PSPNR
不同移动类型下WBS赋值特点
我们挑几个比较典型意义的移动类型来看
1、311Q,项目库存在不同库存地点调拨
可以看到MSEG-PS_PSP_PNR = MSEG-MAT_PSPNR
这里为了便于说明可能问题实质,业财一体化,把转出作为贷方,转入作为借方,和财务概念统一起来
311Q看不出太多的特殊点,和通用库存移库类似,只是需要指定贷方的WBS。思考一个问题,借方WBS和贷方WBS不一一样,311Q为何不能实现实现一步法既转库又转WBS?
2、415Q,项目库存在不同WBS的调拨,用于项目间的借料
以上凭证生成后,
1520139423A028库存减少600PC
1520139423A023库存增加600PC
415会产生财务凭证,说明产生了价值的转移
再看财务凭证表BSEG,只有一个字段PROJK是存WBS。这个就很容易理解,借贷方分开不同行,一个字段就可以表示借贷方。
这里也体现出来,SAP的财务和后勤的底层设计思路的区别,BSEG的这种结构来说,更为简洁,但是MSEG同一行既有转出(贷方)和转入(借方)对象信息,这说明后勤底层设计需要考虑到前端操作影响。由于SAP内核是业财集成,业务产生财务,所以财务无需注重底表设计对操作的影响,更为简洁。
再回顾第一个问题,为何311Q不能实现一步法转WBS+转库。原因就在这个地方,311不产生财务凭证,借贷方WBS不一致会发生价值转移必然会产生财务凭证,两者就冲突了。所以311Q不允许转WBS。
注意下右边有一已分配WBS要素,思考下这个地方是在哪种场景下使用?
3、411Q,项目库存转通用库存,一般用于项目关闭前,清理项目余料,有用余料调拨到通用物资,作为备料使用。
从凭证项上分析,
1)贷方行特殊库存标识=Q,MSEG-PS_PSP_PNR = 空,MSEG-MAT_PSPNR = 1520137171A024
2)借方行特殊库存标识=空,MSEG-PS_PSP_PNR = 1520137171A024,MSEG-MAT_PSPNR = 空
产生财务凭证,财务凭证的借贷方的WBS显示正确。这个地方就很有意思了,如果要计算项目库存周转率,库存WBS如何判断,到底取哪一个?从这个场景上看,我们应该取MSEG-MAT_PSPNR,但是否适用全部移动类型,这里先保留结论。
实际操作中发现,411Q还支持一步法转物料号+通用。
下列凭证说明了一次操作将项目库存410000000000010572 WBS 1520141750A023转为通用库存402300000000000124。产生财务凭证
4、412,通用库存转项目库存,一般用于通用材料给项目备料,提前锁定库存,平衡利库。
412和411Q互为逆向移动类型。
注意前台的显示的差异,右边显示贷方,左边显示借方
从凭证项上分析,
1)贷方行特殊库存标识=空,MSEG-PS_PSP_PNR = 1520142020A020,MSEG-MAT_PSPNR = 空
2)借方行特殊库存标识=Q,MSEG-PS_PSP_PNR = 空,MSEG-MAT_PSPNR = 1520142020A020
产生财务凭证,财务凭证的借贷方的WBS显示正确。
通过411和412,周转库存WBS如何判断已经有结论,取MSEG-MAT_PSPNR。注意这个结论,这个对报表开发具有重要意义。
5、541Q项目库存标准外协发料。特殊库存外发加工。
541Q移动类型,注意S4版本才能支持,ECC不支持。
从凭证项上分析,
1)贷方行特殊库存标识=Q,MSEG-PS_PSP_PNR = 1520140091A,MSEG-MAT_PSPNR = 1520140091A
2)借方行特殊库存标识=R,MSEG-PS_PSP_PNR = 1520140091A,MSEG-MAT_PSPNR = 1520140091A
不产生财务凭证
R库存,可以在底表MSRD中查询到,前台则需要用事务码MBLB查看
这里更加验证了转出和转入库存WBS字段取MSEG-MAT_PSPNR。
6、221将库存直接消耗到项目上。这里可分为221Q项目库存消耗和221通用库存消耗,分别在检验下。
案例中的Z21是从221复制移动类型,性质相同。
1)221Q
再从财务凭证看
这里的MSEG-MAT_PSPNR意义和上面意义一样,表示贷方的库存WBS,但是由于是消耗,进入了损益,
MSEG-PS_PSP_PNR则表示了成本对象。这又是一个关键点。我们在结合下一个211消耗通用库存来理解。
2)221将通用材料消耗到项目
凭证行地点,WBS为空
通过221移动类型小结,MSEG-PS_PSP_PNR必须是成本对象,用来承载物料移动产生财务凭证借方数据
总结:
物料凭证MSEG-MAT_PSPNR存贷方WBS、MSEG-PS_PSP_PNR存借方WBS
搞清楚了这个原理,常用的BAPI_GOODSMVT_CREATE的参数赋值就很清晰了
参数
BAPI2017_GM_ITEM_CREATE-WBS_ELEM 对应 MSEG-PS_PSP_PNR
BAPI2017_GM_ITEM_CREATE-VAL_WBS_ELEM 对应 MSEG-MAT_PSPNR
项目库存周转设计思路
理清楚以上项目库存的移动中WBS赋值特点,那对于按项目统计库存周转就可以使用SAP标准表来取数。
数据表主键设计
按物料、工厂、WBS、库存地点、年度、月份
通过程序抽取物料凭证写入表,完成周转率数据的基表。
贴一段简单代码,从MSEG表中获取数据后,按照以上主键做collect
SELECTMBEW~BWKEY,MARA~MATNR,MARA~MATKL,MARA~ZGGZL,MARA~ZGGMJ,MARA~MEINS,MBEW~VPRSV,MBEW~STPRS,MBEW~VERPR,MBEW~LBKUM"当前库存
FROM MARA
INNER JOIN MBEW ON MBEW~MATNR = MARA~MATNR
INNER JOIN @LT_MATNR AS A1 ON A1~MATNR = MBEW~MATNR
INTO TABLE @DATA(LT_PRICE_MBEW).SORT LT_PRICE_MBEW BY BWKEY MATNR.CLEAR:LS_ZTMM_QBEWH_N,LT_ZTMM_QBEWH_N[].LOOP AT LT_MSEG INTO LS_MSEG.LV_BUDAT = LS_MSEG-BUDAT_MKPF.LS_ZTMM_QBEWH_N-MATNR = LS_MSEG-MATNR."物料号LS_ZTMM_QBEWH_N-WERKS = LS_MSEG-WERKS."工厂LS_ZTMM_QBEWH_N-LGORT = LS_MSEG-LGORT."库存地点LS_ZTMM_QBEWH_N-PSPNR = LS_MSEG-MAT_PSPNR."出入WBSLS_ZTMM_QBEWH_N-LFGJA = LS_MSEG-MJAHR."年度LS_ZTMM_QBEWH_N-LFMON = LS_MSEG-BUDAT_MKPF+4(2)."过账月LS_ZTMM_QBEWH_N-MEINS = LS_MSEG-MEINS."单位IF LS_MSEG-SHKZG = 'H'.LS_ZTMM_QBEWH_N-MENGE_H = LS_MSEG-MENGE."货物移动数量,移出ELSEIF LS_MSEG-SHKZG = 'S'.LS_ZTMM_QBEWH_N-MENGE_S = LS_MSEG-MENGE."货物移动数量,移入ENDIF.COLLECT LS_ZTMM_QBEWH_N INTO LT_ZTMM_QBEWH_N.CLEAR:LS_ZTMM_QBEWH_N.ENDLOOP.
其中一赋值语句 LS_ZTMM_QBEWH_N-PSPNR = LS_MSEG-MAT_PSPNR."出入WBS,就是根据以上结论。否则,各种场景下的逻辑判断,极其影响程序的效率。
本文简单提一下,后续再分享项目库存周转开发过程。