• 締切済み

Accessのデータベースを使用した社員のログ管理

OS:WindowsXP Access Version:Access2003 Table:[Tログ管理] (フィールド)ID/ログイン日/ログイン時/ログアウト日/ログアウト時/社員番号 Form:[ログイン]    [メインメニュー] コマンドボタン:”ログイン”([ログイン]フォームに配置)         ”終了”([メインメニュー]フォームに配置) Accessでデータ管理システムを構築しております。 数十名の社員が使用する予定です。 そこで、どの社員がいつ・何時に使用したのかログ管理をしたいと考えております。 考えている方法として、 (1)Access(システム)を起動すると、[ログイン]フォームが表示されます。”ログイン”コマンドボタンをクリックします。 (2)すると、[Tログ管理]のID(オートナンバー)/ログイン日/ログイン時/職員番号にそれぞれ登録されます。 (3)”ログイン”コマンドボタンをクリックした後は、[メインメニュー]フォームが表示され、[ログイン]フォームは閉じます。 (4)[メインメニュー]フォームには、作業の内容を題したコマンドボタンを配置予定です。そして一番下に”終了”コマンドボタンを配置、クリックすると先ほどの[Tログ管理]から社員番号の入ったレコードを検索し、ログアウト日・ログアウト時を登録したいのです。 この「ログイン」コマンドボタンのクリック時イベントに下記のようなコードを記述しました。このコードで(2)(3)の動作はしてくれます。 ************* Public Sub ログイン_Click() Dim mySID as Object Dim CN as ADODB.Connection Dim RS as ADODB.Recodset Set mySID=CreateObject("Wscript.Network") Set CN=CurrentProject.Connection Set RS=New ADODB.Recordset RS.Open "Tログ管理",CN,adOpenKeyset,adLockOptimistic RS.AddNew RS!ログイン日=Date RS!ログイン時=Now RS!職員番号=mySID.UserName RS.Update RS.Close: Set RS=Nothing CN.Close: Set CN=Nothing DoCmd.OpenForm"メインメニュー",acNormal DoCmd.Close acForm,"ログイン" End Sub ************************** ”終了”コマンドボタンのクリック時イベントに(4)の作業をしてくれるコードを記述したいのですが、FilterやFindの使い方がよくわからなくて、前に進めません。。。 社員番号から検索せずにオートナンバーのIDを引数で渡す方法もありなのかな?と思ったのですが、初心者のため、どちらが効率的なのかわからないので、効率的な方法がありましたらどうか教えてください。 初心者なので、誤字脱字・読みにくい箇所があると思いますが、どうぞご容赦ください。 丁寧に教えてもらえると助かります、よろしくお願いいたします★

みんなの回答

noname#182251
noname#182251
回答No.2

#1のご回答で主要部分は解決済みと思います。いくつか蛇足を 1.”終了”コマンドボタンのクリックをせずに、システムをダウンさせる乱暴なユーザーや、停電などの事故によるログアウト対策 色々な方法が考えられるでしょうが、一案としてフォームのプロパティシートのイベントタグで、タイマー間隔を60000(1分)にし、タイマー時のイベントプロシージャに Private Sub Form_Timer() 'ここに#1のご回答にある   Dim CN As ADODB.Connection   Dim RS As ADODB.Recordset   Set CN = CurrentProject.Connection   Set RS = New ADODB.Recordset   With RS     Dim StrSQL As String  '→この行は、他の変数宣言と同じ場所に移動可     'テーブル名の代わりとなるSQL文を、変数に記録     StrSQL = "Select * From Tログ管理 Where ID=" & Me.OpenArgs & ";"     '「テーブルを開いて当該IDのレコードに移動」の代わりに、     'SQLにより、当該IDの1レコードに限定して開く     .Open StrSQL, CN, adOpenKeyset, adLockOptimistic     !ログアウト = Now     .Update   End With   RS.Close: Set RS = Nothing   CN.Close: Set CN = Nothing End Sub 2.ログアウトしないで他の業務を開始し、「実質的にはログアウト」している対策 キーボードに対する操作を監視します。 'グローバル変数に Dim LastAccessTime As Date 'フォームを開くとき Private Sub Form_Open(Cancel As Integer) LastAccessTime = Now End Sub 'キー操作があれば Private Sub XX_KeyPress(KeyAscii As Integer) LastAccessTime = Now End Sub 'タイマーで記録するとき !ログアウト = Now→!ログアウト = LastAccessTime など。ちなみにこのログは何を目的として収集するのでしょうか?

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

