这是我认为我应该已经知道的事情,但不要......
在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,但可能所有版本的答案都是相同的。
答案 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年获得了此功能,我不知道人们如何在没有它的情况下幸存下来。