第1章 需求描述

在创建数据集时,需要输入SQL语句,一般的数据集通过SQL语句就可以建立成功,但是在某些情况下,使用固定的SQL语句不能够动态的去获取数据,或者某些情况下需要根据参数去生成不同的数据集,这些功能在目前的版本中是不支持的。而如果在语句中能够添加报表的一些公式,例如逻辑判断类的公式(case公式等)和字符串类的公式(substring公式等),再把参数代入公式进行处理,就可以解决这些场景下的需求。

第2章 功能描述

当在SQL语句中需要写公式动态的去判断一些值时,需要以如下形式输入公式:

{#=公式体#}

实例如下:

Select * from product where {#=case($type=1,’price<100’,’price>1000’)#}

公式的返回值是一个字符串,在SQL语句中需要动态返回一些值时可以使用公式,但是要保证其返回的字符串和原SQL语句拼在一起时符合SQL语句语法,上述实例中,如果参数type=1,就等同于执行了如下SQL语句

Select * from product where price<100

同理,如果参数type不为1,就等同于执行了如下SQL语句

Select * from product where price>1000

如果公式返回的字符串与原SQL语句组合在一起时不符合SQL语法,就会发生错误。所以要保证语句符合语法。再看如下实例:

{#=case($abc='1','SELECT * FROM(SELECT last_name as name FROM crm_users)t ','SELECT * FROM(SELECT description as name FROM crm_daily_daily_page)t')#}where t.name in {’张三’,’李四’,’王五’}

该实例为动态获取数据集的列,如果输入参数type为1,数据集会执行'SELECT * FROM(SELECT last_name as name FROM crm_users)t where t.name in {’张三’,’李四’,’王五’}' 这条SQL语句。如果输入参数不为1,就会执行另外一句SQL语句。这样就实现了动态的获取数据集的列。

由于数据集解析功能还没有完成,所以当需要使用SQL公式时,需要先把用到的列名解析出来,比如上述实例中,需要先在数据集中写一条可以执行的SQL语句,解析出列名name。如图所示。

然后输入应该使用的公式和SQL语句,直接点确定,不需要再次解析。如图。

1

2

之后就可以正常使用了,如果列名较多,直接使用select as 的方式获取相同的列名就行,只要列名正确,类型相同就可以。如果类型一样可以使用同一列数据,如图。

3

第3章 实例讲解

现有一个报表需求,某零售企业需要制作一张报表,统计旗下所销售的商品商品名称、库存量、进货价、单价、销售额以及销售量,但是需要在不同的筛选条件下查看该报表,如需要查看利润高(利润率大于30%)的商品,或者利润率低(利润率小于10%)的商品,或者库存量高(库存量大于100)的商品等,需要在选取不同条件后按照不同的维度筛选不同的商品,如果数据集中的数据是固定的,那就需要在报表里动态去获取,就需要每个所依赖的单元格里都写上各种条件,过于繁琐。如果数据集的数据就是根据条件动态的去获取,那单元格的数据直接get就可以了。 第一步,创建数据集,数据需要的SQL语句,并解析。如图。

4

然后输入公式条件,即在后面加入一个case公式,当参数取不同的值时,where后面跟不同的条件。如图。

5

创建参数type,并选择控件为COMBOBOX,然后再右侧选择自定义,并在下方标题和值处输入所有可能的类型,然后点击确定。如图。

6

在报表属性中选择“查询报表”为是,如图。

7

最后将数据集中的数据按照要求直接拖入表格就可以,不需要再设置复杂的条件判断,这样一张动态获取数据的报表就做好了。如图。

8

第4章 注意事项

1.在SQL语句中写入的公式返回值均为字符串。

{#=case($type=1,’1’,’2’)#}{#=case($type=1,1,2)#}

上述两个公式的返回值均为字符串,也就是说上述两种写法的结果相同。

Select * from table where type={#=case($type=1,1,2)#}

当以上述形式写公式时一定要注意,如果type是数值类型可以这么写,但是如果type不是数值类型时,需要在公式外层加上单引号。如下:

Select * from table where type=’{#=case($type=1,1,2)#}’

2.如果公式中有嵌套的单引号,需要在单引号前加入反斜杠\,如:

Select * from table {#=case($type=1, ‘where type=\’a\’’, ‘where type=\’b\’’)#}

如果在嵌套的单引号中没有使用\’,公式匹配单引号就会出现问题,报表就无法生成。

3.记得在公式前加”=”,如果没有写等号,就会变成非必填参数的形式{##},就会将其替换为1=1,公式就会失去作用。

4.建议在复杂情况下使用公式而不是大量使用{##}{@@}这样的非必填参数形式。需要对参数是否被赋值判断时,可以使用nvl()公式。

5.公式区域不支持嵌套匹配,需要写公式时在{#=#}内部输入公式即可,不需要在其内部再嵌套,如{#={#=#}#}这种形式

results matching ""

    No results matching ""

    results matching ""

      No results matching ""