欢迎您的阅读, 经过了一周的不屑努力,终于攻克了,当然还是要感谢张铎同学和晓尚同学的帮助!
#指导思想
通过拼接一条SQL语句,实现对数据的查询。
#代码
1、根据选择的不同组合关系,判断控件的使用
注意:我利用的Timer控件。
Private Sub Timer0_1_Timer()
'判断第一组控件
If Trim(comboCombineRelation0.Text) = "与" Or Trim(comboCombineRelation0.Text) = "或" Then
'激活控件
comboField(1).Enabled = True
comboOpSign1.Enabled = True
txtInquiryContent1.Enabled = True
comboCombineRelation1.Enabled = True
'判断第二组控件
If Trim(comboCombineRelation1.Text) = "与" Or Trim(comboCombineRelation1.Text) = "或" Then
'激活控件
comboField(2).Enabled = True
comboOpSign2.Enabled = True
txtInquiryContent2.Enabled = True
Else
'关闭控件
comboField(2).Text = ""
comboOpSign2.Text = ""
txtInquiryContent2.Text = ""
comboField(2).Enabled = False
comboOpSign2.Enabled = False
txtInquiryContent2.Enabled = False
End If
Else
'关闭第一组控件
comboField(1).Text = ""
comboOpSign1.Text = ""
txtInquiryContent1.Text = ""
comboCombineRelation1.Text = ""
comboField(1).Enabled = False
comboOpSign1.Enabled = False
txtInquiryContent1.Enabled = False
comboCombineRelation1.Enabled = False
'关闭第二组控件
comboField(2).Text = ""
comboOpSign2.Text = ""
txtInquiryContent2.Text = ""
comboField(2).Enabled = False
comboOpSign2.Enabled = False
txtInquiryContent2.Enabled = False
End If
End Sub
2、根据选择的不同的字段名,出现不同的操作符
提示:利用一个控件进行举例!
Private Sub comboOpSign0_dropdown()
'清空内容
comboOpSign0.Clear
'根据选择的同内容,出现不同的操作符
If Trim(comboField(0).Text) = "姓名" Or Trim(comboField(0).Text) = "备注" Then
comboOpSign0.AddItem "="
comboOpSign0.AddItem "<>"
Else
comboOpSign0.AddItem "="
comboOpSign0.AddItem "<"
comboOpSign0.AddItem ">"
comboOpSign0.AddItem "<>"
End If
End Sub
3、根据不同的字段名,使用不同的控件
Private Sub comboField_Click(Index As Integer)
'判断第一个字段名,根据不同的内容,显示不同的控件
If Trim(comboField(0).Text) <> "上机日期" And Trim(comboField(0).Text) <> "下机日期" _
And Trim(comboField(0).Text) <> "上机时间" And Trim(comboField(0).Text) <> "下机时间" _
And Trim(comboField(0).Text) <> "" Then
txtInquiryContent0.Visible = True
myPicker0.Visible = False
Else
'如果是日期或者时间
If Trim(comboField(0).Text) = "上机日期" Or Trim(comboField(0).Text) = "下机日期" Then
txtInquiryContent0.Visible = False
myPicker0.Visible = True
myPicker0.Format = dtpCustom
Else
'如果是时间
If Trim(comboField(0).Text) = "上机时间" Or Trim(comboField(0).Text) = "下机时间" Then
txtInquiryContent0.Visible = False
myPicker0.Visible = True
myPicker0.Format = dtpTime
End If
End If
End If
'判断第二个字段名,根据不同的内容,显示不同的控件
If Trim(comboField(1).Text) <> "上机日期" And Trim(comboField(1).Text) <> "下机日期" _
And Trim(comboField(1).Text) <> "上机时间" And Trim(comboField(1).Text) <> "下机时间" _
And Trim(comboField(1).Text) <> "" Then
txtInquiryContent1.Visible = True
myPicker1.Visible = False
Else
'如果是日期或者时间
If Trim(comboField(1).Text) = "上机日期" Or Trim(comboField(1).Text) = "下机日期" Then
txtInquiryContent1.Visible = False
myPicker1.Visible = True
myPicker1.Format = dtpCustom
Else
'如果是时间
If Trim(comboField(1).Text) = "上机时间" Or Trim(comboField(1).Text) = "下机时间" Then
txtInquiryContent1.Visible = False
myPicker1.Visible = True
myPicker1.Format = dtpTime
End If
End If
End If
'判断第三个字段名,根据不同的内容,显示不同的控件
If Trim(comboField(2).Text) <> "上机日期" And Trim(comboField(2).Text) <> "下机日期" _
And Trim(comboField(2).Text) <> "上机时间" And Trim(comboField(2).Text) <> "下机时间" _
And Trim(comboField(2).Text) <> "" Then
txtInquiryContent2.Visible = True
myPicker2.Visible = False
Else
'如果是日期或者时间
If Trim(comboField(2).Text) = "上机日期" Or Trim(comboField(2).Text) = "下机日期" Then
txtInquiryContent2.Visible = False
myPicker2.Visible = True
myPicker2.Format = dtpCustom
Else
'如果是时间
If Trim(comboField(2).Text) = "上机时间" Or Trim(comboField(2).Text) = "下机时间" Then
txtInquiryContent2.Visible = False
myPicker2.Visible = True
myPicker2.Format = dtpTime
End If
End If
End If
End Sub
4、根据不同的字段名,选择出不同的列名(为了降低代码量)
'选择不同的默认值
Public Function FileName(comboField$) As String
Select Case Trim(comboField)
Case "卡号"
FileName = "cardno"
Case "姓名"
FileName = "studentname"
Case "上机日期"
FileName = "ondate"
Case "上机时间"
FileName = "ontime"
Case "下机日期"
FileName = "offdate"
Case "下机时间"
FileName = "offtime"
Case "消费金额"
FileName = "consume"
Case "金额"
FileName = "cash"
Case "备注"
FileName = "status"
End Select
End Function
5、将"与"和"或"转换为"or" 和"and"
Public Function Sign(CombineRelation$) As String
Select Case Trim(CombineRelation)
Case "与"
Sign = "and "
Case "或"
Sign = "or "
End Select
End Function
6、查询部分
Private Sub cmdInquiry_Click()
'添加表头
With myFlexGrid
.Rows = 1 '设置行数
.Col = 4
.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) = "备注"
End With
'判断字段名是否为空
If Trim(comboField(0).Text) = "" Then
comboField(0).BackColor = vbRed
comboField(0).SetFocus
Else
comboField(0).BackColor = vbWhite
End If
'判断操作符是否为空
If Trim(comboOpSign0.Text) = "" Then
comboOpSign0.BackColor = vbRed
comboOpSign0.SetFocus
Else
comboOpSign0.BackColor = vbWhite
End If
Select Case Trim(comboField(0).Text)
'判断为日期类吗
Case "上机日期"
myPicker0.MaxDate = Date
If Format(myPicker0.Value, "yyyy-MM-dd") > Format(myPicker0.MaxDate, "yyyy-MM-dd") Then
MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
Exit Sub
End If
txtInquiryContent0.Text = Format(myPicker0.Value, "yyyy-MM-dd")
Case "下机日期"
myPicker0.MaxDate = Date
If Format(myPicker0.Value, "yyyy-MM-dd") > Format(myPicker0.MaxDate, "yyyy-MM-dd") Then
MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
Exit Sub
End If
txtInquiryContent0.Text = Format(myPicker0.Value, "yyyy-MM-dd")
'判断为时间类吗
Case "上机时间"
txtInquiryContent0.Text = Format(myPicker0.Value, "hh:mm:ss")
Case "下机时间"
txtInquiryContent0.Text = Format(myPicker0.Value, "hh:mm:ss")
'为其他
Case Else
If Trim(txtInquiryContent0.Text) = "" Then
txtInquiryContent0.BackColor = vbRed
txtInquiryContent0.SetFocus
Else
txtInquiryContent0.BackColor = vbWhite
End If
End Select
'如果一个逻辑关系为空
If Trim(comboCombineRelation0.Text) = "" Then
txtSQL = "select *from line_info where " & FileName(comboField(0)) & comboOpSign0.Text & "'" & txtInquiryContent0.Text & "'"
Else
'判断第二个字段名为空
If Trim(comboField(1).Text) = "" Then
comboField(1).BackColor = vbRed
comboField(1).SetFocus
Else
comboField(1).BackColor = vbWhite
End If
'判断第二个操作符为空
If Trim(comboOpSign1.Text) = "" Then
comboOpSign1.BackColor = vbRed
comboOpSign1.SetFocus
Else
comboOpSign1.BackColor = vbWhite
End If
'根据不同的选择值,选择不同控件中的值
Select Case Trim(comboField(1).Text)
'判断为日期类吗
Case "上机日期"
myPicker1.MaxDate = Date
If Format(myPicker1.Value, "yyyy-MM-dd") > Format(myPicker1.MaxDate, "yyyy-MM-dd") Then
MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
Exit Sub
End If
txtInquiryContent1.Text = Format(myPicker1.Value, "yyyy-MM-dd")
Case "下机日期"
myPicker1.MaxDate = Date
If Format(myPicker1.Value, "yyyy-MM-dd") > Format(myPicker1.MaxDate, "yyyy-MM-dd") Then
MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
Exit Sub
End If
txtInquiryContent1.Text = Format(myPicker1.Value, "yyyy-MM-dd")
'判断为时间类吗
Case "上机时间"
txtInquiryContent1.Text = Format(myPicker1.Value, "hh:mm:ss")
Case "下机时间"
txtInquiryContent1.Text = Format(myPicker1.Value, "hh:mm:ss")
'为其他
Case Else
If Trim(txtInquiryContent1.Text) = "" Then
txtInquiryContent1.BackColor = vbRed
txtInquiryContent1.SetFocus
Else
txtInquiryContent1.BackColor = vbWhite
End If
End Select
If Trim(comboCombineRelation1.Text) = "" Then
txtSQL = "select *from line_info where " & FileName(comboField(0)) & comboOpSign0.Text & "'" & txtInquiryContent0.Text & "'" _
& Sign(comboCombineRelation0.Text) & FileName(comboField(1)) & comboOpSign1.Text & "'" & txtInquiryContent1.Text & "'"
Else
'判断第三个字段名为空
If Trim(comboField(2).Text) = "" Then
comboField(2).BackColor = vbRed
comboField(2).SetFocus
Else
comboField(2).BackColor = vbWhite
End If
'判断第二个操作符为空
If Trim(comboOpSign2.Text) = "" Then
comboOpSign2.BackColor = vbRed
comboOpSign2.SetFocus
Else
comboOpSign2.BackColor = vbWhite
End If
'根据不同的选择值,选择不同控件中的值
Select Case Trim(comboField(2).Text)
'判断为日期类吗
Case "上机日期"
myPicker2.MaxDate = Date
If Format(myPicker2.Value, "yyyy-MM-dd") > Format(myPicker2.MaxDate, "yyyy-MM-dd") Then
MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
Exit Sub
End If
txtInquiryContent2.Text = Format(myPicker2.Value, "yyyy-MM-dd")
Case "下机日期"
myPicker2.MaxDate = Date
If Format(myPicker2.Value, "yyyy-MM-dd") > Format(myPicker2.MaxDate, "yyyy-MM-dd") Then
MsgBox "您选择的日期不能大于当前日期", 0 + 48, "警告"
Exit Sub
End If
txtInquiryContent2.Text = Format(myPicker2.Value, "yyyy-MM-dd")
'判断为时间类吗
Case "上机时间"
txtInquiryContent2.Text = Format(myPicker2.Value, "hh:mm:ss")
Case "下机时间"
txtInquiryContent2.Text = Format(myPicker2.Value, "hh:mm:ss")
'为其他
Case Else
If Trim(txtInquiryContent2.Text) = "" Then
txtInquiryContent2.BackColor = vbRed
txtInquiryContent2.SetFocus
Else
txtInquiryContent2.BackColor = vbWhite
End If
End Select
txtSQL = "select *from line_info where " & FileName(comboField(0)) & comboOpSign0.Text & "'" & txtInquiryContent0.Text & "'" _
& Sign(comboCombineRelation0.Text) & FileName(comboField(1)) & comboOpSign1.Text & "'" & txtInquiryContent1.Text & "'" _
& Sign(comboCombineRelation1.Text) & FileName(comboField(2)) & comboOpSign2.Text & "'" & txtInquiryContent2.Text & "'"
End If
End If
Set mrc_Line = ExecuteSQL(txtSQL, msgText)
While Not mrc_Line.EOF
'给myFlexgrid添加表头
With myFlexGrid
.Rows = .Rows + 1 '设置行数
.CellAlignment = 4 '设置文本格式
.ColAlignment = 4 '字体居中
.TextMatrix(.Rows - 1, 0) = Trim(mrc_Line.Fields(1)) '"卡号"
.TextMatrix(.Rows - 1, 1) = Trim(mrc_Line.Fields(3)) ' "姓名"
.TextMatrix(.Rows - 1, 2) = Trim(mrc_Line.Fields(6)) '"上机日期"
.TextMatrix(.Rows - 1, 3) = Trim(mrc_Line.Fields(7)) ' "上机时间"
.TextMatrix(.Rows - 1, 4) = Trim(mrc_Line.Fields(8)) ' "下机日期"
.TextMatrix(.Rows - 1, 5) = Trim(mrc_Line.Fields(9)) ' "下机时间"
.TextMatrix(.Rows - 1, 6) = Trim(mrc_Line.Fields(11)) ' "消费金额"
.TextMatrix(.Rows - 1, 7) = Trim(mrc_Line.Fields(12)) ' "金额"
.TextMatrix(.Rows - 1, 8) = Trim(mrc_Line.Fields(13)) '"备注"
End With
mrc_Line.MoveNext
Wend
End Sub
经历了不断的努力,最后还是完成了,其中也尝试过用函数去做,返回一个SQL语句作为返回值,因为vb中并没有"Time"的数据类型,所以传递参数的时候出现了问题,如果您有这方面的解决办法,欢迎您的帮助!
感谢您的阅读!