【问题标题】:MSAccess dynamic search form with multiple searchable fields and NULL values具有多个可搜索字段和 NULL 值的 MSAccess 动态搜索表单
【发布时间】:2017-09-29 07:40:58
【问题描述】:

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

要搜索的数据库字段是:

  • rmanbr - 整数
  • custNbr - 整数
  • 客户名称 - 文本
  • invcmnbr - 文本(因为它将存储发票编号 (######) 或贷项通知单编号 (CM-####)

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

  • SrchRMANbr
  • SrchCustNbr
  • SrchCoName
  • SrchInvCMNbr

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

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

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

但是,ListBox 会从两个可以为 NULL 的字段中过滤掉所有 NULL 值,无论对应的 Srch 框是否为空白,因此在 custnbrinvcmnbr 字段中具有 NULL 的行没有出现在列表框中。

我尝试将Is Null 填充到我用来填充列表框的查询的“或”标准中。我在 Query Builder Criteria 部分“Is Null”的第二行尝试了它,即使我在 SrchRMANbr 字段中输入了一个数字,它也会显示所有行是否具有 NULL 值。理想情况下,输入 RMANbr 将通过 RMANbr 过滤是否存在 NULL 值,因为这是一个唯一值(主表中的任何 RMANbr 只能有 1 个)。如果我将 Like "*" & [forms]![RMA Search]![FieldName] & "*" 放在条件中(在同一行)Or Is Null 之后,它会让我更接近,但任何对 SrchCustNbrSrchInvCMNbr 字段的搜索都会产生过滤结果以及所有 NULL该字段的值。

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

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

2) 当用户开始向SrchCustNbrSrchInvCMNbr 字段输入数据时,过滤掉NULL 值。

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

我希望我正确地传达了这个问题。如果您需要任何其他信息来帮助我解决问题,请告诉我。

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    正如您所发现的那样,放置表格!查询中的表达式很快就会变得非常混乱。

    更糟糕的是,现在查询已“结婚”并附加到该 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
    

    当然,我们添加到漂亮的报告屏幕的每个组合和控件都需要一些代码,但不会比查询构建器更混乱......这样,每个查询都很好而且干净,并且没有一堆代码高度不可维护的表格!表达式。

    此外,这意味着您可以对不同的报告重复使用相同的查询,而不必担心应该打开的某些表单。所以,多一点代码就可以消除混乱的查询问题。对我来说,这是非常值得交易的。

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多