システムの最初の画面 ログインフォームをACCESSで作る
ACCESSは会社の業務効率化に大きな力を発揮します
小規模事業所向けの簡単なシステムから 少し頑張れば結構大きなシステムも Microsoft Access を使うことで 自前で作ることができます
そこで 今回は 大きな基幹業務システムでは必ず実装されている 最初の画面 『ログインフォーム』をACCESSで作ってみました
ログインフォームとは
システムの利用者がそのシステムを使う権限があるかを ユーザーコードとパスワードの組み合わせで判断し、権限があれば本システムのメニューが起動するといった機能がある画面です
また、ユーザを特定して次のシステムに進んだとき 権限によりそのシステムでできることできないことをわけることができます
さっそく作っていきます
ログインフォームの画面
こんなフォームを作ります
- 社員コード パスワードをいれ ログインする
- 権限により開くフォームを変える
- パスワードを変更する (パスワード変更フォームは次章で紹介)
- 終了ボタン
ログインフォームには社員マスタをつかいます
システムを利用するユーザーは当社の社員の特定の部署のメンバーです
当社システムの社員マスタを使います
- 社員マスタには【社員CD】 【氏名】 【password】 【権限】 の項目があります
- このシステムを使うのは営業、総務、経理、業務のみで 建機部署は使用しませんので、部署CD 5 建機 以外となります
- 総務、経理と営業と業務とでは 使える機能に違いをつけるため 権限 1または2 を振り分けています
ログインフォームのパーツにチェック、分岐の判断を設定します
社員CDを入力する コンボボックスの設置
システムの利用者が自分の社員コードを入れます
ここでは、コンボボックスの機能を使い 下のようにリストから選べるようにします
社員マスタ(SYS社員テーブル)から フィールドに 社員CD、氏名、カナ、部署CD、退職日を選ぶ
- カナの並べ替えを昇順にする リストがカナ順に表示される
- 部署CDには 建機部以外を選ぶので 建機部CD 5以外 <>5 といれる
- 忘れがちなのが 退職しているものまで選んでしまうこと 退職日が入っていない人を選ぶために
抽出条件に Is Null といれる
- 値集合ソースにSTEP ① で作った クエリ Q_cmbsyain を選びます
- 連結列は 1 (デフォルトのまま)
- 列数 3 (社員CD 氏名 カナ)
- 列幅 1.5 cm;3cm;3cm (表示されるリスト幅を確認しながら調整していく)
- リスト行数 20 ぐらい (画面の高さによって調整する)
- リスト幅は列幅の合計
社員CD コンボボックス入力後のチェックと処理 (VBA)
- 社員CDが未入力のとき メッセージ「社員CDを選んでください」と表示
- 社員CDがリストにないとき メッセージ「社員CDを確認してください」と表示
- 社員名を表示
- 権限をテキストボックスに保存
社員CD(入力者)コンボボックスの更新後処理にイベントプロシージャを選び Visual Basic Editor を起動します
社員CDを入れたあと(イベント:更新したあと)に実行される処理のコード
Private Sub cmb_syainCD_AfterUpdate()
On Error GoTo Err_cmb_syainCD_AfterUpdate
Me!txt_syainName = ""
Me!txt_Pass = ""
Me!txt_kengen = ""
If IsNull(Me!cmb_syainCD) Then
MsgBox "社員CDを選んでください"
Me!cmb_syainCD.SetFocus
Else
If IsNull(DLookup("氏名", "Q_cmbsyain", "社員CD = " & Me!cmb_syainCD)) Then
Me!txt_syainName = ""
Me!txt_Pass = ""
Me!txt_kengen = ""
MsgBox "社員CDを確認してください"
Me!cmb_syainCD.SetFocus
Else
Me!txt_syainName = DLookup("氏名", "SYS社員", "社員CD = " & Me!cmb_syainCD)
Me!txt_kengen = DLookup("権限", "SYS社員", "社員CD = " & Me!cmb_syainCD)
End If
End If
Exit_cmb_syainCD_AfterUpdate:
Exit Sub
Err_cmb_syainCD_AfterUpdate:
MsgBox Err.Description
Resume Exit_cmb_syainCD_AfterUpdate
End Sub
Me!txt_syainName = “”
Me!txt_Pass = “”
Me!txt_kengen = “”
まず、社員名 password 権限をリセット(空白)します
何度か入れなおしていくと 前回入れたコードによってセットされた内容が残るので まず最初にここで消しておきます
If IsNull(Me!cmb_syainCD) Then
MsgBox “社員CDを選んでください”
Me!cmb_syainCD.SetFocus
If :もし 社員CD(cmb_syainCD)が IsNull : 空白なら
MsgBox: 社員CDを選んでください と表示
Me!cmb_syainCD.SetFocus : 社員コードに SetFocus : カーソルをセットする
結果:このようなメッセージがでます
Else
If IsNull(DLookup(“氏名”, “Q_cmbsyain”, “社員CD = ” & Me!cmb_syainCD)) Then
Me!txt_syainName = “”
Me!txt_Pass = “”
Me!txt_kengen = “”
MsgBox “社員CDを確認してください”
Me!cmb_syainCD.SetFocus
Else: 社員CDが空白ではなかったら (入力されていたら)
IF:もし 入れた社員コードが入力者のリストになければ
Me!txt_syainName = “” 社員名をリセット(空白)する
Me!txt_Pass = “” パスワードをリセット(空白)する
Me!txt_kengen = “” 権限を空白にする
MsgBox: 社員CDを確認してください と表示する
Me!cmb_syainCD :社員CDコンボボックスに SetFocus : カーソルをセットする
結果:このようなメッセージが出ます
Else
Me!txt_syainName = DLookup(“氏名”, “SYS社員”, “社員CD = ” & Me!cmb_syainCD)
Me!txt_kengen = DLookup(“権限”, “SYS社員”, “社員CD = ” & Me!cmb_syainCD)
End If
End If
社員CDが正しく入力されたら行う処理です
Me!txt_syainName に SYS社員テーブルの社員CDがフォームの社員CDと同じである氏名を入れる
Me!txt_kengen に SYS社員テーブルの社員CDがフォームの社員CDと同じである 権限を入れる
End If : 最初のIF文に対する End処理
End If : 次のIF文に対する End処理
社員名に 名前がはいります
権限テキストボックスに 対象の社員の権限がはいります
- 社員それぞれの権限によって開くメニューをかえるために必要なテキストボックス
パスワード入力 テキストボックスの設定
パスワードを入力するテキストボックスに定型入力ウィザードからパスワードを設定することで
入力文字が ****** と表示されます
ログインボタンのチェックと処理(VBA)
ログインボタンのクリック時イベントに イベントプロシージャを選び Visual Basic Editor を起動します
パスワードをいれログインボタンを押したときのチェックと処理をVBエディターにコードを書きます
社員コードの更新後イベントと同様のチェックをひととおり行ったあと パスワードのチェックを行います
Private Sub btn_login_Click()
On Error GoTo Err_btn_login_Click
If IsNull(Me!cmb_syainCD) Then
MsgBox "社員CDを選んでください"
Me!cmb_syainCD.SetFocus
Else
If IsNull(DLookup("氏名", "Q_cmbsyain", "社員CD = " & Me!cmb_syainCD)) Then
Me!txt_syainName = ""
Me!txt_Pass = ""
Me!txt_kengen = ""
MsgBox "社員CDを確認してください"
Me!cmb_syainCD.SetFocus
Else
If Me!txt_Pass <> DLookup("password", "SYS社員", "社員CD = " & Me!cmb_syainCD) Then
MsgBox "パスワードが違います", vbOKOnly
Else
If Me!txt_kengen = 1 Then
MsgBox "フォーム 1 を開きます"
Else
MsgBox "フォーム 2 を開きます"
End If
End If
End If
End If
Exit_btn_login_Click:
Exit Sub
Err_btn_login_Click:
MsgBox Err.Description
Resume Exit_btn_login_Click
End Sub
If Me!txt_Pass <> DLookup(“password”, “SYS社員”, “社員CD = ” & Me!cmb_syainCD) Then
MsgBox “パスワードが違います”, vbOKOnly
Me!pass.SetFocus
Me!txt_Pass : パスワードが 社員マスタ(SYS社員)のパスワードと違っていれば
MsgBox : パスワードが違います と表示し txt_Pass (パスワード)にカーソルをセットします
Else
If Me!権限 = 1 Then
MsgBox “Form 1をひらきます”
Else
MsgBox “Form 2をひらきます”
End If
End If
ELse : 前記の条件がすべて違っていたら
If Me!txt_kengen = 1 Then : もし 権限が 1 なら
MsgBox ” Form 1 をひらきます” : Form 1 をひらきます とメッセージが表示
Else : 権限が 1 でなかったら
MsgBox ” Form 2 をひらきます” :Form 2 をひらきます とメッセージが表示
社員コードとパスワードが一致したら 権限によって 開くフォームを指定します
※フォームを作成したら メッセージではなく それぞれのフォームを開くコードを記述
まとめ
ログインフォームはシステムを利用する際の最初の画面です
ACCESSのシステムで ログインフォームを実装することで ユーザーチェックや権限による機能の制限、そしてこのあと作成していく多くのシステムにおいて データの更新者のログや更新時間を項目にセットすることにより便利なツールとなります
いやぁ なんか すっごいシステムっぽくなったなぁ
ログインフォームだけで なんかすっごいシステムっぽいでしょ
つぎは 『パスワード変更』いってみよう
ACCESSシステムを作って公開するにあたって
マニア建機リースの社員情報や車両情報などのデータがないと作ることはできません
しかし 実際のデータを使うことはできません
そこで そんなデータをランダムに作ってくれるツールがあります