Microsoft Access Club >初心者講座 >休暇申請管理ソフト >このページ >次頁 - 前項  サイト内検索


入力フォーム_プロシージャ_3:休暇申請管理ソフト



続けて、一気にいきます。そうそう、9月に入りやっぱ秋の気配が感じられる今日この頃です。 今日は、オプショングループを取り上げます。

オプショングループの「更新後処理」イベント

Private Sub 選択_AfterUpdate()

    '割り当てます。
    vardlook_3 = DCount("TD", "qry_有休", "[職員ID] = [職員] AND [適用] = '有休'")

    '隠しテキストボックスに代入します。
    Me.年月日 = Me.コントロール.Value

    '何日以前までの申請を受け付けます。コントロールは「tbl_kanyo」で行います。
    If Me.年月日 < Date - ChoiceSelect(7) Then
        MsgBox "過去 " & ChoiceSelect(7) & " 日を遡る休暇申請はできません。" & _
		Chr(13) & "必要であれば、" & varkantoku & _
		"に相談して下さい。", 16, varkantoku
    End If

    '社員コードが未入力であれば、実行を止めます。
    If IsNull(Me.氏名) Then
        MsgBox "まず社員コードを入力して下さい。", 16, varkantoku: Me.選択 = ""
        End
    End If
        
    '以下、Subプロシージャを呼び出しています。
    Call SubRoting_1
    Call SubRoting_2
    Call SubRoting_3
    Call SubRoting_4
    Call SubRoting_5
    Call SubRoting_6
    Call SubRoting_7
    Call SubRoting_8
    Call SubRoting_9
    Call SubRoting_10
        
        
    '上記をチェックした後、下記メッセージを表示させます。
    If 1 = MsgBox("下記のとおり申請します。" & Chr(13) & _
                "1.申請者" & Chr(9) & Me![氏名] & Chr(13) & _
                "1.申請日" & Chr(9) & Format([年月日], "yyyy年mm月dd日") & _
                             Format([年月日], "(aaa)") & Chr(13) & _
                "1.適 用" & Chr(9) & ChoiceArray(Me.選択) & Chr(13) & _
                "以上でよければ「OK」をクリックして下さい", 1, varkantoku) Then
        
        'Choose(Me.選択, "有休", "代休", "振替", "特休", ChoiceSelect(1), 
        'ChoiceSelect(2), ChoiceSelect(3), ChoiceSelect(4))
        Select Case Me.選択    'データをテーブルに格納します。
            Case 1
                Me!有休S!適用詳細 = "有休_" & Format(Date, "mm/dd")
                Me!有休S!適用 = "有休"
                MsgBox "今回で本年度の有休残余日数は " & _
                ChoiceSelect(8) - 1 - vardlook_3 & " 日です。", 16, varkantoku
            Case 2
                Me!有休S!適用詳細 = "代休(" & Format(varinput_1, "mm/dd") & ")"
                Me!有休S!適用 = "代休"
            Case 3
                Me!有休S!適用詳細 = "振替(" & Format(varinput_1, "mm/dd") & ")"
                Me!有休S!適用 = "振替"
            Case 4
                Me!有休S!適用詳細 = "特休※" & varinput_2
                    Me!有休S!適用 = "特休"
            Case 5
                Me!有休S!適用詳細 = ChoiceSelect(1) & "_" & Format(Date, "mm/dd")
                Me!有休S!適用 = ChoiceSelect(1)
            Case 6
                Me!有休S!適用詳細 = ChoiceSelect(2) & "_" & Format(Date, "mm/dd")
                Me!有休S!適用 = ChoiceSelect(2)
            Case 7
                Me!有休S!適用詳細 = ChoiceSelect(3) & "_" & Format(Date, "mm/dd")
                Me!有休S!適用 = ChoiceSelect(3)
            Case 8
                Me!有休S!適用詳細 = ChoiceSelect(4) & "_" & Format(Date, "mm/dd")
                Me!有休S!適用 = ChoiceSelect(4)
        End Select

        Forms!frm_有休M!有休S!日付 = Me.年月日
        DoCmd.Requery "有休S"
        Me.選択 = ""

    End If
    
    DoCmd.Requery "リスト"
    DoCmd.Requery "リスト2"
    Me.有休S.SetFocus
    DoCmd.GoToRecord , "", acNewRec
    Me.選択 = ""

