报表设计
除了屏幕输出外,打印报表是用户获取信息的另一条重要途径。VFP向用户提供了设计报表的可视化工具——报表设计器。在报表设计器中,你可以直接从项目管理器,或者数据环境中将需要输出的表或字段拖放到报表中,可以添加线条、矩形、圆角矩形、图象等控件,通过鼠标的拖拽就能改变控件的位置和大小。它提供了用多种多样的方式显示表的内容,而且不需要进行任何的编程,可以用极少量的工作就能使你的项目取得显著的进展。下面我们就来学习报表的设计方法。
在命令窗口输入CREATE REPORT命令,回车后就打开了报表设计器。同时“报表”菜单条也自动添加到系统菜单上,还有“报表控制”工具栏、“报表设计器”工具栏也被默认显示在VFP主窗口下。如果在您的系统中,这两个图标工具栏没有随报表设计器一起打开,请从“显示/工具栏…”菜单打开“工具栏”对话框,在该对话框中选择并打开这些工具栏。
要在报表中输出的内容被放在报表设计器窗口里。根据输出内容性质的不同,系统将它分成了多个带区,在创建一个新报表时默认有三个带区,它们是:
如果需要,还可以增加带区,对于简单报表,从“报表”菜单条的“标题/总结…”菜单项能够设置增加两个带区:
如果对报表进行了分组或是设计成多栏打印,则还会自动增加“组标头”、“组注脚”和“列标头”、“列注脚”,它们的作用与“页标头”、“页注脚”相似,分别在每个组或列的开始与结尾部分打印一次。
通过拖动分隔带区的带区条,可以随时改变每个带区的高度,如果要精确地设置带区的高度,双击带区条打开设置带区高度对话框,在对话框中输入带区的高度值。
您当然可以通过向新报表的各个带区中添加所需的控制来完成报表设计,但是心铃认为更直接有效的方法是使用VFP提供的报表向导来快速生成报表原型,然后在此基础上进行修改完善。VFP中有三种报表向导:单一表、分组/总计和一对多。每个生成不同类型的报表,并示范了报表设计器的许多功能中的一部分。我们先从最简单的一种开始。
在Student项目管理器的“文档”选项卡中,选定“报表”,单击“新建”命令按钮,再单击“报表向导”命令按钮,双击“报表向导”列表项后就进入了“报表向导”屏幕,
它和我们在第四讲中用过的“表单向导”的界面及用法都非常相似。在“步骤1
– 字段选取”中选定学生情况表的全部字段;在“步骤2
– 选择报表样式”中选取“经营式”;在“步骤3
– 定义报表布局”中按如下设置:列数:2,字段布局:行,方向:纵向;在“步骤4
– 排序记录”中选定索引“XH”;
在“步骤5
– 完成”中选择“保存后在报表设计器中修改”并以“学生情况简表”作为报表标题后单击“完成”命令按钮;在弹出的“另存为”对话框中选择reports目录,将报表命名为“学生情况简表”
,单击“保存”命令按钮后可以看到完成后的报表如图9.1所示。单击“常用工具栏”上的“打印预览”按钮就可以看到报表的实际输出效果。

在预览时,细心的读者一定会发现报表上“系代码:jx”的字样显然是我们不希望出现的。为此,我们做一点修改。首先用“报表设计器”工具栏中的“数据环境”图标按钮打开数据环境,可以看到“学生情况”表已被自动加入到其中。为了在报表上显示系的名称而不是代码,我们还需将“系代码”表添加到数据环境中,并建立这两个表的关系。
加入“系代码”表后,在“学生情况”表的xdm字段上按下鼠标左键,拖动到“系代码”表的dm字段上释放,这时系统弹出一个对话框,询问是否要创建一个索引,因为我们还没有为“系代码”表建立索引,所以无法直接建立关系。我们选择“确定”创建索引,则对话框消失,指定的关系被建立。
回到报表设计器,利用“报表控件”工具栏中的“标签”图形按钮将细节栏内的“系代码”改为“所在系”,并双击其旁边的“XDM”域控件,则会弹出如图9.2所示的“报表表达式”对话框,单击“表达式”框右边带圆点的命令按钮,打开表达式生成器,在字段列表框中,双击“系代码.mc”项,待其出现在“报表字段的表达式”编辑框中后,单击两次“确定”命令按钮回到报表设计器窗口。

