当前位置:   article > 正文

matinal:SAP S/4 HANA系统如何进行库存管理_sapmm4hana

sapmm4hana

总览

SAP S4采用HANA数据库,本质上是用大内存、列存储实现快速的数据读取,其实存取效率应该还是下降了。
对于MM的库存管理,其实顾问们遇到最多的问题就是进销存/库龄/时点库存盘点之类的。
过去ECC面临海量数据时基本都推给BW了,现在HANA其实给了我们更多的可能。
SAP标准表变化

其实S4的版本中,库存表虽然看起来还跟ECC一致,其实底层已经完全不同了。
以MARD为例,如果你用HANA工具打开数据库链接,你会发现里面的数量字段,全都是0。
那系统时怎么做到SE16N看到库存数量呢?

第一步代理视图:

第二部DDL源视图:

大概套了了好几层,最后一层是 NSDM_DDL_MARD_AGG

第三步:SAP 标准的MARD数据视图

  1. @AbapCatalog.preserveKey: true
  2. @AbapCatalog.compiler.compareFilter: true
  3. @AbapCatalog.sqlViewName: 'NSDM_V_MARD_AGG'
  4. @EndUserText.label: 'MARD Compatibility View: Aggregation'
  5. @DataAging.noAgingRestriction: 'false'
  6. @ObjectModel.usageType.sizeCategory: 'L'
  7. @ObjectModel.usageType.serviceQuality: #C
  8. @ObjectModel.usageType.dataClass: #TRANSACTIONAL
  9. @ClientHandling.algorithm: #AUTOMATED
  10. @AccessControl.authorizationCheck: #NOT_ALLOWED
  11. @AbapCatalog.viewEnhancementCategory: #PROJECTION_LIST
  12. define view nsdm_e_mard_agg as
  13. select from matdoc_extract
  14. {
  15. key mandt,
  16. key matbf as matnr,
  17. key werks,
  18. key lgort_sid as lgort,
  19. key lbbsa_sid as lbbsa,
  20. key sobkz,
  21. sum(stock_qty_l2) as stock_qty,
  22. sum(stock_vkwrt_l2) as stock_vkwrt,
  23. max(gjper_curr_per) as gjper_max,
  24. sum(/cwm/stock_qty_l2) as /cwm/stock_qty
  25. }
  26. where stock_ind_l2 = ''
  27. and (((sobkz = '' or sobkz = 'K')
  28. and (lbbsa_sid = '01' or lbbsa_sid = '02' or lbbsa_sid = '07' or lbbsa_sid = '08'))
  29. or (sobkz = ''
  30. and (lbbsa_sid = '03' or lbbsa_sid = '04')))
  31. group by mandt, matbf, werks, lgort_sid, lbbsa_sid, sobkz

 

可以看下SQL逻辑,就是简单的通过matdoc_extract表聚合而成。

而matdoc_extract是一张物料存储表,是MSEG的衍生表。默认行数应该与MATDOC一致。
月底应该有个默认作业,对matdoc_extract做同KEY同该期间的合并压缩。其实很多行业压缩率很低。

可见新版本HANA的SQL,已经可以做到过去通过ORCALE 直接 OPENSQL取数的效率。

那么问题来了,对我们有什么帮助呢?
H表的变化

大家知道基本每个库存表都由有个H表,记录每个期末的库存。其实H表也这么调整了,而且解决了之前的一个难题。
过去如果一个物料/工厂/库位 在该期间没有货物移动,那么该期间的H表就是空。所以取月底的数逻辑十分复杂,效率低下,这个在新架构下基本没问题。
到天的时点库存

有些时候进销存/库龄可能不仅仅是按期间的,可能要到某一天。

其实我遇到这个需求是看看MARD的变化,本来想学MARD的方式也汇总那个表获取到天的库存,后来发现那个表只有期间没有天。其实SAP这么优化架构,大概率也会建立一些视图满足这个功能。找了下真有。

PMATSTOCKTIMESER

SE16N打开这个函数,执行时要输入参数,期间一般用D按天,然后开始/结束日期。

输出格式是按KEY的库存,基本支持各类特殊库存,按库存类型区分非限制、质检等信息。
简单处理下就是完整的库存数量了。效率OK
进一步的理解

我能不能自己汇总MSEG得到库存呢?
其实MSEG有很多问题,例如315只有一行,有一些无库存移动的行要排除。其实用MATDOC更好一些。完全可以实现,新SQL可以通过借贷 CASE WHEN THEN实现 SUM聚合与正负调整。
不过金额的处理还是不够完美。
例如MR21 调差 MIRO采购差异等这里还是缺的。K库存的金额其实不计入库存商品。有些特殊业务金额可能分布在不同的列等等。

这里我有个终极方案:自定义ZMSEG,将一些特殊处理全部放到物料凭证BADI->BEFORE_UPDATE方法里简单处理,同步写入ZMSEG。
简单处理了下业务类型的区分,金额/数量的取值/和正负。

通过作业或增强获取 ACODCA中 存货科目下非物料凭证生成的会计凭证,获取差异金额数据。同样处理好金额正负/取值等。
大概结果如下:
物料凭证数据

