SQL将条件包含在Where if not null中
在access中,我一直试图在子窗体(检查列表)中显示的内容上设置用户过滤器。我尝试研究的其他方法都不起作用,但我成功地使用了下面的代码,如果用户填写任何其他筛选选项,它将进行筛选。我能弄明白的是,除非我拼出所有可能的框组合,否则如何让它接受多个过滤器 那么这到底是可能的还是我需要考虑其他的选择SQL将条件包含在Where if not null中,sql,ms-access,subform,Sql,Ms Access,Subform,在access中,我一直试图在子窗体(检查列表)中显示的内容上设置用户过滤器。我尝试研究的其他方法都不起作用,但我成功地使用了下面的代码,如果用户填写任何其他筛选选项,它将进行筛选。我能弄明白的是,除非我拼出所有可能的框组合,否则如何让它接受多个过滤器 那么这到底是可能的还是我需要考虑其他的选择 WHERE [STATUS] = "OPEN" AND (ANY FORM FILTERS is not Null [Filter by all those that are not null to
WHERE [STATUS] = "OPEN"
AND
(ANY FORM FILTERS is not Null [Filter by all those that are not null to its matching column])
如果表单筛选器不为null,是否有简单的方法来包含条件
SELECT Inspections.INS_ID
,Inspections.Category
,Inspections.Assigned_Officer
,Inspections.Raised_For
,Inspections.Account
,Inspections.Number
,Inspections.Street
,Inspections.Area
,Inspections.Postcode
,Inspections.Date_Raised
,Inspections.Reason
,Inspections.INS_Comments
FROM Inspections
WHERE (
((Inspections.STATUS) = "Open")
AND (([Forms]![Manage_Open]![Filter_ID]) IS NULL)
AND (([Forms]![Manage_Open]![Filter_account]) IS NULL)
AND (([Forms]![Manage_Open]![Filter_officer]) IS NULL)
AND (([Forms]![Manage_Open]![Filter_Number]) IS NULL)
AND (([Forms]![Manage_Open]![Filter_Postcode]) IS NULL)
AND (([Forms]![Manage_Open]![Filter_Category]) IS NULL)
AND (
(([Forms]![Manage_Open]![Filter_From]) IS NULL)
AND (([Forms]![Manage_Open]![Filter_To]) IS NULL)
)
)
OR (
([Forms]![Manage_Open]![Filter_ID]) IS NOT NULL
AND ([Forms]![Manage_Open]![Filter_ID]) = [Inspections].[INS_ID]
)
OR (
([Forms]![Manage_Open]![Filter_account]) IS NOT NULL
AND ([Forms]![Manage_Open]![Filter_account]) = [Inspections].[Account]
)
OR (
([Forms]![Manage_Open]![Filter_officer]) IS NOT NULL
AND ([Forms]![Manage_Open]![Filter_officer]) = [Inspections].[Assigned_Officer]
)
OR (
([Forms]![Manage_Open]![Filter_Number]) IS NOT NULL
AND ([Forms]![Manage_Open]![Filter_Number]) = [Inspections].[Number]
)
OR (
([Forms]![Manage_Open]![Filter_Postcode]) IS NOT NULL
AND ([Forms]![Manage_Open]![Filter_Postcode]) = [Inspections].[Postcode]
)
OR (
([Forms]![Manage_Open]![Filter_Category]) IS NOT NULL
AND ([Forms]![Manage_Open]![Filter_Category]) = [Inspections].[Category]
)
OR (
(
(([Forms]![Manage_Open]![Filter_From]) IS NOT NULL)
AND (([Forms]![Manage_Open]![Filter_To]) IS NOT NULL)
)
AND ([Inspections].[Raised_For]) BETWEEN (
([Forms]![Manage_Open]![Filter_From])
AND ([Forms]![Manage_Open]![Filter_to])
) )
);
如果我理解正确,您有一个表单,其中有几个用户将填写的未绑定控件。然后,您希望根据用户输入的内容筛选子表单。 在这种情况下,您尝试使用的方法将变得非常复杂且难以维护,更不用说使用大量数据时速度缓慢。 最好的办法是在代码中构建过滤器。 我经常做的是将控件命名为与字段名相同的名称,并将字段类型放入控件的tag属性中。然后循环通过控件来构建过滤器。这是航空代码,但应该给你一个开始。 作为字符串的Dim strFilter Dim ctL as Access.control 对于Me.Controls中的每个ctL 如果不是ISNullctL和ctL.Tag,则 strFilter=strFilter&AND&ctl.Name&= 如果ctL.Tag=Text,则 strFilter=strFilter&'&Replacectl',,&' ElseIf ctL.Tag=当时的日期 strFilter=strFilter&ctl& 其他的 strFilter=strFilter&ctlEnd如果 下一个 如果是strFilter那么 strFilter=midstrFilter,6 strFilter=其中&strFilter 如果结束
Me.yourSubForm.Form.Recordsource=Select*From&strfilter好吧,我已经了解了它的工作原理,但是我还没有用这个方法进行过滤,我想我的问题是把字段类型放在控件的tag属性中,我从来没有使用过标记,感觉很傻,但这是否意味着要添加文本、日期、,将ect自动编号为每个筛选器框控件上的数据下的智能标记属性?如果我不想从查询中提取,我可以将Select*from更改为Select from,不是吗?这样做的原因是我希望显示的子窗体上的两个字段可以直接编辑到其记录中,而且当我不需要进行单独写入时,这似乎是最简单的方法。使用Tag属性有两个目的。首先,当在控件中循环时,只查看和使用带有标记项的控件。其次,在构建过滤器时,代码需要知道字段类型,以便确定是否添加文本或日期限定符。如果您不熟悉表单的控件集合或标记属性,我建议您做一些研究。该代码生成一个WHERE子句,可与记录源的任何SELECT子句一起使用,和其他人一样,这是一个例子。你需要弄清楚你的具体细节。我觉得自己是个十足的傻瓜,我本以为我对过滤VBA有充分的了解,并正确地设置了它,只是没有应用任何过滤器,结果只是我没有正确地设置标记,而是将它放在数据智能标记中,而不是其他标记中。花了半天的时间试图让它工作,当它是最简单的事情。我仍然获得了知识。非常感谢。很乐意帮忙。如果这解决了您的问题,您应该将其标记为答案。