第九章 报表与标签
9.1 报表向导
9.2 报表格式设计基础
9.3 控件使用
9.4 数据环境
9.5 数据分组
9.1 报表向导报表是处理数据库信息功能中重要的一部分,是各种数据最常用的输出格式 。
报表设计器和报表向导为用户进行报表设计提供了极方便的工具 。
在,项目管理器,窗口中,选定,报表,,选择,新建,。
也可以从菜单中调用,报表向导,,从,工具,菜单中,选择
,向导,命令,然后选定,报表,。 选定想创建的报表类型 。
启动报表向导的方法有两种:
l在项目管理器中选择,报表,项,再单击,向导,。
l在,文件,菜单中选择,新建,,在,新建,对话框中选择,报表,项,然后,单击按钮,向导,。 在,向导选取,对话框中,选择,报表向导,项,单击,确定,。
9.1.1 单一报表单一报表是用一个表创建的报表。
使用单一报表向导的操作共 6步,选择字段、分组记录、选择报表样式、定义报表布局、排序记录、完成。
例 9-1 用报表向导创建一个反映学生成绩的报表 。
具体操作如下:
( 1) 单击,文件,菜单的,新建,菜单项,在打开的,创新建对话框,中选择,报表 |向导,,在向导选取中选定,报表向导,
。 或者单击主菜单上的,工具 |向导,,选择,报表,。
( 2) 单击,确定,按钮,打开,报表向导,对话框 ( 步骤 1) 。
在步骤 1中单击数据库与表右侧的按钮,在输出的选项中选择,
教学数据库,和一个视图文件,成绩视图,。 选定在报表中使用的字段:学号,姓名,班级,课程,成绩 。
( 3) 单击,下一步,进入步骤 2,对数据进行分组 。 首先是班级,以便保持同一班同学的整体功能,其次是课程,以保证课程成绩划分以及有关其他同一课程成绩的计算统计之方便 。 做好这一步骤后即可进入,下一步,。
( 4) 步骤 3是报表样式选择,VFP提供了 5种输出样式 。 我们在这里选取了,帐务式,。 步骤 4“定义报表布局,缺省 。 单击,下一步,进入步骤 5。
( 5) 记录排序是信息数据编排顺序的重点,这就是第 5步,
排序记录,,在这一步可以选用,成绩,,也可以选用,学号,。 我们选用的是,学号,,采用的是,升序,。
( 6) 最后一步,完成,前,可以预览 。
( 7) 如果效果良好可以在最后一步选择,保存报表供以后使用,,也可在满意的前提下选择,保存并打印报表,;不然
,则,保存后在报表设计器中修改,,单击,完成,,报表设计结束 。
建立父表与子表之间的关联是一个重要的表现内容决定项。我们选定为:课程表,课程号 =分数,课程号,如图 9-10所示。
以下的操作方法与单一表单基本相同,不再述说。以“课程号”
为排序索引,采用“升序”方式。 新建立报表例子 。
9.1.2 一对多报表向导一对多报表向导也是用于生成分组报表的,只是用于分组的记录来自父表文件,而组中包含的记录来自子表文件 。
启动,一对多报表向导,的操作与启动报表向导基本相同
,只是在,向导选取,时选择,一对多报表向导,。
一对多报表向导的操作步骤如下:
( 1) 打开相关表所在的数据库 。
( 2) 打开,报表设计器,。
( 3) 从,显示,菜单中选择,数据环境,并添加相关联的表

( 4) 从数据环境的菜单中选择,属性,,并分别为表之间的关系以及数据环境设置属性 。
( 5) 在属性窗口的对象框中选择 Relation1,并在数据选项卡中设置 OneToMany属性为,T.。
9.2 报表格式设计基础
9.2.1 报表设计器
Visual FoxPro提供了非常方便的报表设计器 。 报表设计器 (
report designer) 用于报表的设计,生成与修改 。 它由两部分组成:
l报表设计器窗口:用于设计一个报表的格式 。
l报表运行机制:根据设计好的报表格式生成一个具体的报表

