我在MS Access 2010中有一段报告,该报告已经运行了一段时间。我必须对报告进行更新,以便允许运行时选择一个或多个原因'这将包括在报告中。
我的初始过程在运行时动态地将它们构建到报表过滤器中,但我的总计出错了。然后,我动态地更改了报告所基于的QueryDef.SQL(在下面的代码中添加了最后两个AND
语句),但它们仍然出错了。然后我发现(我是否提到我不是最初编写报告的人),总字段完全基于另一个查询。
在每个人质疑理智之前的快速背景:我们正在计算审计分数。每个审核都会检查几个问题,其中大多数问题都会收到是/否(通过/失败)答案。有些问题可能会导致“完全失败”问题。这导致整个审核的得分为零,而不仅仅是针对特定问题。个人审计分数是百分比右,如果有“总失败”,则为零。报告的总分是各个审计分数的平均值。
因此,在此背景下,我希望有足够的信息来理解查询。
这是报告所基于的查询(qryRptAtt
):
SELECT vwAttorneys.CurrentAttorneyName AS PayeeID, tblAuditAtt.AttAudit_ID,
vwAttorneys.CurrentAttorneyName AS Attorney_Name, tblAuditAtt.Loan,
tblAuditAtt_A.A_ID, tblAuditAtt_Q.Question, tblAuditAtt_A.Answer,
tblAuditAtt_A.Comment, tblAuditAtt.EndDate, tblAuditAtt.Status,
tblAuditAttLoans.State, tblAuditAtt.Reason
FROM tblAuditAttLoans RIGHT JOIN ((vwAttorneys INNER JOIN tblAuditAtt ON
vwAttorneys.PayeeID = tblAuditAtt.PayeeID) INNER JOIN (tblAuditAtt_Q
INNER JOIN tblAuditAtt_A ON tblAuditAtt_Q.A_ID = tblAuditAtt_A.A_ID) ON
tblAuditAtt.AttAudit_ID = tblAuditAtt_A.AttAudit_ID) ON
tblAuditAttLoans.LoanNumber = tblAuditAtt.Loan
WHERE (((tblAuditAtt_A.Answer)<>"NA")
And ((tblAuditAtt.EndDate) Between Forms!frmRptAtt!txtFrom And Forms!frmRptAtt!txtTo)
And ((tblAuditAtt.Status)="Submitted"))
AND tblAuditAtt.Reason in ('reason1', 'Reason 2', 'Reason 3', 'Reason 4', 'Reason 5')
AND tblAuditAtt.PayeeID = '<removed for privacy>'
ORDER BY vwAttorneys.Attorney_Name, tblAuditAttLoans.State, tblAuditAtt.Loan, tblAuditAtt_A.A_ID
(所有可怕的括号都来自Access从视觉设计师那里构建查询。是的,有两列被选中 - 如果可能的话我会清理它。)
此查询正确地向我提供了报告所需的所有详细信息。在报告本身中,报告页脚部分的总分数字段Control Source
设置为=IIf([txtA_TF]=0,DAvg("[Score]","[qryRptAttAggregateAudits]"),0)
。这是给我错误答案的那个。 qryRptAttAggregateAudits
如下:
SELECT qryRptAtt.PayeeID, qryRptAtt.AttAudit_ID, qryRptAtt.Loan,
Sum(IIf(Answer="Yes",1,0)) AS Yes,
Sum(IIf(Answer="No",1,0)) AS [No],
Sum(IIf(Answer="DC",1,0)) AS DC,
Sum(IIf(Answer="TF",1,0)) AS TF,
IIf(DC>0,0,IIf(TF>0,0,Sum(IIf(Answer="Yes",1,0))/(Sum(IIf(Answer="Yes",1,0))+Sum(IIf(Answer="No",1,0))))) AS Score
FROM qryRptAtt
WHERE (((qryRptAtt.PayeeID)=[Forms]![frmRptAtt]![cmbAttorney]))
AND qryRptAtt.Reason in ('Reason1', 'Reason2', 'Reason3', 'Reason4', 'Reason5')
AND qryRptAtt.PayeeID = '<removed for privacy>'
GROUP BY qryRptAtt.PayeeID, qryRptAtt.AttAudit_ID, qryRptAtt.Loan
报告总查询从报告详细信息查询qryRptAtt
中进行选择。在这两个查询中,Forms!frmRptAtt
都已打开,并且已在适当的字段中填充了有效数据。
我已经在WHERE子句中使用(((qryRptAtt.PayeeID)=[Forms]![frmRptAtt]![cmbAttorney]))
和AND qryRptAtt.PayeeID = '<removed for privacy>'
尝试了总查询,只有一个而且只有另一个(他们都解析为相同的条件,因此它&# 39; s确实只是冗余的代码,并且一旦我解决了主要问题就会被清理掉。)
我已将报告导出到Excel并手动计算了那里的分数,并且该报告显示的总分约为0.6%。
如果有人能够遵循这一点,你有什么建议吗?
答案 0 :(得分:0)
事实证明,报告定义中有一个奇怪的地方。
第二个查询用于生成报告中使用DAvg()汇总的数据行。在我进行更改之前,DAvg()函数处理了查询结果,但在我做出更改后似乎并不想使用查询。
我修改了第二个查询以构建一个临时表,然后在报告中修改了DAvg()调用以引用表而不是查询,这似乎使它工作。