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

蒂姆·J

问题:我有一个分组的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()一次糟糕的语句,使您的代码更易于理解和维护
  • 您已为每行准确地计算了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

更简洁。而且更有可能不抛出错误。您可以采用这种想法,并从此代码中消除更多的复杂性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

在ms访问中查询是否太复杂错误?

来自分类Dev

MS Access-基于相同表但记录不同的表单和子表单

来自分类Dev

MS-Access_remove基于两个相关但唯一的字段的表中的重复项

来自分类Dev

MS Access SQL:基于另一个表中的总和从一个表中返回数据

来自分类Dev

MS Access 2016 - 基于当前记录的打开报告

来自分类Dev

基于转换表的Access 2010更新查询

来自分类Dev

不带主键的MS Access查询表

来自分类Dev

来自Access MS DB的表查询

来自分类Dev

MS Access VBA 查询多个表

来自分类Dev

DLookup:MS Access VBA 中的查询与表?

来自分类Dev

分层查询/基于表输入

来自分类Dev

基于多个表的SELECT查询

来自分类Dev

基于输入参数的查询表

来自分类Dev

MS Access,基于条件的条件总和

来自分类Dev

MS SQL Server:多个表之间的复杂的JOIN查询

来自分类Dev

MS Access中的临时表

来自分类Dev

MS ACCESS交叉表数据

来自分类Dev

MS Access表写入冲突

来自分类Dev

MS Access表写入冲突

来自分类Dev

使用查询对MS Access中的报告进行排序

来自分类Dev

在 MS Access 报告中使用查询的隐藏列/字段

来自分类Dev

使用SQL查询在MS Access中获取表结构?

来自分类Dev

将查询结果插入MS Access 2010中的表

来自分类Dev

在两个表上的MS ACCESS SQL查询

来自分类Dev

MS Access查询返回汉字-可能损坏表吗?

来自分类Dev

MS Access,更新查询不会更新链接表

来自分类Dev

MS Access SQL查询表并删除重复项

来自分类Dev

来自相同表的MS Access子查询