动态宏表达式| 快逸报表工具
V5教程-表达式与常用函数

一、报表实例

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

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

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

二、设计过程

1、参数和宏的设置

(1)参数的设置

(2)宏的设置

我们希望在arg1中输入一个数字,来选择要进行过滤的字段(例如1代表订单ID,2代表订购日期等),arg2中输入检索关键字。例如:在arg1中输入1,arg2中输入10456,就是过滤出订单ID为10456的表。那么这些可按参数选择的规则如何在SQL语句中实现呢?这就需要使用动态宏。

 通过菜单工具栏的【报表属性】-【宏定义】,增加一个新宏:

选择宏的类型为“动态宏”。

值的表达式为: case(arg1, list("1"), "订单.订单ID="+arg2, list("2"), "订单.订购日期 like '"+arg2+"%'", list("3"), "订单.货主地区='"+arg2+"'", list("4"), "订单.货主城市='"+arg2+"'", list("5"), "订单.运货商ID="+arg2, "1=1")

这个宏的作用是做数据集的检索条件的,其表达式的作用是按照arg1的值选择不同的检索条件。其中订购日期的检索使用like,目的是为了让日期的过滤更灵活。最后一行的缺省值的目的,是当arg1的值不在范围内时,直接列出所有数据。

注意:本例使用的表中,运货商字段的类型是整数,所以arg1为5时,返回字串中arg2的前后并没有加上单引号。

2、定义数据集

ds13: select DEMO_ORDERS.订单ID,DEMO_ORDERS.订购日期,DEMO_ORDERS.货主地区,DEMO_ORDERS.货主城市,DEMO_ORDERS.运货商ID from DEMO_ORDERS where ${macro1}

注意:这里WHERE子句后使用的是宏而不是参数了。

在复杂报表设计器中引用ds13和demo_运货商。

3、编辑报表

A2单元格表达式为:

="检索条件:"+case(arg1,list("1"),"订单ID=",list("2"),"订购日期 like ",list("3"),"货主地区=",list("4"),"货主城市=",list("5"),"运货商ID=","*=")+arg2

显示出当前的过滤条件。

4、预览报表

设置参数值,这里arg1为5,arg2为2,表示过滤出运货商为统一包裹的记录。预览结果如下:

如果arg1为2,arg2为1996-07,表示过滤出所有订购日期在1996年7月份的记录,预览结果如下:

arg为4,arg2 为上海,表示过滤出上海的订单信息,预览结果如下:

其它几个过滤字段大家可以自己试一下,注意按运货商过滤时,arg2要写1或2或3等,而不要写“联邦货运”。

三、小结

动态宏

简单的说,动态宏就是可以使用表达式的宏。

普通宏是直接将宏值传到报表中计算,动态宏是把传进来的宏值当成表达式进行计算,然后再把计算得到的值做为宏值传到报表中参与计算。

课后练习:

1、动态宏表达式需要等于号开头吗?

2、动态宏表达式在什么地方输入?

3、下面的表达式属于什么类型,在表达式后的括号中注明:

(1)demo_运货商.select1(COMPANYNAME,SHIPPERID==value()) (   )

(2)if(row()%2==1,-52,-3342337)    (   )

(3)case(arg1, list("1"), "订单.订单ID="+arg2, list("2"), "订单.订购日期 like '"+arg2+"%'", list("3"), "订单.货主地区='"+arg2+"'", list("4"), "订单.货主城市='"+arg2+"'", list("5"), "订单.运货商ID="+arg2, "1=1")  (   )

(4)if(row()%2==1,-52,-3342337)  (   )

(5)weekbegin(arg1)    (   )

(6)=ds1.Select(订单ID)   (   )

(7)map(list("0","1"),list("男","女"))  (   )

(8)weekend(arg1)    (   )