2013-10-17 28 views
0

我有一个查询(在MS Access 2013中),该查询为我提供了按日期分类的各种项目的销售额,用于下一个12mo的每一天。在另一张表格中,我将每件商品的采购时间设定为30到90天。 我创建了一个查询,对于每个项目,我计算的未来日期根据交货期,使用:Access中的DSUM会在随机记录中产生空值

FutureDate: DateAdd("d",[Leadtime],Date()) 

我验证了销售查询存在的所有项目,所有FutureDates是存在于该记录中销售。

我需要计算现在和每个项目的计算[FutureDate]之间的每日销售总和,以获得每个项目的唯一订货时间内的预期销售总量。

我试图函数DSUM()与怪异的结果:

每天销售的查询已经排除了任何以往的销售,所以我的第一个尝试是:

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale]<=#" & [FutureDate] & "# AND [Item]='" & [SearchedItem] &"'") 

对于一些项目,[TotalSalesInLeadtime]计算正确,而其他人评估为空。

然后我想:现在

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale] BETWEEN #" Date() "# AND #" & [FutureDate] & " AND [Item]='" & [SearchedItem] &"'") 

,结果则相反。 [TotalSalesInLeadtime]值现在正确地显示之前显示为空的项目,并且对于以前正确评估的项目为空。

我从来没有想过为什么DSUM()这样做。

要解决的DSUM()毛刺,我与嵌入式子查询,它正确地产生所有的值,尽管在显著的性能损失去:

SELECT [PurchItem], 
     (SELECT Sum([DailySales]) AS SumOfSales 
     FROM [Sales] 
     WHERE ([Item]=[LeadtimeItems].[PurchItem]) AND ([DayOfSale] Between Date() AND [LeadtimeItems].[FutureDate])) 
     As TotalSalesInLeadtime 
FROM LeadtimeItems 

如果任何人有一个线索,为什么DSUM可能表现这样,我会很感激帮助。 DSUM在工作时似乎更快。

+0

你的机器不会碰巧使用'dd/mm/yyyy'的日期格式吗? –

+0

是的,数据库使用dd/mm/yyyy格式。你在做什么,我想? – JavierR

回答

1

当“粘在一起”,其中包括括在井号(#)日期文字SQL语句(或片断),我们必须牢记,访问SQL和VBA总会解释模棱两可日期文字为mm-dd-yyyy无论上系统的全日期格式。那么,Windows已经被配置为使用dd-mm-yyyy一台机器上,比如4月30日一个明确的日期将工作好吗

?DateSerial(2013,4,30) 
30-04-2013 
?"#" & DateSerial(2013,4,30) & "#" 
#30-04-2013# 
?Eval("#" & DateSerial(2013,4,30) & "#") 
30-04-2013 

...但第二天,5月1日,事情并没有这么好

?DateSerial(2013,5,1) 
01-05-2013 
?"#" & DateSerial(2013,5,1) & "#" 
#01-05-2013# 
?Eval("#" & DateSerial(2013,5,1) & "#") 
05-01-2013 

所以教训是,任何时候我们“粘合起来”日期文字,我们必须确保这些日期是在像yyyy-mm-dd明确的格式。关于这个特定的问题,我们需要使用

TotalSalesInLeadtime: DSUM("DailySales","Sales","[DayOfSale]<=#" & Format([FutureDate], "yyyy-mm-dd") & "# AND [Item]='" & [SearchedItem] &"'") 
+0

与'yyyy-mm-dd'一起在每一行产生结果。但是,当我将子查询方法的结果与DSum()的结果进行比较时,使用DSum进行查询的记录数仅少一个记录。我复制/粘贴结果,发现缺失的记录。如果我使用Access接口将筛选器应用于Dsum查询,则会找到该记录。当我重新查询时,记录数仍然是一个。复制粘贴静态比较,我发现一个不同的记录丢失...筛选它找到记录。其他一些故障模式在这里工作。我坚持使用子查询方法。 – JavierR