MS Access报告未能正确完成

时间:2014-06-02 19:12:49

标签: sql access-vba ms-access-2010

我在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%。

如果有人能够遵循这一点,你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

事实证明,报告定义中有一个奇怪的地方。

第二个查询用于生成报告中使用DAvg()汇总的数据行。在我进行更改之前,DAvg()函数处理了查询结果,但在我做出更改后似乎并不想使用查询。

我修改了第二个查询以构建一个临时表,然后在报告中修改了DAvg()调用以引用表而不是查询,这似乎使它工作。