目录
二、使用了多个查询条件之间关系框后,使其对应的查询条件框可用
四、对于时间和日期字段名,textbox控件隐藏,使用DTPicker控件
(1)先将字段名和查询条件的关系的汉字转换成对应的sql语句
一、利用数组
每一组控件就是一个数组,利用数组写代码,利用数组添加选项。当然不只是这些。
For i = 0 To 2
With cboField(i)
.AddItem "教师"
.AddItem "注册日期"
.AddItem "注册时间"
.AddItem "注销日期"
.AddItem "注销时间"
.AddItem "机器名"
End With
Next i
二、使用了多个查询条件之间关系框后,使其对应的查询条件框可用
'单击选择框事件
'我的选择框是数组,所以可以直接使用索引值index
Private Sub cboCombineRelation_Click(Index As Integer)
Dim i As Integer
i = Index
If cboCombineRelation(i).Text = "或" Or cboCombineRelation(i).Text = "与" Then
'由于选择框是两个,而条件的内容框是3个,所以使用第i个选择框,连接的是第i+1个条件的内容框
cboField(i + 1).Enabled = True
cboOpSymbol(i + 1).Enabled = True
txtInquiryContent(i + 1).Enabled = True
End If
End Sub
三、对应不同的字段名,改变操作符。
因为对应姓名这种字段名,不存在大于和小于关系
Private Sub cboField_Click(Index As Integer)
Dim i As Integer
i = Index
If cboField(i).Text = "姓名" Or cboField(i).Text = "备注" Then
'如果这里不清除,可能导致在之前添加的基础上又添加
cboOpSymbol(i).Clear
cboOpSymbol(i).AddItem "="
cboOpSymbol(i).AddItem "<>"
Else
'如果这里不清除,可能导致在之前添加的基础上又添加
cboOpSymbol(i).Clear
cboOpSymbol(i).AddItem "="
cboOpSymbol(i).AddItem "<"
cboOpSymbol(i).AddItem ">"
cboOpSymbol(i).AddItem "<>"
End If
End Sub
四、对于时间和日期字段名,textbox控件隐藏,使用DTPicker控件
先添加3个DTPicker控件,同样添加的时候使用数组哦。
(1)为什么是3个不是6个啊
哈哈哈,因为DTPicker控件有一个神奇的属性,是Format
format=0-dtpLongDate:格式是2018年12月13日
format=1-dtpShortDate:格式是2018/12/13
format=2-dtpTime:格式是0:00:00,这个时候是时间,不是日期哦
Format=3-dtpCustom,这个时候可以自定义格式,比如dtpicker1.CustomFormat=Format("yy MM dd")
(2)先在开始的时候显示文本框,隐藏dtpicker的3个控件。当隐藏的时候就不可用了。
For m = 0 To 2
DTPicker1(m).Visible = False
Next m
(3)选择时间或者日期的字段名的时候,显示dtpicker的3个控件。隐藏输入内容的3个文本框
Private Sub cboField_Click(Index As Integer)
Dim i As Integer
i = Index
If cboField(i).Text = "注册日期" Or cboField(i).Text = "注销日期" Then
'我初始设置的日期格式,所以这里不用设置
DTPicker1(i).Visible = True
txtInquiryContent(i).Visible = False
Else
If cboField(i).Text = "注册时间" Or cboField(i).Text = "注销时间" Then
’设置格式为时间格式
DTPicker1(i).Format = dtpTime
DTPicker1(i).Visible = True
txtInquiryContent(i).Visible = False
Else
DTPicker1(i).Visible = False
txtInquiryContent(i).Visible = True
End If
End If
End Sub
(4)、那么查询的时候该查哪个控件的值啊,岂不是又很多代码。嘿嘿,下面的代码解决这个问题
在查询之前,如果dtpicker控件可以将内容赋值给txtInquiryContent控件(也就是输入内容的文本框),然后在输入组合查询代码
Private Sub cmdInquiry_Click()
Dim i As Integer
For i = 0 To 2
If DTPicker1(i).Visible = True Then
txtInquiryContent(i).Text = DTPicker1(i).Value
End If
Next i
End Sub
五、重头戏,组合查询代码
(1)先将字段名和查询条件的关系的汉字转换成对应的sql语句
Public Function FieldName(StrFieldName As String) As String
Select Case StrFieldName
Case "学号"
FieldName = "studentno"
Case "姓名"
FieldName = "studentname"
Case "卡号"
FieldName = "cardno"
'其他的不一一列举
End Select
End Function
Public Function RelationName(StrRelationName As String) As String
Select Case StrRelationName
Case "与"
RelationName = "and"
Case "或"
RelationName = "or"
End Select
End Function
(2)在输入查询代码
Private Sub cmdInquiry_Click()
Dim txtSQL As String
Dim msgtext As String
Dim mrc As ADODB.Recordset
'这里添加上面的dtpicker控件的内容赋值给txtInquiryContent控件
txtSQL = "select * from worklog_info where "
'判断第一个查询条件是否输入数据
If Not Testtxt(cboField(0).Text) Or Not Testtxt(cboOpSymbol(0).Text) Or Not Testtxt(txtInquiryContent(0).Text) Then
MsgBox "请输入第一行查询条件的内容!", vbOKOnly + vbExclamation, "提示"
cboField(0).SetFocus
Exit Sub
End If
txtSQL = txtSQL & FieldName(cboField(0).Text) & cboOpSymbol(0).Text & " '" & txtInquiryContent(0).Text & "'"
If Not cboCombineRelation(0).Text = "" Then
'第二行数据是否输入
If Not Testtxt(cboField(1).Text) Or Not Testtxt(cboOpSymbol(1).Text) Or Not Testtxt(txtInquiryContent(1).Text) Then
MsgBox "请输入第二行查询条件的内容!", vbOKOnly + vbExclamation, "提示"
cboField(1).SetFocus
Exit Sub
Else
txtSQL = txtSQL & RelationName(cboCombineRelation(0).Text) & " " & FieldName(cboField(1).Text) & cboOpSymbol(1).Text & "'" & txtInquiryContent(1).Text & "'"
End If
End If
If Not cboCombineRelation(1).Text = "" Then
'第三行数据是否输入
If Not Testtxt(cboField(2).Text) Or Not Testtxt(cboOpSymbol(2).Text) Or Not Testtxt(txtInquiryContent(2).Text) Then
MsgBox "请输入第三行查询条件的内容!", vbOKOnly + vbExclamation, "提示"
cboField(2).SetFocus
Exit Sub
Else
txtSQL = txtSQL & RelationName(cboCombineRelation(1).Text) & " " & FieldName(cboField(2).Text) & cboOpSymbol(2).Text & "'" & txtInquiryContent(2).Text & "'"
End If
End If
Set mrc = ExecuteSQL(txtSQL, msgtext)
With MSHFlexGrid1
.rows = 1
'是内容在其当前单元的水平和垂直居中对齐
.CellAlignment = 4
'内容在当前列居中对齐
.ColAlignment = 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) = "状态"
'判断是否移动到据集对象的最后一条记录
Do While Not mrc.EOF
.rows = .rows + 1
.CellAlignment = 4
.ColAlignment = 4
.TextMatrix(.rows - 1, 0) = mrc.Fields(0)
.TextMatrix(.rows - 1, 1) = mrc.Fields(1)
.TextMatrix(.rows - 1, 2) = mrc.Fields(2)
.TextMatrix(.rows - 1, 3) = mrc.Fields(3)
'后面哟啊跟一个空值是为了当内容是null时,不报错
.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(7)
.TextMatrix(.rows - 1, 8) = mrc.Fields(8)
'移动到下一条记录
mrc.MoveNext
Loop
'调用模块里AdjustColWidth函数,是MSHFlexGrid1单元格的行宽和高根据内容自动调整
AdjustColWidth Me, MSHFlexGrid1
End With
If mrc.RecordCount = 0 Then
MsgBox "没有您要查询的信息", vbOKCancel + vbExclamation, "提示"
cboField(0).SetFocus
End If
mrc.Close
End Sub