【问题标题】:Using Search Parameters in Access 2010在 Access 2010 中使用搜索参数
【发布时间】:2011-12-20 16:00:24
【问题描述】:

我正在使用 Access 2010。

我正在构建一个数据库,让我的组织可以对城市中的空白墙进行分类——包括它们的位置、它们面向的方向、相邻地块是空置还是被占用等。这些信息存储在一个名为 WallsMaster 的表中.

这是我的查询。

SELECT WallsMaster.StreetAddress, WallsMaster.Zip, WallsMaster.Direction, WallsMaster.LotInfo

FROM WallsMaster

WHERE 

(
((WallsMaster.Zip) Like "*" & [Forms]![Search_Form]![Zip_Search] 
Or 
(WallsMaster.Zip)="" 
Or 
(WallsMaster.Zip) Is Null)

AND 

((WallsMaster.Direction) Like "*" & [Forms]![Search_Form]![Direction_Search] 
Or 
(WallsMaster.Direction)="" 
Or 
(WallsMaster.Direction) Is Null)

AND 

((WallsMaster.LotInfo) Like "*" & [Forms]![Search_Form]![LotInfo_Search] 
Or 
(WallsMaster.LotInfo)="" 
Or 
(WallsMaster.LotInfo) Is Null)
)
;

当我为 Zip 输入一个值但将其他参数留空时,我想要的是 all 方向和 LotInfo 值(包括空值/空白)仅适用于该 zip(不包括空值/空白 Zip 值)。当我输入 Direction 但将其他留空时,我希望该 Direction 的所有 Zip 和 LotInfo 值(包括 null/空白)(不包括 null/blank Direction 值),等等 LotInfo。

执行此操作时得到的结果包括 参数我留空,但也包括空值/空白 我已经指定了搜索参数的字段。

即,如果我搜索 Zip 19130 并将 Direction & LotInfo 留空,我会得到:

Address,Zip,Direction,LotInfo
123 Main St, 19130, South, Vacant
456 Elm St, , North, Vacant
789 Fake St, 19130, , ,
321 K St, 19130, East, Occupied

我想要的是这个:

Address, Zip, Direction, LotInfo
123 Main St, 19130, South, Vacant  
789 Fake St, 19130, , 
321 K St,19130, East, Occupied
  1. 如何重新编写我的 SQL 脚本以获得我想要的结果?
  2. 为了这个例子,我只分享几个字段。我真正的 WallMaster 表有大约 30 个字段和数百条记录,我希望我的搜索表单一次搜索任何/所有这些字段。这是编写此搜索的最有效方式吗?

【问题讨论】:

    标签: sql ms-access search parameters


    【解决方案1】:

    你正在测试错误的东西等于 "" 或 Null。您想为此测试输入

    SELECT WallsMaster.StreetAddress, WallsMaster.Zip, WallsMaster.Direction, WallsMaster.LotInfo
    FROM WallsMaster
    
    WHERE 
    
    (
    
    (WallsMaster.Zip) Like "*" & [Forms]![Search_Form]![Zip_Search] 
    
    Or 
    
    ([Forms]![Search_Form]![Zip_Search] ="" 
    
    Or 
    
    [Forms]![Search_Form]![Zip_Search] Is Null))
    
    AND 
    
    ((WallsMaster.Direction) Like "*" & [Forms]![Search_Form]![Direction_Search]
    
    Or 
    
    ([Forms]![Search_Form]![Direction_Search]="" 
    
    Or 
    
    [Forms]![Search_Form]![Direction_Search] Is Null)
    
    AND 
    
    ((WallsMaster.LotInfo) Like "*" & [Forms]![Search_Form]![LotInfo_Search]
    
    Or 
    
    ([Forms]![Search_Form]![LotInfo_Search]="" 
    
    Or 
    
    [Forms]![Search_Form]![LotInfo_Search] Is Null)
    
    )
    

    【讨论】:

    • 谢谢 - 这行得通(主要是......我刚刚提交了一个编辑,因为你的一堆括号/括号混淆了)。现在我有了大致的想法,我也在寻找一种更有效的方法来处理数十个字段……在我的 SQL 语句中编写 30 个子句确实没有意义。谢谢!
    • 你最好动态构建 SQL 字符串然后在 VBA 代码中
    【解决方案2】:

    关于您的第二个问题,我个人不会费心编写查询来过滤您设想的每个可能的值组合。

    Here 是 Allen Browne 的一个很好的例子,展示了如何实现搜索表单。我过去曾使用过它,它运行良好,但那是在 Access 2003 是唯一可用选项的时代。

    如果您需要向表中添加更多字段或业务规则略有变化,此解决方案很快就会变得笨拙。

    相反,只需将您的数据加载到数据表中,然后利用 Microsoft access 2010 为您提供的开箱即用的自动筛选功能。您将能够以任何您希望的组合过滤所有列,如果您将新字段添加到表中,这甚至可以工作(前提是表单数据源设置正确)

    【讨论】:

    • 谢谢 - 我会看看艾伦布朗的方法。
    • 我也在尝试设置一个使用查询来生成结果的搜索表单,因为我会根据这些查询结果生成报告......所以它不仅仅是一个屏幕上的数据表我想看看。
    • 难道你不能只用与表单相同的字段集来设计报表,然后将相同的 Recordsource 和 Filter 属性传递给报表吗?
    • 谢谢...这确实可行。我想我让这变得比它需要的更复杂。
    【解决方案3】:

    这条路呢?

    WHERE WallsMaster.Zip Like "*" & NZ([Forms]![Search_Form]![Zip_Search],"")  
    AND (WallsMaster.Direction) Like "*" & NZ([Forms]![Search_Form]![Direction_Search],"")
    AND (WallsMaster.LotInfo) Like "*" & Nz([Forms]![Search_Form]![LotInfo_Search],"")
    

    【讨论】:

    • 这似乎没有返回空值/空白
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多