定义可选查询参数的最佳方法

时间:2016-01-17 20:55:02

标签: sql forms ms-access

我们有一个Access数据库,它使用表单来指定报告查询的参数。

我们希望参数是可选的,因此用户可以将其留空以指定“全部”。

现在,我们已经使用以下语法对这些标准执行了多年:

Like [Forms]![ReportForm]![Customer] & "*"

上述方法的问题在于客户代码实际上是另一个代码的前缀。例如,如果您有客户代码" AB"和" ABCD",您选择客户" AB"从下拉列表中,您可以获得" AB"和#34; ABCD"客户数据。

解决此问题的一种方法是使用以下格式:

Like iif([Forms]![ReportForm]![Customer] is null, "*" [Forms]![ReportForm]![Customer])

但那变得非常复杂。

有更好的方法吗?

编辑:我们更喜欢使用“查询”构建器(设计视图)执行此操作,因为我们的用户对SQL视图不是很好。此外,表单上目前有4个可选参数用于请求此报告。

2 个答案:

答案 0 :(得分:1)

正如您所知,放置表格!查询中的表达式可以很快地变得非常混乱。

更糟糕的是,现在查询现在已“结婚”并附加到该ONE表单。通常,我有一个很好的查询,我可以使用多次不同的报告,甚至通常甚至相同的查询可用于报告。然而,你立即放置表格!表达式,这意味着在打开该表单时查询只是好的。

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

因此,现在使用的解决方案只是从表单中获取值,并在代码中构建自己的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 "
    end if
    strWhere = strWhere & "City = " & cobCity & ""
end if

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

[x]仅显示特殊客户

我们添加的代码是:

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

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

此外,这意味着您可以为不同的报告重复使用相同的查询,并且不必担心某些应该打开的表单。因此,更多的代码消除了混乱的查询问题。因此,这一点编码非常值得交易,并通过简单地消除硬编码参数来解决可选问题。

更重要的是“超过”时间,您可以轻松修改并添加更多选项 - 只需在要用于“where”子句的表单上为每个附加控件添加上面的代码。

答案 1 :(得分:0)

我经常使用这样的查询:

WHERE
(tbl_Table1.Field1=[Forms]![ReportForm]![Filter1] Or [Forms]![ReportForm]![Filter1] is Null) AND
(tbl_Table1.Field2=[Forms]![ReportForm]![Filter2] Or [Forms]![ReportForm]![Filter2] is Null) AND
(tbl_Table1.Field3=[Forms]![ReportForm]![Filter3] Or [Forms]![ReportForm]![Filter3] is Null) AND
...

不幸的是,访问&#34;优化&#34;像这样非常简单的SQL构造到查询构建器中难以阅读的表示,但是如果你只有1-2个过滤器,它将是可读的