机房收费系统——组合查询

机房收费系统——组合查询机房收费系统——组合查询

大家好,又见面了,我是你们的朋友全栈君。组合查询也是我们在机房收费系统中接触到的一个新东西,一开始无从下手,后来也在摸爬滚打中实现了。首先思路要清晰,明白这些功能的内在逻辑关系,代码实现起来才会更顺畅。

就拿操作员工作记录窗体来说,
机房收费系统——组合查询

 一.判断第1行查询条件是否为空,若都不为空而且组合关系4 为空,查询到的结果符合第一行查询条件。

二.若组合关系4 为“与” 或 “或”,且组合关系5 为空,则第二行查询条件都不能为空,查询到的结果符合第一行和       第二行查询条件组合后查询到的内容。
三.若组合关系4和5都不为空,三行查询条件都得填好,则查询到的是三行共同组合后的内容。

如果4为空,则2,3,5中控件的enabled属性为False,如果不为空,将激活2,5中控件的enabled属性为True。
’现在发现自己敲的时候没注意明明规范,大家可能看不太懂
'combo1:字段名
'combo2:操作符
'combo3:组合关系


Private Sub Form_Load()
    Dim i, j, k
    Me.Height = 10185
    Me.Width = 15135

    '加载窗体时依次填充comboBox的下拉列表
    For i = 0 To 2
        With Combo1(i)
            .AddItem "教师"
            .AddItem "注册时间"
            .AddItem "注册日期"
            .AddItem "注销时间"
            .AddItem "注销日期"
            .AddItem "机器名"
        End With
    Next i
    
    For j = 0 To 2
        With Combo2(j)
            .AddItem "="
            .AddItem "<"
            .AddItem ">"
            .AddItem "<>"
        End With
    Next j
    
    For k = 0 To 1
        With Combo3(k)
            .AddItem "与"
            .AddItem "或"
        End With
    Next k

  ’如果组合查询框为空(不是“与”也不是“或”),不能添加下面的查询条件
   If Combo3(0).Text = Trim("") Then
        Combo1(1).Enabled = False
        Combo1(2).Enabled = False
        Combo2(1).Enabled = False
        Combo2(2).Enabled = False
        Text2.Enabled = False
        Text3.Enabled = False
        Combo3(1).Enabled = False
    End If
    
    If Combo3(1).Text = Trim("") Then
        Combo1(2).Enabled = False
        Combo2(2).Enabled = False
        Text3.Enabled = False
    End If  
End Sub


'激活
Private Sub Combo3_Click(Index As Integer)
    If Combo3(0).Text <> Trim("") Then
        Combo1(1).Enabled = True
        Combo2(1).Enabled = True
        Combo3(1).Enabled = True
        Text2.Enabled = True
    End If
    
    If Combo3(1).Text <> Trim("") Then
        Combo1(2).Enabled = True
        Combo2(2).Enabled = True
        Text3.Enabled = True
    End If
    
End Sub


Private Sub cmdInquire_Click()
    Dim MsgText As String
    Dim txtSQL As String
    Dim mrc As ADODB.Recordset
    Dim strCon1, strCon2, strcon3, strcon4, strcon5
  
’把汉字转换成数据库中的字段名,实现第一行查询  
    Select Case Combo1(0).Text
        Case "教师"
            strCon1 = " UserID"
        Case "注册时间"
            strCon1 = " LoginTime"
        Case "注册日期"
            strCon1 = " LoginDate"
        Case "注销时间"
            strCon1 = "LogoutTime"
        Case "注销日期"
            strCon1 = "logoutDate"
        Case "机器名"
            strCon1 = " Computer"
    End Select
    
    If Not Testtxt(Combo1(0).Text) Then
        MsgBox "请选择字段名", vbOKOnly + vbExclamation, "提示"
        Combo1(0).SetFocus
        Exit Sub
    ElseIf Not Testtxt(Combo2(0).Text) Then
        MsgBox "请选择操作符", vbOKOnly + vbExclamation, "提示"
        Combo2(0).SetFocus
        Exit Sub
    ElseIf Not Testtxt(Text1.Text) Then
        MsgBox "请输入要查询的内容"
        Text1.SetFocus
        Exit Sub
    Else
        txtSQL = "select * from worklog_Info where " & strCon1 & Combo2(0).Text & "'" & Text1.Text & "'"
        Set mrc = ExecuteSQL(txtSQL, MsgText)
        
        If mrc.EOF Then
            MsgBox "该条件的数据不存在", vbOKOnly + vbExclamation, "提示"
            Exit Sub
        End If
    End If
 
