入力や更新したPCやユーザーを取得する関数

ACCESSデーターベースを仕事で運用していると、「このレコードを入力したのはいつ?」、「このレコードを入力したのは誰?」という情報が必要な場面に出くわす時があります。

複数人で同じACCESSファイルを使用している場合、スタート画面にログイン画面を設け、操作したユーザーを特定するような構成にするのがメジャーな方法でしょう。

ここまで作りこまない方法で、レコードを入力・更新したユーザーを記録したいとき、和休が実践している方法がありますのでご紹介します。

まず、テーブルには「finalupdate」(日付型)と「updateuser」(テキスト型)というフィールドを設けます。

「いつ入力や更新されたか」を取得するには、「finalupdate」に入力や更新した時刻をnow関数で取得し、レコードを入力・更新することで実現できます。

ACCESSに用意されている「Environ関数」を利用して自作関数を作り、追加クエリーや更新クエリーでレコードを更新するときに実行させます。

「Environ関数」とは、WINDOWS環境変数を取得する関数で、コンピューター名、WINDOWSにログオンしているユーザー名、WINDOWSのバージョンなどを取得することができます。

Function updatePC() As String

updatePC = Environ("computername")

End Function
Function updateUSER() As String

updateUSER = Environ("username")

End Function

追加・更新クエリの式に直接「Environ関数」を使用することもできるのですが、WINDOWSの構成によるものか定かではありませんが、「式に未定義関数’Environ’があります」というエラーメッセージが表示されることがありましたので、自作関数化しました。

使用例です

Let’s use Access VBA 「Lesson8 非連結フォームからレコードを操作する【レコード追加編】」で使用した、レコードを追加するSQLに組み込んでみましょう。

Lesson8 非連結フォームからレコードを操作する【レコード追加編】
テーブルを1つ、フォームを1つ用意します。 テーブルの名前は、基本情報とします。テーブルのフィールドは以下のとおり設定してください。 なお、テーブルのフィールドには書式設定やIMEの入力モードを指定する箇所がありますが、非連結フォームを...

 

フィールド名属性備考
ID長整数型各人ごとに振られたIDを保存します。
氏名テキスト型漢字氏名を保存します。
シメイテキスト型カナ氏名を保存します。
生年月日日付/時刻型生年月日を保存します。
finalupdate日付/時刻型レコードが操作された最後の時間を保存します。
updateuserテキスト型レコードを操作したユーザーを保存します。

続いて、SQLに今回紹介した関数を加えます。

Option Compare Database
Option Explicit

Dim db As DAO.Database
Dim strSQL As String

Private Sub btn_追加_Click()

Set db = CurrentDb
strSQL = "insert into 基本情報 (ID,氏名,シメイ,生年月日,finalupdate,updateuser) " & _
        "values(" & Me.txt_ID & ",'" & Me.txt_氏名 & "','" & Me.txt_シメイ & "',#" & Me.txt_生年月日 & "#,#" & Now & "#,'" & updateUSER & "') "

db.Execute strSQL

End Sub

いかがでしょうか。レコードを追加した時刻と、ユーザーがテーブルに記録されたでしょうか。

では、次に Let’s use Access VBA 「Lesson9 非連結フォームからレコードを操作する【レコード更新編】」で使用した、レコードを更新するSQLに組み込んでみましょう。

Lesson9 非連結フォームからレコードを操作する【レコード更新編】
Lesson8 で使用したフォームにボタンを一つ加えます。このボタンを押したとき、フォームに入力した内容にレコードを更新します。 ボタンの名前は、btn_更新 とします。 クリック時のイベントプロシージャへ、以下のとおりコードを...

 

Private Sub btn_更新_Click()
Set db = CurrentDb
strSQL = "update 基本情報 set 氏名='" & Me.txt_氏名 & "',シメイ='" & Me.txt_シメイ & "',生年月日=#" & Me.txt_生年月日 & "#,finalupdate=#" & Now & "#,'" & updateUSER & "' "  & _
"where ID=" & Me.txt_ID

db.Execute strSQL
End Sub

レコードを更新した時刻と、ユーザーがテーブルに記録されたでしょうか。

コメントをどうぞ!