zoukankan      html  css  js  c++  java
  • 报表设计器之遐想

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

        

     

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

      另外:  

        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解析生成我们所需要的报表。由于未经公司允许,我暂不把此次外包的设计器图样公布出来,希望大家理解。

    请大家支持我的小站www.mincount.net
          转载请注明出处 http://www.cnblogs.com/codeness
          将来的你,一定会感谢现在努力的你。
  • 相关阅读:
    JDK环境变量设置
    用mapXtreme Java开发web gis应用 (下)
    最简单的mapxtreme的servlet例子
    MapXtreme Java开发环境配置
    MapXtreme2004代码 读取TAB表中的元素
    一段旋转图元几何体的代码
    oracle ocp题库变化,052最新考试题及答案整理30
    OCP认证052考试,新加的考试题还有答案整理23题
    OCP题库变了,2018年052新题库29题
    2018OCP最新题库052新加考题及答案整理27
  • 原文地址:https://www.cnblogs.com/codeness/p/2659814.html
Copyright © 2011-2022 走看看