MSACCESS动态搜索表格,具有多个可搜索字段和空值



我在我的MSACCESS应用程序中有一个表单,该表单在4个字段中搜索主数据库。您可以将尽可能少的时间填充到1个字段中,或者在所需的所有4个字段中或在所有4个字段中填充。

要搜索的数据库字段是:

  • rmanbr-整数
  • custnbr-整数
  • 自定义名称 - 文字
  • Invcmnbr-文本(因为它将存储发票号码(######(或信用备忘录号(cm- ####(

该表格具有四个字段,可以通过上述各个字段进行排序:

  • srchrmanbr
  • srchcustnbr
  • srchconame
  • srchinvcmnbr

我有一个查询,可以选择要显示的所有数据。要过滤的4个字段被Like "*" & [forms]![RMA Search]![FieldName] & "*"填充到查询构建器的标准部分中的特定查询

数据库中的rmanbr和自定义字段永远不会为null,不允许它们。但是,Invcmnbr和Custnbr可以并且经常为无价值而无效。

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

但是,列表框正在滤除两个字段的所有null值,无论是否相应的Srch框是空白的,因此在custnbr中使用null的行或invcmnbr字段中没有显示为null的行。ListBox。

我已经尝试将Is Null塞入我使用的查询的"或"标准中,以填充列表框。我在查询构建器标准部分" IS NULL"的第二行中尝试了它,即使我在数字中输入了SrchRMANbr字段,这也显示了所有行,即使它们具有零值。理想情况下,进入rmanbr是否存在rmanbr是否存在null值,因为这是一个唯一的值(主表中只能有1个rmanbr中的1个(。如果我在标准(在同一行(中遵循Like "*" & [forms]![RMA Search]![FieldName] & "*"Or Is Null将使我更加接近,但是在SrchCustNbrSrchInvCMNbr字段中的任何搜索都会产生过滤的结果以及该字段的所有空值。

因此,简而言之,我需要一种方法:

1(在用户开始在任何字段中输入数据之前,在列表框中显示所有值。

2(当用户开始将数据输入SrchCustNbrSrchInvCMNbr字段时,过滤零值。

3(在用户开始在 SrchRMANbr中输入数字时,请保持零值,但要正确过滤RMA Nbr(因为这是主记录,这是尽可能具体的(

我希望我能正确传达问题。让我知道您是否需要任何其他信息来帮助我解决我的问题。

使用此处发布的解决方案:MS访问:如果空白,则忽略查询条件并由Andre

指出

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

在您发现的时,请放置表格!查询中的表达可能会很快变得凌乱。

更糟糕的是,现在查询现在已"已婚"并附着在该形式上。通常,我有一个不错的查询,可以多次用于不同的报告,而且通常可以将同样的查询用于报告...但是后来有人来并放置了一个表达式,这意味着查询只有在此时才好表格已打开。

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

我可能会再写10个或页面,说明为什么在查询中放置表格表达不好(此外……这使查询变得非常丑陋,而且很难阅读。而且,SQL不再是标准也不适用于基于服务器的系统(。

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

要"将"条件"发送"到报告(或表格(,您只需使用" 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报告屏幕上都需要一些代码,但是不再是查询构建器的杂物。高度无法修建的形式!表达式。

此外,这意味着您可以重复使用相同的查询以进行不同的报告,并且不必担心某种应该打开的形式。因此,更多的代码消除了凌乱的查询问题。对我来说,这是非常值得的。

最新更新