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