プロが教える店舗&オフィスのセキュリティ対策術

アクセス初心者です。とても困っています。
困っているのは、履歴は書き出すのですが、複数書き出してしまうということなのです。

詳しく申し上げますと、
フォーム「テレ_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

A 回答 (2件)

おつかれさまです


何点か気付いた点を記します

>strSQL = "insert into テレ履歴 select * , '" & CurrentUser & "' as 更新者 FROM テレ '" & _
>"where 顧客コード = " & Me.顧客コード
このSQL文ですが、"~ FROM テレ '"の"テレ"の後ろに書いてある"'"はいりません

>つまり、table:テレ(フォーム:テレ_sb)に10ユーザーの情報が入っているとすると、「A」について変更を行うと、10ユーザー全ての履歴を取ってきてしまうのです。
フォーム構造ですが、メインフォームとサブフォームは関連付けされているのでしょうか?
今回の掲題だと「顧客コード」にて、関連付けされていることが望ましいですね

また考えれることが、「テレ」テーブルの内容をすべて「テレ履歴」テーブルに書き込むということが発生していると思われます。
SQL文作成後にブレイクをはって、SQL文の内容をイミディエイトウィンドウにて確認してみるのが、宜しいかと思います。
(1)"DoCmd.SetWarnings False"にてブレイクをはる
(2)イミディエイトウィンドウにて、「print strsql」とかきENTER
(3)表示されたSQL文をクエリのSQLウィンドウにコピーし、内容が正しく実行するか確認する

ちなみに正常動作の確認は行いました。
問題なく動作すると思いますよ(^^)/

この回答への補足

お答え有難うございますm(__)m
残念ながら、だめでした。(T_T)
SQL文の"~ FROM テレ '"の"テレ"の後ろに書いてある"'"を削除すると、「パラメータの入力」を聞いてきます。(1)-(3)の作業は、初めてしてみました。何とか作業はできたのですが、こちらでも同様でした。
「フォーム構造のメインフォームとサブフォームは関連付け」についてですが、これは、リレーションシップのことでしょうか?(メインフォームの元となるテーブル「元データ」とサブフォームの元となるテーブル「テレ」は、顧客コードでリレーションシップしてますが・・・、それ以外のことならばできていないと思います。)
でも、なぜなんでしょう(T_T)あーー助けてください。m(__)m何か他に確認する所はないでしょうか?

補足日時:2002/01/10 21:44
    • good
    • 0

こんにちは



> 「A」について変更を行うと、10ユーザー全ての履歴を取ってきてしまうのです。
顧客の指定が抜けているものと思われます
下記SQL文に置き換えて使用してみてください
'~~~~~~~~~~~~~~~~~~~~
strSQL = "INSERT INTO テレ_履歴 ( 更新者 ) " & _
"SELECT テレ.*, '" & CurrentUser & "' AS 更新者 " & _
"From テレ " & _
"WHERE (((テレ.顧客コード)=" & Me.[顧客コード].Value & "));"
'~~~~~~~~~~~~~~~~~~~~

フォーム構造ですが、メインフォーム「テレ_sb」の中にサブフォーム「SF_テレ履歴」があるんですよね?
でしたら、サブフォームのプロパティの中に「リンク子フィールド」と「リンク親フィールド」があると思います。
その値が”顧客コード”になっているのが望ましいと思います
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!