'实现第二行查询   
    If Not Testtxt(Combo3(0).Text) Then
        GoTo Case1
    Else
        Select Case Combo3(0).Text
            Case "与"
                strCon2 = "and"
            Case "或"
                strCon2 = "or"
        End Select
                
        Select Case Combo1(1).Text
            Case "教师"
                strcon3 = "UserID"
            Case "注册时间"
                strcon3 = "LoginTime"
            Case "注册日期"
                strcon3 = "LoginDate"
            Case "注销时间"
                strcon3 = " LogoutTime"
            Case "注销日期"
                strcon3 = " logoutDate"
            Case "机器名"
                strcon3 = "Computer"
        End Select
        
        If Not Testtxt(Combo1(1).Text) Then
            MsgBox "请选择字段名", vbOKOnly + vbExclamation, "提示"
            Combo1(1).SetFocus
            Exit Sub
        ElseIf Not Testtxt(Combo2(1).Text) Then
            MsgBox "请选择操作符", vbOKOnly + vbExclamation, "提示"
            Combo2(1).SetFocus
            Exit Sub
        ElseIf Not Testtxt(Text2.Text) Then
            MsgBox "请输入要查询的内容", vbOKOnly + vbExclamation, "提示"
            Text2.SetFocus
            Exit Sub
        ElseIf Combo1(1).ListIndex = 1 Or 2 Or 3 Or 4 Then
            MonthView1.Visible = True
            Text2.Text = MonthView1.Value
        Else
            txtSQL = txtSQL & strCon2 & " " & strcon3 & Combo2(1).Text & "'" & Text2.Text & "'"
            Set mrc = ExecuteSQL(txtSQL, MsgText)
            
            If mrc.EOF Then
                MsgBox "该条件的数据不存在", vbOKOnly + vbExclamation, "提示"
                Exit Sub
            End If
        End If
    End If
    
’实现第三行查询
    If Trim(Combo3(1).Text) = "" Then
        GoTo Case1
    Else
        Select Case Combo3(1).Text
            Case "与"
                strcon4 = "and"
            Case "或"
                strcon4 = "or"
        End Select
        
        Select Case Combo1(2).Text
            Case "教师"
                strcon5 = "UserID"
            Case "注册时间"
                strcon5 = "LoginTime"
            Case "注册日期"
                strcon5 = "LoginDate"
            Case "注销时间"
                strcon5 = " LogoutTime"
            Case "注销日期"
                strcon5 = " logoutDate"
            Case "机器名"
                strcon5 = "Computer"
        End Select
    

        If Not Testtxt(Combo1(2).Text) Then
            MsgBox "请选择字段名", vbOKOnly + vbExclamation, "提示"
            Combo1(2).SetFocus
            Exit Sub
        End If
        
        If Not Testtxt(Combo2(2).Text) Then
            MsgBox "请选择操作符", vbOKOnly + vbExclamation, "提示"
            Combo2(2).SetFocus
            Exit Sub
        End If
        
        If Not Testtxt(Text3.Text) Then
            MsgBox "请输入要查询的内容", vbOKOnly + vbExclamation, "提示"
            Text3.SetFocus
            Exit Sub
        End If
        
        If Combo1(2).ListIndex = 1 Or 2 Or 3 Or 4 Then
            MonthView1.Visible = True
            Text3.Text = MonthView1.Value
        End If
        
        txtSQL = txtSQL & strcon4 & " " & strcon5 & Combo2(2) & "'" & Text3.Text & "'"
        Set mrc = ExecuteSQL(txtSQL, MsgText)
        
        If mrc.EOF Then
            MsgBox "该条件的数据不存在", vbOKOnly + vbExclamation, "提示"
            Exit Sub
        End If
    End If
        
    
