Ms access 访问表单复选框和/或语句

Ms access 访问表单复选框和/或语句,ms-access,Ms Access,最近,我开始创建一个表单,使用复选框过滤数据库 我有以下数据: Category Type Country Fruit Apple NL Fruit Apple SU Fruit Banana NL Fruit Banana DE Nuts Cashew NL Nuts Cashew US Nuts Almond UK Nuts Almond GR 现在,我在表

最近,我开始创建一个表单,使用复选框过滤数据库

我有以下数据:

Category  Type   Country  
Fruit     Apple  NL   
Fruit     Apple  SU   
Fruit     Banana NL   
Fruit     Banana DE   
Nuts      Cashew NL   
Nuts      Cashew US   
Nuts      Almond UK   
Nuts      Almond GR   
现在,我在表格中为水果和坚果、苹果、香蕉、腰果和杏仁以及NL、SU、DE、US、UK和GR建立复选框

目前,我在SQL脚本中只使用OR语句,这很好。但是,如果用户想知道例如哪个水果来自NL,并且它同时标记了水果和NL,那么我的输出将是来自水果和NL的所有内容(因为OR语句)

如何根据选中的复选框更改使用过滤器的脚本?在我的示例中:如果用户同时检查水果和NL,那么它将给出输出-->水果苹果NL和水果香蕉NL

或者另一个例子:他想要香蕉和腰果,并作为输出-->水果香蕉NL和水果香蕉DE和坚果腰果NL和坚果腰果US


我希望我的问题是清楚的;如果没有,请不要犹豫要求澄清

据我所知,您有一个包含2个类别复选框、4个类型复选框和6个国家/地区复选框的表单

这听起来不像是任何一个过滤器本身,所以有可能尝试返回坚果,苹果和英国,这将返回一个空表

我认为您必须广泛使用
类似的
命令,以便将任何
NULL/FALSE
值转换为
*

