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


入力フォーム_社員ID入力テキストボックス:休暇申請管理ソフト



今回から、一番肝心の休暇申請フォーム frm_有休M の作成に進んでいきます。

休暇申請フォーム frm_有休M の作成

まず、このフォームは開いたら「社員ID」を入力する設計です。さて、「社員IDテキストボックス」はどのように組み立てているのでしょうか?以下進んでいきます。

前回でお話したように、「社員ID入力テキストボックス」(テキストボックス名 職員)は"非連結"にしています。

連結しているテキストボックス(テキストボックス名 職員代入)は非表示(隠しテキストボックス)とし、そこへデータを代入していく形を取ります。 流れを示すと下記のようになります。

  1. フォームが開き、社員IDを 青丸 テキストボックス(非連結)に入力する。
  2. テキストボックスの更新前処理を経て、更新後処理イベントで
  3. 赤丸 テキストボックス(職員IDフィールドと連結)に代入される。

社員ID入力のテキストボックス(上記青丸)の各種イベントに記述しているプロシージャは下記のとおりです。

 更新前処理イベント

Private Sub 職員_BeforeUpdate(Cancel As Integer) '------- A

    Dim strmsg As String
    
    strmsg = "登録されていない職員コードです。再度入力して下さい。" & vbNewLine & _
             "なお、不明の場合は" & varkantoku & "まで連絡して下さい。"

    '登録されていない社員コードが入力されれば、メッセージを表示し進行を止めます。
    If IsNull(ChoiceSelect(5)) Then
        MsgBox strmsg, 16, varkantoku
        Me.職員.Undo
        Cancel = True
        Exit Sub
    End If
    
End Sub
解説

更新前処理イベントを利用して、入力された値が条件に合致しているか否かを判別します。varkantoku は、下記のサブルーチンで得られた値となります。

Function varkantoku()

    'データが未入力であることも考えられるので、Variant型にしています。
    varkantoku = DLookup("[監督者]", "[tbl_kankyo]", "[ID]=1")

End Function

このサブルーチンは、標準モジュールとして作成していますので、全プロシージャ内で利用することができます。

エラーメッセージ

職員テキストボックス に登録されていない社員が自分のIDを入力すると、下記のメッセージが表示されて以降の処理がストップします。

ChoiceSelect(5)とは?

標準モジュールChoiceSelectを作成します。このサブルーチンは引数を持っています。(5)の5が引数というものです。

Function ChoiceSelect(intCount As Integer)

    Select Case intCount
        Case 1
            ChoiceSelect = DLookup("[休暇種別_1]", "[tbl_kankyo]", "[ID]=1")
        Case 2
            ChoiceSelect = DLookup("[休暇種別_2]", "[tbl_kankyo]", "[ID]=1")
        Case 3
            ChoiceSelect = DLookup("[休暇種別_3]", "[tbl_kankyo]", "[ID]=1")
        Case 4
            ChoiceSelect = DLookup("[休暇種別_4]", "[tbl_kankyo]", "[ID]=1")
        Case 5
            ChoiceSelect = DLookup("[入力者ID]", "[tbl_社員マスター]", _
                                                        "[入力者ID]=[職員]")
        Case 6
            ChoiceSelect = DLookup("Network", "tbl_Kankyo", "ID=1")
        Case 7
            ChoiceSelect = DLookup("[過去日]", "[tbl_kankyo]", "[ID]=1")
        Case 8
            ChoiceSelect = DLookup("[保持日数]", "[tbl_社員マスター]", _
                                                        "[入力者ID]=[職員ID]")
        Case 9
            ChoiceSelect = DLookup("[制限人数]", "[tbl_kankyo]", "[ID]=1")
        Case 10
            ChoiceSelect = DLookup("[分類]", "[tbl_休暇不可]", _
                                                        "[不可日付] =[年月日]")
        Case 11
            ChoiceSelect = DLookup("[事由]", "[tbl_休暇不可]", _
                                                        "[不可日付] =[年月日]")
        Case 12
            ChoiceSelect = DLookup("[入力者ID]", "[tbl_社員マスター]", _
                                                        "[入力者名]='管理者'")
        Case Else
            MsgBox "誤った処理です"
        End Select

