Forms 具有多个可搜索字段和空值的MSAccess动态搜索表单

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

我的MSAccess应用程序中有一个表单,它跨4个字段搜索主数据库。您可以在1个字段中填写尽可能少的内容,也可以在所有4个字段中填写尽可能多的内容,或者在您希望填写的内容之间的任何地方填写

要搜索的数据库字段包括:

  • rmanbr-整数
  • custNbr-整数
  • 客户名称-文本
  • invcmnbr-文本(因为它将存储发票编号(CM-)或信用备忘录编号(CM-)
该表单有4个字段,可按上述各字段进行排序:

  • SrchRMANbr
  • SrchCustNbr
  • SrchCoName
  • SrchInvCMNbr
我有一个选择要显示的所有数据的查询。要过滤的4个字段被填充到查询生成器中特定查询的条件部分,如“*”&[forms]![RMA Search]![FieldName]&“*”

数据库中的rmanbr和customername字段永远不会为空,不允许为空。但是,invcmnbr和custnbr可以且经常为空,不带任何值

因此,我的搜索表单是上面列出的4个
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