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
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
Private Sub Form_AfterUpdate()
MsgBox "コードが実行されました"
If Me.Parent!最新購入日 = Me.最新購入日 Then
msgbox Me.Parent!最新購入日 &"と" & Me.最新購入日
Else
Me.Parent!最新購入日 = Me.最新購入日
End If
End Sub
Private Sub btn物件_Click()
If Not IsNull([txt物件ID]) Then
DoCmd.OpenForm "F_物件管理", acNormal, "", "物件管理ID In (SELECT 物件管理ID FROM Q_サブ物件 WHERE 区分NO = " & Me.txt区分NO & ")", , acDialog
Else
DoCmd.OpenForm "F_物件管理", acNormal, , , acFormAdd
End If
Public Function Titleph(txtbox As control, placeHolder As String)
If txtbox.Value <> "" Then
Titleph = txtbox.Value
Else
Titleph = placeHolder
End If
End Function
あんまり聞かない要件ですね
多分こんな感じで動くと思います。が、もう少し前後関係があると違う回答が出るかもしれません(あんまり聞かない要件なので)
込み入った処理が必要になってしまうなら「最新購入日」の取得方法を変えてしまったほうがいいような気がします
DMax()の引数は適切なものに置き換えてください
Me.Recalc
Me.Me.最新購入日.Requery
のどちらか、あるいは両方を挿入した場合はどうなりますか。
ありがとうございます。3000まであげたのですが、やはり動作がうまくいったりいかなかったりします。
もっとあげるべきなのでしょうか。
確かに更新する瞬間、「最新購入日」のテキストボックス内容(2020/10/14)が両方とも一瞬消えるのが気になっていました。
現在でも消えていますが、そのことと関係しますか?
おそらく発生するタイミングの問題かなという気がします。
サブフォームのレコードが更新される。
更新後イベントが発生する→VBAで親フォームに最新購入日を代入。
その時点では =Max([購入日]) の計算が終わっていない。
メインフォームに転記するイベントを別のものにしてみる。
例えば、サブフォームコントロールのフォーカス喪失後で転記する。
これだとサブフォームで更新した後、メインフォームへ移動したときに転記されることになります。
他には、サブフォームのタイマー時イベントを利用するというのも考えられます。
タイマー間隔を0に設定しておいて、タイマー時のイベントプロシージャに転記のコードを記述する。
更新後処理のイベントプロシージャは下記のように記述。
いちおう100ミリ秒後に転記するようにしてますが、うまくいかないようなら秒数を増やしてください。
こうなってから、サブフォームの他のコンボボックスを更新してメインフォームを閉じる(閉じる際にレコードを保存)と、テーブルのデータも2020/10/14になります。
お伝えしたようにうまく更新される時もあったり、
できないときもあり、なぜかテーブルのフィールドが「0:00:00」になってしまった
データについて、確認した内容をお伝えさせていただきます。
としたところ、「0:00:00と」と表示されます。
サブフォームのフォームヘッダーかフッターにテキストボックスを配置して下記のように設定しています
名前 最新購入日
コントロールソース =Max([購入日])
※テキストボックスには2020/10/14と表示されている。
メインフォームの最新購入日を表示するテキストボックスは、下記のように設定しています。
名前 txt最新購入日
コントロールソース =[サブフォームコントロール名].Form![最新購入日]
※テキストボックスには2020/10/14と表示されている。
メインフォームのレコードソースのテーブル(商品テーブル)に「最新購入日」フィールドがあります。
※0:00:00と表示されている。
謎です…😯
こちらの問題ですが、「保存する」では解決できなさそうでした。
レコードを保存すればよかったのですね。色々とその他の検討事項も今後参考にさせていただきます。ありがとうございました。
大変参考になりました。レコードを保存すればよかったのですね。ありがとうございました。
もう1つの質問でご回答いただいている、「保存する」をじっくり確認して、試みてみます。
(※⑤⑥の更新結果は、コントロールソース(テーブル)への反映の件です)
何度も何度も実験していたら、常に上の動きではありませんでした。
そして時々「1899/12/30」になります。理解ができず…何度もすみません。
こちらの件について、「MsgBox "コードが実行されました"」を試してみました。
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤「1回前の」更新結果が反映される
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③サブフォームの別のテキストボックスなどを更新
④フォームを閉じる
⑤「コードが実行されました」とメッセージボックスが表示される
⑥「今回の」更新結果が反映される
こちらの件について、「MsgBox "コードが実行されました"」を試してみました。
①サブフォームの購入日を更新
②メインフォームに最新購入日が反映される
③フォームを閉じる
④「コードが実行されました」とメッセージボックスが表示される
⑤一つ前の更新結果が反映される
こちらですが、購入日を更新すると、なぜかコントロールソースの最新購入日が「00:00:00」?に変換されて表記が「1899/12/30」になってしまいます。
コントロールソースではなくて関数でひっぱっている部分は正しい最新購入日になっています。
サブフォームの違う項目を更新すると、正しい表記に更新されます・・・
hirotonさんの回答とかぶる部分はあると思いますが、ちょっと解説を。
フォーム上のテキストボックスやコンボボックスでデータを更新してもそれはフォーム上だけでテーブルには反映されません。レコード更新のアクションを起こしたときにはじめてテーブルに更新が反映されます。
レコード更新のアクションは、レコード移動する直前、レコードセレクターをクリックしたとき、Shift+Enter押下、、、他にもいろいろあります。
レコード更新される前に、他のフォームのRefreshをしても当然反映されません。
もし、コンボボックスを更新した直後に他のフォームにその更新を反映させたいなら、
コンボボックスの更新後処理でレコード更新した後、他のフォームのRefresh(あるいはRequery)を実行するという処理を記述することになります。
ただ、これをすると更新するたびにレコード保存されてしまうので、入力ミスをした場合、アンドゥーが効かなくなるなどの弊害があるのでよくよく検討する必要があります。(他のコントロールは更新不可にしてありコンボボックスのみ更新するフォームなら問題ないですが。)
下記で紹介しているような「保存」ボタンを作成しておいて、そのなかで他フォームをRefreshするという方法も考えられます。
レコード入力時に「保存」コマンドボタンでのみレコード保存できるようにする - hatena chips
コードを次のようにした場合、データが反映されてほしいタイミングでメッセージは表示されますか?
フォームとテキストボックスの更新系イベントの違い(T'sWareさん)
ならば、基本的にはそれぞれのコンボボックス全てで個別にイベントを設定する必要があります
次の例に該当していないですか?
[データの競合]メッセージが表示される(初心者のためのOffice講座さん)
すみません…未だ、更新問題が解決しておらず、質問です。
どうすればうまく更新できるようになりますでしょうか…
色々な点で大事なポイントになりそうなので、教えていただけると助かります。
「F契約管理リスト」(帳票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約管理リスト」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。
「契約詳細」(単票) cbo契約状況(値リストで、「契約中」「未契約」など選択)
⇒「Q契約詳細」を元にしている。契約状況は「T契約管理」の「契約状況」が元になっている。
このとき、いずれかのコンボボックスで状況を変更したとき、反映したい。
■やってみたこと
「F契約管理リスト」のモジュールにて下記を記載。
「F契約管理リスト」の契約状況を変更。
■結果
⇒「F契約詳細」は更新されない。(その後色々触っていると更新される)
また、時々「データ変更の競合」エラーが出る。
混乱して要らぬ情報まで書き込んでいました。申し訳ありません。
なるほど!解決しそうです!
混乱して要らぬ情報まで書いていたようです。
ありがとうございました!
考え方自体は「
[契約状況]<>"契約中"
」という並べ替え用の式(フィールド)を作って「最新契約満期日」よりも前に指定してあげればいいです並べ替えの設定はフォームの並べ替えプロパティでやっているのかな?
ならばそのまま次の形で
帳票フォームの詳細セクションにサブフォームは配置できないはずですが。
言葉での説明が難しいなら、現状のフォームのスクリーンショットを提示できませんか。
あと、「契約フォーム」の並び順についてで、クエリで並び順を設定しているなら、そのフォームのレコードソースのクエリのSQL文を提示してください。
>「契約リストフォーム」の中で「契約フォーム」のレコードが並んでおり
契約リストフォームは帳票です。
わかりづらくてごめんなさい。
「契約リストフォーム」の中で「契約フォーム」のレコードが並んでおり
「契約フォーム」の中に「サブ契約フォーム」が並んでいます。
今回悩んでいるのは「契約リストフォーム」の中の「契約フォーム」の並び順です。
現状の並び替えは「最新契約満期日」のみとしており、特にSQLは利用していません。
「契約リストフォーム」というのは、契約フォームの中のサブフォームということですか。
そのサブフォームのレコードを並び替えたいということですか。
現状、並べ替えはレコードソースのクエリに設定していますか。
もし、そうなら、そのクエリをSQLビューにして表示されるSQL文をコピーして貼り付けてもらえますか。
うまくいきました。ありがとうございます。
やはりそこでしたか…助かりました。ありがとうございました。
とりあえず
ならSQLでも文字列が指定されている必要があります
区分NO = " & Me.txt区分NO & ")"
↓
区分NO = '" & Me.txt区分NO & "')"
ちなみに「btn物件」を配置しているフォームは、また全然別のフォームです。
すみません、間違って投稿してしまいました…
下記のコードを作りましたがうまく作動しません。
メインフォームのレコードソースのテーブル名(orクエリ名)Q_物件管理
それの主キーと主なフィールド名、 物件管理ID(主キー)、オーナー情報など
サブフォームのレコードソースのテーブル名(prクエリ名) Q_サブ物件
それの主キーと主なフィールド名 物件ID(主キー)、区分NO、住所など
また、サブフォームコントロールのリンク親フィールド、リンク子フィールドの設定 物件管理ID
区分NO(短いテキスト)で検索したい。
何が間違っているのか、教えていただけると助かります。
少し前の質問になりますが、うまくいかないため改めて質問です。
あっ(汗)、修正しておきました。
うまくいきました。(ちなみにもう1か所Mtxtboxのままになっている部分があるようです)
大変勉強になりました。応用して、他でも色々作れそうです。ありがとうございました。
Titlepath は Titleph に修正済みとして、その前の全角の
=
を半角の=
に変更してください。(前の私の回答も全角になってましたので修正しておきました。)
=Titleph([名前],"名前")
タイプミスでした。txtboxが正しいです。回答も修正ておきます。
テキストボックスのコントロールソースの設定は下記です。
[名前]の[]内はテキストボックスの名前、"名前"の部分はうっすらと表示させたいテキストです。
コントロールソースが間違って「Titlepath」になっていたことに気づきました…「Titleph」に変更したところ、エラーが「#Type!」になりました。度々すみません。
失礼しました。コントロールソースの自動変換後は下記になります。
早速ありがとうございました。
上記VBAをコピーして、コントロールソースは「名前」の部分だけ変えて実装してみましたが
「#Name?」と表示されます。
色々試してみたこととしては、「Mtxtboxをtxtboxに変える」(宣言での変数と文中での変数が異なっていていいのかわからず??)「標準モジュールにおいたり、該当のフォームのモジュールにおいたり」です。
ちなみに、コントロールソースは自動で下記のように[]がついておりました。
==Titlepath
何か勘違いしておりますでしょうか?
汎用関数は、
テキストボックスのコントロールソースに、下記のように設定することになります。
=Titleph([名前],"名前")
ちなみに下記のような形ではうまく行きませんでした
初心者で恐れ入ります。