不定列(动态列)报表的数据源处理

动态列报表是动态报表的一种,在报表应用中很常见。这类报表由于无法事先确定列数,因而无法在报表中使用固定列的表达式,而且更加棘手的是报表数据源的准备,因为SQL不支持不定列的结果集,需要动态拼出SQL语句去执行,有时业务逻辑并不很简单,还需要使用存储过程分步完成。而存储过程对集合运算的支持不够,难以使用中间结果(要用临时表),导致完成这类运算并不轻松。

http://bbs.csdn.net/topics/390937222?page=1#post-398564938中提到的问题,就是一个比较典型的动态列计算问题,这类计算往往是为前台报表服务的,使用SQL和存储过程都很难完成,而一般的报表工具由于不具备强计算能力,对于这类计算更加无法完成。

使用润乾集算报表来做则比较简单,集算报表不仅继承了润乾报表在呈现层面处理动态列数据源的能力,而且内置了强大的数据源计算引擎,在运算和格式两方面都能很好地支持动态列报表。

这里以上述链接中的实际业务为例,给出集算报表的实现方案。

报表背景

源数据如下:

现需要在报表中以机组为单位,横向排列类别和产量,样式如下:

这个报表的难点在于用SQL或存储过程写起来很困难,而一般报表工具则不具备数据源计算能力,根本无法实现。集算报表本身内置了适合结构化计算的脚本,可以方便地写出数据准备的计算(相当于一种更使用更简单的自定义数据集)。上述报表需求使用集算报表可以这样完成:

编写集算脚本

首先使用集算脚本编辑器,新建集算脚本,编写脚本完成数据计算,为报表输出计算后结果集。

上述脚本含义:

A1:连接数据源;

A2:执行sql从产量表中取数;

A3:按机组分组,在集算器中分组结果保留了分组结果(成员)以方便后续使用和计算,这个分组结果如下:

A4:求分组中最大成员个数,以确定结果集列数;

A5-A6:创建结果序表,记录为空;

A7-B8:循环A3中分组结果,将每个分组中的类别和产量写入新结果序表中;

A9:为报表返回结果集。

编辑报表模板

使用集算报表编辑器,编辑报表模板,用于数据展现。新建报表并设置集算器数据集,调用上述编辑好的脚本文件。

其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的。

编辑报表表达式,用集算报表的动态数据源机制完成报表制作。

由于是动态列,在报表中要使用ds.field()函数根据列数来动态取得列数据,第一行和A列为辅助行列,设置其隐藏即可。

报表展现结果如下:

可以看到,比起SQL使用集算器脚本可以快速完成这类动态列报表数据源。而且外置的集算脚本具有可视化的编辑调试环境,编辑好的脚本还可以复用(被其他报表或程序调用)。不过,如果脚本已经调试好,而且不需要复用的时候,要维护两个文件(集算脚本和报表模板)的一致性会比较麻烦,这时候直接使用集算报表的脚本数据集就比较简单了。

在脚本数据集中可以分步编写脚本完成计算任务,语法与集算器一致,还可以直接使用报表定义好的数据源和参数。本例使用脚本数据集可以这样完成:

1. 在数据集设置窗口中点击“增加”按钮,弹出数据集类型对话框,选择“脚本数据集”;

2. 在弹出的脚本数据集编辑窗口中编写脚本;

这里可以看到,在脚本数据集中直接使用了报表中定义好的数据源emos,比起单独的集算脚本更加简单、直接。

3.报表模板和表达式与使用集算器数据集方式一致,不再赘述。

时间: 2024-10-09 22:21:38

不定列(动态列)报表的数据源处理的相关文章

如何动态改变报表的行高列宽

报表应用中有时需要动态控制行高或列宽以满足特定需要.如分组报表中要求每个分组的总高度 / 宽度固定不变,这样一来就能实现每页纸打印相同数量的分组. 润乾报表可以在行高列宽属性中编写表达式,从而实现动态行高列宽,下面通过一个例子说明使用过程. 1.连接数据源 使用润乾报表设计器,连接自带数据源 DEMO 2.设置数据集 新建报表并设置数据集,使用 SQL 取数 数据集 ds1 如下: SELECT STATE,EID,NAME,SURNAME,GENDER,DEPT,SALARY FROM EMP

