本文主要描述使用FastReport设计报表的基本概念、使用方法、设计技巧和范例,不是FastReport的用户手册因此并不针对每个细节进行阐述。立足于建立设计报表的概念和实用技巧范例的讲解,面对的是具有一定计算机操作水平的用户。
在VBMS中使用FastReport设计报表应该掌握以下知识:
1、 熟悉SQL语言,为设计报表准备数据源。
2、 掌握VBMS的数据结构,可参考相关资料。
3、 掌握FastReport报表的设计使用方法。
体系结构 学习报表设计前应当首先弄清楚VBMS系统与FastReport报表设计之间的关系。报表设计的目的是将VBMS数据库(Firebird1.5)中的数据按照需要的视图方式显示、统计出来,并且可以打印、导出。
设计步骤完成一张报表的设计主要包括以下几个步骤:
5.2 基本概念及操作
本节主要讲述FastReport报表系统的基本概念、基本操作方法、基本控件使用等内容。
最主要的概念是FastReport报表的组成方式和控件主要用途,它一般包括以下方面:
*页面(Page) --- 默认为Page1 与我们现实中使用的纸张相似。但它不仅仅指的是一张纸,而是用于我们设计报表的容器。打印出来可以是一张纸也可以是多张。页面(Page)可以有多个(你可以新增页面New Page),即可以有多个报表容器。利用这一点,你可以设计出复合报表(Composite
*区域(Band) FastReport将整个页面划分成若干个区域。而每个区域有着各自不同的功能,这些功能由FastReport自动加载。一个页面中可以没有区域,也可以只有其中的某些区域,这根据报表的需求而定。放置在页面中的区域有范围,落入区域范围内的控件(例如:TextObject)才具有区域的功能。
仅在第一页显示在纸张的上部。一般用于打印报表的标题等信息。
仅显示在所有数据的最后末尾。一般用于打印统计信息等。
显示在每页的最上部。通过设置你可以让它置于报表抬头之上或者之下。一般用于打印页眉信息等。
显示在每页的最底部。一般用于打印页序等信息。
用于显示数据源的数据,是最重要的区域。在该区域中可以定义连接哪一个数据源,那么该数据源的数据将会按顺序依次将记录打印出。
数据区域还有明细数据(DetailData)等,一共支持6阶数据。利用明细数据可以设计出主从报表、主-细-子细报表等。例如:各类单据的打印报表就是由单据头(主数据)和单据体(明细数据)共同完成的。
在打印时,明细一级的数据是受上一级主数据的控制,因此需要进行相关设置。
显示在所有数据源的最上部,仅打印一次。一般用于显示相关摘要信息。
显示在所有数据源的最下部,仅打印一次。一般用于显示所有数据的合计信息。
显示在每页数据源的上部,它在每页均显示。因此一般用于打印数据源字段的栏目信息。
显示在每页数据源的下部,它在每页均显示。一般可用于统计显示每页数据的页合计信息。
用于显示分组数据,在每一个分组开始显示。一般可用于显示分组索引数据。例如:将商品档案按商品分类分组显示,在群组首你可以显示商品分类名称。利用群组首可以设计出分组报表,关键是数据源必须按分组索引的字段排序才能达到分组的效果。群组首可以有多个,即可以嵌套使用。
另外,可以设置让分组索引数据在报表预览时显示在左侧的树型列表框(OutLine)中。
与群组首一一对应。一般用于显示分组数据的统计信息。
是一个独立的区域。你可以设置子区域隶属于上述区域中的任何一个。在打印时,打印完父区域后,子区域将会跟随打印。一般可用于打印装饰线、调整高度或者打印子报表(SubReport)。
该区域内包含的内容将从页的开始位置计算打印,而不受其他功能区域的影响。一般用于无法在其他功能区域打印的内容的显示。
*对话框(DialogPage)你可以通过设计对话框完成对数据源进行动态控制的目的,这也是设计复杂报表的重要手段。
在Code页中,使用Pacal Script(就是类Pascal)语言进行编程,将大大发挥报表的功能。 |
*文本对象(Text Object)这是FastReport报表中使用最频繁的控件。可用它完成如下主要功能:
文本对象可以进行文字对齐、格式转化、文本着色、字体改变、画边框线等许多功能,这与MicrosoftWord中的操作有诸多相同特征。因此这里不再一一赘述。
在文本对象中引用数据字段或者变量需要用中括号包含,而且引用变量名时还需要用尖括号包含,这样系统就知道这是一个变量名称而不是其他什么。 |
*子报表(Subreport Object)放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表。系统在打印处理时,先按主报表打印,当碰到子报表时会自动转入子报表的页面进行打印处理,完成后继续执行主报表打印的工作,所以我们又称之为嵌套报表。
*交叉报表(DB cross-tab)又称动态报表,即可以实现横向和纵向都不能确定时的报表。该报表的实现需要数据源按一定规格组织数据方能实现。
*数据感知控件(FIB Query)利用该控件进行数据源的设计,可以完成设计SQL语句、测试结果、字段别名等工作。
在FIBQuery控件的SQL属性对话框中有一个QueryBuilder工具。利用该工具你可以查看到目前数据库中所有的数据表以及数据字段信息。并且可以在工具中利用向导功能(Model)可以更好的完成SQL语句的编制工作,并可以测试结果(Result)。不过这里列出的仅是数据表(Table),还有视图(View)没有列出。如果需要使用视图或存储过程(Procedure)可以查阅相关资料,FIBQuery同样支持视图和过程。 |
FastReport报表系统中还包含了一些其他控件,这些控件大部分是用于装饰报表的,比较容易理解,使用起来也比较简单,这里也不再说明了。
FastReport中的操作与MicrosoftWord中的操作非常相似,不再详述。下面仅对一些常用功能及操作技巧进行提示。
5.3 报表设计与范例
根据报表需求的不同,你可以利用多种报表方式完成报表。下面我将结合VBMS中已经实现的报表范例讲述各种报表的设计方法和思路。
一般由报表抬头、页首、页脚(或者栏首、栏尾,或者头、尾)、主项数据组成。
一般报表都是从简单开始构建,然后逐步细化后得出的。因此可以利用FastReport报表中的新建报表向导功能(菜单->文件->新建…->标准报表向导)快速搭建起一个报表的雏形,而且他会自动将各个字段排列整齐,这样可以节约一些时间。 |
前面说过,你可以利用字段别名修改英文的字段名称为中文名称,这样对于系统不很熟悉的人也可以看得懂报表。这里介绍另一个方法,使用该方法既可以达到修改中文名称的目的,又可以令报表制作更加快捷。例如还是上面这张商品档案列表。我们可以直接在SQL语句中加入中文别名。
SQL语句:(中文别名需要用双引号包含)
这样做的好处,一是报表中的数据字段均为中文容易理解,二是在执行上面6、7步骤时,你可以拖拽右侧的数据字段同时建立栏目头和字段,而此时栏目头中也跟随着变成了中文,避免了重新修改成中文的麻烦。当然由于vbms中的报表数量庞大,因此并未采用这种方法。
其实在FastReport报表系统中,所有对象诸如 页(Page)、区域(Band)、文本对象(TextObject)、对话框控件、数据源字段、系统变量、自定义变量等,你均可以在文本对象中显示他们的值,只是引用他们的方式不同罢了。 |
一般由报表抬头、页首、页脚(或者栏首、栏尾,或者头、尾)、主项数据、细项数据组成。
主从报表的关键是需要关联主数据源和从数据源。一般情况需要通过以下方式关联: |
该对象与文本对象(TextObject)基本上相同,区别在于使用SystemText可以更加方便的对一个数据集进行求和或者其他的操作。虽然你也可以直接在文本对象(TextObject)中使用求和函数对数据集进行求和,不过使用SystemText可以令你不需要记忆许多函数,因为它帮你做了,基本上它就是一个构建函数向导的工具。当然如果你对FastReport中的函数比较熟悉,完全可以不必使用SystemText而直接使用TextObject更加快捷。
#放置一个SystemText对象到Footer中,用于对销售明细数据中的金额进行求和。
#系统会立即弹出一个对话向导框。你可以选择三种方式中的一种:系统变量、求和、文本。这里主要将求和,另外两种方式很好理解(系统变量用于打印时间、页码等,而文本与TextObject中一样)。
value)。选择函数->SUM(其他为最大值、最小值、平均值、数量),数据Band->DetailData1(设置你需要求和的数据区域,这里当然是明细数据),数据库->tblItem(上一步选择好后,系统自动会设定为该数据区域连接的数据源),下一步你可以从数据字段中选择需要求和的字段(例如:TotalTaxSum)。或者在表达式中构造更为复杂的求和内容(这里暂不讲述)。
大家如果仔细会发现在求和向导对话框中有两个选项,一个是"计算不可见Band的数据",一个是"执行总数"。这两个选项是做什么用的呢? |
分组报表(Group)
一般由报表抬头、群组首、主项数据、群组尾组成。
#商品档案报表(按商品分类分组)
所谓分组报表,就是按某一个字段进行分组显示,该字段具有相同的值的数据记录将被归类显示在一起。例如:上例中将商品档案按照商品分类归类显示。 |
*分组条件设置中的选项
在你设置GroupHeader的分组条件时,有以下几个选项,他们的用途如下:
#保持与群组在一起 ---
这个选项表示,FastReport报表系统总是试图将一个群组的内容打印在一张纸上而不做分割。例如:有一个群组的内容比较多,而这个群组的开始打印位置居于纸的中部,因此本页将无法将全部该群组的内容显示完毕。那么FastReport将把这个群组打印在新的一页上,这样上页纸的底部将会留出空白。当然如果这个群组在新的一页仍然无法显示完毕,那FastReport就接着显示,不再做其他处理了。
#换页 --- 这个选项与上面这个选项基本概念相同,只是他总是将新的分组内容打印在新的一页上,而不管这个分组的内容有多少。当然这样纸张的空白也更多更浪费。但这种方式对于某些客户来说仍然可能是需要的。
#显示在大纲 --- 如果选择本选项,那么在你预览报表时,你可以使用纲要功能(有一个纲要按钮)。他可以将分组的名称显示在左边的树型框中,这样你可以更加方便的定位到相应的分组。
5.4 常用功能及函数
应用1 用于显示总的页数(TotalPages),例如:页脚显示 第1页/共20页。系统第一遍扫描报表时计算出TotalPages,然后第二遍实际生成报表。如果不使用Double pass,则TotalPages返回0。
应用2 用于将明细项的合计值打印在报表起始位置,而不是在末尾。这需要在第一遍扫描报表时计算出然后在第二遍生成报表时显示在起始位置。
密码 --- 用于将报表加密,这样在设计或者显示报表时需要输入密码。
分栏 --- 可以将报表在一张纸上分成若干列来打印,比较利于节省纸张。这与在主项数据的Band中设置多个列(Column)不同,分栏打印顺序是从上往下,然后从左往右。多列打印顺序是从左往右,再从上往下。
5.5 报表设计常用技巧
A 为系统数据源增加自定义数据源,达到扩展数据的目的
现在,我们既可以在报表中心,也可以在任何位置的打印报表中设计自己的数据源,并且可以将自己的数据源与vbms系统传入的数据源进行关联。这样的应用可以使报表设计更加灵活、更加强大。
在vbms系统的设计报表功能中,有一个群组头、群组尾的功能。
如果将群组头和群组尾分别置于主项数据的上面和下面,则可以对该主项数据进行分组统计功能,设置群组头时,系统会询问对哪一个字段进行分组。然后你可以在该群组头上放置一个该字段的TextObject来显示分组内容,在群组尾放置一个用于求和的SystemText。这样就可以按照该字段来分组统计了。
注意:要让相同组别的记录显示在一起,必须使数据源按该字段排序。因此,在一般报表中,如果你希望按照某个字段来分组统计,必须在打印所在的窗体上点击数据列表的该字段项(即排序,可以正排和逆排),然后再进入打印对话框来打印;如果是在报表中心中设计的报表,则在SQL中必须加上ORDER BY语句来排序。
另外,在群组头的属性中有一个OutLine,如果等于True。则可以在预览中使用列表导航。
*这里讲一下一些语法格式。
取一个字段的格式,
表名+逗号+字段名,字段名用双引号引起来。
这里关键记住,如果想在TextObject中显示要用[]中括号,要在函数的参数中引用字段或者使用字段进行运算,需要用<>尖括号将字段括起来。
这样,你可以利用自己设计的数据源(原来的数据源dsBarCode不去管他)设计出相应的条码打印报表(可以打印零售价等)。
然后在数据源的Params中设置N的参数。
此时,如果筛选条件为空,则查询出来的数据也为空。
筛选条件为空时,数据源应该去掉该条件。此时需要根据条件动态调整数据源。
现在,开始日期和结束日期默认为今日。
现在,开始日期为本月的1号,结束日期为本月的最后一天。
例如:你可能需要用户必须录入某些查询内容,否则提醒用户输入。
在btnOK(确定按钮)的OnClick事件中加入以下代码:
K 单据打印中如何实现空表格填满剩余的空行,达到指定的行数。
在原来的报表基础上,增加一个子Band(Child1),在这个Band上设计空白行。
在Code页中录入以下代码:
在FastReport的设计模式下,在Code页中加入以下函数:
M 如何隐藏某些主项数据记录
有时我们希望当满足一定条件时,某些数据的字体或者颜色显示不同,以达到强调的目的。
2 选择工具栏中的强调按钮。
4 选择强调的字体,颜色。
版权声明:本文为博主原创文章,未经博主允许不得转载。 /a/article/details/
有五种视图模式,banded gridview多行表头,数据还是一行一组,最靠近数据的表头与数据一一对应;advanced banded gridview多行表头,数据可以多行一组;cardview 一个卡片是一组数据,其中左侧是标题,右侧是数据;layout view是card view的集合,布局可以自定义
(3)设计器(层次设计器中点击Run Designer可调出)
设计器有四大功能:①主要功能的设计;②选择外观;③可以选择多个视图,内嵌编辑器的设置;④打印功能的设置
OptionsBehavior可以设置行为(是否允许新增行/是否允许删除行/是否允许编辑/是否允许展开所有分组)
FeatureBrowser://设置事件,Grid的绑定、列的绑定(有方法提示),什么都可以设置
Repository(内嵌编辑器),点击Add右侧的下拉菜单,选择你想添加的控件,比如ComboBoxEdit,再在右侧编辑控件的属性,ComboBox的话就可以设置Data下的Items集合,然后点左侧Main里的Columns,点你想在上头添加控件的列,找右侧Data下的ColumnEdit,点最右边的下拉菜单,点Existing左侧的加号,就能找到你刚才的控件,添加。会默认给该列的每一个格都加上这个控件。
法二:点击你想添加控件的列标题,再点属性栏中的ColumnEdit,下拉菜单点new,选择想添加的控件,然后Column Edit左侧会出现加号,展开加号,下方会出现许多子属性,这些都是设置内嵌的控件的属性的。
form的构造函数中添加代码:
form的构造函数中继续添加代码,效果图
实际效果图:(列标题无法显示,可能是汉字字体的问题,图中默认为宋体)
(7)鼠标滑过gridview时,鼠标所指行显示橙色
效果图:(鼠标滑过时,鼠标所指行显示橙色)
(8)gridview中的当前所选框四周加粗,效果图:
③在当前form的load事件中添加两行代码:
删除行时可以添加提示按钮,方法:
翻页:如果只要翻页按钮,可以把其余按钮设为不可见
(10)右键菜单(只能对当前单元格进行复制、粘贴、全选、剪切、操作)
选择gridView1,在属性栏的事件中双击ShownEditor事件,添加代码,效果图:↑
(12)对某列进行求和或取最大值最小值,显示在gridview底部。
(14)单元格添加颜色,效果图:
(15)gridView按某列标题进行分组(各个组可以展开收起,分组条件为用户的拖拽列,把列标题拖拽到最上方即可),效果图:
(15)根据单元格的值改变其背景色(右图是将Date列中,值小于2015的单元格染色)
实例方法[ | re模块方法]: