动态宏,与动态参数十分类似,简单的说就是可以使用表达式的宏。
一、报表实例
在前面利用动态参数制作的报表“订货信息周报”中,一般不可能只需要按周或按时间查询,在实际业务中,按订单、按地区、按运货商等各种查询方法都可能用到。例如查看所有上海货主的订货信息,或者查看所有统一包裹运送的订单。
如果分为多张表设计的话,使用和修改都比较麻烦,而如果能在同一张表中实现按任意字段查询的话,无疑会方便许多。下面我们就介绍如何用动态宏来实现这个功能。
二、设计过程
第1步:新建报表
第2步:参数和宏的设置
1. 参数的设置
2. 宏的设置
我们希望在arg1中输入一个数字,来选择要进行过滤的字段(例如1代表订单ID,2代表订购日期等),arg2中输入检索关键字。例如:在arg1中输入1,arg2中输入10456,就是过滤出订单ID为10456的表。那么这些可按参数选择的规则如何在SQL语句中实现呢?这就需要使用动态宏。
通过菜单工具栏的【报表属性】-【宏定义】,增加一个新宏:
选择宏的类型为“动态宏”。
值的表达式为: case(arg1, list("1"), "DEMO_ORDERS.订单ID="+arg2, list("2"), "DEMO_ORDERS.订购日期 like '"+arg2+"%'", list("3"), "DEMO_ORDERS.货主地区='"+arg2+"'", list("4"), "DEMO_ORDERS.货主城市='"+arg2+"'", list("5"), "DEMO_ORDERS.运货商ID="+arg2, "1=1")
这个宏的作用是做数据集的检索条件的,其表达式的作用是按照arg1的值选择不同的检索条件。其中订购日期的检索使用like,目的是为了让日期的过滤更灵活。最后一行的缺省值的目的,是当arg1的值不在范围内时,直接列出所有数据。
注意:本例使用的表中,运货商字段的类型是整数,所以arg1为5时,返回字串中arg2的前后并没有加上单引号。
第3步:定义数据集
demo_订货信息: select DEMO_ORDERS.订单ID,DEMO_ORDERS.订购日期,DEMO_ORDERS.货主地区,DEMO_ORDERS.货主城市,DEMO_ORDERS.运货商ID from DEMO_ORDERS where ${macro1}
注意:这里WHERE子句后使用的是宏而不是参数了。
在复杂报表设计器中引用demo_订货信息和demo_运货商。
第4步:编辑报表
A2单元格表达式为:
="检索条件:"+case(arg1,list("1"),"订单ID=",list("2"),"订购日期 like ",list("3"),"货主地区=",list("4"),"货主城市=",list("5"),"运货商ID=","*=")+arg2
显示出当前的过滤条件。
第5步:预览报表
设置参数值,这里arg1为5,arg2为2,表示过滤出运货商为统一包裹的记录。预览结果如下:
如果arg1为2,arg2为1996-07,表示过滤出所有订购日期在1996年7月份的记录,预览结果如下:
arg为4,arg2 为上海,表示过滤出上海的订单信息,预览结果如下:
其它几个过滤字段大家可以自己试一下,注意按运货商过滤时,arg2要写1或2或3等,而不要写“联邦货运”。
五、小结
动态宏
简单的说,动态宏就是可以使用表达式的宏。
普通宏是直接将宏值传到报表中计算,动态宏是把传进来的宏值当成表达式进行计算,然后再把计算得到的值做为宏值传到报表中参与计算。
通过下面的例子可以看出两者的区别。首先定义两个宏,如下图所示:
两个宏的值是一样的,但一个是普通宏,一个是动态宏,把它们用到报表里,如下图:
预览结果如下图所示:
A1单元格的表达式相当于:="abc"+1+1,因此计算结果等于“abc11”,表达式计算过程中自动把1转成字符型。
B1单元格的表达式相当于:="abc"+2,因此计算结果等于“abc2”,表达式计算过程中自动把2转成了字符型。
六、函数说明
case()
函数说明: 根据表达式的不同计算结果,返回不同的值。
注:本函数从左到右计算,先出现的表达式先算,如果出现满足的表达式,则返回相应的结果,后面的不再计算。如果没有一个表达式满足条件,而且有缺省值表达式,则返回缺省值,否则返回null。
语法: case(Exp{,list(valueExp11,valueExp12,...),resultExp1{,list(valueExp21,valueExp22,...),resultExp2{,...{,defaultExp}}}})
参数说明:
Exp 判断用到的表达式
valueExp(n) 值表达式
resultExp(n) 返回结果表达式
defaultExp 缺省值表达式,如果所有表达式结果都不满足,则返回本表达式计算结果
示例:
例1:case("上海",list("北京","天津"),"1",list("武汉","上海"),"2")运算结果为"2"。
例2:case("上海",list("北京","天津"),"1",list("武汉"),"2","3") 运算结果为"3"。
例3:case("上海",list("北京","天津"),"1",list("武汉"),"2") 运算结果为null。