【问题标题】:SQL ORDER BY behaving strangely in MS Access 2010 reportSQL ORDER BY 在 MS Access 2010 报告中表现异常
【发布时间】:2015-02-06 21:06:44
【问题描述】:

我已经在 Stack Overflow 中对此进行了研究,并且知道提供的解决方案,其中建议是 MSAccess 报告覆盖查询,并且排序顺序通常在报告属性中设置,或者通过 VBA OnLoad 或类似的东西设置。然而,我注意到我的 MS Access 报告中有一些奇怪的东西,那就是在我使用以下查询创建的一份报告中,报告以完美的顺序显示所有内容:

SELECT Format([DateOfEnquiry],"yyyy") AS [Year], Count(T_Enquiry.DateOfEnquiry) AS
NumOfEnquiries, T_Enquiry.YearLevel
FROM T_Enquiry
GROUP BY Format([DateOfEnquiry],"yyyy"), T_Enquiry.YearLevel, IIf([YearLevel] Is
Null,0,Val([YearLevel]))
ORDER BY Format([DateOfEnquiry],"yyyy"), IIf([YearLevel] Is Null,0,Val([YearLevel]));

这里我特别关心 [YearLevel] 字段的排序/排序。 [YearLevel] 是一个文本查找字段,因为它不仅包含整数 1-12,而且在查找字段中还包含字母“K”和“P”。运行上述查询时,它会返回正确的顺序——即从“K”到“P”,然后从 1-12。我已将此查询用作我的报告的记录源,并且报告列出了所有项目,就像运行查询本身时数据表所做的一样。完美!

现在看一下我用作另一个报告的记录源的以下查询:

SELECT Format([DateOfEnquiry],"yyyy") AS [Year], Count(T_Enquiry.Outcome) AS
NumOfEnrolments, T_Enquiry.YearLevel
FROM T_Enquiry
WHERE (((T_Enquiry.Outcome)="Enrolled"))
GROUP BY Format([DateOfEnquiry],"yyyy"), T_Enquiry.YearLevel, IIf([YearLevel] Is
Null,0,Val([YearLevel]))
ORDER BY Format([DateOfEnquiry],"yyyy"), IIf([YearLevel] Is Null,0,Val([YearLevel]));

运行此查询时,数据表处于完美的 [YearLevel] 顺序。但是报告视图不是。报表视图首先将 [YearLevel] 10,然后是 12,然后是 2。两个 SQL 查询之间的唯一区别(除了各自的字段)是上面第二个查询中的 WHERE 语句。这应该对报告视图产生影响吗?我不明白怎么做。

有人可以建议解决方法吗?或者指出我在报告属性、VBA 代码、SQL 查询中可能缺少的内容……或者甚至可能有一个宏可以更轻松地以正确的顺序对 [YearLevel] 进行排序?我期待任何建议。

干杯。

新信息

我进行了更多测试,并确定在我的报表设计视图中,报表页脚中有一个名为 Txt_TotalEnrol 的文本框,其中包含以下计算:

=Sum([NumOfEnrolments])

这是一些其他总数的补充。似乎正是这个文本框导致了 [YearLevel] 的顺序失效。我删除了 Txt_TotalEnrol,[YearLevel] 的顺序又回到了我想要的顺序。

为什么这个操作会影响报表中[YearLevel]的顺序?任何建议都非常感谢。

【问题讨论】:

  • 尝试在 ORDER BY 之后处理 GROUP BY,让我知道你仍然有同样的效果。
  • @usermesamjosin -- 什么?嗯,没有……
  • 请记住,报告有自己的 OrderBy 字段。检查报表(在设计视图中)是否清除了 OrderBy 字段

标签: sql vba ms-access report ms-access-2010


【解决方案1】:

正如@parakmiakos 所说,首先检查报告的OrderBy 属性中是否没有其他约束可能会覆盖您的绑定查询。
如果您的报告显示在表单中,还要检查该表单是否没有将其自己的 RowSourceOrderBy 属性设置为可以解释该行为的内容。

我也不会使用Year 作为字段名称,因为它是一个保留字,它可能会导致难以调试的奇怪问题。

您也可以尝试将您的查询包装到另一个查询中(我做了一些小改动):

SELECT P.TheYear,
       P.NumOfEnquiries,
       P.YearLevel
FROM  (SELECT Format([DateOfEnquiry], "yyyy") AS TheYear,
              COUNT(T_Enquiry.DateOfEnquiry) AS NumOfEnquiries,
              T_Enquiry.YearLevel,
              Val(Nz(YearLevel)) AS YearLevelAsNumber
       FROM   T_Enquiry
       GROUP  BY Format([DateOfEnquiry], "yyyy"),
                 T_Enquiry.YearLevel,
                 IIf([YearLevel] IS NULL, 0, Val([YearLevel]))) AS P
ORDER  BY P.TheYear,
          YearLevelAsNumber

编辑:我忘记了报告有一种非常不直观的设置排序和分组规则的方式。

在设计模式下,您需要右键单击报告的空白部分并选择排序和分组

然后会出现一个面板,让您设置排序规则:

【讨论】:

  • 感谢 Renaud 和 @parakmiakos 的回复。我检查了设计视图中Data 选项卡中的OrderBy 属性,它是空白的。 OrderByOnLoad 似乎默认设置为 Yes。我已经在YesNo 之间切换了所有可用设置,并且在行为异常的报告视图上[YearLevel] 的顺序没有任何变化。
  • 感谢您的示例代码 Renaud 以及有关使用 Year 的提示。我应该知道 :) 所以,我使用了你的 SQL 查询并遇到了同样的现象。使用它作为报表 1 的记录源没有问题。但是当我在包装查询中添加 WHERE 语句并将其用作报表 2 中的记录源时,它显示了与 [YearLevel] 相同的错误顺序。
  • 我取出WHERE 语句,数据表以正确的顺序显示所有行,但报告再次没有。因此,它似乎不是 WHERE 语句在报表视图中创建此行为。令人费解的是,一份报告显示完美,而另一份报告——它使用与记录源基本相同的查询——却没有。我可以尝试任何其他建议吗?是否有可以放入OrderBy 属性的代码,或者运行一些VBA 或宏?
  • 排序和分组不对 [YearLevel] 字段进行排序。此字段是文本数据而不是数字,似乎使用排序和分组面板的唯一选项是 AZ 或 ZA,所以数字需要 0 间隔符,但我不想要 0 间隔符...您是否可能有任何其他建议特别根据我最初帖子下方发布的新信息
【解决方案2】:

问题解决了!

我创建了一个简单的查询来列出所有“已注册”[结果]:

SELECT Outcomes
FROM T_Enquiry
WHERE T_Enquiry.Outcomes="Enrolled";

然后将以下内容插入到报告中 Txt_TotalEnrol 文本框的 Data 属性中:

=DCount("Outcome","qry_TotalOutcomeEnrolled")

这具有提供总数而不是重新排序 [YearLevel] 的预期效果。

【讨论】:

    【解决方案3】:

    我在带有文本的字段上使用 ORDER BY,结果与预期不符,因此我尝试了 GROUP BY,但它最终将我的文本字段截断为 255 个字符。最终为我工作的仍然是使用 ORDER BY,但对于文本字段,使用 LEFT 语句。
    所以,而不是:

    SELECT text1, text2, text3
    FROM table1
    ORDER BY text1, text2, text3
    

    我改为:

    SELECT LEFT(text1,50000),LEFT(text2,50000),LEFT(text3,50000)
    FROM table1
    ORDER BY LEFT(text1,50000),LEFT(text2,50000),LEFT(text3,50000)
    

    这很荒谬,但它适用于这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多