再预览一下,OK,问题已经解决了。如果您对报表的布局不太满意的话,还可以利用网格线、“布局”工具栏、系统的“格式”菜单以及“调色板”工具栏来美化报表。其中网格线、“布局”工具栏和“调色板”工具栏的使用方法与它们在表单中的用法相同。只有打印机硬件支持彩色输出时,设置控件的颜色才有意义,否则只能通过“预览”功能在屏幕上看到彩色效果。
系统“格式”菜单提供了控件格式的所有功能:其中“分组”菜单项将选择的多个控件合为一组,便于进行移动等操作,分组以后还能够再取消。当有控件被重叠放置时,可以使用“置前”和“置后”菜单项设置它们的叠放次序。“文本对齐方式”又6个选项,对于字段或表达式值的输出,可以选择“左对齐”、“右对齐”和“中间对齐”,这种对齐是输出的值相对于控件本身而言的;对于标签文本,在一个标签中通过按回车键输入多行时,可以控制多行文本的行距。“填充”和“绘图笔”菜单项是对线条或线框起作用的。“方式”菜单项可以指定选定的控件是否透明。
你甚至可以重新设置报表的页面,包括纸张的大小、一栏还是多栏等。从“文件/页面设置…”菜单项能够打开“页面设置”对话框。其中“打印设置…”命令按钮用来设置纸张的大小,打印精度等,具体与打印机的类型有关。可以选择打印的列数,如果是多列打印,还能够使用“打印顺序”设置内容的输出顺序。
如果你不想让在报表打印时记录指针的移动,影响在程序的其他部分中指向相同表的记录指针的位置,请选中系统菜单“报表”中的“私有数据工作期”菜单项。举例来说,如果当您正在屏幕上查看学生情况表的记录的时候,要打印学生情况简表,为报表选择一私有数据工作期,可以保护屏幕上被查看表的记录指针的位置。这有点儿类似于USE AGAIN命令。
向导为我们做了大部分的工作,但它到底是怎么干的?有必要进一步了解。
首先看看“页注脚”栏中的域控件,双击它,在“报表表达式”对话框中可以看清它的表达式:
"页 " + ALLTRIM(STR(_PAGENO))
_PAGENO是VFP的系统内存变量,它存放着当前的页码。这是一个数值型变量,为了和字符常量"页 "一同显示,需用STR()函数将其转换成字符型,ALLTRIM()可以去掉转换后字符的前后空格。
再双击 “细节”栏中的“JL”(简历) 域控件,在“报表表达式”对话框中可以看到“溢出时伸展”复选框是被选中的,这意味着,当简历字段实际输出的数据超过了“JL” 域控件的空间范围时,控件框将自动向下伸展,直至容纳下所有的数据。对于变长字段,此功能太重要了。
然而当报表中有变长字段输出时,就会对其它的控件产生影响,例如在设计时,一个记录的多个字段被放在同一行,保持水平对齐。但在实际打印时,某一个记录中有一个变长字段占用了两行,那么其它那些只占一行的字段如何在两行空间中放置呢?
对于字段输出,在“报表表达式”对话框中,有一个包含三个选项按钮的“域控件位置”按钮组,就是用来解决这一问题的;对于图象/通用字段以及垂直线和矩形框输出,通过双击控件也会显示一个对话框,其中含有同样意义选项按钮的“对象位置”按钮组,它们的意义如下:
对于垂直线和矩形框,不仅它的位置能够适应变长字段的影响,而且本身还能够随着变长字段的伸展而伸展。这一功能使你在设计一个带封闭线的表格时,不用担心伸展字段会破坏格线的封闭。双击垂直线或矩形框就能打开“矩形/线条”对话框,其中的“向下伸展”选项按钮组,提供了三种选择方案:
需要强调:“域控件位置”、 “对象位置”和“向下伸展”,是考虑受其它伸展字段的影响而进行设置的,与它本身是否设置成“溢出时伸展”没有关系。
怎么样,看起来挺简单的一个报表,还是有不少名堂吧?如果您兴趣不减还可以试着利用报表向导再生成其他样式的报表,如帐务式。它将有助于您了解“页标头”栏、线条和矩形控件的使用。