报表的设计过程包括两个基本组成要点:数据源和布局 。
l数据源:通常是数据库中的表,但也可以是视图,查询或临时表 。 视图和查询将筛选,排序,分组数据库中的数据 。
l报表布局:定义报表的打印格式 。 在定义了一个表,视图或查询后,便可以创建报表或标签 。
通过设计报表,可以用各种方式在打印页面上显示数据 。 设计报表有 5个主要步骤:
( 1) 决定要创建的报表类型 。
( 2) 设定报表的数据来源 。
( 3) 创建报表布局文件 。
( 4) 修改和定制布局文件 。
( 5) 预览和打印报表 。
在设计报表时需打开报表设计器,主要有以下几种方法:
l在文件菜单中选择,新建,然后选择,报表,。
l在文件菜单中选择,打开,命令,在打开对话框中选择,文件类型:,报表,,并在相应的位置选择报表文件名,再单击
,确定,按钮 。
l在命令窗口输入如下命令,CREAT REPORT[<报表文件名 >]
。 该命令用于建立一个新的报表并打开报表设计器 。
l在,项目管理器,中,选择,报表,项,单击,新建,按钮
,在,新建报表,对话框中单击,新建报表,按钮,屏幕上即出现,报表设计器,窗口,如图 9-12所示 。
9.2.2 报表设计器窗口及其分区
“报表设计器”窗口是一个设计区域,在其中可以放置或格式化一些报表控件。报表设计器默认划分为 3个区:页标头、
细节、页注脚。
在,报表设计器,窗口的顶部和左部都可以显示刻度标尺
,以便能够精确设置报表控件定位 。
9.2.3 报表类型报表的总体布局可分为列报表,行报表,一对多报表,多栏报表 5
大类 。 创建报表前,应首先确定所需报表的总体布局 。
( 1) 列布局:其主要特征是报表每行一条记录,记录的字段在页面上按水平方向放置 。 这种报表布局比较常用 。 各种分组,汇总报表,财政报表,各类清单等都可以使用这种布局格式 。
( 2) 行布局:报表只有一栏记录,一个记录占用报表多行位置,
字段沿报表边沿向下排列;每行记录的字段在一侧竖直放置,这类报表布局适用于各类清单,列表使用 。
( 3) 一对多布局:报表基于一条记录及一对多关系生成 。 打印时在父表中取得一条记录后,必须将子表与其相关的多条记录取出打印 。 这类报表布局多用于基于表间一对多关系 。
( 4) 多栏布局:报表拥有多栏记录 。
( 5) 标签布局:这类布局一般拥有多栏记录,记录的字段沿左侧竖直放置对齐,向下排列,一般打印在特殊纸上,多用于邮件标签
,名字标签等的布局 。
9.2.4 报表菜单进入报表设计器窗口后,将在菜单栏中出现,报表,菜单 。 菜单项有:
l标题 /总结:指定报表中是否包含一个报表,标题,区和一个
,总结,区 。 它的选定会弹出一个,标题 /总结,对话框 。
l数据分组:完成报表细节区数据的分组打印设计 。 选择该菜单项,将激活一个数据分组对话框 。
l变量:在报表中建立,修改,删除报表内存变量,或改变变量的计算顺序 。 系统可以完成一些计算结果 。
l默认字体:为所有正在或将要设计的报表选择默认的字体,
字号大小及风格 。
l私有数据工作期:为报表所具有的数据环境设定或不设定为私有数据工作期方式 。 在私有数据工作期方式,每个报表具有各自独立的数据环境 。
l快速报表:可以快速制表 。
l运行报表:运行当前或已完成的报表程序 。
一个完整的报表设计器窗口分为 7个区,它显示了对象显示或打印的具体位置 。 将对象放到某一个分区,可以产生与该区匹配的项目,内容 。
l“标题,区:用户可以在,标题,区中放置报表标题,日期,
页数,公司标志或围绕标题的边框及其修饰报表标题的控件 。
l“页标头,区:在页标头区一般放置报表列标题或日期,页码等控件 。 在运行报表时,在报表首页的报表标题后和其他各页的起始处将打印一次页标头区的内容 。 此区是默认带区 。
l“列标头,区:,列标头,区只在使用多栏报表时才有效,
其中可以放入栏标题等控件 。 运行报表时,在报表每栏上打印一次,列标头,区的内容 。
l“组标头,区:只有在报表中使用分组操作时才出现该区 。
在一个报表中可以有多个,组标头,区 。 在其中可以放入分组字段,分隔线等控件 。 运行报表时,在报表每组的开始处 打印一次,组标头,区内容 。
l,细节,区:在该区中应放入报表的主要数据和一些描述性文字 。 运行报表时,将对每一条符合条件的记录打印一次所有的,细节,区内容 。 此带区是默认带区 。
l,组注脚,区:每个,组注脚,区与相应的,组标头,区一一对应 。 一般放入各分组的总计和小记的文本 。 运行报表时
,在每组结束时将打印一次,组注脚,的内容 。
l,页注脚,区:在,页注脚,区中一般放入日期,页码,
分类总计线,分类总计以及一些说明性文本 。 运行报表时,在报表每页的末尾打印一次,页注脚,区的内容 。 此带区是默认带区 。
l,总结,区:在,总结,区中可以放入对整个内容进行总结的一些控件,如:各种数据的总结,平均值等 。 其内容将在整个报表的最末尾出现 。
9.3.2 域控件域控件用于表达式,字段,内存变量或其他表达式的显示,以表示表的字段,变量和计算结果的值 。 该字段的添加,可以连接
,裁剪,格式化,调整这些字段,以及设置字体和模板 。 也可以添加日期字段和页码 。
可以使用几种方法来添加域控件 。
l从数据环境中添加表字段作为域控件 。 可以打开报表的数据环境,选择一个表或视图,将字段拖拉到页面中 。
l从工具栏中添加表的字段作为域控件 。 从,报表控件,工具栏中,插入一个域控件 。 在,报表表达式,对话框中,选择,表达式,框后的对话按钮 。 在,字段,框中,双击所需要的字段名
,则表名和字段名将出现在,报表字段的表达式,框中 。
可从,报表控件,工具栏中插入一个域控件显示当前日期 。 在
,报表表达式,对话框中,选择,表达式,框后的对话按钮 。 在
,表达式生成器,中,从,日期,列表选择 DATE( )。 确定 。
每一页的页标头带区或者页注脚带区通常会包含一个页码 。 如果使用向导或快速报表,页码会自动插入页注脚带区中 。
要插入一个页号,从,报表控件,工具栏中插入一个域控件;
在,报表表达式,对话框中选择,表达式,框后的对话按钮;在
,表达式生成器,中,从,变量,列表中选择 _pageno,选择,
确定,。 在,报表表达式,对话框中,选择,确定,。
在,报表表达式,对话框中,选择,表达式,框后的对话按钮
。 在,格式,对话框中,为该字段选择数据类型:,字符型,,
,数值型,或,日期型,。,编辑选项,区域将会显示该数据类型下的各种格式选项 。
l选择对齐方式和所需的格式选项 。
,格式,对话框,编辑选项,区域中所显示的选项随您所选定的数据类型的不同而不同 。 通过在,格式,框中键入字符,还可以建立一个格式模板 。
在域中对齐文本不会改变控件在报表上的位置,只是在控件内对其内容进行格式调整。有两种方法可以调整控件中内容的位置,
直接在域控件中调整文本对齐。
l选择要更改的控件 。
在,格式,菜单中,选择,文本对齐方式,。 从该子菜单中,选择合适的选项 。 在域中调整文本对齐 。 对于每个域控件或标签控件,可以改变字体和文本的大小 。 还可改变整个报表的默认字体 。
在报表控件工具栏中单击域控件按钮,在报表布局相应位置按下鼠标左键,拖动产生一个合适大小的字段框,松开鼠标左键,
在出现的报表表达式对话框的表达式框中可直接输入字段名,内存变量名或其他表达式 。 也可以启动表达式生成器对话框,在此对话框的字段区中显示数据环境中所包含的各表或视图文件的字段名,即将其加入到报表字段的表达式框,最后单击确定按钮 。
l使用域控件在报表布局标题区加入当前日期字段控件 。
在表达式生成器的日期列表中选择 DATA(),选择,确定,。
9.3.3 统计计算、汇总单击报表表达式对话框中的计算按钮,则系统将打开计算字段对话框 。 该对话框允许选择一种数学运算,用计算结果来创建一个字段 。
分类汇总或计算区中各选项的意义如下:
l不计算:指定不计算此表达式 。
l计数:计算每组,每页,每列或每个报表 ( 取决于,重置,框中的选择 ) 中打印变量的次数 。 此计算操作基于变量出现的次数,
而不是变量的值 。
l总和:计算变量值的总和 。 求和操作在运行时对每组,每页,
每列或每个报表 ( 取决于,重置,框中的选择 ) 进行变量值的求和计算 。
l平均值:在组,页,列或报表 ( 取决于,重置,框中的选择 )
中计算变量的算术平均值 。
l最小值:在组,页,列或报表中显示变量的最小值 。 将组中第 1个记录的值放入变量,当更小的值出现时,此变量的值随之更改 。
l最大值:在组,页,列或报表中显示变量的最大值 。
l标准误差:返回组,页,列或报表 ( 取决于,重置,框中的选择
) 中变量的方差的平方根 。
l方差:衡量组,页,列或报表 ( 取决于,重置,框中的选择 ) 中各个字段值与平均值的偏离程度 。
在,报表设计器,中,用户可以将多个表字段接合在一起作为一个域控件加入到报表布局 。
例 9-4 在上例 9-3的基础上,在页标头区添加报表输出字段;在细节区放置,学号,,,姓名,,,课程,,,成绩,字段变量 。
( 1) 在,报表控件,窗口中单击,标签,控件,然后在页标头区单击
,接着输入,学号,等文字 。
( 2) 在格式页面上右击,在弹出式菜单中选择,数据环境,,从数据库中添加相应对象到数据环境中 。
( 3) 在,报表控件,中单击,域控件,,在,报表表达式,中选择,
学生,学号,。,确定,。 其余亦同 。
9.3.3 统计计算、汇总单击报表表达式对话框中的计算按钮,则系统将打开计算字段对话框 。 该对话框允许选择一种数学运算,用计算结果来创建一个字段 。
分类汇总或计算区中各选项的意义如下:
l不计算:指定不计算此表达式 。
l计数:计算每组,每页,每列或每个报表 ( 取决于,重置,框中的选择 ) 中打印变量的次数 。 此计算操作基于变量出现的次数,
而不是变量的值 。
l总和:计算变量值的总和 。 求和操作在运行时对每组,每页,
每列或每个报表 ( 取决于,重置,框中的选择 ) 进行变量值的求和计算 。
l平均值:在组,页,列或报表 ( 取决于,重置,框中的选择 )
中计算变量的算术平均值 。
9.3.4 报表变量若要在报表中操作数据或显示计算结果,可以使用报表变量
。 使用报表变量,可以计算各种值,并且可以用这些值来计算其他相关值 。
l从,报表,菜单中选择,变量,命令 。
l在,报表变量,对话框中,选择,变量,框并键入一个变量名 。
l在,要存储的值,框中,键入一个字段名或其他表达式 。
l选择一个计算选项 。
l在,初始值,框中键入一个设置初始值的表达式 。
l选择,确定,按钮 。
在此之后,您便可以在报表的任何表达式中使用此变量 。
报表变量根据它们出现的先后顺序来计算,并且会影响引用了这些报表变量的表达式的值 。
如果需要更改报表变量的顺序:
( 1) 从,报表,菜单中,选择,变量,。
( 2) 在,变量,框中,拖动变量左边的按钮,重新调整顺序

