您现在的位置:首页 >> 网络教学 >> 数据库应用 >> 内容

数据报表设计

时间:2009-6-19 10:09:35 点击:8009

数据报表设计

VB平台下制作报表大致有两种选择:使用VB自带的Data Report控件和借助第三方软件。其中第三方软件比较著名的就是MS ExcelSeagate公司的Crystal Reporter。使用VB自带的报表设计器必须有数据环境(Data Environment)的支持才能使用,因为报表设计中的数据来源与数据环境。

一、数据环境设计器

数据环境(Data Environment)是VB6.0提出的一个新概念,它可以将许多单独使用的对象和控件组合成一个单独的环境,建成后的这个数据环境可用来访问任何数据库、查询或加入其中的存储过程。在VB中使用数据环境后,如果程序中有多处引用了某个数据库的地方需要更改数据引用,只需对数据环境作一处改动,应用程序中的其他有关地方就会作出相应变动,为开发应用程序带来极大的方便。从某种角度看,Data Environment的作用相当于一个通用的Data控件,它可以在任何情况下使用,可以连接到所有的数据库、表以及只含一个查询或表的对象上,而不仅仅局限于连接到某个查询或表上。

在早期的VB版本中,使用ActiveX User Connection设计器创建远程数据对象(Remote Data Objects(RDO)来实现数据的访问。VB6的数据环境设计器除了支持User Connection设计器的所有功能外,还支持:1)ConnectionCommandMultiple Connection(多连接,即在一个数据环境中访问多个数据源)对象;2)OLE DB数据源和ODBC数据源;3)拖放功能,即从数据环境设计器中拖动字段和表到一个窗体或数据报表ActiveX设计器中,在窗体或报表中自动地创建数据绑定控件;4)执行包含在数据环境中、作为编程的运行时方法的Command5)对绑定到窗体中控件的数据环境进行编程访问;6)关联Command对象创建一个关系层次结构的能力,或对Command对象分组创建一个分组层次结构的能力,以及创建合计的能力和手工绑定数据识别控件到一个Command对象中的Field对象的能力;7)数据环境扩展性对象模型,该模型允许您创建外接程序。这些外接程序可以通过编程操作Visual Basic工程中的任何Data Environment对象。

VB中创建的数据环境对象会作为VB工程的一部分被保存到文件中,该文件的扩展名为.DSR。下面将介绍如何在VB工程中创建一个数据环境对象,以及如何在应用程序中使用数据环境中的对象。

假设我们要创建一个数据环境对象用来访问Microsoft Access中的VB班级数据库ClassVB.mdb

在可以访问数据环境设计器之前,必须在Visual Basic中引用它。引用数据环境设计器的方法是:在“工程”菜单中,单击“引用…”,并从“引用…”对话框中,选择“Microsoft Data Environment 1.0,然后单击“确定”。

完成数据环境的引用后,就可通过“工程”菜单的“添加Data Environment”命令来添加一个数据环境设计器对象到一个VB工程。

一旦在VB工程中添加了一个数据环境(默认名为“DataEnvironment1”),数据环境设计器就自动地包括一个新的连接Connection1。在设计时,数据环境打开连接并从该连接中获得元数据,包括数据库对象名、表结构和过程参数。我们使用下面的步骤来指定数据环境中新建DataEnvironment1Connection1对象的属性。

1.与在窗体中添加的普通控件一样,可以在VB“属性”窗中更改数据环境及连接的名称。例如,数据环境和连接分别命名为“de”和“con”。

2.右击Connection1对象并选择“属性”,打开“数据链接属性”对话框。

3.在“数据链接属性”对话框的“提供程序”选项卡中选择“Microsoft Jet 4.0 OLE DB Provider”。如果程序不是使用Access数据库,则要选择与数据库对应的“提供程序”。

4.在“连接”选项卡中指定数据库名称为“ClassVB.mdb”,如果数据库设定了用户名和密码,需要一并输入,并单击“测试”以测试连接是否成功。

5.单击“确定”完成连接对象属性的设置。

还有一个更简便的方法来建立一个新的连接。即从“数据视图”窗口中将一个连接拖动到数据环境设计器,自动地创建Connection对象。对于在“数据视图”中已存在的Connection对象,用这种方式创建Connection对象是非常容易和高效的。

