2009年6月8日

制作统计报表,往往不是一个sql语句能搞定的。

l         有些报表需要从多个数据库取数;

l         有些虽然是从一个数据库取数,但数据是分散在数据库的很多表中,需要多个sql语句组织有关数据,然后按照某些关系归并在一起;

l         有些报表虽然是一个基础表,但对该表中的数据要经过不同的加工,一句sql语句不能将所有的报表要展现的数据组织完毕。

比如统计报表中常见的本期、累计、完成比例。在数据库中,基础数据是按照一天天的发生数存在表中,本期为月初到查询日期的累计发生数数,累计为从年初到查询日期的累计发生数,完成比例为累计除上计划数,计划数肯定要在另一个表中单独存放。本期和累计虽然都是一个表,很明显因为条件的不同,一句sql不可能做到同时取出本期和累计。这样的统计报表最少需要3sql取数才能将报表上所需要的数据全部取出,然后按照特定的条件(比如按机构)将三个数据集的归并,之后才能展现出正确的报表。

传统的报表工具(如水晶为代表的国外报表工具),都是以单一数据集为基础的报表生成工具,如果你需要用到很多sql才能产生出一张统计报表,那么,你必须通过建临时表,通过写存储过程等办法,将分散在数据中的数据组织到一个数据库表中,然后通过报表工具展现出来。这样的做法,也能解决中国式报表的生成问题,但报表的编写和维护量将非常大,而且报表逻辑不直观,一旦客户需要更改报表格式和逻辑,将是一件非常痛苦的事情。对于这样的报表工具而言,做报表就是写程序,报表工具沦落为最普通的展现工具。

现在国内有些报表工具也有很多号称支持多数据集,但在做这样的统计报表时,一般都是单元格将各个数据集联系起来,无论是在报表生成效率和直观易用方面,都比较差。

cellReport中,建设性的加入了关于集合的运算功能,可以对各个数据集按照指定的条件分组归并,从而极大的减低开发统计报表的难度。本报表软件的集合的运算包括:并集、交集、以及集合的减法。最常用的就是求集合的并集。

下面以northWind数据集中的订单数据,制作一张中国人常用的统计报表。本报表将会用到报表参数的计算。

数据集:

本期:SELECT [类别].[类别名称], [产品].[产品名称], Sum(CCur([订单明细].[单价]*[数量]*(1-[折扣])/100)*100) AS 产品销售额

FROM 类别 INNER JOIN (订单 INNER JOIN (产品 INNER JOIN 订单明细 ON [产品].[产品ID]=[订单明细].[产品ID]) ON [订单].[订单ID]=[订单明细].[订单ID]) ON [类别].[类别ID]=[产品].[类别ID]

WHERE ((([订单].[发货日期]) Between #month_begin_date# And #end_date#))

GROUP BY [类别].[类别名称], [产品].[产品名称]

累计:SELECT [类别].[类别名称], [产品].[产品名称], Sum(CCur([订单明细].[单价]*[数量]*(1-[折扣])/100)*100) AS 产品销售额

FROM 类别 INNER JOIN (订单 INNER JOIN (产品 INNER JOIN 订单明细 ON [产品].[产品ID]=[订单明细].[产品ID]) ON [订单].[订单ID]=[订单明细].[订单ID]) ON [类别].[类别ID]=[产品].[类别ID]

WHERE ((([订单].[发货日期]) Between #year_begin_date# And #end_date#))

GROUP BY [类别].[类别名称], [产品].[产品名称]

计划数:SELECT 类别.类别名称, 每年计划.计划数

FROM 每年计划 INNER JOIN 类别 ON 每年计划.类别id = 类别.类别ID

where 计划年=DatePart('yyyy',#end_date#)

参数定义:

参数名称

数据类型

缺省值或表达式

 

end_date

Date

1997-12-02

 

Year_begin_date

Date

=firstDayOfYear(param.end_date)

内部参数

month_begin_date

Date

=monthBegin(param.end_date)

内部参数

 

 

 

这样,一个简单的统计报表就完成了。如果我们使用水晶报表,多数据集的归并,则必须要通过存储过程等方式将数据组织到一起,工作量和本软件制作同一报表相比是天壤之别。

 

posted @ 2009-06-08 15:01 lzmch 阅读(721) 评论(0) 编辑

2009年5月19日

 

博冉CellReport是一套专门面向程序开发人员制作复杂报表的工具系统,CellReport成功解决了复杂中国式报表的格式任意性及关系数据库的关联规律性之间的矛盾,使得用户能够方便简捷地制作自动化的任意报表,实现了报与表的完美结合。

 cellReport采用了.net技术,设计器采用c#开发,引擎采用j#开发,可以运行在任何Windows操作系统下,支持所有ODBC及sql server、oracle等关系数据库。

cellReport提供报表运算的.net的API调用,可最紧密地和应用程序无缝结合,程序员可自定义参数输入界面与运算引擎结合。

  演示页面:http://218.28.143.234/demo

 基本功能简介:

1、支持从多数据库以及.net中的DataSet、DataTable取数,以及自己组织数据

2、支持多数据集,以及独有的相关多数据集根据关键字求并集、交集、子集的运算。为制作各种复杂的中国式报表提供了坚实的基础运行环境。

3、数据集之间的相互引用

4、支持一个sql数据集直接从多个数据库取数。

5、支持动态参数的sql语句,以及动态组合生成的sql(两种方式:用户参数提供的sql片段和镶嵌可执行代码)

6、参数依赖计算

7、报表分片

8、单元格引用,自动判断循环引用

9、跨行组计算,支持累加、占比、移动平均等功能

10、支持所有的基本报表:清单式、一次分组、多次分组、交叉表等

11、支持dashborad,同一页面显示多张相关或不相关报表

12、支持表格式报表和柱状图、线图等

13、任意单元格合并

14、可动态计算单元格、行、列及报表的基本属性

15、支持计算报表时,动态调用sql生成结果

16、通过URL连接方式,支持报表下钻、排序等

17、内嵌脚本,也可以用c# ,java,vb.net等写自定义函数脚本。

posted @ 2009-05-19 12:51 lzmch 阅读(552) 评论(3) 编辑