基于表的 MS Access 报告引发“查询太复杂”错误
Posted
技术标签:
【中文标题】基于表的 MS Access 报告引发“查询太复杂”错误【英文标题】:MS Access report based on table raises "query is too complex" error 【发布时间】:2016-06-08 12:10:58 【问题描述】:问题:我有一个直接链接到本地表的分组 MS Access 2010 报告。每条记录有 40 个“绑定”字段,每组有 152 个计算字段。当我的 vba 脚本尝试自动更新最后几个计算字段的控制源(在运行时)时,它会引发“查询太复杂”错误!
背景: 我正在创建一个直接链接到本地表的 MS Access 报告,该表包含一个人员字段/列、一个项目字段/列和每条记录的 38 个数字字段/列。
报表按Person分组,每个人有多个项目记录。
在每个人的组页脚中,我在 38 个数字字段/列的每一个下方都有 4 个计算控件。
回顾一下,我每条记录共有 40 个“绑定”/直接链接字段,每组 152 个计算字段。
该报告直接与本地表相关联,该本地表由 maketable 查询定期删除和重新创建,该查询与动态 SQL 查询相关联,该查询根据今天的日期输出不同的列。为了说明动态查询将提供的不同字段名称,我有一些 VBA 脚本执行与服务器上发生的计算相同的计算(计算今天日期 -11 个月和 +6 个月之间的所有月份以及匹配的格式预期的列名称),然后更改相关报告字段和列标签标题的控制源以匹配来自动态查询的表中预期的内容。
这一切似乎都很好,除了我最后几行代码来更新组页脚中的一些计算字段。这是脚本的 工作 部分(来自报告的 On Open 事件),似乎一切正常,只是为了说明上下文:
Dim NowDate As Date
Dim i, monthcalc As Integer
Dim Dates(1 To 18) As String
NowDate = Now()
monthcalc = -11
'The below creates variables of formatted dates to be used as control sources for the expected fields incoming from SQL
For i = 1 To 18
Dates(i) = Year(DateAdd("m", monthcalc, NowDate)) & Format(month(DateAdd("m", monthcalc, NowDate)), "00")
monthcalc = monthcalc + 1
Next i
monthcalc = -11
'The below sets the column captions to match the expected fields incoming from SQL
For i = 1 To 18
Me.Controls("Date" & Trim(Str(i))).Caption = MonthName(month(DateAdd("m", monthcalc, NowDate))) & " " & Year(DateAdd("m", monthcalc, NowDate))
monthcalc = monthcalc + 1
Next i
'The below sets the dynamic 'bound' numeric fields to match the expected fields incoming from SQL
For i = 1 To 18
Me.Controls("Date" & Trim(Str(i)) & "P").ControlSource = Dates(i) & " P"
Me.Controls("Date" & Trim(Str(i)) & "TS").ControlSource = Dates(i) & " TS"
Next i
'The below sets the first calculated column beneath each numeric field
For i = 1 To 18
Me.Controls("TotalDate" & Trim(Str(i)) & "P").ControlSource = "=Sum([" & Dates(i) & " P])"
Me.Controls("TotalDate" & Trim(Str(i)) & "TS").ControlSource = "=Sum([" & Dates(i) & " TS])"
Next i
现在有问题的代码(注意循环中的三行被注释掉了):
For i = 1 To 18
Me.Controls("TotalPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Like 'AS#*' Or [Project] Like 'ABG#*' Or [Project] Like 'ADG#*' Or [Project] Like 'AE#*' Or [Project] Like 'AI#*' Or [Project] Like 'AIN#*' Or [Project] Like 'AM#*' Or [Project] Like 'IMP#*',[" & Dates(i) & " P]), 0))"
' Me.Controls("TotalPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Like 'AS#*' Or [Project] Like 'ABG#*' Or [Project] Like 'ADG#*' Or [Project] Like 'AE#*' Or [Project] Like 'AI#*' Or [Project] Like 'AIN#*' Or [Project] Like 'AM#*' Or [Project] Like 'IMP#*',[" & Dates(i) & " TS], 0))"
' Me.Controls("TotalNPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Not Like 'AS#*' And [Project] Not Like 'ABG#*' And [Project] Not Like 'ADG#*' And [Project] Not Like 'AE#*' And [Project] Not Like 'AI#*' And [Project] Not Like 'AIN#*' And [Project] Not Like 'AM#*' And [Project] Not Like 'IMP#*',[" & Dates(i) & " P],0))"
' Me.Controls("TotalNPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([Project] Not Like 'AS#*' And [Project] Not Like 'ABG#*' And [Project] Not Like 'ADG#*' And [Project] Not Like 'AE#*' And [Project] Not Like 'AI#*' And [Project] Not Like 'AIN#*' And [Project] Not Like 'AM#*' And [Project] Not Like 'IMP#*',[" & Dates(i) & " TS],0))"
Next i
我只能在循环中取消注释上述任何一行,一旦我尝试运行其中两个或更多行,当我尝试打开报告时就会引发“查询太复杂”错误。
我尝试在单独的循环中运行它们,但出现了同样的错误。这些是最后几行代码,所以我可能在一行运行后达到了某种限制。
关于修复有什么建议吗?
我曾考虑将组总计和计算移至子报表,但我能否将其包含在主报表组页脚中以仅显示该组的总计?我遇到的任何限制都会受到子报告的影响吗?
【问题讨论】:
【参考方案1】:好的,哇。您在代码中构建了相当多的复杂性,对于 Access 的抱怨,我一点也不感到惊讶。现在,您可以花费大量时间进行修补,并最终找出引发错误的确切原因。
但你真正需要做的是简化。
获取您的问题代码。你真的需要在整个基础记录集上对复杂的IIf()
语句求和 72 次才能得到答案吗?没有。
我的解决方法:在表格中添加一个名为 ProjectType
的数字字段。作为刷新的一部分,运行如下查询:
UPDATE MyLocalTable
SET [ProjectType] = IIf([Project] Like 'AS#*' Or [Project] Like 'ABG#*'
Or [Project] Like 'ADG#*' Or [Project] Like 'AE#*' Or [Project] Like 'AI#*'
Or [Project] Like 'AIN#*' Or [Project] Like 'AM#*' Or [Project] Like 'IMP#*',1, 0)
现在,你做了两件重要的事情:
您只输入了一次糟糕的IIf()
语句,使您的代码更易于理解和维护
您只计算了每一行的 ProjectType,而不是 72 次。
现在你的问题代码看起来更像这样:
For i = 1 To 18
Me.Controls("TotalPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=1,[" & Dates(i) & " P]), 0)"
Me.Controls("TotalPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=1,[" & Dates(i) & " TS], 0)"
Me.Controls("TotalNPHrsPDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=0,[" & Dates(i) & " P],0))"
Me.Controls("TotalNPHrsTSDate" & Trim(Str(i))).ControlSource = "=Sum(IIf([ProjectType]=0,[" & Dates(i) & " TS],0))"
Next i
更简洁。而且更有可能不会抛出错误。您可以采用这个想法并从这段代码中消除更多的复杂性。
【讨论】:
简洁有效!谢谢基斯默特!有时您只需要有人指出您离得太近而无法看到的明显事物!以上是关于基于表的 MS Access 报告引发“查询太复杂”错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MS Access 基于变量发送带有附加报告的自定义电子邮件? 2003 年或 2007 年
MS ACCESS:打印基于记录集而不是 record_ID 的报告