GROUP BY 月报告上的 MS Access 过滤器日期范围

Posted

技术标签:

【中文标题】GROUP BY 月报告上的 MS Access 过滤器日期范围【英文标题】:MS Access filter date range on GROUP BY month report 【发布时间】:2017-11-28 16:22:46 【问题描述】:

我被一些可能很简单的事情难住了。我按月对结果进行分组,我想按日期范围对其进行过滤。我有一个如下所示的 GROUP BY 查询。

PARAMETERS ShipDateStart DateTime, ShipDateEnd DateTime;
SELECT Month([ORDERS].[ShipDate]) & '/01/' & Right(Year([orders].[ShipDate]),2) AS ShipDateName, Sum(IIf([ORDERS].[ShipDate]-IIf(IsNull([ORDERS].[PromisedDate]),[ORDERS].[EstimatedDate],[ORDERS].[PromisedDate])<=0,1,0)) AS OnTimeYes, Sum(IIf([ORDERS].[ShipDate]-IIf(IsNull([ORDERS].[PromisedDate]),[ORDERS].[EstimatedDate],[ORDERS].[PromisedDate])>0,1,0)) AS OnTimeNo, Year([orders].[ShipDate]) AS ShipDateYear
FROM OrderLineStatus INNER JOIN (DEST INNER JOIN ORDERS ON DEST.DestID = ORDERS.DestID) ON OrderLineStatus.OrderLineStatusID = ORDERS.OrderLineStatusID
WHERE (((DEST.Destination)<>"Purchased" And (DEST.Destination)<>"STOCKED") AND ((OrderLineStatus.OrderLineStatus)="Shipped") AND ((ORDERS.PromisedDate) Is Not Null) AND ((ORDERS.ShipDate) Between [ShipDateStart] And [ShipDateEnd]))
GROUP BY Month([ORDERS].[ShipDate]) & '/01/' & Right(Year([orders].[ShipDate]),2), Year([orders].[ShipDate]), Month([ORDERS].[ShipDate])
ORDER BY Year([orders].[ShipDate]), Month([ORDERS].[ShipDate]);

此查询工作正常。我输入两个参数,它返回我想要的。问题是,当我打开一个将此查询作为记录源的报表时,它会要求提供参数,而我无法找到一种在没有 Access 要求的情况下将参数传递给查询的方法。以下不起作用,它仍然要求参数。

sWhere = "[ShipDateStart] = #" & Format(CDate(Me.StartDateBox), "mm/dd/yyyy") & _
       " 00:00# AND [ShipDateEnd] = #" & Format(CDate(Me.EndDateBox), "mm/dd/yyyy") & _
       " 23:59#"
stDocName = "ShippingOnTimePSD"
DoCmd.OpenReport stDocName, acPreview, , sWhere, acWindowNormal

一个表单上有两个控件用于日期和一个运行此代码的按钮。如何做到这一点?

【问题讨论】:

【参考方案1】:

打开报表前使用DoCmd.SetParameter设置参数:

DoCmd.SetParameter "ShipDateStart", "#" & Format(CDate(Me.StartDateBox), "mm/dd/yyyy") & "#"
DoCmd.SetParameter "ShipDateEnd", "#" & Format(CDate(Me.EndDateBox), "mm/dd/yyyy") & " 23:59#"
DoCmd.OpenReport stDocName, acPreview, , , acWindowNormal

【讨论】:

这是朝着正确方向迈出的一步,因为它不会弹出询问参数,但它返回时没有结果。我在报告参数值中手动输入相同的值,它工作得很好,所以我不知道出了什么问题。表单控件检索日期和 CDate 工作,但它好像 SetParameter 输入 Null。 显然,Access 在使用 DoCmd.SetParameter 和日期参数时会进行一些奇怪的类型转换。当前的编辑应该可以工作。 就是这样!我认为 CDate 将其转换为日期,使“#”前缀/后缀变得多余(或者可能有问题,因为它可能变成“##”前缀/后缀)。那好吧。如果它没有坏,就不要修理它。 好吧,这也是我出错的地方,但显然,DoCmd.SetParameter 采用 SQL 表达式字符串,因此您的日期被转换回字符串(您将在 SQL 语句中键入的内容)和然后将您的日期投射到那个位置,效果很奇怪。例如。 #1-1-2001# 以某种方式被转换为 #8-7-1894# @ErikvonAsmuth: #1-1-2001# 不会被强制转换,但1-1-2001 将作为数字并等于 -2001。 CDate(-2001) 返回日期 1894-07-08,因为它是 1899-12-30 之前的 2001 天。但是,CDate("1-1-2001") 将返回 2001-01-01。

以上是关于GROUP BY 月报告上的 MS Access 过滤器日期范围的主要内容,如果未能解决你的问题,请参考以下文章

在 Access 中连接记录和 GROUP BY

带有 GROUP BY 的这个 MySQL 视图的 MS 版本?

模拟 group by,order by,从 mysql 到 ms sql 2000 的限制

在 Access 2007 SQL 中的 Group By 聚合函数中计数 Distinct

选择的字段不包含在 GROUP BY 子句中,那么这个 Access 查询如何成功运行?

MS Access Query-By-Form 问题