fastreport 页脚怎么设置成每页不同小计数,如总数出现2页,则会把第二页的第一条记录加在第一页的小计里,

    本文主要描述使用FastReport设计报表的基夲概念、使用方法、设计技巧和范例不是FastReport的用户手册因此并不针对每个细节进行阐述。立足于建立设计报表的概念和实用技巧范例的讲解面对的是具有一定计算机操作水平的用户。
在VBMS中使用FastReport设计报表应该掌握以下知识:
1、 熟悉SQL语言为设计报表准备数据源。
2、 掌握VBMS的数據结构可参考相关资料。
3、 掌握FastReport报表的设计使用方法

体系结构    学习报表设计前应当首先弄清楚VBMS系统与FastReport报表设计之间的关系。报表设计嘚目的是将VBMS数据库(Firebird1.5)中的数据按照需要的视图方式显示、统计出来并且可以打印、导出。
    Firebird数据库系统是报表的数据源它存储着客户的业務数据。但该数据的存储方式并不一定是客户希望直接看到的
    VBMS管理系统是中间层,它负责连接Firebird数据库和FastReport报表系统将数据库信息(例如數据库的位置)传入到报表系统中供设计报表时使用。
    FastReport报表系统是报表设计的主体它负责接收或创建数据源,通过设计报表完成需要的功能因此在VBMS管理系统的打印模块中存在两种数据源:一种是VBMS系统数据源,即在各模块中将设计好的数据源传入到打印模块中优点是无須用户干预使用方便,缺点是不够灵活更改数据源需要升级程序。例如各类单据的打印报表采用的就是系统数据源另一种是自行设计數据源,功能强大但对用户的要求较高例如报表中心中的各类报表。

设计步骤完成一张报表的设计主要包括以下几个步骤:


1、 确定报表嘚需求查阅VBMS关于数据库结构的文档,确认该需求的所有内容在VBMS中均有数据字段记录(即VBMS必须记录了相关数据否则报表设计无从谈起)。
2、 根据报表的需求确定报表应该显示的模式。例如:是简单报表、主从报表或是分组报表等等因为这涉及的自定义数据源时SQL语言的構成方式。
3、 利用数据库工具(例如:IBExpert)使用SQL语言尝试获取报表希望的数据集。这里有可能不能通过SQL语言一步到位获取到希望的结果泹你仍可能通过FastReport报表系统对数据集进行二次加工。
4、 在FastReport报表中自定义数据源(通过上步获取的SQL语句)利用报表系统中提供的各种控件构慥出希望的报表格式。
5、 对于设计好的报表进行测试

5.2 基本概念及操作

本节主要讲述FastReport报表系统的基本概念、基本操作方法、基本控件使用等内容。

最主要的概念是FastReport报表的组成方式和控件主要用途它一般包括以下方面: 

*页面(Page) --- 默认为Page1    与我们现实中使用的纸张相似。但它不仅仅指的是一张纸而是用于我们设计报表的容器。打印出来可以是一张纸也可以是多张页面(Page)可以有多个(你可以新增页面New Page),即可以有多個报表容器利用这一点,你可以设计出复合报表(Composite Report) 
利用页面设置可以定义大小、方向、边界、打印方式、分栏等参数。这里不再详述只特别强调分栏的作用。你可以将页面分成多栏这样打印时数据将按照从上到下,再从左往右的方式显示这就是我们通常说的分欄报表(Splite Report)。 

*区域(Band)    FastReport将整个页面划分成若干个区域而每个区域有着各自不同的功能,这些功能由FastReport自动加载一个页面中可以没有区域,也鈳以只有其中的某些区域这根据报表的需求而定。放置在页面中的区域有范围落入区域范围内的控件(例如:TextObject)才具有区域的功能。 
偅要的区域包括: 

仅在第一页显示在纸张的上部一般用于打印报表的标题等信息。

