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


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



引き続き、入力フォームに記述したプロシージャの解説を行います。

カレンダーコントロールのクリック時イベントプロシージャの作成

カレンダーコントロールをクリックした時に以下のアクションを実行させます。

Private Sub コントロール_Click()

    If IsNull([職員]) Then
        MsgBox "社員IDを入力して下さい。", 16, varkantoku
    Else
        DoCmd.Requery "リスト2"
    End If

End Sub

解説
  • この日を休暇に、と勢い余ってカレンダーをクリックした時、社員IDが未入力であれば誰の休暇申請か判別できません。よって、 IsNull()関数を使って社員IDが既に入力済みであるか否かの条件分岐を行っています。
    未入力であれば、以下のようにメッセージを表示させます。

社員IDの更新前処理イベントプロシージャの作成

社員IDを入力して、それを更新する前に以下のチェックを行います。
Private Sub 職員_BeforeUpdate(Cancel As Integer)

    Dim strmsg As String
    Dim varDlooupValue As Variant
    
    strmsg = "登録されていない社員IDです。再度入力して下さい。" & _
		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
解説

更新前イベントは、あまり馴染みのないものですが、事前チェックを行うイベントと理解されたらいいんじゃないでしょうか。今回の処理は、登録されていない社員コードが入力されれば、下記メッセージを表示し進行を止めることにあります。

 

If IsNull(varDlooupValue) Then 〜

DLookup関数は該当のデータがなければ、Nullを返します。
入力された社員IDが、登録されていない社員IDであると該当データをDLookup関数が返せない状態になりますからNullが返されます。この特性を利用して、IfステートメントとIsNull関数 を組み合わせて条件分岐を行 います。なお、取り消しには、Cancel = True を用います。

参考
MsgBox strmsg_1, 16, strkantoku

の式は、

MsgBox "登録されていない職員コードです。再度入力して下さい。" & _
なお、不明の場合は" & strkantoku & "まで連絡して下さい。", 16, strkantoku

と同一の内容です。

このように長い文章の場合など、前もって変数定義を行いプロシージャを見やすくする手法がしばしばとられます。
また、社員ID入力は、非連結テキストボックス(テーブルやクエリに直接つながっていないテキストボックス)で行うように設定しています(このために隠しテキストボックスが必要となっています)。

非連結テキストボックスを用いる理由

通常は連結テキストボックスを利用する訳なんですが、更新前処理を行いたいから非連結のテキストボックスを用いています。

連結テキストボックスでは、リレーションの制御で登録されていない社員IDを入力すると、エラー表示がなされてしまいます。 よって、この制御を受けないように非連結テキストボックスを利用しています。

社員IDがテキスト型の場合

ところで、このサンプルファイルでは社員IDは数値型としています。しかし、会社によってはIDが、1番ではなく0001番である場合も考えられます。
この場合は、tbl_社員マスターテーブルの入力者IDフィールドのデータ型を テキスト型 にして下さい。そして併せて、入力者IDフィールドプロパティの書式に 0000 を記述する必要があります。

社員IDの更新後処理イベントプロシージャの作成

社員IDが入力され更新前処理イベントでチェックを受けた後、以下の更新後処理イベントプロシージャを実行させます。

Private Sub 職員_AfterUpdate()
    
    '非表示テキストボックス職員代入に職員コードを代入する。' --- A
    Me.職員代入 = Me.職員
  
    '管理者IDが入力されると、リストボックスの値集合ソースを変更する。' --- B
    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
    Forms!frm_有休M!有休S.SetFocus
    'Me!有休S.SetFocus
    DoCmd.GoToRecord , "", acNewRec
  
End Sub
解説
  1. 非表示テキストボックス[職員代入]に社員IDを代入する。
    「更新前イベント」でチェック済みの社員コードを、今度はテーブルの社員IDフィールドと連結している連結テキストボックス[職員代入] に値を代入します。
  2. 管理者IDが入力されると、[リスト]ボックスの値集合ソースを変更する。
    事前に、社員IDのマスターテーブルに 管理者 として、任意の数値を設定します。 
    管理者は、全ての社員の申請を削除できる権限が必要です。
    よって、管理者ID を環境設定テーブルに入力済みの場合、個人別休暇申請状況リストボックスの値集合ソースを変更し、全社員データの削除が可能にします。
値集合ソース

下図は クエリqry_listbox_1です。抽出条件設定フィールドは、Years([日付],[職員ID])と職員IDです。
管理者IDを入力すると、リストボックスの値集合ソースをクエリqry_listbox_2に入れ替えます。クエリqry_listbox_2には抽出条件が全くありません ので、全データが表示されます。

この機能が不要であれば、削除して下さい。無理に使う必要はありません。

 

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


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


 

-Microsoft Access Club-