【问题标题】:MS Access report fails to total correctlyMS Access 报告无法正确汇总
【发布时间】:2020-07-13 21:32:31
【问题描述】:

我有一份在 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 = '&lt;removed for privacy&gt;' 的总查询,只有一个和另一个(它们都解析为相同的标准,所以它实际上只是冗余代码 & 将是主要问题解决后清理)。

我已将报告导出到 Excel 并在那里手动计算分数,报告显示的总折扣约为 0.6%。

如果有人能够关注这个,你有什么建议吗?

【问题讨论】:

  • 如果您不在与其他总和相同的查询中进行分数计算,它是如何工作的?即不要两次执行这些 if 语句。
  • 不确定你到底在追求什么,@Brad。我最终将(((qryRptAtt.PayeeID)=[Forms]![frmRptAtt]![cmbAttorney])) 替换为1=1 只是作为一个占位符,因为它是WHERE 子句中唯一的非动态部分。通过将第一个查询中的表单引用替换为表单中的实际日期,我现在大部分时间都在工作。 Access 似乎更喜欢这种方式。一旦我得到这个完全工作,我会回复一个答案,而不是评论
  • 我的意思是让你有一个查询除了IIf(DC&gt;0,0,IIf(TF&gt;0,0,Sum(IIf(Answer="Yes",1,0))/(Sum(IIf(Answer="Yes",1,0))+Sum(IIf(Answer="No",1,0))))) AS Score 然后在第二个查询中进行计算以确保你做对了。这样你就不需要重复所有那些IF 语句。
  • 啊,我明白了。有道理,除了... 以前是这样写报告的,而且以前工作得很好。我已经更新了我的代码,将第一个查询qryRptAtt 中的两个引用替换为带有# 分隔日期的表单上的日期字段,现在我似乎计算出了正确的百分比。不幸的是,报告现在在总分字段中显示#Error。我知道我得到了正确的百分比,因为在单步执行代码时,我让它进行所有代码更改,然后运行第二个查询并获取正确的信息。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多