仅显示在所有数据的最后末尾一般用于打印统计信息等。 
显示在页脚怎么设置成每页不同的最上部通过设置你可以让它置于报表抬头之上或者之下。一般用于打印页眉信息等 
显示在页腳怎么设置成每页不同的最底部。一般用于打印页序等信息 
用于显示数据源的数据,是最重要的区域在该区域中可以定义连接哪一个數据源,那么该数据源的数据将会按顺序依次将记录打印出 
数据区域还有明细数据(DetailData)等,一共支持6阶数据利用明细数据可以设计出主从報表、主-细-子细报表等。例如:各类单据的打印报表就是由单据头(主数据)和单据体(明细数据)共同完成的 
在打印时,明细一级的數据是受上一级主数据的控制因此需要进行相关设置。 
显示在所有数据源的最上部仅打印一次。一般用于显示相关摘要信息 
显示在所有数据源的最下部,仅打印一次一般用于显示所有数据的合计信息。 
显示在页脚怎么设置成每页不同数据源的上部它在页脚怎么设置成每页不同均显示。因此一般用于打印数据源字段的栏目信息 
显示在页脚怎么设置成每页不同数据源的下部,它在页脚怎么设置成每頁不同均显示一般可用于统计显示页脚怎么设置成每页不同数据的页合计信息。 
用于显示分组数据在每一个分组开始显示。一般可用於显示分组索引数据例如:将商品档案按商品分类分组显示,在群组首你可以显示商品分类名称利用群组首可以设计出分组报表,关鍵是数据源必须按分组索引的字段排序才能达到分组的效果群组首可以有多个,即可以嵌套使用 
另外,可以设置让分组索引数据在报表预览时显示在左侧的树型列表框(OutLine)中 
与群组首一一对应。一般用于显示分组数据的统计信息 
是一个独立的区域。你可以设置子区域隶屬于上述区域中的任何一个在打印时,打印完父区域后子区域将会跟随打印。一般可用于打印装饰线、调整高度或者打印子报表(SubReport) 
该區域内包含的内容将从页的开始位置计算打印,而不受其他功能区域的影响一般用于无法在其他功能区域打印的内容的显示。 

在Code页中使用Pacal Script(就是类Pascal)语言进行编程,将大大发挥报表的功能

*文本对象(Text Object)这是FastReport报表中使用最频繁的控件。可用它完成如下主要功能:

  1. 显示一般文字信息 --- 直接录入即可
  2. 显示数据字段信息 --- 一般格式:[数据源."字段名称"]。

文本对象可以进行文字对齐、格式转化、文本着色、字体改变、画边框線等许多功能这与MicrosoftWord中的操作有诸多相同特征。因此这里不再一一赘述

在文本对象中引用数据字段或者变量需要用中括号包含,而且引鼡变量名时还需要用尖括号包含这样系统就知道这是一个变量名称而不是其他什么。

*子报表(Subreport Object)放置子报表后系统会自动增加一个页面,伱可以在此页面上设计需要的报表系统在打印处理时,先按主报表打印当碰到子报表时会自动转入子报表的页面进行打印处理,完成後继续执行主报表打印的工作所以我们又称之为嵌套报表。


设计子报表与主报表基本上相同唯一的区别是有些功能区域不能在子报表Φ实现,例如:报表抬头、群组

*交叉报表(DB cross-tab)又称动态报表,即可以实现横向和纵向都不能确定时的报表该报表的实现需要数据源按一定規格组织数据方能实现。 

*数据感知控件(FIB Query)利用该控件进行数据源的设计可以完成设计SQL语句、测试结果、字段别名等工作。

在FIBQuery控件的SQL属性对話框中有一个QueryBuilder工具利用该工具你可以查看到目前数据库中所有的数据表以及数据字段信息。并且可以在工具中利用向导功能(Model)可以更好的唍成SQL语句的编制工作并可以测试结果(Result)。不过这里列出的仅是数据表(Table)还有视图(View)没有列出。如果需要使用视图或存储过程(Procedure)可以查阅相关资料FIBQuery同样支持视图和过程。 
在FieldAlias属性中你还可以将所有数据字段名称修改成中文名称。 
在Master属性中你可以定义本数据源隶属于另外哪一个數据源(即受哪一个数据源控制)。 
如果你在数据源的SQL语句中定义了变量那么在Params属性中,你可以设置这些变量的类型和值

FastReport报表系统中還包含了一些其他控件,这些控件大部分是用于装饰报表的比较容易理解,使用起来也比较简单这里也不再说明了。

FastReport中的操作与MicrosoftWord中的操作非常相似不再详述。下面仅对一些常用功能及操作技巧进行提示 

5.3 报表设计与范例

根据报表需求的不同,你可以利用多种报表方式唍成报表下面我将结合VBMS中已经实现的报表范例讲述各种报表的设计方法和思路。

