在我们这个示例中采用的是OLEDB。
示例的基本功能是:通过OLEDB使报表与数据库关联起来,通过按特定字段分组,实现组分页。如果一组数据大于5条时,每5条分页。别外一个功能是,如果某个页不足5页时,以空白行填补。为显示空白行,可以在每一行下面设置一条线。
组分页可以在组页眉和组页脚上设置,本示例中在组页眉中设置组分页,在组页脚中设置填补空白行。
步骤1:创建表
在sql server2005中创建名称为:students的表,如下
在表中填充一些数据,用于测试。
步骤2:创建水晶报表
在VS2005中创建一新工程,在右侧的“解决方案资源管理器”中右键新建的工程名,先“添加”-->"新建项“,选”crystal报表 “ 确定,进入创建向导,
单击OK
选OLE DB(ADO)
在上图中 选择”SQL Native Client“然后”下一步“
在上图中 填入连接数据库的信息,单击”完了“
在上图中 在左栏中选中自己建的表”students",将其添加到右栏中,单击”下一步“
在上图中 在左栏中将需要在水晶报表中显示的字段添加到右栏中,单击”完了“
到些,基本报表创建完毕,后面将进行,具体设置。待续。。。。
步骤3:创建分组
在报表设计区内右键-->插入-->组
在“Common”标签中,第一个选择要依照哪个字段分组,第二个选择排列顺序,单击OK
步骤4:创建分页
在本示例中有两种分页控制,一种是组分页,一种是一组数据大于5条时,每5条一页。
组分页可以在页眉和组页脚上设置,现在组分页在页眉中设置:
右键-->报表-->节专家
在上图,选中“Group Header......”,在右侧选中"New Page Before" ,单击其右侧的公式按钮
输入上图中所示的语句,单击左上的“save and close”,OK
这样,就实现了组分页。
建一个”运行总计字段“,用于计算每个组的记录条数,设置如下图:
下面设置组内每条分页:
在“节专家”中,选中"Details",选中右侧的"New Page After",单击右侧的公式按钮,输入下图所示的语句
注:(1){#RTotal0}为运行行总汇。一般数据是逐条读取的,所以如果把{#RTotal0}加到"Detals"上(如下图),
预览,会出现下面情况
注意,前面的序号为{#RTotal0}的值,由此可以看出,{#RTotal0}的值是随程序运行而变化的。
(2)Count ({students.id},{students.grade} )为,按students.grade分组的每个组的总条数,在一个组中 是 一个不变值。
对上面我们可以这样理解,比如一个组中有7条记录,当程序运行显示到此组的第一页的第5条记录时,{#RTotal0}=5,Count ({students.id},{students.grade} )=7,依照前面语句判断,返回true,即要在当前页后创建新页。
保存设置,这样,分页设置完毕!
步骤5:填补空白行
首先,为什么能看到空白行,可以在'Details'和每个组页脚中添加一条横线。
在“节专家”中,选中“Group Footer....”,点击"Insert",插入三个组页脚:
(补充:组内分页的控制方法:根据组内记录条数与5进行取模,其值被5减,得到的值即为要填补空白行的数量,把此条件,再利用组页脚的抑制显示,即可达到控制相应页脚是否显示)
然后,选中"Group Footer #1a...",再选中右侧的“suppress(No Drill-Down)“,单击右侧的公式按钮,输入下图所示的语句
注:Count ({students.id},{students.grade} ) mod 5 >0用于判断为5或为5的整数倍时是否显示,
Count ({students.id},{students.grade} ) mod 5 <=3 用于判断不是5或5的整数倍时是否显示。
然后,依照上面一步,设置后边的三个页脚(group footer #1b,#1c,#1d),相应的语句为:
#1b :If Count ({students.id},{students.grade} ) mod 5 >0 and Count ({students.id},{students.grade} ) mod 5 <=3 then
false
else
true
#1c:If Count ({students.id},{students.grade} ) mod 5 >0 and Count ({students.id},{students.grade} ) mod 5 <=2then
false
else
true
#1d:If Count ({students.id},{students.grade} ) mod 5 >0 and Count ({students.id},{students.grade} ) mod 5 <=1 then
false
else
true
到此,示例功能设置完毕。测试,OK!!