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

时间:2017-05-01 21:25:34

标签: forms ms-access listbox ms-access-2010

我的MSAccess应用程序中有一个表单,它在4个字段中搜索master数据库。您可以在1个字段中填充,或者在所有4个字段中填充,或者在您希望的任何位置填充。

要搜索的数据库字段是:

  • rmanbr - Integer
  • custNbr - 整数
  • customername - Text
  • invcmnbr - 文字(因为它会存储发票号码(######)或贷项通知单号码(CM - ####)

表单有4个字段,可按上述方式进行排序:

  • SrchRMANbr
  • SrchCustNbr
  • SrchCoName
  • SrchInvCMNbr

我有一个查询选择要显示的所有数据。要过滤的4个字段将使用Like "*" & [forms]![RMA Search]![FieldName] & "*"填充到查询构建器的“条件”部分,以用于该特定查询

数据库中的rmanbr和customername字段永远不会为NULL,不允许使用它们。但是,invcmnbr和custnbr可以并且经常是NULL而没有值。

因此,我的搜索表单是上面列出的4个Srch字段,用户可以在其中输入要过滤的内容。有一个列表框,旨在根据" On Change"开始过滤结果。用户将用于过滤结果的文本框。然后用户选择记录并继续他的快乐方式。

但是,ListBox是从两个可以为NULL的字段中过滤掉所有NULL值,无论相应的Srch框是否为空,因此custnbrinvcmnbr中的行为NULL Is Null字段未显示在列表框中。

我已尝试将SrchRMANbr填入"或"我用来填充列表框的查询标准。我在查询构建器标准部分的第二行中尝试了它#34; Is Null"这显示了所有行,如果它们具有NULL值,即使我在Like "*" & [forms]![RMA Search]![FieldName] & "*"字段中输入了一个数字。理想情况下,输入RMANbr将由RMANbr过滤是否存在NULL值,因为这是一个唯一值(主表中只有1个RMANbr)。如果我将Or Is Null放在标准中(在同一行上)SrchCustNbr,它会让我更接近,但是对SrchInvCMNbrSrchCustNbr字段的任何搜索都会产生过滤结果以及该字段的所有NULL值。

所以,简而言之,我需要一种方法:

1)在用户开始在任何字段中输入数据之前,在列表框中显示所有值,无论是否为NULL。

2)当用户开始在SrchInvCMNbrRMA Nbr字段中输入数据时,过滤掉NULL值。

3)保持NULL值向上但是当用户开始在SrchRMANbr中输入一个数字时正确过滤{{1}}(因为这是主记录,这是特定的,因为它可以得到)

我希望我能正确地传达这个问题。如果您需要任何其他信息来帮助我解决我的问题,请与我们联系。

2 个答案:

答案 0 :(得分:1)

使用此处发布的解决方案:MS Access: Ignoring query criteria if blank并由Andre指出

我只是在CustNbr和InvCMNbr字段中的原始Or ([forms]![RMA Search]![SrchCustNbr] Is Null)之后添加了Like "*" & [forms]![RMA Search]![FieldName] & "*",这已经奏效了。

答案 1 :(得分:0)

正如您所知,放置表格!查询中的表达式实际上可能非常麻烦。

更糟糕的是,现在查询现在已“结婚”并附加到该ONE表单。通常,我有一个很好的查询,我可以使用很多次来处理不同的报告,甚至通常甚至相同的查询也可以用于报告...但是有人出现并放入一个表达式,这意味着查询只有在表单已打开。

更糟糕的是,很难控制诸如拥有5个组合框之类的东西,但是用户只选择3个组合框中的限制...并且希望忽略其他2个。

我可能会写另外10个或几个页面,说明为什么在查询中放置表单表达式是坏的(除此之外......它使查询真的很难看,而且很难阅读。而且,sql不再是标准的了(它会不能使用基于服务器的系统。)

因此,解决方案是简单地从表单中获取值,并在代码中构建自己的where子句。这样,您只需设计报告(或表单),并将它们附加到查询,但没有形式!条件放在查询中。

要将条件“发送”到报告(或表单),只需使用“where”子句即可。这正是ms-access具有此功能的原因......它解决了许多问题......并且会大大降低您的开发成本。

看看以下屏幕截图,看看我的意思:

http://www.kallal.ca/ridesrpt/ridesrpt.html

当您点击“打印”按钮时,使上述屏幕工作并使用所选限制启动报告的代码很简单:

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

注意如何设置第二个组合测试。您可以添加所需的“更多”条件。假设我们有一个复选框,仅包含特殊客户。我们可以在我们非常好的提示屏幕上添加一个复选框

[x] Show Only Special customers

我们添加的代码是:

if chkSpeicalOnly = True then
   if strWhere <> "" then
      strWhere = strWhere " and "
   endif
   strWhere = strWhere & "SpecialCust  =  true"
end if

可以肯定的是,我们添加到nice报表界面的每个组合和控件都需要一些代码,但不会比查询构建器更麻烦。这样,每个查询都很干净,而且没有一堆高度无法维护的形式!表达式。

此外,这意味着您可以为不同的报告重复使用相同的查询,并且不必担心某些应该打开的表单。因此,更多的代码消除了混乱的查询问题。对我而言,这非常值得交易。