今天看到一个问题要通过配置计算当前日期是今年的第几周,想了一下,这个算法有点意思,这里分享一个思路,记录下来,以后备用。
这里是按自然周来算的今天是今年第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))
测试结果示例如下图:
这里用的部门基础资料做的测试,实际使用时,要自行添加中间字段,并修改字段标识,注意字段标识别弄混了。