我已经在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]的顺序?任何建议非常感谢。
答案 0 :(得分:1)
正如@parakmiakos所说,首先检查报告的OrderBy
属性中是否存在可能覆盖绑定查询的其他约束。
如果您的报告显示在表单中,请检查表单是否有自己的RowSource
和OrderBy
属性设置为可解释该行为的内容。
我也不会将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
编辑:我忘记了报告有一种非常直观的设置排序和分组规则的方法。
在设计模式下,您需要右键单击报告的空白部分,然后选择排序和分组:
然后会出现一个面板,让您设置排序规则:
答案 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)
这很荒谬,但它适用于此实例。