( 3) 选择,确定,按钮 。
( 4) 设置变量的初始值 。
若要设置变量的初始值:
( 1) 从,报表,菜单中,选择,变量,。
( 2) 在,变量,框中,选择要设置的变量 。
( 3) 在,初始值,框中,输入值 。
( 4) 选择,确定,按钮 。
若要防止其他设计器中对全局数据工作期的更改影响您的报表数据工作期,可以把报表数据工作期设置为私有的 。
例 9-5 在例 9-4的基础上添加成绩计算 。 操作步骤如下:
( 1) 在,报表,菜单选择,标题 /总结,菜单项,选择,总结带区,。
( 2) 在,总结带区,设置标签控件,输入,总成绩,。
( 3) 设置变量:在,报表,菜单中选择,变量,菜单项,得到
,报表变量,对话框 。 在变量处设计一个变量为 NUM,要存储的值为,分数,成绩,,初始值设为 0。 在计算区域中选择,总和 ( S),单选按钮 。
( 4) 从,报表控件,中选择,域控件,,单击,总成绩:,,
在得到的,报表表达式,对话框中输入 STR( num) 。
9.3.5 线条,矩形及圆角矩形控件作为修饰型控件使用线条,矩形,圆角矩形控件 。 多数情况下是作为报表边界和分隔线 。
9.3.6 图片 /OLE绑定型控件可以使用图片 /OLE绑定型控件为报表布局加入图片或通用字段

