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

对于组合查询,我一直都很触头,因为那么多个框框要同时联合起来,那么多表要同时联合起来,共同查找一个结果,所以我先找到最难解决的那个问题,然后对症下药。

难点:

1、把字段名和操作符中的内容转化成可被识别的字符
2、操作符中的符号根据字段名的选择进行不同的显示
3、判断查询条件,进行组合查询
4、选中一行并赋值给修改窗体的文本框
5、判断文本框是否为空的简写
6、一键清空的简写

1-

在模块中对字段名text框中的内容进行转化,转化成数据库可以识别的字符

Public Function FieldName(strFieldName As String) As String
    Select Case strFieldName
        Case "卡号"
            FieldName = "cardno"
        Case "学号"
            FieldName = "studentno"
        Case "姓名"
            FieldName = "studentname"
        Case "性别"
            FieldName = "sex"
        Case "系别"
            FieldName = "department"
        Case "年级"
            FieldName = "grade"
        Case "班级"
            FieldName = "class"
    End Select
    
End Function
Public Function RelaName(strRelaName As String) As String

    Select Case strRelaName
        Case "与"
            RelaName = "and"
        Case "或"
            RelaName = "or"
    End Select
    
End Function

2-

1,首先,把全部的操作符都添加上去
【在这里,不需要一个一个去添加,用for循环语句,进行添加,前提:要在添加控件的时候,复制第一个控件,形成控件数组】

Private Sub Form_Load()
    Dim i
    For i = 0 To 2
        With cmbField(i)
        .AddItem "卡号"
        .AddItem "学号"
        .AddItem "姓名"
        .AddItem "性别"
        .AddItem "系别"
        .AddItem "年级"
        .AddItem "班级"
        End With
    Next
    
    For i = 0 To 2
        With cmbOp(i)
        .AddItem "="
        .AddItem "<>"
        .AddItem "<"
        .AddItem ">"
        End With
    Next
    
    For i = 0 To 1
        With cmbRela(i)
        .AddItem "与"
        .AddItem "或"
        End With
    Next
End Sub

2,然后在根据需要,对特定的符号进行删除
【首先把有特殊需求的字段名“姓名”“学号”“性别”“卡号”的操作符都清空,然后在统一给他们添加符合他们要求的符号、】

Private Sub cmbField_Click(Index As Integer)
    Dim i As Integer
    i = Index
    If cmbField(i).Text = "学号" Or cmbField(i).Text = "姓名" Or cmbField(i).Text = "性别" Or cmbField(i).Text = "卡号" Then
    cmbOp(i).Clear
    cmbOp(i).AddItem "<>"
    cmbOp(i).AddItem "="
    Else
    cmbOp(i).Clear
    cmbOp(i).AddItem "<"
    cmbOp(i).AddItem ">"
    cmbOp(i).AddItem "="
    cmbOp(i).AddItem "<>"
    End If
End Sub

3-

这一步就需要理清这个查询的逻辑,然后才能清晰的写出来查询代码。
我没有画流程图,但是逻辑我是明白的,关键就在于组合关系的判断上

首先要知道,组合关系有三个组合,分别是“一”“二”组合,“一”“三”组合,还有“一”“二”“三组合”,一二组合由第一个组合关系的按键控制,一三组合由第二个组合关系的按键控制,一二三组合是由两个组合关系共同控制。
因此,在我们正常的判断每一行的查询内容是否为空的基础上,还需要判断组合关系
如果选择了第一个组合关系,就需要把一二行的判断条件补充完整,
如果选择了第二个组合关系,就需要把一三行的判断条件补充完整,
如果选择了第一和第二两个组合关系,就需要把三行的判断条件都补全了。

下面是代码部分展示

Private Sub cmdInquiry_Click()
    Dim StudentSQL As String
    Dim SMsgText As String
    Dim Smrc As ADODB.Recordset
    
    If Not Testtxt(cmbField(0).Text) Or Not Testtxt(cmbOp(0).Text) Or Not Testtxt(txtInquiry(0).Text) Then
        MsgBox "请选择第一行判断条件", 0 + 48, "提示"
        cmbField(0).SetFocus
    Exit Sub
    End If
    StudentSQL = "select * from student_info where " & FieldName(cmbField(0).Text) & Trim(cmbOp(0).Text) & "'" & Trim(txtInquiry(0).Text) & "'"
            
    If Testtxt(cmbRela(0).Text) Then
    
        If Not Testtxt(cmbField(1).Text) Or Not Testtxt(cmbOp(1).Text) Or Not Testtxt(txtInquiry(1).Text) Then
            MsgBox "请选择第二行判断条件", 0 + 48, "提示"
            cmbField(1).SetFocus
        Exit Sub
        End If
    StudentSQL = StudentSQL & RelaName(cmbRela(0).Text) & " " & FieldName(cmbField(1).Text) & Trim(cmbOp(1).Text) & "'" & Trim(txtInquiry(1).Text) & "'"
    End If
    
    '省很多麻烦,直接调用上一个SQL,然后在后面附加条件就OK了

    If Testtxt(cmbRela(1).Text) Then
        
        If Not Testtxt(cmbField(2).Text) Or Not Testtxt(cmbOp(2).Text) Or Not Testtxt(txtInquiry(2).Text) Then
            MsgBox "请选择第三行判断条件", 0 + 48, "提示"
            cmbField(2).SetFocus
        Exit Sub
        End If
        
    StudentSQL = StudentSQL & RelaName(cmbRela(1).Text) & " " & FieldName(cmbField(2).Text) & Trim(cmbOp(2).Text) & "'" & Trim(txtInquiry(2).Text) & "'"
    End If

4-

首先设置MSFlexGrid属性
在这里插入图片描述
在窗体加载事件中添加代码

    MSFlexGrid1.SelectionMode = flexSelectionByRow
    '单击时选择整行
    MSFlexGrid1.FocusRect = flexFocusHeavy
    '画一个焦点框
    MSFlexGrid1.HighLight = flexHighlightWithFocus
    '该值决定了所选单元是否突出显示

5-

在修改窗体中,需要判断多个文本框是否为空,可以建立一个控件数组,然后再用循环进行判断

'利用控件数组判断多个文本框是否为空
Dim ctrl As Control
For Each ctrl In Me.Controls
    If TypeOf ctrl Is TextBox Then
        If ctrl.Text = "" Then
            MsgBox "请输入完整信息!", 0 + 48, "提示"
            
        End If
    End If
Next

6-

一键清空,和上面的一样,利用控件组+循环语句
【举一反三:控件数组+循环可以简化很多繁琐的步骤,可以把模板记下来,运用在以后的代码编写中】

Private Sub cmdClear_Click()
    Dim ctrl As Control
    For Each ctrl In Me.Controls
        If TypeOf ctrl Is ComboBox Then
            ctrl.Text = ""
        End If
    Next
    
    Dim i
    For i = 0 To 2
    txtInquiry(i).Text = ""
    Next
    
    MSFlexGrid1.Clear
End Sub

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值