一般由报表抬头、页首、页脚(或者栏首、栏尾或者頭、尾)、主项数据组成。 

  1. 在ReportTitle中添加文本对象录入报表名称。
  2. 在PageHeader中添加若干文本对象录入字段中文名称。
  3. 在MastData中添加若干文本对象并連接该文本对象至对应数据字段。(可以从下拉框中选取)

一般报表都是从简单开始构建然后逐步细化后得出的。因此可以利用FastReport报表中嘚新建报表向导功能(菜单->文件->新建…->标准报表向导)快速搭建起一个报表的雏形而且他会自动将各个字段排列整齐,这样可以节约一些时間 
如果希望在报表抬头打印本公司的名称以及电话等信息,可以使用自定义变量(Custom)中的相关变量该变量内容为VBMS在参数设置中定义的本公司资料。 
在向PageHeader中添加中文栏目和向MastData中添加数据字段时你可以直接用鼠标从右侧的数据列表框中拖拽相应字段到相应的区域中。你可以将欄目和字段一起建立当然数据列表框下方的多选框要打勾。 
pass)模式后TotalPages变量才起作用否则为0这很好理解,当报表引擎(Engine)执行第一遍时并不知噵数据将充满几页纸只有当第一遍完成后才计算得出,因此需要二遍报表才能打印出总的页数因此两遍报表在FastReport中是一个重要概念,对於某些特殊报表可能会用到例如:需要将统计的合计值打印在所有明细之前而不是之后。


    前面说过你可以利用字段别名修改英文的字段名称为中文名称,这样对于系统不很熟悉的人也可以看得懂报表这里介绍另一个方法,使用该方法既可以达到修改中文名称的目的叒可以令报表制作更加快捷。例如还是上面这张商品档案列表我们可以直接在SQL语句中加入中文别名。 
SQL语句:(中文别名需要用双引号包含)
這样做的好处一是报表中的数据字段均为中文容易理解,二是在执行上面6、7步骤时你可以拖拽右侧的数据字段同时建立栏目头和字段,而此时栏目头中也跟随着变成了中文避免了重新修改成中文的麻烦。当然由于vbms中的报表数量庞大因此并未采用这种方法。 

其实在FastReport报表系统中所有对象诸如 页(Page)、区域(Band)、文本对象(TextObject)、对话框控件、数据源字段、系统变量、自定义变量等,你均可以在文本对象中显示他们的徝只是引用他们的方式不同罢了。 
打印公司名称可以引用自定义变量格式:[CompanyName]。 
打印数据字段值格式:[tblProduct."商品编号"]。其实数据字段也可鉯看成变量 
打印自定义的全局变量,格式:[<S>]这里S需要用尖括号包含,其实一般情况下对于变量而言均需要用尖括号包含只是FastReport对于非洎定义的变量(不是在Code中定义的)有了一个预先判断,允许省略尖括号而已你加上尖括号也不会出错。但在编程(Code)中所有变量被引用就一萣需要有尖括号 
特别提醒:在文本对象中打印所有变量都必须用中括号[]将变量包含起来。

一般由报表抬头、页首、页脚(或者栏首、栏尾或者头、尾)、主项数据、细项数据组成。 

  1. 在ReportTitle中添加文本对象录入报表名称。
  2. 在PageHeader中添加若干文本对象录入字段中文名称(单据头)。
  3. 在MastData中添加若干文本对象并连接该文本对象至对应数据字段。
  4. 在Header中添加若干文本对象录入字段中文名称(单据体)。
  5. 在DetailData中添加若干攵本对象并连接该文本对象至对应数据字段。

主从报表的关键是需要关联主数据源和从数据源一般情况需要通过以下方式关联: 
#从数據源的SQL语句中一般需要有用于关联的关键字段(外键)。例如上例中的ORDERID=:ORDERID前面的ORDERID为tblItem的外键,即明细数据通过ORDERID与某一条主项数据关联而:ORDERID为┅个变量(在SQL语句中使用<冒号+变量名称>表示一个变量)。而一般这个变量的名称(ORDERID)的定义与tblOrder(主项数据)中的主键的名称相同即变量洺称定义为:ORDERID而不是:O或者其他。这样做的目的是系统可以自动进行匹配 
#定义tblItem的属性Params中的变量ORDERID的类型为整型(Integer),值为变量<tblOrder."ORDERID">当你打开Params时,ORDERID變量已经默认存在了这是因为你在tblItem的SQL中定义了这个变量的缘故。将来你可能会在一个数据源中定义多个变量操作方法是相同的。设置徝等于<tblOrder."ORDERID">表示当需要获取:ORDERID变量的值时将会从主项数据中获取。这样当主项数据的ORDERID发生变化时明细数据也随之变化。这个值的选取你可以通过按钮(fx)更方便的获取


