组合查询在实现基本功能的时候,觉得也不是那么困难,虽然有一些技巧,但一个个学习之后还是可以实现的。但是在限制输入,引导用户正确输入,增加用户体验度方面的确费了不少脑细胞。
整体理解:方框内的分别为三个条件,将其整体看待。后面的两个comboBox是组合关系
一、基本功能
组合查询道理上也不难,就是把用户要查找的几个条件连接起来,去数据库查询就好了,具体操作如下:
1.comboBox中利用数组循环添加所需要内容
Private Sub Form_Load() '向列表框中循环添加所需要的条件 For i = 0 To 2 cmbField(i).AddItem "卡号" cmbField(i).AddItem "姓名" cmbField(i).AddItem "上机日期" cmbField(i).AddItem "上机时间" cmbField(i).AddItem "下机日期" cmbField(i).AddItem "下机时间" cmbField(i).AddItem "消费金额" cmbField(i).AddItem "金额" cmbField(i).AddItem "备注" Next i For j = 0 To 2 cmbOperator(j).AddItem "=" cmbOperator(j).AddItem "<" cmbOperator(j).AddItem ">" cmbOperator(j).AddItem "<>" Next j For k = 0 To 1 cmbRelation(k).AddItem "与" cmbRelation(k).AddItem "或" Next k End Sub
2.将关键字赋值给字符串
'为之后要用到查询数据的关键字做准备 Select Case cmbField(0).Text Case "卡号" strField0 = "cardno" Case "姓名" strField0 = "studentName" Case "上机日期" strField0 = "ondate" Case "上机时间" strField0 = "ontime" Case "下机日期" strField0 = "offdate" Case "下机时间" strField0 = "offtime" Case "消费金额" strField0 = "consume" Case "余额" strField0 = "cash" Case "备注" strField0 = "status" End Select
3.将方框内容整合为三个条件以及两个组合关系都分别赋值到文本框中
'将查找的条件分别放入5个闲置的文本框中做临时存储 Text1.Text = strField0 & cmbOperator(0).Text & "'" & txtContent(0).Text & "'" Text2.Text = strField1 & cmbOperator(1).Text & "'" & txtContent(1).Text & "'" Text3.Text = strField2 & cmbOperator(2).Text & "'" & txtContent(2).Text & "'" If cmbRelation(0).Text = "或" Then Text4.Text = "Or" If cmbRelation(0).Text = "与" Then Text4.Text = "And" If cmbRelation(1).Text = "或" Then Text5.Text = "Or" If cmbRelation(1).Text = "与" Then Text5.Text = "And"
4.将查找内容连接在一起进行查询
'按条件进行分类查询 txtSQL = "select * from Line_Info where " & Text1.Text & "" If Testtxt(cmbRelation(0)) = True And Testtxt(cmbRelation(1).Text) = False Then txtSQL = txtSQL & " " & Text4.Text & " " & Text2.Text ElseIf Testtxt(cmbRelation(0)) = True And Testtxt(cmbRelation(1).Text) = True Then txtSQL = txtSQL & " " & Text4.Text & " " & Text2.Text & " " & Text5.Text & " " & Text3.Text End If Set mrc = ExecuteSQL(txtSQL, MsgText) With myflexgrid '设置myflexgrid .ColWidth(2) = 1400 .ColWidth(4) = 1400 .CellAlignment = 4 .TextMatrix(0, 0) = "卡号" .TextMatrix(0, 1) = "姓名" .TextMatrix(0, 2) = "上机日期" .TextMatrix(0, 3) = "上机时间" .TextMatrix(0, 4) = "下机日期" .TextMatrix(0, 5) = "下机时间" .TextMatrix(0, 6) = "消费金额" .TextMatrix(0, 7) = "余额" .TextMatrix(0, 8) = "备注" .Rows = 1 Do While Not mrc.EOF .Rows = .Rows + 1 .CellAlignment = 4 .TextMatrix(.Rows - 1, 0) = Trim(mrc.Fields(1)) .TextMatrix(.Rows - 1, 1) = Trim(mrc.Fields(3)) .TextMatrix(.Rows - 1, 2) = Trim(mrc.Fields(6)) .TextMatrix(.Rows - 1, 3) = Trim(mrc.Fields(7)) .TextMatrix(.Rows - 1, 4) = Trim(mrc.Fields(8)) .TextMatrix(.Rows - 1, 5) = Trim(mrc.Fields(9)) .TextMatrix(.Rows - 1, 6) = Trim(mrc.Fields(11)) .TextMatrix(.Rows - 1, 7) = Trim(mrc.Fields(12)) .TextMatrix(.Rows - 1, 8) = Trim(mrc.Fields(13)) mrc.MoveNext Loop End With mrc.Close
二、限制、引导输入
做这部分的时候,就一直在想:用户你是疯了吗?非要想法设法的乱输吗?这么可以有这么多的情况。。。。
整理了一下,最后我的思路是:
1.每个方框内(文章首图中)只要有输入,就得把条件输入完整
2.(从左往右)如果第一行输入,可以执行;第二行输入,则必须选组合关系;第三行同理
3.(从右往左)如果有第一个组合关系,第一、二行必须输入完整;有第二个组合关系,第二、三行必须输入完整
'****限制输入,引导用户正常输入****
'第一行必须输入且输入完整 If (Testtxt(cmbField(0).Text) And Testtxt(cmbOperator(0).Text) And Testtxt(txtContent(0).Text)) = False Then MsgBox "请将第一行内容输入完整!", vbInformation, "提示" Exit Sub End If '如果 组合关系 已输入,但查找条件不完整 If Testtxt(cmbRelation(0).Text) And (cmbField(1).Text = "" Or cmbOperator(1).Text = "" Or txtContent(1).Text = "") Then MsgBox "请将第二行内容输入完整!", vbInformation, "提示" Exit Sub End If If Testtxt(cmbRelation(1).Text) And (cmbField(2).Text = "" Or cmbOperator(2).Text = "" Or txtContent(2).Text = "") Then MsgBox "请将第三行内容输入完整!", vbInformation, "提示" Exit Sub End If '如果 查找条件 已输入,但没有组合关系 If Testtxt(cmbRelation(0)) = False _ And (Testtxt(cmbField(0).Text) Or Testtxt(cmbOperator(0).Text) Or Testtxt(txtContent(0).Text)) _ And (Testtxt(cmbField(1).Text) Or Testtxt(cmbOperator(1).Text) Or Testtxt(txtContent(1).Text)) Then MsgBox "请选择要查找内容的关系!", vbInformation, "提示" Exit Sub End If If Testtxt(cmbRelation(1)) = False _ And (Testtxt(cmbField(2).Text) Or Testtxt(cmbOperator(2).Text) Or Testtxt(txtContent(2).Text)) _ And (Testtxt(cmbField(1).Text) Or Testtxt(cmbOperator(1).Text) Or Testtxt(txtContent(1).Text)) Then MsgBox "请选择要查找内容的关系!", vbInformation, "提示" Exit Sub End If
If cmbField(0).Text = "姓名" Then cmbOperator(0).Clear cmbOperator(0).AddItem "=" cmbOperator(0).AddItem "<>" End If
总结
组合查询刚开始觉得比较麻烦,但是理清思路之后就会容易许多。
虽然觉得这么多的可以输入的地方,造成各种可能违法输入的结果,但是将这些零零碎碎的问题整合为几个整体,先处理整体之间的关系,然后再处理整体内部可能出现的状况。
或者通过实际情况考虑,把用户输入大致划分几种情况,从这几种情况入手,然后通过不断提示进而规范用户输入。
解决问题的方法有很多,从哪个方面都可以达到目的。但是要有一个整体的思路、框架,然后再逐步细分,将各种问题囊括进去,通过用自己的整体逻辑体系将繁杂的问题解决。