MS Access,根据多个标准表单输入选择记录
Posted
技术标签:
【中文标题】MS Access,根据多个标准表单输入选择记录【英文标题】:MS Access, Selecting records based on multiple criteria form inputs 【发布时间】:2020-08-28 23:20:28 【问题描述】:我有一个 Access 表单连接到基于 3 个不同框的输入的查询。如果 box1 被填充,它需要为后续的盒子保持 true,但如果为空则可以忽略。其他两个框(box2 和 box3)可以有数据也可以为空,如果为空则应忽略。
举个广泛的例子,如果我要搜索包含在具有 5 个不同图书馆的图书馆系统中的书籍,我想选择特定图书馆中 John Doe 和 Jane Deer 的所有书籍或 John 的书籍Doe 和 Jane Deer 在所有图书馆或仅 Jane Deer 的书籍等都有。
我一直在尝试遵循here 的描述,除非我将任何输入字段留空,否则它会起作用。
WHERE ((tblBooks.LibraryName LIKE [Forms]![frmSearchAuthors]!Box1 & "*") OR ([Forms]![frmSearchAuthors]!Box1 IS NULL))
AND (((tblBooks.Author Like "*" & [Forms]![frmSearchAuthors]!Box2 & "*") OR ([Forms]![frmSearchAuthors]!Box2 IS NULL))
OR ((tblBooks.Author Like "*" & [Forms]![frmSearchAurthors]!Box3 & "*") OR ([Forms]![frmSearchAuthors]!Box3 IS NULL)))
另外,我也尝试过使用 IIF 语句,但不知道如何忽略任何留空的框。
WHERE (tblBooks.LibraryName Like [Forms]![frmSearchAuthors]!Box1 & "*" OR [Forms]![frmSearchAuthors]!Box1 IS NULL)
AND (IIF (ISNULL([Forms]![frmSearchAuthors]!Box2), (tblBooks.Author IS NULL), (tblBooks.Author Like "*" & [Forms]![frmSearchAuthors]!Box2 & "*"))
OR IIF (ISNULL([Forms]![frmSearchAuthors]!Box3), (tblBooks.Author IS NULL), (tblBooks.Author Like "*" & [Forms]![frmSearchAuthors]!Box3 & "*")))
我的语法有问题还是我应该这样做?
【问题讨论】:
对于WHERE
子句中的可选条件,您需要在 VBA 中构建一个 SQL 字符串(“动态 SQL”),然后运行它。请务必使用参数而不是天真地连接字符串,以防止 SQL 注入漏洞(并防止您的应用程序在用户键入撇号时中断)
查看allenbrowne.com/ser-62.html和***.com/questions/49509615/…
混合 AND 和 OR 运算符变得复杂。请注意,您引用的示例没有显示同一字段上多个参数的 OR 运算符,这是您正在尝试使用 Author。
【参考方案1】:
仅当所有搜索框具有相同的“排名”并与 AND 组合时,链接技术才有效。
如果你从逻辑上看,整个作者块是用 OR 组合的,所以那里的每个空搜索框都会使整个块为 TRUE。
所以在您的情况下,您需要使用 VBA 构建搜索字符串,伪代码:
for i = 1 to n
if not isnull(authorsearchbox(i)) then
strSearch = StrAppend(strSearch, CSql(authorsearchbox(i)), " OR ")
end if
next i
'-------- with --------
' Append sAppend to sBase, use sSeparator if sBase wasn't empty
Public Function StrAppend(sBase As String, sAppend As Variant, sSeparator As String) As String
If Len(sAppend) > 0 Then
If sBase = "" Then
StrAppend = Nz(sAppend, "")
Else
StrAppend = sBase & sSeparator & Nz(sAppend, "")
End If
Else
StrAppend = sBase
End If
End Function
和CSql
【讨论】:
好的,谢谢。我会在我的数据库中尝试这个设置。 VBA 是这里唯一的选择吗?我明白你对我的作者块和使用 OR 的看法,但由于各种原因(只是部分缺乏熟悉),我一直试图远离 VBA。 是的,我很确定如果没有 VBA,您将无法做到这一点。如果您将其限制为 one 作者搜索框,则可以。 -- 但是恕我直言,除了最基本的 Access 应用程序之外,使用 VBA 对所有应用程序都是必不可少的,避免它会限制你很多。 @honu.atuin 我已经意识到这一点。好吧,我会尝试一下您的代码,并且可能最终会提出有关如何启动它的问题,因为我没有很多 VBA 经验。谢谢!以上是关于MS Access,根据多个标准表单输入选择记录的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 2010 - 如何根据以前的输入以编程方式显示表单字段?
根据表单字段中提供的日期查询 MS Access 中的最新记录