0

次の 12 か月の各日について、日付別のさまざまなアイテムの売上を示すクエリ (MS Access 2013) があります。別のテーブルには、各アイテムの既知の購入リードタイム (30 日から 90 日など) があります。クエリを作成し、各アイテムについて、次を使用して、リードタイムに従って将来の日付を計算しました。

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

すべてのアイテムが Sales クエリに存在し、すべての FutureDates が Sales に存在するレコード内にあることを検証しました。

各アイテムの一意のリードタイム内に予想される売上の合計額を取得するために、現在と各アイテムの計算された [FutureDate] の間の毎日の売上の合計を計算する必要があります。

関数 DSUM() を試してみましたが、奇妙な結果が得られました。

Daily Sales のクエリはすでに過去の売上を除外しているため、最初に試したのは次のとおりです。

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

一部のアイテムでは、[TotalSalesInLeadtime] が正しく計算されましたが、他のアイテムでは Null と評価されました。

それから私は試しました:

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

今の結果は逆転しました。[TotalSalesInLeadtime] の値は、以前は Null を示していたアイテムに対して正しく表示され、以前は正しく評価されていたアイテムに対して Null でした。

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 が機能すると、確かに速くなるようです。

4

1 に答える 1

1

ハッシュ マーク ( ) で囲まれた日付リテラルを含む SQL ステートメント (またはフラグメント) を "結合" する場合、Access 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] &"'")
于 2013-10-18T07:45:29.693 に答える