Ms access 如何按文本框筛选数据表视图中的子窗体?likeoperator子句

Ms access 如何按文本框筛选数据表视图中的子窗体?likeoperator子句,ms-access,vba,Ms Access,Vba,当按下搜索按钮时,我尝试通过主窗体上的文本框根据optionframe筛选数据表视图中的子窗体。到目前为止,我尝试了两种方法: 1更改select查询子窗体基于在where子句中使用like运算符 ->where子句不起作用 2使用like运算符->不工作错误更改子窗体筛选器事件上的筛选器:类型不匹配;在下面的代码中注释掉 我感谢你的任何提示/建议 以下是单击事件时搜索按钮的代码: Private Sub btnSearch_Click() Dim strSubQry, strFilter, S

当按下搜索按钮时,我尝试通过主窗体上的文本框根据optionframe筛选数据表视图中的子窗体。到目前为止,我尝试了两种方法:

1更改select查询子窗体基于在where子句中使用like运算符 ->where子句不起作用

2使用like运算符->不工作错误更改子窗体筛选器事件上的筛选器:类型不匹配;在下面的代码中注释掉

我感谢你的任何提示/建议

以下是单击事件时搜索按钮的代码:

Private Sub btnSearch_Click()
Dim strSubQry, strFilter, SearchField As String
On Error GoTo Err_btnSearch_Click
SearchField = Me.txtSearchBox
If IsNull(Me.txtSearchBox) Or Me.txtSearchBox = "" Then
  MsgBox "Please enter keyword before searching!", vbOKOnly
  Me.txtSearchBox.SetFocus
Else
  Select Case Me.FrameSearchOptions
   Case Is = 1 'Order No Intern
    strSubQry = " SELECT tblShipment.ShipID, tblOrder.OrderNoIntern, tblOrder.CustomerName, tblOrder.CustomerPO, tblOrder.CustomerPN, tblShipment.ShipQTY, " & _
    " FROM tblOrder INNER JOIN tblShipment " & _
    " ON tblOrder.OrderID = tblShipment.OrderID_FK " & _
    " WHERE  ((tblOrder.[OrderNoIntern] Like " & SearchField & "*""));"

    ' strFilter = "[OrderNoIntern]" Like " & Chr(34) & SearchField & " * " & Chr(34)"

   Case Is = 2 'Customer Name
    strSubQry = " SELECT tblShipment.ShipID, tblOrder.OrderNoIntern, tblOrder.CustomerName, tblOrder.CustomerPO, tblOrder.CustomerPN, tblShipment.ShipQTY, " & _
    " FROM tblOrder INNER JOIN tblShipment " & _
    " ON tblOrder.OrderID = tblShipment.OrderID_FK " & _
    " WHERE  ((tblOrder.[CustomerName] Like " & SearchField & "*""));"

    ' strFilter = "[CustomerName]" Like "& Chr(34) & SearchField & " * " & Chr(34)"

   Case Is = 3 'Customer PO
    strSubQry = " SELECT tblShipment.ShipID, tblOrder.OrderNoIntern, tblOrder.CustomerName, tblOrder.CustomerPO, tblOrder.CustomerPN, tblShipment.ShipQTY, " & _
    " FROM tblOrder INNER JOIN tblShipment " & _
    " ON tblOrder.OrderID = tblShipment.OrderID_FK " & _
    " WHERE  ((tblOrder.[CustomerPO] Like " & SearchField & "*""));"

    ' strFilter = "[CustomerPO]" Like " & Chr(34) & SearchField & " * " & Chr(34)"

    Case Is = 4 'Customer P/N
     strSubQry = " SELECT tblShipment.ShipID, tblOrder.OrderNoIntern, tblOrder.CustomerName, tblOrder.CustomerPO, tblOrder.CustomerPN, tblShipment.ShipQTY, " & _
     " FROM tblOrder INNER JOIN tblShipment " & _
     " ON tblOrder.OrderID = tblShipment.OrderID_FK " & _
     " WHERE  ((tblOrder.[CustomerPN] Like " & SearchField & "*""));"

     ' strFilter = "[CustomerPN]" Like " & Chr(34) & SearchField & " * " & Chr(34)"

 End Select
End If
Me.sfrmShipmentsDS.Form.RecordSource = strSubQry
Me.sfrmShipmentsDS.Requery

'Me.sfrmShipmentsDS.Form.Filter = strFilter
'Me.sfrmShipmentsDS.Form.FilterOn = True
Exit_btnSearch_Click:
    Exit Sub
Err_btnSearch_Click:
    MsgBox Error$
    Resume Exit_btnSearch_Click
End Sub

您正在搜索字符串值,但未正确转义它们,因此此行

   " WHERE  ((tblOrder.[OrderNoIntern] Like " & SearchField & "*""));"
应该是

   " WHERE  tblOrder.[OrderNoIntern] Like '" & SearchField & "*';"
除非将多个未分组的AND或where子句分组,否则可能会丢失括号。
注释掉的行几乎正确,但构造也不完全正确。

您正在搜索字符串值,但没有正确转义它们,因此这一行

   " WHERE  ((tblOrder.[OrderNoIntern] Like " & SearchField & "*""));"
应该是

   " WHERE  tblOrder.[OrderNoIntern] Like '" & SearchField & "*';"
除非将多个未分组的AND或where子句分组,否则可能会丢失括号。
您的注释行几乎正确,但构造也不完全正确。

非常感谢!我知道我犯了一个小错误,但不明白是什么和为什么。现在我明白了!当我有多个where条件时,我需要分组where子句吗?tbh在构建where子句时,我根本不需要括号,除非它会影响where子句的应用方式。只有当您混合使用多个AND或条件时,它才会起作用。Access在创建SQL语句时总是要添加数百万个括号,这是不必要的。。。没错,我就是从那里弄来的。所以我很困惑;-再次非常感谢!我可以问另一个问题吗:您认为有可能优化这种代码的性能,还是在更改记录源时不会影响性能?我会确保您的所有搜索字段都在表级别编制索引。一般来说,受where子句限制的记录集比加载整个记录集然后应用过滤器要高效得多。您没有这样做,但如果可能,请避免在开头使用通配符的where子句,如*Sometext*。最初的通配符搜索不使用索引,搜索速度非常慢,非常快。非常感谢!我知道我犯了一个小错误,但不明白是什么和为什么。现在我明白了!当我有多个where条件时,我需要分组where子句吗?tbh在构建where子句时,我根本不需要括号,除非它会影响where子句的应用方式。只有当您混合使用多个AND或条件时,它才会起作用。Access在创建SQL语句时总是要添加数百万个括号,这是不必要的。。。没错,我就是从那里弄来的。所以我很困惑;-再次非常感谢!我可以问另一个问题吗:您认为有可能优化这种代码的性能,还是在更改记录源时不会影响性能?我会确保您的所有搜索字段都在表级别编制索引。一般来说,受where子句限制的记录集比加载整个记录集然后应用过滤器要高效得多。您没有这样做,但如果可能,请避免在开头使用通配符的where子句,如*Sometext*。最初的通配符搜索不使用索引,搜索速度非常慢。