完成连接属性的设置后,就可以在这个连接对象中创建命令(Command)对象了。Command对象定义了从一个数据库连接中获取何种数据的详细信息。Command对象既可以基于一个数据库对象(例如:一个表、视图、存储过程),也可以基于一个结构化查询语言(SQL)查询。

创建Command对象,可以采用以下步骤:

1.在数据环境设计器工具栏中单击“添加命令”按钮,或右击Connection对象(或数据环境对象),并从快捷菜单中选择“添加命令”,系统会自动添加一个“Command1命令对象到Connection对象。

2.指定命令对象的属性。右击命令对象并选择“属性”来访问“Command属性”对话框。在对话框中,“通用”、“关联”、“分组”和“合计”选项卡,分别定义该数据库来源、连接属性及关系等,并组织RecordSet中包含的数据,而“高级”选项卡则可以改变在运行时获取或操作数据的方式。这里在“通用”选项卡的“SQL语句”中输入“SELECT  * FROM Student”。

Connection对象一样,可以有一种更为快捷的方法创建Command对象,就是从一个“数据视图”中拖动一个表、视图或存储过程到数据环境设计器自动地创建Command对象。如果与被拖放的Command对象相关联的Connection在数据环境中不存在,则自动创建一个Connection对象。

此例中创建的数据环境如图9-16所示。数据环境创建完成后,就可以很容易地把它的相关内容绑定到窗体或数据报表对象中。

9-16  数据环境

从上面的例子及说明可以看出,VB中的数据环境就象一个大的数据控件,它可以在不同的窗体中引用和操作。这对于我们开发应用程序来说,无疑是提供了一个很好的数据工具。

二、报表设计器

报表设计器(Data Report Designer)是VB6.0众多新增功能中很有用的一个功能。用过Access报表设计工具的人再使用VB6.0中的Data Report Designer,就会感觉它功能更加强大,而且使用方便。它支持页面、报表头、记录行以及其他一些常用的功能,如支持不同的图形和字体等。虽然这种报表设计器不能完全取代第三方报表设计工具,但对于一些常用的报表来说,有了它就可以很方便地在VB中设计了。另外,我们可以方便地在程序中使用代码来调用创建好的报表对象。

报表设计器主要有以下功能特点:

1.对字段的拖放功能:把字段从Microsoft数据环境设计器拖到数据报表设计器。当进行这一操作时,Visual Basic自动地在数据报表上创建一个文本框控件,并设置被放下字段的DataMemberDataField属性。也可以把一个Command对象从数据环境设计器拖到数据报表设计器。在这种情况下,对于每一个Command对象包含的字段,将在数据报表上创建一个文本框控件,且每一文本框的DataMemberDataField属性将被设置为合适的值。

2Toolbox控件:数据报表设计器以它自己的一套控件为特色。当数据报表设计器被添加到工程时,控件被自动在“工具箱”上创建一个名为“数据报表”的新选项卡,包含几个报表用控件。

3.报表打印及预览:通过使用Show方法预览报表。然后生成数据报表并显示在它自己的窗口内;通过调用PrintReport方法,以编程方式打印一个报表。当数据报表处于预览方式,用户也可以通过单击工具栏上的打印机图标打印报表。

4.文件导出:使用ExportReport方法导出数据报表信息。导出格式包括HTML和文本。可以创建一个文件模板集合,以同ExportReport方法一起使用。这对于以多种格式(每种都报表类型剪裁)导出报表是很有用的。

5.异步操作:DataReport对象的PrintReportExportReport方法是异步操作。使用ProcessingTimeort事件可以监视这些操作的状态,并取消任何花费时间过长的操作。

报表通常由以下5部分组成(如图9-17所示),但在实际使用中可以根据需要选择所需部分。  

l        报表标头——每份报表只有一个,可以用标签建立报表名。

l        页标头——每页有一个,即每页的表头,如字段名。  

l        细节——需要输出的具体数据,一行一条记录。

l        页脚注——每页有一个,如页码。 

l        报表脚注——每份报表只有一个,可以用标签建立对本报表的注释、说明。

9-17  报表组成