私自身は、ADOではなくDAOを使用しているので、効率などに関して一部誤解があるかも しれませんが・・・(汗) > どちらが効率的なのかわからない ログ管理となると、社員番号1つに対して複数のレコードが存在するはずですので、 社員番号で検索・絞り込みを行うには、社員番号以外の情報(→ログイン日時が最も 遅いもの、等)が必要になります。 その意味で、1フィールドで1レコードを特定できる「ID」を使用した方が、効率的かと 思います。 また、同様に、何かで「最後のログイン日時」の検索が必要になった場合を考えると、 「ログイン日」「ログイン時」は「ログイン日時」にまとめた方がよいように思います。 (ログアウトについても同様) とりあえず、「IDを元にして記録先を特定」とするには、終了ボタンがあるメインメニューに その「ID」を渡す必要がありますので、ログインボタンでのメインメニューを開くコマンドを、 以下のように変更してください: Private Sub ログイン_Click()   Dim mySID As Object   Dim CN As ADODB.Connection   Dim RS As ADODB.Recordset   Dim CurID As Long   Set mySID = CreateObject("Wscript.Network")   Set CN = CurrentProject.Connection   Set RS = New ADODB.Recordset   With RS     'RSに対する一連の処理をWith内にまとめました     .Open "Tログ管理", CN, adOpenKeyset, adLockOptimistic     .AddNew     !ログイン日時 = Now     !職員番号 = mySID.UserName     .Update     CurID = !ID    'オートナンバーのIDを変数CurIDに記録   End With   RS.Close: Set RS = Nothing   CN.Close: Set CN = Nothing   Set mySID = Nothing   'OpenFormの引数OpenArgsで、メインメニューにCurIDを渡す   DoCmd.OpenForm "メインメニュー", acNormal, , , , , CurID   DoCmd.Close acForm, "ログイン" End Sub これで、ログイン時に割り当てられたIDを、メインメニュー側で使用可能になります。 (OpenFormの7番目の引数OpenArgsの値は、呼び出されたフォーム側では  Me.OpenArgsという式で参照できます) 次に、メインメニューの終了ボタンのコードです: Private Sub 終了_Click()   Dim CN As ADODB.Connection   Dim RS As ADODB.Recordset   If MsgBox("終了します。", vbOKCancel) = vbCancel Then Exit Sub   Set CN = CurrentProject.Connection   Set RS = New ADODB.Recordset   With RS     .Open "Tログ管理", CN, adOpenKeyset, adLockOptimistic     '「Find」メソッドにより、ログイン時に取得したIDのレコードに移動     .Find "ID=" & Me.OpenArgs     !ログアウト日時 = Now     .Update   End With   RS.Close: Set RS = Nothing   CN.Close: Set CN = Nothing   'アプリケーションを終了   DoCmd.Quit acQuitPrompt End Sub ・・・以上です。 ただ、Findだと「テーブルを読み込み→該当レコードに移動」ということになる分、 SQLを使用した方が効率的かもしれません。 この場合は、上記の「With RS」から「End With」までを以下のものに差し替えます:   With RS     Dim StrSQL As String  '→この行は、他の変数宣言と同じ場所に移動可     'テーブル名の代わりとなるSQL文を、変数に記録     StrSQL = "Select * From Tログ管理 Where ID=" & Me.OpenArgs & ";"     '「テーブルを開いて当該IDのレコードに移動」の代わりに、     'SQLにより、当該IDの1レコードに限定して開く     .Open StrSQL, CN, adOpenKeyset, adLockOptimistic     !ログアウト = Now     .Update   End With ※テーブル保存先のバックエンドと、フォームやモジュールの保存先のフロントエンドに   分割されている前提としています。   分割されていない場合、同時使用によって他のユーザーの取得したIDで上書きされ   たりしないかどうかは検証していません。   (なお、複数人での同時使用を考えると、ファイル破壊回避のため、分割をお勧めします:   それでも数十人の同時使用は、Accessでは厳しいと思いますが(汗))

jyamiko
質問者

お礼

ありがとうございました!