报表是数据信息的输出形式 。 因此,需要为所做的报表设定数据来源,做好数据环境设置 。 否则无法完成报表的设计工作 。 使用数据环境设计器能够可视化地创建和修改报表的数据环境 。 当数据环境设计器窗口处于活动状态时 。 Visual FoxPro显示数据环境菜单,用以处理数据环境对象 。 可以单击鼠标右键显示数据环境设计器快捷键,从中选择属性和代码窗口 。
可以在,数据环境,中添加多个表或视图文件,并且可在相互之间建立适当的联接,方法是:用鼠标拖动父表字段至子表的索引之上,则在父表字段与子表相应索引之间出现一条关系线 。
在收集和组织数据之后,可以向应用程序中添加报表或标签,以将数据打印出来或显示在屏幕上 。 可以通过选择数据源来控制报表中所需要包含的数据,还可以创建报表变量配合原始数据的使用 。
9.4 数据环境报表数据环境的建立与表单数据环境的建立基本相同 。 若要控制报表的数据源,可以定义一个与报表一起存储的数据环境或每次运行报表时在代码中激活指定的数据源 。
使用同一数据源,将表或视图添加到报表的数据环境中 。 将
DO QUERY命令或 SELECT - SQL 命令添加到报表数据环境的
Init 事件代码中 。
使用不同的数据源集合 。 将 USE table,USE view,DO query
命令或者 SELECT-SQL 语句添加到 Click 事件代码或其他位于
REPORT 或 LABEL 命令前的代码中 。
可以利用报表所使用的数据源,来控制报表中记录的显示顺序
。 按照在表,视图或查询中的顺序处理和显示记录 。 若要在表中排序记录,可以在代码 ( 或报表的数据环境 ) 中建立一个索引 。 对于视图,查询或 SELECT - SQL 代码,可以使用 ORDER
BY 子句排序 。 如果您不想使用数据源对记录进行排序,惟一可对报表中记录进行排序的方法是利用在数据环境中的临时表上的 ORDER 属性 。
可以根据数据,给定字段或其他条件对记录进行分组,使报表更便于阅读 。 例如,可以按照学生的姓名进行分组,这样可以把每个学生的总成绩,平均成绩统 计计算出来 。
可以在,报表,菜单中,,或者在,报表设计器,工具栏中选择,数据分组,,屏幕上出现,数据分组,对话框,如图 9-14所示

