动态宏-使用会话变量
报表样例
通过本示例,可以了解动态宏在报表中的应用。
制作如下图所示的报表:
报表特点:
- 报表可以获取当前系统用户的ID
- 根据系统用户ID控制报表展现的数据,当报表查看人员为系统管理员root时展现全部帐号信息,否则只展现本人帐号信息
报表数据来自复杂sql数据集,从系统表t_user用户帐号表取数,sql语句中应用了动态宏来控制数据查询条件,数据集sql语法如下:
制作方法
定义复杂sql数据集时,在sql语句where子句后的查询条件部分,设置宏“${conditions}”,作用是通过宏的值来动态控制查询条件:
在数据集定义界面的“宏配置”Tab页下,将自动获取刚才sql语句中设置的宏,将其类型修改设置为“动态宏”,并为该宏设置值表达式,表达式中应用了参数“sys_UserID”,作用是获取当前系统用户ID:
设置完宏表达式后点击“确定”按钮,系统自动读取表达式中的参数,将参数类型设置为“会话变量”:
绘制报表格式,并使用制表助手完成此示例报表的制作,注意D2单元格的值是引用了会话变量“sys_UserID”,即该单元格显示当前查看报表的用户ID:
详细了解参数会话变量在报表中的使用,请参考:参数。
功能点说明
动态宏与普通宏
宏是一个没有数据类型的字符串标识。
在报表运算之前,系统会全面搜索整张报表的表达式定义,将所有的引用宏名的地方替换成宏值。
宏有普通宏、动态宏、条件宏多种类型。其中,普通宏是直接将宏值传到报表中计算,而动态宏则是把传进来的宏值当成表达式进行计算,然后再把计算得到值做为宏值传到报表中使用。动态宏的表达式中可以使用函数、引用参数,实现灵活的应用。
在上面的示例报表中,数据集sql语句定义为:select * from t_user where ${conditions}。sql语句通过动态宏“conditions”来动态地生成查询条件语句。
动态宏“conditions”的表达式设置为:if(@sys_UserID=="root","1=1","user_id="+"'"+@sys_UserID+"'")。表达式中使用了会话变量来获取当前系统用户ID。该表达式的含义是:当系统用户ID为root(即系统管理员)时,返回1=1,否则返回user_id='当前用户ID'。因此,当系统管理员查看报表时,执行的sql语句为:select * from t_user where 1=1,即查询出了全部帐号信息。当其他用户查看报表时,例如用户ID为zhangyj时,执行的sql语句为:select * from t_user where user_id='zhangyj',即只查询出本人的帐号信息。
详细了解动态宏的应用,请参考:宏。