出勤簿を作り勤務時間の管理をしたいです
基本的なフィールドやリレーションはするとして実際の勤務時間を入力したテーブルがあるとします
・出勤時間 - 退勤時間が8時間以上になるものは週に2回(月曜日を起算日とする)までとして、その回数をカウント
・月の所定労働時間から実際の勤務時間を引いていき、当月あと何時間勤務できるかを表示
といったことは、フォームやレポートで、非連結フィールドを使い計算をするものですか?
上記を、実際に勤務時間を入力するフォームの上のあたりに配置して確認しながら入力できるようにしたいです
ということなら、まずは週マスターテーブルを作成すると管理が楽になりそうです。
例えば下記のような感じです。
テーブル名 T_週
フォームはメイン/サブフォーム形式にして、
メインフォームは上記のテーブルをレコードソースにして、サブフォームは勤務時間管理用のテーブルをレコードソースにします。「週ID」フィールドも勤務時間管理テーブルに持たせます。
サブフォームのヘッダーかフッターにテキストボックスを配置してコントロールソースに下記の式を設定すれば、
勤務時間計や勤務時間が8時間以上の回数を表示できます。
=Sum([退勤時間]-[出勤時間]) * 24
=Sum(IIf((([退勤時間]-[出勤時間]) * 24)>=8, 1, 0))
テーブル名 T_週のレコードは前もって数年分つくるもいうことですか?
「週ID」フィールドも勤務時間管理テーブルに持たせます
といのは、どのように入力するのですか?
初心者で理解力がなくてすみません
前もって作成しておいてもいいでしょう。手入力が面倒なら、VBAか追加クエリで一気に生成することもできます。
あるいは、フォームで新規入力するときに、VBAで自動入力してもいいでしょう。
そのフォームでしか使わず、かつ、特定の日付を元に計算するなら計算式一つでやってもいいんじゃないかな
週ごとの集計を表示したいとか、年間の集計を表示したいとかになると処理の効率化も考えたほうがよさそうだけども
週を識別するIDを作りたいだけなら
Int([日付]/7)
で計算させてもいいんじゃないですかねなかなかむずかしそうですね
EXCELでやっていたときは
COUNTIFSやCOUNTSUMをつかってやっていました
・月の所定労働時間から実際の勤務時間を引いていき、当月あと何時間勤務できるかを表示
というのもなかなか大変そうですか?
ACCESSにはDCount()やDSum()のような定義域集計関数と呼ばれる関数があります。これらを使えば「COUNTIFSやCOUNTSUM」と同様の計算ができます
ただし、計算速度的に低速なため、多用すると処理速度の問題で不可となる場合があります
この「処理速度的に不可」は環境依存度が高いのでやってみなければわかりません。ダメだったときは高速な手法を考えることになるので大変だと思います
再計算のたびに毎回全レコード対象で計算がはいるので激重になりそうですね
労働時間の管理なんかには向かないのですかね
せめてその日、までの累計を計算したいです
出勤や退勤に変化があったときに計算して累計に格納するようにVBAを書いても
レコードが増えると重いですねえ
累計は特に重くなります。すべてのレコードで過去にさかのぼって集計することになりますので。
その場合は、テーブルに累計値を格納するフィールドを持たせて、VBAで計算して累計値を書き込むような設計にする場合もあります。
下記で、簡単に累計値をテーブルに書き込める汎用関数を紹介していますので、ご参考に。
累計値をテーブルに自動入力する関数 - hatena chips
EXCELのCOUNTSUMも、どうようにすべてを対象として計算されるので動作的には同じようなものでしょうか?
一年に数人分で1000件程度になるかと思います
一年間に絞って計算させる、といったようなことをすれば軽くなるでしょうか?
リンクを読みましたが、経験が浅くあまり理解できませんでした
1000件程度なら、DCount()やDSum() でもそれほど重くならないように思います。もし、それで遅くなるようなら、リンク先の関数を利用するの方法に変更すればいいでしょう。
リンク先の方法も関数コードをコピーして標準モジュールに張り付けて、あとは簡単なコードを1行記述するだけで使えます。