以前上記スレッドにて教えていただいた方法を大変重宝しております。
しかし、うまく作動しない点が1個ありまして、サブ案件フォームにて最新の購入日を削除した際
(レコード自体は削除していない)
商品フォームのレコードソースのテーブルに「最新購入日」のフィールドが更新されず
削除したはずの最新購入日が残っています。
ちなみに、商品フォーム自体は教えていただいた関数が入っているので更新されています。
わたしの作成方法に間違いがあるのでしょうか…。スミマセン。ご指導お願いいたします。
以前上記スレッドにて教えていただいた方法を大変重宝しております。
しかし、うまく作動しない点が1個ありまして、サブ案件フォームにて最新の購入日を削除した際
(レコード自体は削除していない)
商品フォームのレコードソースのテーブルに「最新購入日」のフィールドが更新されず
削除したはずの最新購入日が残っています。
ちなみに、商品フォーム自体は教えていただいた関数が入っているので更新されています。
わたしの作成方法に間違いがあるのでしょうか…。スミマセン。ご指導お願いいたします。
前のスレッド、いま見直してみたら、ちょっと間違ってますね。
メインフォームの更新前処理で最新日を更新してますが、サブフォームで更新してもメインフォームの更新前処理は発生しないので、サブフォームの更新後処理でメインフォームの最新日を更新すべきですね。
メインフォームの更新前処理のイベントプロシージャを削除して、サブフォームの更新後処理に下記のコードを記述してください。
うまくいきました。ありがとうございます。
こちらですが、購入日を更新すると、なぜかコントロールソースの最新購入日が「00:00:00」?に変換されて表記が「1899/12/30」になってしまいます。
コントロールソースではなくて関数でひっぱっている部分は正しい最新購入日になっています。
サブフォームの違う項目を更新すると、正しい表記に更新されます・・・
こちらの件について、「MsgBox "コードが実行されました"」を試してみました。
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤一つ前の更新結果が反映される
こちらの件について、「MsgBox "コードが実行されました"」を試してみました。
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤「1回前の」更新結果が反映される
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③サブフォームの別のテキストボックスなどを更新
④フォームを閉じる
⑤「コードが実行されました」とメッセージボックスが表示される
⑥「今回の」更新結果が反映される
(※⑤⑥の更新結果は、コントロールソース(テーブル)への反映の件です)
何度も何度も実験していたら、常に上の動きではありませんでした。
そして時々「1899/12/30」になります。理解ができず…何度もすみません。
もう1つの質問でご回答いただいている、「保存する」をじっくり確認して、試みてみます。
こちらの問題ですが、「保存する」では解決できなさそうでした。
お伝えしたようにうまく更新される時もあったり、
できないときもあり、なぜかテーブルのフィールドが「0:00:00」になってしまった
データについて、確認した内容をお伝えさせていただきます。
としたところ、「0:00:00と」と表示されます。
サブフォームのフォームヘッダーかフッターにテキストボックスを配置して下記のように設定しています
名前 最新購入日
コントロールソース =Max([購入日])
※テキストボックスには2020/10/14と表示されている。
メインフォームの最新購入日を表示するテキストボックスは、下記のように設定しています。
名前 txt最新購入日
コントロールソース =[サブフォームコントロール名].Form![最新購入日]
※テキストボックスには2020/10/14と表示されている。
メインフォームのレコードソースのテーブル(商品テーブル)に「最新購入日」フィールドがあります。
※0:00:00と表示されている。
謎です…😯
こうなってから、サブフォームの他のコンボボックスを更新してメインフォームを閉じる(閉じる際にレコードを保存)と、テーブルのデータも2020/10/14になります。
おそらく発生するタイミングの問題かなという気がします。
サブフォームのレコードが更新される。
更新後イベントが発生する→VBAで親フォームに最新購入日を代入。
その時点では =Max([購入日]) の計算が終わっていない。
メインフォームに転記するイベントを別のものにしてみる。
例えば、サブフォームコントロールのフォーカス喪失後で転記する。
これだとサブフォームで更新した後、メインフォームへ移動したときに転記されることになります。
他には、サブフォームのタイマー時イベントを利用するというのも考えられます。
タイマー間隔を0に設定しておいて、タイマー時のイベントプロシージャに転記のコードを記述する。
更新後処理のイベントプロシージャは下記のように記述。
いちおう100ミリ秒後に転記するようにしてますが、うまくいかないようなら秒数を増やしてください。
ありがとうございます。3000まであげたのですが、やはり動作がうまくいったりいかなかったりします。
もっとあげるべきなのでしょうか。
確かに更新する瞬間、「最新購入日」のテキストボックス内容(2020/10/14)が両方とも一瞬消えるのが気になっていました。
現在でも消えていますが、そのことと関係しますか?
Me.Recalc
Me.Me.最新購入日.Requery
のどちらか、あるいは両方を挿入した場合はどうなりますか。
コピペしてみたのですが、うまくいきませんでした。私の設定にミスがあるのかもしれません…色々ご検討いただきありがとうございます。
込み入った処理が必要になってしまうなら「最新購入日」の取得方法を変えてしまったほうがいいような気がします
DMax()の引数は適切なものに置き換えてください
こちらに変更した後、数回テストしたところ、うまく動いてくれています。ありがとうございます!