一、总述
我感觉机房中可以分为查询,组合查询,报表,结账,上下机五大块。组合查询一开始感觉挺难的,那么多条件,还有and ,or ,不知道从哪里下手。其实理清逻辑关系后就挺简单的了,组合关系再多大不了就是txtSQL里的where后的限制多一点,大体上还和以前的查询使一样一样的。从表中找到对应记录,再反应到msHflexgrid控件里。大体思路理清了,不要在细节上栽跟头,不过那好像是不可能(对我而言,我太马虎了)。下面我以学生上机统计信息为例,分享一下我的心路历程,如果有更好的建议,希望大家多多指教。
二、学生上机统计信息
1、自定义函数过程
Public Function field(a As String) As String
'定义一个函数过程,使表中的属性与组合框的选项对应,简化书写
Select Case a
Case "卡号"
field = "cardno"
Case "姓名"
field = "studentName"
Case "上机日期"
field = "ondate"
Case "下机日期"
field = "offdate"
Case "上机时间"
field = "ontime"
Case "下机时间"
field = "offtime"
Case "消费金额"
field = "consume"
Case "余额"
field = "cash"
Case "或"
field = "or "
Case "与"
field = "and "
End Select
End Function
定义这个过程是为了让组合框里的内容和表中的属性对应上。这样写的话,field(combo1.text)就可以直接找到表中对应的属性,否则没法写,combo框里list有好多选项,没法判断到底用哪表里那个属性。其次,我犯错的地方就是蓝色字的地方,得把或和与也加上,要不计算机不知道用的是什么关系。
2. 查询按钮的单击事件
Private Sub cmdQuery_Click()
Dim txtSQL As String
Dim MsgText As String
Dim mrc As ADODB.Recordset
'从表中获得数据
txtSQL = "select * from Line_Info where "
If cmbField1.Text = "" Or cmbSignal1.Text = "" Or txtContent1.Text = "" Then '判断第一行是否漏填
MsgBox "亲,请选择完整的查询条件!", vbOKOnly + vbExclamation, "警告"
Exit Sub
Else
txtSQL = txtSQL & field(cmbField1.Text) & Trim(cmbSignal1.Text) & "'" & Trim(txtContent1.Text) & "'" '把第一行的条件写到sql里
If cmbRelation1.Text <> "" Then '判断第一个组合关系是否选中
If cmdField2.Text = "" Or cmbSignal2.Text = "" Or txtContent2.Text = "" Then '如果选中看第二行是否填好,如果没有填好给出提示
MsgBox "亲,您选择了第一个组合关系,请输入第二行查询条件!", vbOKOnly, "提示"
Exit Sub
Else
txtSQL = txtSQL & field(cmbRelation1.Text) & " " & field(cmdField2.Text) & Trim(cmbSignal2.Text) & "'" & Trim(txtContent2.Text) & "'" '把第二行的条件写到sql 里
If cmbRelation2.Text <> "" Then '判断第二个组合关系是否选中
If cmdField3.Text = "" Or cmbSignal3.Text = "" Or txtContent3.Text = "" Then ' 如果选中且第三行没有填好,给出提示
MsgBox "亲,您选择了第二个组合关系,请输入第三行的查询条件!", vbOKOnly + vbExclamation, "提示"
Exit Sub
Else
txtSQL = txtSQL & field(cmbRelation2.Text) & " " & field(cmdField3.Text) & Trim(cmbSignal3.Text) & "'" & Trim(txtContent3.Text) & "'" '把第三行的条件写到sql里
End If
End If
End If
End If
End If
Set mrc = ExecuteSQL(txtSQL, MsgText) '执行sql语言 把找到的记录赋给mrc
If mrc.EOF Then '判断是否有记录,没有的话给出提示
MsgBox "亲,抱歉,没有您要找的记录!", vbInformation
myflexgrid.Clear
Exit Sub
End If
With myflexgrid ' 有记录的话,显示在myflexgrid表上
.rows = 2
.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) = "备注"
End With
With myflexgrid
Do While Not mrc.EOF
.TextMatrix(.rows - 1, 0) = mrc.Fields(1)
.TextMatrix(.rows - 1, 1) = mrc.Fields(3)
.TextMatrix(.rows - 1, 2) = mrc.Fields(6)
.TextMatrix(.rows - 1, 3) = mrc.Fields(7)
.TextMatrix(.rows - 1, 4) = mrc.Fields(8)
.TextMatrix(.rows - 1, 5) = mrc.Fields(9)
.TextMatrix(.rows - 1, 6) = mrc.Fields(11)
.TextMatrix(.rows - 1, 7) = mrc.Fields(12)
.TextMatrix(.rows - 1, 8) = mrc.Fields(13)
.rows = .rows + 1
mrc.MoveNext
Loop
.rows = .rows - 1 '去掉最后空白行
mrc.Close
End With
end sub
组合条件查询我用的是一个嵌套查询。首先要注意的是"'" & Trim(txtContent1.Text) & "'" 为什么它前后都有&符号,还这么多引号。其实是这样的Trim(txtContent1.Text)是一个字符串所以要用单引号引起来,但是单引号也相当与字符,也要用双引号引起来就等于是一个单引号连接一个字符创再连接一个单引号。 再者,逻辑字符and或是or的前后要有空格,所以where后要留有空格,field(cmbRelation1.Text)的后面也要有一个空格。第三个要注意的就是一个txtSQL语句中组合框,文本框,符号和连接关系是不是同一行,不要写串了,我就犯 了这个低级的错误,调了老半天,希望大家引以为戒,绕过这些小错误。
在下面就是把找到的内容显示到flexgrid 里面就好了,这个之前的窗体中遇到过,就不再多说了。
三、总结
通过敲组合查询,我最深刻的感受就是写代码时要弄清逻辑关系后在开始写,不要一上来就不管三七二十一的先把借鉴别人的代码一写,别人的不一定好,要自己弄明白自己要实现什么功能,代码整体分几块,然后再动手。细节也要注意,其实没有注意到细节不是粗心,而对计算机工作原理的不理解。我们作为编程人员,不仅要能宏观把控全局,也要理解每一个细节,明白计算机工作的逻辑思维是什么。