前回は、当直順を決めるまでを行いました。
今回はその順番に従い、担当を割り当て最終的に一行1日で一覧表示までをやっていきます。
期間を指定して順番に割り振っていく
それでは、順番に割り振っていく部分をやっていきます。
フォームを改良
まずは、期間を指定します。リストボックスの下に期間を指定するコンボボックスを配置します。始まりと終わりを指定しますので、2つ配置します。配置が完了したらプログラムを実行するためのボタンも配置しておきましょう。
ここで指定する期間は、テーブル「calender」で作成した期間となりますので表示されるデータを「calender」のデータとします。
配置したコンボボックスのプロパティーの「データ」タブで、値集合タイプを「テーブル/クエリ」とし、値集合ソースを「calender」とします。
また、連結列の項目では「2」を指定しておきます。
また、「書式」タブで列数を2とし、列幅を「0cm,5cm」とします。
2つのコンボボックスともに同様の設定をしておきます。
データタブで列連結に「2」を指定したのは、2つ目のフィールドのデータを使用するということで、書式タブで指定した列連結の2は「calender」テーブルの2つのフィールドを表示するということです。
列幅では、それぞれの表示する幅を指定しています。1つ目のフィールドはIDとなりますので必要ない項目ですので0cmとして実質非表示としています。
日当直のテーブル作成
それでは、データを登録するテーブルを作成する前に、どのようにデータを登録していくかを考えます。
当院では日直3人、当直は2人体制で行っています。
データ登録方法として、1日のデータを一つのレコードとして登録する方法か、人を単位として登録していく方法が考えられます。どちらの方法にするかでテーブル構造が変わってきます。
今回は、このテーブルで代休発生と代休の消化のデータも取り扱っていくことを考えています。その場合、人単位で登録した時の方が扱いは楽になりそうですので、今回は人を単位として登録していくことにします。
作成タブより、テーブルを選択します。
作成するフィールドは、「ID」、「日付」、「代休消化日」、「技師」、「日当直No」、「日直回数」、「当直回数」とし、上記図のようなデータ型とし、テーブル名を「日当直」として作成しました。
「日当直No」のフィールドは、日直担当者1番目には「1」を割り振り日直担当者2番目には「2」同様に「3」、当直者1番目には「4」、当直者2番目には「5」を割り振ります。また、翌日に代休が発生する場合にはもう一つレコードを追加して「14」、「15」と振ることで代休管理のためのレコードとします。
データ登録のコード作成
それではボタンに機能を付けていきます。
フィールドに戻り、ボタンの上で右クリック「イベントのビルト」⇒「コードビルダ」を選択します。
まず、登録は指定期間分だけfor文で繰り返しますので日数を計算します。
計算結果を変数diff_dayとして格納します。
diff_day = DateDiff(“d”, テキスト59, テキスト62)
テキスト59, テキスト62は先ほど作成した日付のコンボボックスです。
そして担当者の人数を取得します。変数を「担当者数」として格納します。テーブル「当直順」にあれレコードすうをDCountの関数を使って求めます。
担当者数 = DCount(“*”, “当直順”)
この「担当者数」の変数は、1番目の技師から順番に埋めていくわけですが、登録した後に技師番号に1を足していきます。技師の担当者数以上になった場合に1に戻さなければならないので、担当者数を調べておく必要があります。
それでは、テーブルに登録していく部分のコードに入ります。流れを確認しておきます。
まず、登録する日が休日か平日かを判断します。ここは、テーブル「calender」の日付のレコードを検索し、休日フィールドの値が「1」であれば休日ということになります。
テーブルを参照するのはDlookup関数で行います。
check_hol = DLookup(“代休”, “calender”, “日付 = #” & テキスト59 + i & “#”)
ここで、
日付 = #” & テキスト59 + i
” +i ”の部分は、for文で繰り返していきますので基準の日から何日後という意味です。
休日であれば日直者の登録を行います。
続いて、当直者の登録を行います。ここでは、翌日が休日であれば代休用のレコードも追加登録します。
翌日の代休も先ほどと同様に参照します。
データの登録はSQL文のINSERT関数を使います。
作成したコードは以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
Private Sub コマンド58_Click() Dim 日直NO As Integer Dim 当直NO As Integer Dim 技師ID As Integer If IsNull(テキスト59) Or IsNull(テキスト62) Then msg = MsgBox(“左のボックスで日付を選択してください”, vbOKOnly) Exit Sub End If If DCount(“日付”, “calender”, “日付 = #” & テキスト59 & “#”) = 0 Then msg = MsgBox(“カレンダー設定が出来ていません。カレンダー設定をしてください”, vbOKOnly) Exit Sub End If If DCount(“日付”, “calender”, “日付 = #” & テキスト62 & “#”) = 0 Then msg = MsgBox(“終了日までカレンダー設定が出来ていません。カレンダー設定をしてください”, vbOKOnly) Exit Sub End If diff_day = DateDiff(“d”, テキスト59, テキスト62) 担当者数 = DCount(“*”, “当直順”) 日直NO = 1 当直NO = 1 技師NO = 1 For i = 0 To diff_day check_hol = DLookup(“代休”, “calender”, “日付 = #” & テキスト59 + i & “#”) If check_hol = 1 Then 技師ID = DLookup(“[技師ID]”, “当直順”, “[当直ID] = “ & 技師NO & “”) sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師],[日直回数]) VALUES(# “ & テキスト59 + i & “# ,1,” & 技師ID & “,1);” DoCmd.RunSQL sql_insert 技師NO = 技師NO + 1 If 技師NO = 担当者数 + 1 Then 技師NO = 1 技師ID = DLookup(“[技師ID]”, “当直順”, “[当直ID] = “ & 技師NO & “”) sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師],[日直回数]) VALUES(# “ & テキスト59 + i & “# ,2,” & 技師ID & “,1);” DoCmd.RunSQL sql_insert 技師NO = 技師NO + 1 If 技師NO = 担当者数 + 1 Then 技師NO = 1 技師ID = DLookup(“[技師ID]”, “当直順”, “[当直ID] = “ & 技師NO & “”) sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師],[日直回数]) VALUES(# “ & テキスト59 + i & “# ,3,” & 技師ID & “,1);” DoCmd.RunSQL sql_insert 技師NO = 技師NO + 1 If 技師NO = 担当者数 + 1 Then 技師NO = 1 Else sql_insert = “INSERT INTO 日当直 ([日付],[日当直No]) VALUES(# “ & テキスト59 + i & “# ,1);” DoCmd.RunSQL sql_insert sql_insert = “INSERT INTO 日当直 ([日付],[日当直No]) VALUES(# “ & テキスト59 + i & “# ,2);” DoCmd.RunSQL sql_insert sql_insert = “INSERT INTO 日当直 ([日付],[日当直No]) VALUES(# “ & テキスト59 + i & “# ,3);” DoCmd.RunSQL sql_insert End If check_next_hol = DLookup(“代休”, “calender”, “日付 = #” & テキスト59 + i + 1 & “#”) 技師ID = DLookup(“[技師ID]”, “当直順”, “[当直ID] = “ & 技師NO & “”) sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師],[当直回数]) VALUES(# “ & テキスト59 + i & “# ,4,” & 技師ID & “,1);” DoCmd.RunSQL sql_insert If check_next_hol > 0 Then sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師]) VALUES(# “ & テキスト59 + i + 1 & “# ,14,” & 技師ID & “);” DoCmd.RunSQL sql_insert End If 技師NO = 技師NO + 1 If 技師NO = 担当者数 + 1 Then 技師NO = 1 技師ID = DLookup(“[技師ID]”, “当直順”, “[当直ID] = “ & 技師NO & “”) sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師],[当直回数]) VALUES(# “ & テキスト59 + i & “# ,5,” & 技師ID & “,1);” DoCmd.RunSQL sql_insert If check_next_hol > 0 Then sql_insert = “INSERT INTO 日当直 ([日付],[日当直No],[技師]) VALUES(# “ & テキスト59 + i + 1 & “# ,15,” & 技師ID & “);” DoCmd.RunSQL sql_insert End If 技師NO = 技師NO + 1 If 技師NO = 担当者数 + 1 Then 技師NO = 1 Next i End Sub |
日直の登録や、当直の登録はもうちょっとスマートな書き方があったのですが、ちょっと手を抜いてしまいました。。。。。
これで、日当直の登録が完了です。
一覧表の作成
クエリを作成します。名前は「K_日当直表」としました。
テーブル「calender」を中心に「日当直」のテーブルを5個配置します。
それに続くように「技師」のテーブルを配置します。
テーブル「日当直」の「技師」フィールドからテーブル「技師」の「技師ID」のフィールドにリレーションを組みます。
その際、結合プロパティーは
「日当直」の全レコードと「技師」の同じ結合フィールドのレコードだけを含める
を選択します。
その後、テーブル「技師」の「名前」フィールドをダブルクリックしていくことで下の図のように登録されていきます。また、「日当直」の「技師」フィールドもダブルクリックしていくことで登録されます。ただ、このフィールドは表示する必要がないので表示のチェックを外しておいてください。
また、フィールド「日当直No」の抽出条件を「1」、「2」、「3」のように入力していきます。
また、日付順に表示されるように日付の並べ替えの部分で「昇順」を選択しておきます。
クエリが完成しました。しかし、クエリで表示すると何とも味気ない表示となります。そこでフォームでちょっと見た目をよくしましょう
日直1が表示されていませんが気にしないでください・・・・
クエリを選択した状態で、メニューバー「作成」⇒「その他のフォーム」⇒「複数のアイテム」を選択します。
これだけで、少し見栄えが良くなった表示ができます。
いざ、データを登録すると以下のように表示されるようになります。
いかがでしたか?
今回は、決めた当直順に従って担当を割り振り、日当直一覧表示するまでを行いました。
次回は、代休が発生する日をリストアップし、代休消化の日を登録。
一目で代休発生日と代休消化予定を確認できるまでを行いたいと思います。
お疲れ様でした。