jxTMS--分頁查詢

分頁查詢

列表查詢是最基本的信息管理手段。所以jxTMS提供了一個基本的列表查詢、條件搜索的工作框架,以最大限度的簡化列表查詢的工作量。

這個工作框架包括:

  • 數據源,一個在sql文件定義的類sql查詢語句

  • web界面,一般包括兩部分,一個用來設置搜索條件的容器表,一個用來顯示數據的分頁數據表

  • jxTMS已經實現了兩個基本的查詢函數:search調用該數據源從數據庫中查詢數據,reSearch用來根據用戶輸入來添加或設置各種搜索條件

  • 查詢出來的數據,有時並不能直接發送到前端進行顯示,例如,爲了減少數據庫的存儲量,我們用整數來表示狀態等信息,這就需要在顯示給用戶看時,將其轉換爲用戶可識別的文字。這就需要開發者提供一個相應的數據顯示函數

  • 條件查詢時要根據用戶的輸入來設置相應的查詢條件

  • 該框架自動支持分頁功能,即開發者通過在數據表的定義中指定pagination=true,則自動實現分頁

數據源的定義,請參考編程手冊中的相應說明。

web界面請參考demo中listSalesOrder的定義,其中數據表一般需有如下的三個參數:

pagination=true,query=search,queryParam={'listTable':'listSalesOrdert2'}

分別指示啓用分頁、查詢命令是search【指定後分頁會自動加載數據源進行查詢工作】,查詢出來的數據顯示到哪個數據表中。

然後打開該頁面的入口定義中應指定如下參數:

json.disp('listSalesOrder')
#要使用自動工作的分頁數據表,必須爲其指定dispType=list
json.setParam('dispType','list')
#指定sql文件中定義的數據源
json.setParam('dataSource','sales.listOrder')
#指示查詢出來的數據作爲extOrder類型的數據對象
json.setParam('objType','extOrder')

一般來說,查詢出來的數據多爲orm數據對象,其數據屬性是主要考慮如何減少存儲量、便於數據庫高速搜索的,但用戶看到的是最好是業務相關的信息描述,這兩者很多時候是衝突的,所以就需要查詢出數據後將其轉換爲用戶便於理解的業務信息,然後將處理結果生成一個json再發送到前端。如果數據非常簡單,不需要做數據轉換,那麼在sql定義時,直接定義好需要的輸出,然後指定resultType=json,就不要再用objType指示系統將其作爲一個orm數據對象進行處理了。

如果需要進行數據轉換,則開發者重載dispAffairInfo函數即可:

def dispAffairInfo(self,db,ctx,json, jo):
    json.set("orderID", jo.ID)
    json.set("orderType", jo.Type)
    json.set("orderName", jo.Name)
    json.set("custom", jo.Custom)
    #從數據庫中讀本訂單的銷售名
    json.set("sales",Relation.getObj(db.getDBConn(),jo.ID,'relSales2Order','people').Name)
    #如果前面保存了sales的名字,則就減少了讀數據庫的操作,由於這個是顯示一條就讀一次數據庫
    #而jxTMS默認的分頁表每頁的行數是15行,這就是說,按上面的方式,列表查詢銷售訂單每頁要讀16次數據庫
    #而額外保存的方式則只需要讀一次,使用者需自己衡量這兩種方式的開銷
    #json.set("sales",jo.Info.get('sales'))
    json.set('orderState',jo.State)
    json.set('amount',jo.Amount)
    #生成一個動態的a串以供用戶點擊查看該訂單的信息
    json.set("op1",self.getViewA(ctx,jo))

由於一般情況下,用戶在用列表查詢出摘要信息後,可能還會進一步的查看詳情或其它操作,所以就需要如最後一行這樣動態生成爲供用戶執行相應操作的a串【可以理解爲後臺就該行對入口進行了動態的定製】,一般最好還是生成orm數據對象後,用dispAffairInfo進行轉換爲好,雖然這樣的開銷有些大。

條件查詢包括兩種:

1、根據用戶輸入動態增加查詢條件時,使用:

def setSearchCondition(self, db, ctx):
    cn = self.getInputString('customName')
    if not utils.isNull(cn):
    	#當用戶輸入了客戶名,設置查詢條件,請注意由於用戶名支持全文搜索,所以這裏用的是match
        self.sql.addContion('salesOrder', 'Custom', jxCompare.Match,cn)

2、如果數據源是一個通用查詢,在執行時根據上下文的具體情況通過變量來實現針對性的查詢時,使用:

def setSearchConditionVarValue(self, db, ctx):
    if self.dataSource == 'sales.listMyOrder':
    	#不同人查我的訂單,自然是不同,這就需要用上下文中的執行者ID來爲數據源中的變量賦值
        self.infoSearch.setVar('salesID',ctx.getCaller().id())

最後,我們總結一下分頁查詢的工作機制:

  • 開發者定義數據源;定義web界面,指定pagination=true等;定義入口

  • 用戶在點擊該入口後,jxTMS發送界面描述到web端,web端顯示該界面,併爲數據表自動生成一個分頁控件

  • 後臺在該界面的prepareDisp事件中,加載該數據源,並使用該數據源執行一個總數查詢,將行數刷新到web端

  • web端的分頁控件用此總行數進行初始化,包括生成各頁面腳標,每頁的limit數默認是15,開發者可以知道數據表的該參數來進行調整

  • 分頁控件以offset=0/limit=15向後臺請求search事件,jxTMS即執行相應的查詢返回第一頁的數據

  • 數據表用返回的數據刷新頁面,即完成了第一頁數據的顯示

  • 用戶點擊分頁控件的某腳表,如5【即想顯示第5頁】,則分頁控件以offset=60/limit=15向後臺請求search事件,jxTMS即執行相應的查詢返回第5頁的數據,分頁控件的頁號是從0開始的,所以用戶希望顯示的頁號需要減去1

  • 數據表用返回的數據刷新頁面,即完成了第5頁數據的顯示

  • 如果用戶在搜索條件中進行了各種輸入,然後點擊了查詢按鈕,則jxTMS會調用setSearchCondition來根據用戶的輸入來重置數據源,然後重新執行一個總數查詢,刷新到前端後重置分頁控件和數據表

  • 如果數據源帶有特殊參數,如各種我的銷售訂單、我的報銷申請等等,則jxTMS會調用setSearchConditionVarValue來動態的根據上下文設置這些參數以重置數據源,然後重新執行一個總數查詢,刷新到前端後重置分頁控件和數據表

目前,jxTMS已經打包爲雲服務器鏡像,開發者開箱即用:
jxTMS-騰訊雲市場​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章