マイクロソフトアクセス(以下Accessに略)でデータベースを組んでいると、操作ログを採取したいというケースが少なくありません。
今回は、
ココがポイント
AccessVBAのFunctionプロシージャを使ってログ機能を実装
してみたいと思います。
機能説明
機能としては、「いつ、だれが、何を」の操作ログを採取できれば良い訳です。
あとは、「何を」の部分をいくつ採取したいのかでログの取り方は変わっていくと思います。
VBAを組んでいくことになるかと思いますが、フォームごとにVBAを入れ込んでいくのは面倒なので、ひとつのVBAを使い回しできるように、
FunctionプロシージャにしてVBAを組んでいきます。
ログイン時のユーザー
確実に「誰が」という部分を知るために、ログイン時にユーザーを記録した方が良いですね。
変数を、Publicにして、仕組み全体で使用できる変数にしておいた方がいいです。
Private Sub login_AfterUpdate() Dim who As Variant Dim what As Variant Dim log1 As Variant Dim log2 As Variant Dim log3 As Variant Dim log4 As Variant Dim log5 As Variant If login = "TestUser5" Then DoCmd.OpenForm "menu", acNormal, , , acFormEdit, acWindowNormal DoCmd.Close acForm, "login", acSaveNo login_user = "Ma2n2n" who = login_user Else MsgBox ("ログインNOが相違しています。") login = "" who = "ログイン失敗" End If what = "ログイン" Call add_log(who, what, log1, log2, log3, log4, log5) End Sub
とりあえず、ログインすると、whoが、「Ma2n2n」になり、whatが、「ログイン」が代入されるようにしました。
そして、Call add_log でFunctionプロシージャに行くようにしています。
なを、
ココに注意
データ型は、数字でも文字でも入れられるように、Variant型
にしてあります。
※String型にすると、Nullなどの場合エラーが出ます。
Funtionプロシージャ
Functionプロシージャと言えば、初心者だったころは敷居の高いVBAという感じがしましたが、使いこなせば便利です。
結果を返すようなFunctionプロシージャもありますが、今回は、データベースにログを記録するだけのプロシージャになります。
Function add_log(who_input As Variant, what_input As Variant, uch1_input As Variant, uch2_input As Variant, uch3_input As Variant, uch4_input As Variant, uch5_input As Variant) Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset On Error GoTo ErrRtn 'アクションクエリ非表示設定 DoCmd.SetWarnings False Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "log", cn, adOpenKeyset, adLockOptimistic ' トランザクションの開始 cn.BeginTrans ' rs.AddNew rs!when_time = Now() rs!who = who_input rs!what = what_input rs!uch1 = uch1_input rs!uch2 = uch2_input rs!uch3 = uch3_input rs!uch4 = uch4_input rs!uch5 = uch5_input rs.Update ' トランザクションの保存 cn.CommitTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ExitErrRtn: Exit Function ErrRtn: ' MsgBox "エラー: " & Err.description 'BeginTransの時点まで戻り、変更をキャンセルする cn.RollbackTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Function
このコードを見て頂ければ分かるように、「いつ」の部分は、NOW()でシステムから自動で入力されることになります。
そして、「だれ」「なに」と、他5個の採取データをするようにしてあります。
とりあえず、logテーブルも掲載しておきます。
ログを採取したい場所に埋め込む
Private Sub add_btn_Click() Dim who As Variant Dim what As Variant Dim log1 As Variant Dim log2 As Variant Dim log3 As Variant Dim log4 As Variant Dim log5 As Variant Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset If MsgBox("追加しますか? yes/no", vbYesNo, "データ追加登録") = vbYes Then On Error GoTo ErrRtn 'アクションクエリ非表示設定 DoCmd.SetWarnings False Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "data", cn, adOpenKeyset, adLockOptimistic ' トランザクションの開始 cn.BeginTrans ' rs.AddNew ' 追加したいデータ内容 rs.Update ' トランザクションの保存 cn.CommitTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing ' ログ書き込む who = login_user what = "新規登録" log1 = add_data1 log2 = add_data2 log3 = add_data3 log4 = add_data4 log5 = add_data5 Call add_log(who, what, log1, log2, log3, log4, log5) MsgBox ("登録しました。") Else MsgBox ("登録しないで戻りました。") Exit Sub End If ExitErrRtn: Exit Sub ErrRtn: MsgBox "エラー: " & Err.description 'BeginTransの時点まで戻り、変更をキャンセルする cn.RollbackTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing
上のVBAコードは、フォームからデータを追加ボタンを押したときに、同時にログを採取しています。
ログを採取する(logテーブルに書き込む)変数を設定してCall add_logで実行させれば良いだけです。
ログデータは自由に表示
ログデータは、テーブルlogに蓄積されていきますので、フォームに起して、データを抽出してもいいし、レポートにしても良い訳です。
参考
複数人がシステムを使うような場合は、誰が何をしたのかを把握するにはこのような仕組みを入れておくと良いかもしれません