我们有一个Access数据库,它使用表单来指定报告查询的参数。
我们希望参数是可选的,因此用户可以将其留空以指定“全部”。
现在,我们已经使用以下语法对这些标准执行了多年:
Like [Forms]![ReportForm]![Customer] & "*"
上述方法的问题在于客户代码实际上是另一个代码的前缀。例如,如果您有客户代码" AB"和" ABCD",您选择客户" AB"从下拉列表中,您可以获得" AB"和#34; ABCD"客户数据。
解决此问题的一种方法是使用以下格式:
Like iif([Forms]![ReportForm]![Customer] is null, "*" [Forms]![ReportForm]![Customer])
但那变得非常复杂。
有更好的方法吗?
编辑:我们更喜欢使用“查询”构建器(设计视图)执行此操作,因为我们的用户对SQL视图不是很好。此外,表单上目前有4个可选参数用于请求此报告。
答案 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个过滤器,它将是可读的