第1章 报表与图表制作
报表是数据库应用程序的基本组成部分之一,完整的数据库应用程序总要提供报表功能。QuickReport是挪威Qusoft AS公司专门为Delphi 6.0设计的用于报表的一组控件,充分利用好QuickReport,就可以非常快捷地设计出功能强大、模式多样的数据报表。
1.1 第一份报表
以范例数据库Dept.mdb文件中的“员工名单”表为对象,将表中内容输出至报表。其步骤为:
新建一个项目,然后
1、添加ADOTable组件
在窗体中添加ADOTable组件,并设置ConnectionString与TableName属性。
ADOTable组件用于为报表提供数据来源。
2、放置QuickRep组件
在窗体中添加QuickRep组件,并设置DataSet属性为ADOTable。
QuickRep组件是放置诸如:页头、细节、页脚等报表元素的一个容器。报表组件都应放置在QuickRep中。
3、放置QRBand组件
将QRBand组件添加到QuickRep中,并设置QRBand的BandType属性为rbDetail(报表的细节区段)。
一张报表是由多个区段(也称带区)组成的,而区段组件QRBand就是用来代表各种区段。
4、添加报表数据感知组件
添加多个QRDBText组件到QRBand中,并设置其DataSet为ADOTable,设置DataField属性为各字段名。
QRDBText用于输出数据库表中各字段内容。其作用类似于为显示表中数据而放置在窗体上的数据感知组件DBEdit。
报表感知组件(如:QRDBText)一定要放在区段组件QRBand上! |
5、预览
在设计时,可以右击QuickRep组件,打开快捷菜单,执行其中的“Preview”命令,即可设计状态下预览报表。
在运行时,可以通过执行QuickRep组件的Preview方法来预览报表。
图 7‑1 第一份报表
1.2 常用报表组件功能简介
1、QuickRep: 带有坐标,作为其他报表控件(如区段组件TQRBand)的容器,通过它的Band属性可以自动添加各种类型的TQRBand。
2、QRBand : 区段组件。通过设置BandType 属性可以得到不同功能的区段。QRBand上面主要放置各种报表数据感知控件。
3、QRGroup : 在报表中对资料做逻辑上分组的组件。
4、QRSubDetail : 建立一个主/明细(master/detail) 报表,连接明细报表的组件。
5、QRLabel : 打印静态文本(即:不是根据数据库中记录来改变),作用象TLabel组件 。
6、QRDBText : 在报表中具有显示连结资料来源的文字功能的组件。
7、QRExpr : 在报表中显示计算表达式值的组件 。
8、QRSysData : 在报表中具有显示系统信息的组件 。如:报表日期、页码等。
9、QRShape : 在报表中显示几何图形的组件,如:水平线、垂直线、正方形、圆角正方形、椭圆等 。
10、QRDBImage : 在报表中显示从数据库接收的图片。
1.3 报表的区段
作为报表,它通常有一个固定的模式,最常见的报表主要是由以下六部分组成:
图 7‑2 报表的区段
这六个组成部分,都是通过不同的TQRBand区段来实现的。
TQRBand 是放在TQuickRep组件上面的一个容器,在其上面可以放置我们要打印的报表数据感知组件。而通过对TQRBand的BandType属性的设置,我们可以改变TQRBand区段的类型,来得到不同功能的区段。
事实上,我们还可以通过TQuickRep组件的Band属性来布置区段。只要将Band属性前面的“+”点开,就会看到下图:
图 7‑3 TQuickRep组件的Band属性
我们想要添加哪种类型的TQRBand区段,只要把相应的值设为true,就可以了。
1.4 分组统计报表
打印报表时,有时也需要对数据按某个字段进行分类汇总(小计),如下图所示。这就需要用到TQRGroup组件。
图 7‑4 分组统计报表
现以Leave.mdb数据库中的“休假记录”表为例,来建立如上图所示的报表。
步骤:
(1)、在窗体中添加ADOQuery组件,并设置ConnectionString属性。SQL属性设置为:
select * from 休假记录 order by 姓名
必须按“姓名”排序。(由于姓名字段是分类汇总的依据)! |
(2)、在窗体中添加QuickRep组件,并设置DataSet属性为ADOQuery1。
(3)、将QRGroup组件添加到QuickRep中,并将Expression属性设置为ADOQuery1.姓名
(4)、再添加两个QRBand到到QuickRep中,并将QRBand1的BandType属性设置为:rbDetail
(5)、将QRGroup组件的FooterBand属性设置为:QRBand2。此时,QRBand2的BandType属性就会变成rbGroupFooter。
(6)、在QRGroup组件中放置5个QRLabel组件,并将其Caption属性设置为:姓名、假别、年份、月份、天数。
(7)、在QRBand1中放置5个QRDBText组件,并将DataSet属性设置为ADOQuery1,DataField属性分别设置为:姓名、假别、年、月、天数 。
(8)、在QRBand2中放置1个QRLabel组件,并将其Caption属性设置为:休假总天数,再放置一个QRExpr组件,并将Expression属性设置为:SUM(ADOQuery1.天数),将ResetAfterPrint属性设置为True。(这一步很重要,否则显示的总休假天数会从第条记录开始累加)
(9)、最后,在QRGroup及QRBand2中利用QRShape组件画两条线。
(10)、预览。
1.5 主从明细(Master/Detail)报表
与窗体上建立主从明细表相类似,使用TQRSubDetail组件我们也可以建立主从明细报表。
现以Leave.mdb数据库中的“员工名单”表(主表)与“休假记录”表(从表)为例,来建立如下图所示的报表。
图 7‑5 主从明细(Master/Detail)报表
步骤:
(1)、在窗体中添加ADOConnection组件,并设置ConnectionString属性。再添加两个ADOTable组件,Connection属性设置为ADOConnection1,TableName属性分别设置为:员工名单、休假记录
(2)、在窗体上添加一个DataSource组件,并设置DataSet属性为ADOTable1。
(3)设置ADOTable2的MasterSource与MasterFields属性。见下图。
图 7‑6 设置ADOTable2的MasterSource与MasterFields属性
单击MastetFields属性右边的“…”按钮,打开“Field Link Desinger”对话框,设置主从表的连接字段。
图 7‑7 设置主从表的连接字段
(4)、在窗体中添加QuickRep组件,并设置DataSet属性为ADOTable1(即:员工名单表)。
(5)、QRSubDetail放在QuickRep中,并将Bands属性下的两个子属性HasHeader与HasFooter都设置为True。这样,在QuickRep中会看到又增加了两个区段:Group Header和Group Footer。
图 7‑8 增加Group Header和Group Footer区段
(6)、TQRSubDetail组件的设置:Master的值设为所在TQuickRep组件的名;DataSet的值设为连接明细表的组件名。
(7)、预览。
1.6 报表页面设置
双击QuickRep组件,打开“Report Settings”对话框,可以对报表进行各项打印设置。包括:
l Page size:纸张大小()
l Portrait/Landscape: 报表打印方向(纵向/横向)
l Margins: 页边距
l Page frame: 报表页面边框及颜色
l Font: 报表字体、字号大小
l Bands:报表拥有的带区
图 7‑9 报表页面设置
1.7 制作图表
除了将数据库表中的记录输出到报表之外,也可以用来生成直观明了的图表。Delphi提供的DBChart就是一个用来生成各类图表的组件。以下通过几个例子来说明如何使用DBChart。
例 7‑1 将Student1.mdb数据库的“成绩单”表中,总分超过270的记录生成如下的直方图。
图 7‑10 制作直方图
步骤:
(1)、在窗体中添加ADOQuery组件,设置ConnectionString属性,并将SQL属性设置为:
select * ,(数学+语文+英语) as 总成绩 from 成绩单 where (数学+语文+英语)>=270
再将Active属性设置为True ;
(2)、在窗体上添加DBChart组件,双击该组件,打开Editing DBChart1对话框。见下图。
图 7‑11 Editing DBChart1对话框
(3)单击“Add”按钮,打开“TeeChart Gallery”对话框,然后选择直方图(Bar)。再将窗口下方的“3D”复选框上的勾去掉,使之成为二维直方图。最后单击“OK”,回到Editing DBChart1对话框。
图 7‑12 “TeeChart Gallery”对话框
至此,我们添加了一个数据系列Series1。接下来给Series1指定数据来源。
(4)、在上述Editing DBChart1对话框中,选择“Series”页,再选择“Data Source”页,按图图 7‑13在三个下拉列表中选取:DataSet、ADOQuery1、 总成绩。然后单击“Close” 按钮,可以看到图图 7‑14。
接下来,修改上述图表,使之成为图 7-10形式。
(5)、再次双击DBChart组件,打开Editing DBChart1对话框,选择“Series”页,将“Color Each”复选框打上勾,使代表总成绩的柱形条以不同的颜色显示。
图 7‑15 “Editing DBChart”对话框
(6)、在上述Editing DBChart1对话框,选择“Chart”页,再选择“Legend”(图例)页,选中“Bottom”,使图例位于图表下方。另外,还可以选择“Font…”,打开字体设置对话框来设置图例中字体、字号。
图 7‑16 在“Editing DBChart”对话框设置图例、字体、字号
(7)、最后,我们希望横坐标上显示学生姓名,而不是默认的“1”、“2”、“3”。
在“Object TreeView”窗口中,点击DBChart1前的“+”号,可以看到下面出现“Series1”,选中它,这时,“Object Inspector”窗口中就会显示Series1这个对象的相关属性。
点击XlabelSoource属性右边的下拉列表,将会显示数据集ADOQuery1中包含的所有字段。选择其中的“姓名”,这时可以看到图表的横坐标已经显示了学生姓名。
XlabelSource属性只能通过“Object TreeView”窗口来设置,无法在Editing DBChart1对话框中设置。! |
图 7‑17 设置Series1这个对象的XlabelSoource属性
例 7‑2在Leave.mdb数据库的“员工名单”表中,统计各县市人数占总人数的百分比,并以饼图显示。
图 7‑18 以饼图显示各县市人数占总人数的百分比
步骤:
(1)、在窗体中添加ADOQuery组件,设置ConnectionString属性,并将SQL属性设置为:
子查询 |
SELECT 员工名单.县市, Round (Count(员工名单.姓名)/(select Count(员工名单.姓名) as 总人数 from 员工名单)*100,2) AS 人数百分比 FROM 员工名单 GROUP BY 员工名单.县市
再将Active属性设置为True ;
以下各步类似例1,学生可自行完成。
例 7‑3 将Student1.mdb数据库的“成绩单”表中每个学生三门课程成绩作为一个数据系列,生成如下的直方图。当通过DBNavigator移动记录指针时,直方图(包括:图表标题能够显示学生姓名)自动更新。
图 7‑19 学生成绩直方图
步骤:
(1)、在窗体中添加ADOTable组件,设置ConnectionString属性,并将TableName属性设置为“成绩单”,再Active属性将置为True 。
(2)、在窗体上添加一个DataSource组件,将DataSet属性设置为ADOTable1 。
(3)、同例1
(4)在Editing DBChart1对话框中,选择“Series”页,再选择“Data Source”页,按图 7‑20在两个下拉列表中选取:Single Record、DataSource1 ,然后将 “Available Fields”列表框中的“语文”、“英语”、“数学”三个字段添加到右边的“Selected Fields” 列表框中。然后单击“Close” 按钮
图 7‑20 设置Data Source、Available Fields
(5)、在窗体上添加DBNavigator组件,并设置DataSource属性为DataSource1。
(6)、在ADOTable1的AfterScroll事件中加入事件处理程序:
procedure TForm3.ADOTable1AfterScroll(DataSet: TDataSet);
begin
DBChart1.Title.Text.Text:=ADOTable1.fieldByName('姓名').asString;
end;
其目的是使记录指针移动时,图表标题能够显示学生姓名并自动更新。
一定要在窗体上添加一个DataSource组件,否则第(4)步就无法完成。 |