<HOME  <お願い事項   <Access2002 TOP   <Access97 TOP   <サイト内検索
 MS-Access2000超入門部屋--出勤簿を作る
  1 2 3



えー毎度ばかばかしいお話で・・・。

とある秘密基地で、5人の研究員が秘密研究のために毎日働いてます。
5人は、部屋に入るときに、必ず自分のIDカードを入り口のカードリーダーに「ぴっ」と通すようにしています。
で、そのカードリーダーの記録が、こんな感じのテキストファイルとして残ります。

月末に、その月1ヶ月分のデータを取り出して、ひとつのテキストファイルにして保存しています。
データの内容はこんな感じですね。
カードリーダーが通された日時と、IDカードに記されている社員番号が、カードを通すたびに1行ずつ記されていきます。
お昼ご飯を食べに外に出たときとか、トイレに行くときとか、おやつを買いに行くときなども、必ずカードを通してドアを開けるようになっています。
なので、一日に同じ人が何度も出入りしていることになります。

入退出時間  社員番号
−−−−−−−−−−−−−−−
2001/5/1 8:04 01001 <−−−
2001/5/1 8:12 01002
2001/5/1 8:34 01004
2001/5/1 8:55 01005
2001/5/1 8:59 01003
2001/5/1 9:04 01002
2001/5/1 9:39 01004
2001/5/1 10:24 01002
2001/5/1 10:33 01003
2001/5/1 11:40 01004
2001/5/1 11:51 01004
2001/5/1 12:02 01002
2001/5/1 12:04 01003
2001/5/1 12:04 01001
2001/5/1 12:05 01004
2001/5/1 12:05 01005
2001/5/1 12:59 01001
2001/5/1 12:59 01003
2001/5/1 13:01 01004
2001/5/1 13:01 01002
2001/5/1 13:01 01005
2001/5/1 13:22 01005
2001/5/1 14:02 01002
2001/5/1 15:12 01003
2001/5/1 15:15 01003
2001/5/1 16:22 01005
2001/5/1 16:28 01002
2001/5/1 16:42 01001
2001/5/1 16:43 01001
2001/5/1 16:55 01003
2001/5/1 17:28 01003
2001/5/1 19:44 01002
2001/5/1 19:54 01001 <−−−
2001/5/1 20:05 01004
2001/5/1 20:19 01005
2001/5/1 21:22 01003

このデータから、その日その社員の「いちばん最初の日時」が出勤時刻、「一番最後の日時」が退勤時刻と考えてよさそうなら、

社員番号  出勤日  出勤時刻  退勤時刻
−−−−−−−−−−−−−−−−−−−
01001   2001/5/1  8:04    19:54

こんなふうに横に並べることができれば、これを出勤表に活用できるんじゃないかな・・・と考えました。

こういう処理は、テーブルの構造とクエリの活用がすべて左右します。つまりは・・・データベースの中でいちばん難しい部分と言えます。
Accessみたいな、いわゆる「リレーショナルデータベース」では、クエリ使いこなせてなんぼって感じですからネ。まずはシンプルに、テーブルとクエリの仕組みを理解しながら結果を出していきましょう。出勤細のものは必要ないかもしれませんが、きっと、この辺の考え方、お役に立つと思いますよ。


まずは下準備をします。テキストファイルのまま使うわけにいかないので、ちゃんと、日付時刻型として認識してくれるようにあらかじめテーブルを設けておきます。

ここに、先ほどのテキストファイルをインポートします。
インポートウィザードが上手いことやってくれるはずですから、きちんと、日付時刻型として扱ってくれるようになってますね。


で、このテーブルを基にして、クエリを作ります。当面の目的は・・・「その日、その社員の、いちばん最初の入出時刻と、一番最後の入出時刻を知る」クエリを作ることです。これには、「集計クエリ(Σ)」が役に立つでしょう。

Σは、グリッド上に選択したフィールドの中で、ダブってるものをまとめてひとつのグループにしてくれるというお手軽機能です。なので、何とかして、「出勤日」でまとめていきたいんですけど、このテーブルの状態だと細かく時刻まで入ってますから、このままじゃまとまってくれないですよね。

なので、[日時]フィールドから、時刻の部分をとっぱらってしまいたいんですよね。
これにはいろいろな方法があるのですが、手っ取り早いのはFormat関数を使って日付の部分だけの表示にしてしまう、という方法です。この方法なら皆さんオッケーですよね。モウ一工夫してみて、書式に”yyyy/mm/dd aaaa”ってやってみると、

曜日まで出ます。Format関数の書式部分については、ヘルプにいろいろ載ってますので、ぜひ活用してみてくださいね。

ひとつのフィールドに日付も曜日も詰め込むのではなくて、列を分けたいな、という場合は、モウ一列作ってもいいでしょう。
この辺はお好みでいろいろ使い分けていってください。今回は、単に「日付ごとにグループ化したい」だけなので、別にどっちでもいいです。2001/5/9は必ず水曜日ですから、列を分けようがまとめようが、今やろうとしていることには影響ありませんしね。

でもー・・・日付は日付、曜日は曜日で分けましょうかね。常に曜日がくっついてくるより、分けることができるようにしといた方が何かと融通が利きそうな気がします。

出ました?aaaにすると、月、火、水・・・という短い表記になりますから、この辺ヘルプを見ながらいろいろ使い分けていってみてください。

さらに、[社員番号]も選びましょう。
で、いよいよΣボタンをクリックします。

とりあえずこの状態でデータシートビューに切り替えてみると・・・。

「日付ごと、社員番号ごと」にグループ化されている様子がわかります?まあ、これだけじゃちょっとわかりにくいですけど・・・。
2001/5/1に01001さんは何回か秘密基地に出入りしているはずですけど、とりあえずこのクエリの結果としては、1行分のデータができてますよね。

Σをクリックしてない状態のときはどうなのか、[社員番号]を選ばず、[出勤日][曜日]だけのときにΣしたら全部で何件くらいになるのか、とか、いろいろ動かしてみて、どういうフィールドを選んでるときどういうグループ化がなされるのか、研究してみてください。これ、理解を深めておくと、何かと便利だと思いますよ。