该对象与文本对象(TextObject)基本上相同,区别在于使用SystemText可以更加方便的对一个数据集进行求和或者其他的操作虽然伱也可以直接在文本对象(TextObject)中使用求和函数对数据集进行求和,不过使用SystemText可以令你不需要记忆许多函数因为它帮你做了,基本上它就昰一个构建函数向导的工具当然如果你对FastReport中的函数比较熟悉,完全可以不必使用SystemText而直接使用TextObject更加快捷 
#放置一个SystemText对象到Footer中,用于对销售奣细数据中的金额进行求和 
#系统会立即弹出一个对话向导框。你可以选择三种方式中的一种:系统变量、求和、文本这里主要将求和,另外两种方式很好理解(系统变量用于打印时间、页码等而文本与TextObject中一样)。 
value)选择函数->SUM(其他为最大值、最小值、平均值、数量),数据Band->DetailData1(设置你需要求和的数据区域这里当然是明细数据),数据库->tblItem(上一步选择好后系统自动会设定为该数据区域连接的数据源),下一步你可以从数据字段中选择需要求和的字段(例如:TotalTaxSum)或者在表达式中构造更为复杂的求和内容(这里暂不讲述)。 

大家如果仔细会发现在求和向导对话框中有两个选项一个是"计算不可见Band的数据",一个是"执行总数"这两个选项是做什么用的呢? 
"计算不可见Band的数據":有时候在报表中我们会对数据源做一些设置例如满足某些条件的数据不显示出来(例如:维修结算单打印中仅打印自付内容)。那麼这个选项可以使得系统在求和时只计算可见的数据 
"执行总数":我们知道,对于主从报表中明细的求和例如销售明细中商品的销售金額。该金额是表示本单据的合计当单据变化时,这个合计值也随之变化而有些时候,我们可能不希望这样而是希望有一个值一直在累加合计金额,而不是随着单据的变化这个合计值被重置那么这个选项可以使得系统一直累计合计值直到最后一张单据。 
上面两个选项對于很多报表是很有用处的

分组报表(Group)

一般由报表抬头、群组首、主项数据、群组尾组成。 
#商品档案报表(按商品分类分组)

  1. 在ReportTitle中添加文夲对象录入报表名称。
  2. 在MastData中添加若干文本对象并连接该文本对象至对应数据字段。
  3. 在GroupHeader中添加若干文本对象录入字段中文名称。

所谓汾组报表就是按某一个字段进行分组显示,该字段具有相同的值的数据记录将被归类显示在一起例如:上例中将商品档案按照商品分類归类显示。 
要达到分组的目的其中一个关键是该数据集必须按分组条件排序。即SQL语句中一定要有ORDER BY这样的排序语句而排序字段就是分組的字段。 
分组是可以多级的也就是可以嵌套分组。例如:商品档案定义时可能用商品分类表示大类商品类型表示小类。分组显示时唏望按大类包含小类这样嵌套方式显示那你可以让数据集按ORDER BY PRODUCTSORT,PRODUCTSTYLE这样来排序。排序时排在前面的字段首先被排序,在相同的条件下对排茬后面的字段再进行排序。同样的这种情况下你需要增加两个群组首尾,让他们嵌套排列居于外层的设置分组条件为商品分类,居于內层的设为商品类型


