引用链接: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 表记录过去某个时间段的入库数量、金额及出库数量及金额,然后采用倒推方式计算出过去某个时点(按月)的库存数量及金额。

MC.9 Logic

优点:如果查询数据量较小时,数据提取效率快且准确。

缺点:由于采用倒推方式,一旦查询数据量较大,查询时段如果有出入库操作,数据可能不准。

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 只记录有价值更新的出入库记录,对免费入库类(只有数量更新无价值更新)不能记录,二者各有利弊。数量取数逻辑如下:

MB5B Qty Logic

价值取数逻辑如下:

MB5B Qty Logic

优点:既考虑数量、又考虑价值,如果查询数据量较少,数据比较全面且准确。

缺点:①查询速度慢;②借、贷方不能反映出、入库类型;③采用倒推方式,查询大数据量时,数据可能不准确。

自开发程序设计逻辑

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 该月的出入库记录及价值更新记录。根据移动类型判断该记录属于入库或出库。

期末数据可以依据期初数据和当期出入库计算。这样设计采用正推逻辑,避免查询时有出入库操作对查询结果的影响;此程序既考虑了库存数量更新,又考虑了价值更新,保证了数据的全面性;这样就可保证进销存和总账一致,满足业务需求。