动态生成 JSON

通过前面小节的介绍我们了解了元数据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,期望不同的用户看到不同的字段:

用户ID23时,选用EMPIDEMPNAMEDEPT字段生成的元数据JSON

用户ID24时,选用DEPTBIRTHDAYGENDER字段生成的元数据JSON

详细集算器脚本参考commonQueryMetadata.splx。该文件位于【安装目录】\report\web\webapps\demo\WEB-INF\reportFiles\commonQuery\下。

使用"员工"表生成元数据JSON结果如图:

参数说明

table:需要查询数据的表名。

metadataspl类型(文件后缀为.splx/.spl/.dfx)的元数据,仅支持相对路径,相对于应用根目录

table_name +spl类型的metadata用来生成最终的元数据json串。

rpx:报表模版,用来展示数据。可使用相对路径或绝对路径,使用相对路径时,相对于应用中配置文件raqsoftConfig.xml 里配置的Report中的home属性的路径。