ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Microsoft Office AccessコミュのSQLで作成したクロス集計クエリにFilterをかけたい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こんにちは。
探してみたのですが、見つからなかったのでトピ立てさせていただきます。
既出でしたらご指摘下さい。

よろしくお願いします。


Q_Query1で、ID(主キー)をグループ化してをクロス集計して出した合計値「金額の合計」を、T_Table1の「合算」というフィールドにコピーする(Update)プログラムを下記の通り作りました。

実行時エラー3021というエラーが出て、 rs1.Update "合算", rs!金額の合計 の部分で止まってしまいます。

エラー内容は、EOFかBOFがTrueになっているかカレントレコードが存在しない、というものですが、T_Table1にはレコードがたくさんあります。

また、SQLのクロス集計クエリについても、Do Until 〜Loopの間をイミディエイトでデバックするときちんと出てくるので、クエリ集計に問題がないと考えています。

ということは、上記のようなエラーが出るはずないと思うのですが、理由がわからなくて困っています。

ひょっとして、SQLのクロス集計クエリにはFilterメソッドは使用できない、など、そもそものルールがあるのでしょうか。

もしお分かりになる方がいらっしゃいましたら、お教え下さい。
よろしくお願いします。

下記、実際のコードを記します。



Public Sub copy()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs1 As New ADODB.Recordset
Dim cmd As New ADODB.Command

Set cn = CurrentProject.Connection
Set cmd.ActiveConnection = cn

rs1.Open "T_Table1", cn, adOpenKeyset, adLockOptimistic, _
adCmdTableDirect

cmd.CommandText = "select Q_Query1.ID, sum(Q_Query1.Price) as 金額の合計 & _
" from Q_Query1 group by Q_Query.ID;"

Set rs = cmd.Execute


Do Until rs.EOF

rs1.Filter= "ID=" & rs!ID
rs1.Update "合算", rs!金額の合計
rs.MoveNext

Loop

rs.Close: Set rs = Nothing
rs1.Close: Set rs1 = Nothing
cn.Close: Set cn = Nothing

コメント(11)

>cmd.CommandText = "select Q_Query1.ID, sum(Q_Query1.Price) as 金額の合計 & _

この辺、" 足りなくありませんか?
>ダグさん

すみません!

 as 金額の合計" & _

と改行に必要なコードは記載しています。

実際のコードをコピペして、テーブル名などを変更した時に消してしまったようです。
すみませんです。
>ダグさん

一度で済まずすみません。

ちなみに、ADOにてSQLクロス集計したレコードセットについてFilterメソッドが使えない・・・というようなことは、何かお教えいただけることありませんでしょうか。

体系的に勉強したことがないので、そういう大前提的なことがわからないことが結構あるんです。。。
> しまかよasさん

ADOだからとかDAOだからとか、聞いたことはありませんが…そんなことはないと思いますよ。


group by 以降が違うかも?
rs1 にフィルターをかけたときに rs1 のレコード件数が 0件になったのでは?
>ダグさん


あ、またもやタイプミスで"1"が抜けています・・・苦笑

2番のレスの通り、実際のクエリ名とフィールド名を載せずにその部分だけ書き換えたので、タイプミスです。
何度もすみませんです。

実際のコードでは、SQLのクロス集計部分に関するエラーは発生していません。
デバッグプリントも正しい数字が出るので、問題ないかと。。。

何度も何度もありがとうございます。
>かくさん


こんにちは。
お返事ありがとうございます。

rsの先頭レコードのIDと同じIDを持つrs1のレコードが0件、なので、最初っからEOFがTrue・・・、という理解で問題ないでしょうか?
(初心者なもので、質問がくどく、すみません)
>ダグさん
>かくさん


再びこんにちは。

念のためと思い、もう一度デバッグでレコードセットをチェックしてみたところ、実際はIDフィールドは0番〜2285番まで存在するのに、1929番からしかデバッグされていないことがわかりました。

これは、DO 〜 Loopを外して、先頭レコードだけデバッグすると、きちんとIDが0のレコードがイミディエイトに返ります。
Movenextを加えてひとつだけ進めてやると、次のレコードが返ります。

ですが、Do〜Loop内にデバッグプリントを記述すると、先頭レコードは1929番で、それよりIDが大きい番号しか返りません。


もし上記について何かアドバイスしていただけることがありましたら、教えてください。
何度もすみません。


このレコードセットの取得の問題について、自分でも少し色々とやってみます。
8の回答

rs の並び順が指定されていないので、どのレコードが先頭なのかは分かりません。
今回のケースは、クロス集計のSQL文に ORDER BY 句を付与して並ばせたほうがよさそうです。


7の回答

rs の先頭のレコードに対するものが rs1 にないとき Update の行でエラーが発生します。
ですから先頭のレコードとは限らず、途中でも rs1 のレコードが見つからないこともあるかもしれません。
>かくさん

こんばんは。
詳しい解説ありがとうございます!
とってもわかりやすいです。

9の回答を参考に明日またトライしてみます。
わからないことがあれば、またここへ書き込みさせていただきますので、よかったらまたお返事ください。
よろしくお願いします。

ありがとうございます。
>かくさんへ

おはようございます。
8:30からやってみて、解決しました!
本当にありがとうございました。

ご指摘の通り、rsの先頭レコードに該当するrs1が存在したいためのエラーでした。
具体的には、rs1は1613番より大きいレコードしかないのに、rsは0から存在する、という内容です。

本当に本当にありがとうございます!
また何かわからないことがあったら、お尋ねするかもしれませんが、よろしくお願いします。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Microsoft Office Access 更新情報

Microsoft Office Accessのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング