我遇到的问题非常类似于 this one ,但我似乎无法解决它!
在MS Access(2003)中,我想根据多个字段中的条目搜索表格,其中一些字段可能为空。
我有:
他们准确地映射到一张桌子上。
我正在尝试创建一个查询,当数据输入到这些字段中的一个或多个时,将返回匹配的行,但某些字段可以留空。我该怎么做?
类似链接问题的查询适用于文本字段,但如何处理数字字段,日期字段(甚至可能是备注字段)?
为了给出一个明确的例子,下面的代码块适用于TextField1,但不适用于NumberField1:
PARAMETERS [Forms]![SearchForm]![FilterTextField1] Text ( 255 ), [Forms]![SearchForm]![FilterNumberField1] Text ( 255 );
SELECT Table1.[TextField1], Table1.[NumberField1], Table1.[TextField2], Table1.[TextField3], Table1.[DateField1], Table1.[DateField2], Table1.[DateField3]
FROM Table1
WHERE (Len([Forms]![SearchForm]![FilterTextField1] & '')=0 OR Table1.[TextField1] Like '*' & [Forms]![SearchForm]![FilterTextField1] & '*') AND (Len([Forms]![SearchForm]![FilterNumberField1] & '')=0 OR Table1.[NumberField1] Like '*' & [Forms]![SearchForm]![FilterNumberField1] & '*');
我希望你能提供帮助。我确定我错过了一些非常明显的东西,但由于某些原因,我的大脑感觉它现在正从耳朵里漏出来。
谢谢!
如果您需要,这是相关实体的基本设计:
答案 0 :(得分:1)
您可以检查空值或转换为字符串
答案 1 :(得分:0)
你当然可以花费大量时间为此调试一个庞大且非常难以调试的SQL查询,或者只是跳转到VBA并编写一些代码来构建你需要的SQL。
VBA只适用于这些场景,其中某些事情要么不可能,要么变得过于复杂而无法做到。
使用VBA,您可以使用收集所有数据的初始SELECT
查询,然后根据搜索表单的内容构建WHERE
子句以对其进行过滤。
例如,我有一个这样的表单,允许用户输入任何条件来过滤价格列表:
实现此功能的一些代码可能如下所示:
' Call this whenever the use click the Apply button '
Private Sub btApply_Click()
' Construct the filter '
Dim filter As String
If Not IsBlank(cbSupplierID) Then
If Not IsBlank(filter) Then filter = filter & " AND "
filter = filter & "(SupplierID=" & cbSupplierID & ")"
End If
If Not IsBlank(txtPartNumber) Then
If Not IsBlank(filter) Then filter = filter & " AND "
filter = filter & "(PartNumber LIKE '*" & txtPartNumber & "*')"
End If
If Not ckShowLocked Then
If Not IsBlank(filter) Then filter = filter & " AND "
filter = filter & "(NOT PriceLocked)"
End If
' ... code snipped, you get the jest ... '
' Now re-construct the SQL query '
Dim sql As String
sql = "SELECT * FROM Price"
If Not IsBlank(filter) Then
sql = sql & " WHERE " & filter
End If
SubForm.Form.RecordSource = sql
End Sub
它可能看起来像很多代码,但每个块只做一件事,调试和维护比将所有内容都塞进查询要容易得多。