使用本示例需通过docker容器,请先下拉jxTMS的docker镜像并按说明启动tms容器,并从helloWorld开始尝试。
jxTMS的多表联合查询
前面我们演示的是从demoData这一个表中如何查询数据,而现实中,大量的查询都是多表联合查询,那我们该如何做呢?
非常简单:定义好数据源就成。
我们现在以如何查询当前登录的用户关联了哪些角色来演示多表联合查询。
增加数据源
首先,和数据表一节中做的一样,我们在sql文件中先增加一个数据源:
sql listRoleByCaller
from role as trole,Relation as tr
select trole.ID as roleID,trole.Name as roleName
where trole.ID==tr.ObjID and tr.RelType=='relOrgRole2People' and tr.TargetID==callerID;
上述数据源的定义,在from子句,声明了要联立两个表进行查询:role【角色表】和Relation【关系表】。在where子句定义了两个表关联的查询条件是:
-
两表关联的条件就是Relation表中的TargetID列的值和role表中的ID列的值相等
-
此外,Relation表中的RelType列的值要等于relOrgRole2People,即本关系是组织中人员关于角色的关系
-
Relation表中的ObjID列的值要等于一个叫做callerID变量
注:where子句中,如果出现一个未加引号的单独的字符串,则视为变量名,要从上下文中取得该变量的值进行比较
增加界面
我们在web文件中增加一个关联角色列表:
web listRoleByCaller type div;
web listRoleByCallert1 bind tableTotalCount parent listRoleByCaller type table title="关联角色",width=900,pagination=true,query=search,queryParam={'listTable':'listRoleByCallert1'};
with listDemoDatat1 col roleID head roleID hide=true;
with listDemoDatat1 col roleName head 名字 width=80;
增加入口
我们在op.py文件中增加一个入口:
@biz.Motion('demo.demo1','disp','listRoleByCaller')
@biz.OPDescr
def op1(json):
json.setShortcut('演示'.decode('utf-8'),'listRoleByCaller')
json.setParam('resultType','json').setParam('dispType','list').setParam('dataSource','demo.listRoleByCaller')
设置如何查询
由于我们在数据源中使用了callerID变量,所以我们要修改capa.py增加一个之前没用过的函数来设置callerID变量的值。
def setSearchConditionVarValue(self, db, ctx):
self.infoSearch.setVar('callerID',ctx.getCaller().id())
如setSearchConditionVarValue的函数名所示,该函数就是在查询开始前,用来设置变量名的。
将web、sql、op.py、capa.py按用sftp管理jxTMS的代码所述更新到/home/tms/codeDefine/demo/demo/demo1目录中。
然后执行一次热机刷新,由于本次刷新增加了一个快捷栏中的入口,所以需退出登录后再次登录才能看到新增加的入口,然后点击快捷栏中的【演示->listRoleByCaller】,看下效果。