求教公式,同时满足日期和部门的条件,返回人员明细及对应工时利用率计算公式总数

第5章 报表设计
第5章 报表设计
第5章 报表设计
汽车业务管理系统(VBMS)使用FastReport3.0报表系统设计报表。
&&&&本文主要描述使用FastReport设计报表的基本概念、使用方法、设计技巧和范例,不是FastReport的用户手册因此并不针对每个细节进行阐述。立足于建立设计报表的概念和实用技巧范例的讲解,面对的是具有一定计算机操作水平的用户。
在VBMS中使用FastReport设计报表应该掌握以下知识:
1、 熟悉SQL语言,为设计报表准备数据源。
2、 掌握VBMS的数据结构,可参考相关资料。
3、 掌握FastReport报表的设计使用方法。
&&&&学习报表设计前应当首先弄清楚VBMS系统与FastReport报表设计之间的关系。报表设计的目的是将VBMS数据库(Firebird1.5)中的数据按照需要的视图方式显示、统计出来,并且可以打印、导出。
&&&&VBMS数据库与VBMS管理系统以及FastReport报表设计之间的关系是:
&&&&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)才具有区域的功能。
重要的区域包括:
#报表抬头(ReportTitle)
仅在第一页显示在纸张的上部。一般用于打印报表的标题等信息。
#报表合计(ReprotSummary)
仅显示在所有数据的最后末尾。一般用于打印统计信息等。
#页首(PageHeader)
显示在每页的最上部。通过设置你可以让它置于报表抬头之上或者之下。一般用于打印页眉信息等。
#页脚(PageFooter)
显示在每页的最底部。一般用于打印页序等信息。
#主数据(MasterData)
用于显示数据源的数据,是最重要的区域。在该区域中可以定义连接哪一个数据源,那么该数据源的数据将会按顺序依次将记录打印出。
数据区域还有明细数据(DetailData)等,一共支持6阶数据。利用明细数据可以设计出主从报表、主-细-子细报表等。例如:各类单据的打印报表就是由单据头(主数据)和单据体(明细数据)共同完成的。
在打印时,明细一级的数据是受上一级主数据的控制,因此需要进行相关设置。
#头(Header)
显示在所有数据源的最上部,仅打印一次。一般用于显示相关摘要信息。
#尾(Footer)
显示在所有数据源的最下部,仅打印一次。一般用于显示所有数据的合计信息。
#栏首(ColumnHeader)
显示在每页数据源的上部,它在每页均显示。因此一般用于打印数据源字段的栏目信息。
#栏尾(ColumnHeader)
显示在每页数据源的下部,它在每页均显示。一般可用于统计显示每页数据的页合计信息。
#群组首(GroupHeader)
用于显示分组数据,在每一个分组开始显示。一般可用于显示分组索引数据。例如:将商品档案按商品分类分组显示,在群组首你可以显示商品分类名称。利用群组首可以设计出分组报表,关键是数据源必须按分组索引的字段排序才能达到分组的效果。群组首可以有多个,即可以嵌套使用。
另外,可以设置让分组索引数据在报表预览时显示在左侧的树型列表框(OutLine)中。
#群组尾(GroupFooter)
与群组首一一对应。一般用于显示分组数据的统计信息。
#子(Child)
是一个独立的区域。你可以设置子区域隶属于上述区域中的任何一个。在打印时,打印完父区域后,子区域将会跟随打印。一般可用于打印装饰线、调整高度或者打印子报表(SubReport)。
#重叠(overlay)
该区域内包含的内容将从页的开始位置计算打印,而不受其他功能区域的影响。一般用于无法在其他功能区域打印的内容的显示。
*对话框(DialogPage)
你可以通过设计对话框完成对数据源进行动态控制的目的,这也是设计复杂报表的重要手段。
对话框主要通过各种输入数据控件来接受客户的查询请求,因此可以学习几种主要的控件。
#标签(Label Control) --- 用于显示文字信息。使用Caption属性修改文字信息。
#文本编辑框(Edit Control) --- 用于接收用户录入的文字信息。使用Text属性修改文字信息。
#按钮(Button Control) --- 一般用于确定和取消。使用Caption属性修改文字信息。
#多选框(CheckBox Control) --- 用于用户对条件的选择。使用Checked属性确定是否。
#单选框(RadioButton Control) --- 用于用户对条件的单一选择。使用Checked属性确定是否。
#下拉框(ComboBox Control) --- 用于用户对多个数据列表的选择。使用Text属性修改当前文字信息,使用Items属性填充列表信息。
#时间框(DateEdit Control) --- 用于用户对时间的选择。利用Date属性改变时间。
在Code页中,使用Pacal
Script(就是类Pascal)语言进行编程,将大大发挥报表的功能。
*文本对象(Text
这是FastReport报表中使用最频繁的控件。可用它完成如下主要功能:
显示一般文字信息 --- 直接录入即可。
显示数据字段信息 --- 一般格式:[数据源.”字段名称”]。
显示变量内容 --- 一般格式:[&变量名&]。
显示装饰线等。
文本对象可以进行文字对齐、格式转化、文本着色、字体改变、画边框线等许多功能,这与MicrosoftWord中的操作有诸多相同特征。因此这里不再一一赘述。
在文本对象中引用数据字段或者变量需要用中括号包含,而且引用变量名时还需要用尖括号包含,这样系统就知道这是一个变量名称而不是其他什么。
*子报表(Subreport
放置子报表后,系统会自动增加一个页面,你可以在此页面上设计需要的报表。系统在打印处理时,先按主报表打印,当碰到子报表时会自动转入子报表的页面进行打印处理,完成后继续执行主报表打印的工作,所以我们又称之为嵌套报表。
设计子报表与主报表基本上相同,唯一的区别是有些功能区域不能在子报表中实现,例如:报表抬头、群组。
*交叉报表(DB
cross-tab)
又称动态报表,即可以实现横向和纵向都不能确定时的报表。该报表的实现需要数据源按一定规格组织数据方能实现。
*数据感知控件(FIB
利用该控件进行数据源的设计,可以完成设计SQL语句、测试结果、字段别名等工作。
在FIBQuery控件的SQL属性对话框中有一个QueryBuilder工具。利用该工具你可以查看到目前数据库中所有的数据表以及数据字段信息。并且可以在工具中利用向导功能(Model)可以更好的完成SQL语句的编制工作,并可以测试结果(Result)。不过这里列出的仅是数据表(Table),还有视图(View)没有列出。如果需要使用视图或存储过程(Procedure)可以查阅相关资料,FIBQuery同样支持视图和过程。
在FieldAlias属性中,你还可以将所有数据字段名称修改成中文名称。
在Master属性中,你可以定义本数据源隶属于另外哪一个数据源(即受哪一个数据源控制)。
如果你在数据源的SQL语句中定义了变量,那么在Params属性中,你可以设置这些变量的类型和值。
FastReport报表系统中还包含了一些其他控件,这些控件大部分是用于装饰报表的,比较容易理解,使用起来也比较简单,这里也不再说明了。
FastReport中的操作与MicrosoftWord中的操作非常相似,不再详述。下面仅对一些常用功能及操作技巧进行提示。
Arrow --- 在Object之间移动
Del --- 删除一个Object
Enter --- 调出选择的Object的编辑器
Shift+Arrow --- 改变Object的尺寸大小
Ctrl+Arrow --- 移动Object的位置
Alt+Arrow --- 移动选择的Object到相邻的Object的旁边并且对齐
Left button --- 选择、移动一个Object,对于多选的一组Object,可以拖动右下角的红点同时改变所选的Object的尺寸大小
Right button --- 调出右键菜单
Shift+left button --- 多选Object
Ctrl+left button --- 按住Ctrl键不放用鼠标左键可以拖出一个虚线矩形框,释放鼠标按钮可以将该矩形框内所有Object选中,然后使用left
button将选中的Object移动到所需位置
Alt+left button --- 如果针对Text
Object使用,将可以直接编辑内容,无需弹出编辑窗
5.3 报表设计与范例
根据报表需求的不同,你可以利用多种报表方式完成报表。下面我将结合VBMS中已经实现的报表范例讲述各种报表的设计方法和思路。
简单报表(Simple list)
一般由报表抬头、页首、页脚(或者栏首、栏尾,或者头、尾)、主项数据组成。
#商品档案列表
步骤如下:
新建数据源(FIB Components-&FIB
Query),起名tblProduct。(修改Name属性)
获取所需数据(tblProduct-&SQL)。
依次添加ReportTitle、PageHeader、MastData、PageFooter区域。
设置MastData区域连接的数据源-&tblProduct。(双击MastData区域)
在ReportTitle中添加文本对象,录入报表名称。
在PageHeader中添加若干文本对象,录入字段中文名称。
在MastData中添加若干文本对象,并连接该文本对象至对应数据字段。(可以从下拉框中选取)
在PageFooter中添加文本对象,录入页码。(使用FastReport中的系统变量
SELECT * FROM TB_PRODUCT;
一般报表都是从简单开始构建,然后逐步细化后得出的。因此可以利用FastReport报表中的新建报表向导功能(菜单-&文件-&新建…-&标准报表向导)快速搭建起一个报表的雏形,而且他会自动将各个字段排列整齐,这样可以节约一些时间。
如果希望在报表抬头打印本公司的名称以及电话等信息,可以使用自定义变量(Custom)中的相关变量,该变量内容为VBMS在参数设置中定义的本公司资料。
在向PageHeader中添加中文栏目和向MastData中添加数据字段时,你可以直接用鼠标从右侧的数据列表框中拖拽相应字段到相应的区域中。你可以将栏目和字段一起建立,当然数据列表框下方的多选框要打勾。
可以在PageFooter中添加页码(Page)和总页数(TotalPages)。一般在文本对象中的格式为:共[TotalPages]页 第[Page]页。但是需要声明的是,必须将报表设置成两遍报表(Double
pass)模式后TotalPages变量才起作用否则为0。这很好理解,当报表引擎(Engine)执行第一遍时并不知道数据将充满几页纸,只有当第一遍完成后才计算得出,因此需要二遍报表才能打印出总的页数。因此两遍报表在FastReport中是一个重要概念,对于某些特殊报表可能会用到。例如:需要将统计的合计值打印在所有明细之前而不是之后。
&&&&前面说过,你可以利用字段别名修改英文的字段名称为中文名称,这样对于系统不很熟悉的人也可以看得懂报表。这里介绍另一个方法,使用该方法既可以达到修改中文名称的目的,又可以令报表制作更加快捷。例如还是上面这张商品档案列表。我们可以直接在SQL语句中加入中文别名。
SQL语句:(中文别名需要用双引号包含)
PRODUCTNUMBER AS “商品编号”,
PRODUCTNAME
AS “品名规格”,
PRODUCTUNIT
AS “单位”,
SELLPRICE AS
“零售价”
FROM TB_PRODUCT
这样做的好处,一是报表中的数据字段均为中文容易理解,二是在执行上面6、7步骤时,你可以拖拽右侧的数据字段同时建立栏目头和字段,而此时栏目头中也跟随着变成了中文,避免了重新修改成中文的麻烦。当然由于vbms中的报表数量庞大,因此并未采用这种方法。
*报表中的变量
FastReport中的变量分为三种。
系统定义的一些与报表打印相关的变量,这里介绍几个常用的变量。
Date --- 系统当前日期
Time --- 系统当前时间
TotalPages --- 总页数(必须设置Double
Page --- 当前页码
Line --- 当前行序号
Line# --- 也是当前行序号,但区别是在一个新的数据区域(Band)内该变量将重新计数。
#自定义变量(Custom)
自定义变量是由VBMS系统传入到报表系统中的。
#编程(Code)中使用的全局变量
你可以在Code页的起始处定义一些需要的全局变量。
这里S就成了一个全局的字符型变量,你可以对它进行赋值、取值。也可以在文本对象中引用它,格式为:[&S&]。
其实在FastReport报表系统中,所有对象诸如 页(Page)、区域(Band)、文本对象(TextObject)、对话框控件、数据源字段、系统变量、自定义变量等,你均可以在文本对象中显示他们的值,只是引用他们的方式不同罢了。
例如:通过文本对象(TextObject)
打印文本编辑框的内容可以引用Text属性,格式:[Edit1.Text]。
打印公司名称可以引用自定义变量,格式:[CompanyName]。
打印数据字段值,格式:[tblProduct.”商品编号”]。其实数据字段也可以看成变量。
打印自定义的全局变量,格式:[&S&]。这里S需要用尖括号包含,其实一般情况下对于变量而言均需要用尖括号包含,只是FastReport对于非自定义的变量(不是在Code中定义的)有了一个预先判断,允许省略尖括号而已,你加上尖括号也不会出错。但在编程(Code)中所有变量被引用就一定需要有尖括号。
特别提醒:在文本对象中打印所有变量都必须用中括号[]将变量包含起来。
主从报表(Master Detail)
一般由报表抬头、页首、页脚(或者栏首、栏尾,或者头、尾)、主项数据、细项数据组成。
#销售单据列表
步骤如下:
新建2个数据源(FIB
Components-&FIB Query),起名tblOrder、tblItem。
获取所需数据(tblOrder-&SQL、tblItem-&SQL)。
依次添加ReportTitle、PageHeader、MastData、Header、DetailData、Footer、PageFooter区域。
设置MastData区域连接的数据源-&tblOrder,DetailData-&tblItem。
在ReportTitle中添加文本对象,录入报表名称。
在PageHeader中添加若干文本对象,录入字段中文名称(单据头)。
在MastData中添加若干文本对象,并连接该文本对象至对应数据字段。
在Header中添加若干文本对象,录入字段中文名称(单据体)。
在DetailData中添加若干文本对象,并连接该文本对象至对应数据字段。
在Footer中添加System
Text对象,用于显示金额合计。
在PageFooter中添加文本对象,录入页码。(使用FastReport中的系统变量
SELECT * FROM TB_ORDER WHERE ORDERTYPE=’销售出库’;
SELECT * FROM TB_ITEM WHERE ORDERID=:ORDERID;
主从报表的关键是需要关联主数据源和从数据源。一般情况需要通过以下方式关联:
#从数据源的SQL语句中一般需要有用于关联的关键字段(外键)。例如上例中的ORDERID=:ORDERID。前面的ORDERID为tblItem的外键,即明细数据通过ORDERID与某一条主项数据关联。而:ORDERID为一个变量(在SQL语句中使用&冒号+变量名称&表示一个变量)。而一般这个变量的名称(ORDERID)的定义与tblOrder(主项数据)中的主键的名称相同,即变量名称定义为:ORDERID而不是:O或者其他。这样做的目的是系统可以自动进行匹配。
#定义tblItem的属性Master等于tblOrder。这样明细数据就被主项数据所控制了。
#定义tblItem的属性Params中的变量ORDERID的类型为整型(Integer),值为变量&tblOrder.”ORDERID”&。当你打开Params时,ORDERID变量已经默认存在了,这是因为你在tblItem的SQL中定义了这个变量的缘故。将来你可能会在一个数据源中定义多个变量,操作方法是相同的。设置值等于&tblOrder.”ORDERID”&表示当需要获取:ORDERID变量的值时,将会从主项数据中获取。这样当主项数据的ORDERID发生变化时,明细数据也随之变化。这个值的选取你可以通过按钮(fx)更方便的获取。
*SystemText对象
该对象与文本对象(TextObject)基本上相同,区别在于使用SystemText可以更加方便的对一个数据集进行求和或者其他的操作。虽然你也可以直接在文本对象(TextObject)中使用求和函数对数据集进行求和,不过使用SystemText可以令你不需要记忆许多函数,因为它帮你做了,基本上它就是一个构建函数向导的工具。当然如果你对FastReport中的函数比较熟悉,完全可以不必使用SystemText而直接使用TextObject更加快捷。
SystemText的用法如下:
#放置一个SystemText对象到Footer中,用于对销售明细数据中的金额进行求和。
#系统会立即弹出一个对话向导框。你可以选择三种方式中的一种:系统变量、求和、文本。这里主要将求和,另外两种方式很好理解(系统变量用于打印时间、页码等,而文本与TextObject中一样)。
#选择求和(Ageregate value)。选择函数-&SUM(其他为最大值、最小值、平均值、数量),数据Band-&DetailData1(设置你需要求和的数据区域,这里当然是明细数据),数据库-&tblItem(上一步选择好后,系统自动会设定为该数据区域连接的数据源),下一步你可以从数据字段中选择需要求和的字段(例如:TotalTaxSum)。或者在表达式中构造更为复杂的求和内容(这里暂不讲述)。
#按确定后,SystemText中的文本自动生成为[SUM(&tblDetail.&TOTALTAXSUM&&,MasterData2)]。当你再次双击该SystemText,你会发现对话框中系统默认为文本,而文本内容就是上面的内容。由此可见,SystemText其实就是TextObject加上函数向导。
大家如果仔细会发现在求和向导对话框中有两个选项,一个是“计算不可见Band的数据”,一个是“执行总数”。这两个选项是做什么用的呢?
“计算不可见Band的数据”:有时候在报表中我们会对数据源做一些设置,例如满足某些条件的数据不显示出来(例如:维修结算单打印中仅打印自付内容)。那么这个选项可以使得系统在求和时只计算可见的数据。
“执行总数”:我们知道,对于主从报表中明细的求和,例如销售明细中商品的销售金额。该金额是表示本单据的合计。当单据变化时,这个合计值也随之变化。而有些时候,我们可能不希望这样,而是希望有一个值一直在累加合计金额,而不是随着单据的变化这个合计值被重置。那么这个选项可以使得系统一直累计合计值直到最后一张单据。
上面两个选项对于很多报表是很有用处的。
完整定义:SUM(Expr,Band,Flags);
Expr:你需要求和的变量或者更加复杂的函数,例如:&tblItem.”TOTALTAXSUM”&。
Band:你需要求和的数据区域名称,例如:DetailData1。
Flags:默认为0,可以省略。
1 --- 计算不可见Band数据
2 --- 执行总数
3 --- 1 并且2(计算不可见Band数据 并且 执行总数)
分组报表(Group)
一般由报表抬头、群组首、主项数据、群组尾组成。
#商品档案报表(按商品分类分组)
步骤如下:
新建1个数据源(FIB
Components-&FIB Query),起名tblProduct。
获取所需数据(tblProduct-&SQL)。
依次添加ReportTitle、GroupHeader、MastData、GroupFooter区域。
设置MastData区域连接的数据源-&tblProduct。
在ReportTitle中添加文本对象,录入报表名称。
双击GroupHeader,设置分组条件,选择数据字段tblProduct-&PRODUCTSORT。
在MastData中添加若干文本对象,并连接该文本对象至对应数据字段。
在GroupHeader中添加若干文本对象,录入字段中文名称。
在GoupHeader中添加一个文本对象,录入&tblProduct.”PRODUCTSORT”&。用于显示商品分类名称。
在GroupFooter中添加System
Text对象,用于显示合计数。
在PageFooter中添加文本对象,录入页码。(使用FastReport中的系统变量
SELECT * FROM TB_PRODUCT ORDER BY PRODUCTSORT;
所谓分组报表,就是按某一个字段进行分组显示,该字段具有相同的值的数据记录将被归类显示在一起。例如:上例中将商品档案按照商品分类归类显示。
要达到分组的目的,其中一个关键是该数据集必须按分组条件排序。即SQL语句中一定要有ORDER
BY这样的排序语句,而排序字段就是分组的字段。
分组是可以多级的,也就是可以嵌套分组。例如:商品档案定义时可能用商品分类表示大类,商品类型表示小类。分组显示时希望按大类包含小类这样嵌套方式显示。那你可以让数据集按ORDER
BY PRODUCTSORT,PRODUCTSTYLE这样来排序。排序时,排在前面的字段首先被排序,在相同的条件下,对排在后面的字段再进行排序。同样的这种情况下,你需要增加两个群组首尾,让他们嵌套排列。居于外层的设置分组条件为商品分类,居于内层的设为商品类型。
*分组条件设置中的选项
在你设置GroupHeader的分组条件时,有以下几个选项,他们的用途如下:
#保持与群组在一起 --- 这个选项表示,FastReport报表系统总是试图将一个群组的内容打印在一张纸上而不做分割。例如:有一个群组的内容比较多,而这个群组的开始打印位置居于纸的中部,因此本页将无法将全部该群组的内容显示完毕。那么FastReport将把这个群组打印在新的一页上,这样上页纸的底部将会留出空白。当然如果这个群组在新的一页仍然无法显示完毕,那FastReport就接着显示,不再做其他处理了。
#换页 --- 这个选项与上面这个选项基本概念相同,只是他总是将新的分组内容打印在新的一页上,而不管这个分组的内容有多少。当然这样纸张的空白也更多更浪费。但这种方式对于某些客户来说仍然可能是需要的。
#显示在大纲 --- 如果选择本选项,那么在你预览报表时,你可以使用纲要功能(有一个纲要按钮)。他可以将分组的名称显示在左边的树型框中,这样你可以更加方便的定位到相应的分组。
如果你想预览时总是显示纲要(不需要总是按纲要按钮)。你可以选择左侧Page1中的Report对象,在属性PreviewOptions-&OutlineVisibe设置为True。
*Reprint On NewPage
&&&&如果你选择GroupHeader区域,然后点击鼠标右键弹出菜单(Context
PopupMenu)。你会发现有一个选项Reprint On
NewPage,这个在其他区域的右键菜单中是没有的。他是起什么作用呢?
&&&&我们知道,一般分组报表设计时,总是将分组条件和中文字段名称显示在群组首。这样打印时,碰到一个新的分组,FastReport先是打印群组首中的内容,例如:商品分类的名称等。然后再打印该分组的数据。但如果数据较多时不能在一页中显示,那么剩余内容将打印在后面的一页中。这带来一个问题就是,如果独立看待后面一页纸,上面显示的数据我们不知道是属于哪一个商品分类的(分组),必须返回去查看上一页中的群组首才知道。而使用Reprint
On NewPage,则FastReport将在新的一页中将群组首中的内容再打印一遍(Reprint)。这样你就可以清楚知道本组数据的归属了。当然这样的话,群组首中的内容将可能会被打印超过一遍,这取决于数据的多少。
5.4 常用功能及函数
什么时候需要两遍报表(Double
应用1 用于显示总的页数(TotalPages),例如:页脚显示 第1页/共20页。系统第一遍扫描报表时计算出TotalPages,然后第二遍实际生成报表。如果不使用Double
pass,则TotalPages返回0。
应用2 用于将明细项的合计值打印在报表起始位置,而不是在末尾。这需要在第一遍扫描报表时计算出然后在第二遍生成报表时显示在起始位置。
密码 --- 用于将报表加密,这样在设计或者显示报表时需要输入密码。
分栏 --- 可以将报表在一张纸上分成若干列来打印,比较利于节省纸张。这与在主项数据的Band中设置多个列(Column)不同,分栏打印顺序是从上往下,然后从左往右。多列打印顺序是从左往右,再从上往下。
ListValue --- 根据SQL语句自动填充一个列表的值;
procedure ListValue(ASQL:AList: TStrings);
tblList.SQL.Text := ASQL;
tblList.Eof do
AList.Add(tblList.Fields[0].AsString);
ShowLoginSector --- 登陆分公司列表自动选择,如果不是管理部门则不允许选择;
procedure ShowLoginSector(L: TfrxComboBoxControl);
VarToStr(Get('LoginSector'));
then S := '管理部门';
L.ItemIndex
:= L.Items.IndexOf(S);
:= S = '管理部门';
5.5 报表设计常用技巧
A 为系统数据源增加自定义数据源,达到扩展数据的目的
&&&&在VBMS中的报表中心我们可以自己设计数据源然后设计自己需要的报表。
其实,我们在其他的模块中一样可以自己设计数据源(原来以为不可以)。
设计方法与报表中心中是一样的。
下面我举一个例子:
在客户档案模块中的打印报表中,增加每个客户的对应的车辆资料的显示。
原报表中已经有了一个系统传入的数据源dsCustomer。
FIB-&FIB Query,新增一个数据源 dsVehicle。
SQL语句为:
SELECT * FROM
TB_VEHICLE WHERE CLIENTID=:CLIENTID;
其中:CLIENTID为变量,是随着dsCustomer的变化而变化的。
(注意:如果你希望这个变量由主数据源来控制,则该变量的命名必须与主数据源中的字段名称一致。)
2. 设置dsVehicle的如下属性:
dsCustomer;(设置主数据源)
CLIENTID,数据类型 Integer,值 &dsCustomer.&CLIENTID&&
(设置参数:设置值时可以选择按钮fx来选择)
3. 插入一个Band(明细数据)。
设置连接数据库为dsVehicle。然后放入相关的字段(Text
Object)。
4. 鼠标右键设置MastData1的 Print if Detail Empty。目的是如果该客户没有车辆依然需要打印出来。
&&&&现在,我们既可以在报表中心,也可以在任何位置的打印报表中设计自己的数据源,并且可以将自己的数据源与vbms系统传入的数据源进行关联。这样的应用可以使报表设计更加灵活、更加强大。
B 为报表增加分组显示功能
在vbms系统的设计报表功能中,有一个群组头、群组尾的功能。
&&&&如果将群组头和群组尾分别置于主项数据的上面和下面,则可以对该主项数据进行分组统计功能,设置群组头时,系统会询问对哪一个字段进行分组。然后你可以在该群组头上放置一个该字段的TextObject来显示分组内容,在群组尾放置一个用于求和的SystemText。这样就可以按照该字段来分组统计了。
注意:要让相同组别的记录显示在一起,必须使数据源按该字段排序。因此,在一般报表中,如果你希望按照某个字段来分组统计,必须在打印所在的窗体上点击数据列表的该字段项(即排序,可以正排和逆排),然后再进入打印对话框来打印;如果是在报表中心中设计的报表,则在SQL中必须加上ORDER BY语句来排序。
另外,在群组头的属性中有一个OutLine,如果等于True。则可以在预览中使用列表导航。
C 将对话框(DialogForm)中的信息显示在报表中。
例如:对话框中录入开始日期和结束日期,你希望将该时间范围显示在报表头上。
方法是,在报表头上加一个Text Object,然后录入[edtBD.Text];edtBD就是开始日期编辑框的Name,记住要用中括号括起来。其他的类推。
*在对话框中的下拉框中显示一个列表。
例如,在对话框中你可能需要用一个下拉框让用户选择某一个供应商,下拉框中存储了所有供应商。
方法是,首先建一个数据源(tblProvider),该数据源返回了所有供应商。在对话框中放一个下拉框(cmbClientName),在对话框的OnShow事件中编写如下代码:
tblProvider.O
tblProvider.F
tblProvder.Eof do
cmbClientName.Items.Add(tblProvider.FieldByName(‘CLIENTNAME’).AsString);
tblProvder.N
该方法通用,只需要替换相应的数据源就可以实现其他的内容。
D 在分组脚或者栏尾显示多个数据项的合计。
例如,对于导购人员统计表,有销售金额、项目金额、其他金额三项,我希望在栏尾显示三项的合计值(不是每一项的合计)。
如果要分别统计每一项的合计,你只需这样。
SUM(&tblBMAccount.”SELLSUM”&)就可以统计销售金额了。
将三项加起来,则写如下代码
SUM(&tblBMAccount.”SELLSUM”&+&tblBMAccount.”SERVICESUM”&+&tblBMAccount.”OTHERSUM”&)
*这里讲一下一些语法格式。
取一个字段的格式,
格式:TableName.”FieldName”
表名+逗号+字段名,字段名用双引号引起来。
如果你希望在一个TextObject中显示某一个字段内容,
格式是:[TableName.”FieldName”]
用中括号括起来,中间是字段。
如果该字段内容作为参数参加运算或者作为一个函数的参数,则需要用&&尖括号将字段括起来。
格式:SUM(&TableName.”FieldName”&)
比如:SUM(&tblBMAccount.”SELLSUM”&);
或者 &tblBMAccount.”SELLSUM”&+&tblBMAccount.”SERVICESUM”&;
同样的,如果希望将他们放在Text Object中显示,还必须加上中括号。
例如:[SUM(&TableName.”FieldName”&)]
这里关键记住,如果想在TextObject中显示要用[]中括号,要在函数的参数中引用字段或者使用字段进行运算,需要用&&尖括号将字段括起来。
E 如何将报表底部的合计显示在报表头
如果直接将合计的TextObject放在主项数据的前面,将不能统计值,因为此时尚未解析出所有数据。
利用FastReport的两遍报表和临时变量功能实现。
首先设置该报表为两遍报表(Double Pass)。
在底部的某一个Band中的OnBeforePrint事件中加入以下代码:
Set(&tblBMAccount.&BM&&,SUM(&tblBMAccount.&SELLSUM&&+&tblBMAccount.&SERVICESUM&&+&tblBMAccount.&OTHERSUM&&));
说明:Set是一个函数,他将一个值存入了一个变量中。
Set(var,value);其中变量var可以利用数据表中的某一个字段,Value是你的合计值。
在主项数据(MastData)的上面的某一个Band中放一个TextObject(例如:memTotal)
然后在该TextObject的OnBeforePrint事件中加入如下代码:
if Engine.FinalPass then
memTotal.Text :=
Format('%8.2f',[Get(&tblBMAccount.&BM&&)]);
说明:Engine是FastReport管理报表的对象,FinalPass表示最后一遍报表。
Get(var)将变量var的值返回。Format是一个格式化数字的函数。
F 在底部显示多个数据源某个字段的合计值
例如:将三个明细的合计相加后显示总的合计。
公式如下:
[SUM(&dsServiceItem.&TOTALTAXSUM&&,MasterData1)+SUM(&dsProductItem.&TOTALTAXSUM&&,MasterData2)+SUM(&dsOtherItem.&TOTALTAXSUM&&,MasterData3)]
但有一个问题是,当三个明细不是全部存在时,打印时会发生Variant Operate操作错误。
我分析该错误产生的的原因是当其中一个明细不存在时,此时SUM后的结果为NULL(空值)而不是0,所以当一个NULL值与其他一个数值相加时会发生上述错误。
解决的方法是,判断一下:如果SUM后为NULL,则给它赋值0。恰好FastReport中有一个函数IIF(Expression,TureValue,FalseValue);该函数可以通过判断条件,如果条件为True,则返回True值,为False则返回False值。
所以将上述表达式进行一些改造。
IIF(SUM(&dsServiceItem.&TOTALTAXSUM&&,MasterData1)&&null,SUM(&dsServiceItem.&TOTALTAXSUM&&,MasterData1),0)
上面这个表达式表示:如果合计值不为空,则返回合计值,否则返回0。
因此,整个表达式如下:
[IIF(SUM(&dsServiceItem.&TOTALTAXSUM&&,MasterData1)&&null,SUM(&dsServiceItem.&TOTALTAXSUM&&,MasterData1),0)+IIF(SUM(&dsProductItem.&TOTALTAXSUM&&,MasterData2)&&null,SUM(&dsProductItem.&TOTALTAXSUM&&,MasterData2),0)+IIF(SUM(&dsOtherItem.&TOTALTAXSUM&&,MasterData3)&&null,SUM(&dsOtherItem.&TOTALTAXSUM&&,MasterData3),0)]
在Code页的最顶部定义三个变量,例如:
V1,V2,V3: D
在每个数据源的主项脚的OnBeforePrint的事件中分别录入:
主项脚1的OnBeforePrint:
V1 := SUM(&dsServiceItem.&TOTALTAXSUM&&,MasterData1);
主项脚2的OnBeforePrint:
V2 := SUM(&dsProductItem.&TOTALTAXSUM&&,MasterData2);
主项脚3的OnBeforePrint:
V3 := SUM(&dsOtherItem.&TOTALTAXSUM&&,MasterData3);
在需要显示合计的TextObject中使用:
[&V1&]或者[&V2&]或者[&V3&]或者[&V1+V2+V3&]即可。
G 在报表中引入自己的数据源
有客户需求:希望打印条码时同时打印出商品的品名规格和零售价(或其它商品相关信息),但条码库数据表中没有相应的数据字段。如何进行设计呢?
其实利用条码库数据表中的商品序号(ProductID),可以自己增加一个数据源(dsBarCodeEx),通过ProductID作为主键来连接数据表TB_BARCODE和TB_PRODUCT,将TB_PRODUCT表中的某些字段引入(根据需要)。
数据源可能是如下内容:
TB_BARCODE.PRODUCTID,
TB_BARCODE.BARCODE,
TB_PRODUCT.PRODUCTNUMBER,
TB_PRODUCT.PRODUCTNAME,
TB_PRODUCT.SELLPRICE
TB_BARCODE
TB_PRODUCT
TB_PRODUCT.PRODUCTID=TB_BARCODE.PRODUCTID
这样,你可以利用自己设计的数据源(原来的数据源dsBarCode不去管他)设计出相应的条码打印报表(可以打印零售价等)。
H 在报表中实现可变数据源
在报表中可以根据对话框中的条件实时调整数据源中的参数。
例如:在库存状况表中导出到条码库后(所有商品均导出),有时需要只打印某些商品的条码。你可以设计一个对话框,可以按照商品编号筛选,如果筛选条件为空,则打印所有商品,否则打印筛选出的商品。
设计数据源如下:
BA.PRODUCTID,
BA.BARCODE,
PR.PRODUCTNUMBER,
PR.PRODUCTNAME,
PR.SELLPRICE
TB_BARCODE BA
TB_PRODUCT PR
PR.PRODUCTID=BA.PRODUCTID
PR.PRODUCTNUMBER = :N
然后在数据源的Params中设置N的参数。
此时,如果筛选条件为空,则查询出来的数据也为空。
这是因为条件 WHERE PR.PRODUCTNUMBER = :N 导致的。
筛选条件为空时,数据源应该去掉该条件。此时需要根据条件动态调整数据源。
在btnOK(对话框中的确定按钮)的OnClick事件中加入以下代码:
btnOKOnClick(Sender: TfrxComponent);
S := 'SELECT
BA.PRODUCTID,BA.BARCODE,PR.PRODUCTNUMBER,PR.PRODUCTNAME,PR.SELLPRICE'+
' FROM TB_BARCODE BA'+
' LEFT JOIN TB_PRODUCT PR'+
' ON PR.PRODUCTID=BA.PRODUCTID';
if edtProductNumber.Text&&'' then
S := S + ' WHERE PR.PRODUCTNUMBER = :N';
dsBarCodeEx.ParamByName('N').Value :=
edtProductNumber.T
dsBarCodeEx.SQL.Text := S;
该代码根据筛选条件不同,对数据源的SQL语句进行不同的设置。
这样就可以达到要求了。
I 在对话框中,显示开始日期和结束日期。
在DialogPage1的OnShow事件中加入以下代码:
DialogPage1OnShow(Sender: TfrxComponent);
edtBD.Text := DateToStr(Date);
edtED.Text := DateToStr(Date);
edtBD,edtED为开始日期、结束日期的编辑框。
DateToStr()函数将日期型变量转为字符串。
现在,开始日期和结束日期默认为今日。
DialogPage1OnShow(Sender: TfrxComponent);
Y := YearOf(Date);
M := MonthOf(Date);
D := DaysInMonth(Y,M);
edtBD.Text := DateToStr(EnCodeDate(Y,M,1));
edtED.Text := DateToStr(EnCodeDate(Y,M,D));
YearOf()函数返回某个日期的年份;
MonthOf()函数返回某个日期的月份;
DaysInMonth()函数返回某月的天数;
EnCodeDate()函数将年、月、日整型数转为日期型;
现在,开始日期为本月的1号,结束日期为本月的最后一天。
J 在对话框DialogPage1中使用警告框提醒输入相关内容
例如:你可能需要用户必须录入某些查询内容,否则提醒用户输入。
在btnOK(确定按钮)的OnClick事件中加入以下代码:
btnOKOnClick(Sender: TfrxComponent);
if edtDepotName.Text = '' then
ShowMessage('请输入仓库!');
edtDepotName.SetF
DialogPage1.ModalResult := mrN
DialogPage1.ModalResult := mrOK;
ShowMessage()函数用于显示一条警告信息。
edtDepotName.SetFocus
表示该编辑框获取输入焦点;
DialogPage1.ModalResult
表示通过;
DialogPage1.ModalResult
表示不通过;
K 单据打印中如何实现空表格填满剩余的空行,达到指定的行数。
在原来的报表基础上,增加一个子Band(Child1),在这个Band上设计空白行。
可以将Footer1的高度Height设置为0;
在Code页中录入以下代码:
PageLine: I
//在现在页打印到第几行
PageMaxRow: Integer = 8;
//指定的每页固定行数 你可以修改
//在MasterData1的OnBeforePrint事件中加入以下内容
MasterData1OnBeforePrint(Sender: TfrxComponent);
PageLine := &Line#& mod PageMaxR
if (PageLine = 1) and (&Line#& & 1)
Engine.NewP
//在Footer1的OnBeforePrint事件中加入以下内容
Footer1OnBeforePrint(Sender: TfrxComponent);
i := iif(PageLine=0,PageMaxRow,PageLine);
while i & PageMaxRow do
i := i + 1;
Engine.ShowBand(Child1);
//增加一个子Band,在该Band上设计空白的行
L 在报表中使用金额大写
在FastReport的设计模式下,在Code页中加入以下函数:
SumToCaps(const Value : Double):
d = '零壹贰叁肆伍陆柒捌玖分角元拾佰仟万拾佰仟亿';
m :=FloatToStr(int(Value*100));
for j:=length(m) downto 1 do
k+d[(strtoint(m[Length(m)-j+1])+1)*2-1]+
d[(strtoint(m[Length(m)-j+1])+1)*2]+d[(10+j)*2-1]+d[(10+j)*2];
当你需要将一个金额转换为金额大写时可以如下操作:
1、在Code页的开始处定义一个字符串。
TOTALSUM_CAPS:
2、在相应的事件(可能是OnBeforePrint)中加入
TOTALSUM_CAPS :=
SumToCaps(TOTALSUM);
注:这里的TOTALSUM可能是一个变量,也可以是数据源中的字段或者合计值。例如:
&tblMaster.”TOTALSUM”&或者SUM(&tblMaster.”TOTALSUM”,MasterData1,1&)。
3、在需要显示大写金额的TextObject中键入[&TOTALSUM_CAPS&]。
M 如何隐藏某些主项数据记录
通常当某个数值为零时,我们不希望这条记录被打印或者显示。
步骤如下:
1、选择主项数据MastData1的OnBeforePrint时间。
2、在OnBeforePrint事件中填写代码
&tblMaster.”TotalSum”&=0 then
MastData1.Visible := False else
MastData1.Visible := T
其中&tblMaster.”TotalSum”&=0是条件,你可以定义为自己的条件。
N 如何强调某些主项数据的内容
有时我们希望当满足一定条件时,某些数据的字体或者颜色显示不同,以达到强调的目的。
步骤如下:
1 选择需要强调的TextObject。
2 选择工具栏中的强调按钮。
3 在对话框中录入需要强调时的条件。例如:&tblMasterData.”TotalSum”& &= 1000
4 选择强调的字体,颜色。
5.6 报表中心说明
供方报价单据列表
显示一段时间内所有已审核的供方报价单单据信息,报表可以按供应商、业务员、所属地区、分公司分组显示。
供方报价明细列表
显示一段时间内所有已审核的供方商品报价明细信息,报表可以按供应商、业务员、商品名称、商品分类、分公司分组显示。
采购订单单据列表
显示一段时间内所有已执行的采购订单单据信息,报表可以按供应商、业务员、所属地区、分公司分组显示。
采购订单明细列表
显示一段时间内所有已执行的采购订货商品明细信息,报表可以按供应商、业务员、商品名称、商品分类、分公司分组显示。
采购订单欠货报表
显示一段时间内所有欠货的采购订货商品明细信息,包括订货数量、已到数量、欠货数量,报表可以按供应商、业务员、商品分类、分公司分组显示。
采购订单到货报表
显示一段时间内所有到货的采购订货商品明细信息,包括订货数量、已到数量、欠货数量,报表可以按供应商、业务员、商品分类、分公司分组显示。
采购订单执行明细报表
显示一段时间内所有根据订单采购的商品明细信息,包括订货数量、订货金额、采购数量、采购金额、是否付款,报表可以按供应商、业务员、商品分类、分公司分组显示。
采购订单执行统计报表
按商品汇总统计一段时间内所有订单采购的商品的信息,统计包括订货数量、订货金额、采购数量、采购金额、付款金额。
采购入库(退货)单据列表
显示一段时间内所有已入帐的采购入库(退货)单据信息(含运费)以及付款情况,报表可以按供应商、业务员、所属地区、分公司、结算方式、单据状态分组显示。
采购入库(退货)明细列表
显示一段时间内所有已入帐的采购入库(退货)商品明细信息,报表按供应商、业务员、分公司、商品名称、商品分类、仓库分组显示。
采购商品统计报表
按商品汇总统计一段时间内所有采购的商品的信息,统计包括采购数量、税额、金额、价税合计。报表可以按供应商、业务员、商品分类、仓库、分公司分组汇总。
采购付款明细报表
显示一段时间内采购付款单的付款金额与采购入库单的对应关系。报表按结算日期、供应商分组显示。
供方最低报价分析
显示供方报价商品的最低三次价格以及相关供应商、单据号等。
采购最低进价分析
显示采购商品的最低三次进货价格以及相关供应商、单据号等。
采购货龄分析
根据未付讫的采购入库单,将入帐时间与当前系统时间进行对比,分析商品的货龄。货龄区间按照0-30天、30-60天、60-90天、90天以上四个阶段划分。报表按供应商分组显示。
采购运费分析
统计一段时间内采购运费发生的次数、金额、以及运费占采购金额的比例。
采购资金比重分析
分析一段时间内各商品的采购资金占用比例。报表按采购资金所占百分比降序排列。
采购成本分析
分析一段时间内各商品的实际采购金额与按照商品档案中设定的参考进价计算的参考金额之间的增减以及增减率。你可以设置增减率超过一定值时突出显示该比率。报表按商品分类分组显示。
采购分类分析
按仓库、供应商、业务员、商品分类、所属地区、进货类型、分公司等统计一段时间内所有采购金额(含退货),统计包括采购数量、金额、税额、价税合计。
采购商品月比较分析
按月分组统计所有采购商品的信息,统计包括月份、采购数量、采购金额。
采购分类月比较分析
按仓库、供应商、业务员、商品分类、所属地区、进货类型、分公司等统计,并按月分组统计所有采购商品的信息,统计包括月份、采购数量、采购金额。
客户报价单据列表
显示一段时间内所有已审核的客户报价单单据信息,报表可以按客户、业务员、所属地区、分公司分组显示。
客户报价明细列表
显示一段时间内所有已审核的客户商品报价明细信息,报表可以按客户、业务员、商品名称、商品分类、分公司分组显示。
销售订单单据列表
显示一段时间内所有已执行的销售订单单据信息,报表可以按客户、业务员、所属地区、分公司分组显示。
销售订单明细列表
显示一段时间内所有已执行的销售订货商品明细信息,报表可以按客户、业务员、商品名称、商品分类、分公司分组显示。
销售订单欠货报表
显示一段时间内所有欠货的销售订货商品明细信息,包括订货数量、付货数量、欠货数量,报表可以按客户、业务员、商品分类、分公司分组显示。
销售订单付货报
显示一段时间内所有付货的销售订货商品明细信息,包括订货数量、付货数量、欠货数量,报表可以按客户、业务员、商品分类、分公司分组显示。
销售订单执行明细报表
显示一段时间内所有根据订单销售的商品明细信息,包括订货数量、订货金额、客户数量、销售金额、是否收款,报表可以按客户、业务员、商品分类、分公司分组显示。
销售订单执行统计报表
按商品汇总统计一段时间内所有订单销售的商品的信息,统计包括订货数量、订货金额、销售数量、销售金额、收款金额。
销售出库(退货)单据列表
显示一段时间内所有已入帐的销售出库(退货)单据信息(含优惠)以及收款情况,报表可以按客户、业务员、所属地区、分公司、结算方式、单据状态分组显示。
销售出库(退货)明细列表
显示一段时间内所有已入帐的销售出库(退货)商品明细信息,报表按客户、业务员、分公司、商品名称、商品分类、仓库分组显示。
销售商品统计报表
按商品汇总统计一段时间内所有销售的商品的信息,统计包括销售数量、税额、金额、价税合计、成本。报表可以按客户、业务员、商品分类、仓库、分公司分组汇总。
销售明细账
按商品分组显示一段时间内所有已入帐的销售出库(退货)商品明细信息,包括销售数量、单价、金额、税额、价税合计、成本、折扣。
销售成本明细账
按商品分组显示一段时间内所有已入帐的销售出库(退货)商品成本信息,包括销售数量、成本单价、成本。
销售收款明细报表
显示一段时间内销售收款单的收款金额与销售出库单的对应关系。报表按结算日期、客户分组显示。
销售日报表
汇总显示当天的商品销售情况、退货情况、订货情况。
销售商品折扣统计
显示所有实际销售单价与参考价有差异的商品,并显示折扣金额和折扣率。
客户最高报价分析
显示客户报价商品的最高三次价格以及相关客户、单据号等。
销售分类分析
按仓库、客户、业务员、商品分类、所属地区、销售类型、分公司等统计一段时间内所有销售金额(含退货),统计包括数量、金额、税额、价税合计。
销售商品月比较分析
按月分组统计所有销售商品的信息,统计包括月份、数量、金额。
销售分类月比较分析
按仓库、客户、业务员、商品分类、所属地区、进货类型、分公司等统计,并按月分组统计所有销售商品的信息,统计包括月份、数量、金额。
销售运费分析
统计一段时间内销售运费发生的次数、金额、以及运费占销售金额的比例。
销售优惠分析
统计一段时间内销售优惠发生的次数、金额、以及优惠占销售金额的比例。
销售商品折扣分析
分析商品实际销售单价与商品档案中定义的标准零售价之间的差异。可以显示低于一定折扣的所有销售商品。
销售货龄分析
根据未收讫的销售出库单,将入帐时间与当前系统时间进行对比,分析商品的货龄。货龄区间按照0-30天、30-60天、60-90天、90天以上四个阶段划分。报表按客户分组显示。
销售毛利分析(月)
按月分析商品销售的毛利变动及影响因素。报表按商品分类分组显示。
销售毛利分析(季)
按季度分析商品销售的毛利变动及影响因素。报表按商品分类分组显示。
销售商品流向分析
按客户/地区分析某时间段内企业所销售商品的流向。分析指标包括:销售数量、所占百分比、销售金额、所占百分比。
销售商品结构分析
按客户/地区/商品分类/业务员/分公司/仓库分析某时间段内企业所销售商品的构成情况。分析指标包括:销售数量、所占百分比、销售金额、所占百分比、销售成本、所占百分比、销售利润、所占百分比。
销售增长分析(月)
按客户/地区/商品分类/业务员/分公司/仓库分析本月比上月的销售增长情况。分析指标包括:销售数量、增长百分比、销售金额、增长百分比、销售利润、增长百分比。
销售增长分析(季)
按客户/地区/商品分类/业务员/分公司/仓库分析本季度比上季度的销售增长情况。分析指标包括:销售数量、增长百分比、销售金额、增长百分比、销售利润、增长百分比。
出入库流水账
出入库流水账可查询任意时间段或任意情况下的商品出入库情况。输出的内容包括仓库、商品、入库数量、入库单价、入库金额、出库数量、出库单价、出库金额、收发类别、分公司等所有单据上的项目。
出入库流水账汇总
对出入库流水账按仓库、单据类型、收发类别、商品分类、分公司等进行分类汇总。
按商品查询库存的收发情况,报表按仓库、月份分类显示收入数量、发出数量、结存数量。
库存预估价值表
按商品档案中定义的零售价、其他销价来预估仓库中现存商品的价值。如果参考价格为0则报表用红色字体突出显示。
库存变动表
计算一段时间内各个仓库的库存成本变动情况。
库存商品久未变动统计表
列表显示某一天后所有库存商品数量没有发生变动的商品信息,判断依据是最后一次变动日期小于设定的日期的所有库存商品。
库存收发报表A
按期初、本期收入、本期发出、期末、盘盈、盘亏、采购价格显示存库情况。
供应商业务总账
汇总一段时间内的本期应付、本期付款和期末余额。可以按供应商、地区、分公司分类汇总。
供应商业务明细账
查看一段时间内的发生的应付和付款明细情况。报表按供应商分组显示。
供应商对帐单
获取一定时间段内的供应商对帐单明细。报表按供应商分组显示期初应付、本期应付、本期付款、期末应付。
客户业务总账
汇总一段时间内的本期应收、本期收款和期末余额。可以按客户、地区、分公司分类汇总。
客户业务明细账
查看一段时间内的发生的应收和收款明细情况。报表按客户分组显示。
客户对帐单
获取一定时间段内的客户对帐单明细。报表按客户分组显示期初应收、本期应收、本期收款、期末应收。
现金日记账
用于查询现金银行日记账,报表按日汇总统计。
总账日报表
用于查询某日所有发生科目的发生额及余额情况(不包括现金科目)。
维修装饰账表
维修装饰单据列表
显示一段时间内所有已入帐的维修装饰业务单据信息以及收款情况,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算方式、单据状态分组显示。
服务项目列表
显示一段时间内所有已入帐的服务项目信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算类型、项目名称、项目分类分组显示。
领出材料列表
显示一段时间内所有已出库的材料信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算类型、商品名称、商品分类、仓库分组显示。
其他费用列表
显示一段时间内所有已入帐的其他费用信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算类型、费用名称分组显示。
领出材料明细账
按商品分组显示一段时间内所有已入帐的领出材料商品明细信息,包括销售数量、单价、金额、税额、价税合计、成本、折扣。
领出材料成本明细账
按商品分组显示一段时间内所有已入帐的领出材料商品成本信息,包括销售数量、成本单价、成本。
维修装饰结算单据日报表
按单据显示当天内所有已入帐的维修装饰业务单据的信息。
领出材料折扣统计
显示所有实际销售单价与参考价有差异的领出材料,并显示折扣金额和折扣率。
服务项目折扣统计
显示所有实际销售单价与参考价有差异的服务项目,并显示折扣金额和折扣率。
维修装饰业务成本明细账
显示一段时间内所有已入帐的维修装饰业务单据的项目、材料、其他金额和税额,以及材料的成本、毛利、毛利率,明细账按单据显示。材料成本的结算类型为自付。
领出材料退料明细账
显示一段时间内所有已退料的材料信息。
维修装饰分析
维修装饰业务统计报表
按单据汇总统计一段时间内所有已入帐的维修装饰业务单据的信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算方式、单据状态汇总统计。
服务项目统计报表
汇总统计一段时间内所有已入帐的服务项目信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算类型、项目名称、项目分类汇总统计。
领出材料统计报表
汇总统计一段时间内所有已出库的材料信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算类型、商品名称、商品分类、仓库汇总统计。
其他费用统计报表
汇总统计一段时间内所有已入帐的其他费用信息,报表可以按车牌号码、厂牌车型、客户、修理类别、分公司、结算类型、费用名称汇总。
领出材料月比较分析
按月分组统计所有领出商品的信息,统计包括月份、数量、金额。
服务项目月比较分析
按月分组统计所有已入帐的服务项目的信息,统计包括月份、工时、金额。
维修装饰优惠分析
统计一段时间内总优惠发生的次数、金额、以及优惠占总金额的比例。同时显示材料优惠、项目优惠、其他优惠。
领出材料折扣分析
分析领出材料实际销售单价与商品档案中定义的标准零售价之间的差异。可以显示低于一定折扣的所有销售商品。
服务项目折扣分析
分析服务项目实际销售单价与项目档案中定义的标准零售价之间的差异。可以显示低于一定折扣的所有服务项目。
领出材料毛利分析(月)
按月分析领出材料的毛利变动及影响因素。报表按商品分类分组显示。
领出材料毛利分析(季)
按季度分析领出材料的毛利变动及影响因素。报表按商品分类分组显示。
领出材料流向分析
按客户/地区分析某时间段内企业领出材料的流向。分析指标包括:销售数量、所占百分比、销售金额、所占百分比。
领出材料结构分析
按客户/地区/商品分类/业务员/分公司/仓库分析某时间段内企业所领出材料的构成情况。分析指标包括:销售数量、所占百分比、销售金额、所占百分比、销售成本、所占百分比、销售利润、所占百分比。
领出材料增长分析(月)
按客户/地区/商品分类/业务员/分公司/仓库分析本月比上月的领出材料销售增长情况。分析指标包括:销售数量、增长百分比、销售金额、增长百分比、销售利润、增长百分比。
领出材料增长分析(季)
按客户/地区/商品分类/业务员/分公司/仓库分析本季度比上季度的领出材料销售增长情况。分析指标包括:销售数量、增长百分比、销售金额、增长百分比、销售利润、增长百分比。
服务项目成本毛利分析
以项目档案中定义的一个标准金额作为成本标准,统计分析一段时间内发生项目的收入、成本和利润。你可以选择项目档案中的标准金额1或者标准金额2作为成本分析依据。
维修装饰其他
进厂日报表
列表显示当日接待的车辆的相关信息。
维修工人项目统计报表
统计一段时间内维修工人负责的服务项目的工时和金额,报表按部门班组、维修工人分组显示。
维修工人领料统计报表
统计一段时间内维修工人领出材料的金额,报表按部门班组、维修工人分组显示。
维修工人项目次数统计报表
统计一段时间内服务人员执行的服务项目的次数,报表按所属部门、服务人员、服务项目分组统计。
导购人员业绩明细报表
显示一段时间内导购人员的业绩明细,你可以选择只显示已经收讫的业务明细。
导购人员业绩汇总报表
汇总一段时间内导购人员的业绩,你可以选择只汇总已经收讫的业务。
导购人员折扣明细报表
显示一段时间内导购人员的业绩折扣信息(折扣率、折扣金额),你可以选择只显示已经收讫的业务明细。
导购人员折扣分析报表
分析一段时间内导购人员的销售商品的实际价与商品档案中的零售价的差异和服务项目的实际价与项目档案中的标准价之间的差异,你可以选择只显示已经收讫的业务明细。
客户久未回厂统计报表
列表显示某一天后未回厂的所有车辆的相关信息,判断依据是最后一次进厂日期小于设定的日期的所有车辆。报表按总进厂次数降序排列。
索赔核销单位应收款报表
汇总统计一段时间内三包、保险索赔核销单位的核销、已收、应收金额。报表按核销单位分组汇总。
消费卡账表
发行消费卡列表
显示一段时间内发行消费卡的信息。报表可以按照车牌号码、客户名称、卡名称、卡类型、分公司分组显示。
消费卡充值明细报表
显示一段时间内消费卡的充值信息。报表可以按照车牌号码、客户名称、卡名称、卡类型、分公司分组显示。
消费卡消费明细报表
根据消费卡卡号查询该卡的所有消费明细,消费明细按分公司分组显示。
客户卡消费明细报表
根据车牌号码查询所有卡的所有消费明细,消费明细按分公司分组显示。
客户卡充值明细报表
根据车牌号码查询所有卡的所有充值明细。
失效消费卡(次数)预警报表
针对项目卡失效进行预警,判断依据是消费项目的剩余次数,范围包括次数类型和时间次数类型的项目。
A 可以选择针对某种消费卡(卡名)进行预警,如果不选择则针对全部项目卡。
B 可以选择针对某种消费项目进行预警,如果不选择则针对所有消费项目。
C 对于次数类型和时间次数类型的消费项目,当剩余次数小于等于一定次数时进行预警。
失效消费卡(时间)预警报表
针对项目卡失效进行预警,判断依据是消费项目的失效时间。范围包括时间类型和时间次数类型的项目。
A 可以选择针对某种消费卡(卡名)进行预警,如果不选择则针对全部项目卡。
B 可以选择针对某种消费项目进行预警,如果不选择则针对所有消费项目。
C 对于时间类型和时间次数类型的消费项目,当失效日期距离当前时间一定天数以内时进行预警。
消费卡(项目)分公司统计报表
按消费卡、消费项目分组统计各个分公司的消费情况。本报表只统计类型为项目卡的消费卡。
前台营业日报表
查询当天的公司业务的营业情况、收款情况。业务按商品销售、维修结算、装饰结算、项目结算、消费卡结算、发行消费卡分别统计营业、收款情况。营业情况按挂帐结算和现款结算分别统计,收款情况按应收收款(即实际收款总额)、挂帐收款(应收收款-现款结算)、预收款分别统计。
服务项目营业报表
查询一段时间内的服务项目发生的次数、金额,报表按现款结算、挂帐结算、消费卡结算统计。
领出材料营业报表
查询一段时间内的维修装饰领出材料发生的数量、金额,报表按现款结算、挂帐结算、消费卡结算统计。
商品销售营业日报表
统计一段时间内所有商品销售营业额,报表按各种分类和时间汇总统计。
服务项目营业日报表
统计一段时间内所有服务项目营业额,报表按各种分类和时间汇总统计。
维修装饰结算日营业报表
显示一段时间内所有已入帐的维修装饰业务单据的项目、材料金额,以及材料的成本、毛利等,单据可以按多种方式分组显示。
回访活动统计表
列表显示一段时间内的回访活动记录。
客户服务统计表
列表显示一段时间内的客户服务记录。
保养档案统计表
列表显示一段时间内的保养档案记录。
出险档案统计表
列表显示一段时间内的出险档案记录。
外勤救援统计表
列表显示一段时间内的外勤救援记录。
4.7.7 工资管理
6. VBMS高级篇

我要回帖

更多关于 工时计算公式 的文章

 

随机推荐