End Sub
解説

このオプショングループ関連が最大の難関です。有休、代休等の申請を受付するところです。

    '隠しテキストボックスに代入します。
    Me.年月日 = Me.コントロール.Value

Me.年月日は、この入力フォーム内にある隠しテキストボックス名です。Me.コントロール.Valueは、カレンダーコントロールでクリックした該当の年月日です。
この式で、カレンダーコントロールから隠しテキストボックスにデータが移行します。

    '何日以前までの申請を受け付けます。コントロールは「tbl_kanyo」で行います。
    If Me.年月日 >= Date - ChoiceSelect(7) Then

休暇申請は事前申請が基本ですが、やむを得ず事後になる場合もありますね。
この一行は、過去何日まで遡って申請ができるのかを制御します。これは、各会社の実情に合わせられるように設定しているからです。
環境設定テーブルにて設定変更が可能にしています。

    '社員コードが未入力であれば、実行を止めます。
    If IsNull(Me.氏名) Then
        MsgBox "まず社員コードを入力して下さい。", 16, varkantoku: Me.選択 = ""
        End
    End If

フォームが開くと同時に、申請ボタンをクリックする社員を想定しています。社員IDが未入力の場合は、このIF構文でチェックしています。

Subルーチン関数の解説

以下、Subプロシージャを呼び出しています。

    Call SubRoting_1   '-- A
    Call SubRoting_2   '-- B
    Call SubRoting_3   '-- C
    Call SubRoting_4   '-- D
    Call SubRoting_5   '-- E
    Call SubRoting_6   '-- F
    Call SubRoting_7   '-- G
    Call SubRoting_8   '-- H
    Call SubRoting_9   '-- I
    Call SubRoting_10  '-- J
解説

このSubルーチン関数は、本体となるプロシージャから独立できる構文を、Subプロシージャとして独立させているだけです。他のプロシージャから呼び出されて初めて、動作するといった代物です。

Subルーチン A

有給休暇の許可要件をチェックします。Years_OpenとYears_Closeの独自関数を作製し使用しています。

Sub SubRoting_1()

    Dim strmsg As String
    
    strmsg = "有給休暇取得が許可されていないか、" & _
             "「環境設定」との連携が異なっている可能性があります。" & _
             vbNewLine & "至急、" & varkantoku & "まで連絡して下さい。"
    If Me.年月日 <= Years_Open(Me.職員) Or _
       Me.年月日 >= Years_Close(Me.職員) And _
       Me.選択 = 1 Then
        MsgBox strmsg, 16, varkantoku
        Me.選択 = ""
        End
    End If
End Sub

有休休暇は、一年間で付与される日数が決まっていますね。それも社員ごとに異なります。また、会社ごとに付与期間が異なります。例えば、1月から12月、4月から翌年3月、というように・・・。

このサブルーチン関数は、指定された付与期間内で、残余日数のチェックを行う仕様です。

---  付与期間を求めるFunctionプロシージャ  ---

例えば、1月から12月の年度と4月から3月の年度と仮定した場合、3月の有休取得は、前者は翌年3月、後者は当年3月になります。ここがややっこしいところです。

Function Years_Open(str職員ID) As Date

    'frm_有休Mフォームの Private Sub 選択_AfterUpdate() に使用しています。
    Dim strdlup_1 As Long
    Dim strdlup_2 As Long

    strdlup_1 = DLookup("[年]", "[tbl_社員マスター]", "[入力者ID]=" & str職員ID)
    strdlup_2 = DLookup("[開始月]", "[tbl_kankyo]", "[ID]=1")
    Years_Open = DateSerial(strdlup_1, strdlup_2, 1)

End Function
 
Function Years_Close(str職員ID) As Date
    
    'frm_有休Mフォームの Private Sub 選択_AfterUpdate() に使用しています。
    Dim strdlup_1 As Long
    Dim strdlup_2 As Long

    strdlup_1 = DLookup("[年]", "[tbl_社員マスター]", "[入力者ID]=" & str職員ID)
    strdlup_2 = DLookup("[開始月]", "[tbl_kankyo]", "[ID]=1")
    Years_Close = DateSerial(strdlup_1, strdlup_2 + 12, 1) - 1

