使用计算值填充报告
Posted
技术标签:
【中文标题】使用计算值填充报告【英文标题】:Populating reports with calculated values 【发布时间】:2014-04-14 10:22:51 【问题描述】:我希望这是一个简单的问题,您不必为此浪费太多时间。 我有一份报告(称为 repRAD78),其中包含一个文本框(称为 txtRAD8)。我想使用基于从名为 qryrRAD78 的查询中提取的数字的计算值填充 txtRAD8。 浏览论坛,看起来记录集将是解决方案,但这是我第一次涉足记录集,但进展并不顺利。 :( 我粘贴在下面的代码是我从多个地方提取的,它不会产生任何错误,但会将相同的值放入 txtRAD8 中的所有记录。 如果这是一个愚蠢的问题,我很抱歉,但它一直让我如厕。 非常感谢您的时间。 阿尔。
Public Sub Calc()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("qryrRAD78")
rst.MoveFirst
Do Until rst.EOF = True
Dim lngMean As Long
Dim lngRAD78max As Long
Dim lngRAD78_1 As Long
Dim lngRAD78_2 As Long
Dim lngRAD78_3 As Long
Dim lngRAD7 As Long
Dim lngRAD8 As Long
lngRAD78_1 = rst![RAD78_1]
lngRAD78_2 = rst![RAD78_2]
lngRAD78_3 = rst![RAD78_3]
lngRAD8b_c = rst![RAD8b_c]
lngMean = (lngRAD78_1 + lngRAD78_2 + lngRAD78_3) / 3
lngRAD78max = Maximum(Abs(lngRAD78_1), Abs(lngRAD78_2), Abs(lngRAD78_3))
lngRAD7 = ((lngRAD78max - lngMean) / lngMean) * 100
lngRAD8 = ((lngMean - lngRAD8b_c) / lngRAD8b_c) * 100
txtRAD8.Value = lngRAD8
rst.MoveNext
Loop
rst.Close
dbs.Close
End Sub
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
Calc
End Sub
【问题讨论】:
【参考方案1】:这是解决此问题的第二种方法。与其在代码中使用函数,不如从 Calc() 例程中获取计算并将它们放入另一个查询中。
SELECT idrRAD78,
(RAD78_1 + RAD78_2 + RAD78_3) AS Mean,
(IIf(Abs(RAD78_1) > Abs(RAD78_2),
IIf(Abs(RAD78_1) > Abs(RAD78_3), RAD78_1, RAD78_3),
IIf(Abs(RAD78_2) > Abs(RAD78_3), RAD78_2, RAD78_3))) AS RAD78Max,
(((RAD78max - Mean) / Mean) * 100) AS RAD7,
(((Mean - RAD8b_c) / RAD8b_c) * 100) AS RAD8
FROM qryrRAD78
这将为您提供一个执行与现有函数相同计算的查询。然后只需编辑报表查询以加入这个新查询(就像加入一个表一样),使用如下:
FROM ReportQuery INNER JOIN NewQuery ON ReportQuery.idrRAD78 = NewQuery.idrRAD78
更改查询名称以匹配真实姓名。在报表查询的 SELECT 部分添加来自新查询的字段:
SELECT <existing field list>, RAD7, RAD8
然后将 txtRAD8 设置为 RAD8 字段。
我只是从内存中执行此操作,因为我不在自己的计算机前,但希望这是有道理的并且足够接近正确的代码。
【讨论】:
你是英雄!那是一种享受!我不能感谢你,我已经坚持了一个星期!我仍然想知道如何使用记录集,但这将是一个未来的项目。再次感谢。【参考方案2】:这个函数的问题是报告上的每一行都会有一个名为 txtRAD8 的文本框。所以你真正要做的是用相同的值更新报告上的每个文本框(通过记录集的每个循环一次)。您实际上并没有为每一行设置值。
您需要做的是使文本框的值 = Calc(RowID)。然后,您的查询使用传入的参数来获取该记录的值,而不是循环遍历整个记录集,并仅更新报表上的那一行。
所以你的 Sub 变成了一个函数,并返回计算的值。
【讨论】:
嗨,菲利普,非常感谢您抽出宝贵时间回答我的问题。正如我所提到的,我对此很陌生,恐怕我将不得不寻求更多帮助。你能解释一下我是如何定义 RowID 的吗?它是记录集的属性吗?再次感谢。 RowID 只是我选择的一个通用名称。在您的记录集中,应该有一个唯一标识每一行的字段——通常是一个数字 ID 字段,或者是一个由其他字段组合而成的主键。希望您使用的是 ID 字段,因为这样会更容易。因此,只需将 RowID 替换为查询中的字段名称即可。 我不能道歉,但我正在为此苦苦挣扎......它只是突出了我在访问/vba 知识方面的所有差距。 :( 我不能道歉,但我正在为此苦苦挣扎......它只是突出了我在访问/vba 知识方面的所有差距。 :( 我为我的记录使用唯一的数字 ID(在本例中称为 (idrRAD78),但我不确定如何将该 ID 与脚本中的计算联系起来,以及如何将计算值 (lngRAD8) 传输到文本盒子。我猜这与函数中的定义有关。如果有一种发送虚拟啤酒代币的方法,那么你就可以赚到一对了。:) 我将在这里添加第二个答案,使用可能更容易的不同方法。这需要编写代码,而且最终可能会有点慢。以上是关于使用计算值填充报告的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用shift偏移dataframe中时间列计算相邻两列的时间差如果shift参数为-1则指定列向上移动1个位置,使用前向填充进行缺失值填充
带有填充零单元格的报告显示为#VALUE!在 Excel 中
pandas基于shift偏移dataframe中时间列计算相邻两列的时间差如果shift参数为1则指定列向下移动1个位置,使用后向填充进行缺失值填充