面向中小企业智能报表系统的研究与实现
2012-03-15周国祥
经 伟, 周国祥
(合肥工业大学计算机与信息学院,安徽合肥 230009)
随着中小企业信息化的不断深入,报表成为企业管理的基本工具。由于大型企业的业务多元化,较难建立满足各方面需求的报表系统;而中小企业制作的报表内容单一,且样式变化小,适合建立统一的报表系统进行管理。
当前流行的智能报表系统中,水晶报表作为国际性的商业智能软件,能够从任意数据源构造报表,并能以表格、图表、分组等各种形式展现,功能强大、弹性高。但由于我国报表的特点与国际上有所差异,水晶报表没有考虑到这些特殊情况,也没有充分了解报表制作人员的习惯等,在实际应用中无法满足企业的需求[1-3]。国内具有代表性的润乾报表和用友华表,拥有优秀的报表设计系统,充分满足了国内企业对报表格式的需要,但功能单一,大部分是财务类报表,且很难制作格式灵活的报表,缺乏数据库的数据分析功能[3-4]。
本文从B/S架构下智能报表系统的实际开发需求出发,在充分研究国内外企业报表系统基础上,分析了国内企业报表的内在逻辑结构,提出一种报表定义和生成方法,并采用C#.net技术实现该智能报表系统。使用该系统提供的设计器,可以动态定义及修改报表内在逻辑结构,生成器根据报表的定义信息实时生成报表,并以Excel报表文件形式存储在服务器端。
1 报表结构分析与定义
一般报表在样式上分成表头、表体和表尾3个部分[1],如图1所示。表头包括标题栏和报表的统计时间区间;表体存放报表的所有内容,由若干个报表分区组成,每个报表分区包含列行,每个列(行)包括名称和数据;表尾主要指脚注等。
由此发现表头和表尾的内容与格式比较固定,动态生成较为简单。报体的基本数据单元是列(行),列(行)之间具有一定的逻辑关系,建立其完整的逻辑关系即可得到报表的表体数据。因而将定义报表的过程分成2个部分:① 报表列的属性定义,每一个属性列对应数据库表中的任意一列;② 报表的显示设计,按照设计好的展现形式,定义各个列的显示位置和排列方式(水平或垂直)。
图1 报表的结构
数据库表设计如图2所示,组合报表基本信息表中的一条记录对应一个报表,通过关联其他表构成一个报表的完整信息。
报表中直接与数据库关联的列按照相互之间的关系组成一个个基本表,每个基本表的列之间都是相关联的,被存放在报表基本信息表和报表列信息表中,由于一张表可能存在多个基本表,它们与报表之间的关系信息在报表关联表中定义。报表中的其他列作为组合列,由基本表列定义,数据存放在组合报表列信息表中。
报表列信息表、组合报表列信息表和报表列值信息表存放列的定义数据,在研究大量报表列之后,本文将报表的列分成6种,即多选一列、累加列、计数列、数值分类计数列、多选一分类计数列和计算列。报表列信息表存放前5种列的信息,组合报表列信息表存放计算列的数据。报表列值信息表存放某些列的过滤值,指导报表生成器在生成过程中读取数据库中的合适数据。组合报表分段信息表、报表水平列信息表和报表垂直信息表存储报表的排列格式。
图2 报表定义的数据表关系
2 报表生成器设计
表格的生成过程就是设计一个逻辑完备的解析生成器,逐步分析报表的定义,读取基本列对应的数据库中的基本数据,并按照各个列的计算规则统计得到组合数据,最后按照显示格式写入Excel文件。整个过程分成基本表生成、组合表生成和报表数据的格式化显示3个过程。如图3所示,列属性库、列逻辑库和报表显示库存放报表的定义数据;组合、基本表数据结构,基本表数据集和组合表数据集是在报表的生成过程中临时产生的数据。
图3 报表的生成过程
2.1 基本表生成
一张报表中有若干个基本表,基本表的数据来源于数据库,可以通过读取数据库直接得到。解析器首先读取所有基本表的定义数据,在内存中构造基本表的数据结构;再顺序分析每张基本表中的列定义。对于一张基本表中的各个列,在按照多选一列、累加列、计数列、数值分类计数列和多选一分类计数列排序后,读取其在数据库中对应列的数据。
每一列在解析的过程中,从当前基本表中读取临时数据集(已经生成数据的所有列组成的数据集)中的一行数据,作为查询数据库的条件。判断这一列是否存在过滤值,若存在则不读数据库,直接将过滤值与临时数据集做全连接,写入临时数据集;若不存在则构造查询SQL语句,读取数据。如果查询结果为空,说明在当前的查询条件下没有值,删除临时数据集中的这行数据;结果不为空则写入临时数据库[5]。继续读取临时数据集中的下一行数据作为查询条件,循环生成当前列的数据。
2.2 组合表生成
在一个报表中仅有一个组合表,且表中的各列均为计算列。计算列一般关联一个用户自定义的数学表达式,即列的生成就是计算数学表达式的过程。表达式中的各个计算项来源于基本表的列,它可以是简单表达式,也支持基本的统计计算,如份额、产出率等。
一般解析数学表达式分成数据替换和表达式计算2个部分,数据替换就是将表达式中ID号替换为基本列中的数据值。例如在数学表达式“([23]+[35])/[48]”中,“[23]”表示一个基本列,23为基本列的ID号。解析器分别定位表达式中各个ID号在临时数据集中的位置,读其数据并替换数学表达式中的ID号及两边的中括号,这样就构造成一个数学表达式[6]。表达式的计算方式有2种:一般数学表达式通过使用栈数据结构,便能计算出结果;统计表达式则需要根据特殊符号的含义进行统计运算。因此,每一列的数据就是通过循环进行数据替换和表达式计算生成。
2.3 报表数据的格式化显示
在对基本表和组合表进行解析和生成后,当前数据按照其逻辑结构顺序存储于内存空间中,但是其结构十分复杂,数据冗余度大。直接写入Excel文件将导致报表的可读性差,因而在数据层设计一个报表显示库,使得报表数据可以根据设计格式化地显示。
报表的格式化显示生成过程是解析器读取报表的格式定义及关联的临时数据集中的各列,依次将表体、表头和脚注写入Excel文件[7]。
表头的生成需要确定整个报表的宽度,而整个报表的宽度由表体的内容决定,因而需要首先将表体内容写入文件中,再读取文件中表体使用的列数,最后将表头(标题和日期)写入文件。脚注也是根据报表的宽度平均排列在表体底部。
表体一般由若干个报表分区组成,其报表分区有水平排列和垂直排列2种排列方式,表示临时数据集中的各列数据在文件中排列方向。解析器按照报表分区的排序号,自上而下地将它们写入文件。在确定排列方式后,顺序读取本分区的各列信息,写入列名称,同时读取该列在临时数据集中的列数据,写入文件。
3 .net下智能报表系统的实现
本系统采用C#.NET集成开发环境实现,系统的列属性等3个报表结构库和数据源均存储在SQL SERVER 2005数据库中。操作界面使用Ext.NET开源工具库开发,界面风格简洁,便于操作,非技术人员在通过培训后也可以自由地新建、修改报表的定义,并能够快速地使用系统生成报表。
笔者设计了一个智能报表系统作为珠宝企业综合管理系统下的子系统,不仅实现了报表系统的基本定义与生成功能,也建立了报表的生成管理和权限管理。
3.1 报表定义管理
如图4所示,新增一个报表主要进行基本结构、逻辑及其显示定义。
图4 列的选择及定义
其中基本结构定义用于设计基本列信息及其关系,主要有输入基本信息、选择基本列、选择累加列和创建分类计数列。逻辑定义用于关联各个基本结构,分成基本信息录入、基本结构选择、分区定义、列的选择和过滤值设定5个部分。显示定义用于控制在最终的报表文件中显示或者隐藏数据,包括垂直显示定义和水平显示定义。
3.2 报表生成管理
报表生成管理就是用户可以为部分属性列提供过滤值,定制报表的生成数据。即在读取或计算该列值时,若满足用户设定的过滤值则写入报表中,反之则放弃。系统将过滤值的设定分成2个步骤。
(1)时间段的设定,限制读取的数据必须在某个时间段范围内。
(2)报表部分列的过滤值设定,系统根据每个报表的列信息,选择可设定过滤值的列,生成下拉列表,让用户选择并输入过滤值,添加过滤值即可[8-9]。导出报表流程,如图5所示。
图5 导出报表流程
3.3 报表权限管理
报表权限用于控制上层系统的不同用户组(部门)对本系统的访问权限,本系统的主要权限有报表定义和生成2种权限。
由于企业的各个用户组使用和管理的报表不同,在报表系统的默认状态,超级管理员用户组只有定义权限,无生成权限,其他用户组无定义和生成权限,每个用户组的权限均由超级管理员用户组中的用户分配。
(1)报表定义权限的分配过程。选择用户组名称,点击选择报表定义页面,保存当前选择即为该用户组分配了定义权限。
(2)报表生成权限的分配过程。选择用户组名称,复选报表名称,点击保存按钮即分配了生成权限[10]。
4 结束语
本文提出并设计的智能报表系统已经成功部署在一家珠宝企业中,能够动态定义、修改报表的界面和逻辑结构,实时生成报表。用户可以使用报表定义工具随时增加新的报表,改变已有报表的显示结构等,而不需要改变任何代码,极大地减少报表系统的后续维护工作量。目前系统只能定义列表式和分组式报表等,无法定义图表式报表,在今后的研究开发中需要进一步完善。
[1] 刘 瑶,孙玉芳.通用报表生成器的设计与实现[J].计算机科学,2000,27(2):73-75.
[2] 王光增,曹一家,戚 军,等.电力企业通用报表综合管理系统设计与实现[J].浙江大学学报:工学版,2009,43(11):2062-2066.
[3] 吴银卫.通用报表生成技术研究与应用[D].北京:北京交通大学,2010.
[4] 潘福成,张士杰.基于XML的智能报表生成工具的研究[J].小型微型计算机系统,2005,26(1):134-138.
[5] 李兴勇,袁兆山,汪正海.复杂报表生成系统实现技术研究[J].计算机应用,2007,27(7):1821-1824.
[6] 王建军,戴海金,朱方策.基于Excel Services报表系统的研究与实现[J].计算机工程与设计,2010,31(19):4305-4308.
[7] 张 利,吴传胜,崔 雷,等.应用MVC模式构建Web信息系统框架研究[J].合肥工业大学学报:自然科学版,2007,30(7):829-832.
[8] 陈新林,张双武.我国报表系统研究综述[J].计算机系统应用,2007,16(12):113-117.
[9] 唐 敏,徐 玮,李昭原.基于Web的报表工具的设计与实现[J].北京航空航天大学学报:自然科学版,2001,27(4):482-485.
[10] 陈传波,黄 刚,刘清慧.一种基于ASP.NET的自定义报表的设计与实现[J].计算机工程与科学,2006,28(6):112-114.