Case1:
    With myflexgrid
        .Rows = 1
        .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) = "状态"
        
        Do While Not mrc.EOF
            .Rows = .Rows + 1
            .CellAlignment = 4
            .TextMatrix(.Rows - 1, 0) = Trim(mrc.Fields(0))
            .TextMatrix(.Rows - 1, 1) = Trim(mrc.Fields(1))
            .TextMatrix(.Rows - 1, 2) = Trim(mrc.Fields(2))
            .TextMatrix(.Rows - 1, 3) = Trim(mrc.Fields(3))
            .TextMatrix(.Rows - 1, 4) = Trim(mrc.Fields(4))
            .TextMatrix(.Rows - 1, 5) = Format(mrc.Fields(5))
            .TextMatrix(.Rows - 1, 6) = Format(mrc.Fields(6))
            .TextMatrix(.Rows - 1, 7) = Trim(mrc.Fields(7))
            .TextMatrix(.Rows - 1, 8) = Trim(mrc.Fields(8))
            mrc.MoveNext
        Loop
    End With  
End Sub

这么长的代码终于实现了组合查询的功能,但是大家可能发现在查询的过程中,有很多代码是重复的,有没有更好的方法呢?
优化1:
在代码中多次用到了把comboBox中下拉列表的汉字转换成连接数据库时可以识别的,与数据库字段一致的英文,这些代码多次重复,是不是会占用很多内存呢?我们可以自定义一个函数,解决这个问题。
Private Function FieldName(strFieldName as String) As String
        Select Case strFieldName
            Case "教师"
                FieldName = "UserID"
            Case "注册时间"
                FieldName = "LoginTime"
            Case "注册日期"
                FieldName = "LoginDate"
            Case "注销时间"
                FieldName = " LogoutTime"
            Case "注销日期"
                FieldName = " logoutDate"
            Case "机器名"
                FieldName = "Computer"
        End Select

End Sub

'以条件1和2组合为例,相应的连接数据库的代码可改为

Private Sub cmdInquire_Click()

	txtSQL="select * from worklog_Info where " & FieldName(combo1(0).Text) 
	       & combo2(0).Text & "'" & text1.Text & "'"
	Select Case combo3(0).Text
	     Case "或"
		txtSQL=txtSQL & "or" & FieldName(combo1(1).Text) 
			& combo2(1).Text & "'" & text2.Text & "'"
	     Case "与"
		txtSQL=txtSQL & "and" & FieldName(combo1(1).Text) 
			& combo2(1).Text & "'" & text2.Text & "'"
	End Select
End Sub
Private Function FieldName1(strFieldName as String)As String
	Select Case strFieldName
	      Case "与"
		  FieldName = "and"
	      Case "或"
		  FieldName = "or"
	End Select
End Sub
'或者也可以这么写
Private Sub cmdInquire_Click()
	txtSQL="select * from worklog_Info where "
	strA= FieldName(combo1(0).Text) & combo2(0).Text & "'" & text1.Text & "'"
	strB=FieldName1(combo3(0).Text) & FieldName(combo1(1).Text) & combo2(1).Text 
		& "'" & text2.Text & "'"
	strC=FieldName1(combo3(1).Text) & FieldName(combo1(2).Text) & combo2(2).Text 
		& "'" & text3.Text & "'"
	txtSQL=txtSQL & strA & strB & strC
End Sub		