End Function
DLookup関数の使い方

この関数は該当項目がなければ、Nullを返します。これを利用して、入力された社員コードが tbl_社員マスター テーブルに存在しなければ…という条件節を組み立てています。

ChoiceSelect()プロシージャの引数に 5 を入力すると、Dlookup関数から値を得ることができます。 このDLookup関数の使い方は、きっと他で役に立ちますよ。参考までに、サブルーチンを用いずに直接記述する下記の方法もあります。

サブルーチンを用いない記述方法
Private Sub 職員_BeforeUpdate(Cancel As Integer) '------- B

    Dim strmsg As String
    Dim varDlooupValue As Variant
    
    strmsg = "登録されていない職員コードです。再度入力して下さい。" & _
             vbNewLine & "なお、不明の場合は" & varkantoku & _
             "まで連絡して下さい。"
                
    varDlooupValue = DLookup("[入力者ID]", "[tbl_社員マスター]", _
                                                "[入力者ID]=[職員]")
    
    '登録されていない社員コードが入力されれば、
    'メッセージを表示し進行を止めます。
    If IsNull(varDlooupValue) Then
        MsgBox strmsg, 16, varkantoku
        Me.職員.Undo
        Cancel = True
        Exit Sub
    End If
    
End Sub
解説

一般的に、プロシージャの記述方法として、

  1. ずら〜っと書き込んでいく方法
  2. 処理をプロシージャごとに独立させ他のプロシージャから呼び出していく方法

大きく分けて2通りあります。

できれば、大きな処理ごとにプロシージャを分散させる(サブルーチン化)方法を取り入れたほうがメリットが大きくなると思いますよ。その理由は、

  1. エラーチェックが行ない易い(どの場面でエラーが発生しているのか分かり易い)。
  2. プロシージャ全体長文となった場合、処理の順序立てが後々でも分かり易い。
  3. プロシージャの再利用が行ない易く、効率がよい。

などです。更新前イベントでは、

  • Cancel = True

の構文が、最初から引数として組み込まれています。この一行を記述すると、以降の処理をキャンセルすることができます。

そもそも、この更新前処理イベントは、更新する前の事前チェック機能として利用する場合が多々ありますので、是非ともこの使い方をマスターして下さい。

 更新後処理イベント

Private Sub 職員_AfterUpdate()
    
    '非表示テキストボックス[職員代入]に職員コードを代入する。
    Me.職員代入 = Me.職員
  
    '管理者IDが入力されると、[リスト]ボックスの値集合ソースを変更する。
    If Me.職員代入 <> ChoiceSelect(12) Then
        Me.リスト.RowSource = "qry_listbox_1"
    Else
        Me.リスト.RowSource = "qry_listbox_2"
    End If
  
    DoCmd.Requery "リスト"
    DoCmd.Requery "リスト2"
    Me.CK = True
    Me!有休S.SetFocus
    DoCmd.GoToRecord , "", acNewRec
  
End Sub

この更新後処理を利用して以下の処理を行っています。

  1. 非表示テキストボックス 職員代入 に職員コードを代入します。
  2. 管理者と一般職員とを区分して、リストボックスの値集合ソースをそのつど変えます。
  3.  "リスト"と"リスト3"の再クエリを行います。
  4. CK フィールドに"True"を代入します。
  5. サブフォームにフォーカスを移動し、サブフォームの新規レコードに移動します。

これら処理の中で、

  • [リストボックス名].RowSource = "クエリ名(又はテーブル名)"

を用いて、リストボックスの値集合ソースを変更しています。これは定番処理なので覚えて置かれて損はありません。

ChoiceSelect()プロシージャの引数に 12 を入力すると、

  •  DLookup("[入力者ID]", "[tbl_社員マスター]", "[入力者名]='管理者'")

からの値を得ることができます。 先程お話しました サブルーチン 処理ですね。Me.有休S.SetFocus は、

  • Forms!frm_有休M!有休S.SetFocus

と同じ意味を持ちます。Meキィーワードを用いてサブフォームを表わす場合は、このような書き方をして下さい。

では、今日はこの辺でお終いにします。

 

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


入力フォーム_社員ID入力テキストボックス:休暇申請管理ソフト


 

-Microsoft Access Club-