报表的多数控件在功能上与Visual Basic内部控件相同,包括RptLabelRptShapeRptImageRptTextBoxRptLineRptFunction控件(参见图9-18)。Function控件能自动地生成如下四种信息中的一种:SumAverageMinimumMaximum

9-18  报表控件

1RptLable(报表标签)控件。RptLable控件与Lable标签控件类似,用于在报表上显示报表标头、页标头、页注脚、报表注脚、分组标头的内容。

2RptTextBox(报表文件框)控件。RptTextBox控件与TextBox控件类似,用于显示数据报表各字段明细内容。RptTextBox控件的主要属性有:

1DataMember属性。该属性是通过设置数据环境中的命令对象,选择要打印的数据表。

2DataField属性。该属性用于选择数据表中要打印的字段。

3RptImage(报表图像)控件。该控件用于在报表上显示图像,但不能直接与数据表字段绑定。

4RptLine(报表直线)控件。该控件用于在报表上画线。

5RptShape(报表形状)控件。该控件用于在报表上画矩形、三角形或圆等。

6RptFunction(报表函数)控件。该控件用于在报表上显示字段统计值。

三、报表设计

数据报表设计的一般步骤如下:

1.在工程中添加数据环境设计器,设置其连接对象(Connection)的属性,使之与数据库连接。再添加一个命令对象(Command),设置其属性,使命令对象与数据表连接。也可通过记录集对象(rsCommand)Open方法打开数据集。

2.在工程中添加数据报表对象(DataReport),设置其DataSource属性,通过环境设计器与数据库连接,再设置DataMember属性,通过命令对象与数据表连接。

3.在数据报表对象(DataReport)的报表标头(Section4)中,添加RptLable标签控件,通过设置Caption属性显示报表标题内容。

4.在数据报表对象(DataReport)的页标头(Section2)中,添加RptLable标签控件,通过修改Caption属性显示报表页标题与字段名称。

5.在数据报表对象(DataReport)的细节栏(Section1)中,添加RptTextBox控件,通过设置DataMember属性与命令对象(即数据表)连接,设置DataField属性与字段连接,显示数据表记录内容。

注意:45中有关页标头与细节栏的设计也通过下列方法实现。

打开数据环境设计器(DataEnvironment),将命令对象(Command)拖到数据报表对象的细节栏(Section1)中。将字段标签控件RptLable拖到页标头(Section2)中的适当位置,并将字段名改为中文。将字段文本控件RptTextBox拖到细节栏(Section1)的适当位置。如图图9-17所示。

6、在数据报表对象(DataReport)的页标头(Section2)与页脚注(Section3)等区域对象中,添加日期、时间、页号等项目。在页标头(Section2)与页脚注(Section3)区域中,单击鼠标右键,在弹出式菜单中选择插入控件命令,然后再选择当前日期、当前时间、当前页号、总页数等命令,如图9-19所示,则可在上述区域内添加日期、时间、页号等项目。

9-19 插入日期、时间、页号等项目

7.在数据报表对象(DataReport)的报表注脚(Section5)等区域对象中,添加RptFuction函数控件。RptFuction函数控件主要用于统计某数值型字段的和、平均值、最大值或最小值等。其主要属性如下:

DataMember属性:用于选择命令对象与数据表连接。

DataField属性:用于选择统计字段。

FuntionType属性:用于选择统计函数的类型,主要有如下类型:

0-prtFuncSum:求和函数类型

1-prtFuncAve:求平均值函数类型

2-prtFuncMin:求最小值函数类型

3-prtFuncMax:求最大值函数类型

8.网格处理

①显示网格:在数据报表中单击鼠标右键,在弹出式菜单中单击“显示网格”菜单项,取消“显示网格”菜单项前的“√”,则数据报表不显示网格。再次单击“显示网格”菜单项,恢复“显示网格”菜单项前的“√”,则数据报表显示网格。

②抓取到网格:在数据报表中单击鼠标右键,在弹出式菜单中单击“抓取到网格”菜单项,取消“抓取到网格”菜单项前的“√”,则控件可在数据报表内自由移动。再次单击“抓取到网格”菜单项,恢复“抓取到网格”菜单项前的“√”,则控件被抓取到网格边线。

