all-in-one-seo-pack
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114easy-fancybox
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114urvanov-syntax-highlighter
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114breadcrumb-navxt
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114advanced-ads
domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init
action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114lancr
ドメインの翻訳の読み込みが早すぎました。これは通常、プラグインまたはテーマの一部のコードが早すぎるタイミングで実行されていることを示しています。翻訳は init
アクション以降で読み込む必要があります。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 6.7.0 で追加されました) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114今回は、発生した代休一覧表を作成し、そこから代休消化を登録。代休消化の予定を入れたか一目でわかるシステムを作っていきます。
代休一覧表を作成します。これは、クエリの集計機能を使っていきます。
いきなりクロス集計を使うと少しこんがらがりやすくなるので、一度代休一覧のクエリを作成しました。
テーブル「当直順」の「技師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」と「合計日付」の間にテキストボックスを挿入します。
そこのコントロールソースに
=DLookUp("[名前]","技師","[技師ID] = " & [技師ID] & "")
と入力することで技師名を表示しました。
あと、日付の表示もテキストボックスを選択し、書式タブに”mm/dd”と入力することで変更することができます。
それでは、代休の日付をダブルクリックすることで消化予定の日付を登録できるシステムを組みたいと思います。
登録方法は、日付をダブルクリックすることでカレンダー様のフォームが出現して日付をクリックすることで登録できるシステムとします。
余計なコンボボックス等が出ています、本当は、なくてもいいのですが、コードを書いていく上で、前のフォームから引き継いだ引数をここに表示することでわかりやすくなるので表示しています。後で非表示にしたほうがスッキリします。
まずは、上図のフォームを作成します。フォームはモーダルフォームとし、このフォームが開いているときは他の作業ができないフォームです。
当直の月、および翌月のカレンダーを作成します。
横7つ、縦5つのボタンを2セット配置します。
ここは、初めに作成したフォーム「カレンダー」の制作過程と変わらないので簡単な説明とコードだけの表示とします。
代休一覧のフォームから代休が発生する日付と、何番目の代休かを引数として受け、その年と月からカレンダーを作成していきます。
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
初期化のプロシージャ―ではまずボタンの表示を一度、すべて非表示にし、文字も無しにします。その後、順番にボタンを表示、日付の表示をしていきます。
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
フォームが表示され、ボタンが押されたらテーブル「日当直」にボタンの日付を登録します。
当直順を登録した時と同様に、登録だけのプロシージャ―を作成し、ボタンを押した際に、ボタンに表示されている日付を引数に登録のプロシージャ―を呼び出す形にする予定でした。その方がスマートなのですが、今回は一度、コンボボックスに表示させ、登録のプロシージャ―ではコンボボックスの値を参照して登録する形式をとりました。理由はありません。
登録のプロシージャ―を以下に記載します。
Private Sub 登録() sql_update = "update 日当直 SET 代休消化日 = #" & コンボ78 & "# where 日付 = #" & CDate(テキスト74) & "# and 技師 = " & テキスト73 & ";" DoCmd.RunSQL sql_update Forms![F_代休一覧].Requery DoCmd.Close End Sub
ボタンが押された時のコードは以下になります。
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)は代休消化日を登録する際にレコードを検索する為に使用しています。
そして、先ほど作成しフォームを開きます。その際に、今作成した引数を渡します。
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′
を入力することで処理が完了です。
いかがでしたか?
これで業務管理のファイル作成は完了です。
かなり長丁場になりました。
お疲れ様でした。
The post microsoft ACCESSで勤務管理⑤~代休発生と消化予定日を登録~ first appeared on 診療放射線技師がPythonをはじめました。.]]>今回はその順番に従い、担当を割り当て最終的に一行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関数を使います。
作成したコードは以下となります。
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が表示されていませんが気にしないでください・・・・
クエリを選択した状態で、メニューバー「作成」⇒「その他のフォーム」⇒「複数のアイテム」を選択します。
これだけで、少し見栄えが良くなった表示ができます。
いざ、データを登録すると以下のように表示されるようになります。
いかがでしたか?
今回は、決めた当直順に従って担当を割り振り、日当直一覧表示するまでを行いました。
次回は、代休が発生する日をリストアップし、代休消化の日を登録。
一目で代休発生日と代休消化予定を確認できるまでを行いたいと思います。
お疲れ様でした。
The post microsoft ACCESSで勤務管理④~担当を順番に割り振り、日当直一覧表示~ first appeared on 診療放射線技師がPythonをはじめました。.]]>そのためにはまず、在籍している技師のテーブルを作成し、当直順のテーブルを作成します。その後、効率的に登録できるフォームを作成していきます。
この作業は簡単に終わらせてしまいましょう。
まずはメニューバーから「作成」タブを選択しフィールドを以下の図のように作成します。ちなみに、「在籍」のフィールドは今後の拡張を考えて作成していますので、今回は作成しなくても問題ありません。
テーブル名は「技師」としました。
メニューバーの「ホーム」を選択し、一番左の「表示」をクリックします。
分かりやすいようにIDが1番の人は名前を「一番」として付けてみました。これで、順番に登録されているか分かりやすくなります。私は35人分ほど登録しました。
「技師」のテーブルの作業はこれで終了です。
それでは、当直順のテーブルを作成していきます。
今回も、メニューバーの「作成」タブよりテーブルを作成します。
今回は前回とはちょっとことなり、当直IDはオートナンバー型は使用せず、整数型とします。理由としては、当直順は技師の退職や異動といったことで変更することになります。オートナンバー型にしておくと、テーブルの登録を一度全部削除して再度登録し再度登録すると削除する前の番号を引き継いでしまいます。これはちょっと面倒なことになるので今回はオートナンバー型を使用しませんでした。
今回、このテーブルには直接データを登録することはしません。フォームを使用して登録していきますので、ここまでで終了です。
日当直順を登録するフォームを作成します。登録方法としてはフォーム上にボタンを配置し、そのボタン上に技師名を表示、ボタンを押すことで日当直順を登録できるフォームを作成します。
まず、私のいる職場で技師数は最大で45名ぐらいだろうと予想していますので、とりあえず、45個のボタンを配置しておきます。
縦15行、横3列で合計45個のボタンを配置しました。その際、一番初めのボタンは「ボタン1」として配置しその後は連番となるように配置しました。
理由としては、テーブル「技師」のレコード番号と一致させるためです。
まずは、このフォームを保存しておきましょう名前は「F_当直順設定」としました。
右側にリストボックスを配置します。リストボックスは以下となります。
このリストボックスは登録した順番を表示するためのものです。
適当な大きさに設定しておきましょう。
それでは、フォームが開かれた時にボタンに技師の名前が表示されるように設定しましょう。
フォームのどこかで右クリックします。「イベントのビルド」 ⇒ 「コードビルダ―」を選択します。
VBAの画面が表示されるので、上部の左側選択部分で「Form」右側を「Load」もしくは「Open」を選択します。
一度、すべてのボタンを初期化しておきます。初期化の条件としてすべてのボタンが押せる状態に変更し、ボタン上の表示を「–」しておきます。
これをボタン45個に設定していきます。
For ini = 1 To 45 Me("コマンド" & ini).Enabled = True Me("コマンド" & ini).Caption = "--" Next ini
初期化が終わったら、技師のテーブルに登録されている技師名を表示していきます。
その際、技師のテーブルを参照するコードはDlookupというコードを使います。
Dlookup(”探したいフィールの値”,”参照するテーブル”,”検索条件”)
今回の場合、技師のテーブルの名前が知りたいので初めに「名前」、真ん中にテーブル名ですので「技師」、そして検索条件で技師IDが「i」番目のレコードということになるので
gishi_name = DLookup(“[名前]”, “技師”, “[技師ID] = ” & i)
という感じになります。
技師の登録が無い場合、ボタンの表示を消すコードも足しておきました。
For i = 1 To 45 gishi_name = DLookup("[名前]", "技師", "[技師ID] = " & i) If IsNull(gishi_name) Then Me("コマンド" & i).Visible = False Else Me("コマンド" & i).Caption = gishi_name End If Next i
フォームが開かれた時のコードをまとめると以下となります。
Private Sub Form_Load() DoCmd.SetWarnings WarningsOn:=False For ini = 1 To 45 Me("コマンド" & ini).Enabled = True Me("コマンド" & ini).Caption = "--" Next ini For i = 1 To 45 gishi_name = DLookup("[名前]", "技師", "[技師ID] = " & i) If IsNull(gishi_name) Then Me("コマンド" & i).Visible = False Else Me("コマンド" & i).Caption = gishi_name End If Next i リスト52.Value = 1 End Sub
フォームに戻り、リストに当直順を表示する準備をします。しかし、当直順テーブルをそのまま表示すると当直IDと技師IDだけの表示となり技師名が表示されません。なので、クエリを作成します。
「クエリデザイン」をクリックします。
テーブルの一覧が表示されるので「技師」と「当直順」のテーブルをダブルクリックします。
「当直順」テーブルの「技師ID」と「技師」テーブルの「技師ID」を繋ぎます。ドラックドロップの要領で繋ぎます。すると線でつながれますのでその線をクリックして右クリック「結合プロパティー」を選択します。この結合は当直順から技師のテーブルを見に行きますので下の図のような選択となります。
完了したら、「当直順」テーブルの「当直ID」、「技師」テーブルの「技師ID」、「技師」テーブルの「名前」をダブルクリックしていくと下の図のようになります。
また、表示は当直順に表示したいので当直IDの並び替えの部分を「昇順」に設定しておいてください
そしたら、保存します。名前は「K_日当直順」としました。
フォームに戻り、当直順のリストを選択します。プロパティーでデータタブ内の「値集合タイプ」で「テーブル/クエリ」を選択し、その上段「値集合ソース」で先ほどのクエリを選択します。
続いてフォームのボタンを押した日当直順ときに登録できるコードを書いていきます。
流れとしては、日当直担当者文のレコードを作成し、技師のボタンを押すことでテーブルに技師コードを登録していく流れにしますのでまずは、日当直担当者分のレコードを作成する作業に入ります。
まずは、日当直担当者数を指定できるコンボボックスを作成します。また、その右隣にボタンを設置しておきます。
先ほど作成したリストボックスの上あたりに私は設置しました。
コンボボックスは下図のアイコンで作成できます。
設置をしたら、値を設定します。プロパティーシートで「値集合ソース」に数値を「,」で区切って入力していきます。
また、既定値を適当な数字に設定しておきましょう。
それでは、動作設定に入っていきます。
先ほど設置したボタン上で右クリックし、「イベントのビルド」⇒「コードビルダ―」を選択します。
このボタンの動作は、当直順のテーブルを一度全部削除し、当直担当者分のレコードを作成するコードを書いていきます。
ボタンが押された時にいきなり削除するのではなく、メッセージボックスで確認をとることにします。
ans = MsgBox("リセットしてもいいですか?", vbOKCancel) If ans = 2 Then Exit Sub
上記コードではansという変数にメッセージボックスの戻り値を格納しています。この場合、キャンセルボタンが押された時は「2」という値が返ってくるので、もしansの値が「2」だった場合はコードを終了します。
メッセージボックスの戻り値が「2」以外の場合に当直順のテーブルのレコードを削除します。これもSQL文を使います。
sql_delete = "delete from 当直順" DoCmd.RunSQL sql_delete
次に当直担当者分のレコードを作成していきます。
SQL文を使います。コードは以下となります。以下コードで「テキスト56」となっていますが、当直担当者名を入力する部分を、はじめテキストボックスで作成してしまったので、このような表記になっていますがここは、先ほど作成したコンボボックス名を入力してください。
For i = 1 To テキスト56 sql_insert = "INSERT INTO 当直順 VALUES(" & i & ", null)" DoCmd.RunSQL sql_insert Next i リスト52.Requery
sql_insert = “INSERT INTO 当直順 VALUES(” & i & “, null)”
の「null」ですが、当直順テーブルには「当直ID」、「技師ID」のフィールドがあって技師IDの部分には値を入力しないということを意味しています。ここの部分は、技師のボタンを押すことで埋めていきます。
リスト52.Requery
は当直順を表示しているリストを更新するコードです。
それでは、技師ボタンの動作設定をしていきます。
ボタンが押された時に行う動作は、押されたボタンに表示されている技師の技師IDを当直順のテーブルに登録していきます。IDはボタンの番号と一致するように設定してきました。
一つ一つのボタンに登録のコードを書いていくと変更があったときに大変な作業になるので、登録するコード部分だけ別でプロシージャ―を作成して、ボタンが押されたらボタンの番号を引数に、プロシージャ―を呼び出すようにします。
それでは、まず登録するプロシージャーを作成します。プロシージャ―名は「登録」としました。ボタンを押した際に引数を渡されますので、プロシージャ―名の後のカッコ内に受ける引数の名前(変数名)と型を記載しておきます。
下のコードでは、渡された引数は「登録」のプロシージャ―内で「ID」という変数名で扱われ、整数型として受けます。
それでは、登録のコードを書いていきます。
SQL文を使います。当直順のテーブルのレコードを更新するのでUPDATE文を使用します。コードとしては以下のようになります。リスト52とは当直順が表示されているリストになります。
テーブルに登録しただけではリストは更新されないので、更新のコードも足しておきます。
Private Sub 登録(ID As Integer) sql_update = "update 当直順 SET 技師ID = " & ID & " where 当直ID = " & リスト52.Value & ";" DoCmd.RunSQL sql_update リスト52.Requery リスト52.Value = リスト52.Value + 1 Me("コマンド" & ID & "").Enabled = False End Sub
それでは、それぞれのボタンに機能を付けていきましょう。
ボタンが押されたら「登録」というプロシージャ―を呼び出し、技師IDを引数として渡します。技師IDはボタンの番号となります。
プロシージャ―の呼び出しは、プロシージャ―名を書くだけです。その後に引数を書けばOKです。
Private Sub コマンド1_Click() 登録 1 End Sub
上記コードをボタンの数だけ作成していきます。
ボタンの番号と、引数(登録の後の数字)として渡している数があっていることを確認してください。
追加機能です。詳しい説明は省きますが、当直順のリストをダブルクリックすることで修正できる機能も付けてみました。コードは以下になります。
Private Sub リスト52_DblClick(Cancel As Integer) sql_update = "update 当直順 SET 技師ID = NULL WHERE 当直ID = " & ラベル55.Caption & ";" DoCmd.RunSQL sql_update リスト52.Requery For i = 1 To 45 If DCount("技師ID", "当直順", "技師ID =" & i) > 0 Then Me("コマンド" & i).Enabled = False Else Me("コマンド" & i).Enabled = True End If Next i End Sub
これで、当直順を登録するところまで完了しました。
それでは、実際に動かしてみてください。
いかがでしたか?きちんと動作しましたか?
次回は今回設定した当直順を、順番に割り振っていき一覧表を作るところまで説明できればいいなと思っています。
お疲れ様でした。
The post microsoft ACCESSで勤務管理③~日当直順の決定 ~ first appeared on 診療放射線技師がPythonをはじめました。.]]>今回は、システムをどのような仕様に仕上げていくのかを考えてみたいと思います。
まずは、最終的な形を考えてみます。
をとりあえずの仕様とします。
仕様ができたところで、システムの大きな流れを考えてみます。
という流れで行きたいと思います。
カレンダーの作成です。まずは、カレンダーのテーブルを作成します。
メニューバー「作成」タブ内のテーブルをクリックします。フィールドの設定していきます。
まずは、使わないかもしれませんがオートナンバー型のIDというフィールドは作成しておきましょう。続いて、日付/時刻型の日付というフィールド。
後は休みの日には代休をカウントするための「代休」というフィールドを数値型で作成。あと、使わないかもしれませんが翌日が代休の時の為のフィールド「翌日代休」も作成します。
続いて、登録方法を考えます。Excel等で作成してインポートというのがシステム側としては一番楽なのですが、使用者を考えると毎月の祝日と祭日を登録していくのは面倒です。なので以下のようなフォームでの登録方法としてみました。
見た目にはあまりこだわっていないので、センスがないというのは無しで・・・・・。ちなみに、このカレンダーは1年分登録ができるように371個のトグルボタンを配置しました。トグルボタンとは、OnとOffを指定できるボタンです。もし、休日ならばOn平日ならばOffです。
開始日付と終了日付を指定して「作成」ボタンを押すことで日付が書かれたボタンが表示され、休日なら自動でボタンがOnになる仕様です。休日、祭日が間違っていなければ「登録」ボタンでテーブルに登録を行います。
それでは、フォームを作成していきましょう。
まずは、トグルボタンを配置していきます。トグルボタンは上のアイコンになります。日曜日から順に土曜日までを1行になるように7個配置します。
その後は、一行丸ごと選択してコピー&ペーストで複製していきます。
その際、トグルボタン名が「トグル152」「トグル153」のように数字が連番になるように注意してください。
あと、配置したトグルボタンの上に曜日をラベルで配置しておくとわかりやすいです。
終わりましたら続いて、カレンダーを作成する日付と終了する日付を指定します。これはコンボボックスで作成します。
コンボボックスはデザインタブ内の上のアイコンになります。
配置が完了したらプロパティーを開いて書式を「日付(L)」とします。これを終了日も同じように作成します。
続いて、作成ボタンと、登録ボタン、そしてメニューボタンを作成します。
メニューボタンは上の画像のアイコンになります。
3つ配置します。動作は日ほど設定しますのでとりあえずは、配置だけにしておきます。
配置したら、ボタンの上の表題を「作成」、「登録」、「メニュー」としておいてください。
とりあえず、フォームの作成は完了です。保存しましょう。名前に関してはのちにVBAでコードを書いていくのでわかりやすいように「F_calender」としましょう。「F_」はフォームという意味です。のちに組むクエリなのでは「K_」とルールを決めて名前を付けると日にわかりやすくなります。
それでは、コードを書いてきます。
日付を指定して作成ボタンを作成した際に、トグルボタンに日付を表示するわけですが、初めの日が何曜日かを判定してどのトグルボタンから表示していくかを決めます。また、開始日前のトグルボタンは非表示にしておくとわかりやすいのでまずはその処理から始めていきます。
作成ボタンの上で右クリックをします。「イベントのビルド」⇒「コードビルダー」を選択します。
以下の画面が出てきます。
もし出てこない場合は、ボタンのプロパティーで「イベント」タブ「クリック時」の[埋め込みマクロ]を削除してください。
ボタンを押したときに、下の画面の
「Private Sub コマンド2_Click()」から「End Sub」までのコードが実行されることになります。
まずは、開始日の曜日を判定するところから始めます。日付の曜日判定にはWeekday()関数を使います。カッコ内に日付を入れることで曜日が数字として返ってきます。返ってくる数値は曜日によって以下の表のようになります。
日曜日 | 1 |
月曜日 | 2 |
火曜日 | 3 |
水曜日 | 4 |
木曜日 | 5 |
金曜日 | 6 |
土曜日 | 7 |
変数startdayとして開始日の曜日を取得します。
startday = Weekday(Me!day_start) – 1
私は、開始日コンボボックス名を「day_start」と変えてしまったので、変更していない方は
startday = Weekday(Me!コンボ1) – 1
に様に、開始日のコンボボックスの名前欄に書かれている名前に書き換えてください。
startday = Weekday(Me!day_start) – 1の「-1」は何をしているのかというと
設置したトグルボタンの始まりが「トグル0」と0から始まっていると思うので-1をしています。
開始日の曜日が取得できたのでトグルボタンの開始日以前のトグルボタンを非表示にする作業をしたいと思います。とりあえず、日曜日から土曜日までのトグルボタンをすべて非表示にします。この作業はfor文を使って繰り返していきます。
Private Sub コマンド2_Click() For i = 0 To 6 Me("トグル" & i).Visible = False Next i End Sub
いざ、フォームを表示して作成ボタンをクリックしてみてください。
フォームを表示するのはツールバーの「ホーム」タブの一番左。フォームビューを選択します。
一番上の行のトグルボタンが消えているのが確認できます。
それでは、曜日によって表示するようにしましょう。先ほど取得した曜日の数字がトグルボタンの数字以上であればトグルボタンを表示するコードを書いていきます。
先ほどのコードに以下を追加します。
For i = 0 To 6 If startday <= i Then Me("トグル" & i).Visible = True End If Next i
いかがでしょうか?
きちんと木曜日からトグルボタンが表示されていると思います。
それでは、トグルボタンに曜日を表示させていきましょう。
これもfor文で終了日まで繰り返していきます。開始日から、終了日までの日数を計算します。diff_dayという変数に入れます。
期間を計算する計算式は以下となります
diff_day = DateDiff(“d”, Me!day_start, Me!day_end)
DateDiff(“d”, 開始日,終了日)で日単位での期間が計算できます。
ちなみに、終了日のコンボボックス名をday_endとしてしまっているのでそこは皆さんの環境によって書き換えてください。
それではfor文で書いていきましょう
以下のコードを追加してください。
diff_day = DateDiff("d", Me!day_start, Me!day_end) For i = 0 To diff_day + 1 Me("トグル" & startday + i).Caption = Format(day_start + i, "mm/dd") next i
きちんとトグルボタンに日付が表示されたと思います。なお、期間+1日まで日付を表示したのはちょっと分け合ってですが、そこは後々書きます。
日付の表示までできましたが、いちいち休日の日のボタンを押していくのは面倒なのでプログラムで解決してしまいましょう。
まずは、日曜日の設定ですが、初めに出てきたweekday関数で簡単に解決できます。
If Weekday(day_start + i) - 1 = 0 Then Me("トグル" & startday + i).Value = True
当院は、第2土曜日が休診日になるのでその設定をします。
第2土曜日の判定をするのは先ほどのweekday関数で戻り値が土曜日である6であることと、第2週目であることで判定します。
第2週目ということを判定するのは日付を7で割った答えが2であればいいのですが、単純にやってしまうと間違ってしまいます。
まずは、日付に6を足してあげる必要があります。例えば、1日が土曜日であった場合、7で割ると0になってしまい、次の週の8日が1週目となってしまいす。そのため、日付に6を足してあげて7で割ることで何週目かを求めることができます。
第2土曜日を判定するコードは以下となります。
If Weekday(day_start + i) - 1 = 6 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" & startday + i).Value = True
次に各月での祝祭日の設定になります。これは、月によって処理を変えていきますので「select case」の関数によって処理を変えていきます。
'各祝祭日設定 Select Case Month(day_start + i) Case 1 If Day(day_start + i) = 1 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 2 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 3 Then Me("トグル" & startday + i).Value = True If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" & startday + i).Value = True If Weekday(day_start + i) - 1 = 6 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" & startday + i).Value = True Case 2 If Day(day_start + i) = 11 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 23 Then Me("トグル" & startday + i).Value = True Case 3 If Day(day_start + i) = 21 Then Me("トグル" & startday + i).Value = True Case 4 If Day(day_start + i) = 29 Then Me("トグル" & startday + i).Value = True Case 5 If Day(day_start + i) = 3 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 4 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 5 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 15 Then Me("トグル" & startday + i).Value = True Case 7 If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 3 Then Me("トグル" & startday + i).Value = True Case 8 If Day(day_start + i) = 11 Then Me("トグル" & startday + i).Value = True Case 9 If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 3 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 22 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 23 Then Me("トグル" & startday + i).Value = True Case 10 If Weekday(day_start + i) - 1 = 1 And (Day(day_start + i) + 6) \ 7 = 2 Then Me("トグル" & startday + i).Value = True Case 11 If Day(day_start + i) = 3 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 23 Then Me("トグル" & startday + i).Value = True Case 12 If Day(day_start + i) = 29 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 30 Then Me("トグル" & startday + i).Value = True If Day(day_start + i) = 31 Then Me("トグル" & startday + i).Value = True End Select
いかがでしょうか?きちんと休日、祭日の設定ができていますね。
もし、間違っていた場合はトグルボタンで作成しているので変更が可能になっています。
ちなみに、終了日以降のトグルボタンの非表示は面倒になってしまったので省略してしまいました……
カレンダーの表示は完了しましたが、テーブルへの登録が完了していませんのでこれからはカレンダーへの登録をしていきます。
コードとしてはSQL文を使って登録をしていきます。
テーブルへのデータ登録を行うSQL文はINSERT文を使います。
INSERT INTO 登録するテーブル ([フィールド1],[フィールド2],[フィールド3]) VALUES(値1,値2,値3)
これを変数に入れ、VBAで実行する形となります。
テーブル「calender」への登録は日付、代休、翌日代休を登録していきます。
登録していく日付はトグルボタンに表示されている日付を登録し、トグルボタンがTRUEの場合は、holidayという変数を1にします。翌日の代休に関しては次のトグルボタンの状態を見て判断をします。
なお、土曜日に当直の場合0.5日分の代休が発生するので、土曜日の場合は初めにholidayの変数に0.5を代入し、第2土曜日であればholidayに1に変更するという作業にします。
'当日の代休設定 If Weekday(day_start + i) = 7 Then holiday = 0.5 If Me("トグル" & startday + i).Value = True Then holiday = 1 '翌日の代休設定 If Weekday(day_start + i) + 1 = 7 Then next_holiday = 0.5 If Me("トグル" & startday + i + 1).Value = True Then next_holiday = 1
そうしましたらSQL文を作成、実行します。
'sql実行 sql_insert = "INSERT INTO calender ([日付],[代休],[翌日代休]) VALUES (#" & Me!day_start + i & "# , " & holiday & " , " & next_holiday & ")" DoCmd.RunSQL sql_insert
上記コードをfor文を使って設定したい日数分だけ繰り返します。
なお、最終日は翌日の代休が分からないのでわざと1日カレンダーの作成を行いました。そして、テーブルへの登録を行う際に登録回数を1回減らすことで登録日数分にします。
いかに登録ボタンが押された時のコードを書きます。
Private Sub コマンド397_Click() '登録ボタン Dim startday As Integer DoCmd.SetWarnings WarningsOn:=False startday = Weekday(Me!day_start) - 1 diff_day = DateDiff("d", Me!day_start, Me!day_end) holiday = 0 next_holiday = 0 For i = 0 To diff_day insert_day = day_start + i today_week = Weekday(day_start + i) '当日の代休設定 If Weekday(day_start + i) = 7 Then holiday = 0.5 If Me("トグル" & startday + i).Value = True Then holiday = 1 '翌日の代休設定 If Weekday(day_start + i) + 1 = 7 Then next_holiday = 0.5 If Me("トグル" & startday + i + 1).Value = True Then next_holiday = 1 'sql実行 sql_insert = "INSERT INTO calender ([日付],[代休],[翌日代休]) VALUES (#" & Me!day_start + i & "# , " & holiday & " , " & next_holiday & ")" DoCmd.RunSQL sql_insert holiday = 0 next_holiday = 0 Next i End Sub
それでは、動作確認をしてみましょう。
フォームビューで開いて、開始日と終了日をしていします。
その後、作成ボタンを押してください。
休日設定が間違っていなければ登録ボタンを押すことでテーブルに登録されます。
calenderのテーブルを開いてきちんと登録されているか確認してみてください。
いかがでしたか?
次回は当直順を決め、それを順番に埋めていき当直表を作成する作業を紹介したいと思います。
お疲れ様でした。
The post microsoft ACCESSで勤務管理②~仕様を考える と カレンダー編~ first appeared on 診療放射線技師がPythonをはじめました。.]]>