在机房收费系统中,其中的组合查询仅仅在刚开始的时候构思了一点自己的想
法,但是并没用付诸于行动,去尝试自己的是否正确,而是选择了去看之前看
到的一篇关于组合查询的博客,说起来有些愧疚的啊。还好的是当我理清思路
之后剩下的组合查询都是自己的写的了。
在这分享一下自己的思路,共分为三步。(以学生基本信息维护为例)
1.首先窗体的建立,加入需要控件等来补充界面。
2.当运行之时需要添加信息,也就是供用户选择的消息。
Dim a, b, c
'对于控件数组简单的添加方法!!!
For a = 0 To 2
With Combo1(a)
.AddItem "卡号"
.AddItem "学号"
.AddItem "姓名"
.AddItem "性别"
.AddItem "系别"
.AddItem "年纪"
.AddItem "班级"
End With
Next a
For b = 0 To 2
With Combo2(b)
.AddItem "="
.AddItem "<"
.AddItem ">"
.AddItem "<>"
End With
Next b
For c = 0 To 1
With Combo3(c)
.AddItem "与"
.AddItem "或"
End With
Next c
3.有了控件和消息之后就到了查询和显示了。
大家都知道一般的sql查询语句为
`txtsql='select * from student_info where status='使用' _
and username='" & txtuserno.text & "'"`
我们先来分析一下这个语句,其中前半句
前半句`txtsql='select * from student_info where`
无论放到哪,查什么的东西都是一样的。主要的是后面,后面内容主要分为四部分
1.字段名(status) 2.操作符(=)
3.要查询的内容,即限制条件('使用') 4.组合关系(and)
知道了这四部分,我们就可以简单的写出sql语句了。
(1)由于combo1中添加的信息为汉语,不能够在sql语句中直接使用
所以我首先定义了一个过程,来进行转换。
Private Function tName(Englishname As String) As String
'定义一个过程,进而在进行判断的时候,可以省略
Select Case Englishname
Case "卡号"
tName = "cardno"
Case "学号"
tName = "studentno"
Case "姓名"
tName = "studentname"
Case "性别"
tName = "sex"
Case "系别"
tName = "department"
Case "年级"
tName = "grade"
Case "班级"
tName = "class"
End Select
End Function
(2)接下来就是查询语句了。
Private Sub cmdquery_Click()
Dim a(组合关系)
'我将每一行的查询都分开了,这样的话可以使整体上看上去更加简洁,规范。
'调错等也比较方便。除此之外,他们的txtsql可以继承上面的!放很多。
'第一行查询。。。。。。。。。。。。。。。。。。。。。
If Not texttxt(Combo1(0).Text) Then
MsgBox "请输入第一行字段名", vbOKOnly + vbExclamation, "提示"
Combo1(0).SetFocus
Exit Sub
ElseIf Not texttxt(Combo2(0).Text) Then
MsgBox "请输入第一行操作符", vbOKOnly + vbExclamation, "提示"
Combo2(0).SetFocus
Exit Sub
ElseIf Not texttxt(Text1(0).Text) Then
MsgBox "请在第一行输入要查询的内容", vbOKOnly + vbExclamation, "提示"
Text1(0).SetFocus
Exit Sub
Else
txtsql = "select * from student_info where " & tName(Combo1(0).Text) & Combo2(0).Text & "'" & Text1(0).Text & "'"
Set mrc = ExecuteSQl(txtsql, msgTxt)
'其中字段名tName(Combo1(0).Text),操作符Combo2(0).Text,
'查询的内容Text1(0).Text。
If mrc.EOF Then
MsgBox "当前没有该内容", vbOKOnly + vbExclamation, "提示"
Exit Sub
Else
If Combo3(0).Text = "" Then
GoTo case1
End If
End If
End If
'第二行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Select Case Combo3(0) '判断与或者非,并记入a(组合关系)
Case "与"
a = "and"
Case "或"
a = "or"
End Select
If Not texttxt(Combo1(1).Text) Then
MsgBox "请输入第二行字段名", vbOKOnly + vbExclamation, "提示"
Combo1(1).SetFocus
Exit Sub
ElseIf Not texttxt(Combo2(1).Text) Then
MsgBox "请输入第二行操作符", vbOKOnly + vbExclamation, "提示"
Combo2(1).SetFocus
Exit Sub
ElseIf Not texttxt(Text1(1).Text) Then
MsgBox "请在第二行输入要查询的内容", vbOKOnly + vbExclamation, "提示"
Text1(1).SetFocus
Exit Sub
Else
txtsql = txtsql & a & " " & tName(Combo1(1).Text) & Combo2(1).Text & "'" & Text1(1).Text & "'"
Set mrc = ExecuteSQl(txtsql, msgTxt)
'该语句的第二个txtsql是对于第一行txtsql的继承,
'后面的分别为组合关系a,字段名tName(Combo1(1).Text),
'操作符Combo2(1).Text,要查询的内容Text1(1).Text。
If mrc.EOF Then
MsgBox "当前没有该内容", vbOKOnly + vbExclamation, "提示"
Exit Sub
Else
If Combo3(1).Text = "" Then
GoTo case1
End If
End If
End If
'第三行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Select Case Combo3(1)
Case "与"
a = "and"
Case "或"
a = "or"
End Select
If Not texttxt(Combo1(2).Text) Then
MsgBox "请输入第三行字段名", vbOKOnly + vbExclamation, "提示"
Combo1(2).SetFocus
Exit Sub
ElseIf Not texttxt(Combo2(2).Text) Then
MsgBox "请输入第三行操作符", vbOKOnly + vbExclamation, "提示"
Combo2(2).SetFocus
Exit Sub
ElseIf Not texttxt(Text1(2).Text) Then
MsgBox "请在第三行输入要查询的内容", vbOKOnly + vbExclamation, "提示"
Text1(2).SetFocus
Exit Sub
Else
txtsql = txtsql & a & " " & tName(Combo1(2).Text) & Combo2(2).Text & "'" & Text1(2).Text & "'"
Set mrc = ExecuteSQl(txtsql, msgTxt)
'同上
If mrc.EOF Then
MsgBox "当前没有该内容", vbOKOnly + vbExclamation, "提示"
Exit Sub
Else
GoTo case1
End If
End If
' (3)查询信息的展现(这里是运用了goto语句)
case1:
With myflexgrid
.Rows = 1
.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) = "状态"
.TextMatrix(0, 9) = "备注"
.TextMatrix(0, 10) = "类型"
.TextMatrix(0, 11) = "日期"
.TextMatrix(0, 12) = "时间"
Do While mrc.EOF = False
.Rows = .Rows + 1
.CellAlignment = 4
.TextMatrix(.Rows - 1, 0) = mrc.Fields(1)
.TextMatrix(.Rows - 1, 1) = mrc.Fields(2)
.TextMatrix(.Rows - 1, 2) = mrc.Fields(0)
.TextMatrix(.Rows - 1, 3) = mrc.Fields(7)
.TextMatrix(.Rows - 1, 4) = mrc.Fields(4)
.TextMatrix(.Rows - 1, 5) = mrc.Fields(5)
.TextMatrix(.Rows - 1, 6) = mrc.Fields(6)
.TextMatrix(.Rows - 1, 7) = mrc.Fields(3)
.TextMatrix(.Rows - 1, 8) = mrc.Fields(10)
.TextMatrix(.Rows - 1, 9) = mrc.Fields(8)
.TextMatrix(.Rows - 1, 10) = mrc.Fields(14)
.TextMatrix(.Rows - 1, 11) = mrc.Fields(12)
.TextMatrix(.Rows - 1, 12) = mrc.Fields(13)
mrc.MoveNext
Loop
End With
End Sub
当我刚开始的时候想到组合查询感觉是很复杂的,但是当理清楚其中的思路之
后就感觉简单了很多。希望大家能够从此得到一些收获。