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



どうでしょう。

毎日毎日、その人が来てようが来ていまいが、とにかく「欄」はできることになります。
あ、でも、このクエリから出勤時刻退勤時刻入力しようと思ったってできないですよ。「なぜ?」とか思ってる人、いないですよね???大丈夫ですね?
[Q_稼働日]の結合があいまいである(結合線がない)ということと、もうひとつ、[Q_出勤退勤]が集計クエリ(Σ)だからですよね。
出力専門のクエリってことで、まあ、そうですね・・・レポートのレコードソースとして使うとか、そんな感じの使い方になりますかね。

このクエリで、社員番号で絞り込めば・・・

その人の、1か月の出勤退勤表ができあがりますね。


では・・・このクエリを基にして、レポートをひとつ作ってみましょうかね。
社員番号に対する抽出条件は、空っぽの状態に戻しておいてください。

上のクエリを基に、レポートウィザードを使ってレポートを作ります。
途中、「グループレベルを指定してください」というところが出てきますね。
もし、「社員ごとに、その月1ヶ月分の毎日の出退勤の様子を一覧にしたい」のなら[社員番号]を選びます。
もし、「毎日、5人が何時に来て何時に帰っているのか、その日ごとに一覧にしたいのなら、[日付]を選びます。

あとは適当でいいです。

レポート、できました?
多分、このままだと出勤時刻も退勤時刻も「日付と時刻」両方が出てくるんじゃないかと思います。これって、時刻だけにしたいときはどうするんでしたっけ?
えへへ〜みなさんオッケーですよね。書式を変えるんでしたよね。
それから、もし、[社員名]などのフィールドを設けているのなら、「詳細」セクションから「社員番号ヘッダー」まで、テキストボックスをドラッグしてしまいましょう。[社員名]は[社員番号]と対ですもんね。まあ、この辺はいろいろいじってみてください。練習ですからね。思い切っていろいろ挑戦してみてください。

あと、できれば、このレポートの中での「レコードの並び順」をしっかり設定しておくといいでしょう。今回みたいに主キーの設定とかあいまいなテーブルを使ってる場合、多分、レコードの並び順が適当になっちゃうと思うんです。
レポートの中でのレコードの並び順は、ツールバーの「並べ替え/グループ化の設定」ボタンをクリックして設定しましょう。

多分、[社員番号]が選ばれてると思うんですけど、その下に[日付]を選びます。


わたしのはこんな感じになりました。

え?一日何時間何分働いたか、計算させたいって?
うっそー。すっげーめんどくさいですけど、やってみます?


それではですねぇ・・・。レポート上で計算させちゃってもいいのかもしれないですが、クエリでやってみましょうかね。別にどっちでもいいですよ。とにかく、基本的な計算式を見てみましょう。
まず、このように、単純に[退勤時間]から[出勤時間]を引き算してみましょう。フィールド名はまだ適当でいいですよ。式1のままでもとりあえずよいでしょう。

ぎょ・・・。なんだかすごい答えが出てきました・・・。

日付時刻型のフィールドというのは、実際には数値と同じような扱いになってるってお話は、いろんなとこで何度かお話させてもらってますけども、内部的には、「整数部分が日付、小数点以下が時間」っていう感じになってます。なので、こんな風に開始時刻と終了時刻の差分を出す場合に、差が24時間未満だと、答えは1に満たない数になるわけです。いちばん細かい単位は「秒」のはずなんですけど、このままだとかなり端数になりそうですね。小数点以下のあつかいって、コンピュータだとほんとに難しいです。

とりあえず、何分とか何時間とかにしないと、これじゃいったいどれくらいの時間働いたのかぜんぜんわからないですよね。
1が24時間なんですから、じゃあ、0.493055555562023は?11.8333333334886時間?

小数点以下の0.8333333334886っていうのは、83分という意味じゃないんですよね・・・。
これは、60進数だから、60分を1としているわけで、じゃあ、0.8333333334886は?710.000000009313分?

うーん・・・これ以上細かい単位は、いらないかな・・・ミリ秒まで出す必要は・・・なさそうですよね。
じゃあ、まず、60*24で、1440をかけて、分単位にしてみましょう。
とりあえずこんな感じで・・・。

で、分の単位まで出れば、後は省略しちゃおうかと思うので、

Int(([退勤時刻]-[出勤時刻])*1440)

Int関数を使って、小数点以下を切り捨てます。
多分、「分」単位では、問題なく扱える数値になると思うんですけど・・・。どうかなぁ。

これを、「○時間○分」っていう表記にするのが、すごく難しいんですよね。
やってみましょうか。
式1を書き換えていってもいいんですけど、これはこれで残しておいた方が利用価値がありそうな気がするんで、モウ一列作るとしましょう。[式1]を使って式を作ります。

あ、[式1]じゃちょっと・・・という方は、なんかフィールド名を変更しておいてください。この後で変えるとなると、いろいろ手間がかかっちゃいますから、変えるなら、今しかありませんぞ!

で、ふたつ目の式は、こんな感じになります。

Int([式1]/60) & "時間" & [式1] Mod 60 & "分"

