SQL ORDER BY在MS Access 2010报告中表现奇怪

时间:2014-12-09 03:41:27

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

我已经在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]的顺序?任何建议非常感谢。

3 个答案:

答案 0 :(得分: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

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

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

Report Context Menu

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

SOrting and Grouping Panel

答案 1 :(得分:0)

问题解决了!

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

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

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

=DCount("Outcome","qry_TotalOutcomeEnrolled")

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

答案 2 :(得分:0)

我在带有文本的字段上使用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)

这很荒谬,但它适用于此实例。