関連するQ&A

  • Accessでのデータベースの使用(VBA)

    Private Sub 実行_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim StSQL As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;" rs.Open strSQL, cn, , adLockOptimistic '//前のコード(エラーになりました。) ' rs.Close 'cn.Close 'Set rs = Nothing 'Set cn = Nothing Set rs = Nothing: Close Set cn = Nothing: Close Accessを使用したvbaのコードの書き方について教えてほしいです。毎度Access の質問ばかりしてすみません。以下のコードはADOを使用してマスタというテーブルを読み込んで最後にrs.CloseでRecordSetを開放しようとしたのですが「オブジェクトが閉じている場合は、操作は許可されません。」というエラーメッセージが出てしまい原因がわかりませんでした。Openしていて開いているはずなのにエラーが出てしまい、 Set rs = Nothing: Closeに変えたら治りました。何故rs.Closeではエラーが出てしまったのでしょうか。 もう一つお聞きしたいです。 strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;"でコードという名前を付けたテキストボックスの値をマスタテーブルのコードの列に追加したいのですがテキストボックスの値の取り方が分かりません。(コード.Value)とやってみてもだめでした。どうやったらSQL文でテキストボックスの値をテーブルに追加できるんでしょうか。

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • 【VB】データグリッドコントロールにデータベースを表示させたい

    お世話になります。 フォーム上にMicrosoft DataGrid Control 6.0(OLEDB)を置いて、 データベースと接続し、データベースを表示させたいのですが、 データベースエンジンがMicrosoft.Jet.OLEDB3.51だとうまく表示してくれますが 4.0だとなぜか表示してくれません。 原因、対策などわかるでしょうか? ソースは以下のように単純なものです。 Private cn As ADODB.Connection Private rs As ADODB.Recordset Private Sub Form_Load() Set cn = New ADODB.Connection cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\パスワード管理.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open "パスワード", cn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rs End Sub

  • アクセス VBAのエラー

    以下のコードをwindowsXPで問題なく使っていましたが、windows7で使ったところ 「保存できません」というエラーメッセージが出ます。ただ全く同じコードを(だと思うのですが)リストボックスのダブルクリックで実行すると作動します。参考に二つのコードを書いておきます。 何か原因に心当たりのある方よろしくお願いします。 (コマンドボタン) Private Sub コマンド選択_Click() Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub (ダブルクリック) Private Sub リスト会員_DblClick(Cancel As Integer) Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • ACCESSでステータスバーにインジケータを表示する方法

    ★T_1 ・・・ビル名,電話番号 T_1テーブルに登録されてあるすべてのレコードにアクセス し、その間、インジケータを表示させたいと思っています。・・・が上手くいきませんTT 手順があっているかご指導宜しくお願いいたします。 (1)フォームを作成して非連結のテキストボックスを2つ作りました。(テキストボックス名→ビル名,電話番号にしました)さらにコマンドボタン(調査)を一つ作りました。 (2)コマンドボタンに以下のVBAを記述しました。 Private Sub 調査_Click() Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim cnt As Integer Dim i As Integer Dim j As Long Set cn = CurrentProject.Connection rs.Open "T_1", cn, adOpenStatic,LockOptimistic cnt = rs.RecordCount SysCmd acSysCmdInitMeter, "処理中です・・・", cnt For i = 0 To cnt - 1 Me.ビル名 = rs.ビル名 Me.電話番号 = rs.電話番号 Me.Repaint SysCmd acSysCmdUpdateMeter, i rs.MoveNext For j = 0 To 1000000 Next j Next i SysCmd acSysCmdRemoveMeter rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 以上のように記述しコマンドボタンを押すと「メソッドまたはデータメンバが見つかりません」とエラーメッセージがでます。これはどういうことなのでしょうか?宜しくお願いいたします。

  • 【ACCESS2000】 VBAの更新処理に条件を加えたい。

    下記のような更新処理のVBAを組みました。 これにIDが5のものを更新するというのを加えるには どうすればよいでしょうか。 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tbl_D_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect rs("入金方法") = 2 rs("入金方法名称") = "分割" rs.Update rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • access の 閉じるボタンを無効に出来ますか

    お世話かけますがよろしくお願いします。 ACCESSファイルの「起動時の設定」をメニューフォームにしています。 メニューフォーム上にコマンドボタンを配置して、クリックイベントで 次の「次フォーム」を開くようにしています。 「次フォーム」上に閉じるコマンドボタンを配置して、この次フォームのみを閉じるようにしていますが、 右上隅にある閉じるアイコン?をクリックすると全てが終了しますので このアイコンを無効にしたいのですが

  • access 初心者です。

    Private Sub 患者番号_AfterUpdate() Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset Set Cn = CurrentProject.Connection Set Rs = New ADODB.Recordset Rs.Open "[tbl個人情報]", Cn, adOpenKeyset, adLockOptimistic Rs.Find "[患者番号] = " & Me![患者番号] If Rs.EOF Then MsgBox "レコードが見つかりません。ID=" & Me![患者番号] Else Me![性] = Rs![性] End If Rs.Close: Set Rs = Nothing Cn.Close: Set Cn = Nothing End Sub 上記の式を見よう見まねで作成したのですが、エラーが出てしまします。          Me![性] = Rs![性]  が見つかりません どのように解釈すれば良いのでしょうか? ちなみに、サブフォームに入れているテキストボックスの「[性]を 同じサブフォーム内の[患者番号]から検索がしたいです。 初歩的なことで申し訳ございません。よろしくお願いします。

  • Accessで、メモリを開放するタイミング

    すみませんが、教えてください。 次のコードように、SQL命令を2回以上行う場合、メモリの開放は、最後だけでよいのでしょうか? これでも、一応動くのですが、メモリを余計に消費していないのかどうか、よく分かりません。 SUB SAMPLE() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String '接続 Set CN = CurrentProject.Connection 'レコードセットを取得(1) Set RS = New ADODB.Recordset SQL = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'TS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic Msgbox(CNT) 'レコードセットを取得(2) Set RS = New ADODB.Recordset SQL = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'WS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic Msgbox(CNT) '終了 RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub