使用计算值填充报表

时间:2014-04-14 10:22:52

标签: vba ms-access report recordset

我希望这是一个简单的问题,你不必浪费太多时间在上面。 我有一个报告(称为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

2 个答案:

答案 0 :(得分:1)

此函数的问题是报表上的每一行都将有一个名为txtRAD8的文本框。所以你真正在做的是用相同的值更新报表上的每个文本框(对于记录集的每个循环一次)。您实际上并没有为每一行设置值。

您需要做的是使textbox = Calc(RowID)的值。然后,您的查询使用传入的参数来获取该一条记录的值,而不是循环遍历整个记录集,并仅更新报告中的那一行。

所以你的Sub成为一个函数,并返回计算出的值。

答案 1 :(得分: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字段。

我只是在记忆中这样做,因为我不在我自己的电脑前,但希望这是有道理的,并且足够接近正确的代码。