【发布时间】: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 = '<removed for privacy>' 的总查询,只有一个和另一个(它们都解析为相同的标准,所以它实际上只是冗余代码 & 将是主要问题解决后清理)。
我已将报告导出到 Excel 并在那里手动计算分数,报告显示的总折扣约为 0.6%。
如果有人能够关注这个,你有什么建议吗?
【问题讨论】:
-
如果您不在与其他总和相同的查询中进行分数计算,它是如何工作的?即不要两次执行这些 if 语句。
-
不确定你到底在追求什么,@Brad。我最终将
(((qryRptAtt.PayeeID)=[Forms]![frmRptAtt]![cmbAttorney]))替换为1=1只是作为一个占位符,因为它是WHERE子句中唯一的非动态部分。通过将第一个查询中的表单引用替换为表单中的实际日期,我现在大部分时间都在工作。 Access 似乎更喜欢这种方式。一旦我得到这个完全工作,我会回复一个答案,而不是评论 -
我的意思是让你有一个查询除了
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然后在第二个查询中进行计算以确保你做对了。这样你就不需要重复所有那些IF语句。 -
啊,我明白了。有道理,除了... 以前是这样写报告的,而且以前工作得很好。我已经更新了我的代码,将第一个查询
qryRptAtt中的两个引用替换为带有#分隔日期的表单上的日期字段,现在我似乎计算出了正确的百分比。不幸的是,报告现在在总分字段中显示#Error。我知道我得到了正确的百分比,因为在单步执行代码时,我让它进行所有代码更改,然后运行第二个查询并获取正确的信息。
标签: sql ms-access vba ms-access-2010