• ベストアンサー

access2000でデータの変更の内容がわかるようにしたいのですが。

ACCESS初心者です。 ACCESS2000でフォームで既存レコードのどこかを更新したら、 (1)変更する前のデータをテーブル?で保存していきたい。(変更されたデータの過去分のデータをどんどん残していく。上書きはしない)&表示できれば尚うれしい。 (2)データを更新した日時も(1)と同じテーブルに書き込みたい。(こちらも(1)同様表示できれば尚うれしい)のです。 この作業はアクセスでできる?!と思っているのですが、 どなたかご教授頂ける方、よろしくお願いします。

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

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

思いつくままコードを書いていた為、いろいろとご迷惑をおかけしてすいません。m(_ _)m で、履歴を表示する第三のサブフォーム名を仮に[SF_履歴]と致します。 更新後の処理で Forms("メイン").Requery と記述している部分を Forms("メイン").Form.SF_履歴.Requery と、修正してください。 これでやっと完成のはず・・・・・・(^ ^;

cas-jp
質問者

お礼

Wapato3さん、本当に本当にありがとうございましたm(__)m 完成です!(T_T)!(^○^)! やさしく丁寧に教えていただいて、ACCESS初心者の私が無事目的を達成することができました。 ありがとうございました。 この先、待ち受ける(!?)問題があった時は、投稿します。こんなに丁寧に教えて頂けるなんて・・・!感動です(T_T)! その時にも、同様ご教授よろしくお願いします。(@_@)m(__)m

その他の回答 (6)

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

あっ、本当だ(^ ^)。再現しました。 再現してちょっとうれしいです。 以上はさておき、 >・更新前処理へ、=[History_Tantou] >・更新後処理へ、=[Forms]("メイン").[Requery] これらを「=~」の形(式ビルダ)ではなく、更新前・更新後のコードビルダより直接コードとして Private Sub Form_BeforeUpdate(Cancel As Integer)   History_Tantou End Sub Private Sub Form_AfterUpdate()   Forms("メイン").Requery End Sub と、記述してください。(juuyouフォームにも同様に) さすれば解決いたしやす。(^ ^) >form_jyuuyou、form_tantou、form_メインという3つができていました。 それぞれ、「プロシージャが記述されましたよ」と教えてくれている様なものです。詳しくは違うと思いますが・・・・(^ ^;

cas-jp
質問者

補足

早速のお返事ありがとうございます。でっ、でっ、できました(^o^)丿。(T_T)しかし、(メインフォームから)例えば、顧客コードで2件目のデータを処理する時、担当者のサブフォームに更新を加え、その後重要人物のサブフォームへ移動して更新を加えようとクリックすると、(表示が)必ず顧客コードで1件目のレコードへ戻ってしまいます。(@_@)顧客コードで2件目のデータを更新している時は、2件目のデータのままでいてほしいのですが。。どうにかなりますでしょうか?

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

klubサンのおっしゃる通り If NZ(Ctr.OldValue,"")<> NZ(Ctr.Value,"") Then の方がいいですね(^ ^) また、フィールド名を履歴として残すなら Ctr.Name   ↓ Ctr.ControlSource の方が良かったですね。 Ctr.Nameだとフィールド名とテキストボックス名が異なると、ちょっと困ってしまいますので・・・・ ご助言ありがとうございました。m(_ _)m

cas-jp
質問者

補足

Watapo3とklubさんありがとうございます。お二方に言われたとおりにしたところ、履歴が取れるようになりました!ただ言われた通りにしたつもりなのですが、なぜか履歴が必ず3つづつ取れてしまいます(T_T)。どこが悪いのでしょうか?下記の通りにしました。 まず、担当者フォームのイベントビルドのコードビルダへは、 Sub History_Tantou() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Ctr.ControlType = 109 Then If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Then strSQL = "insert into 履歴 values('担当者'," & Me.顧客コード & _ ",'" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#)" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End If End If Next Ctr End Sub ・更新前処理へ、=[History_Tantou] ・更新後処理へ、=[Forms]("メイン").[Requery] 重要人物フォームのイベントビルドのコードビルダへは、 Sub History_jyuuyou() 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 履歴 values('重要人物'," & Me.顧客コード & _ ",'" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#)" DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End If End If Next Ctr End Sub ・更新前処理へ、=[History_jyuuyou] ・更新後処理へ、=[Forms]("メイン").[Requery] 悪いところが見当もつきません。なので、他に何をお知らせすれば良いのかもわかりません。気になったのは、イベントビルドを書き込むと、左側にmicrosoft accessクラスオブジェクトというのがあると思うのですが、その下に、 form_jyuuyou、form_tantou、form_メインという3つができていました。あと、何かお知らせしたほうが良いことがありましたらご連絡ください。度々申し訳ありません。よろしくお願い申し上げますm(__)m

  • klub
  • ベストアンサー率36% (14/38)
回答No.4

Watapo3さんにちょっと補足です。 多分コードが複雑になるため、記述しなかったのだと思いますが、元々入力されていないフィールドに更新したり、入力済みのフィールドをクリアしたりすると、正しく判定されなくなります。(nullの判定文は全てがFalseになるため)下記の様にした方が良いのではないでしょうか? If NZ(Ctr.OldValue,"")<> NZ(Ctr.Value,"") Then では

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

えぇまず、履歴用のテーブルを作ります。フィールドは次の通り。 ・テーブル名(テキスト型) ・顧客ID(数値型) ・フィールド名(テキスト型) ・履歴(テキスト型) ・更新時間(日付/時刻型) 以上でOKです。 で、次にサブフォーム1に次のコードを作ります。 Sub History_Tantou()  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 履歴 values('担当者'," & Me.顧客コード & _       ",'" & Ctr.Name & "','" & Ctr.OldValue & "',#" & Now() & "#)"    DoCmd.SetWarnings False    DoCmd.RunSQL strSQL    DoCmd.SetWarnings True    End If   End If  Next Ctr End Sub で、その次は、サブフォーム1の更新前の処理として上記の History_Tantou を実行。 最後に、更新後の処理として Forms("メインフォーム名").Requery でサブフォーム1の準備は完了です。 サブフォーム2については、History_Juuyouとでもして、「担当者」→「重要人物」に変更してください。その他は同じで結構です。 最後にサブフォーム3(冒頭に作成した履歴テーブルをレコードソースに)を作成、親-子で顧客IDをキーにすれば履歴がサブフォームで見られるはずです。 一応テストはしてみました。正常に動作しましたが、文書では判りにくいことがあるかもしれませんのでご不明の点がございましたら補足要求してください。 なお、標準モジュールで一つにまとめた方が良いかもしれませんが、サブフォーム名不明のため個別に書いてみました。 では、頑張って下さい。

  • klub
  • ベストアンサー率36% (14/38)
回答No.2

できま~す! 1つパターンを説明します。 A、B、CというフィールドがあるテーブルXがあるとします。 またXと同じフィールドを持ち変更日時を持つテーブルZを作成します。 テーブルXが更新されると内容を変更時点の日時と共にテーブルZに追加クエリーなどで書き込む。 フォーム上の更新後プロパティで動かせばOKです。 でもこの場合既に「東京」と入っているところに上書きで「東京」と同じ値を入力しても更新後になるので、見た目同じでも更新後プロパティは動いてしまいます。 まだ方法はありますが、できるという報告まで。

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

以下に示すように何種類かパターンが考えられますが全て実現可能だと思います。 1)履歴を残したいフィールドは決まっており、他のフィールドの変更は履歴として残しておかなくても良い。 2)変更されたフィールドは全て確認したく、変更されたフィールド名と共に履歴を残したい。 3)何れかのフィールドが変更されたら、変更されなかった全てのフィールドを含め履歴として残したい。 以上のどれがご要望かを補足していただければサンプルコードを返答いたします。(フィールド名等わかれば尚可)

