使用本示例需通過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】,看下效果。