总览

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

SAP标准表变化

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

第一步代理视图:
第二部DDL源视图:

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

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

@AbapCatalog.preserveKey: true
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.sqlViewName:      'NSDM_V_MARD_AGG'
@EndUserText.label:            'MARD Compatibility View: Aggregation'
@DataAging.noAgingRestriction: 'false'@ObjectModel.usageType.sizeCategory: 'L'
@ObjectModel.usageType.serviceQuality: #C
@ObjectModel.usageType.dataClass: #TRANSACTIONAL
@ClientHandling.algorithm: #AUTOMATED
@AccessControl.authorizationCheck: #NOT_ALLOWED
@AbapCatalog.viewEnhancementCategory: #PROJECTION_LISTdefine view nsdm_e_mard_agg as
select from matdoc_extract
{
key mandt,
key matbf     as matnr,
key werks,
key lgort_sid as lgort,key lbbsa_sid     as lbbsa,
key sobkz,sum(stock_qty_l2)      as stock_qty,
sum(stock_vkwrt_l2)    as stock_vkwrt,
max(gjper_curr_per)    as gjper_max,
sum(/cwm/stock_qty_l2) as /cwm/stock_qty
}
where stock_ind_l2 = ''and (((sobkz = '' or sobkz = 'K')and (lbbsa_sid = '01' or lbbsa_sid = '02' or lbbsa_sid = '07' or lbbsa_sid = '08'))or   (sobkz = ''and (lbbsa_sid = '03' or lbbsa_sid = '04')))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如下。

 SELECT
*    c~partner AS channel,
*    c~name1,a~werks   AS werks,a~satnr   AS satnr,goods_brand,SUM(CASE d~jxc_typeWHEN '1'  THEN a~erfmgEND) AS menge1,SUM(CASE d~jxc_typeWHEN '1'  THEN a~dmbtrEND) AS netwr1,SUM(CASE d~jxc_typeWHEN '2'  THEN a~erfmgEND) AS menge2,SUM(CASE d~jxc_typeWHEN '2'  THEN a~dmbtrEND) AS netwr2,SUM(CASE d~jxc_typeWHEN '3'  THEN a~erfmgEND) AS menge3,SUM(CASE d~jxc_typeWHEN '3'  THEN a~dmbtrEND) AS netwr3,SUM(CASE d~jxc_typeWHEN '4'  THEN a~erfmgEND) AS menge4,SUM(CASE d~jxc_typeWHEN '4'  THEN a~dmbtrEND) AS netwr4,
*     SUM(
*    CASE d~jxc_type
*    WHEN '5'  THEN a~erfmg
*    END
*    ) AS menge5,
*
*    SUM(
*    CASE d~jxc_type
*    WHEN '5'  THEN a~dmbtr
*    END
*    ) AS netwr5,
*        SUM(
*    CASE d~jxc_type
*    WHEN '6'  THEN a~erfmg
*    END
*    ) AS menge6,
*
*    SUM(
*    CASE d~jxc_type
*    WHEN '6'  THEN a~dmbtr
*    END
*    ) AS netwr6,SUM(CASE d~jxc_typeWHEN '7'  THEN a~erfmgEND) AS menge7,SUM(CASE d~jxc_typeWHEN '7'  THEN a~dmbtrEND) AS netwr7,SUM(CASE d~jxc_typeWHEN '8'  THEN a~erfmgEND) AS menge8,SUM(CASE d~jxc_typeWHEN '8'  THEN a~dmbtrEND) AS netwr8
*            SUM(
*    CASE d~jxc_type
*    WHEN 'T'  THEN a~erfmg
*    END
*    ) AS menget,
*
*    SUM(
*    CASE d~jxc_type
*    WHEN 'T'  THEN a~dmbtr
*    END
*    ) AS netwrtINTO CORRESPONDING FIELDS OF TABLE @gt_alvFROM zmseg AS aLEFT JOIN zvmm_xpwl_info AS b ON a~satnr = b~matnr*    INNER JOIN zscmt0010 AS c ON a~werks = c~werks AND a~lgort = c~lgortINNER JOIN zscm_jxc AS d ON a~bwart = d~bwart AND  a~grund = d~grund AND  a~shkzg = d~shkzgWHERE a~budat_mkpf >= @p_date1AND a~budat_mkpf <= @p_date2AND a~werks IN @s_werks*    AND partner IN @s_partn
*    AND budat_mkpf < @p_date1
*    AND zxzdq IN @s_zxzdq
*    AND zejqy IN @s_zejqy
*    AND brand_id IN @s_brand
*    AND zsyb IN @s_zsybAND a~satnr IN @s_satnrAND saisj IN @s_saisjAND saiso IN @s_saisoAND goods_brand IN @s_brand1AND mtart IN @s_mtartGROUP BY
*    c~partner,
*    c~name1,a~werks,goods_brand,a~satnr  .

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

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

END,欢迎讨论。

