access2000で使用者を履歴に残したい

このQ&Aのポイント
  • access2000で使用者を履歴に残す方法を教えてください
  • テーブルの更新者の規定値にcurrentuser()と入れれば履歴として残せるのか疑問です
  • 使用者を顧客コードをキーに最終更新日の更新者を取り出す方法を教えてください
回答を見る
  • ベストアンサー

access2000で使用者を履歴に残したい。

履歴を取るのに「更新者=使用者」これは、currentuserですよね! 「テーブル全体を履歴に残す」バージョンでテーブルの更新者の規定値にcurrentuser()と入れればできる!と思ったのですが、テーブルではその式は利用できませんでした。モジュールに何か書き込まないとできないのでしょうか? 現在のモジュールは以下の通りです。 Sub History_a() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Ctr.ControlType = 109 Then If Ctr.OldValue <> Ctr.Value Then strSQL = "insert into あ履歴 select * FROM あ " & _ "where 顧客コード = " & Me.顧客コード DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True Exit Sub End If End If Next Ctr End Sub ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すという、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.6

>strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _ "','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & currentuser() & "','履歴ID')"としています。 上記「履歴ID」がオートナンバー型に相当すると思いますが、オートナンバー型は文字通り自動的に与えられます。 とって、履歴IDを指定する必要はありません。 strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _ "','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & currentuser() & "')"

その他の回答 (5)

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.5

確認はしていないのですが、取り急ぎ・・・ =DLookUp("更新者","履歴","((顧客コード='" & [顧客コード] & _   "') AND (更新日 = #" & [最新更新日] & "#))" でどうですか? オートナンバー型を使用する場合のSQLは後ほど・・・

cas-jp
質問者

お礼

m(__)m できました(^o^)丿 本当にいろいろありがとうございました。(T_T) これで、やっと安らかな眠りにつくことができます(^.^) watapo3さんに鍛えられて?少しは成長したかな~??(~_~;) とっても、とっても助かりましたm(__)m ありがとうございましたm(__)m お礼として、1万pointぐらい差し上げたいところですが、何分手持ちが20pointしかないもので・・・・、申し訳ありませんm(__)m

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.4

ちょっと紛らわしい表記があった為修正です。 >以前、最新の更新日を得るDLookUpは成功したと思いますので、 ↑ DMaxを使用して抽出したんでしたね! >=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _   " AND 更新日時 = #" & [最新更新日] & "#" ↑ 更新日というフィールド名で作成していると思いますので・・・以下に変更 =DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _   " AND 更新日 = #" & [最新更新日] & "#" 以上です。m(_ _)m

cas-jp
質問者

補足

ほにゃ~!できませーん(*_*)エラーなのです。 挿入したテキストボックスのコントロールソースにwatapo3さんの教えてくれた式をコピーし、名前を「最新更新日」をしたのに・・・。 そうそう、急遽「顧客コード」が数値型からテキスト型に変更になったため、「'」の入力を必要とするんですよね! この式だと、下記のようになるんですよね?これでだめでした。 =DLookUp("更新者","履歴","顧客コード='" & [顧客コード] & _   "' AND 更新日 = #" & [最新更新日] & "#" (ちなみに顧客コードのテキスト型に伴う履歴の書き出し等にエラーがでたので、「']を導入して今までの所(今回の以外)は、無事解決しました! どうも、AND以降の式を認識していないようです。 上記の式を記入すると、「AND」は、「and」になってしまいます。(コピーで貼り付けたら大文字で入力できたのですが、やはりエラーです。) 認識されていれば、通常「and」は、「And」とaが大文字になりますよね?? 何か、もっと基本的なところで私が間違いをしているのでしょうか? 現在、テキストに「履歴ID」←(オートナンバー)を追加して、やってみているのですが、ちゃんと最新更新者名を取ってきました!ただし、問題は、履歴が取れなくなってしまったことなのです。 変更を行うと、「実行時エラー3464、抽出条件でデータ型が一致しません」とでます。デバックを選ぶと、「履歴ID」の書き出しのところ?がエラー?みたい? DoCmd.RunSQL strSQL ここが、黄色くなってました。 プロシージャーのところで、 strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _ "','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & currentuser() & "','履歴ID')"としています。 コントロールソースのところで、 =DLookUp("更新者","履歴","履歴ID=" & DMax("履歴ID","履歴"))としています。 プロシージャーの履歴IDの指定の仕方が違っているのだと思います。(T_T)が、オートナンバー型のデータに対してどのような入力をすれば良いのかわかりません。 (オートナンバーは使用できるのでしょうか?) 教えてください。よろしくお願い申し上げます。

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.3

うぅ~む、自力での解決は無理でしたか・・・(^ ^; 以前、最新の更新日を得るDLookUpは成功したと思いますので、 そのコントロールの値を使用します。(コントロール名「最新更新日」と仮定) =DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _   " AND 更新日時 = #" & [最新更新日] & "#" 補足: 日付型は「#」で囲んでやる必要があります。 では、頑張って下さい。m(_ _)m・・・ちなみに更新者名の記録は成功したのだろうか(?_?)

cas-jp
質問者

補足

自力で頑張ろう!!と頑張ってはいるものの・・・。 >ちなみに更新者名の記録は成功したのだろうか(?_?) これは成功しております(^o^)丿 変更箇所のみの履歴をとるプロシージャーは、 strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _ "','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & CurrentUser() & "')" テーブル全体の履歴を取るプロシージャーは、 strSQL = "insert into DM履歴 select * , '" & CurrentUser & "' as 更新者 FROM DM情報 '" & _ "where 顧客コード = " & Me.顧客コード になっておりますm(__)m ちなみに、=DLoolkUp("更新者","履歴","履歴ID=" & DMax("履歴ID","履歴")) で更新者はもってこれたものの・・・、履歴が取れなくなってしまいましたm(__)m

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.2

ははは、またポカをしてしまった(もう笑うしかない) strSQL = "insert into あ履歴 select * , '" & CurrentUser & "' as 更新者 FROM あ " & _   "where 顧客コード = " & Me.顧客コード 「*」と「'」の間に「,」を入れるのを忘れてしまったみたい(単純なタイプミス・・・・別に前後の半角スペースはあっても無くても結構です。) 申し訳ありませんでした。m(_ _)m

cas-jp
質問者

お礼

ひぇ~。watapo3さん(*_*)Please Help me!m(__)m あれから、数時間・・・。思い当たる式を書いてみました。。 とにかく思い当たる式を色々と・・・、でも、できなかった・・・(T_T)・・・ 後、履歴IDを取る方法を試してみました。履歴テーブルに「履歴ID」というテーブルを作成し、フォームに挿入したテキストのコントロールに、 =DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & " AND 履歴ID = " & Max([履歴ID])) と書いてみたものの、これもダメだと・・・・。 この時に挿入したテキストのコントロール表記を削除して実行すると、今度は!履歴を取ることができなくなる・・・。テキストに履歴IDを追加したのが原因と言うことは判明したものの、これでは・・・履歴IDというテーブルを挿入できない(T_T)ほにゃ~(*_*) ちなみに現在、watapo3さんから教わった、変更されたところだけの履歴を取る方法と、変更されたときに全てのテーブルの履歴を取る方法、両方とも使用しておりますm(__)m 何とかなりますか?

cas-jp
質問者

補足

watapo3さーん! (T_T)(*_*)(@_@)(T_T) >これは本当にDLookUpで出来るでしょう(最終更新日を先に抽出していると仮定して)。顧客IDと最終更新日でユニークになるはずですので・・・。 「最終更新日を先に抽出していると仮定して」というのは、どこを見たら確認できるのでしょうか???? 最終更新者を表すテキストボックスを挿入し、 =DLookUp("更新者","履歴","顧客コード=" & [顧客コード]) と、書いたのですが、最初に見つけたものを拾ってきてしまいます(T_T) これって、最終更新日を先に抽出していないということですか? 以前言われたように、履歴IDを作成する必要がありますでしょうか?

  • Watapo3
  • ベストアンサー率76% (33/43)
回答No.1

「あ履歴」テーブルに「更新者(テキスト型)」を作成します。 で、以下に変更 strSQL = "insert into あ履歴 select * '" & CurrentUser & "' as 更新者 FROM あ " & _   "where 顧客コード = " & Me.顧客コード でOK(^ ^) そんでもって、 >ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すとい >う、ややこしくてわけがわからなくなりそうなことも可能でしょうか? これは本当にDLookUpで出来るでしょう(最終更新日を先に抽出していると仮定して)。顧客IDと最終更新日でユニークになるはずですので・・・。

cas-jp
質問者

補足

watapo3さん、変更をかけてみました(T_T)しかし、 DoCmd.RunSQL strSQL で「ダメ」と言われてしまいます。なぜ~??でしょうか? エラーメッセージは、実行時エラー3075 クエリ式'*"'admin"の構文エラー:演算子がありません。 でした。 よろしくお願い申し上げますm(__)m

関連するQ&A

  • ACCESS2000でとっても困っています。履歴がたくさんとれてしまうのです。

    アクセス初心者です。とても困っています。 困っているのは、履歴は書き出すのですが、複数書き出してしまうということなのです。 詳しく申し上げますと、 フォーム「テレ_sb(table:テレ)」に変更があった場合に、履歴「SF_テレ履歴(table:テレ履歴)」を書き出すことを行っています。 顧客ID毎に履歴を取るようにしているのですが、「A」ユーザーに変更を行うと、「A」ユーザーの履歴を取ってくる。ここまでは良いのですが、フォームのテレ_sb(table:テレ)に情報が入っているもの全てについて履歴を取ってしまうのです。 つまり、table:テレ(フォーム:テレ_sb)に10ユーザーの情報が入っているとすると、「A」について変更を行うと、10ユーザー全ての履歴を取ってきてしまうのです。 <<フォーム>>メイン、テレ_sb(table:テレ)、SF_テレ履歴(table:テレ履歴)があります。 テレ_sb(table:テレ)のイベントプロシージャーには以下のように書いております。上記の点、防ぐ方法をどなたかご教授ください。よろしくお願い申し上げます。 Sub History_tel() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If ((Ctr.ControlType = acTextBox) Or (Ctr.ControlType = acComboBox)) Then If Ctr.OldValue <> Ctr.Value Then strSQL = "insert into テレ履歴 select * , '" & CurrentUser & "' as 更新者 FROM テレ '" & _ "where 顧客コード = " & Me.顧客コード DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True Exit Sub End If End If Next Ctr End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) History_tel End Sub Private Sub Form_AfterUpdate() Forms("メイン").Form.SF_テレ履歴.Requery End Sub

  • Access2000 VBA - 変更の履歴が取れません

    下記コードで、If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Thenの行で「指定した式には値がありません」というエラーが出てしまいます。 他のQ&Aで見つけた成功例のほぼコピペなのですが・・・・ どこが悪いのか、ご教示頂けないでしょうか? よろしくお願い致します。 __________________________________________________________________________________________ Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Then strSQL = "insert into 履歴 values('currentuser'," & Ctr.Value & _ ",'" & Ctr.Name & "','" & Ctr.OldValue & "',#" & Now() & "#)" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End If Next Ctr End Sub

  • 変更履歴テーブルについて

    行き詰まってます。アドバイスお願いします。 変更した履歴を記録しようと見よう見まねで作成しました。 テーブル:履歴  変更ID、フィールド名、変更前名前、変更後名前、変更日 フォームの更新前処理で Dim ctr As Control Dim sqla As String For Each ctr In Me.Controls If ctr.ControlType = 109 Then If Nz(ctr.OldValue, "") <> Nz(ctr.Value, "") Then sqla = "insert into 履歴 values(" & Me.ID & ",'" & ctr.Name & "','" & ctr.OldValue & "','" & ctr.Value & "',#" & Now() & "#)" DoCmd.SetWarnings False DoCmd.RunSQL sqla DoCmd.SetWarnings True End If End If Next ctr としています。 これでフォームでいじって試してみると 「この操作は、このタイプのオブジェクトには実行できません。」とエラーになってしまいます。 デバッグで→If Nz(ctr.OldValue, "") <> Nz(ctr.Value, "") Then になっています。 他の形の質問を参考に作ったのですが、どこがおかしいのでしょうか? http://okwave.jp/qa/q164850.html 宜しくお願いします。

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • access一部のフィールドを他のテーブルへVBA

    先日 https://okwave.jp/qa/q10245651.html において > table2の新しいデータとして > table1のデータをコピーしたい、 単に追加で ということであれば、という 御回答: Sub Test() Dim StrSQL As String StrSQL = "INSERT INTO table2 SELECT table1.* FROM table1;" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True End Sub ---------------------- 上記の 回答をいただき うまく稼働しました 部分的にフィールドを別テーブルに 移動するとき ここでは table1のフィールド名 IDに table2のフィールド名 bに 入っている数値 にい 1を加えた数値を 移動したいのですが Public Function Test() Dim tb1 As Table Dim tb2 As Table tb1 = table1 tb2 = table2 Dim strSQL As String strSQL = "INSERT INTO table2![ID]SELECT"("[b]"FROM tablel)+1" (table1のフィールド[b]の数値に1を加えた数値を table2のフィールド[ID]に移行する、というつもりです) DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End Function 稼働しません すみません 宜しくお願い致します (ついでながら ここで でてくるb というのは テーブル table3 の IDの総和 すなわち SELECT Count(table3.ID) AS b FROM table3; 要は table3の最後のレコードの次のレコードの 番号の数値を table2のIDに移動したい というわけであります) (いずれのIDや bについても 数値型 長整数型 重複あり です)

  • access VBA処理がうまくいかない

    お世話になります。 T_請求に追加する追加クエリQ_家賃請求Tがあります。 どの物件を更新するかをチェックボックスで指定し、追加クエリの抽出条件にしています。 月に1度のみの操作ですが、数人でこのデータベースを触り、 何度も追加されると困るので2度目以降はエラー処理をさせたいと思っています。 Private Sub 更新_Click() Dim ret As Integer ret = MsgBox("チェック物件を請求更新します。" & vbCrLf & "よろしいですか?", _ vbYesNo + vbQuestion, "請求月次更新") If ret = vbYes Then If DCount("[契約者CD]", "[T_請求]", "[物件CD] = " & Me!物件CD & _ " AND [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") _ <> 0 Then MsgBox "すでに指定物件の請求は更新されています" & vbCrLf & _ "同じ月に請求を2度更新できません" Else DoCmd.SetWarnings False DoCmd.OpenQuery "Q_家賃請求用T" MsgBox "更新されました" DoCmd.SetWarnings True End If Else If MsgBox("処理を中止しました", vbOKOnly + vbDefaultButton1 + vbExclamation) = vbOK Then Me.Undo Cancel = True End If End If End Sub 以上のようなコードを書きました。 処理が正しくできているか確認のために、動作を調べたのですが、 まったく同じ請求年月で同じ物件CDのものが保存先のテーブルに処理されてしまいます。 どの部分を直せばいいのでしょうか? 足りない情報があれば提示しますので、よろしくお願いいたします。

  • VBAの実行時エラー'2522'について

    前任者がAccess2003により作成したデータベースがあります。 CSVデータを取り込む仕組みがあるのですが、下記のエラーが出て困っています。 実行時エラー '2522': このアクションまたはメソッドを実行するには[File Name/ファイル名]引数が必要です。 どうやらVBAによるエラーだと判明しましたが、それ以上はよくわかりません。 以下のような構文になっています。 Option Compare Database ---------- Private Sub CSV取込_Click() TextConv strFileName, "マスター定義", "T_マスター" End Sub ---------- Sub TextConv(strFle, strInp, strTbl) Dim strSQL As String strSQL = "DELETE * FROM " & strTbl If MsgBox("テーブルデータを更新しますか?", 4, "テーブル更新") = vbYes Then CurrentProject.Connection.Execute strSQL DoCmd.TransferText acImportDelim, strInp, strTbl, strFle, True MsgBox "テーブルデータを更新しました" End If End Sub ---------- Private Sub 参照_Click() Dim strFileName As String strFileName = GetFileName() If Len(strFileName) > 0 Then Me.filepath = strFileName Else MsgBox "取込対象ファイルを選択してください! " End If End Sub 以上のようになっています。 デバッグを実行すると「strFle」の値がEmptyになっているのでここだとは思うのですが、どうしたらよいかわかりません。 どなたかお知恵をお貸し願えませんでしょうか。 宜しくお願いします。

  • アクセス2007 テーブルの全削除とデータ移動

    アクセス2007 テーブルの全削除とデータ移動 全テーブルを削除して、データをインポートしようとしています。 質問1. 下記のコードで、リレーションの張ってあるテーブルの削除でエラーになります。 でも、DoCmd.SetWarnings Falseの状態で、手動で削除するとエラーになりません。 だったらと思い、コードにDoCmd.SetWarnings Falseを追加したのですが、やはりエラーになります。 対処法はないでしょうか? 質問2. テーブルの中に「~TMP******」という勝手に作られたテーブルは、削除してもいいものなのでしょうか? 質問3. 削除後にインポートをしたいのですが。 手動でアクセスメニュー>外部データ>アクセス(のインポート)>現在の~~>すべて選択(テーブル)>OK これを実現するVBの記述は、どんなコードになるのでしょうか? --------------------------------------------------------------------- Private Sub 旧バージョンからデータ移動_Click() Dim i As Integer Dim tbls As DAO.TableDefs Dim tbl As DAO.TableDef '開いているフォーム全てを閉じる For i = Forms.Count - 1 To 0 Step -1 DoCmd.Close acForm, Forms(i).Name Next i Set tbls = CurrentDb.TableDefs DoCmd.SetWarnings False  '追加-------------------    ’全テーブル削除 For Each tbl In tbls If InStr(1, tbl.Name, "MSys", vbBinaryCompare) = 0 And InStr(1, tbl.Name, "~TMP", vbBinaryCompare) = 0 Then tbls.Delete (tbl.Name) End If Next DoCmd.SetWarnings True   '追加----------------   ’旧バージョンからのデータインポート   ’VBコードがわかりません End Sub ------------------------------------------------------------------------- ※旧バージョンとはアクセス本体ではなく、自分でつくったDBの旧バージョンです。 複数質問で申し訳ありませんが、よろしくお願い致します。

  • Access2000 VBAについて質問です。

    Access2000 VBAについて質問です。 下記ソースコードでUPDATE(更新)しているのですが、バチンとAccessが落ちてしまいます。 Private sub UPDATESQL() StrSQL = "SELECT * FROM T_StandardList WHERE ID = " & Me.ID Set ct = CurrentProject.Connection RS.CursorLocation = adUseClient RS.Open StrSQL, ct, adOpenDynamic, adLockOptimistic RS![filed1] = Me![Value1] RS![filed2] = Me![Value2] RS![filed3] = Me![Value3] RS![filed4] = Me![Value4]      Call CloseButton_Click Set RS = Nothing Set ct = Nothing End Sub Private Sub CloseButton_Click() DoCmd.SetWarnings False 'SQLの実行 DoCmd.RunSQL "DELETE FROM T_TempList" DoCmd.Close acForm, Me.Name DoCmd.SetWarnings True End Sub CloseButtonをクリックしても落ちることがあるので、CloseButton_Click関数が怪しいとは感じます。 どなたか詳しい方アドバイスよろしくお願いいたします。 m(_ _)m

  • Access VBA Split利用方法

    お世話になります。 VBAを勉強している最中です。 Accessを利用して、txtファイルをインポート後、テーブルの項目を配列利用して カンマ区切りにしたいのと、Splitを利用して、配列を条件分岐に利用して、テーブルに 書き込みをしたいとおもってます。 おそらく基本的なことで自分で勉強するべきと思うのですが 漠然なイメージしかない状態で、ヒントやこういう方法があるなど 教えていただけますでしょうか 基本的な使い方ですと Private Sub XXX_Click() str = Split("あああ いいい ううう")   MsgBox str(1) End Sub 上記の用な利用方法と思いますが、このような使い方ではなく test(0)のような使い方をして、条件分岐で利用したいと おもってます。 イメージとしては、下記のようなことをイメージしてます。 Public Sub Test()   Dim test() As String Dim row As String   Dim iNum1 As Long,   Dim iNum2 As Long      DoCmd.SetWarnings False   DoCmd.RunSQL "DELETE * FROM data"  DoCmd.TransferText acImportFixed, "インポート定義", "data", "d:\data.txt"   DoCmd.SetWarnings True   iNum1 = 0   iNum2 = 0   Do While xxx      If test(0) = 0 Then          iNum1 = iNum1 + 1 iNum2 = 1      Else         xxxx      End If   Loop End Sub ここでSplitを利用してどのように指定するのが望ましいのか考えてしまってます。 test = row.Split(" ") を利用する場合、どのように連結(row)させるのかが不明です。 知識不足もあり、説明がわかりづらいと思うのですが、よろしくお願いします。

専門家に質問してみよう