通过前面小节的介绍我们了解了元数据JSON的细节内容以及它如何驱动通用查询页面。现在我们再讲述下如何自动化的产生元数据JSON,最原始的素材是数据库里的表,我们需要一个程序能动态的把数据库里的表转换成元数据JSON,这中间还要考虑权限控制。
如果想让数据库里的表自动化的产生元数据JSON,那么我们需要一个程序能动态的把数据库里的表转换成元数据JSON,而使用spl(文件后缀为.splx/.spl/.dfx)是一个非常好的选择,使用集算器脚本可灵活生成所需元数据JSON。
前面的spl例子中指定了"员工"表生成元数据JSON,现在对QueryMetadata.splx稍作修改,不指定表名而是通过参数传递表名,将spl另存为commonQueryMetadata.splx,修改文件内容如下:
|
A |
|
1 |
=connect("demo") |
连接demo数据源 |
2 |
>params=json(params) |
将json格式串解析成序表返回 |
3 |
=A1.query("select * from "+params.table+" limit 1") |
根据表名参数table查询一行数据 |
4 |
=create(name,dataType) |
创建空序表 |
5 |
=A3.fname().run(c=~,val=A3(1).field(c),type=if(ifnumber(val):1,ifstring(val):3;4),A4.insert(0,c,type)) |
获取table表中的字段名和字段数据类型,并将处理后的数据插入到A4 |
6 |
=create(name,fields) |
创建空序表 |
7 |
>A6.insert(0,params.table+"表",A4) |
将数据插入到 A6 |
8 |
>A1.close() |
关闭数据源连接 |
9 |
return json(A6) |
返回json串 |
参数定义:
表名作为参数,由外部传入。传入不同的表名可得到不同的元数据json,从而达到动态的目的。传入spl里的参数值格式随意,只要spl里按照如下格式正确解析就可以:
String params = "{'table': '员工', 'userId': '23'}";
commonQueryMetadata.splx脚本只涉及字段名和数据类型,形成最简单的元数据JSON,接下来在这个的基础上,我们一点点补充成完整功能的元数据JSON,增加元数据JSON中的表现信息(分组管理、中文名、条件值的可选项等)。
l 设置字段别名,可用来给英文字段设置中文字段名。
7 |
'[{v:"EMPID",d:"员工编号"},{v:"EMPNAME",d:"姓名"},{v:"GENDER",d:"性别"},{v:"DEPT",d:"部门"},{v:"NATIVE",d:"户籍城市"},{v:"DEGREE",d:"学历"},{v:"BIRTHDAY",d:"生日"},{v:"SALARY",d:"工资"}] |
>fieldNames=json(A7) |
|
8 |
>A4=A4.derive(fieldNames.select(v==name).d:title) |
|
|
l 增加性别三状态切换按钮、学历多选按钮、省市下拉树的数据。
10 |
'[{v:1,d:"男"},{v:2,d:"女"}] |
>gender=json(A10) |
|
11 |
'[{v:1,d:"小学"},{v:2,d:"初中"},{v:3,d:"高中"},{v:4,d:"大专"},{v:5,d:"本科"}] |
>education=json(A11) |
|
12 |
'[{id:1, pId:0, name:'北京',v:'1'},{id:2, pId:0, name:'天津',v:'2'},{id:3, pId:0, name:'上海',v:'3'},{id:6, pId:0, name:'重庆',v:'4'},{id:4, pId:0, name:'河北省',v:'5'},{id:41, pId:4, name:'石家庄',v:'6'},{id:42, pId:4, name:'保定',v:'7'},{id:43, pId:4, name:'邯郸',v:'8'},{id:44, pId:4, name:'承德',v:'9'},{id:5, pId:0, name:'广东省',v:'10'},{id:51, pId:5, name:'广州',v:'11'},{id:52, pId:5, name:'深圳',v:'12'},{id:53, pId:5, name:'东莞',v:'13'},{id:54, pId:5, name:'佛山',v:'14'},{id:6, pId:0, name:'福建省',v:'15'},{id:61, pId:6, name:'福州',v:'16'},{id:62, pId:6, name:'厦门',v:'17'},{id:63, pId:6, name:'泉州',v:'18'},{id:64, pId:6, name:'三明',v:'19'}] |
>city=json(A12) |
|
13 |
>A4=A4.derive(if(name=="GENDER":gender,name=="DEGREE":education,name=="NATIVE":city;null):referData) |
|
|
14 |
>A4=A4.derive(1:multi) |
|
|
l 拼元数据JSON时,按照字段类型分组,方便选字段。可根据需求改为其它要求的分组方式。
17 |
>A4.group(dataType).run(c=~,t=~(1).dataType,A16.insert(0,if(t==1:"数值字段",t==3:"字符字段";"日期字段"),c)) |
l 权限控制,示例代码如下:
16 |
if (params.userId==23) |
>data=A4.select("EMPID,EMPNAME,DEPT".split(",").pos(name)!=null) |
17 |
else if (params.userId==24) |
>data=A4.select("DEPT,BIRTHDAY,GENDER".split(",").pos(name)!=null) |
18 |
=create(name,fields) |
|
19 |
>data.group(dataType).run(c=~,t=~(1).dataType,A18.insert(0,if(t==1:"数值字段",t==3:"字符字段";"日期字段"),c)) |
|
参数中传入了用户ID,期望不同的用户看到不同的字段:
用户ID为23时,选用EMPID、EMPNAME、DEPT字段生成的元数据JSON
用户ID为24时,选用DEPT、BIRTHDAY、GENDER字段生成的元数据JSON
详细集算器脚本参考commonQueryMetadata.splx。该文件位于[安装根目录]\report\web\webapps\demo\WEB-INF\reportFiles\commonQuery\下。
使用"员工"表生成元数据JSON,结果如图:
参数说明:
table:需要查询数据的表名。
metadata:spl类型(文件后缀为.splx/.spl/.dfx)的元数据,仅支持相对路径,相对于应用根目录
table_name +spl类型的metadata用来生成最终的元数据json串。
rpx:报表模版,用来展示数据。可使用相对路径或绝对路径,使用相对路径时,相对于应用中配置文件raqsoftConfig.xml 里配置的Report中的home属性的路径。