导读
时间冲突:SAP实施顾问应该都知道时间约束的概念,时间约束是按照主键作为分隔,其中信息类型有个seqnr的流水号字段,是控制时间约束的主要条件,今天分析的2001信息类型,如果日期相同,请假的开始时间与结束时间也相同(这两个字段不是主键),系统如何解决冲突问题。
作者:vivi,来源:osinnovation
一、首先了解下时间冲突的基本配置
下图是信息类型中时间限制选择Z的选项,如果选择Z选项就会读取配置表T554Y的配置,也许很多人看不懂右边表结构的含义,我在截一张图,相信大家就能明白
相信很多人看到下图就应该知道这个地方的含义。这个地方有嵌套两层,最外层是下图显示的地方,我们还可以双击进去,首先介绍下下图的含义,下图是把2开头的考勤信息类型都罗列出来,时间约束类是和缺勤类型关联的。注意看这个地方一定要结合下图与下下图看,因为这两个图片是有关联的。我举个例子说明下,例如我请假是放入2001信息类型,出差是2002信息类型,我事假的时间约束类是01,我出差的时间约束类也是01,那么我们就要考虑出差与请假是否能同时存在,如果不能同时存在我就要双击下图第一行,然后找到2005,时间约束是01,后面对应的反应标志,我设置成A就是相同覆盖,设置E就是不允许保存,如果设置成N就说明没关系。这就是考勤时间冲突的逻辑。
现在我举个例子说明下上面的逻辑,比如我有个缺勤类型名称是事假-》配置缺勤类型的地方有个时间约束,就是对应上图的时间约束类
上面就是考勤信息类型时间冲突系统配置的地方,现在的问题是,系统是如何匹配新的请假时间与老的请假时间是一样的逻辑,原来一直以为系统是根据主键匹配,因为开始时间与结束时间不是联合主键,在加上原来项目的客户说配置不生效,就没深入研究,今天客户说接口遇到同样的问题,今天就认真分析下源代码,看看系统的逻辑是如何把开始时间与结束时间也考虑的,首先是通过函数HR_TIME_COLLISION开始,这个函数是开始时间冲突校验的开始地方,然后关注着函数的form physical_collis,然后在看ts_check_intersection这个form,这个form就是日期与时间都要同时校验。这个form会同时传输ts_new与ts_old两个内表数据,一个是新的数据,一个是老的数据,系统会匹配新来数据的差异。包含开始时间与结束时间。
我们看到源代码在这里会单独去匹配时间,所以不是简答的匹配主键。这里是双层LOOP,一层是新的数据,一层是老的数据,上图红色圈的就是把开始时间与结束时间一并考虑,ge是大于等于意思,gt是大于意思,员工请假时间是2024-12-26 09:00-12:00,WA-ENDUZ=120000,WB-BEGUZ=090000,WB-ENDUZ=120000,WA-BEGUZ=090000。12点是大于9点,所以条件是满足的,intersect就会赋值,如果我新的请假时间是下午14:00-15:00 WA-ENDUZ=150000 WB-BEGUZ=090000 WB-ENDUZ=120000 WA-BEGUZ = 140000,这时候wb-enduz gt wa-beguz就不满足,所以intersect就不会有值,也就是不会冲突。所以系统就能保存成功。
二、现在用一个例子分析下:例如员工请假是2024-12-26 09:00-12:00请事假
现在我复制这条数据保存,所以的数据都是一样,看看下图地方匹配。