IT动力源论坛's Archiver

forreport 发表于 2008-10-27 11:31

用报表来弥补数据库的不足二--按照月份扩展天数

[font=宋体][font=宋体]上一篇当中我们阐述了在[/font][font=Calibri]FineReport[/font][font=宋体]当中如何[/font][font=Calibri]list[/font][font=宋体]出一个连贯的月份[/font][font=Calibri](http://)[/font][font=宋体],在实际的应用当中,还有一种情况需要使用补足的手段。[/font]
[font=宋体]例如下面这张考勤表。[/font]
[/font]
[font=宋体][img]http://finesoftware.k13.23dns.net/picFforum/2008.png[/img][/font]




[font=宋体]可以看到这里的日期部分是[/font][font=Calibri]1[/font][font=宋体]到[/font][font=Calibri]31[/font][font=宋体]号的一个[/font][font=Calibri]list[/font][font=宋体]。而在报表当中有两个参数,分别是让用户输入年和月。而每个月的具体的天数又是根据月份不同的,所以需要根据不同的月份来显示对应的天数。[/font]
[font=宋体]所以这张表就需要一个稍微长一点的公式,作为[/font][font=Calibri]list[/font][font=宋体]的结束数。在该公式当中要调用我们定义的年月参数,作为动态显示天数的根据。[/font]
[font=Calibri]=range(1,tointeger(mid(todate(CONCATENATE($year,"-",tointeger($month)+1,"-",1))-1,9,2)))[/font]
[font=宋体]从最里层开始解释一下这个公式:[/font][font=Calibri]$year,$month[/font][font=宋体]是我们在报表参数处定义好的参数名称,类型都是字符串,即用户要输入的年和月。[/font][font=Calibri]Tointeger[/font][font=宋体]是将字符串类型的数据转换为日期,以便能够在月份上面[/font][font=Calibri]+1[/font][font=宋体]。[/font]
[font=Calibri] [/font][font=宋体]然后使用[/font][font=Calibri]CONCATENATE[/font][font=宋体]()字符串拼接函数,将[/font][font=Calibri]($year,"-",tointeger($month)+1,"-",1))[/font][font=宋体]中的四个字符拼成我们需要的日期格式,例如[/font][font=Calibri]$year[/font][font=宋体]的值是[/font][font=Calibri]2008[/font][font=宋体],[/font][font=Calibri]$month[/font][font=宋体]的值是[/font][font=Calibri]3[/font][font=宋体],那么最终我们[/font][font=Calibri]CONCATENATE($year,"-",tointeger($month)+1,"-",1)[/font][font=宋体]获取到的是[/font][font=Calibri]2008-4-1[/font][font=宋体]也就是根据输入的参数,获取到了该月份下一个月的第一天。[/font]
[font=Calibri]TODTAE[/font][font=宋体]的作用,就是将我们拼出的日期,转换为[/font][font=Calibri]date[/font][font=宋体]类型,然后[/font][font=Calibri]-1[/font][font=宋体],得到的即是当前输入月份的最后一天,例如输入的是[/font][font=Calibri]2008[/font][font=宋体],[/font][font=Calibri]3[/font][font=宋体],那么转换之后得到的值就是[/font][font=Calibri]2008-3-31[/font][font=宋体]。[/font]
[font=宋体]继续是[/font][font=Calibri]MID[/font][font=宋体]函数,该函数和[/font][font=Calibri]SUBSTR[/font][font=宋体]函数的功能相同,即从一个数据当中截取部分长度的字符,[/font][font=Calibri]mid(todate(CONCATENATE($year,"-",tointeger($month)+1,"-",1))-1,9,2)[/font][font=宋体]返回的是上面的日期数据当中最后两位数据,即[/font][font=Calibri]31[/font][font=宋体]。[/font]
[font=宋体]最后[/font][font=Calibri]range[/font][font=宋体]函数是和[/font][font=Calibri]list[/font][font=宋体]功能相同的一个函数,起始值我们设置的[/font][font=Calibri]1[/font][font=宋体],结束值根据输入的月份不同。[/font]
[font=宋体]然后下面的出勤数可以从数据库中取,关联的方法和上一章是相同的。[/font]
[font=Calibri] [/font]

forreport 发表于 2008-11-25 17:16

为啥没有人理我?39:)

forreport 发表于 2009-1-20 17:36

用报表这样做确实方便多了~

页: [1]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.