作为复选框返回
TRUE/FALSE
而不是
Apple/FALSE
,可以使用
IIF
语句将
TRUE
更改为
Apple
(您可能可以改为使用
CHOOSE
SWITCH

所以这里的
WHERE
子句说
chkFruit
不是水果就是任何东西

编辑:
阅读下面的评论,听起来您希望它按勾选框进行过滤,或者如果没有勾选框,则显示所有框(好像类别/类型或国家/地区中的所有框都被勾选)。
如果你有很多勾选框,这可能会变得相当复杂

因此,复选框的每一部分都需要分解为与下面类似的内容

WHERE   ((
        Category = IIF([Forms]![Form1]![chkFruit],'Fruit',NULL) OR
        Category = IIF([Forms]![Form1]![chkNuts],'Nuts',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkFruit] AND 
                 NOT [Forms]![Form1]![chkNuts],Category LIKE '*',NULL))  
完整的SQL将是:

SELECT  Category, Type, Country
FROM    Table2
WHERE   ((
        Category = IIF([Forms]![Form1]![chkFruit],'Fruit',NULL) OR
        Category = IIF([Forms]![Form1]![chkNuts],'Nuts',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkFruit] AND 
                 NOT [Forms]![Form1]![chkNuts],Category LIKE '*',NULL))
        AND
        ((
        Type = IIF([Forms]![Form1]![chkApple],'Apple',NULL) OR
        Type = IIF([Forms]![Form1]![chkBanana],'Banana',NULL) OR
        Type = IIF([Forms]![Form1]![chkCashew],'Cashew',NULL) OR
        Type = IIF([Forms]![Form1]![chkAlmond],'Almond',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkApple] AND 
                 NOT [Forms]![Form1]![chkBanana] AND
                 NOT [Forms]![Form1]![chkCashew] AND
                 NOT [Forms]![Form1]![chkAlmond],Type LIKE '*',NULL))
        AND
        ((
        Country = IIF([Forms]![Form1]![chkNL],'NL',NULL) OR
        Country = IIF([Forms]![Form1]![chkSU],'SU',NULL) OR
        Country = IIF([Forms]![Form1]![chkDE],'DE',NULL) OR
        Country = IIF([Forms]![Form1]![chkUS],'US',NULL) OR
        Country = IIF([Forms]![Form1]![chkUK],'UK',NULL) OR
        Country = IIF([Forms]![Form1]![chkGR],'GR',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkNL] AND
                 NOT [Forms]![Form1]![chkSU] AND
                 NOT [Forms]![Form1]![chkDE] AND
                 NOT [Forms]![Form1]![chkUS] AND
                 NOT [Forms]![Form1]![chkUK] AND
                 NOT [Forms]![Form1]![chkGR], Country LIKE '*',NULL))  

我有一种感觉,这可能会缩短很多,但现在它开始伤害我的头。

正如您所写的,“如果用户同时检查水果和NL,那么它将给出输出-->水果苹果NL和水果香蕉NL”,这是正确的。你期望的结果是什么?如果您从cehckbox中选择fruiit和NL,并且输出正确。如果用户选择“水果”和“NL”正确,您只希望苹果和香蕉作为输出??您是使用引用控件的动态参数化查询,还是使用VBA构建筛选条件?混合和或运算符可能很棘手。如果您想从同一个字段中获得多个参数,这是额外的复杂性。回顾Hi Tarun。在这个时刻,预期的结果不是我得到的。我希望得到水果苹果NL和水果香蕉NL。但我得到的是所有包含水果的记录和所有包含NL的记录。因此,我只希望将同时包含水果和NL的行作为输出。目前,我使用SQL视图从“YourTableName”构建脚本select*,其中Category='Checkbox\u Value1'和Country='Checkbox\u Value2'。你试过这样的东西吗?添加一些您迄今为止尝试过的数据。谢谢Darren,这已经有点好了,但我们还没有做到。我将尝试用另一种方式解释我的问题。当您对列进行筛选时,它就像excel工作表。如果第一列是分类,我想看看水果和坚果,我可以点击它们,所有的记录都会显示出来。然后,我可以在NL上进行过滤,所有带有NL的水果和坚果的记录将保留下来。现在有了你的脚本,我无法同时选择水果和坚果进行过滤,因为那时已经没有记录了。我想过滤中应该有这样的层次结构?嗨,达伦,谢谢你的另一个回复。遗憾的是,它没有成功。在这个脚本中,如果我只选择了水果,它不会显示任何内容。我的案例比我的例子要复杂得多:)也许我的处理方式不正确?我还看到了一个带有复选框的下拉菜单,但我不知道这是否也可以用作过滤器。基本上,我想在Access中的一个表单上构建Excel的列过滤器。
SELECT  Category, Type, Country
FROM    Table2
WHERE   ((
        Category = IIF([Forms]![Form1]![chkFruit],'Fruit',NULL) OR
        Category = IIF([Forms]![Form1]![chkNuts],'Nuts',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkFruit] AND 
                 NOT [Forms]![Form1]![chkNuts],Category LIKE '*',NULL))
        AND
        ((
        Type = IIF([Forms]![Form1]![chkApple],'Apple',NULL) OR
        Type = IIF([Forms]![Form1]![chkBanana],'Banana',NULL) OR
        Type = IIF([Forms]![Form1]![chkCashew],'Cashew',NULL) OR
        Type = IIF([Forms]![Form1]![chkAlmond],'Almond',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkApple] AND 
                 NOT [Forms]![Form1]![chkBanana] AND
                 NOT [Forms]![Form1]![chkCashew] AND
                 NOT [Forms]![Form1]![chkAlmond],Type LIKE '*',NULL))
        AND
        ((
        Country = IIF([Forms]![Form1]![chkNL],'NL',NULL) OR
        Country = IIF([Forms]![Form1]![chkSU],'SU',NULL) OR
        Country = IIF([Forms]![Form1]![chkDE],'DE',NULL) OR
        Country = IIF([Forms]![Form1]![chkUS],'US',NULL) OR
        Country = IIF([Forms]![Form1]![chkUK],'UK',NULL) OR
        Country = IIF([Forms]![Form1]![chkGR],'GR',NULL)
        ) OR IIF(NOT [Forms]![Form1]![chkNL] AND
                 NOT [Forms]![Form1]![chkSU] AND
                 NOT [Forms]![Form1]![chkDE] AND
                 NOT [Forms]![Form1]![chkUS] AND
                 NOT [Forms]![Form1]![chkUK] AND
                 NOT [Forms]![Form1]![chkGR], Country LIKE '*',NULL))