对于组合查询,我一直都很触头,因为那么多个框框要同时联合起来,那么多表要同时联合起来,共同查找一个结果,所以我先找到最难解决的那个问题,然后对症下药。
难点:
1、把字段名和操作符中的内容转化成可被识别的字符
2、操作符中的符号根据字段名的选择进行不同的显示
3、判断查询条件,进行组合查询
4、选中一行并赋值给修改窗体的文本框
5、判断文本框是否为空的简写
6、一键清空的简写
1-
在模块中对字段名text框中的内容进行转化,转化成数据库可以识别的字符
Public Function FieldName(strFieldName As String) As String
Select Case strFieldName
Case "卡号"
FieldName = "cardno"
Case "学号"
FieldName = "studentno"
Case "姓名"
FieldName = "studentname"
Case "性别"
FieldName = "sex"
Case "系别"
FieldName = "department"
Case "年级"
FieldName = "grade"
Case "班级"
FieldName = "class"
End Select
End Function
Public Function RelaName(strRelaName As String) As String
Select Case strRelaName
Case "与"
RelaName = "and"
Case "或"
RelaName = "or"
End Select
End Function
2-
1,首先,把全部的操作符都添加上去
【在这里,不需要一个一个去添加,用for循环语句,进行添加,前提:要在添加控件的时候,复制第一个控件,形成控件数组】
Private Sub Form_Load()
Dim i
For i = 0 To 2
With cmbField(i)
.AddItem "卡号"
.AddItem "学号"
.AddItem "姓名"
.AddItem "性别"
.AddItem "系别"
.AddItem "年级"
.AddItem "班级"
End With
Next
For i = 0 To 2
With cmbOp(i)
.AddItem "="
.AddItem "<>"
.AddItem "<"
.AddItem ">"
End With
Next
For i = 0 To 1
With cmbRela(i)
.AddItem "与"
.AddItem "或"
End With
Next
End Sub
2,然后在根据需要,对特定的符号进行删除
【首先把有特殊需求的字段名“姓名”“学号”“性别”“卡号”的操作符都清空,然后在统一给他们添加符合他们要求的符号、】
Private Sub cmbField_Click(Index As Integer)
Dim i As Integer
i = Index
If cmbField(i).Text = "学号" Or cmbField(i).Text = "姓名" Or cmbField(i).Text = "性别" Or cmbField(i).Text = "卡号" Then
cmbOp(i).Clear
cmbOp(i).AddItem "<>"
cmbOp(i).AddItem "="
Else
cmbOp(i).Clear
cmbOp(i).AddItem "<"
cmbOp(i).AddItem ">"
cmbOp(i).AddItem "="
cmbOp(i).AddItem "<>"
End If
End Sub
3-
这一步就需要理清这个查询的逻辑,然后才能清晰的写出来查询代码。
我没有画流程图,但是逻辑我是明白的,关键就在于组合关系的判断上
首先要知道,组合关系有三个组合,分别是“一”“二”组合,“一”“三”组合,还有“一”“二”“三组合”,一二组合由第一个组合关系的按键控制,一三组合由第二个组合关系的按键控制,一二三组合是由两个组合关系共同控制。
因此,在我们正常的判断每一行的查询内容是否为空的基础上,还需要判断组合关系,
如果选择了第一个组合关系,就需要把一二行的判断条件补充完整,
如果选择了第二个组合关系,就需要把一三行的判断条件补充完整,
如果选择了第一和第二两个组合关系,就需要把三行的判断条件都补全了。
下面是代码部分展示
Private Sub cmdInquiry_Click()
Dim StudentSQL As String
Dim SMsgText As String
Dim Smrc As ADODB.Recordset
If Not Testtxt(cmbField(0).Text) Or Not Testtxt(cmbOp(0).Text) Or Not Testtxt(txtInquiry(0).Text) Then
MsgBox "请选择第一行判断条件", 0 + 48, "提示"
cmbField(0).SetFocus
Exit Sub
End If
StudentSQL = "select * from student_info where " & FieldName(cmbField(0).Text) & Trim(cmbOp(0).Text) & "'" & Trim(txtInquiry(0).Text) & "'"
If Testtxt(cmbRela(0).Text) Then
If Not Testtxt(cmbField(1).Text) Or Not Testtxt(cmbOp(1).Text) Or Not Testtxt(txtInquiry(1).Text) Then
MsgBox "请选择第二行判断条件", 0 + 48, "提示"
cmbField(1).SetFocus
Exit Sub
End If
StudentSQL = StudentSQL & RelaName(cmbRela(0).Text) & " " & FieldName(cmbField(1).Text) & Trim(cmbOp(1).Text) & "'" & Trim(txtInquiry(1).Text) & "'"
End If
'省很多麻烦,直接调用上一个SQL,然后在后面附加条件就OK了
If Testtxt(cmbRela(1).Text) Then
If Not Testtxt(cmbField(2).Text) Or Not Testtxt(cmbOp(2).Text) Or Not Testtxt(txtInquiry(2).Text) Then
MsgBox "请选择第三行判断条件", 0 + 48, "提示"
cmbField(2).SetFocus
Exit Sub
End If
StudentSQL = StudentSQL & RelaName(cmbRela(1).Text) & " " & FieldName(cmbField(2).Text) & Trim(cmbOp(2).Text) & "'" & Trim(txtInquiry(2).Text) & "'"
End If
4-
首先设置MSFlexGrid属性
在窗体加载事件中添加代码
MSFlexGrid1.SelectionMode = flexSelectionByRow
'单击时选择整行
MSFlexGrid1.FocusRect = flexFocusHeavy
'画一个焦点框
MSFlexGrid1.HighLight = flexHighlightWithFocus
'该值决定了所选单元是否突出显示
5-
在修改窗体中,需要判断多个文本框是否为空,可以建立一个控件数组,然后再用循环进行判断
'利用控件数组判断多个文本框是否为空
Dim ctrl As Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is TextBox Then
If ctrl.Text = "" Then
MsgBox "请输入完整信息!", 0 + 48, "提示"
End If
End If
Next
6-
一键清空,和上面的一样,利用控件组+循环语句
【举一反三:控件数组+循环可以简化很多繁琐的步骤,可以把模板记下来,运用在以后的代码编写中】
Private Sub cmdClear_Click()
Dim ctrl As Control
For Each ctrl In Me.Controls
If TypeOf ctrl Is ComboBox Then
ctrl.Text = ""
End If
Next
Dim i
For i = 0 To 2
txtInquiry(i).Text = ""
Next
MSFlexGrid1.Clear
End Sub