Microsoft Access 掲示板

登録したデータをすぐに反映する

9 コメント
views
4 フォロー

現在
①商品テーブルを元にした商品フォーム
②会社テーブルを元にした会社フォーム
③商品IDと会社IDを主キーとした商品会社テーブル
があります。
会社フォームの中のサブ商品フォームから、新規登録ボタンを押して
商品フォームをポップアップで開き、商品を登録できるようにしているのですが
その後すぐに会社フォームのサブ商品フォームから、
登録したばかりの商品をコンボボックスに表示するには、
何を連動させれば良いのでしょうか。
(me.refreshやクエリの更新など行ってみましたが反映されず…勘違いでしょうか??)

どんぐり
作成: 2020/09/08 (火) 11:05:06
通報 ...
1

コンボボックスを Requery すればいいでしょう。
コードをどこに書くかによってコードは異なりますが、下記のようにすればどこに書いても機能します。

Forms!メインフォーム名!サブフォームコントロール名.Form!コンボボックス名.Requery
2
どんぐり 2020/09/09 (水) 09:56:53 1d451@2d897

コンボボックスをrequeryすればよいのですね…
これで、沢山のことが解決しそうです。ありがとうございます!

3
どんぐり 2020/09/18 (金) 17:02:36 1d451@2d897

データの更新問題につきまして、あちこちで更新されない状況が起きています…
コンボボックスには下記コードにてrequeryをつけたりしているのですが、
'''
private sub cbo更新したい_afterUpdate()
me.cbo更新したい.requery
end sub
'''
あっているでしょうか?
また、同期したいところがちょこちょこみつかるのですが、
テキストボックスやチェックボックスについても
全てにrequeryをつけるという対処方法になりますでしょうか?

マクロの選択の中に、「最新の情報に更新する」というものがあり
ページの頭にボタンを置いて更新をかけたりしますが、
それでも更新されないことがあり困っています。

4

フォームにレコードを表示していて、別のところ(別フォームや更新クエリ、VBAなど)で同じレコードを更新したときに、その更新が反映されないという意味でしたら、反映させたいフォームに対して Refresh すれば反映されます。

自分自身ならMe.Refresh、別フォームなら Forms!フォーム名.Refresh ということになります。
これはカレントレコードのみの更新です。

もし、帳票フォームで複数レコードの更新を反映させたいなら、フォームに対して Requery です。フォームに対してRequeryすると先頭レコードへ

前の回答のコンボボックスの Requery はValueの更新ではなく、コンボボックスのリストの更新になります。

Form.Refresh メソッド (Access) | Microsoft Docs

Requery メソッド (Access) | Microsoft Docs

5
どんぐり 2020/10/13 (火) 16:51:54 0029a@1c915

すみません…未だ、更新問題が解決しておらず、質問です。
どうすればうまく更新できるようになりますでしょうか…
色々な点で大事なポイントになりそうなので、教えていただけると助かります。

「F契約管理リスト」(帳票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約管理リスト」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。

「契約詳細」(単票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約詳細」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。

このとき、いずれかのコンボボックスで状況を変更したとき、反映したい。

■やってみたこと

「F契約管理リスト」のモジュールにて下記を記載。

Private Sub Form_AfterUpdate()
    Forms!F契約詳細.Refresh
End Sub

「F契約管理リスト」の契約状況を変更。

■結果
⇒「F契約詳細」は更新されない。(その後色々触っていると更新される)
 また、時々「データ変更の競合」エラーが出る。

6
hiroton 2020/10/14 (水) 09:48:47 d400d@f966d

⇒「F契約詳細」は更新されない。(その後色々触っていると更新される)

コードを次のようにした場合、データが反映されてほしいタイミングでメッセージは表示されますか?

Private Sub Form_AfterUpdate()
    Forms!F契約詳細.Refresh
    MsgBox "コードが実行されました"
End Sub

フォームとテキストボックスの更新系イベントの違い(T'sWareさん)

いずれかのコンボボックスで状況を変更したとき

ならば、基本的にはそれぞれのコンボボックス全てで個別にイベントを設定する必要があります

また、時々「データ変更の競合」エラーが出る。

次の例に該当していないですか?
[データの競合]メッセージが表示される(初心者のためのOffice講座さん)

8
どんぐり 2020/10/14 (水) 22:48:19 0029a@1c915 >> 6

大変参考になりました。レコードを保存すればよかったのですね。ありがとうございました。

7

hirotonさんの回答とかぶる部分はあると思いますが、ちょっと解説を。

フォーム上のテキストボックスやコンボボックスでデータを更新してもそれはフォーム上だけでテーブルには反映されません。レコード更新のアクションを起こしたときにはじめてテーブルに更新が反映されます。
レコード更新のアクションは、レコード移動する直前、レコードセレクターをクリックしたとき、Shift+Enter押下、、、他にもいろいろあります。

レコード更新される前に、他のフォームのRefreshをしても当然反映されません。
もし、コンボボックスを更新した直後に他のフォームにその更新を反映させたいなら、
コンボボックスの更新後処理でレコード更新した後、他のフォームのRefresh(あるいはRequery)を実行するという処理を記述することになります。

ただ、これをすると更新するたびにレコード保存されてしまうので、入力ミスをした場合、アンドゥーが効かなくなるなどの弊害があるのでよくよく検討する必要があります。(他のコントロールは更新不可にしてありコンボボックスのみ更新するフォームなら問題ないですが。)

下記で紹介しているような「保存」ボタンを作成しておいて、そのなかで他フォームをRefreshするという方法も考えられます。

レコード入力時に「保存」コマンドボタンでのみレコード保存できるようにする - hatena chips

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

レコードを保存すればよかったのですね。色々とその他の検討事項も今後参考にさせていただきます。ありがとうございました。