OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • すぐに回答を!
  • 質問No.164850
  • 閲覧数719
  • ありがとう数2
  • 気になる数0
  • 回答数7
  • コメント数0

お礼率 38% (15/39)

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

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

  • 回答No.7
レベル9

ベストアンサー率 76% (33/43)

思いつくままコードを書いていた為、いろいろとご迷惑をおかけしてすいません。m(_ _)m

で、履歴を表示する第三のサブフォーム名を仮に[SF_履歴]と致します。

更新後の処理で

Forms("メイン").Requery

と記述している部分を

Forms("メイン").Form.SF_履歴.Requery

と、修正してください。
これでやっと完成のはず・・・・・・(^ ^;
お礼コメント
cas-jp

お礼率 38% (15/39)

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

その他の回答 (全6件)

  • 回答No.2
レベル8

ベストアンサー率 36% (14/38)

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

1つパターンを説明します。

A、B、CというフィールドがあるテーブルXがあるとします。
またXと同じフィールドを持ち変更日時を持つテーブルZを作成します。

テーブルXが更新されると内容を変更時点の日時と共にテーブルZに追加クエリーなどで書き込む。

フォーム上の更新後プロパティで動かせばOKです。

でもこの場合既に「東京」と入っているところに上書きで「東京」と同じ値を入力しても更新後になるので、見た目同じでも更新後プロパティは動いてしまいます。

まだ方法はありますが、できるという報告まで。

  • 回答No.1
レベル9

ベストアンサー率 76% (33/43)

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

1)履歴を残したいフィールドは決まっており、他のフィールドの変更は履歴として残しておかなくても良い。
2)変更されたフィールドは全て確認したく、変更されたフィールド名と共に履歴を残したい。
3)何れかのフィールドが変更されたら、変更されなかった全てのフィールドを含め履歴として残したい。

以上のどれがご要望かを補足していただければサンプルコードを返答いたします。(フィールド名等わかれば尚可)
補足コメント
cas-jp

お礼率 38% (15/39)

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

お礼率 38% (15/39)

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

ベストアンサー率 76% (33/43)

えぇまず、履歴用のテーブルを作ります。フィールドは次の通り。 ・テーブル名(テキスト型) ・顧客ID(数値型) ・フィールド名(テキスト型) ・履歴(テキスト型) ・更新時間(日付/時刻型) 以上でOKです。 で、次にサブフォーム1に次のコードを作ります。 Sub History_Tantou()  Dim Ctr As Control  Dim strSQ ...続きを読む
えぇまず、履歴用のテーブルを作ります。フィールドは次の通り。

・テーブル名(テキスト型)
・顧客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をキーにすれば履歴がサブフォームで見られるはずです。

一応テストはしてみました。正常に動作しましたが、文書では判りにくいことがあるかもしれませんのでご不明の点がございましたら補足要求してください。

なお、標準モジュールで一つにまとめた方が良いかもしれませんが、サブフォーム名不明のため個別に書いてみました。

では、頑張って下さい。
  • 回答No.4
レベル8

ベストアンサー率 36% (14/38)

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

If NZ(Ctr.OldValue,"")<> NZ(Ctr.Value,"") Then

では
  • 回答No.5
レベル9

ベストアンサー率 76% (33/43)

klubサンのおっしゃる通り If NZ(Ctr.OldValue,"")<> NZ(Ctr.Value,"") Then の方がいいですね(^ ^) また、フィールド名を履歴として残すなら Ctr.Name   ↓ Ctr.ControlSource の方が良かったですね。 Ctr.Nameだとフィールド名とテキスト ...続きを読む
klubサンのおっしゃる通り

If NZ(Ctr.OldValue,"")<> NZ(Ctr.Value,"") Then
の方がいいですね(^ ^)

また、フィールド名を履歴として残すなら

Ctr.Name
  ↓
Ctr.ControlSource

の方が良かったですね。
Ctr.Nameだとフィールド名とテキストボックス名が異なると、ちょっと困ってしまいますので・・・・

ご助言ありがとうございました。m(_ _)m
補足コメント
cas-jp

お礼率 38% (15/39)

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
投稿日時 - 2001-11-10 15:22:35
  • 回答No.6
レベル9

ベストアンサー率 76% (33/43)

あっ、本当だ(^ ^)。再現しました。 再現してちょっとうれしいです。 以上はさておき、 >・更新前処理へ、=[History_Tantou] >・更新後処理へ、=[Forms]("メイン").[Requery] これらを「=~」の形(式ビルダ)ではなく、更新前・更新後のコードビルダより直接コードとして Private Sub Form_BeforeUp ...続きを読む
あっ、本当だ(^ ^)。再現しました。
再現してちょっとうれしいです。

以上はさておき、

>・更新前処理へ、=[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

お礼率 38% (15/39)

早速のお返事ありがとうございます。でっ、でっ、できました(^o^)丿。(T_T)しかし、(メインフォームから)例えば、顧客コードで2件目のデータを処理する時、担当者のサブフォームに更新を加え、その後重要人物のサブフォームへ移動して更新を加えようとクリックすると、(表示が)必ず顧客コードで1件目のレコードへ戻ってしまいます。(@_@)顧客コードで2件目のデータを更新している時は、2件目のデータのままでいてほしいのですが。。どうにかなりますでしょうか?
投稿日時 - 2001-11-11 10:44:57
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