使用本示例需通过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值