若要使控件能在数据报表窗体中自由移动,则应取消“抓取到网格”菜单功能,为了能看清所布线条,应取消“显示网格”菜单功能。

9.画表格线

在数据报表内添加RptLine控件,可画数据报表的表格线(竖线或横线),用鼠标可改变线条的长度与方向。

10.控件的对齐与间距

①控件对齐

先选择控件,然后单击鼠标右键,在弹出式菜单中选择对齐,可按水平方向进行控件的左、右、居中对齐;可按垂直方向进行控件的顶、底、中间对齐,还可以对齐到网格。

②水平与垂直间距:在以上弹出式菜单中还可选择相同间距、递增、递减、删除。

11.在打印程序窗体内,调用Show方法预览数据报表,调用PrintReport方法打印报表。

另外一个制作报表的简单方法是从“外接程序”中选择报表向导来设计报表。

第八节 综合应用

在实际的VB应用程序中,数据管理占了很大一部分,下面以几个实例来讨论VB在数据库方面的综合应用。这些实例基于Access数据库ClassVB.mdb,包含学生成绩Score表、学生基本信息Student表及用户User表。

Student表结构参见9.5.3节,Score表结构为:

学号(varchar(8))、成绩(Number(2)

User表结构为:

用户名(varchar(10))、密码(varchar(6)

首先为工程创建如图9-20数据环境DE,在数据环境中命令cmdUser连接到用户表,命令cmdUnion使用SQL语句“SELECT * FROM Student as a, Score as b WHERE a.学号=b.学号”实现多表联合查询。

9-20 示例数据环境

实例1.用户登录。在设计应用软件时,特别是数据管理类软件,总希望在进入软件主窗体之前显示如图9-21用户登录窗体,要求用户输入密码,当用户的密码得到验证后,即可进入软件应用环境。

9-21 用户登录

窗体设计如下:

1.设置窗体的Caption=“用户登录”,“启动位置”为“在屏幕中间”。由于登录窗体通常不允许用户更改大小及不允许有“关闭”按钮,所以设置窗体的“BorderStyle”为“1-Fixed Single”。

2.在窗体上放置一个Frame(框架),并将其Caption设置为空,作美化界面之用。

3.在框架上放置两文本框txtUsertxtPwd,用于输入用户名和密码,并把txtUserDataSource属性设置为“DE”;txtPwdPasswordChar设置为“*”、MaxLength=6(限制最多6位密码)。

4.框架上放置两个命令按钮cmdDlcmdExit,并分别设置其Caption为“登录”和“退出”。

程序清单如下:

Option Explicit

Private Sub cmdDl_Click()

    Static i As Integer

    Dim strUserName As String

   

    strUserName = txtUser

    If i <= 2 Then      '判断用户是否重试三次

        i = i + 1

        DE.rscmdUser.Find ("用户名=', " & strUserName & "'")

        If DE.rscmdUser.EOF Then

            MsgBox "没有找到该用户!", , Me.Caption

            txtUser.SetFocus

        Else

            If txtPwd = DE.rscmdUser.Fields("密码") Then

                frmMain.Show 1  '调用主程序

            Else

                MsgBox "密码错误!", , Me.Caption

                txtPwd = ""

                txtPwd.SetFocus

            End If

        End If

    Else

        MsgBox "你已重试三次,系统将自动退出。", , Me.Caption

        End

    End If

       

End Sub

Private Sub cmdExit_Click()

    End

End Sub

cmdDl_Click事件设置了一个静态变量i(初值默认为0)来记录用户的重试次数,当重试次数达到三次且用户名或密码不正确时,将退出登录。程序中“rscmdUser”是数据环境中命令“cmdUser”的记录集名。由于数据的记录集无NoMatch属性,所以这里用DE.rscmdUser.EOF属性来判断查找是否成功,查找成功DE.rscmdUser.EOF=False

实例2.多表联合浏览记录。[9-9]讨论了使用Data数据控件实现单个数据表记录的浏览操作,本例要实现的是从StudentScore表联合浏览学生的基本信息及成绩信息。程序运行效果如图9-22所示。

9-22 用户登录

窗体设计如下:

1.设置窗体Caption=“多表联合浏览”、MaxButton=FalseMinButton=FalseBorderStyle=1-Fixed Single

2.从数据环境中拖动命令“cmdUnion”到窗体上,此时VB会自动把字段对应的标签及文本框添加到窗体,并自动设置文本的绑定。鉴于是“浏览”记录,为防止误操作修改了数据,这里把所有文本框的Locked属性设置为True

3.删除自动生成的“照片”标签及其对应的文本框,放置一Image控件到窗体,并设置其DataSource=DEDataMember=cmdUnionDataField=照片和Stretch=True

4.在窗体放置包含4个按钮的控件数组cmdBrower

5.适当调整各控件大小,并布局。

程序清单如下:

Option Explicit

Private Sub cmdBrowser_Click(Index As Integer)

    Select Case Index

        Case 0

            DE.rscmdUnion.MoveFirst

       

        Case 1

            DE.rscmdUnion.MovePrevious

            If DE.rscmdUnion.BOF Then

                DE.rscmdUnion.MoveFirst

            End If

           

        Case 2

            DE.rscmdUnion.MoveNext

            If DE.rscmdUnion.EOF Then

                DE.rscmdUnion.MoveLast

            End If

       

        Case 3

            DE.rscmdUnion.MoveLast

    End Select

End Sub

程序通过Select Case语句来判断控件数组参数Index以确定用户的操作。

实例3.报表预览及打印。报表预览及打印通常采用报表的Show方法来实现。此例在报表打印对话框中来调用报表实现预览与打印。程序运行结果如图9-23所示。

9-23 报表打印预览

窗体设计过程较为简单,限于篇幅,此处不再详述。下面主要介绍报表的设计过程:

1.在VB工程中添加一个Data Report对象,并设置其Caption为“报表打印预览”、DataSource=DEDataMember=cmdUnion

2.在“报表标头”区放置一标签,并设置其Caption为“学生基本情况表”。

3.从数据环境中拖动“cmdUnion”到报表中,与上例相同,VB会自动添加所有字段的标签和文本框到报表中。删除“照片”字段及“b.学号”字段,并把其余字段的标签移至“页标头”区,文本框移至细节区。

4.在“页注脚”区右击,并选择“插入控件”|“插入当前页码”及“插入总页码”,然后放置“第”、“页 共”及“页”3个标签。

5.在“报表注脚”放置三个函数报表控件,设置它们的DataMemberDataField为“cmdUnion”和“成绩”,并分别设置它们的FunctionType属性为“rptFuncMax”、“rptFuncMin”、“rptFuncAve”,然后放置“最高分:”、“最低分:”和“平均分:”3个标签。

6.用形状和直线控件画出表边框。

7.布局完成效果如图9-24所示。

9-24 报表设计效果

在设计报表的时候用矩形和直线绘制表格边框,会比单纯用直线来得方便。同时,在绘制报表过程中要充分利用右键的快捷菜单,里面有很多实用的操作。本例程序很简单,如下所示:

Private Sub cmdPrint_Click()

    DR.Show 1

End Sub

报表预览结果如图9-25所示(页注脚部分在页的底部,图中末显示),同时,在预览窗口中单击“打印”按钮即可打印出报表。

9-25 报表预览

以上实例通过数据环境来实现VBAccess数据库的连接,这种方法在完成多表联合操作及处理报表时比使用数据控件或ADO控件更为方便。这些例子中也可以用数据控件或ADO控件来实现数据库的连接,具体方法请阅读本章前面有关内容。

VisualBasic6.0与以前版本的最大不同之处就是在数据库功能上有一个更大的提高。这也是微软公司为加强其在企业开发工具地位上的重要内容。应该说,在开发大中型企业应用软件上,Visual Basic6.0的确是最强的软件之一。相信大家在不断使用过程中会有更深的体会。

作者:Admin  
  • 上一篇:ADO控件
  • 下一篇:数据库应用的小结
  • 相关文章
    • 没有相关文章
  • VB程序设计学习网站(赣南师范学院) © 2008 版权所有 All Rights Reserved.
  • 地址:江西省赣州市经济技术开发区 赣南师范学院数学与计算机科学学院 邮政编码:341000
    Email:ZQ188@163.com 技术支持QQ:87319633 移ICP备10086号
  • GnsySjxy! V2.4