多层分组报表中数据错位的问题

分组报表,是所有报表当中最普通,最常见的报表类型,也是所有报表工具都支持的一种报表格式。

分组报表制作方式是把报表划分为条带状,用户根据一个数据绑定向导指定分组,汇总字段,生成标准的分组报表。

多层分组,是指在分组中再进行细化分组,我们来看下面一个例子:


在第一层分组下又进行了两层分组,然后再进行数据汇总。

我们看一下sql:

SELECT jn.csfl,jn.xmdm,jn.jncsxm,jn.tjyf,jn.jh,jn.qrcye,jn.qdjgl,jn.qygzgl,jn.qrhdl,jn.qxtxl,jn.hrcye,jn.hdjgl,jn.hygzgl,jn.hrhdl,jn.hxtxl,jn.ljjdl,jn.hdym,jn.qdym,left(jn.cyfs,2) ccc FROM jn WHERE tjyf>=?+”01″ and tjyf<=?+? AND ( jn.xmdm =’1.1′ or jn.xmdm =’1.1s’ or jn.xmdm =’1.5′ or jn.xmdm =’1.30′ or jn.xmdm =’1.31′ or jn.xmdm =’3.14′ or jn.xmdm =’4.2′ or jn.xmdm =’4.3′ or jn.xmdm =’4.1′ or jn.xmdm =’1.11′ or jn.xmdm =’1.12′ or jn.xmdm =’1.24′ or jn.xmdm =’3.1′ or jn.xmdm =’2.4′ or jn.xmdm =’1.13′ or jn.xmdm =’1.14′ or jn.xmdm =’3.2′ or jn.xmdm =’2.6′ or jn.xmdm =’5′ or jn.xmdm =’1.15′ or jn.xmdm =’1.16′ or jn.xmdm =’1.17′ or jn.xmdm =’1.3′ or jn.xmdm=’1.29′) and (csfl=’1′ or csfl=’2′ or csfl=’3′ or csfl=’4′ or csfl=’5′ or csfl=’6′ or csfl=’7′)

我们对参数进行了绑定:

我们在预览中,发现当参数不变的情况下,会出现奇怪的现象:

再运行一次,会发现:



刚才还是两层分组,现在就变成一层了。

我们看一下表达式:


从表达式上我们看到,这是多层分组并进行了默认排序。这一点是没有错误的,那问题就出在了sql上:

SELECT jn.csfl,jn.xmdm,jn.jncsxm,jn.tjyf,jn.jh,jn.qrcye,jn.qdjgl,jn.qygzgl,jn.qrhdl,jn.qxtxl,jn.hrcye,jn.hdjgl,jn.hygzgl,jn.hrhdl,jn.hxtxl,jn.ljjdl,jn.hdym,jn.qdym,left(jn.cyfs,2) ccc FROM jn WHERE tjyf>=?+”01″ and tjyf<=?+? AND ( jn.xmdm =’1.1′ or jn.xmdm =’1.1s’ or jn.xmdm =’1.5′ or jn.xmdm =’1.30′ or jn.xmdm =’1.31′ or jn.xmdm =’3.14′ or jn.xmdm =’4.2′ or jn.xmdm =’4.3′ or jn.xmdm =’4.1′ or jn.xmdm =’1.11′ or jn.xmdm =’1.12′ or jn.xmdm =’1.24′ or jn.xmdm =’3.1′ or jn.xmdm =’2.4′ or jn.xmdm =’1.13′ or jn.xmdm =’1.14′ or jn.xmdm =’3.2′ or jn.xmdm =’2.6′ or jn.xmdm =’5′ or jn.xmdm =’1.15′ or jn.xmdm =’1.16′ or jn.xmdm =’1.17′ or jn.xmdm =’1.3′ or jn.xmdm=’1.29′) and (csfl=’1′ or csfl=’2′ or csfl=’3′ or csfl=’4′ or csfl=’5′ or csfl=’6′ or csfl=’7′)

在sql中我们并没有进行排序,这就有可能会导致分组字段在从数据库取出来后再排序导致出错的可能。

我们在sql中加上排序:

SELECT jn.csfl,jn.xmdm,jn.jncsxm,jn.tjyf,jn.jh,jn.qrcye,jn.qdjgl,jn.qygzgl,jn.qrhdl,jn.qxtxl,jn.hrcye,jn.hdjgl,jn.hygzgl,jn.hrhdl,jn.hxtxl,jn.ljjdl,jn.hdym,jn.qdym,left(jn.cyfs,2) ccc FROM jn WHERE tjyf>=?+”01″ and tjyf<=?+? AND ( jn.xmdm =’1.1′ or jn.xmdm =’1.1s’ or jn.xmdm =’1.5′ or jn.xmdm =’1.30′ or jn.xmdm =’1.31′ or jn.xmdm =’3.14′ or jn.xmdm =’4.2′ or jn.xmdm =’4.3′ or jn.xmdm =’4.1′ or jn.xmdm =’1.11′ or jn.xmdm =’1.12′ or jn.xmdm =’1.24′ or jn.xmdm =’3.1′ or jn.xmdm =’2.4′ or jn.xmdm =’1.13′ or jn.xmdm =’1.14′ or jn.xmdm =’3.2′ or jn.xmdm =’2.6′ or jn.xmdm =’5′ or jn.xmdm =’1.15′ or jn.xmdm =’1.16′ or jn.xmdm =’1.17′ or jn.xmdm =’1.3′ or jn.xmdm=’1.29′) and (csfl=’1′ or csfl=’2′ or csfl=’3′ or csfl=’4′ or csfl=’5′ or csfl=’6′ or csfl=’7′) order by jn.csfl,ccc,jn.xmdm

这时我们无论运行多少次都不会出现数据错位的情况了,在今后制作多层分组的报表时,要特别注意这个问题。