其它金额调整:下图应该是发票校验移动金额差。

那么就可以通过一个简单的SQL,获取某时点的库存数量/金额。

通过前面对业务类型的规划,可以实现对应对期间内数据的分列,实现一般进销存的的数据分列,SQL如下。

  1. SELECT
  2. * c~partner AS channel,
  3. * c~name1,
  4. a~werks AS werks,
  5. a~satnr AS satnr,
  6. goods_brand,
  7. SUM(
  8. CASE d~jxc_type
  9. WHEN '1' THEN a~erfmg
  10. END
  11. ) AS menge1,
  12. SUM(
  13. CASE d~jxc_type
  14. WHEN '1' THEN a~dmbtr
  15. END
  16. ) AS netwr1,
  17. SUM(
  18. CASE d~jxc_type
  19. WHEN '2' THEN a~erfmg
  20. END
  21. ) AS menge2,
  22. SUM(
  23. CASE d~jxc_type
  24. WHEN '2' THEN a~dmbtr
  25. END
  26. ) AS netwr2,
  27. SUM(
  28. CASE d~jxc_type
  29. WHEN '3' THEN a~erfmg
  30. END
  31. ) AS menge3,
  32. SUM(
  33. CASE d~jxc_type
  34. WHEN '3' THEN a~dmbtr
  35. END
  36. ) AS netwr3,
  37. SUM(
  38. CASE d~jxc_type
  39. WHEN '4' THEN a~erfmg
  40. END
  41. ) AS menge4,
  42. SUM(
  43. CASE d~jxc_type
  44. WHEN '4' THEN a~dmbtr
  45. END
  46. ) AS netwr4,
  47. * SUM(
  48. * CASE d~jxc_type
  49. * WHEN '5' THEN a~erfmg
  50. * END
  51. * ) AS menge5,
  52. *
  53. * SUM(
  54. * CASE d~jxc_type
  55. * WHEN '5' THEN a~dmbtr
  56. * END
  57. * ) AS netwr5,
  58. * SUM(
  59. * CASE d~jxc_type
  60. * WHEN '6' THEN a~erfmg
  61. * END
  62. * ) AS menge6,
  63. *
  64. * SUM(
  65. * CASE d~jxc_type
  66. * WHEN '6' THEN a~dmbtr
  67. * END
  68. * ) AS netwr6,
  69. SUM(
  70. CASE d~jxc_type
  71. WHEN '7' THEN a~erfmg
  72. END
  73. ) AS menge7,
  74. SUM(
  75. CASE d~jxc_type
  76. WHEN '7' THEN a~dmbtr
  77. END
  78. ) AS netwr7,
  79. SUM(
  80. CASE d~jxc_type
  81. WHEN '8' THEN a~erfmg
  82. END
  83. ) AS menge8,
  84. SUM(
  85. CASE d~jxc_type
  86. WHEN '8' THEN a~dmbtr
  87. END
  88. ) AS netwr8
  89. * SUM(
  90. * CASE d~jxc_type
  91. * WHEN 'T' THEN a~erfmg
  92. * END
  93. * ) AS menget,
  94. *
  95. * SUM(
  96. * CASE d~jxc_type
  97. * WHEN 'T' THEN a~dmbtr
  98. * END
  99. * ) AS netwrt
  100. INTO CORRESPONDING FIELDS OF TABLE @gt_alv
  101. FROM zmseg AS a
  102. LEFT JOIN zvmm_xpwl_info AS b ON a~satnr = b~matnr
  103. * INNER JOIN zscmt0010 AS c ON a~werks = c~werks AND a~lgort = c~lgort
  104. INNER JOIN zscm_jxc AS d ON a~bwart = d~bwart AND a~grund = d~grund AND a~shkzg = d~shkzg
  105. WHERE a~budat_mkpf >= @p_date1
  106. AND a~budat_mkpf <= @p_date2
  107. AND a~werks IN @s_werks
  108. * AND partner IN @s_partn
  109. * AND budat_mkpf < @p_date1
  110. * AND zxzdq IN @s_zxzdq
  111. * AND zejqy IN @s_zejqy
  112. * AND brand_id IN @s_brand
  113. * AND zsyb IN @s_zsyb
  114. AND a~satnr IN @s_satnr
  115. AND saisj IN @s_saisj
  116. AND saiso IN @s_saiso
  117. AND goods_brand IN @s_brand1
  118. AND mtart IN @s_mtart
  119. GROUP BY
  120. * c~partner,
  121. * c~name1,
  122. a~werks,
  123. goods_brand,
  124. a~satnr .

通过以上的方案,就可以实现把进销存或时点库存,甚至库龄的计算绝大部分都放到HANA的DB曾执行,ABAP应用层只做简单的数据拼装就可以,实现比较高的系统效率。

其实除了库存,还有信贷、甚至FI的科目余额、成本金额,都可以用此类方式实现(实际上你取标准表也是视图)。
所以HANA的方案实际上给业务顾问/ABAP顾问更强大的工具去做业务实现。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/722599
推荐阅读
相关标签
  

闽ICP备14008679号