天天看點

jxTMS使用示例--條件查詢

使用本示例需通過docker容器,請先下拉jxTMS的docker鏡像并按說明啟動tms容器,并從helloWorld開始嘗試。

jxTMS的條件查詢

上一節中我們示範了如何從資料庫中查詢資料然後顯示到一個資料表中。本節我們示範條件查詢,即根據使用者的輸入執行查詢。

在界面中增加查詢條件

我們在web檔案中給listDemoData界面增加一個查詢條件的部分【應插入到listDemoData和listDemoDatat1中間】:

web listDemoDatat0 parent listDemoData type table title="查詢條件",width=900;
with listDemoDatat0 row 0 col c0 web n type text text="名字:",width=120;
with listDemoDatat0 row 0 col c5 web n bind demoName type input placeholder="可用英文逗号分隔輸入多個...",width=120;
with listDemoDatat0 row 0 col c2 web n type text text="已删除:",width=120;
with listDemoDatat0 row 0 col c3 web n bind demoNoUsed type combobox values=[{'text':'是','value':true},{'text':'否','value':false}],width=120;
with listDemoDatat0 row 1 col c0 web n type button width=80,motion=cmd,demand=reSearch,text='搜尋',onlyOnce=false;
           

注:div組容器中各子控件,是按在web檔案中出現的順序依次顯示的,是以listDemoDatat0的出現順序應在listDemoDatat1之前。而任何父容器的定義都必須在子控件的定義之前,即任何一個子控件在聲明其parent時,該parent容器控件都必須已經定義過了,否則在加載時會報錯

實作條件查詢

listDemoDatat0中定義了兩個輸入控件:

  • 綁定到demoName的輸入控件,意圖是當使用者在此輸入一個名字後,在上一節查詢類型為test的demoData對象時,其名字應該包含使用者輸入的文本
  • 綁定到demoNoUsed的下拉菜單控件,意圖是當使用者選擇了是時,将demoNoUsed指派為true;當使用者選擇了否時,将demoNoUsed指派為false

注:大家請回看一下demoData類中Name的定義,應該會發現其在定義時還建立了一個全文索引,是以我們會同時示範如何進行全文索引的條件比對和一般條件的比對

請在capa.py檔案中增加如下的代碼:

def setSearchCondition(self, db, ctx):
	#預設傳回False
	cn = self.getInputBoolean('demoNoUsed')
	self.sql.addContion('demoData', 'NoUsed', jxCompare.Equal,cn)
	cn = self.getInputString('demoName')
	#如果demoName是有效輸入【非空、非空格】
	if utils.valid(cn):
		#大家回看一下data檔案中demoData的定義,Name屬性指派了全文搜尋,啟用全文搜尋的算法是Match
		self.sql.addContion('demoData', 'Name', jxCompare.Match,cn)
           

将web、capa.py按用sftp管理jxTMS的代碼所述更新到/home/tms/codeDefine/demo/demo/demo1目錄中。

然後執行一次熱機重新整理,點選快捷欄中的【示範->listDemoData】,看看顯示效果。然後輸入名字、選擇是否已删除等點選【搜尋】按鈕,看下效果。

NoUsed屬性是bool類型,是以其條件檢查使用了Equal算符,而Name屬性想采用全文索引,是以使用了Match算符。

jxCompare可以選擇的比較算符都是二進制算符,是對左操作數和右操作數的比較,包括:

  • Equal:左操作數等于右操作數
  • NoEqual:左操作數不等于右操作數
  • Less:用于數值、日期比較,左操作數小于右操作數
  • LessEqual:用于數值、日期比較,左操作數小于等于右操作數
  • Great:用于數值、日期比較,左操作數大于右操作數
  • GreatEqual:用于數值、日期比較,左操作數大于等于右操作數
  • Like:僅用于字元串,字元串包含,即左操作數以右操作數開頭
  • Match:僅用于字元串,全文搜尋,即左操作數中包含有右操作數

注:由于mysql的限制:全文索引在查詢時同時隻能啟用一個。是以在設定查詢條件時,如果同時将對兩個以上的全文搜尋的條件比對納入進來,則不會有任何搜尋結果

jxTMS在加載資料源後會将其儲存為self.sql,然後會調用幾個函數以對資料源進行處理,其中之一就是setSearchCondition函數,預設的setSearchCondition是不做任何處理。當需要添加查詢條件時,就可以重載setSearchCondition函數,對self.sql對象增加查詢條件。

條件查詢的處理邏輯

我們這兩節講解資料表的查詢顯示與條件查詢,因為内容比較多,我們總結一下分頁資料表的工作邏輯:

1、使用者點選一個dispType為list的資料表顯示入口後,jxTMS根據入口中的dataSource參數來加載相應的資料源

2、jxTMS将資料源儲存為self.sql,然後調用setSearchCondition根據使用者的輸入進行條件設定

3、jxTMS将self.sql編譯為對應的sql語句,請求資料庫計算該查詢條件下所有符合的結果總行數

4、jxTMS将總行數發送到前端,對資料表的分頁控件進行初始化【根據總數和每頁行數即limit,計算有多少個頁碼,以及每個頁碼所對應的offset值】

5、分頁控件初始化完畢後,自動發出對第一個頁面的資料請求【offset=0】

6、jxTMS用編譯好的sql語句,加上前端送來的limit數和offset數,請求資料庫執行對應本頁面的查詢

7、jxTMS将查詢出來的每行資料,轉換為入口中objType參數所指定的資料對象,然後調用dispAffairInfo函數進行資料加工

8、jxTMS将加工後的每行資料彙集後,發送到前端

9、前端用接收到的資料重新整理資料表

注1:如果使用者點選了【搜尋】按鈕,jxTMS執行reSearch指令,從上面的第2步再來一遍

注2:如果使用者點選了分頁控件所顯示的1、2、3…等頁碼,分頁控件,從上面的第5步開始,隻不過送的是對應頁碼所對應的offset值