报表设计器之遐想

  大家先看如下的一张表格:

 

    

 

  给你一个数据库,所有数据都在这个库里,大家觉得这样的报表如何生成。

  另外:  

    1.横向时间是可以变化的,比如还想统计2009年,2010年的数据,纵向种类也不会只有这么多,比如大类中还有配件、赞助。这样又如何扩展?

    2.我觉得时间最小跨度是一个季度,鞋子、服装还不是最小分类,现在我想知道鞋子、服装每一个月每一个款式的销售情况有这样的报表又是如何生成?

    3.我希望表格中每一个季度能做一个统计,比如我想知道鞋子在每一个季度的销售情况。

 

    

 

  4.这些我觉得还不够直观,我希望能够生成我希望依据这张表生成一个统计图片,饼图,柱状图,曲线图等等。

  

   

     下面我们来一次报表设计遐想,因为我确实没有做过这个东西,但是遇到、用过却有好多次,主流的软件平台都有这样的一个模块。这次公司遇到一个项目,报表非常多,我们这边技术不够,外包给了学校的一个研究生导师,他们讨论过几次,于是我对其思路有了一点明白,于

是整理了一下思路,为网络知识做一点贡献。

       这样的一个报表设计思路分为四个部分

 

    

核心原理

       这样一个设计器核心原理就是元数据定义,我们以第一张表格为例,我们可以将其分解成6个元数据:

       第一个元数据:年份数据定义

       第二个元数据:季度数据定义

       第三个元数据:鞋、服装数据定义

       第四个元数据:鞋、服装的子类定义

       第五个元数据:销售量数据采集方式的定义

       第六个元数据:销售量数据总和采集方式的定义

第五、六个又是关键点,如下图

 

    

 

  不知道大家发现没有,每一个销售数据都是一个横纵向条件的交叉点。说到这里,大家应就基本明白了,以上表格的所有销售数据不是像过去批量生成的,而是按照横纵向条件生成的,也就是说有多少个数据,就会有多少次查询数据库。

  参数定义

       就如第一个问题,我们知道,报表是有扩展条件的,也就是我们sql语句的where部分,而参数定义就是负责这部分的,也就是我们常说的查询条件。但我们不能像写sql语句那样设计,何况它也可能是一种静态数据(比如我们说的月份就不需要从数据库里获取)。

       我的设计是这样的:
       查询条件ID、查询条件名称、数据类型(String、Number、Date)、显示方式(Text、Select、CheckBox、Radio)、描述到这里第一步已经算是完成了,下面我们开始第二步

  元数据定义

  上面的核心原理已经讲解了定义元数据的用处,并了解到元素数据其实本身也是一个数据集,这里我们应该想想到底怎么定义元数据。

  我的设计是这样的:
    元素据实例名,元数据名称、元数据类型(计算、静态、sql)、元数据内容(实体数据、sql)、元数据映射字段、元数据描述
  其中元数据映射字段是指元数据数据集字段对应的数据库字段,设计是这样的:
    元数据字段名、元数据类型、数据库字段名、数据库字段类型、描述

  下面是一个示例
  有了这些东西我们就回答了上面提到的第2个和第3个问题。下面就看我们是如何显示的:

  根据以上已经有的信息我们似乎可以定义出最简单的报表模板,假设我元数据是这样定义六组元数据:
    元数据一:年份元数据、年份、sql、select date from sales group by date、映射字段(date、date、date、date、date描述year描述

    元数据二:季度元数据、季度、静态、第一季度,第二季度,第三季度,第四季度、映射字段(Quarter,String,null,null,描述)
    元数据三:大类元数据、鞋服大类、sql、select categories from sales where categorietype=1 group by categories、映射字段(大类、string、categories、string、子类描述)

    元数据四:子类元数据、鞋服子类、sql|、select categories from sales where categorietype=2 group by categories、映射字段(子类、string、categories、string、子类描述)

    元数据五:销售数据元数据、销售数据、sql、select saledate from sales、映射字段(销售数据、number、saledate、number、销售数据描述)

    元数据六:总计元数据、总计、计算、销售数据元数据. 销售数据、映射字段(总计,number,null,null,总计描述)

  

  至此元数据已经定义成功,下面可以看我我们设计的报表模板了:

  


  描绘表格的过程是由外向里的,永远都是外面的信息决定里面单元格的拆分情况。理论实现了,技术思路我相信每一个程序员都有自己一定的方法,这里就不在深入讨论了,也不是本博文所想要描述的。

  选择组件

  组件选择大概分为两种:表格、图表。
  表格就不用我多说了吧,只是这种生成报表的方式比较损耗资源,因为表格中每一个数据都要进行一次数据查询,这样对于简单的二维表无疑是一场灾难,所以报表设计器一般会将简单表和复杂表分开,以达到资源的高效利用。

       关于图表的实现方法也表格实现也是异曲同工,你可以使用微软的图表组建chat,根据元数据的定义,生成几个数据缓存,然后依次将数据信息存入到各个图表对象的属性中去,关于图表组件的使用这里也不将描述。

       这样也就回答了第4个问题。

  生成报表

  我们笼统的可以把报表分成两个部分:表格和组件,上面的两个段落都有涉及到,也提供了基本的技术思路。

  总结

       这样的东西还仅仅是一个技术原型,但我可以肯定其思路是可行的。在现实情况下,我们还需要考虑很多东西,比如表格样式、执行效率等等。因为web方式不能很好为报表设计阶段提供很好的支持,所以这样的一个报表设计器必然是以windows形式出现,报表设计完成以后生成一个xml文件,以提供web解析生成我们所需要的报表。由于未经公司允许,我暂不把此次外包的设计器图样公布出来,希望大家理解。

posted @ 2012-08-28 11:03  Coding神兽  阅读(3576)  评论(62编辑  收藏  举报