質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

535閲覧

Access2021 人件費レートのみを更新した時、更新前の状態で保存されてしまう

syuu07

総合スコア11

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

1グッド

0クリップ

投稿2024/03/26 07:40

編集2024/03/26 08:27

実現したいこと

取引先フォームでテキストボックスにある「人件費レート」という数値を更新したときだけ、追加クエリによる保存を行いたいのですが更新履歴テーブルに表示される更新日が一つ前に保存した時間で表示されてしまいます。
どのように変更すればテキストボックスにある指定されたデータが変更されたとき、更新履歴に更新後のデータが保存できるのでしょうか?

発生している問題・分からないこと

人件費レートも更新前のデータが更新履歴テーブルに表示されており、更新後のデータが抽出できない状況です。
取引先フォームにはいくつかのフォームがあり「人件費レート」というレコードをテキストボックスとして表示させ、このテキストボックスが更新された時だけ更新履歴テーブルにデータを保存したいです。

<具体例>
取引先フォームにて

得意先ID 1 得意先名 ねずみ 人件費レート 0.1 更新日 2024/03/26 16:53:38

というデータがあります。こちらを

得意先ID 1 得意先名 ねずみ2 人件費レート 0.6 更新日 2024/03/26 16:54:00

に変更しました。しかし、履歴に残るのは

履歴ID 1 得意先ID 1 得意先名 ねずみ 人件費レート 0.1 更新日 2024/03/26 16:53:38

こちらの更新前のデータになってしまいます。

該当のソースコード

[選択の種類]「テキストボックス」 更新前処理 埋め込みマクロ 値の代入 アイテム = [更新日]                式    = Now() 更新後処理 埋め込みマクロ メッセージボックス メッセージの表示 いいえ               クエリを開く 更新クエリ

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://hamachan.info/win7/access/rireki1.html

・上記のサイトを参考に[選択の種類]が[フォーム]になっているときはうまく実行することができ更新後のデータが履歴に保存されていました。

・[選択の種類]を[テキストボックス]に変え上記のコードを入れて実行すると更新前のデータで保存されてしまいます。

・更新前処理に更新後処理のマクロを入れてみたが、変化なし

補足

Microsoft Access 2021(.accdb)

取引先
得意先ID(主キー) 得意先名 人件費レート 更新日

更新履歴
履歴ID(主キー 自動による数値) 得意先ID 得意先名 人件費レート 更新日

更新クエリ
フィールド   得意先ID(主キー)        得意先名 人件費レート 更新日
テーブル    取引先             取引先  取引先    取引先
レコードの追加 得意先ID(主キー)        得意先名 人件費レート 更新日
抽出条件    [forms]![取引先リスト]![得意先ID]
追加先  更新履歴

hatena19👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

logres_Fan

2024/03/26 07:45

具体例を提示しませんか?
syuu07

2024/03/26 08:28

コメントありがとうございます。 追記させていただきました。
sazi

2024/03/27 01:10

参考にしたサイトでは、[選択の種類]を[フォーム]にするように強調されているのに、[テキストボックス]に変更したのは何故ですか? そもそも、「レコードの保存」がどういったタイミングで行われるようになっているのかが不明です。 ※データシートビューであれば、レコードからフォーカスが外れた時ですが、画面イメージが不明です。
syuu07

2024/03/27 01:33 編集

コメントありがとうございます。 今回は取引先のレコードの一つである「人件費レート」が更新された時だけ更新履歴にてデータを保存したいからです。 [選択の種類]を[フォーム]にすると実行自体はできるのですが、フォームのいずれかの項目が更新されたときに更新履歴に保存してしまうからです。 保存の仕方は参考にサイトした通りに作成しました。 取引先テーブルをフォームにしフォームビューの段階が変更されたとき更新前処理と更新後処理が実行され、更新クエリが起動し更新履歴テーブルにてレコードが保存されます。
sazi

2024/03/27 01:59

> 保存の仕方は参考にサイトした通りに作成しました。 どういった場合でも同じですが、理解した上での変更で無ければ意図どおりにならない場合もあるという事です。 参考サイトでは、イベントを利用しています。変更するには、そのイベントがどういった時に発生するのかを理解した上で行う必要があります。
guest

回答2

0

[選択の種類]を[フォーム]にすると実行自体はできるのですが、フォームのいずれかの項目が更新されたときに更新履歴に保存してしまうからです。

追加クエリーの条件に、「履歴テーブルの最終データと取引先の「人件費レート」が変更されているか」の比較を加えれば良いのではないでしょうか?
※どのようなクエリーを実行しているのか不明なので、具体的には答えられませんが。

投稿2024/03/27 02:16

編集2024/03/27 02:19
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syuu07

2024/03/27 04:18

ご回答ありがとうございます。 今回はお先に回答をくださった方のコードを参考にさせていただきました。 教えてくださったことは今後の勉強の参考にさせていただきます。
guest

0

