2012/08/03

【Access】自作自演で課題をやってみる2

さて前回の続きです。今回はとりあえずクエリかSQL文の作成から始めます。クエリとSQL文どっちにしようか迷いましたが、個人的な趣味でSQL文を使用することにします。こう書くとクエリとSQL文が別物のように受け止められそうですが根本的にはクエリもSQL文です。アプリ上で定義するかしないかの違いだけです。個人的にパラメータクエリが面倒なのでSQL文の方が好きなだけです。

では早速1つめのSQL文(VBAに書くことを前提にしてます)です。社員テーブル(Employees)からまだ掃除当番に選出されていない人を5名ランダムに抽出します。

=“SELECT TOP 5 * FROM Employees WHERE ChoseDate=#9999/12/31# ORDER BY Rnd([Id])”

前回、載せ忘れてましたが、未選出の人は9999/12/31にしちゃいます。要はこれが選出・未選出のフラグです。SQL文のポイント最後のORDER BY区です。ここにAccessの持つ「Rnd関数」に自身の「Id」を割り当て、レコード毎に乱数を発生させ、それを並べ替えちゃってます。「Id」をseed値として扱うため基本的に乱数が重複することはありません。若干分かりにくい気もしますがRnd関数についての詳しい解説はヘルプを参照してみてください。

次に2つめ。上記SQL文で5名決定できなかった場合、つまり未選出が5名以下になった状態での抽出です。

=“SELECT TOP “ & <必要選出数> & “ FROM Employees WHERE ChoseDate <= #“ & <3ヶ月前> & “# ORDER BY Rnd([Id])”

<>部分がパラメータです。TOPとWHERE区に対してVBA上でパラメータを当てます。ちなみにクエリのデザイナじゃTOPに対してうまいことパラメータが当てられないかもしれません(他の方法を考えた方が早そうな気がします)。

うーん。ループを使わなくても意外とシンプルに解決しちゃっいました。もうちょっと問題捻ったようが良かったかなぁと思ったり…。まぁ、後輩は十中八九クエリでやろうとするからちょっと見物かも。もし、自分がクエリを定義してやるとしたら2つめのクエリはTOPの条件を1にしてしまって、WHERE区に「DateAdd関数」でも使って5名抽出できるまでループにかけちゃうかなぁ。その場合、抽出されるたびにそのレコードを抽出済みにする必要がある気がします。

ここからVBAまで書いちゃうとまた長くなっちゃうので次回で。


pagetop