End Function

難しいと思いますが、ざーと目を通して下さい。環境設定のテーブルに「開始月」を設定できるフィールドを用意しています。4月から新年度の場合は、 4 と入力します。ちなみに、社員テーブルには、「付与年度」と「保持日数」フィールドがあります

Subルーチン B
本年度の有給休暇付与日数が入力されていなければ、下記メッセージを表示し進行を止めます。

Sub SubRoting_2()

    Dim strmsg As String
    
    strmsg = "本年度の有給休暇付与日数が入力されていません。" & vbNewLine & _
            "至急、" & varkantoku & "まで連絡して下さい。"

    If Me.選択 = 1 Then
        If IsNull(ChoiceSelect(8)) Then
            MsgBox strmsg, 16, varkantoku
            Me.選択 = ""
            End
        End If
    End If

End Sub

 

解説

tbl_社員マスターテーブルの保持日数フィールドが空白であれば、メッセージを表示し以降の進行を止めます。
ChoiceSelect(8) は、Function関数で引数 8 を持つものです。元をただせば、

  • DLookup("[保持日数]", "[tbl_社員マスター]", "[入力者ID]=[職員ID]")

です。

Subルーチン C
二重登録を防止し、進行を止めます。

Sub SubRoting_3()

    Dim strmsg As String
    
    strmsg = "この日付は既に申請又は取得済みです。"
    If Not IsNull(DLookup("[日付]", "qry_有休_CK", _
        "[職員ID] = [職員] AND [日付] =[年月日]")) Then
        MsgBox strmsg, 16, varkantoku
        Me.選択 = ""
        End
    End If
End Sub

解説

二重登録の防止を行います。qry_有休_CKと云うクエリを作成します。

 

 

このプロシージャの組み方は、DLookup関数を利用して Null値を返さない場合(同一の日付で既に申請済みである)は、メッセージを表示し進行を止めます。

Subルーチン D

日曜日に各種休暇日として受け付けない場合(環境設定フォームで行う)は、下記メッセージを表示させ取り消します。

Sub SubRoting_4()

    Dim strmsg As String
    
    strmsg = "日曜日を休暇取得申請していますので、申請を取り消します"

    If DLookup("[日曜日の有無]", "[tbl_kankyo]", "[ID]=1") = True Then
    
        If WeekDay(Me.年月日) = 1 Then
            MsgBox strmsg, 16, varkantoku
            Me.選択 = ""
            End
        End If
        
    End If

End Sub

解説

このプロシージャは、日曜日に休暇申請を受け付けないと環境設定している場合は、メッセージを表示し進行を止めます。WeekDay()関数は日曜日の場合 1 を返します。

Subルーチン E

例えば、休暇申請が[tbl_休暇不可]に収載されている日である場合は、下記メッセージを表示させます。

Sub SubRoting_5()

    Select Case ChoiceSelect(10)
        Case 1
            MsgBox "この日は " & ChoiceSelect(11) & _
                    " であるため休暇申請できません。" & _
                    "よって申請を取り消します", 16, varkantoku
            Me.選択 = ""
            End
        Case 2
            MsgBox "この日は" & ChoiceSelect(11) & "であるため、" & _
                    "休暇申請する場合は事前に" & varkantoku & _
                    "へ相談して下さい。", 16, varkantoku
            Me.選択 = ""
            End
    End Select

End Sub
解説

どの会社にも、休暇を取得して欲しくない日があるでしょう。

このような場合を想定して、[tbl_休暇不可]テーブルに当該日を入力し、併せて識別ナンバーを 1 にすると休暇申請が不可になり、2にすると相談しなさいとのメッセージを表示し進行を止めます。

Subルーチン F

tbl_kankyoで個人別に有休の付与日数を入力していますので、残余日数が 0 であれば、下記メッセージを表示させます。

Sub SubRoting_6()

    If ChoiceSelect(8) <= vardlook_3 And Me.選択 = 1 And ChoiceSelect(8) <> 0 Then
        MsgBox "既に今年度有休付与日数 " & ChoiceSelect(8) & _
               " 日間を取得もしくは申請済みです。" & Chr(13) & _
                "よって、有休休暇の申請ができません。", 16, varkantoku
        Me.選択 = ""
        End
    End If
    
