原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
价格日期定界是一个SAP中比较常见的概念: 对于一个已经存在的价格期间,导入一个新的价格期间,新价格期间对原有价格期间重新界定开始和结束日期.
**本文主要介绍价格日期重定界的场景分析及封装类**
> 重定界分析视频 无峰,公众号:ABAP 技巧与实战 [ 价格重定界分析
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247488377&idx=1&sn=eb716920166f279bff0232e14e736c1b&chksm=cf5dce4ff82a4759c5b00e0aa9a16dabaa5acf709a136f547ceb5f62c2e7204a1ee08227103f&token=90466262&lang=zh_CN#rd)
二
标准定价
通过以下方式可以呈现出标准逻辑的价格重定界的结果.
用销售的标准定价事务VK11创建两次价格
2022-02-27 -> 9999-12-31 10%
2023-02-27 -> 2024-02-27 15%
VK13展示定价的重定界结果.
如下图,原来的价格2022-02-27 -> 9999-12-31 10%折扣,添加期间 2023-02-27 -> 2024-02-27 15% 后
,原有期间被分割成两段. 该物料变成三段定价
三
变通处理
因为价格重定界的可能性很多. 在之前项目中总是回避整理价格重定界的逻辑.并采用标准价格条件,调用标准价格导入程序来实现重定界.
并从价格导入的结果集中获取重定界结果. 需要注意的是
看起来更规范的BAPI函数
BAPI_PRICES_CONDITIONS
并不会对价格日期重定界
RV_CONDITION_COPY 函数会重定界. 需要配合下面两个函数一起使用.
RV_CONDITION_SAVE
RV_CONDITION_RESET
最近项目中发现试图绕过重定界逻辑会产生一些新的麻烦.所以尝试分析并解决价格重定界逻辑的细节问题.
**TIPS**
**SPRING**
一个较好的办法是把这三个函数的调用封装到一个新的函数中.
ZBAPI_RV_CONDITION_COPY
四
定界分析
定界的可能场景比较多.为了穷尽所有的可能性. 引入如下概念
• 固定期间: 表示不可拆分的期间(导入的期间) GD
• 非固定期间:表示可拆分的期间(系统中原有的期间)FGD
同时列举出这两个期间根据期间长度的比较的三种可能性
• 固定期间>非固定期间
• 固定期间=非固定期间
• 固定期间<非固定期间
下图给出了两个期间的比较及可能的特殊期间,其中#表示一天
_**01** _
**追赶模型**
设想两个期间为两个长节虫,每个骨节代表一天. 开始日期是长节虫尾,结束日期是长节虫头
两个期间的所有可能性就是其中一只长节虫追赶另外一只的所有过程节点(这两个过程中前三个和最后三个表述一致)
长虫追赶短虫(等长也适用)的过程
• 结束落后开始
• 结束追平开始
• 结束追过开始
• 结束追平结束
• 结束追过结束
• 开始追平开始
• 开始超过开始
• 开始超平结束
• 开始超过结束
短虫追赶长虫的过程
• 结束落后开始
• 结束追平开始
• 结束追过开始
• 开始追平开始
• 开始追过开始
• 结束追平结束
• 结束超过结束
• 开始追平结束
• 开始超过结束
_**02** _
**追赶模型总结图**
总图给出了追赶模型中的所有可能情况,特例,逻辑表达式,重定界处理方式.
根据下图所以,所有可能的基础测试场景 = 3(期间比较) * 9(追赶过程) * 4(常规及特殊期间)
共计108个基础场景. 刚好够梁山好汉们人手一份.
五
定界模型封装
为了尽可能的简化对该模型的调用, 把定界逻辑封装在类ZCL_PRICE_DATE_PROC中
对外开放两个可调用的静态方法
• CHECK_DATE_OVER 检查价格日期重叠
• SPLIT_DATE 价格日期重定界
调用时传递内表并指定价格相关的字段名即可
• 识别为关键字的字段,通过逗号分割(不含日期字段)
• 识别为日期的字段: 从
• 识别为日期的字段: 到
• 识别条目为固定期间的字段名
• 识别条目为固定期间的字段值
调用价格重叠检查
价格期间重叠检查结果
调用价格日期重定界
重定界结果
六
总结
价格重定界在项目中经常出现,一般情况下通过标准定价的导入即可解决.
但特定的项目中可能没有启用标准定价的条件类型.在自定义表中增加了期间范围,此时就必须考虑使用重定界逻辑来完整此类自定义表的数据维护.
以前尝试过把期间重叠检查整合在SE16N的数据维护中.
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧之 改造SE16N(五)
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485340&idx=1&sn=76031e8ad8841af477b785d2dc6ab7c6&chksm=cf5ddaaaf82a53bc032358b180b079fc6fcea060be2d6374cd6583b6b9c0fb08d296571510d6&scene=178&cur_album_id=1806709827964878852#rd)
但当时仅梳理了期间不重叠的可能性.对期间重叠的可能性没有细分.
这次尝试归纳总结所有的可能性,其中难免疏漏, 欢迎指正.
封装的类调用非常简单,无需特殊的数据加工.仅需要把原有的期间及新期间整合在一个表中,通过特殊字段区分新期间. 同时把这些信息传递给类方法即可.
对重定界的数据回写到自定义表时, 需要按不含日期的关键字删除记录后,再整体写入.