2017-06-20 75 views
0

在访问中我一直试图设置用户过滤器上显示的子表单中显示的是检查列表。我尝试过的其他方法还没有正常工作,但我已经成功使用了下面的代码,它会在用户填写其他过滤器选项时进行过滤。我能弄清楚的是如何让它接受多个过滤器,除非我详细说明了盒子的每种可能组合SQL将条件包括在哪里如果不为空

那么反正这是真的可能,还是我需要看其他选项?

WHERE [STATUS] = "OPEN" 
AND 
(ANY FORM FILTERS is not Null [Filter by all those that are not null to its matching column]) 

有效有没有简单的方法,包括一个条件,如果一个表单过滤器不为空

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]) 
        )) 
     ); 

回答

0

如果我理解正确的话,你有几个未绑定控件的形式,用户将填写。然后,您要根据用户输入的内容筛选您的子表单。 在这种情况下,您尝试使用的方法将变得非常复杂且难以维护,更不用说缓慢的大量数据。 最好的选择是在代码中构建过滤器。 我经常做的是将控件命名为与字段名称相同,并将字段类型放在控件的标签属性中。然后通过控件循环来构建过滤器。这是空码,但应该给你一个开始。 Dim strFilter as string Dim ctL as Access.control For Each ctL in Me.Controls If Not ISNull(ctL) And ctL.Tag <> "" Then strFilter = strFilter & " AND " & ctl.Name & " = " If ctL.Tag = "Text" Then strFilter = strFilter & "'" & Replace(ctl, "'","''") & "'" ElseIf ctL.Tag = "Date" Then strFilter = strFilter & "#" & ctl & "#" Else strFilter = strFilter & ctlEnd If Next If strFilter <> "" Then strFilter = mid(strFilter, 6) strFilter = " Where " & strFilter End If Me.yourSubForm.Form.Recordsource = "Select * From <yourQuery> " & strfilter

+0

好ive得到了这个工作的大部分,以及我已经了解它是如何工作的,但我仍然没有得到它过滤这种方法,我认为我的问题是“把字段类型控件的标签属性“我从来没有使用过标签,感觉很傻,但是这是否意味着将文本,日期,自动编号等字段类型添加到每个过滤器框(控件)上的DATA下的智能标签属性? – user681413

+0

另外如果我不想从查询拉我可以改变“选择*从”到“选择

不能我?原因是我希望显示的子窗体上的2个字段可以直接编辑到它的记录,似乎最简单的方法,而不需要单独写入,当我不需要在这里 – user681413

+0

使用Tag属性有两个目的:首先,当循环访问控件时,只有那些带有Tag条目的对象才被查看和使用。其次,在构建过滤器时,代码需要知道字段类型,以确定是否添加文本或日期限定符。如果您不熟悉表单的控件集合或Tag属性,我建议您一些研究,代码生成一个WHERE子句,可以和任何SELECT子句一起用于你的记录源,和其他的一样,就是一个例子。需要制定出你的具体细节。 – AVG