问题:我有一个分组的MS Access 2010报告,直接链接到本地表。每个记录有40个“绑定”字段,每个组有152个计算字段。当我的vba脚本尝试自动更新最后几个计算字段的控制源时(在运行时),它会引发“查询太复杂”错误!
背景:我正在创建一个直接链接到本地表的MS Access报告,该表包含一个Person字段/列,一个Project字段/列以及每条记录的38个数字字段/列。
该报告按“人员”分组,并且每个人都有多个项目记录。
在每个人的组页脚中,我在38个数字字段/列的每个下方都有4个计算所得的控件。
回顾一下,我每条记录总共有40个“绑定” /直接链接字段,每组有152个计算字段。
该报告直接绑定到本地表,该表由maketable查询定期删除和重新创建,该maketable查询与动态SQL查询绑定,该动态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
我只能对循环中的上述任一行进行注释,一旦尝试运行其中的两个或多个,则在尝试打开报表时会引发“查询过于复杂”错误。
我试过在单独的循环中运行它们,但是会出现相同的错误。这些是最后几行代码,因此运行一行后可能会遇到某种限制。
关于修复有什么建议吗?
我已经考虑过将组的总计和计算移至子报表,但是我可以将其包括在主报告组的页脚中以仅显示该组的总计吗?子报表会影响我达到的任何限制吗?
好哇 您已经在代码中构建了很多复杂性,对于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()
一次糟糕的语句,使您的代码更易于理解和维护现在,您的问题代码看起来更像这样:
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
更简洁。而且更有可能不抛出错误。您可以采用这种想法,并从此代码中消除更多的复杂性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句