9.5 数据分组图
9-
14
数据分组对话框
9.5.1 一级数据分组一个单组报表可以基于输入表达式进行一级数据分组。数据分组是在“数据分组”对话框中完成的。在该对话框的分组表达式区可以直接输入字段名或表达式作为分组标准使用。也可以启动表达式生成器来帮助建立分组表达式。在“数据分组”对话框中允许我们创建一组带区,以便分开各组记录,并显示各组的介绍信息和总体信息。数据分组对话框中的选项:
l分组表达式:键入分组表达式 。 或者,单击右边的按键,在表达式生成器中创建表达式 。
l组属性:在组属性区域,选定想要的属性,选择确定按钮 。 用以指定如何分页 。
l插入:在分组表达式框中插入一个空文本框,以便定义新的分组表达式 。
l删除:从分组表达式框中删除选定的分组表达式或空文本框

9.5.2 多级数据分组
Visual FoxPro 6.0中文版的报表支持对数据的多级嵌套分组 。
在报表内最多可以定义 20级的数据分组 。 嵌套分组有助于组织不同层次的数据和总计表达式 。
进行嵌套分组首先要确定参加分组的各字段分组表达式,然后要确定各分组的嵌套级别,即要选择一个分组层次,然后定义最经常更改的组为第 1层 。
进行多级嵌套分组的操作是:在,数据分组,对话框的,分组表达式,区中按从里到外的嵌套分组级别依次输入分组表达式

