什么是动态报表
动态意即变化,动态报表也就是指可以变化的报表。说得更具体一些:也就是报表开发者为报表最终用户提供的报表是可配置的,是可以进行个性化调整的,一个动态报表相当于一个设计合理的报表模型,不同的报表用户可以配置出他们最想要的运行方式。当然动态报表的变化要讲究一定的规律,提供给最终用户的操作界面是非常直观,非常容易操作的。
动态报表主要包括哪些方面
下面列出动态报表的动态变化主要方面,并进行简单地解释。
- 报表数据:数据的动态变化主要有两个方面,其一,就是数据筛选条件的动态化,也就是报表的查询条件设置是非常灵活的,报表用户可以设置出他们需要的各种报表数据查询条件;其二,报表查看的数据项是可以动态配置的,在开发报表时应将一个报表所有的可选数据项都提供给报表用户进行选择,不同的用户可以根据他们的需要挑选出他们需要的数据项。
- 报表分析方式:在一个报表上,用户可以选择不同的统计方式来生成报表。如一个按期间进行统计分析的报表,可以选定统计期间为:月度、季度、年度等。
- 报表的显示外观:报表的显示外观主要指报表文字的字体、报表数据的显示格式、报表表格线的显示参数等一切与显示有关的方面,报表用户可以配置出他们想要的报表展现格式。
- 报表的布局:报表开发者可以对报表内容的输出位置、宽度、高度与显示顺序等进行重新配置。
- 报表输出的自适应:要面对不同用户的报表,必然要面对用户的不同屏幕显示分辨率与不同的打印纸张规格。报表必须保证在这些不同的环境下得到理想的输出结果。
- 报表配置参数的持久化:指报表用户对报表设定的配置参数可以进行永久保存,并可以在用户下次进入报表时再次载入应用。如果一个用户对某个报表有多种查看方式,最好能够将用户的不同配置参数分开保存,这样就相当于这个动态报表具体化出来多个报表。
以上只是列出动态报表的主要动态变化方面,也不是每个动态报表都会涉及到所有的这些方面,而是应该根据具体情况进行合理的选择,也有可能上面没有列出的因素也需要考虑。
开发动态报表会有哪些好处
一般的软件系统都需要面对不同的用户,通用产品面对的用户更是成千上万,不同的报表用户对同一报表会有不同的需求。即使是专门定制化的软件,同一用户在不同的条件下对报表的需求也会发生变化。怎样开发出满足不同用户需要的报表与怎样满足用户不断变化的报表需求是一件很重要的工作,也是我们开发的报表系统应该达到的目标。
从上面动态报表的作用可以看出动态报表可以为我们带来以下好处:
- 满足用户多样化需求:同一报表可以满足不同用户的要求和用户在不同条件下对报表的不同要求。
- 前面说过,动态报表是一种报表模型,从一个动态报表中可以具体化出来同一类型的很多报表。举例来说:对于销售汇总表,肯定会有多种汇总方式,如:按客户,按产品,按期间等,只要定义出合理的抽象模型,我们就可以得到不同汇总方式的销售汇总表。
- 减少整个报表系统总的开发工作量:虽然开发一个动态报表比通过简单的拖放方式实现一个具体的报表要复杂得多,但是由此一个动态报表可以具体化出一批报表,同时动态报表给用户带来的灵活性是固化报表所不可比拟的。比如在我们经常会开发各种年报表、月报表、日报表等各种按期间统计报表时,这些报表除了统计期间有区别外,其它方面是基本类似的,我们只要开发一个动态报表就可以得到各种按期间统计的报表。
- 减少整个报表系统的维护工作量:因为报表在最终用户的手中是可以配置,可以满足用户多样化需求,相当于报表最终用户对报表有二次开发能力,所以动态报表具有更持久的生命力。
- 最终减少整个报表系统的复杂度,并且大大增强报表系统开发的可复用度:如果不对报表进行抽象,而是每个具体报表都分开进行实现,势必需要提供大量的报表,这样数量众多的报表势必增加整个系统的复杂度,同时提供再多的报表也不一定能满足众多用户的不同要求。动态报表相当于一种模型,可以在同一软件系统中共享,也可以在不同的软件系统中复用。
为什么说 Grid++Report 非常适合开发动态报表
首先 Grid++Report 的报表模板定义是完全可编程的。Grid++Report 的可视化设计器功能非常完善,全面支持各种通用操作方式,也符合规范的操作习惯。同时 Grid++Report 也提供完备而清晰的编程接口,整个报表模板定义可以通过程序定义出来。也就是说,报表设计器可视化设计出来的报表,用编程的手段一样可以定义出来。正因为 Grid++Report 是完全可编程定义的,为实现动态报表提供了最基本的实现保障。
仅仅可编程定义报表还不够,如果编程定义的过程非常繁杂,这样实现动态报表也不会轻松。下面就来看看 Grid++Report 怎样轻松实现报表的可编程定义:首先 Grid++Report 的编程模型非常清晰规范,其组件对象模型设计非常合理。其次 Grid++Report 的报表定义核心部分由一个具有超强数据展现能力的明细网格组成,通过动态定义列从而实现整个报表最核心部分的动态变化,列按从左到右的顺序排列,只要给列设定合理的宽度,就可以得到合理的报表明细数据输出,而不用繁琐的计算每个明细数据项的准确位置。
当然 Grid++Report 独有的报表查询显示功能也为实现动态报表提供了极大的便利,报表的动态输出结果将更多的是在报表查询显示状态中,有关Grid++Report 独有的报表查询显示功能的更多介绍请参阅《报表查询显示功能 - Grid++Report 独创》
Grid++Report 在报表查询显示时可以适应不同的显示窗口尺寸。为报表内容提供了多种自动排列方式,可以将报表内容设定到合理的相对位置,这样就可以在动态的显示条件下得到理想的显示效果。居中方式指定在水平与垂直方向上保持位置的居中;锚定方式保持报表部件与一个或几个显示边界的固定距离;停靠方式指定报表部件采用怎样的方式充满显示区域的某一边或整个区域;指定对齐到列与对齐列方式可以让列之外的报表部件与列始终保持对齐。设定合理的自动布局方式,就可以在不同尺寸的查询显示窗口中得到理想的输出布局,从而适应用户动态变化的显示环境。
同样Grid++Report 的自动布局能力在打印输出时可以很好地实现同一报表在不同尺寸的纸张上打印,Grid++Report 无论在何种纸张规格上都会让你得到满意的打印输出效果。很多其它的报表构件只能在设计时指定的纸张规格上得到合理的打印输出结果,如果采用其它规格的纸张打印就不能得到布局良好的输出。另 Grid++Report 还提供多种打印输出适应策略:如列的总宽度大于或小于打印区域的宽度,可以自动进行各个列宽的按比例缩放,调整列的总宽度与打印区域的宽度到一样;如果列的总宽度小于打印区域的宽度,可以指定将所有列水平居中输出到打印区域;当列的总宽度大于打印区域的宽度,可以实现横向分页打印,超范围的列另起新页进行输出,如果存在锁定列,可以指定是否在新页中重复输出锁定列。
在前面说过动态报表需要动态变化的方面,现在就来说说 Grid++Report 如何帮助报表开发者实现这些方面。
- 实现报表的显示外观的动态变化:因为Grid++Report是完全可编程定义的,只要将用户配置的外观参数定义到报表模板定义中,就实现了报表外观的定义。
- 实现报表的布局的动态变化:前面已经说过 Grid++Report 的核心由一个有超强数据展现能力的明细网格组成,以及报表部件的多种布局方式,这些都有力地保证了报表可以很好地适应布局的动态变化。Grid++Report专业的可视化设计功能可以帮助报表最终用户进行报表布局的可视化调整。
- 实现报表数据的动态筛选:根据报表的数据筛选参数,动态定义 Grid++Report 中报表的记录集需要的字段。当然报表开发者此时需要根据报表的数据筛选参数动态地去实现向数据源取数功能,一般也就是根据数据筛选条件动态生成查询数据库数据的 SQL 语句,有了动态的取数功能,可以用推模式或拉模式向报表提供数据。
- 实现报表分析方式的动态变化:这里同样需要报表的可编程定义功能,需要报表开发者通过编程接口将配置好的报表统计分析方式定义到报表中,至于报表的统计分析功能那就是 Grid++Report 的报表引擎的事情了。
- 报表输出的自适应:在前面已经叙述了报表在查询显示时与报表打印预览时的自适应能力,这里就不在赘述。报表配置参数的持久化需要报表开发者实现合理的保存与载入功能,建议对于多用户网络环境下的报表系统将报表配置参数保存在服务器的数据库中,这样便可共享动态报表的配置参数。报表配置参数载入之后就是调用报表的编程接口定义到报表中,这样用户的报表配置就可以持久可用。
总结
根据前面的叙述,我们将应用 Grid++Report 开发动态报表的主要任务进行划分,这样报表开发者可以更清楚自己应该做那些事情,明白自己的关注点。
Grid++Report 在开发动态报表中完成的主要任务:
- 提供编程接口实现报表的动态定义。
- 实现报表屏幕查询显示的动态输出。
- 实现报表打印及数据导出等报表生成方面的动态输出。
- 生成其它一切动态定义的结果。
- 报表设计器实现报表位置的动态调整。
报表开发者需要完成的主要任务:
- 实现报表数据筛选界面,动态实现数据源取数(一般为动态生成查询SQL语句)。
- 实现报表显示外观定义界面及其他配置界面。
- 调用 Grid++Report 的编程接口动态定义报表。
- 实现报表动态配置参数的持久化保存与载入应用。
下面就动态报表的开发提一些建议,希望能够对大家有所帮助。如果一个报表需要动态定义的部分不是太多,也可以考虑用报表设计器可视化定义出报表中固定不变比较框架性的部分,然后根据报表配置参数通过编程定义动态部分。以上提出的有关动态报表的方方面面,报表开发者可以根据一个报表的具体情况,以及开发过程中的其它情况,进行适当地剪裁选用,上面的叙述也不一定很全面很准确,开发者也应根据实际情况进行增补。前面说过,动态报表需要模型化的抽象,抽象必须来源于具体实践与认真分析,实现动态报表也应该是一个逐步完善与持续改进的过程,只要你有开发动态报表意识,有归纳总结的习惯,Grid++Report一定可以协助你开发出功能强大的动态报表,你也可以在报表开发上积累宝贵的知识与资源,报表开发不应该只是简单的拖曳排放,不是机械化的简单重复劳动。希望大家都有一颗动态的心,设计开发实用性高、适应范围广、高度可复用的报表系统。
关于 Grid++Report 提供的动态报表例子
Grid++Report 的例子程序中包含了一个简单的动态报表例子程序,只用VC进行了实现,一来是因为例子要简单易懂,二来受VC实现界面繁杂的限制,例子程序未免显得简单与粗糙了一些,但也基本诠释了用 Grid++Report 开发动态报表的思想。下面的几幅图片来自此例子程序,也许能让你有个更直观的认识。
图一:动态报表例子查询显示
图二:动态报表例子筛选数据对话框
图二:动态报表例子显示外观设置对话框