丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

第1章             报表与图表制作

 

报表是数据库应用程序的基本组成部分之一,完整的数据库应用程序总要提供报表功能。QuickReport是挪威Qusoft AS公司专门为Delphi 6.0设计的用于报表的一组控件,充分利用好QuickReport,就可以非常快捷地设计出功能强大、模式多样的数据报表。

 

1.1             第一份报表

以范例数据库Dept.mdb文件中的“员工名单”表为对象,将表中内容输出至报表。其步骤为:

新建一个项目,然后

1、添加ADOTable组件

在窗体中添加ADOTable组件,并设置ConnectionStringTableName属性。

ADOTable组件用于为报表提供数据来源。

2、放置QuickRep组件

在窗体中添加QuickRep组件,并设置DataSet属性为ADOTable

QuickRep组件是放置诸如:页头、细节、页脚等报表元素的一个容器。报表组件都应放置在QuickRep中。

3、放置QRBand组件

QRBand组件添加到QuickRep中,并设置QRBandBandType属性为rbDetail(报表的细节区段)。

一张报表是由多个区段(也称带区)组成的,而区段组件QRBand就是用来代表各种区段。

4、添加报表数据感知组件

添加多个QRDBText组件到QRBand中,并设置其DataSetADOTable,设置DataField属性为各字段名。

QRDBText用于输出数据库表中各字段内容。其作用类似于为显示表中数据而放置在窗体上的数据感知组件DBEdit

 

 

注意

 

 


报表感知组件(如:QRDBText)一定要放在区段组件QRBand上!

 

5、预览

在设计时,可以右击QuickRep组件,打开快捷菜单,执行其中的“Preview”命令,即可设计状态下预览报表。

在运行时,可以通过执行QuickRep组件的Preview方法来预览报表。

 

 

71  第一份报表

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             报表的区段

作为报表,它通常有一个固定的模式,最常见的报表主要是由以下六部分组成:

 

72  报表的区段

 

这六个组成部分,都是通过不同的TQRBand区段来实现的。

 

TQRBand 是放在TQuickRep组件上面的一个容器,在其上面可以放置我们要打印的报表数据感知组件。而通过对TQRBandBandType属性的设置,我们可以改变TQRBand区段的类型,来得到不同功能的区段。

事实上,我们还可以通过TQuickRep组件的Band属性来布置区段。只要将Band属性前面的“+”点开,就会看到下图:

 

73  TQuickRep组件的Band属性

 

我们想要添加哪种类型的TQRBand区段,只要把相应的值设为true,就可以了。

 

1.4             分组统计报表

打印报表时,有时也需要对数据按某个字段进行分类汇总(小计),如下图所示。这就需要用到TQRGroup组件。

 

74  分组统计报表

现以Leave.mdb数据库中的“休假记录”表为例,来建立如上图所示的报表。

步骤:

(1)、在窗体中添加ADOQuery组件,并设置ConnectionString属性。SQL属性设置为:

select * from 休假记录 order by 姓名

 

 

注意

 

 


必须按“姓名”排序。(由于姓名字段是分类汇总的依据)!

 

(2)、在窗体中添加QuickRep组件,并设置DataSet属性为ADOQuery1

(3)、将QRGroup组件添加到QuickRep中,并将Expression属性设置为ADOQuery1.姓名

(4)、再添加两个QRBandQuickRep中,并将QRBand1BandType属性设置为:rbDetail

(5)、将QRGroup组件的FooterBand属性设置为:QRBand2。此时,QRBand2BandType属性就会变成rbGroupFooter

(6)、在QRGroup组件中放置5个QRLabel组件,并将其Caption属性设置为:姓名、假别、年份、月份、天数。

(7)、在QRBand1放置5个QRDBText组件,并将DataSet属性设置为ADOQuery1DataField属性分别设置为:姓名、假别、年、月、天数 。

