# sql数据集和参数定义

# sql 数据集

其他数据集类型待补充。

在设计报表的数据集时,sql数据集内部使用参数可以先使用,后定义。参数以两个$包起来,插入到sql语句中。

SELECT [订单明细].[订单ID], [订单明细].[产品ID], [产品].[产品名称], [订单明细].[单价], [订单明细].[数量], [订单明细].[折扣], ([订单明细].[单价]*[数量]*(1-[折扣])/100)*100 AS 总价
FROM 产品 INNER JOIN 订单明细 ON [产品].[产品ID]=[订单明细].[产品ID]
where  
 [订单明细].[订单ID]='$dindan$'

提示

使用$$将参数包起来插入sql的方式,实际上是字符串拼接。引擎内部会自动对参数做sql注入的检测,如果检测到有危险,除非是以缺省值或可选列表值的方式提供的危险参数才可以执行,否则将不会执行,报错退出。

如果参数是字符串,要注意外面的引号不要丢失

#如果需要动态构造sql 语句,比如判断用户是否输入了某个参数,输入的话就拼接指定的sql片段
SELECT [订单明细].[订单ID], [订单明细].[产品ID], [产品].[产品名称], [订单明细].[单价], [订单明细].[数量], [订单明细].[折扣], ([订单明细].[单价]*[数量]*(1-[折扣])/100)*100 AS 总价
FROM 产品 INNER JOIN 订单明细 ON [产品].[产品ID]=[订单明细].[产品ID]
where 1=1

$if(false==isEmpty(param.dindan)){$
 and [订单明细].[订单ID]='$dindan$'
$}$

$if(false==isEmpty(param.chanping)){$
and [订单明细].[产品ID]='$chanping$'
$}$

ORDER BY [订单明细].[订单ID]
  • 上面的例子,是将if 语句用$$包起来插入sql语句中,注意 语句块{、 }不要丢失,否则会报错。条件语句块结束用$}$结束
  • 内嵌的模板语句中(上例中的if语句)使用参数时,要用param.参数 的方式。注意区别。
  • 当if条件满足的时候,会将紧跟其后的语句块中字符串拼接到当前的sql 中

提示

因为这种方式是字符串拼接,所以 sql 语句的任意部分都可以插入$参数$

参数绑定到sql 的时候,不管是什么数据类型,都会将参数值转换为字符串类型,然后插入到sql 的对应位置。如果参数是可以下拉选择的多选形式:

  • 参数是数字类型的,如选中的参数是1、2、3,转换为字符串后是 : 1,2,3
  • 参数是字符串类型的,如选中的参数是a、b、c,转换为字符串后是 : 'a','b','c'

# 参数定义

  • 参数有以下几个特征:
  • 1、参数有数据类型
  • 2、参数有缺省值
  • 3、可以定义显示查询界面时使用的可选择数据,比如某个项目代码作为参数,在定义该参数的可选参数时,可以直接指定可选数据,也可以选择从sql语句中选择显示值和实际值。
  • 4、参数可以定义缺省值的公式,可以引用已定义的参数,要避免参数的循环引用。
  • 参数类型:内部。内部参数都是延迟计算的。内部参数是不显示在查询条件中的,一般都是做为中间变量使用的。为程序控制添加了强有力的中间控制环节。

注意

在报表中所有的参数也是作为一个数据集对待,该数据集叫param,每个参数都是作为该数据集的一个字段属性出现。这样在报表单元格中引用的时候,直接使用param.xxx即可。

  • 在参数定义界面,点按钮:载入未定义的参数,将会自动搜索sql语句中用到的参数。参数的数据类型有:数字、字符串、日期等类型。可以选择对最终页面是否隐藏该参数(html网页上form的hide类型),是否是内部(不会提供给最终用户看到和修改的机会,每次取值都是根据公式计算,相当于内部临时变量),多选(如果是可以下拉选择的时候有效)。当参数的数据类型是日期或者是隐藏、内部等方式下,参数自动不允许被多选。

  • 如果参数是内部类型(相当于临时变量),那么他一定是在所依赖参数的后面定义,否则报表运行的时候会报引用了没有定义的参数。通过参数列表定义界面可以拖动参数的相对位置。内部参数通常是根据非内部参数计算出来的新值。

// 假如我们已经定义了一个参数叫:b_date,我们现在需要根据这个日期参数,计算这个日期所在月的最后一天
// 我们可以新增一个参数,将选项:内部 √ 上,然后设置缺省值为:
=monthEnd(param.b_date)
// 这样我们就可以在sql 中直接使用这个参数了。
// 如果这个参数在sql中仅使用一次,我们也可以直接将这个公式内联到sql中,用以下语法:   
 #注意第一个$ 后面有个+
select * from tbl where m_date>='$b_date$' and m_date<='$+monthEnd(param.b_date)$'
  • 每个参数都会有缺省参数,当报表运行的时候,如果没有提供参数值,将会以缺省参数运行。

# 级联参数的设置

假设现在报表需要两个参数,一个是产品类别id,一个是产品id,这两个参数都是可以通过下拉列表选择的。现在需要的是,客户选择的类别改变后,产品列表中的可选产品也要表示成当前类别的参数。 我们先定义类别参数,名字为leibie。定义从数据库取数的数据集sql,名称为:类别

SELECT 类别.类别ID, 类别.类别名称 FROM 类别

在参数定义画面,新建参数leibie。参数设置如下图:

定义参数:chanpin。定义从数据库取数的数据集sql,名称为:产品

SELECT 产品.产品ID, 产品.产品名称 FROM 产品 where 类别ID=$leibie$

在参数定义画面,新建参数产品。参数设置如下图: demo

数据类型为数字或字符串,非隐藏和内部类型时,可选值可以是手动录入或来自数据集。如果这两项任意一个里面有数据,将会自动出现下拉列表。这里我们都选来自于数据集。

现在我们就已经完成了级联参数的设置。我们可以看到参数:chanpin 的可选值是从产品数据集中来的,而产品数据集依赖于参数leibie(看sql语句),所以参数chanpin就依赖于参数leibie。报表引擎会自动判断该依赖关系,从而自动生成参数的级联变动。

# 可多选下拉参数注意事项

多选参数在组装到sql 中时,会自动对字符串类似的选项加单引号和逗号,数字类型只添加逗号。通常sql 中要使用in。 缺省值不需要使用单引号。如A,B,C做为缺省值

 select * from xxx
 xxx in ($param_x$)

如果param_x当前选中的是A,B,C,那么上面的sql 将 转换 为 :

 select * from xxx
 xxx in ('A','B','C')

::: tips var _ExecSqlTimeOut_=120; //可以调整sql 执行查询超时时间。在后端脚本里面加上 :::