在报表中的组定义之后,可以更改它们的次序 。 用户只需在
,数据分组,对话框中直接拖动,分组表达式,前面的移动盒就可以改变分组次序 。
例 9-6 使用“报表设计器”设计平时成绩报表。如图 9-15所示。
图 9-15 平时成绩报表在标题区设置标题为,平时成绩,。 在页标头区设置列名称 。 在细节区设置与页标头区相对应的数据内容 。
在,文件,菜单选择,新建,,打开,报表设计器,报表菜单,进行以下操作:
( 1) 选择,标题 /总结,菜单项,打开,标题 /总结,对话框,从中选择,标题带区,,然后按,确定,按钮,使标题带区打开 。
( 2) 使用鼠标点击,报表控件,工具栏中,标签,控件
,再移动到标题区 。 选定输入点 。
( 3) 使用,格式,菜单中,字体,,对标题栏中的字体,字号进行选择,输入报表中使用的标题 。
( 4) 在,显示,菜单中点击,数据环境,菜单,打开,数据环境设计器,对话框添加使用的数据库或表 。
( 5) 点击,域控件,钮后,鼠标移到,细节,区,进行点击;在打开的,报表表达式,对话框中选择该列使用的字段后,进行适当的移动和调整大小 。
( 6) 使用鼠标点击报表控件工具栏中,标签,控件,再移动到页标头区;适当的选择位,输入与该列字段相对应的文字内容 。 依次完成此操作 。
( 7) 选择,报表,菜单中的,数据分组,项 。 选择,学生,班级
” 字段名 。 在组属性中选择,每页都打印组标头,复选框 。
( 8) 在全部完成后可以进行预览 。
在实施过程中应注意,① 选择好数据环境 。 ② 搞好与每一列对应的数据源选取 。 ③ 每一个区应与该区显示的内容融洽 。 ④ 为报表设置添加的计算值,如总分数,等 。 ⑤ 在设计前先考虑好报表所涉及的内容 。 ⑥ 在设计过程中搞好页面设置 。