✅ 操作成功!

BCB讲座第十七讲实现简单的数据报表

发布时间:2024-01-09 作者:admin 来源:讲座

2024年1月9日发(作者:)

BCB讲座第十七讲实现简单的数据报表

实现简单的数据报表

在前两讲中我们已经学习了对数据库进行查询和读写操作的基本方法,本讲中我们将为MP3Collect小程序添加另一项与数据库操作有关的新功能:数据报表打印功能。

打印数据报表是开发数据库类应用程序过程中经常遇到的问题,特别是在商务类的应用软件中,单位领导或者客户关心的不仅仅是显示在计算机屏幕上的数据,更重要的是打印出来的整齐清晰的报表。

设计一个好的数据报表应该遵循这样几个原则:首先要了解用户需要得到什么样的数据,数据库中的记录可能有成千上万条,打印出来的应该是经过提炼、精简的,其中将涉及到数据库的查询、统计、分组、排序等操作;第二个要点是关于报表的布局设计,其设计原则是整齐有序、美观大方,在某些应用场合,如财会类的应用软件中,报表的设计需要遵循固定的格式。第三点是将数据与报表结合起来,实现数据报表的生成与打印。

 使用数据报表向导

从前面的介绍中我们可以看出,实现数据报表的图17-1:启动数据报表向导

功能还是颇为复杂的。好在CBuilder充分考虑到了数据报表的重要性,在其集成开发环境中提供了许多现成的数据报表控件,因此大大方便了数据报表的设计与实现。另外,CBuilder还提供有专门的数据报表向导,利用向导可以在几分钟内完成一个简单的数据报表的设计。

下面我们首先学习如何使用CBuilder的数据报表向导。在MP3Collect工程中使用菜单命令“”,在弹出的新建对象对话框中选择“Business”页,并双击其中的“Quick Report Wizard”图标。这时会弹出如图17-1所示的新数据报表向导对话框,在其中选择报表的样式为“List Report”,然后图17-2:报表向导参数设置

按下“Start Wizard”按钮启动向导。

向导接下来会显示如图17-2所示的参数设置对话框。“Alias or directory”一栏用于指定数据库,我们在下拉列表框中选择数据库别名MP3Collect。“Table Name”一栏用于指定表,我们选择MP3Info。这时,数据表MP3Info中的四个字段ID、FileName、SongName、SingerName自动出现在Avaliable fields(可用的字段)列表框中,它的右侧是Selected fields(选中的字段)列表框,两个列表框中间有四个箭头按钮,用来在两个列表框之间移动字段。在本例中我们只希望打印歌曲名称和歌手名称两项内容,因此将SongName、SingerName两个字段选入图17-3:向导生成的报表窗体

Selected fields列表框。设置好显示的数据内容

后,按下“Finish”按钮,创建报表完毕,这时我们可以看到,工程中新添了一个报表窗体Form1,如图17-3所示,该窗体上的各个控件的用途及使用方法在下一节中详细介绍。现在我们先来看一下报表窗体运行的效果,用鼠标右键单击窗体中的空白部分,在关联菜单中选择Preview命令,可以对报表进行打印预览,如图17-4所示。打印预览是以所见即所得的方式显示报表输出到打印机的效果,在预览窗口的上方有一排快捷按钮,可以进行切换预览方式、浏览不同的页面等操作,其中还有两个打印机形状的按钮,一个用于设置打印机,另一个则是执行打印命令,完成向打印机的输出。预览完毕后可以点击工具条上的Close按钮关闭预览窗口。

图17-4:新建报表的预览效果

从这个例子中我们可以看出,使用报表向导来创建报表时,只需要指定数据库、数据表、报表中输出的字段名,就可以生成一个简单的数据报表。下面我们就来仔细了解一下报表窗体上的各个组成部分,并在向导生成的报表基础上稍加修改,使之更加满足我们的要求。

 常用的数据报表元件

图17-3所示的数据报表窗体中,TTable控件Table1是我们所熟悉的,它指向MP3Collect数据库中的MP3Info数据表,其作用是提供打印报表所需要的数据。窗体上的其它控件都属于QuickReport控件。QuickReport是由QuSoft AS公司开发的第三方软件产品,它以一组元件的形式集成在CBuilder中,能够帮助CBuilder编程人员以可视化的方法快速开发数据报表应用程序,目前CBuilder 5.0中采用的是QuickReport 3.0版本。