(8)、在QRBand2放置1个QRLabel组件,并将其Caption属性设置为:休假总天数,再放置一个QRExpr组件,并将Expression属性设置为:SUM(ADOQuery1.天数)ResetAfterPrint属性设置为True。(这一步很重要,否则显示的总休假天数会从第条记录开始累加

(9)、最后,在QRGroupQRBand2中利用QRShape组件画两条线。

(10)、预览。

 

1.5             主从明细(Master/Detail)报表

与窗体上建立主从明细表相类似,使用TQRSubDetail组件我们也可以建立主从明细报表。

现以Leave.mdb数据库中的“员工名单”表(主表)与“休假记录”表(从表)为例,来建立如下图所示的报表。

 

75  主从明细(Master/Detail)报表

步骤:

(1)、在窗体中添加ADOConnection组件,并设置ConnectionString属性。再添加两个ADOTable组件,Connection属性设置为ADOConnection1TableName属性分别设置为:员工名单、休假记录

(2)、在窗体上添加一个DataSource组件,并设置DataSet属性为ADOTable1

(3)设置ADOTable2MasterSourceMasterFields属性。见下图。

 

76  设置ADOTable2MasterSourceMasterFields属性

单击MastetFields属性右边的“”按钮,打开“Field Link Desinger”对话框,设置主从表的连接字段。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

77  设置主从表的连接字段

 

(4)、在窗体中添加QuickRep组件,并设置DataSet属性为ADOTable1(即:员工名单表)。

 

(5)、QRSubDetail放在QuickRep中,并将Bands属性下的两个子属性HasHeaderHasFooter都设置为True。这样,在QuickRep中会看到又增加了两个区段:Group HeaderGroup Footer

 

78  增加Group HeaderGroup 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报表拥有的带区

 

79  报表页面设置

1.7             制作图表

除了将数据库表中的记录输出到报表之外,也可以用来生成直观明了的图表。Delphi提供的DBChart就是一个用来生成各类图表的组件。以下通过几个例子来说明如何使用DBChart

 

71 Student1.mdb数据库的“成绩单”表中,总分超过270的记录生成如下的直方图。

 

710  制作直方图

步骤:

(1)、在窗体中添加ADOQuery组件,设置ConnectionString属性,并将SQL属性设置为:

select * ,(数学+语文+英语) as 总成绩 from 成绩单 where (数学+语文+英语)>=270

 

再将Active属性设置为True

(2)、在窗体上添加DBChart组件,双击该组件,打开Editing DBChart1对话框。见下图。

 

711  Editing DBChart1对话框

(3)单击“Add”按钮,打开“TeeChart Gallery”对话框,然后选择直方图(Bar)。再将窗口下方的“3D”复选框上的勾去掉,使之成为二维直方图。最后单击“OK”,回到Editing DBChart1对话框。

 

 

712  TeeChart Gallery”对话框

 

至此,我们添加了一个数据系列Series1。接下来给Series1指定数据来源。

 

(4)、在上述Editing DBChart1对话框中,选择“Series”页,再选择“Data Source”页,按图 713在三个下拉列表中选取:DataSetADOQuery1 总成绩。然后单击“Close 按钮,可以看到图 714

 

713  Editing DBChart”对话框

 

714  Editing DBChart”对话框

 

接下来,修改上述图表,使之成为图 710形式。

 

(5)、再次双击DBChart组件,打开Editing DBChart1对话框,选择“Series”页,将“Color Each”复选框打上勾,使代表总成绩的柱形条以不同的颜色显示。

 

715  Editing DBChart”对话框

(6)、在上述Editing DBChart1对话框,选择“Chart”页,再选择“Legend”(图例)页,选中“Bottom”,使图例位于图表下方。另外,还可以选择Font…”,打开字体设置对话框来设置图例中字体、字号。

 

 

716  在“Editing DBChart”对话框设置图例、字体、字号

(7)、最后,我们希望横坐标上显示学生姓名,而不是默认的“1”、“2”、“3”。

在“Object TreeView”窗口中,点击DBChart1前的“+”号,可以看到下面出现“Series1”,选中它,这时,“Object Inspector”窗口中就会显示Series1这个对象的相关属性。

点击XlabelSoource属性右边的下拉列表,将会显示数据集ADOQuery1中包含的所有字段。选择其中的“姓名”,这时可以看到图表的横坐标已经显示了学生姓名。

 

 

注意

 

 


XlabelSource属性只能通过“Object TreeView”窗口来设置,无法在Editing DBChart1对话框中设置。!

 

 

717  设置Series1这个对象的XlabelSoource属性

72Leave.mdb数据库的“员工名单”表中,统计各县市人数占总人数的百分比,并以饼图显示。

 

718  以饼图显示各县市人数占总人数的百分比

步骤:

(1)、在窗体中添加ADOQuery组件,设置ConnectionString属性,并将SQL属性设置为:

 

子查询

SELECT 员工名单.县市, Round (Count(员工名单.姓名)/(select Count(员工名单.姓名) as 总人数 from 员工名单)*100,2) AS 人数百分比  FROM 员工名单  GROUP BY 员工名单.县市

 

再将Active属性设置为True

 

以下各步类似例1,学生可自行完成。

 

73 Student1.mdb数据库的“成绩单”表中每个学生三门课程成绩作为一个数据系列,生成如下的直方图。当通过DBNavigator移动记录指针时,直方图(包括:图表标题能够显示学生姓名)自动更新。

 

719  学生成绩直方图

步骤:

(1)、在窗体中添加ADOTable组件,设置ConnectionString属性,并将TableName属性设置为“成绩单”,再Active属性将置为True 。

(2)、在窗体上添加一个DataSource组件,将DataSet属性设置为ADOTable1

(3)、同例1

(4)在Editing DBChart1对话框中,选择“Series”页,再选择“Data Source”页,按 720在两个下拉列表中选取:Single RecordDataSource1 ,然后将 Available Fields”列表框中的“语文”、“英语”、“数学”三个字段添加到右边的“Selected Fields 列表框中。然后单击“Close 按钮

 

720  设置Data SourceAvailable Fields

(5)、在窗体上添加DBNavigator组件,并设置DataSource属性为DataSource1

(6)、在ADOTable1AfterScroll事件中加入事件处理程序:

 

procedure TForm3.ADOTable1AfterScroll(DataSet: TDataSet);

begin

  DBChart1.Title.Text.Text:=ADOTable1.fieldByName('姓名').asString;

end;

 

其目的是使记录指针移动时,图表标题能够显示学生姓名并自动更新。

 

 

 

注意

 

 


一定要在窗体上添加一个DataSource组件,否则第(4)步就无法完成。

 

 

 

posted on 2007-07-21 15:25  丁保国  阅读(1321)  评论(0编辑  收藏  举报