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

履歴を取るのに「更新者=使用者」これは、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

ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すという、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

A 回答 (6件)

「あ履歴」テーブルに「更新者(テキスト型)」を作成します。



で、以下に変更
strSQL = "insert into あ履歴 select * '" & CurrentUser & "' as 更新者 FROM あ " & _
  "where 顧客コード = " & Me.顧客コード

でOK(^ ^)

そんでもって、
>ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すとい
>う、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

これは本当にDLookUpで出来るでしょう(最終更新日を先に抽出していると仮定して)。顧客IDと最終更新日でユニークになるはずですので・・・。

この回答への補足

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

補足日時:2001/11/22 19:01
    • good
    • 0

ははは、またポカをしてしまった(もう笑うしかない)



strSQL = "insert into あ履歴 select * , '" & CurrentUser & "' as 更新者 FROM あ " & _
  "where 顧客コード = " & Me.顧客コード

「*」と「'」の間に「,」を入れるのを忘れてしまったみたい(単純なタイプミス・・・・別に前後の半角スペースはあっても無くても結構です。)

申し訳ありませんでした。m(_ _)m

この回答への補足

watapo3さーん!
(T_T)(*_*)(@_@)(T_T)

>これは本当にDLookUpで出来るでしょう(最終更新日を先に抽出していると仮定して)。顧客IDと最終更新日でユニークになるはずですので・・・。

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

補足日時:2001/11/22 22:52
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/23 02:08

うぅ~む、自力での解決は無理でしたか・・・(^ ^;



以前、最新の更新日を得るDLookUpは成功したと思いますので、
そのコントロールの値を使用します。(コントロール名「最新更新日」と仮定)

=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _
  " AND 更新日時 = #" & [最新更新日] & "#"

補足:
日付型は「#」で囲んでやる必要があります。

では、頑張って下さい。m(_ _)m・・・ちなみに更新者名の記録は成功したのだろうか(?_?)

この回答への補足

自力で頑張ろう!!と頑張ってはいるものの・・・。

>ちなみに更新者名の記録は成功したのだろうか(?_?)
これは成功しております(^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

補足日時:2001/11/24 09:54
    • good
    • 0

ちょっと紛らわしい表記があった為修正です。



>以前、最新の更新日を得るDLookUpは成功したと思いますので、

DMaxを使用して抽出したんでしたね!

>=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _
  " AND 更新日時 = #" & [最新更新日] & "#"

更新日というフィールド名で作成していると思いますので・・・以下に変更

=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _
  " AND 更新日 = #" & [最新更新日] & "#"


以上です。m(_ _)m

この回答への補足

ほにゃ~!できませーん(*_*)エラーなのです。
挿入したテキストボックスのコントロールソースに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)が、オートナンバー型のデータに対してどのような入力をすれば良いのかわかりません。
(オートナンバーは使用できるのでしょうか?)
教えてください。よろしくお願い申し上げます。

補足日時:2001/11/24 01:04
    • good
    • 0

確認はしていないのですが、取り急ぎ・・・



=DLookUp("更新者","履歴","((顧客コード='" & [顧客コード] & _
  "') AND (更新日 = #" & [最新更新日] & "#))"

でどうですか?

オートナンバー型を使用する場合のSQLは後ほど・・・
    • good
    • 0
この回答へのお礼

m(__)m できました(^o^)丿

本当にいろいろありがとうございました。(T_T)
これで、やっと安らかな眠りにつくことができます(^.^)

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

お礼日時:2001/11/24 19:54

>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() & "')"
    • good
    • 0

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