SAP S4 库存管理 技术分享相关推荐

  1. SAP MM 库存管理之ABC分类法

    SAP MM 库存管理之ABC分类法 ABC分类法(Activity Based Classification) ABC分类法又称帕累托分析法或巴雷托分析法.柏拉图分析.主次因分析法 .ABC分析法. ...

  2. SAP技术专家Jerry的技术分享微信群 - 2021年1月14日更新 - 还剩27个名额

    SAP技术专家Jerry的技术分享微信群 2020年10月19日才创建的微信群,里面会不定期分享我的工作感受和对SAP技术发展方向的个人看法,欢迎扫码加入. 加入群后请将自己的昵称改成如下格式: &l ...

  3. 怎么在SAP MM库存管理中使用简单的货架管理功能

    摘要:SAP的WM或WMS提供了比较完整的立体货架管理功能,但是,很多的业务场景下,并不需要那么完整的解决方案,业务部门可能仅需要简单地记录一下物料存放的位置,以方便下次比较准确地知道货物存放在位置. ...

  4. 电子标签与电子标签库存管理

    电子标签与电子标签库存管理 电子标签是时下最为先进的非接触感应技术,电子标签的防冲撞性.封装任意性.使用寿命长.可重复利用等特点,使电子标签库存管理技术成为库存管理设计的新宠. 电子标签是时下最为先进 ...

  5. SAP库存管理之ABC分类法

    ABC分类法(Activity Based Classification) ABC分类法又称帕累托分析法或巴雷托分析法.柏拉图分析.主次因分析法 .ABC分析法.分类管理法.重点管理法.ABC管理法. ...

  6. 「SAP技术」SAP MM 批次管理的物料创建DN时无存储地点就不能输入批次值?

    「SAP技术」SAP MM 批次管理的物料创建DN时无存储地点就不能输入批次值? 1, 如下交货单80018169(SO#10002993),行项目里storage location为空,batch字 ...

  7. SAP库存管理预留功能评测

    在库存管理中,预留业务是十分常见的.如临近五一或者国庆等节假日,出于促销的需要,一般都要求库存预先满足这方面的需求.即要求保证系统在需求日那天有足够的库存.为了满足这个目标,可能会对库存的某些物料做一 ...

  8. sap后台配置原因代码_【MM配置】Inventory Management 库存管理

    作者:SAP剑客|编辑 SAP天涯本节主要介绍"库存管理"的相关内容. 1.事务类型:Transaction Type 一般来讲,收货的时候这个事务类型为"WE" ...

  9. 团队管理那点破事!OKR绩效、核心人才、面试、技术分享、研发流程....

    今天来聊聊团队管理,可能你现在还是一线开发,没有带团队,感觉这个话题与你无关,其实不然. 程序员的职业生涯曲折,技术更新迭代快,走技术深度,走架构师路线,势必要付出常人的时间和精力.而管理则可以更好的 ...

最新文章

  1. 电脑护眼模式_看绿色护眼不管用!别再相信这些护眼方法了!想护眼记住这4点!...
  2. 基于 Quartz 开发企业级任务调度应用--转
  3. Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?
  4. 前端学习(2802):完成资讯页面详情
  5. TortoiseGit 更新远程仓库最新代码到本地仓库_入门试炼_05
  6. 使用 Raspberry Pi 远程桌面
  7. python移动文件
  8. 如何显示或隐藏Mac电脑右上角的声音图标
  9. 【百度地图API】如何制作孪生姐妹地图?
  10. 【ArcGIS教程01】前言
  11. xmanager 出现Initialize Flexnet Service failed / Error code: 50003
  12. 北京航空航天大学计算机考研信息汇总
  13. 【OS笔记 4】操作系统的组织结构(层次结构、微内核结构)虚拟机的概念
  14. L2-016 愿天下有情人都是失散多年的兄妹 (25 分) fill函数、bfs
  15. 对udp组播流(MPTS)进行简单的收录
  16. HTML5表白小程序
  17. “对症下药”的11种新的编程语言
  18. 为何丧尸只会攻击人类,而不“咬”动物?
  19. Elasticsearch 使用java分页查询条数超过1w的解决办法 -search_after方式
  20. PMP第三章:项目经理的角色

热门文章

  1. 3_IMX6ULL启动流程
  2. 二叉排序树基本操作(链表实现)(有错误)
  3. ASPX页生成静态HTML页(五种方案)
  4. 【转】一个交警肺腑之言:高速公路行车的安全注意事项
  5. transform:scale实现大屏自适应
  6. 华为往事(十五)--华为北京研究所
  7. 华为qq邮箱服务器密码忘了,华为自带的电子邮件APP怎么用?一招教你快速登录QQ/网易邮箱...
  8. C语言将0xea转换为字符ea,eA第10章 c语言程序设计初步.ppt
  9. 易语言注册机接码平台对接
  10. java exchange 日历_Exchange Server EWS 模拟:为与会人员添加日历会议日程(Calendar Item)...