集算报表与润乾报表处理动态报表时的异同

集算报表继承了润乾报表的宏机制来处理动态报表,对于简单的动态报表使用宏实现非常方便。对于一些复杂的动态报表,集算报表还提供了脚本数据集来处理动态报表,适合宏无法实现的场景,而润乾报表中要实现复杂动态报表时则需要编写自定义数据集来完成。下面通过几个例子来详细比较一下集算报表和润乾报表在处理动态报表时的相同与不同点。

相同点

集算报表和润乾报表都提供了宏,使用方式几乎完全一致,且都包含普通宏和动态宏。

        普通宏常用于静态内容替换,如在员工表中同时只希望查看薪金或奖金,开发两张报表显然是繁冗的,使用普通宏在一张报表来完成很简单,如下报表:

预览报表输入参数和宏:

当参数arg1值为BONUS,宏macro值为BONUS时,可得到如下报表结果:

当参数arg1值为SALARY,宏macro值为SALARY时,可得到如下报表结果:

相对普通宏只能替换静态内容,动态宏则可以编写动态表达式,完成动态内容的替换,从而完成动态报表制作。比如这样的动态报表,针对指定表根据用户选择的字段和条件进行查询,报表中显示选择的字段及其数据。由于字段和条件都是动态的,所以需要先在报表中将SQL拼好再交由数据库进行查询,这时就需要在动态宏中进行拼接。如下报表:

其中报表参数和宏设置为:

输入cols值:订单ID,客户ID,订购日期,发货日期,到货日期,运货费

输入where值:where 货主地区=‘华北‘ and 货主城市 in (‘北京‘,‘天津‘,‘张家口‘,‘秦皇岛‘)

其值为:"select"+cols+" from 订单"+where,宏类型为动态宏。

设置数据集SQL为:${sql},预览报表可以得到如下动态报表结果:

以上为使用宏(普通宏和动态宏)开发相对简单(只静态内容或通过简单的表达式完成)的动态报表,而对于复杂的动态报表,往往需要经过复杂计算才能完成,而这类复杂情况使用宏往往很难甚至无法完成,这时集算报表和润乾报表处理的方式则有很大不同。

不同点

集算报表提供了脚本数据集的方式可以完成上述提到的复杂动态报表的开发,由于脚本内置且语法简单,很容易处理这类报表。而润乾报表只能通过自定义数据源在JAVA中完成,使用的简易性则略逊一筹。下面还是通过例子来看一下。

由用户针对特定表指定选择列和条件,如用户在订单表中选择列时,订单ID、雇员ID和订购日期是必选列,即使用户没有选择,在查询后仍然显示。这就需要在拼接SQL的时候事先判断必选列是否在用户的选出列中,如果不在,则在后面添加,同时要保证用户选出列的次序。

通过宏实现的难点在于,由于需要判断每个必选列是否在用户选择字段的列表中,如果没有则附加,有多少个必选列就要比较几次,在必选列较多的时候非常复杂。

下面是集算报表通过脚本数据集的实现(报表参数与表达式与上例一致):

上述脚本在A2中将所选字段集合与必选字段集合做并集即获得了所有查询字段,拼接SQL进行查询后为报表返回结果集,过程很简单。

而润乾报表在这种情况一般要采用自定义数据集了,下面是润乾报表通过自定义数据集的实现(主要代码):

