Microsoft Access 掲示板

VBAで値を反映させたフィールドが更新されない

16 コメント
views
4 フォロー

非連結のテキストボックスデータを連結したい

以前上記スレッドにて教えていただいた方法を大変重宝しております。
しかし、うまく作動しない点が1個ありまして、サブ案件フォームにて最新の購入日を削除した際
(レコード自体は削除していない)
商品フォームのレコードソースのテーブルに「最新購入日」のフィールドが更新されず
削除したはずの最新購入日が残っています。
ちなみに、商品フォーム自体は教えていただいた関数が入っているので更新されています。

わたしの作成方法に間違いがあるのでしょうか…。スミマセン。ご指導お願いいたします。

どんぐり
作成: 2020/10/08 (木) 15:53:17
通報 ...
1

前のスレッド、いま見直してみたら、ちょっと間違ってますね。
メインフォームの更新前処理で最新日を更新してますが、サブフォームで更新してもメインフォームの更新前処理は発生しないので、サブフォームの更新後処理でメインフォームの最新日を更新すべきですね。

メインフォームの更新前処理のイベントプロシージャを削除して、サブフォームの更新後処理に下記のコードを記述してください。

Private Sub Form_AfterUpdate()
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub
2
どんぐり 2020/10/09 (金) 14:08:08 0029a@1c915 >> 1

うまくいきました。ありがとうございます。

3
どんぐり 2020/10/14 (水) 15:56:16 0029a@1c915

こちらですが、購入日を更新すると、なぜかコントロールソースの最新購入日が「00:00:00」?に変換されて表記が「1899/12/30」になってしまいます。
コントロールソースではなくて関数でひっぱっている部分は正しい最新購入日になっています。

サブフォームの違う項目を更新すると、正しい表記に更新されます・・・

4
どんぐり 2020/10/14 (水) 17:00:20 0029a@1c915

こちらの件について、「MsgBox "コードが実行されました"」を試してみました。

①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤一つ前の更新結果が反映される

5
どんぐり 2020/10/14 (水) 17:13:32 0029a@1c915

こちらの件について、「MsgBox "コードが実行されました"」を試してみました。

Private Sub Form_AfterUpdate()
    MsgBox "コードが実行されました"
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub

①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤「1回前の」更新結果が反映される

①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③サブフォームの別のテキストボックスなどを更新
④フォームを閉じる
⑤「コードが実行されました」とメッセージボックスが表示される
⑥「今回の」更新結果が反映される

6
どんぐり 2020/10/14 (水) 18:17:41 0029a@1c915 >> 5

(※⑤⑥の更新結果は、コントロールソース(テーブル)への反映の件です)
何度も何度も実験していたら、常に上の動きではありませんでした。
そして時々「1899/12/30」になります。理解ができず…何度もすみません。

7
どんぐり 2020/10/14 (水) 21:46:49 0029a@1c915 >> 6

もう1つの質問でご回答いただいている、「保存する」をじっくり確認して、試みてみます。

8
どんぐり 2020/10/14 (水) 22:50:24 0029a@1c915

こちらの問題ですが、「保存する」では解決できなさそうでした。

9
どんぐり 2020/10/14 (水) 23:12:25 0029a@1c915 >> 8

お伝えしたようにうまく更新される時もあったり、
できないときもあり、なぜかテーブルのフィールドが「0:00:00」になってしまった
データについて、確認した内容をお伝えさせていただきます。

Private Sub Form_AfterUpdate()
    MsgBox "コードが実行されました"
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    msgbox Me.Parent!最新購入日 &"と" & Me.最新購入日
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub

としたところ、「0:00:00と」と表示されます。


サブフォームのフォームヘッダーかフッターにテキストボックスを配置して下記のように設定しています

名前 最新購入日
コントロールソース =Max([購入日])

※テキストボックスには2020/10/14と表示されている。

メインフォームの最新購入日を表示するテキストボックスは、下記のように設定しています。

名前 txt最新購入日
コントロールソース =[サブフォームコントロール名].Form![最新購入日]

※テキストボックスには2020/10/14と表示されている。

メインフォームのレコードソースのテーブル(商品テーブル)に「最新購入日」フィールドがあります。

※0:00:00と表示されている。

謎です…😯

10
どんぐり 2020/10/15 (木) 00:14:52 f1ed8@60098

こうなってから、サブフォームの他のコンボボックスを更新してメインフォームを閉じる(閉じる際にレコードを保存)と、テーブルのデータも2020/10/14になります。

11

おそらく発生するタイミングの問題かなという気がします。

サブフォームのレコードが更新される。
更新後イベントが発生する→VBAで親フォームに最新購入日を代入。
その時点では =Max([購入日]) の計算が終わっていない。

メインフォームに転記するイベントを別のものにしてみる。

例えば、サブフォームコントロールのフォーカス喪失後で転記する。
これだとサブフォームで更新した後、メインフォームへ移動したときに転記されることになります。

他には、サブフォームのタイマー時イベントを利用するというのも考えられます。

タイマー間隔を0に設定しておいて、タイマー時のイベントプロシージャに転記のコードを記述する。

Private Sub Form_Timer()
    Me.TimerInterval = 0 'タイマー停止
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub

更新後処理のイベントプロシージャは下記のように記述。

Private Sub Form_AfterUpdate()
    Me.TimerInterval = 100 '100ミリ秒後にタイマー時イベント発火    
End Sub

いちおう100ミリ秒後に転記するようにしてますが、うまくいかないようなら秒数を増やしてください。

12
どんぐり 2020/10/15 (木) 10:47:53 0029a@1c915 >> 11

ありがとうございます。3000まであげたのですが、やはり動作がうまくいったりいかなかったりします。
もっとあげるべきなのでしょうか。

確かに更新する瞬間、「最新購入日」のテキストボックス内容(2020/10/14)が両方とも一瞬消えるのが気になっていました。
現在でも消えていますが、そのことと関係しますか?

13

Me.Recalc
Me.Me.最新購入日.Requery
のどちらか、あるいは両方を挿入した場合はどうなりますか。

Private Sub Form_Timer()
    Me.Recalc 
    Me.Me.最新購入日.Requery
    Me.TimerInterval = 0 'タイマー停止
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub
16
どんぐり 2020/10/15 (木) 21:22:12 0029a@1c915 >> 13

コピペしてみたのですが、うまくいきませんでした。私の設定にミスがあるのかもしれません…色々ご検討いただきありがとうございます。

14
hiroton 2020/10/15 (木) 11:39:54 df752@f966d

込み入った処理が必要になってしまうなら「最新購入日」の取得方法を変えてしまったほうがいいような気がします

Private Sub Form_AfterUpdate()
    Dim maxDate
    maxDate = DMax("購入日","T_案件","商品NO=" & Me!txt商品NO)
    If Me.Parent!最新購入日 = maxDate Then
    Else
       Me.Parent!最新購入日 = maxDate
    End If
End Sub

DMax()の引数は適切なものに置き換えてください

15
どんぐり 2020/10/15 (木) 21:20:16 0029a@1c915 >> 14

こちらに変更した後、数回テストしたところ、うまく動いてくれています。ありがとうございます!