Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the 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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the easy-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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the urvanov-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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the breadcrumb-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 6114

Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the advanced-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 6114

Notice: 関数 _load_textdomain_just_in_time が誤って呼び出されました。lancr ドメインの翻訳の読み込みが早すぎました。これは通常、プラグインまたはテーマの一部のコードが早すぎるタイミングで実行されていることを示しています。翻訳は init アクション以降で読み込む必要があります。 詳しくは WordPress のデバッグをご覧ください。 (このメッセージはバージョン 6.7.0 で追加されました) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php on line 6114

Warning: Cannot modify header information - headers already sent by (output started at /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php:6114) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-content/plugins/all-in-one-seo-pack/app/Common/Meta/Robots.php on line 87

Warning: Cannot modify header information - headers already sent by (output started at /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/functions.php:6114) in /virtual/mcu03iphuk/public_html/radiology-technologist.info/wp-includes/feed-rss2.php on line 8
テーブル | 診療放射線技師がPythonをはじめました。 http://radiology-technologist.info 診療放射線技師のPython日記。解析等で使えるコードを作成、アップしていきたいと思っています。その他いろいろ Wed, 07 Apr 2021 01:33:46 +0000 ja hourly 1 https://wordpress.org/?v=6.7 https://i0.wp.com/radiology-technologist.info/wp-content/uploads/2018/09/cropped-logo5.png?fit=32%2C32 テーブル | 診療放射線技師がPythonをはじめました。 http://radiology-technologist.info 32 32 164362728 microsoft ACCESSで勤務管理④~担当を順番に割り振り、日当直一覧表示~ http://radiology-technologist.info/post-1322 Wed, 07 Apr 2021 01:33:42 +0000 http://radiology-technologist.info/?p=1322 前回は、当直順を決めるまでを行いました。 今回はそ […]

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をはじめました。.]]>
1322