マイクロソフトアクセス(以下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に蓄積されていきますので、フォームに起して、データを抽出してもいいし、レポートにしても良い訳です。
参考
複数人がシステムを使うような場合は、誰が何をしたのかを把握するにはこのような仕組みを入れておくと良いかもしれません