End Sub

解説

有休の保持日数が 0 になり、更に有休の申請を行った場合は、エラーメッセージを表示させ進行を止めます。

Subルーチン G

tbl_kankyoで個人別に有休の付与日数を入力していますので、付与日数が 0 であれば、下記メッセージを表示させます。

Sub SubRoting_7()

    If ChoiceSelect(8) = 0 And Me.選択 = 1 Then
        MsgBox "今年度の有休付与日数が付与されていません。" & _
               "疑問があれば申し出て下さい。", 16, varkantoku
        Me.選択 = ""
        End
    End If

End Sub

解説

有休の付与日数が 0 の社員(新規社員等)が有休申請を行った場合は、メッセージを表示させ進行を止めます。

Subルーチン H

同一日の休暇取得可能人数を制限する場合は、環境設定フォームで入力した後に効力が生じます。

Sub SubRoting_8()

    Dim varDCount As Variant

    varDCount = DCount("[No.]", "[tbl_有休S]", "[日付]=[年月日]")

    If varDCount >= ChoiceSelect(9) Then
        MsgBox "同一日の休暇取得可能人数である " & ChoiceSelect(9) & _
               " 人が休暇取得もしくは申請済みです。" & Chr(13) & _
                "よって、この日で申請する場合は" & varkantoku & _
                "まで相談して下さい", 16, varkantoku
        Me.選択 = ""
        End
    End If

End Sub

解説

会社によっては、同一日に休暇取得(申請)人数を制限したい場合もあるかと思います。
その場合は環境設定フォーム(テーブル)で制限人数を入力します。申請人数を超えれば、メッセージを表示し進行を止めます。

Subルーチン I
代休又は振替の場合は、下記入力を促します。
Sub SubRoting_9()

    If Me.選択 = 2 Or Me.選択 = 3 Then
        varinput_1 = InputBox("どの日の出勤の代休(振替)取得分" & _
                    "であるか入力して下さい。" & Chr(13) & _
                    "入力形式は、西暦で 9999/99/99 です。", varkantoku)
        'この流れの中で、年月日と認識できない場合は、メッセージを表示します。
        If IsDate(varinput_1) = False Then
            MsgBox "正しい月日を入力して下さい。" & _
                    "一旦、申請を取り消します。", 16, varkantoku
            Me.選択 = ""
            End
        End If
            
    End If
        
End Sub
解説

オプショングループは 8 個の選択オプションを設けて、1〜4までは、それぞれ有休、代休、振替、特休と定義しています。残りの5〜8は、各会社で任意に設定(環境設定テーブル)が可能です。但し、制御は何も行うことができません。

代休と振替については、何日の分なのかを入力させる必要があります。よって、InputBox関数を利用します。

Subルーチン J
特別休暇の場合は、下記入力を促します。

Sub SubRoting_10()

    If Me.選択 = 4 Then
  
        varinput_2 = InputBox("特別休暇の事由IDナンバーを入力して下さい", varkantoku)
  
        'この流れの中で、数値と認識できない場合は、メッセージを表示します。
        If IsNumeric(varinput_2) = False Then
            MsgBox "特別休暇の事由をIDナンバーで入力して下さい。" & _
                   "一旦、申請を取り消します。", 16, varkantoku
            Me.選択 = ""
            End
        End If
    
    End If

End Sub
解説

特別休暇は各会社によっていろいろと規定されていることと思います。また、事由によって日数が普通は異なります。よって、特別休暇の申請時には、事由IDを入力するようにしています。但し、事由IDによって、日数チェックの制御は行っていません。

Function関数
休暇種別を配列に格納し、データ表示を行う。配列は、0より始まります。

Function ChoiceArray(varComb As Variant)

    Dim My種別 As Variant
    My種別 = Array("有休", "代休", "振替", "特休", ChoiceSelect(1), _
             ChoiceSelect(2), ChoiceSelect(3), ChoiceSelect(4))
    ChoiceArray = My種別(varComb - 1)
    
End Function

 

ページの先頭へ 前ページへ戻る

 


入力フォーム_プロシージャ_3:休暇申請管理ソフト


 

-Microsoft Access Club-