在MS Access中有效使用计算

时间:2011-07-11 14:08:24

标签: ms-access performance ms-access-2003

这是我认为我应该已经知道的事情,但不要......

在MS Access中,如果查询包含 n 计算字段(例如calc_1,calc_2,.... calc_ n ),但我只想使用子集它们以特定的形式或报告 - 比如calc_ x ,calc_ y 和calc_ z - 将会计算所有 n 运行SELECT calc_x, calc_y, calc_z FROM myquery时的计算然后返回我想要的计算,或者它是否足够智能只计算calc_ x ,calc_ y 和calc_ ž

在我的情况下,我正在使用Access 2003,但可能所有版本的答案都是相同的。

4 个答案:

答案 0 :(得分:2)

访问是智能的,不计算不可见的字段。 尝试使用Access 2003

答案 1 :(得分:2)

就像@David一样,我起初并不相信@Andreas的回答。所以我自己测试了如下。我创建了以下函数:

Function Watch(Val, Optional CalledFrom As String = "")
    Debug.Print Val, CalledFrom
    Watch = Val
End Function

然后我创建了一个名为“Dummy”的表,其中包含一个名为“ID”的字段。我创建了一个表单并使用以下作为表单的RecordSource:

SELECT Watch([ID],"ShowInForm") AS ShowInForm, 
       Watch([ID],"HideFromForm") AS HideFromForm 
FROM Dummy;

我添加了一个文本框控件,其ControlSource为ShowInForm

然后我打开表单并在即时窗口中显示:

 1            ShowInForm
 1            ShowInForm
 1            ShowInForm

然后我回到了RecordSource并在数据表视图中预览了它并获得了这个:

 1            ShowInForm
 1            HideFromForm

我不确定为什么“ShowInForm”表达式在表单中被评估三次,但似乎很清楚未使用的字段“HideFromForm”没有得到评估。


为了解决@ HansUp的评论,我回去并保存了一个名为“Qry”的查询:

SELECT Watch([ID],"ShowInForm") AS ShowInForm, 
       Watch([ID],"HideFromForm") AS HideFromForm
FROM Dummy;

然后将RecordSource格式更改为:

Select ShowInForm FROM Qry

这产生了与我之前打开表单时相同的结果(即3行1 ShowInForm)。有趣的是,当我在数据表视图中打开RecordSource时,我得到了这个:

 1            ShowInForm
 1            ShowInForm

换句话说,它评估了ShowInForm字段两次。据推测,曾经在“Qry”中再次出现在RecordSource查询中。

最终结果仍然是@Andreas答案的确认。

答案 2 :(得分:0)

如果在报表或表单的记录源的SELECT子句中包含计算字段,它将根据已检索的每行计算它们。

如果您将它们从SELECT中删除并仅将计算包含在报表/表单中控件的ControlSource属性中,那么您说的是真的。

此外,如果您对计算进行任何排序/分组或对其进行标准,则将计算所有行。

因此,在这个记录源中:

  SELECT Field1/Field2 As Ratio1, Field3/Field4 As Ratio2, FIeld1, Field2, Field3, Field4
  FROM MyTable;

...对于检索到的每一行,无论结果是否在表单或报表中使用,都将执行两次计算。

如果要将计算延迟到最后一刻,请不要将它们包含在SQL记录源中,而只是将它们用作显示计算的控件的ControlSource。但是,这有一个缺点,你会看到在许多情况下在屏幕上绘制的计算。

编辑:

看起来这可能不正确,但我觉得这里发生的事情并没有被@ mwolfe02的答案完全解释。我将把它留在这里进一步讨论。

答案 3 :(得分:0)

我把这样的计算放在服务器端..计算列非常棒。

我认为Access终于在2007年获得了此功能,我不知道人们如何在没有它的情况下幸存下来。