【问题标题】:MS Access Consolidating two text boxes (used for searching) into oneMS Access 将两个文本框(用于搜索)合并为一个
【发布时间】:2015-01-20 18:23:35
【问题描述】:

我有一个包含两个文本框(CardSwipe 和 EmployeeSearch)和一个列表框(EmployeeList)的表单。

EmployeeList 显示员工的名字和姓氏以及他们的 ID 号。

EmployeeSearch 是在您键入字段时进行的搜索,并允许通过任何字段搜索 EmployeeList。它调用一个函数“fLiveSearch”来实现这一点,并依赖于在字段中每次更改刷新表单。

CardSwipe 允许您刷一张带有员工 ID 编码的 ID 卡,并直接导航到 EmployeeList 中的记录。

被刷卡的员工 ID 嵌入一长串数字中。当刷卡时,它会被读取,就好像用户刚刚快速输入了所有信息一样。卡片上的所有这些线都以数字 6 开头.... 没有以这个数字开头的 ID 号(或名称)。

我想将 EmployeeSearch 和 CardSwipe 合并到一个文本框中...但我不确定如何去做。

下面是与上述函数相关的代码:

员工搜索:

Private Sub EmployeeSearch_Change()
'CODE THAT HANDLES WHAT HAPPENS WHEN THE USER TYPES IN THE SEARCH BOX

Dim strFullList As String
Dim strFilteredList As String


If blnSpace = False Then
    Me.Refresh  'refresh to make sure the text box changes are actually available to use

    'specify the default/full rowsource for the control
    strFullList = "SELECT EM_Employees_T.Emp_ID AS [Emp ID], EM_Employees_T.Emp_First AS [First], EM_Employees_T.Emp_Last AS [Last], EM_Employees_T.Email, EM_Employees_T.Full_Time AS [Full Time], EM_Employees_T.Visa_Exp, EM_Employees_T.Visa_ID, EM_Employees_T.Added, EM_Employees_T.Added_by, EM_Employees_T.Modified, EM_Employees_T.Modified_by " & vbCrLf & _
                  "FROM EM_Employees_T " & vbCrLf & _
                  "WHERE (((EM_Employees_T.Emp_ID)<>0 And (EM_Employees_T.Emp_ID)<>2 And (EM_Employees_T.Emp_ID)<>20)) " & vbCrLf & _
                  "ORDER BY EM_Employees_T.Emp_First, EM_Employees_T.Emp_Last;"

    'specify the way you want the rowsource to be filtered based on the user's entry
    strFilteredList = "SELECT EM_Employees_T.Emp_ID AS [Emp ID], EM_Employees_T.Emp_First AS [First], EM_Employees_T.Emp_Last AS [Last], EM_Employees_T.Email, EM_Employees_T.Full_Time AS [Full Time], EM_Employees_T.Visa_Exp, EM_Employees_T.Visa_ID, EM_Employees_T.Added, EM_Employees_T.Added_by, EM_Employees_T.Modified, EM_Employees_T.Modified_by " & vbCrLf & _
                      "FROM EM_Employees_T " & vbCrLf & _
                      "WHERE (((EM_Employees_T.Emp_ID)<>0 And (EM_Employees_T.Emp_ID)<>2 And (EM_Employees_T.Emp_ID)<>20) AND ((EM_Employees_T.Emp_First) Like ""*" & Me.EmployeeSearch & "*"")) OR (((EM_Employees_T.Emp_ID)<>0 And (EM_Employees_T.Emp_ID)<>2 And (EM_Employees_T.Emp_ID)<>20) AND ((EM_Employees_T.Emp_Last) Like ""*" & Me.EmployeeSearch & "*"")) " & vbCrLf & _
                      "ORDER BY EM_Employees_T.Emp_First, EM_Employees_T.Emp_Last;"

    'run the search
    fLiveSearch Me.EmployeeSearch, Me.EmployeeList, strFullList, strFilteredList    ', Me.txtCount
    End If
End Sub

刷卡:

Private Sub CardSwipe_AfterUpdate()

Me.EmployeeList.Value = Mid(Me.CardSwipe, 7, 10)
Me.CardSwipe = ""

End Sub

fLiveSearch:

Function fLiveSearch(ctlSearchBox As TextBox, ctlFilter As Control, _
                     strFullSQL As String, strFilteredSQL As String, Optional ctlCountLabel As Control)
'==================================================================================
'  THIS FUNCTION ALLOWS YOU TO FILTER A COMBO BOX OR LIST BOX AS THE USER TYPES
'  ALL YOU NEED TO DO IS PASS IN THE CONTROL REFERENCE TO THE SEARCH BOX ON YOUR
'  FORM, THE LISTBOX/COMBO BOX YOU WANT TO FILTER, AND WHAT THE FULL AND FILTERED
'  SQL (ROWSOURCE) SHOULD BE.
'
'  ctlSearchBox       THE TEXTBOX THE USER TYPES IN TO SEARCH
'
'  ctlFilter          THE LISTBOX OR COMBOBOX ON THE FORM YOU WANT TO FILTER
'
'  strFullSQL         THE FULL ROWSOURCE YOU WANT TO DISPLAY AS A DEFAULT IF NO
'                     RESULTS ARE RETURNED
'
'  strFilteredSQL     THE FILTERED ROWSOURCE FOR THE LISTBOX/COMBOBOX; FOR EXAMPLE
'                     YOU WOULD WANT TO USE '...like ""*" & me.txtsearch.value & "*"""
'                     TO FILTER THE RESULTS BASED ON THE USER'S SEARCH INPUT
'
' ctlCountLabel       (OPTIONAL) THE LABEL ON YOUR FORM WHERE YOU WANT TO DISPLAY THE
'                     COUNT OF ROWS DISPLAYED IN THE LISTBOX/COMBOBOX AS THEY SEARCH
'=====================================================================================

'ADVANCED PARAMETERS - Change these constants to change the behaviour of the search
    Const iSensitivity = 1    'Set to the number of characters the user must enter before the search starts
    Const blnEmptyOnNoMatch = True    'Set to true if you want nothing to appear if nothing matches their search


10  On Error GoTo err_handle

    'restore the cursor to where they left off
20  ctlSearchBox.SetFocus
30  ctlSearchBox.SelStart = Len(ctlSearchBox.Value) + 1

40  If ctlSearchBox.Value <> "" Then
        'Only fire if they've input more than two characters (otherwise it's wasteful)
50      If Len(ctlSearchBox.Value) > iSensitivity Then
60          ctlFilter.RowSource = strFilteredSQL
70          If ctlFilter.ListCount > 0 Then
80              ctlSearchBox.SetFocus
90              ctlSearchBox.SelStart = Len(ctlSearchBox.Value) + 1
100         Else
110             If blnEmptyOnNoMatch = True Then
120                 ctlFilter.RowSource = ""
130             Else
140                 ctlFilter.RowSource = strFullSQL
150             End If
160         End If
170     Else
180         ctlFilter.RowSource = strFullSQL
190     End If

200 Else
210     ctlFilter.RowSource = strFullSQL
220 End If

    'if there is a count label, then update it
230 If IsMissing(ctlCountLabel) = False Then
240     ctlCountLabel.Caption = "Displaying " & Format(ctlFilter.ListCount - 1, "#,##0") & " records"
250 End If

260 Exit Function
err_handle:
270 Select Case Err.Number
    Case 91    'no ctlCountLabel
        'exit
280 Case 94    'null string
        'exit
290 Case Else
300     MsgBox "An unexpected error has occurred: " & vbCrLf & Err.Description & _
               vbCrLf & "Error " & Err.Number & vbCrLf & "Line: " & Erl
310 End Select


End Function

提前感谢您的意见和帮助。

[编辑:固定格式]

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:
    1. 创建合并文本框

    2. 检测合并文本框中的值是否为员工 ID

      2.1。如果 yes 则启动 Cardswipe_AfterUpdate() 引用合并的文本框值

      2.2。如果 no 则启动 EmployeeSearch_Change() 引用合并的文本框值

    注意:像"*" &amp; Me.EmployeeSearch &amp; "*" 这样的表达式是SQL injection attacks 的敞开大门。试着关上那扇门。

    【讨论】:

    • Miroxlav,感谢您的输入,对于延迟响应(正在编写代码)感到抱歉。这正是我需要指出我正确方向的东西(我将在下面发布我更新的代码)。关于 SQL 注入攻击的话题,我不确定如何将我的 SQL 语句更改为更安全......现在改变它有点超出我的能力......你有什么建议或资源我可以使用吗?我查看了一些网页......但似乎没有一个解决通配符的这种特殊用法(我可以理解)。
    【解决方案2】:

    我更新的工作代码:

    Private Sub EmployeeSearch_AfterUpdate()
    
        Dim Textcheck As String
    
        Textcheck = Nz(Left(Me.EmployeeSearch.Text, 1), "")
    
        Select Case Textcheck
    
        Case 6
    
            If Len(Me.EmployeeSearch.Text) >= 17 Then
    
                Me.EmployeeList.Value = Mid(Me.EmployeeSearch.Text, 7, 10)
    
                Me.EmployeeSearch.Value = ""
    
                Me.EmployeeSearch.ForeColor = vbBlack
            End If
    
        End Select
    
    End Sub
    
    
    
    Private Sub EmployeeSearch_Change()
    'CODE THAT HANDLES WHAT HAPPENS WHEN THE USER TYPES IN THE SEARCH BOX
        Dim strFullList As String
        Dim strFilteredList As String
    
        If (Me.EmployeeSearch Is Me.ActiveControl) Then
    
            If Nz(Left(Me.EmployeeSearch.Text, 1), "") = 6 Then
                Me.EmployeeSearch.ForeColor = RGB(255, 255, 153)
    
                If Len(Me.EmployeeSearch.Text) >= 18 Then
    
                    SendKeys "{TAB}", False
    
                End If
    
            Else
    
    
    
              If blnSpace = False Then
                  Me.Refresh  'refresh to make sure the text box changes are actually available to use
    
                    'specify the default/full rowsource for the control
          strFullList = "SELECT EM_Employees_T.Emp_ID AS [Emp ID], EM_Employees_T.Emp_First AS [First], EM_Employees_T.Emp_Last AS [Last], EM_Employees_T.Email, EM_Employees_T.Full_Time AS [Full Time], EM_Employees_T.Visa_Exp, EM_Employees_T.Visa_ID, EM_Employees_T.Added, EM_Employees_T.Added_by, EM_Employees_T.Modified, EM_Employees_T.Modified_by " & vbCrLf & _
    "FROM EM_Employees_T " & vbCrLf & _
    "WHERE (((EM_Employees_T.Emp_ID)<>0 And (EM_Employees_T.Emp_ID)<>2 And (EM_Employees_T.Emp_ID)<>20)) " & vbCrLf & _
    "ORDER BY EM_Employees_T.Emp_First, EM_Employees_T.Emp_Last;"
    
            'specify the way you want the rowsource to be filtered based on the user's entry
          strFilteredList = "SELECT EM_Employees_T.Emp_ID AS [Emp ID], EM_Employees_T.Emp_First AS [First], EM_Employees_T.Emp_Last AS [Last], EM_Employees_T.Email, EM_Employees_T.Full_Time AS [Full Time], EM_Employees_T.Visa_Exp, EM_Employees_T.Visa_ID, EM_Employees_T.Added, EM_Employees_T.Added_by, EM_Employees_T.Modified, EM_Employees_T.Modified_by " & vbCrLf & _
    "FROM EM_Employees_T " & vbCrLf & _
    "WHERE (((EM_Employees_T.Emp_ID)<>0 And (EM_Employees_T.Emp_ID)<>2 And (EM_Employees_T.Emp_ID)<>20) AND ((EM_Employees_T.Emp_First) Like ""*" & Me.EmployeeSearch & "*"")) OR (((EM_Employees_T.Emp_ID)<>0 And (EM_Employees_T.Emp_ID)<>2 And (EM_Employees_T.Emp_ID)<>20) AND ((EM_Employees_T.Emp_Last) Like ""*" & Me.EmployeeSearch & "*"")) " & vbCrLf & _
    "ORDER BY EM_Employees_T.Emp_First, EM_Employees_T.Emp_Last;"
    
                    'run the search
                  fLiveSearch Me.EmployeeSearch, Me.EmployeeList, strFullList, strFilteredList    ', Me.txtCount
              End If
            End If
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多