优化2:
在最初的代码中,也曾多次用到了判断查询条件是否为空的语句,看师哥师姐的博客,也可以用一个相应的函数来实现
Public Function Testtxt(txt As String) As Boolean
    If Trim(txt) = "" Then
        Testtxt = False
    Else
        Testtxt = True
    End If
End Function
Private Sub cmdInquire_Click()
    isEmpty= Testtxt(combo1(0).Text) or Testtxt(combo2(0).Text) or Testtxt(text1.Text)
    
    If isEmpty=False Then
	Msgbox"请输入查询条件",48,"提示"
    End If
End Sub

用这种方法使代码精简了不少,但是与最初的相比,用户不能直接明了的看出具体是哪个查询条件没选,各有各的好处。
组合查询也还是基本的查询,就是在写与数据库连接的语句时遇到了一些问题,细心一些就好了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105791.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql 查看函数fsync_fsync()函数 Unix/Linux「建议收藏」

    mysql 查看函数fsync_fsync()函数 Unix/Linux「建议收藏」fsync,fdatasync-同步文件在内核态与存储设备内容简介#includeintfsync(intfd);intfdatasync(intfd);描述fsync()transfers(“flushes”)allmodifiedin-coredataof(i.e.,modifiedbuffercachepagesfor)thefilereferre…

    2022年5月18日
    45
  • 圆桌排列组合问题_圆桌相邻概率

    圆桌排列组合问题_圆桌相邻概率假设有来自 m 个不同单位的代表参加一次国际会议。每个单位的代表数分别为 ri(i=1,2,…,m)。会议餐厅共有 n 张餐桌,每张餐桌可容纳 ci(i=1,2,…,n) 个代表就餐。为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,给出满足要求的代表就餐方案。输入格式第 1 行有 2 个正整数 m 和 n,m 表示单位数,n 表示餐桌数。第 2 行有 m 个正整数,分别表示每个单位的代表数 ri。第 3 行有 n 个正整数,分别表示每个餐桌的容量 ci。输

    2022年8月9日
    3
  • Java异常处理简单实例

    Java异常处理简单实例Java异常处理异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常。异常发生的原因有很多,通常包含以下几大…

    2022年5月12日
    42
  • 灵格斯:很好很强大的免费电子辞典「建议收藏」

    灵格斯:很好很强大的免费电子辞典「建议收藏」http://www.readfree.net/htm/200807/4624781.html 本文向大家推介近年来出现的国产免费电子辞典软件“灵格斯”(Lingoes),分为四个部分。首先是基本介绍,然后把它和几款同类软件进行了比较,接下来分享我在实用中发现的3个技巧,最后总结了有关的网址链接。本文以主观片面为原则,效果如何,请指教。1.介绍=============

    2022年7月15日
    28
  • JAVA客户端功能的实现QQ_java实现QQ聊天(JFrame客户端+服务器)

    JAVA客户端功能的实现QQ_java实现QQ聊天(JFrame客户端+服务器)【实例简介】用java实现简易QQ聊天工具,具有JFrame客户端和服务器,可以体验登陆、多人之间聊天、服务器后台管理等功能。【实例截图】【核心代码】QQ聊天工具└──简易版QQ聊天工具├──QQClient│├──QQClient.cfg│├──QQClient.exe│├──QQClient.jar│├──id││└──id.txt│└─…

    2022年7月7日
    16
  • WinRAR去广告:只需六步,教你去除WinRAR的广告[通俗易懂]

    WinRAR去广告:只需六步,教你去除WinRAR的广告[通俗易懂]最简单的WinRAR去广告步骤1.下载ResourceHacker地址:ResourceHacker下载地址2.用软件打开WinRAR.exe3.打开StringTable4.打开80:20525.删除1277所在整行,点击运行,然后另存为6.将另存为的WinRAR替换掉原来的将新生成的exe文件仍然命名为WinRAR.exe(我把原来的winrar改名为WinRAR_backup.exe作为备份了)7.大功告成,广告去除了…

    2022年4月27日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号