ベストアンサー

  • フォーム[取引先リスト]のレコードソースはテーブル[取引先]である。

  • [取引先リスト]の詳細セクション上の連結テキストボックス[人件費レート]のコントロールソースはフィールド[人件費レート]である。

という状態であるなら、テキストボックス[人件費レート]の[更新後処理]イベントが発生した時点では、[取引先リスト]のカレントレコードはまだ保存されていません

更新クエリ
フィールド   得意先ID(主キー)        得意先名 人件費レート 更新日
テーブル    取引先             取引先  取引先    取引先
レコードの追加 得意先ID(主キー)        得意先名 人件費レート 更新日
抽出条件    [forms]![取引先リスト]![得意先ID]
追加先  更新履歴

上記の追加クエリを実行しようとする時点において、[取引先リスト]のカレントレコードがまだ保存されていないのならば、このクエリによって追加されるのは「[取引先リスト]によって編集が開始される前の状態のカレントレコード」のコピーでしかありません。

取引先フォームでテキストボックスにある「人件費レート」という数値を更新したときだけ

  • 「カレントレコードの編集を開始する前の[人件費レート]の値」と「カレントレコードを保存した後の[人件費レート]の値」とを比較し、もし両者の値が異なっていればテーブル[更新履歴]に後者の状態のカレントレコードのコピーを追加する。両者の値が一致していればテーブル[更新履歴]に対してレコードを追加しない。

  • 編集中のカレントレコードが保存されるか否かに関わらず、テキストボックス[人件費レート]の[更新後処理]イベントが発生した時点でテーブル[更新履歴]にカレントレコードのコピーを追加する。

とでは、処理自体の意味も、その処理を実行するタイミングや方法も異なります。

もし後者の意味でおっしゃっているのであれば、例えばテキストボックス[人件費レート]の[更新後処理]イベントが発生した時点で強制的に[取引先リスト]のカレントレコードを保存してから追加クエリを実行すれば一応は可能でしょうけど、アンドゥ操作が効かなくなるという点においてあまりお奨めしません。

前者の意味でおっしゃっているのであれば、概ね次のような流れでフォームの[更新前処理]イベントおよび[更新後処理]イベントで埋め込みマクロを実行なさればよいでしょう。

フォームの[更新前処理]イベント

  • 保存されようとしているカレントレコードが新規レコードである場合は、履歴追加フラグを有効にする。
  • 保存されようとしているカレントレコードが既存のレコードである場合は[人件費レート]の編集前の値と編集後の値を比較し、もし両者の値が異なっていたら履歴追加フラグを有効にする。

イメージ説明
イメージ説明
イメージ説明

フォームの[更新後処理]イベント

  • もし履歴追加フラグを有効になっている場合は、テーブル[更新履歴]にレコードを追加する追加クエリを実行する。

イメージ説明

投稿2024/03/26 09:32

編集2024/03/27 02:02
sk.exe

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syuu07

2024/03/26 23:45 編集

丁寧なご説明、ご回答ありがとうございます。 ・フォーム[取引先リスト]のレコードソースはテーブル[取引先]である。 ・[取引先リスト]の詳細セクション上の連結テキストボックス[人件費レート]のコントロールソースはフィールド[人件費レート]である。 →その認識で大丈夫です 取引先フォームでテキストボックスにある「人件費レート」という数値を更新したときだけ 「カレントレコードの編集を開始する前の[人件費レート]の値」と「カレントレコードを保存した後の[人件費レート]の値」とを比較し、もし両者の値が異なっていればテーブル[更新履歴]に後者の状態のカレントレコードのコピーを追加する。両者の値が一致していればテーブル[更新履歴]に対してレコードを追加しない。 →こちらの処理を実現しようと思った場合、更新クエリを変更する必要があるのでしょうか?
syuu07

2024/03/27 03:03

説明の追記、ありがとうございます。 画像の通りに作成したところ、NewRecordの方はうまくいきましたが一つのエラーが発生しました。 このオブジェクトには、オートメーション オブジェクト'oldvalue'は含まれません。 アクション実行のエラー エラー: [人件費レート]<>[人件費レート].[OldValue] エラー番号 2766 エラーを見る限りOldValueが機能していないみたいですが原因の方がわかるでしょうか?
sk.exe

2024/03/27 04:12

> このオブジェクトには、オートメーション オブジェクト'oldvalue'は含まれません。 そのフォームのレコードソース(テーブル[取引先])に[人件費レート]という名前のフィールドが存在しているのに対し、そのフォーム上には[人件費レート]という名前のテキストボックスが存在していないからでしょう。 例えば、フィールド[人件費レート]をコントロールソースとする連結テキストボックスの実際の名前が[tbx人件費レート]であるならば、[tbx人件費レート]の OldValue プロパティを参照するようにして下さい。 -------------------------------------------------------------------- [tbx人件費レート]<>[tbx人件費レート].[OldValue] --------------------------------------------------------------------
syuu07

2024/03/27 04:16

ご回答ありがとうございます。 無事に解決しました。 ここまで教えてくださってありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問