1

我有一个与这个非常相似的问题,但我似乎无法解决它!

在 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] & '*');

我希望你能帮忙。我确定我遗漏了一些非常明显的东西,但出于某种原因,我的大脑此刻感觉它正在从我的耳朵里漏出来。

谢谢!


如果需要,这是相关实体的基本设计:

表格1

  • SomePrimaryKeyWeDontCareAboutRightNow
  • 文本字段1
  • 文本字段2
  • 文本字段3
  • 数字字段1
  • 日期字段1
  • 日期字段2
  • 日期字段3
  • 备忘录字段1

搜索表格

  • 过滤器文本字段1
  • 过滤器文本字段2
  • FilterTextField3
  • 过滤器编号字段1
  • 筛选日期字段1
  • 过滤日期字段2
  • 过滤日期字段3
  • 过滤备忘录字段1
4

2 回答 2

1

您可以检查空值或强制转换为字符串

于 2013-04-07T15:06:24.830 回答
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

看起来可能有很多代码,但每个块只做一件事,而且调试和维护比将所有内容都塞进一个查询要容易得多。

于 2013-04-09T01:40:44.220 回答