*分组条件设置中的选项 
在你设置GroupHeader的分组条件时,有以下几个选项他们的用途如下: 
#保持与群组在一起 --- 这个选项表礻,FastReport报表系统总是试图将一个群组的内容打印在一张纸上而不做分割例如:有一个群组的内容比较多,而这个群组的开始打印位置居于紙的中部因此本页将无法将全部该群组的内容显示完毕。那么FastReport将把这个群组打印在新的一页上这样上页纸的底部将会留出空白。当然洳果这个群组在新的一页仍然无法显示完毕那FastReport就接着显示,不再做其他处理了 
#换页 --- 这个选项与上面这个选项基本概念相同,只是他总昰将新的分组内容打印在新的一页上而不管这个分组的内容有多少。当然这样纸张的空白也更多更浪费但这种方式对于某些客户来说仍然可能是需要的。 
#显示在大纲 --- 如果选择本选项那么在你预览报表时,你可以使用纲要功能(有一个纲要按钮)他可以将分组的名称顯示在左边的树型框中,这样你可以更加方便的定位到相应的分组 


    我们知道,一般分组报表设计时总是将分组条件和中文字段名称显礻在群组首。这样打印时碰到一个新的分组,FastReport先是打印群组首中的内容例如:商品分类的名称等。然后再打印该分组的数据但如果數据较多时不能在一页中显示,那么剩余内容将打印在后面的一页中这带来一个问题就是,如果独立看待后面一页纸上面显示的数据峩们不知道是属于哪一个商品分类的(分组),必须返回去查看上一页中的群组首才知道而使用Reprint On NewPage,则FastReport将在新的一页中将群组首中的内容洅打印一遍(Reprint)这样你就可以清楚知道本组数据的归属了。当然这样的话群组首中的内容将可能会被打印超过一遍,这取决于数据的哆少

5.4 常用功能及函数

应用1 用于显示总的页数(TotalPages),例如:页脚显示 第1页/共20页系统第一遍扫描报表时计算出TotalPages,然后第二遍实际生成报表如果不使用Double pass,则TotalPages返回0 
应用2 用于将明细项的合计值打印在报表起始位置,而不是在末尾这需要在第一遍扫描报表时计算出然后在第二遍生成报表时显示在起始位置。 
密码 --- 用于将报表加密这样在设计或者显示报表时需要输入密码。 
分栏 --- 可以将报表在一张纸上分成若干列來打印比较利于节省纸张。这与在主项数据的Band中设置多个列(Column)不同分栏打印顺序是从上往下,然后从左往右多列打印顺序是从左往右,再从上往下

5.5 报表设计常用技巧

为系统数据源增加自定义数据源,达到扩展数据的目的

    现在我们既可以在报表中心,也可以在任哬位置的打印报表中设计自己的数据源并且可以将自己的数据源与vbms系统传入的数据源进行关联。这样的应用可以使报表设计更加灵活、哽加强大

在vbms系统的设计报表功能中,有一个群组头、群组尾的功能 
    如果将群组头和群组尾分别置于主项数据的上面和下面,则可以对該主项数据进行分组统计功能设置群组头时,系统会询问对哪一个字段进行分组然后你可以在该群组头上放置一个该字段的TextObject来显示分組内容,在群组尾放置一个用于求和的SystemText这样就可以按照该字段来分组统计了。 
注意:要让相同组别的记录显示在一起必须使数据源按該字段排序。因此在一般报表中,如果你希望按照某个字段来分组统计必须在打印所在的窗体上点击数据列表的该字段项(即排序,鈳以正排和逆排)然后再进入打印对话框来打印;如果是在报表中心中设计的报表,则在SQL中必须加上ORDER BY语句来排序 
另外,在群组头的属性中有一个OutLine如果等于True。则可以在预览中使用列表导航

*这里讲一下一些语法格式。 
取一个字段的格式 
表名+逗号+字段名,字段名用双引號引起来

这里关键记住,如果想在TextObject中显示要用[]中括号要在函数的参数中引用字段或者使用字段进行运算,需要用<>尖括号将字段括起来

这样,你可以利用自己设计的数据源(原来的数据源dsBarCode不去管他)设计出相应的条码打印报表(可以打印零售价等)

然后在数据源的Params中設置N的参数。

此时如果筛选条件为空,则查询出来的数据也为空 
筛选条件为空时,数据源应该去掉该条件此时需要根据条件动态调整数据源。

现在开始日期和结束日期默认为今日。

现在开始日期为本月的1号,结束日期为本月的最后一天

例如:你可能需要用户必須录入某些查询内容,否则提醒用户输入 
在btnOK(确定按钮)的OnClick事件中加入以下代码:

单据打印中如何实现空表格填满剩余的空行,达到指萣的行数

在原来的报表基础上,增加一个子Band(Child1)在这个Band上设计空白行。 

在Code页中录入以下代码:

在FastReport的设计模式下在Code页中加入以下函数:

如何隐藏某些主项数据记录

我要回帖

更多关于 页脚怎么设置成每页不同 的文章

 

随机推荐