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


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



このファイルの作成も大分ご無沙汰していたので、記憶力が怪しくなってきています。やはり、Accessは毎日取り組まなければだめですね。 まず、完成図をご覧下さい。ここをクリック…。 

今回から数回に亘って、入力フォームに記述してあるイベントプロシージャを説明していきます。ゆっくりと進みますのでご安心を‥。

フォームの開く時イベントプロシージャの作成

以下のプロシージャを入力フォームの開く時イベントに記述します。
Private Sub Form_Open(Cancel As Integer)

    Me.トグルボタン_1.Caption = ChoiceSelect(1) ' --- D
    Me.トグルボタン_2.Caption = ChoiceSelect(2)
    Me.トグルボタン_3.Caption = ChoiceSelect(3)
    Me.トグルボタン_4.Caption = ChoiceSelect(4)

    '環境設定でネットワーク機能がオンの場合、バスワードを求めます。
    If ChoiceSelect(6) = True Then ' --- A
        Call Users識別 ' --- B
    End If

    DoCmd.GoToRecord , "", acNewRec ' --- C

End Sub
解説
  1. DLookup関数を用いて、フォームが開かれる度に tbl_Kankyoテーブル に格納されている情報を確認しています(tbl_Kankyoテーブルの詳細はNo.3で確認してください)。そして、DLookup関数の値が True であれば、次のプロシージャに進む手順です。
  2. 一台のパソコン上で動かしている場合は特に問題ないんです。しかし、LAN上で動かすとなると、入力する対象社員に制限をかける必要があります。このような理由で、 入力者の識別のためパスワードを求めることにしています。
    tbl_Kankyoテーブルに格納されているパスワード情報をその都度確認します。パスワード相違であれば、 Endで以降の処理を終了させています。

    なお、パスワード機能を利用する、しないの設定は、環境設定(tbl_kankyo)テーブルの

    1. ネットワーク機能を利用する
    2. 入力者の識別パスワード

    を操作することで自在に変更することができます。
    Call Users識別 は、独自のFunctionプロシージャであるUsers識別を呼び出すプロシージャです。ちなみにUsers識別は下記プロシージャです。

    Function Users識別()
        Dim strmsg As String
        Dim varpassword As Variant
        strmsg = "このフォームを開くにはパスワード入力が必要です。" & _
    vbNewLine & "不明の場合は、" & varkantoku & _
    "まで問い合わせて下さい。"
        varpassword = DLookup("Password", "tbl_Kankyo", "ID=1")
        Select Case InputBox(strmsg, varkantoku)
            Case Is <> varpassword
                MsgBox "パスワードが違います。", 16, varkantoku
                End
            Case 0
                MsgBox "パスワードが違います。", 16, varkantoku
                End
            Case varpassword
                Exit Function
           
        End Select
    End Function
     

  3. DoCmd.GoToRecord , "", acNewRec で新規レコードが常に表示されるようにしています。この処理は何気ないようですが、大事です。入力フォームは、必ず新規レコードを表示する処理が大事です。
    つまり既存のレコードに追加処理を行わせてはいけません。他人のデータを改竄することも可能となりますからね。
  4. ChoiceSelect(*) --- これは、以前も現れましたね。覚えておられますか? 下記のFunction関数を引っ張ってきています。

    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

    ChoiceSelect(2) というのは、Select関数のCase2以下のプロシージャ値を返します。 ここでは、サブルーチン関数として利用しています。サンプルでは下記の構文です。

    • DLookup("[休暇種別_2]", "[tbl_kankyo]", "[ID]=1")

申請済みのデータの削除

コマンドボタンを新規作成(名前はcmd削除)し、クリック時イベント プロシージャを下記のように記述します。
データを入力すれば、当然デーを削除できる機能を付与しなければなりません。この入力フォームでは、コマンドボタンを使って上段に配置したリストボックスで選択された日付のデーを削除します。

Private Sub cmd削除_Click()

  '休暇申請データを削除するプロシージャです。
    Dim varDate As Variant
    Dim varNo As Variant
    Dim strmsg As String
    Dim SQL_2 As String
    
    varDate = Me.リスト.Column(0)
    'リストの5番目に削除対象とするTDがあるので…
    varNo = Me.リスト.Column(4)
    strmsg = "選択された日付の休暇予定を削除します。" & vbNewLine & _
             "一度削除すると元に戻せません。"
    
    '選択していなければ、メッセージを表示させ進行を止めます。
    If IsNull(varNo) Then
	MsgBox "削除する日付を選択して下さい。", "16", varkantoku
	End
    End If

    Select Case CDate(varDate)
  
        '本日からの休暇申請のみ削除可能にします。
        Case Is >= Date

            If 1 = MsgBox(strmsg, 17, varkantoku) Then
                'SQLで削除クエリを使います。
                SQL_2 = "DELETE FROM tbl_有休S WHERE tbl_有休S.TD= " & varNo
                DoCmd.SetWarnings False
                DoCmd.RunSQL SQL_2
                DoCmd.SetWarnings True
                DoCmd.Requery "リスト"
                DoCmd.Requery "リスト2"
            Else
                End
            End If

        Case Else
  
            MsgBox "選択された日付の休暇は既に取得済みです。" & _
				削除できません。", "16", varkantoku
 
    End Select

End Sub
解説

リストボックスから該当デーを削除する場合、何か元になるフィールドを決めておく必要があります。通常はIDなどオートナンバー型のフィールドを指名します。ここでは、リストの5番目にある No. を使います。

上段のリストボックスの「集合ソース」を見ると、左から5番目に No.(下図参照)がありますね。データを取り出すには Me.リスト.Column(4) のように記述します。この Column() は 0 から始まりますので5番目は 4 です。

次に、IsNull()を使ってリストボックスから選択しているか否かの条件分岐を行っています。IsNull()関数は 真 であれば True を返します。最後に Select Case を使って当日以降のデータ削除だけ可能にしています。

以下のプロシージャは、削除クエリをSQLで記述し、SQLをRunSQLメソッドで実行します。

    SQL_2 = "DELETE FROM tbl_有休S WHERE tbl_有休S.No.= " & strno
    DoCmd.SetWarnings False
    DoCmd.RunSQL SQL_2
    DoCmd.SetWarnings True

SQLを用いる利点は、以下のとおりです。

  1. クエリを新規作成する必要がないこと。
  2. 警告のダイアログボックスを制御できること。
    (SQLをプロシージャ内で実行すると、警告ダイアログは表示されません。)

 

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

 


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


 

-Microsoft Access Club-