アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセスのクロス集計で質問なのですが・・・
日付ごとの集計を行いたいのですが日付が21日締めで行いたいのです。
フォームで年と月を入れるとその月の集計を行いたいのです。
(例:フォームの日付入力2008/01と入力→集計クエリで2007/12/21~2008/01/20までの集計)
この場合、抽出条件はどのように行えばよいのでしょうか

A 回答 (4件)

日付から[月度]を求める式フィールドを作ります



月度: Format(DateAdd("m",-(Day([日付])>20),[日付]),"yyyy/mm")

このフィールドに抽出条件を設定します

フォームのテキストボックスに条件を入力するのなら
=Forms!フォーム名!テキストボックス名

パラメータで条件を入力するのなら
=[年月を入力してください]

いずれの場合もクロス集計クエリのパラメータ指定で
パラメータ名とデータ型を指定しておくことを忘れないでね
    • good
    • 0
この回答へのお礼

回答ありがとうございます。早速やってみたいと思います。

お礼日時:2008/01/22 13:19

補足: GetDate関数とクロス集計クエリの書換えとの関係について



Private Sub コマンド0_Click()
  Dim dbsCurrent As DAO.Database
  Dim qdfCrossSum As DAO.QueryDef
  Dim strSQL   As String
  
  strSQL = "TRANSFORM Sum(tab1.数量) AS 数量の総計 " & _
      "SELECT tab1.区分, Sum(tab1.数量) AS [合計 数量] " & _
      "FROM tab1 " & _
      "WHERE tab1.日付 BETWEEN #1/21/2008# AND #2/20/2008# " & _
      "GROUP BY tab1.区分 " & _
      "PIVOT tab1.日付;"
  
  Set dbsCurrent = CurrentDb
  Set qdfCrossSum = dbsCurrent.QueryDefs("tab1のクロス集計1")
  Debug.Print qdfCrossSum.SQL
  dbsCurrent.QueryDefs("tab1のクロス集計1").SQL = strSQL
  Debug.Print qdfCrossSum.SQL
  dbsCurrent.Close
End Sub

ちょっと、手法は旧い手法ですが、これで[tab1のクロス集計1]は更新されます。

"WHERE tab1.日付 BETWEEN #1/21/2008# AND #2/20/2008# " & _



"WHERE tab1.日付 BETWEEN #" & Me.集計開始日 & "# AND #" & Me集計終了日 & "# " & _

とすれば、フォームのテキストボックスをクロス集計クエリに反映できます。

Me.集計開始日=GetDate(Me.年月, -1, 21)
Me.集計終了日=GetDate(Me.年月, 0, 20)

という仕掛けで getDate関数を用います。

※断片的な回答でしたので一応補足した次第です。
    • good
    • 0

tab1:



ID__日付___________区分____数量
1___2007/12/20_____1_________1
2___2007/12/21_____2_________2
3___2008/01/19_____3_________3
4___2008/01/19_____3_________4

tab1のクロス集計クエリ1:

区分__合計_数量___2007/12/20___2007/12/21___2008/01/19
1__________________1__________________1
2__________________2____________________________________2
3__________________7________________________________________________________7

tab1のクロス集計クエリ2:

区分__合計_数量___2007/12/21___2008/01/19
2__________________2_________________2
3__________________7____________________________________7

TRANSFORM Sum(tab1.数量) AS 数量の総計
SELECT tab1.区分, Sum(tab1.数量) AS [合計 数量]
FROM tab1
WHERE tab1.日付 BETWEEN #12/21/2007# AND #1/20/2008#
GROUP BY tab1.区分
PIVOT tab1.日付;

クロス集計クエリ1と2の差は WHERE 節の有無です。

さて、この WHERE節の生成要領ですが、私はクエリをVBAで編集しています。

※クエリを編集する手段以外は勉強不足で知りません。
    • good
    • 0

[イミディエイト]


? GetDate("2008/01/01", -1, 21)
2007/12/21
? GetDate("2008/01/01", 0, 20)
2008/01/20

ここで、21と20を GetDate関数に埋め込むのは不味いでしょうね。
しかし、要は、集計開始日と集計終了日を求めなきゃ始まらないのではと思います。

Public Function GetDate(ByVal Now As Date, _
            ByVal Move As Integer, _
            ByVal Hiduke As Integer) As Date
            
  GetDate = DateSerial(DatePart("yyyy", Now), _
             DatePart("m", Now) + Move - (Hiduke = 99), _
             Hiduke * Abs(Hiduke <> 99))
End Function

[イミディエイト]
? GetDate("2008/01/01", +1, 1)
2008/02/01
? GetDate("2008/01/01", +1, 99)
2008/02/29

GetDate関数で翌月の1日と末日とを求めた例です。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
こちらはクエリの中の抽出条件に入るのでしょうか・・・

SQLやVBを使用するのでしょうか?
初心者でちょっとわからないので・・

お礼日時:2008/01/22 13:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!