在元件面板中找到QReport元件栏,我们可以看到其中包含了二十几个元件,利用这些元件,可以使报表输出各种类型的数据,如图像、图形、数值、文本、HTML格式的文本等,并控制报表各个部分的输出效果,如大小、字体、颜色、对齐方式等。在设计报表时我们会发现,设计报表和设计程序窗体十分相似,报表中常用的一些元件,如TQRLabel、TQRMemo等元件与普通的窗体元件如TLabel、TMemo等在名称和用途上也有一定的对应关系。报表元件与普通窗体元件之间的最重要的差别在于:普通窗体元件具有与用户交互的功能,它们能够接收用户的输入,而报表元件则只是负责输出,输出的结果可能是在打印机上(如果选择了打印报表操作)也可能是在屏幕上(如果选择了打印预览操作)。

在QuickReport元件组中,最重要的元件是TQuickRep控件,它是实现报表的基础,可以控制报表的生成和打印,它还是其它QuickReport控件的容器,因此TQuickRep是在CBuilder中实现数据报表功能必不可少的控件。在向导生成的Form1窗体中,我们可以看到,TQuickRep控件对象QuickRep1为一个白色背景、带有网格和标尺的矩形。该矩形充满整个窗体的客户区,它代表的是打印输出的纸张大小,QuickRep1内部有一个蓝色虚线的方框,表示可打印区域。在可打印区域内部,我们可以看到用黑色虚线框起的三个长条形区域,每一个长条形区域称为一个Band。不同的Band将TQuickRep控件内部分为不同的区域,例如标题栏区(Title)用于显示报表的标题,如果报表由多页组成,则只显示在第一页上;列标题栏区(ColumnHeader)显示列标题,如果报表由多页组成,它会显示在每一页的表格上方;明细栏区(Detail)则显示具体的数据,虽然在设计阶段只显示了一行内容,但在输出时会根据实际记录的数量显示出多行来,形成一个表格。TQuickRep控件中定义了六种Band区域,除了刚才提到的三种,还有页眉栏(PageHeader)、页脚栏(PageFooter)、合计栏(Summary),TQuickRep控件的Bands属性决定了显示哪些Band区域。TQuickRep控件的属性DataSet属性决定了它与自己内部的其它报表控件的数据来源。与前两讲介绍的数据访问控件不同的是,数据报表控件可以直接从TDataSet类的控件中获取数据,而不需要TDataSource控件作为中转。

在本例中,QuickRep1的DataSet属性设为Table1,表示数据来源为MP3Collect数据库中的MP3Info数据表。除了上述属性之外,TQuickRep控件的其它重要属性还包括有Frame、Options、Page、PrintSettings等等,其中Frame属性定义了报表的四周是否有边框,以及边框的样式(大部分QuickReport报表控件都有Frame属性,用于定义边框),Options属性定义了一些用于显示的选项,Page属性定义了打印纸张的大小、纸型、页边距等,该属性和输出打印机的设置有关,PrintSettings属性则定义了打印的范围、打印的份数等参数。

在TQuickRep控件中,需要显示的Band区域自动显示为TQuickRep控件内部的一个黑色虚线矩形,该矩形实际上是一个TQRBand控件。TQRBand控件封装了报表中不同Band区域的属性和方法,其属性BandType决定了该Band区域的类型。QuickRep1中的三个Band对象的类型分别为rbColumnHeader、rbDetail和rbPageFooter。TQRBand控件可以用来控制各个栏目区域的大小和位置,例如,如果我们加大DetailBand1的高度,就可以加大报表表格中行的间距,利用TQRBand控件对象还可以实现其它一些显示上的特殊效果,朋友们可以多试一试各种不同设置的效果。不过心铃认为TQRBand对象的主要作用应该是作为其它报表控件的容器。

前面已经说过,报表QuickRep1被划分为三个Band区域,分别是列标题区ColumnHeaderBand1、明细区DetailBand1和页脚区PageFooterBand1。

列标题区ColumnHeaderBand1内包括两个TQRLabel控件,分别显示“SongName”和“SingerName”两个字符串。TQRLabel控件用于显示固定的文本字符串,它在报表中作用与Label控件在普通窗体中的作用是相似的(注意不要在报表中使用普通窗体控件,它们不会在预览或打印结果中显示出来)。TQRLabel控件的属性也很好理解,与普通Label控件相比,它多了一个Frame复合属性,该属性定义了字符串的四周是否显示边框,以及边框的样式等。“SongName”和“SingerName”两个TQRLabel对象的Frame属性中就定义为显示下边框,因此我们在预览效果(图17-4)中可以看到列标题下方有一根直线把列标题与报表明细内容区分开来。

