引用链接:https://blog.csdn.net/wbin9752/article/details/8608765#comments_2539308
为什么需要开发自定义的进销存报表
既然 SAP 有了 MB51,MB5B 等报表,既可以查实时库存,又可以查询历史期间的期初期末库存,还可以查询指定时间段内的收发货数量与金额,为什么很多企业里尤其是民营企业里还要开发自己的进销存报表呢?
首先是因为各个企业里有企业特殊需求。
优化后的进销存报表也是要显示期初余额,期初库存数量,入库数量与金额,出库数量与金额,期末数量与金额等栏位;同时对入库与出库,根据业务部门关注的重点做了几个细分,比如入库再细分采购入库,工单入库和其它入库;出库则再细分为销售出库,工单发料和其它出库。这些都是企业特定的需求,使用报表的业务部门尤其关注点,所以报表需要支持这些关注点。MB5B 报表对于这些需求的支持显然不太给力。
其次还因为企业还有特定行业要求。
由于产品所在行业的特殊性,业务部门除了关心出入库数量与金额以外,还关心出入库的面积与重量以及期初期末面积与重量。并且由于客户使用了可配置物料,这些物料的单个面积不固定,而是根据不同销售订单里相关长宽特性值的不同而不同。类似这种需求,标准的 MB5B 报表当然更是无法支持。
更重要的原因是,MB5B 报表里对于收发货数量与金额栏位的统计口径并不科学,不能满足企业常规的需求。比如其总收发货数量栏位值的计算逻辑,除了包括常规收发货数量以外,还包括收货的取消,采购订单退货的数量等。
SAP标准程序逻辑分析
MC.9 取数逻辑
MC.9 取数逻辑基于 S031 和 S032 两个信息结构可以取的某个月底库存数量金库存金额,其中 S032 表记录当前库存数量及金额,S031 表记录过去某个时间段的入库数量、金额及出库数量及金额,然后采用倒推方式计算出过去某个时点(按月)的库存数量及金额。

优点:如果查询数据量较小时,数据提取效率快且准确。
缺点:由于采用倒推方式,一旦查询数据量较大,查询时段如果有出入库操作,数据可能不准。
MB51 取数逻辑
MB51 查询某个时间段内出入库记录,基于 MKPF 和 MSEG 进行取数。
优点:能够准确查询某个时间段内出、入库记录。
缺点:MB51 不能记录价格修改、发票校验差异对存货价值影响,不能保持和总账一致。
select (g_t_fields)
into corresponding fields of table itab
from mkpf inner join mseg on mkpf~mandt = mseg~mandt
and mkpf~mblnr = mseg~mblnr
and mkpf~mjahr = mseg~mjahr
for all entries in matnr
where matnr = matnr-low
and MKPF~BUDAT in BUDAT
and MSEG~BWART in BWART
and MSEG~CHARG in CHARG
and MSEG~KUNNR in KUNNR
and MSEG~LGORT in LGORT
and MSEG~LIFNR in LIFNR
and MSEG~SOBKZ in SOBKZ
and MKPF~USNAM in USNAM
and MKPF~VGART in VGART
and MSEG~WERKS in WERKS
and MKPF~XBLNR in XBLNR
%_HINTS
ORACLE '&SUBSTITUTE VALUES&' .
MB5B 取数逻辑
MB5B 取数主要基于 MARD、MBEW、BSIM、MKPF、MSEG 这五张数据表,与 MC.9 类似,采用倒推逻辑并依据 MARD、MKPF、MSEG 计算某个时间段期初数量、借方数量、贷方数量、期末数量,依据 MBEW、BSIM 计算某个时间段期初价值、借方价值、贷方价值、期末价值。
由于 MKPF、MSEG 依据 MB51 逻辑,不能记录价格修改、发票校验差异对存货价值影响,而 BSIM 只记录有价值更新的出入库记录,对免费入库类(只有数量更新无价值更新)不能记录,二者各有利弊。数量取数逻辑如下:

价值取数逻辑如下:

优点:既考虑数量、又考虑价值,如果查询数据量较少,数据比较全面且准确。
缺点:①查询速度慢;②借、贷方不能反映出、入库类型;③采用倒推方式,查询大数据量时,数据可能不准确。
自开发程序设计逻辑
SAP 标准程序 MC.9、MB5B 采用倒推逻辑,查询大数据量可能导致数据不准确,由于本集团工厂有 60 个左右,查询数据量大不可避免,鉴于以上原因不采用倒推逻辑。大概设计思路:从 MBEWH、S031 表直接取得期初库存数量及价值,然后从 MKPF、MSEG、BSIM 取得期间出入库数量及价值,依据期初数量、价值及当期出入库数量、价值计算期末数量及价值。
- 如果一张发票校验,因为价格差异导致库存变动的话,它对应的财务凭证会出现在 BSIM 表里。
期初数量,价值计算
首先,介绍 MBEWH 表更新逻辑:如果第 N 月有一笔出入库或价值更新操作,系统会将 N-1 月月底数量及价值更新至 MBEWH 表。
假定要查 2012-12 月进销存,首先从 MBEWH 表取年度小于等于 2012 所有数据,然后删除年度等于 2012、月份大于等于 12 数据。经过数据处理后,依据物料、评估范围取得年度 + 月份最大的那条记录。
其次,计算取得数据下个月份(如:3100101001 取到 2012-09 这条数据下月为 2012-10),并和查询月份(2012-12)比较,如果二者不相等,从 S031 表取该时间段内(2012-10)出入库记录。将 MBEWH、S031 数据合并即为该物料 2012-12 期初数据。(为什么这样计算,仔细想想 MBEWH 更新逻辑)。
期间入库、出库数据计算
然后,依据 MKPF、MSEG、BSIM 提取 2012-12 该月的出入库记录及价值更新记录。根据移动类型判断该记录属于入库或出库。
期末数据可以依据期初数据和当期出入库计算。这样设计采用正推逻辑,避免查询时有出入库操作对查询结果的影响;此程序既考虑了库存数量更新,又考虑了价值更新,保证了数据的全面性;这样就可保证进销存和总账一致,满足业务需求。