<span style="font-size:14px;">public class QueryData implements IDataSetFactory {
	public DataSet createDataSet(Context ctx, DataSetConfig dsc, boolean isinput) {
		Map map = ctx.getParamMap(false); // 获得当前报表的所有参数对照表
		String cols = "";
		String where = "";
		if (map != null) {
			Iterator it = map.entrySet().iterator();
			cols = map.get("cols").toString(); // 获取参数值
			where = map.get("where").toString(); // 获取参数值
		}

		DataSet ds1 = new DataSet("ds1");
		Connection con = null;
		try {
			con = ctx.getConnectionFactory("demo").getConnection();				Statement stmt = con.createStatement();
			String sql = "select " + cols + " from 订单 " + where;
			ResultSet rs = stmt.executeQuery(sql);
			ResultSetMetaData rsmd = rs.getMetaData();
			int colCount = rsmd.getColumnCount();
			//设置列名
			for (int i = 1; i <= colCount; i++) {
				ds1.addCol(rsmd.getColumnName(i));
			}

			//设置数据集数据
			if (rs != null) {
				while (rs.next()) {
					Row rr = ds1.addRow();
					for (int i = 1; i <= colCount; i++) {
						rr.setData(i, rs.getObject(i));
					}
				}
			}
			rs.close();
			stmt.close();
			con.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return ds1;
	}
}
</span>

上述自定义数据集首先获取了报表参数和当前数据源连接,其次根据参数拼接出要执行SQL,而后根据获得的ResultSet为数据集分别设置列名和数据,最后返回创建的数据集。在使用时,将编译后的class(QueryData.class)放到应用的classpath中方才完成。

通过以上实现过程可以看到,对于复杂的动态报表(如上例),使用脚本数据集实现更为简单,除了其拥有简洁的语法,脚本数据集内置在报表中无需其他程序文件附加,则更为便捷。

时间: 2024-10-19 10:37:43

集算报表与润乾报表处理动态报表时的异同的相关文章

集算报表与润乾报表的函数语法对照

集算报表5.0在保留润乾报表V4.x的核心功能外,进行了优化和精简.当中报表函数也做了适当优化,这里就常见计算来比較一下二者函数语法之间的差异.         对照函数一览表 1.数据集函数 1.1.ds.group()         润乾报表: datasetName.group(selectExp{,descExp{,filterExp{,sortExp{,groupSortExp{,groupDescExp{,rootGroupExp}}}}}})         集算报表: data

集算报表与润乾报表的函数语法对比

集算报表5.0在保留润乾报表V4.x的核心功能外,进行了优化和精简,其中报表函数也做了适当优化,这里就常见计算来比较一下二者函数语法之间的差异.         对比函数一览表 1.数据集函数 1.1.ds.group()         润乾报表: datasetName.group(selectExp{,descExp{,filterExp{,sortExp{,groupSortExp{,groupDescExp{,rootGroupExp}}}}}})         集算报表: data

集算报表与润乾报表的计算性能对比测试

1.测试目的 在相同的硬件和web容器上测试润乾报表和集算报表的性能,对比在报表中完成分组.排序.过滤.连接.排名的性能差异,以及并发情况下二者的表现.测试过程中,润乾报表将采用报表工具内置的计算引擎,集算报表采用其内置的集算器计算引擎. 2.环境描述         测试机型:DellInspiron 3420         CPU:Intel Core [email protected] *4         RAM:4G         HDD:西数WDC(500G5400转/分)  

集算器实现报表中零散的不规则计算

报表中存在的不规则计算往往给报表开发带来很大的困难,使用报表工具往往很难甚至无法直接实现.这里的不规则计算是指报表中存在特殊条件的统计项(计算),如:销售订单金额统计中计算前5名销售金额的合计和占比:学生成绩统计中总成绩排名前10的学生中语数外都超过90分的人数:用户充值统计中充值金额超过充值总额一半的用户数量等. 通过集算器可以很方便完成这类报表的开发,我们通过两个例子来了解一下具体的做法. 1.实例一 1.1 .报表描述 根据员工与订单表统计各销售人员的销售情况,并在报表中计算列出订单总额.

用润乾集算报表实现实时报表(T+0)的方案

在报表项目中,客户越来越关注源数据的实时性,希望看到最新发生的数据在报表中体现出来.但是,传统的报表工具+数据仓库+ETL方式很难做到这一点,往往是只能看到昨天.上周甚至是上个月的情况,也就是T+1.T+7.T+30统称T+n报表.很难实现T+0报表,也就是能体现实时信息的报表. 分析其原因在于:1.如果报表的历史数据和最新数据都从客户的生产系统读取,虽然可以实现T+0报表,但是会对生产数据库造成压力,影响客户的业务.2.如果采用数据仓库的方式,那么ETL从生产库中取出数据,需要较长的"窗口时间

润乾集算报表优化应用结构之混合数据源

在报表项目中,报表源数据常常会来自于多种异构数据源.例如:关系型数据库(oracle.db2.mysql),nosql数据库(mongodb),http数据源,hadoop(hive.hdfs)甚至是excel或者文本文件.通常的做法是采用ETL工具,将这些数据源都同步到数据仓库中.但是这样做的问题在于:1.配置复杂,难度较大:2.成本较高:3.数据无法实时访问,需要有较长时间的延迟:4.数据仓库的建设和管理都比较复杂:5.如果数据量很大效率会很低,而且要不断的ETL去各个应用系统同步数据:6.

润乾集算报表交互分析之多层自动钻取

交互分析过程中报表多层钻取的情况很常见,如从一级汇总数据钻取到二级汇总数据,从二级汇总数据钻取到三级汇总数据-.,钻取时可以从表格到表格,也可以从统计图到统计图.开发这类报表时如果每个层级都需要制作不同的报表,在层数较多时,无论对于开发还是维护都是很麻烦的事,如果能制作一个通用的模板完成所有层级报表的展现则事半功倍. 润乾集算报表通过内置的集算引擎可以快速完成多层钻取通用报表模板的开发.下面通过一个示例说明使用过程. 多层钻取往往在一个维度上逐级细化,如这里我们以订单表中5个地区层级为例(可以扩

润乾集算报表多样性数据源之动态SQL传递

大多数情况下报表的数据源SQL都是固定的,但有时也需要动态变动其中某些部分实现动态拼出,比如在报表应用中允许用户通过选择表和字段查询自己关心的报表数据,报表开发时则希望对同类报表(明细或汇总)使用同一模板.这时就需要在报表中接收相应参数拼接出动态SQL进行查询后制作动态报表. 润乾集算报表提供了两种处理动态SQL的方法,使用宏和集算脚本,可以快速完成这类报表,下面举例说明. 使用宏 集算报表提供了宏机制,通过在动态宏中拼接SQL后交由数据集查询结果,最后在报表中使用动态表达式获得字段名和字段值完

润乾集算报表非常规统计之多重判断

报表在数据源准备阶段往往要根据实际业务进行各种判断计算以后才能得到最终的报表数据源,而使用SQL在这种情况下则难于编写,http://bbs.csdn.net/topics/390938280中提到的考勤问题就是其中之一,这个计算看起来是给财务或人力部门的考勤报表服务的.计算逻辑并不算复杂,但使用SQL却很难做,用存储过程(要取首尾记录)也很麻烦,而一般的报表工具由于不具备强计算能力,常常只能写用Java等写自定义数据源实现. 使用润乾集算报表来做则比较简单,这里以上述链接中的实际业务为例,给出