上一篇当中我们阐述了在FineReport当中如何list出一个连贯的月份(http://),在实际的应用当中,还有一种情况需要使用补足的手段。
例如下面这张考勤表。

[img]http://finesoftware.k13.23dns.net/picFforum/2008.png [/img]

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