こんにちは。前回は、決めた当直順に割り振りを行い、日当直の一覧表の作成までを行いました。
今回は、発生した代休一覧表を作成し、そこから代休消化を登録。代休消化の予定を入れたか一目でわかるシステムを作っていきます。
Contents
代休一覧表を作成する
代休一覧表を作成します。これは、クエリの集計機能を使っていきます。
いきなりクロス集計を使うと少しこんがらがりやすくなるので、一度代休一覧のクエリを作成しました。
代休一覧のクエリを作成
テーブル「当直順」の「技師ID」フィールドのIDを元にテーブル「日当直」の「代休発生日」と「代休消化日」、テーブル「calender」のフィールド「代休」の値を参照します。
また、代休が何回目なのかを計算するためにフィールド「count」を作成します。ここのフィールドは、代休が発生するたびに1づつ累積されるフィールドにします。これは後に作成する代休一覧の際に重要なフィールドになってきます。
countのフィールドに入力する計算値は以下となります。
count: Int(DSum(“代休”,”K_代休一覧2″,”技師ID = ” & [技師ID] & ” And 日付 <= #” & [日当直].[日付] & “#”)+0.5)*Int([代休]+0.5)
考え方としては、現在のレコードよりも前の代休カウント数の合計に当日の代休発生数を足すという考え方です。
しかし、ここで問題が出てきます。休日の代休発生数は1日なので単純に累積していけばいいのですが、診療日である土曜日の当直では代休発生数が「0.5」という事です。集計クエリで使用する場合、ここは整数である必要があるので、この「0.5」の処理を考えなくてはいけません。
なので、代休発生数に0.5を足して、小数点以下切り捨てという方法を用いれば無事に解決することができます。(小数点以下、切り上げで処理する方法でもOK)
そこで、Int関数を使用することで、小数点以下を切り上げることができます。
なので、先ほどのフィールドの計算式の初めにInt関数を付けています。
もう一つ、フィールドを作成します。「検索」フィールドと名前を付けてみました。といっても、何かを検索するわけではありません。。。。。
ここのフィールドは、文字列を連結したフィールドとします。
連結するフィールドは、「代休数」のフィールドと、「代休消化日」のフィールドを連結します。クエリのフィールド部分には以下を記載します。
検索: [代休] & “,” & [代休消化日]
このフィールドは、後に代休消化日の予定を入力した際に使用します。
クエリを実行した結果は以下となります。
クエリを保存します。名前は「K_代休一覧2」としました。
代休一覧のクロス集計
ここからは、代休発生日を技師ごとに一覧で表示する部分をやっていきます。
最終的には上記のような感じです。代休が発生する日を表示します。橙色で表示されている日は代休発生数が0.5日で、水色の部分が代休発生数が1日になります。
灰色で表示されているのが代休消化を指定した日になります。
この一覧の作成にはクロス集計を使用します。
まず、先ほど作成したクエリを選択し、クエリウイザードをクリックします。
そして、クロス集計ウィザードを選択します。
表示にクエリを選択し、先ほど作成したクエリを選択します。
行見出し「技師ID」を選択します。
行見出しには「count」を選択します。
集計方法にはカウント以外であればなんでも構いません。
また、集計を表示したい場合には集計値を表示するにチェックを入れます。
なお、これにチェックを入れた場合は当直回数の合計が表示されます。
クエリの名前を指定して実行します。
数の様な表示が出てきました。
ここで、日付に年が表示されていますがここは、”mm/dd”の表示がいいので変更しましょう。
デザインビューで開きます。
日付を選択し、プロパティーの書式を”mm/dd”と入力することで変更することができます。
あとは、これをフォームで表示すれば初めに表示したような形式で表示することができます。
フォームの作成は前回記事の「一覧表の作成」を参照ください。
あれ。。。技師名が表示されていないことに気が付いてしまいました。。。
修正するのが面倒なのでデザインビューで開き、「技師ID」と「合計日付」の間にテキストボックスを挿入します。
そこのコントロールソースに
1 |
=DLookUp(“[名前]”,“技師”,“[技師ID] = “ & [技師ID] & “”) |
と入力することで技師名を表示しました。
あと、日付の表示もテキストボックスを選択し、書式タブに”mm/dd”と入力することで変更することができます。
ダブルクリックで代休消化指定の日付を入力する
それでは、代休の日付をダブルクリックすることで消化予定の日付を登録できるシステムを組みたいと思います。
フォームの作成
登録方法は、日付をダブルクリックすることでカレンダー様のフォームが出現して日付をクリックすることで登録できるシステムとします。
余計なコンボボックス等が出ています、本当は、なくてもいいのですが、コードを書いていく上で、前のフォームから引き継いだ引数をここに表示することでわかりやすくなるので表示しています。後で非表示にしたほうがスッキリします。
まずは、上図のフォームを作成します。フォームはモーダルフォームとし、このフォームが開いているときは他の作業ができないフォームです。
当直の月、および翌月のカレンダーを作成します。
横7つ、縦5つのボタンを2セット配置します。
ここは、初めに作成したフォーム「カレンダー」の制作過程と変わらないので簡単な説明とコードだけの表示とします。
代休一覧のフォームから代休が発生する日付と、何番目の代休かを引数として受け、その年と月からカレンダーを作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Private Sub Form_Load() Dim strOpenArgs As Variant Dim ID_引数 As Long Dim 種類 As String Dim 番号 As Integer テキスト71.Value = Year(Date) テキスト77.Value = Month(Date) 初期化 strArgs = Split(Me.OpenArgs, “,”) テキスト73 = strArgs(0) テキスト74 = strArgs(1) テキスト75 = strArgs(2) テキスト76 = strArgs(3) End Sub |
初期化のプロシージャ―ではまずボタンの表示を一度、すべて非表示にし、文字も無しにします。その後、順番にボタンを表示、日付の表示をしていきます。
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 |
Private Sub 初期化() For i = 1 To 70 Me(“コマンド” & i).Visible = False Me(“コマンド” & i).Caption = “” Next i d = CDate(テキスト71 & “/” & テキスト77 & “/1”) startday = DateSerial(テキスト71, テキスト77, 1) endday = DateSerial(テキスト71, テキスト77 + 1, 0) next_startday = DateSerial(テキスト71, テキスト77 + 1, 1) next_endday = DateSerial(テキスト71, テキスト77 + 2, 0) For i = 1 To 35 If Weekday(startday) <= i Then Me(“コマンド” & i).Visible = True Me(“コマンド” & i).Caption = Format(d, “mm/dd”) pre_month = Month(d) d = d + 1 aft_month = Month(d) End If If pre_month <> aft_month Then i = 35 End If Next i If テキスト77 = 12 Then d = CDate(テキスト71 + 1 & “/” & 1 & “/1”) next_startday = DateSerial(テキスト71 + 1, 1, 1) Else d = CDate(テキスト71 & “/” & テキスト77 + 1 & “/1”) End If pre_month = Month(d) i = 36 For i = 36 To 70 If Weekday(next_startday) + 35 <= i Then Me(“コマンド” & i).Visible = True Me(“コマンド” & i).Caption = Format(d, “mm/dd”) d = d + 1 aft_month = Month(d) If pre_month <> aft_month Then i = 70 End If End If If pre_month <> aft_month Then i = 70 End If Next i End Sub |
フォームが表示され、ボタンが押されたらテーブル「日当直」にボタンの日付を登録します。
当直順を登録した時と同様に、登録だけのプロシージャ―を作成し、ボタンを押した際に、ボタンに表示されている日付を引数に登録のプロシージャ―を呼び出す形にする予定でした。その方がスマートなのですが、今回は一度、コンボボックスに表示させ、登録のプロシージャ―ではコンボボックスの値を参照して登録する形式をとりました。理由はありません。
登録のプロシージャ―を以下に記載します。
1 2 3 4 5 6 7 8 |
Private Sub 登録() sql_update = “update 日当直 SET 代休消化日 = #” & コンボ78 & “# where 日付 = #” & CDate(テキスト74) & “# and 技師 = “ & テキスト73 & “;” DoCmd.RunSQL sql_update Forms![F_代休一覧].Requery DoCmd.Close End Sub |
ボタンが押された時のコードは以下になります。
1 2 3 4 |
Private Sub コマンド1_Click() コンボ78.Value = Format(コマンド1.Caption, “yyyy/mm/dd”) 登録 End Sub |
上記コードを各ボタンに設定していきます。
これで、登録用のフォームは完了です。
ただこれだけだと、変更がフォーム上に反映されません。
当直一覧のフォームに設定
それでは、当直一覧の方の設定戻ります。デザインビューで開きます。
代休が表示されるテキストボックスの上で右クリック「イベントのビルド」⇒「コードビルダ」を選択します。
下の図の部分を「DbClick」を選択します。
引数として渡す文字列を作成します。
strOpenArgs = 技師ID & “,” & CDate([1]) & “,” & “日当直” & “,” & CStr(1)
CDateは、テキストボックスに表示されている文字列を日付型としてCStrは文字列として認識させます。
なので、上記コードでは、代休発生1の部分に表示されている日付を、明示的に日付としています。CStr(1)は代休消化日を登録する際にレコードを検索する為に使用しています。
そして、先ほど作成しフォームを開きます。その際に、今作成した引数を渡します。
1 2 3 4 |
Private Sub Ctl10_DblDblClick(Cancel As Integer) strOpenArgs = 技師ID & “,” & CDate([10]) & “,” & “日当直” & “,” & CStr(10) DoCmd.OpenForm “F_代休登録”, , , , , , strOpenArgs End Sub |
このコードを各テキストボックスに設定していきます。CDate([1]) , CStr(1)内の数字の変更を忘れないでくださいね。
これで、一連の流れは出来上がりました。
フォーム「代休一覧」の条件付き書式の設定
いよいよ、最終段階に入りました。
代休が0.5日の時の表示設定と、代休消化の指定をした際の表示変更です。
メニューバーの書式を選択します。
まずは、代休消化日の指定をした場合の処理です。
新しいルールを選択します。
書式設定で「式」を選択します。
その右側に以下の式を入力します。
Len(DLookUp(“検索”,”K_代休一覧2″,”日付=#” & [3] & “# and 技師ID = ” & [技師ID] & “”))>10
これは、検索フィールドの文字列が10文字以上の時にテキストボックスの背景色が灰色になるようにしてあります。
同様に0.5日の代休の時は
新規ルールを作成し、式の欄に
DLookUp(“代休”,”calender”,”日付=#” & [3] & “#”)=’0.5′
を入力することで処理が完了です。
いかがでしたか?
これで業務管理のファイル作成は完了です。
かなり長丁場になりました。
お疲れ様でした。