树形报表支持动态列统计

汇总方式 选择 遍历字段 ,默认为数据汇总求和 字段语言 里填写要 在列 遍历 的字段 ,在后面的筛选条件里 增加 遍历字段='@now'  和其他条件 兼容原来的模式 树形报表支持动态列统计,布布扣,bubuko.com

Dynamic CRM 2013学习笔记(二十六)Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色

上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数可以多选或全选:动态地显示列,列不是固定的:根据某一字段的值来动态地显示整行字体的颜色. 下面介绍详细的方法: 一.动态参数.参数多选全选 动态参数: 首先定义一个Dataset: SELECT DISTINCT new_countryId, new_codename AS name FROM ne

vue中 表头 th 合并单元格,且表格列数不定的动态渲染方法

吐槽 今天,在vue中遇到 复杂表格的渲染 ,需要合并表头th的单元格,且合并单元格的那列的表头数据是动态数据,也就是不知道会有多少个表头列,而这几个表头列还分了好几个子表头. 这个需求在js里用Juicer模板很好做的,思路我是有的,但就是对于vue,我也算初学者,很多概念不是很懂,这就限制了思路. 在网上搜了很多合并单元格的都是简单的数据合并,也就是td合并, 不是我们的需求,就不贴了. 哎,废话不多说了,看代码吧: 代码示例 使用iviewui的table组件: 最初,直接使用项目中的iv

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

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

extjs动态树 动态grid 动态列

由于项目需要做一个动态的extjs树.列等等,简而言之,就是一个都是动态的加载功能, 自己琢磨了半天,查各种资料,弄了将近两个星期,终于做出来了 首先,想看表结构,我的这个功能需要主从两张表来支持 代码目录表: CREATE TABLE SYS_T01_CODECONTENT ( ID NUMBER NOT NULL, PID NUMBER NOT NULL, TABLENAME VARCHAR2(50 BYTE), ZH_CN VARCHAR2(200 BYTE), ENABLE CHAR(1

EasyUi 动态列

最近,接到一个需求,按部门做了个数据统计,原以为是个很普通的需求,具体实现的过程中,却发现,这个部门是不固定的,因为部门有可能被增.删.改. 所以,对应的列也是不固定的,这下可难倒我了. 不过,在我锲而不舍,刻苦钻研,外加百度.360搜索的帮助下,总算有了点思路. 具体的思路是这样子的: 1,将JS定义的Columns放在后台定义,在后台时融合部门列表,再返回到前端. 2,在后台对第一列的部门赋值,并返回Json. 有了思路,实现起来就不难了. 具体做法:1,JS获取列定义 function G

再谈extjs4.1中gridpanel动态表头动态列

之前写过一篇gridpanel有关动态列的博客,当时只是实验性的写写,实际项目中也没有用,因为是实验性的写,所以对实际项目考虑的问题不是很多,比如,如果是动态列,数据也是动态的,而且可能不固定,这些具体的问题,只有在实际开发后,才会明白,这次正好顺利开发完gridpanel的动态列,总结一下过程,为遇到同样问题的同学提供一个思路. 因为是实际开发项目,具体的代码比较多,这里只简单说说重点的一些代码,其实这些代码明白后,其他的功能都很好弄.顺便说一下,我后台数据库相关操作用的是c#. 既然是动态列

Silverlight系列--动态生成DataGrid列 根据动态列绑定Dictionary数据

1.获取表头数据源动态生成DataGrid表头 DataGridTextColumn d = new DataGridTextColumn(); d.Header = itemPriceClass.PriceKindCode + itemPriceClass.PriceKindName; Binding bin = new Binding(); bin.Converter = new RowIndexConverter(); bin.ConverterParameter = itemPriceC