Ms access 基于表的MS Access报告引发“查询太复杂”错误

Ms access 基于表的MS Access报告引发“查询太复杂”错误,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,问题:我有一个直接链接到本地表的分组MS Access 2010报告。每个记录有40个“绑定”字段,每个组有152个计算字段。当我的vba脚本试图在运行时自动更新最后几个计算字段的控制源时,它会抛出一个查询,这是一个太复杂的错误 背景: 我正在创建一个直接链接到本地表的MS Access报告,该表包含一个人字段/列、一个项目字段/列以及每条记录的38个数字字段/列 报告按人员分组,每个人都有多个项目记录 在每个人的组页脚中,我在38个数字字段/列的每一个下面都有4个计算控件 总而言之,每个记录总

问题:我有一个直接链接到本地表的分组MS Access 2010报告。每个记录有40个“绑定”字段,每个组有152个计算字段。当我的vba脚本试图在运行时自动更新最后几个计算字段的控制源时,它会抛出一个查询,这是一个太复杂的错误

背景: 我正在创建一个直接链接到本地表的MS Access报告,该表包含一个人字段/列、一个项目字段/列以及每条记录的38个数字字段/列

报告按人员分组,每个人都有多个项目记录

在每个人的组页脚中,我在38个数字字段/列的每一个下面都有4个计算控件

总而言之,每个记录总共有40个“绑定”字段/直接链接字段,每个组有152个计算字段

报表直接绑定到本地表,该本地表由maketable查询定期删除并重新创建,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
我只能在循环中取消注释上面的任何一行,只要我尝试运行其中两行或更多行,它就会在我尝试打开报告时抛出一个查询太复杂的错误

我曾尝试在单独的循环中运行它们,但出现了相同的错误。这是最后几行代码,所以我可能在运行一行代码后达到了某种限制

关于修复有什么建议吗


我曾考虑将组总计和计算移动到子报表,但是否可以将其包含在主报表组页脚中,以便仅显示该组的总计?我达到的极限会受到子报表的影响吗

好的,哇。您已经在代码中构建了相当多的复杂性,对于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

要简洁得多。而且更可能不会抛出错误。你可以接受这个想法,并从代码中消除更多的复杂性。

好的,哇。您已经在代码中构建了相当多的复杂性,对于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

要简洁得多。而且更可能不会抛出错误。您可以采纳这个想法,并从代码中消除更多的复杂性。

简洁有效!谢谢你,基斯默特!有时候,你只需要有人指出一些明显的东西,而这些东西你已经太近而看不见了!简洁有效!谢谢你,基斯默特!有时候,你只需要有人指出一些明显的东西,而这些东西你已经太近而看不见了!