动态宏的应用
动态宏,与动态参数十分类似,简单的说就是可以使用表达式的宏。
一、报表实例
在前面利用动态参数制作的报表“订货信息周报”中,一般不可能只需要按周或按时间查询,在实际业务中,按订单、按地区、按运货商等各种查询方法都可能用到。例如查看所有上海货主的订货信息:
或者查看所有统一包裹运送的订单:
如果分为多张表设计的话,使用和修改都比较麻烦,而如果能在同一张表中实现按任意字段查询的话,无疑会方便许多。下面我们就介绍如何用动态宏来实现这个功能。
二、设计过程
第1步:新建报表
第2步:定义数据集
demo_订货信息: select DEMO_ORDERS.订单ID,DEMO_ORDERS.订购日期,DEMO_ORDERS.货主地区,DEMO_ORDERS.货主城市,DEMO_ORDERS.运货商ID from DEMO_ORDERS where ${macro1}
注意:这里WHERE子句后使用的是宏而不是参数了。
定义macro1宏的默认值为1=1
第3步:参数和宏的设置
1. 参数的设置
通过菜单工具栏的【报表属性】-【参数定义】,增加两个报表参数arg1和arg2以供动态宏使用,如下:
2. 宏的设置
我们希望在arg1中输入一个数字,来选择要进行过滤的字段(例如1代表订单ID,2代表订购日期等),arg2中输入检索关键字。例如:在arg1中输入1,arg2中输入10456,就是过滤出订单ID为10456的表。那么这些可按参数选择的规则如何在SQL语句中实现呢?这就需要使用动态宏。
通过菜单工具栏的【报表属性】-【宏定义】,进入宏定义窗口可以看到自动获取到的宏macro1,修改其类型和默认值,如下:
选择宏的类型为“动态宏”。
值的表达式为: 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的前后并没有加上单引号。
第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等,而不要写“联邦货运”。
三、报表实例2
动态宏还可以应用在数据管理中,通过动态宏表达式传入非数据集参数。动态宏与参数的共用可以实现动态控制过滤条件。在下图所示的报表中,通过修改参数arg1的值来控制arg2的条件字段:当arg1为1时,arg2条件字段为订单ID,否则条件字段为货主地区。
四、设计过程2
第1步:定义复杂SQL数据集ds15
1. 输入sql语句
在【复杂SQL】标签页输入语句:
select * from demo_orders where ${macro1} and ${macro2}
2. 提取宏
在【宏配置】标签页会自动提取sql中的两个宏。
macro1需要设置为动态宏,宏表达式为:if(@arg1=="1","订单ID='"+ @arg2+"'", "货主地区='"+ @arg2+"'"),【确定】后,会自动提取参数在下方显示;
给arg1设置初始值为2,选中再通用查询中显示;arg2默认值为华北,选中再通用查询中显示:
macro2为通用查询使用的宏,因此为其选择为条件宏:
5. 预览数据
点击【数据预览】按钮,弹出窗口:
按【确定】后显示数据,货主地区都是“华北”:
第2步:编辑报表
1. 新建报表
2. 引用数据集ds15
3. 在快捷公式中点选“列表”,并将字段“货主地区”、“货主城市”、“订单ID”分别拖入A1、A2、A3单元格:
(1)A1单元格表达式为:=ds15.Select(货主地区)
(2)A2单元格表达式为:=ds15.Select(货主城市)
(3)A3单元格表达式为:=ds15.Select(订单ID)
4. 保存报表
5. 添加通用查询条件“货主城市”
隐藏查询条件macro2。
通用查询可对报表起到数据查询过滤的作用。使用方法我们下一章具体介绍。
第3步:预览报表
当货主城市为“天津”时,预览结果为:
当货主地区为“东北”时,预览结果为:
修改arg1的值为1,arg2的值为11069,预览结果为:
五、小结
动态宏
简单的说,动态宏就是可以使用表达式的宏。
普通宏是直接将宏值传到报表中计算,动态宏是把传进来的宏值当成表达式进行计算,然后再把计算得到的值做为宏值传到报表中参与计算。
通过下面的例子可以看出两者的区别。首先定义两个宏,如下图所示:
两个宏的值是一样的,但一个是普通宏,一个是动态宏,把它们用到报表里,如下图:
预览结果如下图所示:
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。