报表数据源的多重判断

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

使用润乾集算报表来做则比较简单,这里以上述链接中的实际业务为例,给出集算报表的实现方案。

报表背景

源数据如下:

现需要在报表中以日期和性能统计考勤情况,要求根据:每天7点到12点算上班打卡,16点以后算下班打卡,多次刷卡取最早的打卡时间为上班卡,取最晚时间为下班卡,如果在该时间段未存在打卡记录即显示未打卡,8点30之后打卡算迟到,18点之前下班算早退。得到类似下表结果:

这个报表的难点在于用SQL或存储过程写起来很困难,而一般报表工具则不具备数据源计算能力,根本无法实现。

集算报表本身内置了适合结构化计算的脚本,可以方便地写出数据准备的计算(相当于一种更使用更简单的自定义数据集)。上述报表需求使用集算报表可以这样完成:

编写集算脚本

首先使用集算脚本编辑器,新建集算脚本,设置脚本参数,如刷卡起止时间范围:

编写脚本完成数据计算,为报表输出计算后结果集。


A


B


1


=connect("kaoqin")


2


=A1.query("select * from 考勤表 where 刷卡时间>=? and 刷卡时间<=?",b_date,e_date order by 员工工号,刷卡时间)


3


=A2.group(员工姓名,date(刷卡时间))


4


=create(日期,员工姓名,上班,下班,是否迟到,是否早退)


5


for A3


=A5(1).刷卡时间


=string(time(B5))


6


=A5.m(-1).刷卡时间


=string(time(B6))


7


=if(C5>="07:00:00" && C5<="12:00:00",B5,"未打卡")


8


=if(C6>="16:00:00",B6,"未打卡")


9


=if(C5>="08:30:00" && C5<="12:00:00","迟到",if(C5<="08:30:00","","未打卡"))


10


=if(C6>="16:00:00"&& C6<="18:00:00","早退",if(C6>="18:00:00","","未打卡"))


11


>A4.insert(0,date(A5.刷卡时间),A5.员工姓名,B7,B8,B9,B10)


12


result A4

A1:连接数据源;

A2:根据指定时间范围,执行sql查询考勤表数据,查询结果按照员工和刷卡时间排序,排序是为了便于后续取得首尾记录;

A3:按照员工和刷卡日期分组,与SQL不同,集算脚本中的分组结果保留了分组成员;

A4:创建空结果序表;

A5-C11:循环A3中的分组,根据最早和最晚刷卡时间通过判断计算员工的出勤情况,最后将结果写回到A4结果序表中;

其中,B6通过A5.m(-1)取得了最后一条记录,集算报表中的集合都是有序的,所以很容易通过序号取得相应成员,这与SQL的集合无序有很大区别;

A12:为报表返回结果集。

编辑报表模板

使用集算报表编辑器,编辑报表模板,用于数据展现。首先新建参数,并设置默认值。

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

其中,dfx文件路径既可以是绝对路径,也可以是相对路径,相对路径是相对选项中配置的dfx主目录的;参数b_date和e_date为脚本参数,begin和end为报表模板参数,事实上二者可以同名。

编辑报表表达式,直接使用集算脚本返回的结果集,完成报表制作。

报表展现结果如下:

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

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

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

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

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

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

时间: 2024-10-12 10:56:25

报表数据源的多重判断的相关文章

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

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

集算器替代存储过程实现报表数据源

存储过程是SQL语句和流程控制语句的集合,常用来把一个复杂的计算目标分解为多个简单的计算步骤.虽然以复杂性换来了灵活性,但SQL语句固有的缺点仍然体现在存储过程中,比如:分步不彻底.数据无序.缺乏集合.缺乏引用,之前我们也分析过存储过程作为报表数据源的利弊,可点击这里查看. 集算器解决了存储过程的上述缺陷,降低了对开发人员的技术要求,是存储过程理想的替代工具. 报表例子说明 某电信产品厂商有一张报表,主要目的是分析优势产品的销售额.销量.环比等指标,其中优势产品的定义是"在每个州的销量均在前10

