目录

动态宏的应用

动态宏,与动态参数十分类似,简单的说就是可以使用表达式的宏。

一、报表实例

在前面利用动态参数制作的报表“订货信息周报”中,一般不可能只需要按周或按时间查询,在实际业务中,按订单、按地区、按运货商等各种查询方法都可能用到。例如查看所有上海货主的订货信息:

 

或者查看所有统一包裹运送的订单:

如果分为多张表设计的话,使用和修改都比较麻烦,而如果能在同一张表中实现按任意字段查询的话,无疑会方便许多。下面我们就介绍如何用动态宏来实现这个功能。

二、设计过程

第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。