@H_404_4@ 最近敲机房敲到了组合查询,我发现有好几个窗体都涉及到了组合查询,我敲的是学生上机统计信息这个窗体,下面我说说我的想法。
窗体逻辑@H_404_4@ 首先,怎么确定窗体的运行过程呢?我的办法就是通过盲人摸象的方法一个一个按钮试出它的功能,当然我们知道的一些简单的 *** 作就不用说了,比如说哪里没有填肯定要提醒的。当我填完第一行的时候,点击查询很自然就显示出结果了;当我填完第一行,又选择了组合关系,点击查询提示请选择字段,说明如果选择了第一个组合关系必须也填满第二行,同理如果选择了第二个组合关系,那么三行都得填满。
这是大体的功能,当然还要仔细的试一试,接下来挨个字段试,选择姓名或者备注,那么 *** 作符只有“=”和“<>”,如果选择了上机日期、上机时间等,则每次都会d出提示框,提示让我们填入正确的格式。好了,整体功能了解的差不多了,但是可以看出它也有需要改进的地方,我们可以暂时记住,方便以后优化。
总体来说,窗体的逻辑就是:1.先判断信息是否都填写完整。如果选择了第一个关系,前两行必须要填写完整, 如果选择了第二个关系,则三行信息都必须填写完整。2.注意细节。比如当我们选择了不同的字段,情况也不一样。
@H_404_4@ 当我们明白了窗体的逻辑,就可以依靠自己的力量去解决它了。下面我说一下我的实现过程:
1.首先就要把comboBox中的汉字转换为数据库中的“字段名”。我运用的是控件数组,同时用了一个循环,这样看起来比较麻烦,因为看巨人的博客,用一个自定义函数就行了,也不必用循环,但是我觉得这样理解起来比较容易。
@H_301_29@'strFIEld(i)是我定义的一个数组变量For i = 0 To 2 Select Case cboFIEld(i).Text Case "卡号" strFIEld(i) = "cardno" Case "姓名" strFIEld(i) = "studentname" Case "上机日期" strFIEld(i) = "ondate" Case "上机时间" strFIEld(i) = "ontime" Case "下机日期" strFIEld(i) = "offdate" Case "下机时间" strFIEld(i) = "offtime" Case "消费金额" strFIEld(i) = "consume" Case "余额" strFIEld(i) = "cash" Case "备注" strFIEld(i) = "status" End Select Next
@H_404_4@ 2.当我们选择不同字段的时候,对应的 *** 作符也不同。
而且,前面已经说到,有些地方我们可以自己优化。所以我就想了想,每次选择上机日期等字段的时候,都要d出一个提示框,还会在没有选择 *** 作符的情况下,按正常人的思维,应该先选择 *** 作符,再填写要查询的内容,用户可能在这段时间忘记正确的格式,而且每次都d出一个框,确实让人有点儿烦(我是这么想的)。那么有什么办法呢?我想到了日期控件,当我们选择这些字段的时候,可以将文本框变成选择日期,岂不是大大的方便了用户呢。下面是我的代码实现:
@H_404_4@ 先说一下,也不是把文本框变成日期控件,我就是让日期控件覆盖文本框,窗体加载的时候让日期控件不可见,当点击这些字段的时候才让它可见。同样用了一个循环,根据点击的字段不同,对应的情况也就不同。
Private Sub cboFIEld_Click(Index As Integer) For i = 0 To 2 If Not Testtxt(Trim(cboOperaChar(i).Text)) Then Select Case cboFIEld(i).Text Case "姓名" @H_301_29@'必须要每次清空一下 *** 作符中的内容,否则它会一直添加,会有重复 cboOperaChar(i).Clear cboOperaChar(i).AddItem "=" cboOperaChar(i).AddItem "<>" Case "备注" cboOperaChar(i).Clear cboOperaChar(i).AddItem "=" cboOperaChar(i).AddItem "<>" Case "上机日期","下机日期" @H_301_29@'当点击上机日期、下机日期时,让日期控件显示,text文本框不能用或隐藏。 DTPicker1(i).Visible = True txtContent(i).Enabled = False cboOperaChar(i).Clear cboOperaChar(i).AddItem "=" cboOperaChar(i).AddItem "<" cboOperaChar(i).AddItem ">" cboOperaChar(i).AddItem "<>" Case "上机时间","下机时间" @H_301_29@'改变日期控件的样式,让它变成选择时间的样式 DTPicker1(i).Format = dtpTime DTPicker1(i).Visible = True txtContent(i).Enabled = False cboOperaChar(i).Clear cboOperaChar(i).AddItem "=" cboOperaChar(i).AddItem "<" cboOperaChar(i).AddItem ">" cboOperaChar(i).AddItem "<>" Case Else cboOperaChar(i).Clear cboOperaChar(i).AddItem "=" cboOperaChar(i).AddItem "<" cboOperaChar(i).AddItem ">" cboOperaChar(i).AddItem "<>" End Select End If NextEnd Sub日期控件小扩展
@H_404_4@ 刚开始的时候只知道有日期控件,但是没有深入的了解它,以为它只可以选择日期,不能用来当做时间选择控件。所以一开始一直在纠结如果用户输入的时间格式不正确,怎么判断是否合法,怎么提醒用户。后来通过上网查才知道原来日期控件还有别的样式。
@H_404_4@ 其实DTPicker日期控件有一个Format属性,一般默认是1。
@H_404_4@ Format属性:0-dtpLongDate ‘显示系统的长日期格式:2017年X月X日
1-dtpShortDate ‘显示短日期格式
2-dtpTime ‘显示时间格式:比如,HH:MM:SS
3-dtpCustom ‘可以自定义格式
当选择格式为3的时候,然后将CustomFormat 设置即可(Format不为3时,该属性不可用)
dtpicker1.Format=dtpCustomdtpicker1.CustomFormat=Format("你需要的日期或时间格式")select语句
Select Case <指示变量或表达式> Case <情形1> <语句组1> Case <情形2> <语句组2> .... Case Else <默认语句组,以上语句组都因情形不符合实际时执行> End Select
@H_404_4@ 其中,表述情形的关键字,有IS和TO。Is和To用来比较大小。多个情形要并列在一起时,使用逗号(英文)连接。
在“<指示变量或表达式>”不是True或False关键字时,逻辑运算(And、Or、Not)会没有意义。在“<指示变量或表达式>”是True或False关键字时,Is、To关键字没有意义。
Select Case true(也可以是False) Case <逻辑运算表达式1> <语句组1> Case <逻辑运算表达式2> <语句组2> .... Case Else <默认语句组,当以上任何逻辑运算都为False时执行> End Select
自己的一些小想法 @H_404_4@ 由于一开始自己一直在纠结怎么判断填写的日期是否合法,浪费了我一些时间,在网上找判断时间的函数没有找到,所以只能自己琢磨了。后来知道了日期控件,就不用这种方法了,不过我自己也思考了一下。
@H_404_4@ 1.规定文本框的最大输入长度是8位,并且只能输入数字、退格和标点符号。如果用户按下其他的键,就提醒用户用正确的日期格式填写。
@H_404_4@ 2.写一个判断是否是正确的时间格式的函数。
@H_301_29@'判断输入的内容是否是合法时间Public Function IsTime(str As String) As Boolean If ((left(str,2) > 24) Or (MID(str,4,2) > 60) Or (Right(str,2) > 60)) Then IsTime = False Else IsTime = True End IfEnd Function
@H_404_4@ 3.如果字段选择了上机时间和下机时间,就调用函数,判断一下是否是正确的时间格式。
If 格式不对 then 清空内容 获得焦点 退出过程else format(txtcontent.text,"HH:MM:SS") @H_301_29@'转格式
@H_404_4@ (PS:只是自己的一些小思考,并没有试验过,如果有不对的地方还请各位多多包涵!请帮我指出)
代码Private Sub cmdselect_Click() Dim txtsql As String Dim msgtext As String Dim mrc As ADODB.Recordset Dim strFIEld(3) As String If Not Testtxt(Trim(cboFIEld(0).Text)) Then MsgBox "请输入字段名!",vbOKOnly + vbExclamation,"警告" cboFIEld(0).SetFocus Exit Sub End If If Not Testtxt(Trim(cboOperaChar(0).Text)) Then MsgBox "请输入 *** 作符!","警告" cboOperaChar(0).SetFocus Exit Sub End If If (cboFIEld(0).Text = "上机日期" Or cboFIEld(0).Text = "下机日期" Or cboFIEld(0).Text = "上机时间" Or cboFIEld(0).Text = "下机时间") Then txtContent(0).Text = DTPicker1(0).Value Else If Not Testtxt(Trim(txtContent(0).Text)) Then MsgBox "请输入要查询的内容!","警告" txtContent(0).SetFocus Exit Sub End If End If For i = 0 To 2 Select Case cboFIEld(i).Text Case "卡号" strFIEld(i) = "cardno" Case "姓名" strFIEld(i) = "studentname" Case "上机日期" strFIEld(i) = "ondate" Case "上机时间" strFIEld(i) = "ontime" Case "下机日期" strFIEld(i) = "offdate" Case "下机时间" strFIEld(i) = "offtime" Case "消费金额" strFIEld(i) = "consume" Case "余额" strFIEld(i) = "cash" Case "备注" strFIEld(i) = "status" End Select Next Select Case cboRelation1.Text Case "与" relation1 = "and" Case "或" relation1 = "or" End Select Select Case cboRelation2.Text Case "与" relation2 = "and" Case "或" relation2 = "or" End Select txtsql = "select * from line_Info where " & strFIEld(0) & " " & cboOperaChar(0).Text & " '" & txtContent(0).Text & "'" If Not Testtxt(Trim(cboRelation1.Text)) Then GoTo result Else If Not Testtxt(Trim(cboFIEld(1).Text)) Then MsgBox "请输入字段名!","警告" cboFIEld(1).SetFocus Exit Sub End If If Not Testtxt(Trim(cboOperaChar(1).Text)) Then MsgBox "请输入 *** 作符!","警告" cboOperaChar(1).SetFocus Exit Sub End If If (cboFIEld(1).Text = "上机日期" Or cboFIEld(1).Text = "下机日期" Or cboFIEld(1).Text = "上机时间" Or cboFIEld(1).Text = "下机时间") Then txtContent(1).Text = DTPicker1(1).Value Else If Not Testtxt(Trim(txtContent(1).Text)) Then MsgBox "请输入要查询的内容!","警告" txtContent(1).SetFocus Exit Sub End If End If txtsql = txtsql & " " & relation1 & " " & strFIEld(1) & " " & cboOperaChar(1).Text & " '" & txtContent(1).Text & "'" If Not Testtxt(Trim(cboRelation2.Text)) Then GoTo result Else If Not Testtxt(Trim(cboFIEld(2).Text)) Then MsgBox "请输入字段名!","警告" cboFIEld(2).SetFocus Exit Sub End If If Not Testtxt(Trim(cboOperaChar(2).Text)) Then MsgBox "请输入 *** 作符!","警告" cboOperaChar(2).SetFocus Exit Sub End If If (cboFIEld(2).Text = "上机日期" Or cboFIEld(2).Text = "下机日期" Or cboFIEld(2).Text = "上机时间" Or cboFIEld(2).Text = "下机时间") Then txtContent(2).Text = DTPicker1(2).Value Else If Not Testtxt(Trim(txtContent(2).Text)) Then MsgBox "请输入要查询的内容!","警告" txtContent(2).SetFocus Exit Sub End If End If txtsql = txtsql & " " & relation2 & " " & strFIEld(2) & " " & cboOperaChar(2).Text & " '" & txtContent(2).Text & "'" End If End Ifresult: Set mrc = Executesql(txtsql,msgtext) If mrc.EOF = True Then MsgBox "该条件的数据不存在!","警告" Else On Error Resume Next With MSFlexGrID1 .Rows = 1 .ColWIDth(-1) = 1800 .ColAlignment(-1) = 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 .TextMatrix(.Rows - 1,0) = Trim(mrc.FIElds(1)) .TextMatrix(.Rows - 1,1) = Trim(mrc.FIElds(3)) .TextMatrix(.Rows - 1,2) = Trim(mrc.FIElds(6)) .TextMatrix(.Rows - 1,3) = Trim(mrc.FIElds(7)) .TextMatrix(.Rows - 1,4) = Trim(mrc.FIElds(8)) .TextMatrix(.Rows - 1,5) = Trim(mrc.FIElds(9)) .TextMatrix(.Rows - 1,6) = Trim(mrc.FIElds(11)) .TextMatrix(.Rows - 1,7) = Trim(mrc.FIElds(12)) .TextMatrix(.Rows - 1,8) = Trim(mrc.FIElds(13)) mrc.MoveNext Loop End With End If mrc.CloseEnd Sub总结
以上是内存溢出为你收集整理的机房收费系统—组合查询全部内容,希望文章能够帮你解决机房收费系统—组合查询所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)