存储过程实现报表数据源的利弊分析

在报表项目中,当数据计算较为复杂的时候,报表开发者可能会考虑是否用存储过程来实现报表数据源准备. 这里,我们从几个不同的方面来看一下.用存储过程来实现报表数据源计算的利和弊. 一. 性能 说到存储过程的长处,性能是最常被提及的.存储过程进行报表数据计算的时候.不须要将数据取出数据库,会获得较高的性能.其主要原因是数据库IO通道(比如:JDBC)效率一向非常差,大量数据取出来非常费时间. 即便如此.这个问题还是要深入分析的: 1.写在存储过程中的SQL语句是预先编译的.因此比外部程序提交的SQL要

Nginx rewrite 多重判断

默认Nginx不支持多重判断,可通过设置变量的方式,变相的实现多重判断. 需求: 将http://192.168.1.221/[email protected]_1movsv 跳转到http://192.168.1.221/data/html/192/index.html, 其中[email protected]_1movsv 中的@是固定格式: 同时要满足ThinkPHP的伪静态配置,将http://192.168.1.221/XXX 跳转到http://192.168.1.221/index

Nginx 多重判断

说明:nginx 不支持&& 和嵌套if判断 #多重判断,匹配移动端和http_host为xxx.com跳转到m.xxx.com set $flag 0; if ( $http_user_agent ~ "(iPhone)|(Android)" ) { set $flag "${flag}1"; } if ( $http_host ~* "^(xxx\.com)$" ) { set $flag "${flag}1&quo

集算报表用Java动态修改报表数据源

实际应用中通过程序动态修改报表模板的情况很常见,其中动态修改数据源SQL就是一种典型场景.常见于系统中有一些结构相同而数据源不同的报表,为减少报表开发工作量,只开发一套报表模板,使用时通过程序动态修改数据源来满足实际需要. 下面通过一个使用JAVA程序修改集算报表数据源SQL的例子说明使用过程. 编辑报表模板: 由于不同数据源的字段不同,因此这里使用动态表达式ds1.fname()获取字段名,ds1.field()获取字段值.此外,第一行和第一列为辅助行列,设置其隐藏. 编写代码: 1.读入报表

报表数据源之多结果集

多样性数据源在报表开发中越来越常见,润乾集算报表对多样性数据源的有效支持使得这类报表开发变得非常简单,目前集算报表除了支持不同类型的数据源(RDB.TXT文本.Excel.JSON.HTTP.Hadoop.mongodb)外,还支持在一个数据集中为报表返回多个结果集使用,这样可以有效避免重复运算,提升报表开发效率和运算性能.下面通过一个实例说明多结果集的使用过程. 报表说明 根据学生成绩表查询总成绩前三名和后三名的学生姓名以及总成绩.报表样式如下: 由于要分别显示前三名和后三名学生姓名和成绩,报

06Angular指令(多重判断)

多重判断 *ngSwitchCase  *ngSwitchDefault,有一个使用前提:通过[ngSwitch]去指定判断条件 demo04.component.ts demo04.component.html 原文地址:https://www.cnblogs.com/shanlu0000/p/12202452.html

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

在报表项目中,经常有多个报表的数据源计算方法有共同的部分.使用润乾集算报表,采用可挂接算法的方案时(可参考[润乾集算报表优化应用结构之可挂接算法]),可以更方便地将这些共同部分用同一个脚本来完成,从而实现算法复用.算法复用的好处是:一个算法只实现一次,不会出现同一个算法多处实现导致不一致的情况.同时也避免一个算法实现很多次的重复劳动,减轻工作量. 下面通过两个报表复用同一个算法的例子来看一下具体的实现方法.报表1是"员工绩效工资明细表",可以按照STATE来选择不同的员工例如:STAT