なんか妙に原始的な感じでしょ。Int([式1]/60)で「時間」の部分を出して、割り切れなかった部分を「分」とみなして[式1] Mod 60と出します。
でも、この計算式をふたつつなげただけじゃ1150になっちゃうので、間に”時間”とかいう文字を入れるように、&でつないでいきます。
文字列をつなぐやり方は、みなさん、オッケーですよね。
できれば、ここからコピーペーストしないで、入力してみてくださいね。今日は練習ですもんね。計算を正しくさせるより、まず雰囲気に慣れることが第一だと思いますし、面倒な式ですけど挑戦してみてください。

あじゃー・・・これだと、[式1]が空っぽ(出勤してない)日も、無理やり計算しようとしちゃいますね。
じゃあ、[式1]になんか値があるときだけ、「○時間○分」って出すようにしましょうか。
さらにややっこしい式になりますが、IIf関数というやつをつかて、ちょっとした条件分岐をいたします。

IIf(IsNull([式1]),Null,Int([式1]/60) & "時間" & [式1] Mod 60 & "分")

こんな感じです。
そのフィールドやテキストボックスの中身がNull(値がない、という意味。ブランクとかスペースとはちょっと違う。使われてないとか答えがないとか、そういうことですね)かどうか調べる関数Isnullを使って、[式1]を調べ、[式1]がNullだったら答えもNull、NullじゃなかったらInt([式1]/60) & "時間" & [式1] Mod 60 & "分"を表示する、ということになります。

一見複雑そうですけど、どのカッコがIif関数のもので、どのカッコがIsnull関数のものか、その辺をじっくり見てみてくださいね。
これで、[式1]でなんかしら答えを出したものだけ、答えを出すようになります。フィールド名も、なんかわかりやすいやつにしようかな。
多分、今回はそんなことはないとは思うんですけども、勤務時間が60分に満たなかった場合、たとえば54分間働いたとすると、今のこの計算式だと0時間54分になるはずです。0時間っていうのがちょっと恥ずかしいなぁっていう場合は、さらにIIf関数をかぶせて

IIf(IsNull([式1]),Null,IIf(Int([式1]/60)=0,[式1] Mod 60 & "分",Int([式1]/60) & "時間" & [式1] Mod 60 & "分"))

こんなふうにしてはいかがでしょうか。
こういうのは難しいですね・・・。「710分」という表示だけでよいのなら楽なんですけど・・・。
今日はこのくらいにしときましょうかね。


じゃ、この値を、レポートの方に反映させてみましょう。
詳細セクションに[勤務時間]を増やします。詳細セクションに非連結のテキストボックスを作ってからそのテキストボックスのコントロールソースを変えてもいいし、フィールドリスト(ツールバーの「フィールドリスト」っていうボタンをクリック)から[勤務時間]をドラッグして詳細セクションに持ってきてから大きさ等調節してもいいし・・・。練習ですからね。いろいろやってみてください。

プレビューしたら、出ます?
まあまあ使えますでしょ。
じゃあ・・・その人が今月何時間何分働いたか集計する場合は、グループフッターを使うといいと思いますよ。
出てない場合は出します。さっき、レポートの「並べ替え/グループ化」のツールボタン、クリックして出した画面があったじゃないですか。あーりーまーしーたー。アレを出すね。もっかい出してください。出してくださいっ。

そしたらですね。[社員番号]っていうとこにカーソルを置いた状態で、下の「グループプロパティ」の「グループフッター」を「はい」にします。
なんか、レポート上に隙間がひとつできたと思いません?
そこに、非連結のテキストボックスを一個作って・・・

詳細セクションに[式1]を表示するためのテキストボックスを作りましょう。分単位で計算の答えを出してたあのフィールドですね。
んでもって、グループフッタ上の非連結テキストボックスでSum関数を使って、[式1]を集計します。
画面じゃわかりにくいんで、わたしゃ赤文字にしてみましたが、皆さんは色変える必要ないですよ。

答え、出ます?

なんで[出勤時間]をSumしないのか、は、・・・みなさん、理解なさってますよね。オッケーですね?
だって・・・[出勤時間]って、テキストですよ。時とか分とか入ってるフィールドをSum関数で集計できるわけないですもんね。
なので、またこの集計結果を「○時間○分」という表示にします。がんばりましょう。

と、まあ、こんな感じになりました。


この計算結果を得ることができれば、[式1]自体は別に印刷されなくてもいいですよね。でも、ないと困るんです。
そういうものは、テキストボックスのプロパティ「可視」を使って、あるけど見えない状態にしてしまうといいでしょう。

また、もし、「社員ごとに改ページしたい」ということでしたら、「グループフッター」の改ページプロパティを調節するとよいと思います。
これをやると、「レポートヘッダー」部分に出している「レポート全体の見出し」にあたるものは、1ページ目にしか出てこなくなります。これでもよければいいんですが、常に出したい場合は「グループヘッダー」の部分にラベルを移動させ、レポートヘッダーの中を空っぽにして狭めてしまえばよいでしょう。
この辺はいろいろ調節が聞くと思います。いろいろ挑戦してみてくださいね。



(オシマイ)