明细区DetailBand1包含两个TQRExpr对象QRExpr2和QRExpr3。TQRExpr控件是QuickReport数据报表特有的控件,它没有普通的窗体控件与之对应,该控件的引入大大方便了数据报表的设计。TQRExpr控件的名称从字面上翻译就是数据报表表达式控件,顾名思义,该控件中可以定义一个表达式,输出的是以文本方式显示的表达式结果。该表达式可以由常量(如数字或字符串常量)、数据字段以及QuickReport支持的一些标准变量(如日期、时间、页码等等)组成,表达式支持的运算包括加、减、乘、除、比较运算、逻辑运算等等,表达式中还支持一些简单的函数调用(如SUM()、AVERAGE()等等),可见TQRExpr控件具有较强的数据处理能力。

QRExpr2和QRExpr3中的表达式比较简单,只定义了要显示的字段名称。如果要构造较为复杂的表达式,可以在对象监视器中双击TQRExpr对象的Expression属性,调出其表达式向导对话框,利用向导构造出符合语法要求的表达式。

页脚区PageFooterBand1只包含一个TQRExpr对象QRExpr1,其Expression属性字义了它显示的内容为页码数,另外它的AlignToBand属性设为了true,Alignment属性设为taRightJustify,表示它将以右对齐的方式显示。

 完成数据报表功能

我们已经对数据报表窗体及其上的数据报表控件有了一定的了解,下面我们就来对其报表窗体做一些小小的修改,让它变得美观一些,然后我们在程序的主窗体中加上一些代码,让MP3Collect能够调用数据报表。

首先,我们把Form1的Name属性改为ReportForm,窗体类名称改为TReportForm,并将此单元保存为(窗体文件与头文件分别保存为和Report.h)。接下来,我们把ReportForm窗体上的Table1控件删除,并重新添加一个TQuery控件Query1,Query1的Database属性设为别名MP3Collect,SQL属性为“SELECT * FROM MP3Info Order by FileName ASC”。然后指定其Active属性为true,其它属性值都接受缺省值。

我们把QuickRep1的DataSet属性指向新的数据来源Query1,并修改其Bands属性,将其中的子属性HasTitle设为true,表示增加报表标题的显示。此时,ColumnHeaderBand1前面会自动插入一个新的TQRBand控件对象TitleBand1,我们将其高度调整到合适的位置,然后在其中添加一个TQRLabel控件对象QRLabel3,并把QRLabel3的Alignment属性设为taCenter,AlignToBand属性设为了true,表示居中对齐于标题栏的中间,另外还要把QRLabel3的Caption属性设为“MP3音乐宝库——查询结果”,字体设置为“宋体”,大小为20。

接下来我们把ColumnHeaderBand1中的QRLabel1和QRLabel2控件的Caption属性分别修改为“歌曲名称”和“歌手名称”,并把PageFooterBand1中的QRExpr1控件的Expression属性修改为“'第 ' + PageNumber+'页'”,把缺省的英文单词改为中文。最后将QRLabel1、QRLabel2、QRExpr1、QRExpr2、QRExpr3的字体都改为“宋体”,大小改为10。在上述过程中,还需要调整各个Band区域的高度以适应新的字体高度。

做好这一系列调整之后,我们接着要在MainForm中添加调用报表窗体的代码。由于MainForm窗体上的控件布局已经比较紧凑了,如果再添加新的命令按钮,需要进行的调整就比较大,因此我们不再向MainForm窗体中添加新按钮,而是通过添加关联菜单命令的方式来增加打印报表的命令。为此,我们在MainForm窗体上的PopupMenu1中添加一个菜单项mnuReport,其Caption属性为“打印报表”,OnClick事件处理函数为mnuReportClick(),该函数的代码实现如下所示:

void __fastcall TMainForm::mnuReportClick(TObject *Sender)

{

ReportForm->Query1->Close();

ReportForm->Query1->SQL->Clear();

ReportForm->Query1->SQL->AddStrings(Query1->SQL);

ReportForm->Query1->Open();

ReportForm->QuickRep1->Preview();

}

该函数主要完成以下几个步骤,首先关闭报表窗体的查询控件Query1,清除其中原有的SQL属性,然后将其SQL属性设置成与主窗体上Query1控件的SQL属性一致,再打开报表窗体的查询控件Query1。这样做的目的是保证报表中显示的数据与主窗体中显示的内容一致。函数最后调用报表窗体上QuickRep1控件的Preview()方法启动打印预览窗口(如图17-5:修改后的数据报表

图17-5所示),用户在该窗口中就可以完成打印报表的操作。

本讲介绍了如何利用QuickReport控件来实现数据报表的功能,这里介绍的仅仅是最基本的方法,用到的QuickReport控件也只有少数几个,如果要设计更复杂的数据报表,朋友们还需要进一步学习各种QuickReport控件的用法。

BCB讲座第十七讲实现简单的数据报表

👁️ 阅读量:0