Forms 具有多个可搜索字段和空值的MSAccess动态搜索表单
我的MSAccess应用程序中有一个表单,它跨4个字段搜索主数据库。您可以在1个字段中填写尽可能少的内容,也可以在所有4个字段中填写尽可能多的内容,或者在您希望填写的内容之间的任何地方填写 要搜索的数据库字段包括:Forms 具有多个可搜索字段和空值的MSAccess动态搜索表单,forms,ms-access,listbox,ms-access-2010,Forms,Ms Access,Listbox,Ms Access 2010,我的MSAccess应用程序中有一个表单,它跨4个字段搜索主数据库。您可以在1个字段中填写尽可能少的内容,也可以在所有4个字段中填写尽可能多的内容,或者在您希望填写的内容之间的任何地方填写 要搜索的数据库字段包括: rmanbr-整数 custNbr-整数 客户名称-文本 invcmnbr-文本(因为它将存储发票编号(CM-)或信用备忘录编号(CM-) 该表单有4个字段,可按上述各字段进行排序: SrchRMANbr SrchCustNbr SrchCoName SrchInvCMNbr
- rmanbr-整数
- custNbr-整数
- 客户名称-文本
- invcmnbr-文本(因为它将存储发票编号(CM-)或信用备忘录编号(CM-)
- SrchRMANbr
- SrchCustNbr
- SrchCoName
- SrchInvCMNbr
Srch
字段,用户可以在其中输入他们想要过滤的内容。有一个列表框,设计用于根据用户将用于过滤结果的文本框的“更改”开始过滤结果。然后用户选择记录并继续他的快乐之路
但是,无论对应的Srch
框是否为空,列表框都会从两个可以为空的字段中筛选出所有空值,因此custnbr
或invcmnbr
字段中的空行不会显示在列表框中
我已尝试将Is Null
填充到用于填充列表框的查询的“或”条件中。我在查询生成器条件部分的第二行“Is Null”中尝试了该方法即使我在SrchRMANbr
字段中输入了一个数字,这也会显示所有行是否有空值。理想情况下,输入一个RMANbr将由RMANbr过滤是否存在空值,因为这是一个唯一的值(主表中只能有一个RMANbr)。如果我在后面加上“*”&[forms]![RMA Search]![FieldName]&“*”
在条件中(在同一行上)或为Null
这会让我更接近,但对SrchCustNbr
或SrchInvCMNbr
字段的任何搜索都会产生过滤结果以及该字段的所有Null值
因此,简而言之,我需要一种方法:
1) 在用户开始在任何字段中输入数据之前,在列表框中显示所有值(无论是否为NULL)
2) 当用户开始在SrchCustNbr
或SrchInvCMNbr
字段中输入数据时,过滤掉空值
3) 当用户开始在SrchRMANbr
中输入数字时,保持空值不变,但通过RMA Nbr
正确过滤(由于这是主记录,因此尽可能具体)
我希望我正确地传达了这个问题。如果您需要任何其他信息来帮助我解决我的问题,请告诉我。正如您所发现的,在查询中放置表单!表达式可能会很快变得非常混乱 更糟糕的是,现在查询已经“结婚”并附加到一个表单上。通常,我有一个很好的查询,可以多次用于不同的报表,甚至同一个查询也可以用于报表……但后来有人出现并输入一个表达式,表示只有在打开该表单时查询才是好的 更糟糕的是,很难控制像有5个组合框这样的事情,但是用户只在3个组合框中选择限制…并且希望忽略另外2个 我可能会再写10页或10页来解释为什么在查询中使用表单表达式是不好的(此外……这会使查询变得非常难看,而且很难阅读。而且,sql不再是标准的(它也不能用于基于服务器的系统) 因此,解决方案是简单地从表单中获取值,并在代码中构建您自己的where子句。这样,您只需设计报表(或表单),并将其附加到查询中,但查询中不会放置任何表单!条件 要将条件“发送”到报表(或表单),只需使用“where”子句。这正是ms access具有此功能的原因……它解决了无数问题……并将大幅降低开发成本 请看以下屏幕截图,了解我的意思: 当您点击“打印”按钮时,使上述屏幕正常工作并根据所选限制启动报告的代码很简单:
dim strWhere as string
' select sales rep combo
if isnull(cboSalesRep) = false then
strWhere = "SalesRep = " & cboSalesRep & ""
end if
' select what City for the report
if isnull(cboCity) = false then
if strWhere <> "" then
strWhere = strWhere " and "
endif
strWhere = strWhere & "City = " & cobCity & ""
end if
我们添加的代码是:
if chkSpeicalOnly = True then
if strWhere <> "" then
strWhere = strWhere " and "
endif
strWhere = strWhere & "SpecialCust = true"
end if
如果chkSpeicalOnly=True,则
如果这里是“”,那么
strWhere=strWhere“和”
恩迪夫
strWhere=strWhere&“SpecialCust=true”
如果结束
当然,我们添加到nice报告屏幕的每个组合和控件都需要一些代码,但不会比查询生成器更混乱。这样,每个查询都很好、干净,并且没有一堆高度不可维护的表单!表达式
此外,这意味着您可以对不同的报表重复使用相同的查询,并且不必担心应该打开的表单。因此,多花一点代码就可以消除混乱的查询问题。对我来说,这非常值得交易。正如您所发现的,在查询中放置表单!表达式可以很快变得非常混乱 更糟糕的是,现在查询已经“结婚”并附加到一个表单上。通常,我有一个很好的查询,可以多次用于不同的报表,甚至同一个查询也可以用于报表……但后来有人出现并输入一个表达式,表示只有在打开该表单时查询才是好的 更糟糕的是,很难控制像5连击波这样的事情
if chkSpeicalOnly = True then
if strWhere <> "" then
strWhere = strWhere " and "
endif
strWhere = strWhere & "SpecialCust = true"
end if