查询JSON是通用查询控件的输出结果。它的作用除了生成SQL,还可用于还原通用查询界面,进行二次编辑。
业务人员在查询页面设置好了查询细节,点击【查询】按钮,系统会把这些细节封装到一个查询JSON里,接下来我们将详细讲解下什么是查询JSON,以及不同的查询JSON会查询出什么样的数据。
查询JSON结构:
{
fields : [
{
name : "field1",
alias:"销售额合计",
dataType :1,
comparison : ">=",
values : [50000],
aggr : "sum"
}
],
currGroup : ‘group1’
}
通用查询页面提供JS方法getCommonQueryJSON()返回查询JSON,fields为所有要查询出或参与查询的字段,每个字段对象中参数定义如下:
name:字段名;
alias:在结果集中的列名,为空时只参与查询不显示;
dataType: 数据类型,1整数;2实数;3字符串;4日期;
comparison:条件比较符,>、=、<、in、like、not like…;
values: 条件值;
aggr:聚合方式,sum求和;count计数;icount去重计数;…。存在聚合字段时,显示的非聚合字段就是分组字段。
和查询无关的属性,用于还原查询页面:
currGroup:当前选中的字段组。
查询页面可根据用户不同的过滤分析需求做不同操作,生成不同的查询JSON。
界面如下:
① 调整字段顺序的功能按钮,鼠标位于此按钮上,可拖动改变字段顺序。
② 删除按钮,删除选出字段。
③ 设置是否显示字段的按钮,用于设置选出字段是否显示。字段不显示时,条件依然有效。
④ 字段别名编辑框,可重新编辑字段别名。
⑤ 分组汇总下拉框,包含:不汇总、求和、计数、去重计数、最大、最小和平均。
⑥ 条件比较符下拉框。字段类型为数值时,条件比较符包含:等于、大于等于、大于、小于等于、小于;字段类型为字符串时,条件比较符包含:等于、包含和不包含;字段类型为日期串时,条件比较符包含:等于、迟于等于、迟于、早于等于、早于。
⑦ 条件值编辑框。可编辑条件值或者通过按钮选择值。条件值有多个时以逗号分隔。
将字段列表中的字段拖拽到右边查询区域,这样就可以选出想看的字段里面的数据。
此时的查询JSON为:
{
"fields":[
{
"name":"EMPID",
"alias":"员工编号",
"title":"员工编号",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
},
{
"name":"DEPT",
"alias":"部门",
"title":"部门",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
},
{
"name":"SALARY",
"alias":"工资",
"title":"工资",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
}
],
"currGroup":"_all"
}
按照选出字段生成数据,不显示字段的条件依然有效。
此时的查询JSON为:
{
"fields":[
{
"name":"EMPID",
"alias":"员工编号",
"title":"员工编号","comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
},
{
"name":"DEPT",
"alias":"部门",
"title":"部门",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
},
{
"name":"SALARY",
"alias":"工资",
"title":"工资",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
},
{
"name":"GENDER",
"alias":"",
"title":"性别",
"comparison":"=",
"values":["1"],
"show":2,
"aggr":"",
"dataType":1
}
],
"currGroup":"_all"
}
性别设置不显示,alias为空,但它只选出男性的条件仍然有效。
如果只有聚合字段,没有非聚合的,那就聚合全部数据,相当于只有一组。
此时的查询JSON为:
{
"fields":[
{
"name":"EMPID",
"alias":"员工数",
"title":"员工数",
"comparison":"=",
"values":[],
"show":1,
"aggr":"count",
"dataType":1
}
],
"currGroup":"_all"
}
存在聚合时,进行分组查询,按所有显示的非聚合字段分组。
此时的查询JSON为:
{
"fields":[
{
"name":"EMPID",
"alias":"员工数",
"title":"员工数",
"comparison":"=",
"values":[],
"show":1,
"aggr":"count",
"dataType":1
},
{
"name":"GENDER",
"alias":"性别",
"title":"性别",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
}
],
"currGroup":"_all"
}
聚合字段上设置的条件为聚合后的条件,相当于sql中的having,这里是要找出员工数少于5个的部门。
此时的查询JSON为:
{
"fields":[
{
"name":"EMPID",
"alias":"员工数",
"title":"员工数",
"comparison":"<",
"values":["5"],
"show":1,
"aggr":"count",
"dataType":1
},
{
"name":"DEPT",
"alias":"部门",
"title":"部门",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
}
],
"currGroup":"_all"
}
需求变成:找出员工编号<=30且员工数小于5的部门,这时把员工编号字段拖入两次,聚合前的员工编号要设置成小于等于30,并且设置不显示;而计数的条件设置小于5。
也就是说员工编号聚合前后都参与了过滤。
此时的查询JSON为:
{
"fields":[
{
"name":"DEPT",
"alias":"部门",
"title":"部门",
"comparison":"=",
"values":[],
"show":1,
"aggr":"",
"dataType":1
},
{
"name":"EMPID",
"alias":"员工数",
"title":"员工数",
"comparison":"<",
"values":["5"],
"show":1,
"aggr":"count",
"dataType":1
},
{
"name":"EMPID",
"alias":"",
"title":"员工编号",
"comparison":"<=",
"values":["30"],
"show":2,
"aggr":"",
"dataType":1
}
],
"currGroup":"_all"
}
还原界面是指对已保存的查询json做二次编辑,将页面还原成原来的编辑状态。
可通过查询页面提供的JS方法getCommonQueryJSON()获取查询JSON。
查询JSON还原界面的方式有如下两种:
方法一:直接提供json字符串。
编辑【安装目录】\report\web\webapps\demo\raqsoft\guide\jsp\下的cq.jsp,使用json字符串生成查询JSON:
String cqx = "{'fields':[{'name':'NATIVE','alias':'户籍城市','title':'户籍城市','comparison':'=','values':['2','5','6','8'],'show':1,'aggr':'','dataType':1},{'name':'GENDER','alias':'性别','title':'性别','comparison':'=','values':[1],'show':1,'aggr':'','dataType':1},{'name':'DEGREE','alias':'学历','title':'学历','comparison':'=','values':['2','4'],'show':1,'aggr':'','dataType':1}],'currGroup':'_all'}";
通过Tag标签<raqsoft:commonQuery>发布:
<raqsoft:commonQuery
… …
cqx="<%=cqx%>"
/>
结果如下图:
方法二:根据页面参数和当前登录用户提供json字符串。
官方界面只是查询工具,不具备用户权限系统,客户把通用查询页面引入到自己的系统后,需要在jsp上部的java代码处根据当前用户的不同准备不同的Tag属性值,达到权限控制的目的。
同 多种JSON类型的使用 中的第3种生成方式类似,具体参考该小节。
……
cqx = "";
%>
<raqsoft:commonQuery
metadata="<%=metadata%>"
params="<%=params%>"
cqx="<%=cqx%>"
/>