实体服务规则,通过日期计算公式计算今天是今年第几周原创
金蝶云社区-CQ周玉立
CQ周玉立
136人赞赏了该文章 2,318次浏览 未经作者许可,禁止转载编辑于2023年05月09日 14:30:37

今天看到一个问题要通过配置计算当前日期是今年的第几周,想了一下,这个算法有点意思,这里分享一个思路,记录下来,以后备用。

这里是按自然周来算的今天是今年第7周,如果不考虑星期,从年初按7天一循环,直接用今天到1月1日的相差天数除以7,然后判断余数即可。


当前年份获取:@currentshortdate.Year

需要在单据添加2个中间字段:日期类型,锁定,隐藏就行,只是计算过程需要作为中间变量

因为要换成日期类型,进行日期计算,所以只能用字段来存储,而且一定要添加日期类型的字段!

FEffectDate:记录今年1月1日,

FLapseDate:记录今年第1个星期一的日期,有可能也是1月1日,有可能不是,通过计算判断


  • ①拼接出今年的1月1日,记录到中间字段中备用,需要添加日期类型的中间字段

FEffectDate=("{0}-1-1").format(@currentshortDate.Year);

  • ②如果1月1日不是刚好星期一,重新计算出今年第一个星期一的日期

FLapseDate=str(FEffectDate.AddDays(8-(7 if(int(FEffectDate.DayOfWeek)==0) else int(FEffectDate.DayOfWeek)) if( int(FEffectDate.DayOfWeek)<>1) else 0) );

  • ③计算今天到今年第1个星期一的相差天数,并除以7,如果有余数,要加1,

最终还要加上前面1月1日那一周,如果1月1日刚好是星期一,就不加,否则就还要加1

FYearWeek=str((int((@currentshortdate-FLapseDate).Days+1)/7) if(((@currentshortdate-FLapseDate).Days+1)%7==0) else int((int((@currentshortdate-FLapseDate).Days+1)/7)+1)+ (1 if(int(FEffectDate.DayOfWeek)<>1) else 0))


  • ④如上,可以依次设置三个公式按顺序执行,也可以把几个公式写到一起使用:

FEffectDate=("{0}-1-1").format(@currentshortDate.Year);FLapseDate=str(FEffectDate.AddDays(8-(7 if(int(FEffectDate.DayOfWeek)==0) else int(FEffectDate.DayOfWeek)) if( int(FEffectDate.DayOfWeek)<>1) else 0) );FNumber=str((int((@currentshortdate-FLapseDate).Days+1)/7) if(((@currentshortdate-FLapseDate).Days+1)%7==0) else int((int((@currentshortdate-FLapseDate).Days+1)/7)+1)+ (1 if(int(FEffectDate.DayOfWeek)<>1) else 0))

测试结果示例如下图:

这里用的部门基础资料做的测试,实际使用时,要自行添加中间字段,并修改字段标识,注意字段标识别弄混了。

image.png

赞 136