cas-jp
質問者

お礼

wtapo3さん、(no.164850でお世話になりました)先日は本当にありがとうございました。申し訳ありません。教えていただきたいことがあります。前回は、2)のパターンで教えていただいたのですが、3)のパターンにする必要性が出てきてしまいました。前回のやり取りの情報は残っていますでしょうか?ぜひとも教えてください。それからこの件の返答は、no.162393(11/3質問:ACCESSで更新履歴情報を保存(表示)する・・・)にお願いいたします。重ね重ねよろしくお願いいたします。

cas-jp
質問者

補足

お答えありがとうございます。1-3のどれに該当するかですが、2にあたると思われます。(難しいようであれば3でも。)お言葉に甘えて実情を申し上げます。アクセスを利用して顧客情報を処理しようとしています。まず、本社情報フォーム(顧客コード・会社名・代表者名・等々)その中の顧客コードをキーにサブフォーム1として担当者情報(部署名・役職・氏名・等々)。サブフォーム2として重要人物情報(名前・部署・役職・等々)を表示するかたちです。それで、問題となる更新の履歴なのですが、サブフォーム1・2のどこかが変更された時に、変更されたフィールド名と共に履歴に残したいのです(日付と顧客コードも。必要であれば、テーブル名?フォーム名?も)。尚且つ、その更新の履歴をサブフォーム3として表示させたいのです。こんな状況なのですが、ご教授願えますでしょうかm(__)m

関連するQ&A

  • Access2007:フォームからに誤って上書きして元のデータが消えてしまった

    Access2007でフォームから誤って3件のデータを上書きしてしまいました。テーブルのデータが変更されてしまって、元にあったデータがなんて書いてあったのかわからなくなりました。アクセスでは、レコードを移動するたびに自動保存されるので、間違って上書きしたデータが保存されてしまい、元のデータがわからなくなりました。"戻る"ボタンで戻っても、レコードを上書きした後の状態までしか戻せませんでした。このような時、どうすれば元のデータがわかりますか?

  • ACCESSでデータ変更箇所が分かるようにする方法

    ACCESS初心者です。 顧客住所録管理をしていて、フォームで既存レコードのどこかのフィールドを変更したら、”変更日時”のフィールドに日時が入るように指定しました。 (全てのフィールドのプロパティ更新後処理に           Me![更新日時].Value = Now()     と設定。) 変更日時で抽出をかければ特定の日以後に変更のあったデータを抽出してくれるの ですが、どのフィールドが変更になったかは分かりません。 そこで、変更があったフィールドに色をつけるということはできないものかと考えました。 フォームの条件付書式で条件が真のときに色を塗るっていうのがありましたよね。 あんな感じのことがしたいのですが・・・。 各フィールドの更新後処理になにかVBAを付け加えればいいのでしょうか? 初心者なもので質問が的を得ていないのかもしれませんが、どなたかご教授頂ける方、よろしくお願いします。

  • Access2000(>_<)

    Access2000を使っています。 既存のデータベースからレコードを削除できないように設定したいと思っています。 そこで、フォームのデザインにて、フォームのプロパティを開き、「データ」タブで「削除の許可」を「いいえ」にしてから閉じてみたのですが、試しにテーブルでレコードを削除してみると、削除できてしまいます。 再びフォームのプロパティを見ると、「削除の許可」が「はい」に戻っています。変更が保存されていないようです。 同様に、特定のフィールドの上書きを禁止したいので、同じくフォームのデザインで、上書きを禁止したいフィールドのテキストボックスのプロパティの「データ」タブにて、「編集ロック」を「はい」にしてから閉じましたが、この変更も保存されておらず、編集ができるままの状態です。 どうすれば変更を保存できるのでしょうか…。 またほかに、レコードの削除を禁止する方法、特定のフィールドのみ上書きを禁止する方法があれば教えてください。初心者なのでわかりやすく教えていただけると助かります。よろしくお願いします。

  • Access2010 更新データのレポート表示

    Access初心者です。 新規データを入力しても、レポートが更新されずに困っています。 (テーブルや、フォーム内では、データは更新されています) エクセルデータをAccess2010にインポートして、元テーブルを作成しました。 元テーブルを元に、フォーム・レポート・検索クエリ(年度別・分類別)等を作成しました。 ここまでの作業で、新規データの入力はありませんでした。 ところが・・・ 新規データをフォームに入力すると、元テーブルは更新されますが、既に作成しているレポートには、新規レコードが表示(反映)されません。 更新されている元テーブルを元に、もう一度レポートを作成しても、新規レコードは表示されません。 ホームタブの「全て更新」ボタンをクリックしても、新規レコードはレポートには表示されません。 尚、Access初心者です。 「更新クエリ」なるものは、作成していません。というか、「更新クエリ」って何?状態です。 また、クエリそのものが良くわかっておらず、作成したクエリは全て「検索」のためのクエリで、抽出条件に「 [] 」を入力したり、フィールドに「 年度: Year(DateAdd("m",-3,[発送日])) 」を入力したりしかできません。 勿論、リレーションシップって何???状態です。 どうしたらよいのでしょうか??? どなたか、初心者でもわかるように、教えていただけないでしょうか? 宜しくお願いいたします。

  • Access2010で・・・

    Access初心者です。 社内でデータベースを作ることになり、分からないながらもやっていて、いざデータの入力をしようとすると問題が起きてしまいました。 クエリやフォームでデータを入力しレコードを追加して、上書き保存し画面を閉じて、また開くとクエリやフォームにレコードが追加されていないんです。 テーブルには、ちゃんと追加されています。 この原因は何でしょうか? お教えください。

  • ACCESS 同一フォームで異なるデータ表示できるか

    ACCESS初心者です。 ACCESSで住所録を作成し、普段はフォームで閲覧できるものを作成中です。 全てのデータを1つのテーブルにまとめると1000以上のレコードとなる為、グループごとに表示できればと思っています。(コンボボックスで一覧表示していますが、数が多すぎます) 1000のレコードはABCDE5つのグループ200人づつで構成されているとお考え下さい。 フォームは変更せず常に同一のものを使用したいです。表示するデータのみ何らかの方法で切り替えて表示したいと考えています。 どのような方法にすればそのような事ができるのでしょうか。 よろしくお願いします。

  • Access フォームの表示順をなおしたい

    いつもお世話になっています。 Access フォームを利用していたのですが、テーブルの既存データを更新してから、そのフォームでのデータ表示順が変わってしまいました。 レコードにはIDとして番号データがあるので、小さい順にフォームに表示させたいと思います。 ちなみに、元となるテーブルはID番号が小さい順に並んでいます。 よろしくお願いします。

  • Accessフォームのファイル名を変更して・・・

    お世話になります。 WIN98でAccess2000を使用しています。 (Access初心者です) 仕事でAccessにデータ入力をすることになりました。 既存のフォームに入力していくのですが、前回の データが入っているのでデータを消去しなければなりません。 とりあえず、テーブルのほうでデータをすべて削除をしました。 今度は既存のテーブル、フォーム、クエリ、レポートのファイル名を「A」から「B」に変更をしました。 ですが、フォーム、レポートを開くとファイル名は「A」のままなんです。いろんなところを見たのですが 結局わからなくて困っています。 あとはどこを変更するのでしょうか? (初歩的なことでスミマセン) それと、ExcelからAccessのテーブルへ データをインポートして、テーブルには無事データが インポートされたのですが、フォームにはそのデータが 反映されていませんでした。 インポートしたデータをフォームでも見れるようにするにはどこをいじったら良いのでしょうか? 本を見ても検索してみてもこんな初歩的な質問は無く 本当にお恥ずかしい内容なのですが、 宜しくお願い致します。

  • アクセスで変更ログを作成する

    MS-Access2000です。データ保護のため、変更ログを取ろうかと考えています。一応以下のような手順を計画中ですが、他によい方法やアドバイス等あればご教授下さい 1.対象テーブルをコピーしてバックアップテーブルを作る 2.対象テーブルに「更新フラッグ」フィールド(boolean)を追加する 3.通常の操作(入力作業)で、レコードに対する変更が行われれば「更新フラッグ」をたてる 4.入力作業終了時に更新フラッグが立っているレコードは、IDでリレーションをとり、バックアップテーブルから当該レコードを「変更履歴テーブル」に(日時と共に)書き出す 5.バックアップテーブルと、対象テーブルの同期を取り、更新フラッグを倒す ざっとこんなかんじですが結構面倒で、何かもっと簡便な方法がないかと思考中です。

  • アクセスでレコードの内容が変更されたかどうかを調べるには

    Win2000、Access2000を使用しています。 以下の作業をするためのVBを作成しているのですが、レコードの内容が変更されたかどうかを調べるためのコードとその他のコードとの組み立てがわからず困っています。 部分的にでもかまいませんので、おわかりになる方がいましたら教えてください。 1.フォーム上に作成した「戻るボタン」をクリックした時のイベントで、レコードの内容が変更されていたらメッセージボックスを表示する。 2.メッセージボックスの「はい」をクリックしたら、保存してフォームを閉じる。 3.メッセージボックスの「いいえ」をクリックしたら、変更されたフィールドの値を変更前の状態に戻してフォームを閉じる。 以上、よろしくお願いします。

専門家に質問してみよう