私はこの問題に自分で苦労していて、それからいくつかの助けを借りて、それについて検索しました。しかし、私は運がなかった。だから私は尋ねることにした。
Access 2007には2つのフォームがあり、それらをMainForm
とEntryForm
と呼びます。MainForm
にはサブフォームとボタンがあります。このボタンは、追加モードでEntryForm
を開きます。私がやりたいのは、EntryForm
がMainForm
のサブフォームを更新(再クエリ)する新しいレコードを保存するときです。
このセットアップコードを試しました
Private Sub cmdSaveAndClose_Click()
DoCmd.Save
'requery list
Forms![MainForm]![subformName].Requery
'' I've also tried these
'Forms![MainForm]![subformName].Form.Requery
'Forms.("MainForm").[subformName].Requery
'Forms.("MainForm").[subformName].Form.Requery
DoCmd.Close
End Sub
これらの試みはどれもうまくいかないようです。この再クエリを行う方法はありますか?事前に助けてくれてありがとう。
これを達成する方法に関するコメント:
EntryFormを、呼び出し元のフォームに永続的に関連付けています。そのようなコンテキストに関連付けられたフォームを持たない方が良いと思います。 Save/Closeルーチンから再クエリを削除し、代わりにacDialogスイッチを使用してEntryFormをモーダルで開きます。
DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
Me!SubForm.Form.Requery
このように、EntryFormは1つのコンテキストで使用するように拘束されていません。別の方法は、EntryFormを、どのフォームがそれを開いたのか、何を再照会する必要があるのかを知ることができるもので複雑にすることです。私は、そのようなことをそれが使用されているコンテキストにできるだけ近づけ、呼び出されたフォームのコードをできるだけシンプルに保つ方が良いと思います。
おそらく、ここでの原則は、別のフォームのFormsコレクションを使用してフォームを再クエリするときはいつでも、あなたのアーキテクチャに関して何かが正しくないことを示す良い兆候です。
これらは多くの場合同じですが、サブフォームの名前ではなく、サブフォームコントロールの名前を使用する必要があります。
Forms![MainForm]![subform control name Name].Form.Requery
または、メインフォームを使用している場合:
Me.[subform control name Name].Form.Requery
上記のいくつかのソリューションを試しましたが、どれも私の問題を解決しませんでした。データベースにデータを保存した後、フォームのサブフォームを更新するソリューション:
Me.subformname.Requery
私にとってはうまくいきました。幸運を。
サブフォームのソーステーブルがadodbを使用して更新された場合、再クエリが更新された情報を見つけることができるまでに時間がかかることを発見しました。
私の場合、 'dbconn.execute "sql"'でレコードをいくつか追加していましたが、なぜvbaのrequeryコマンドが機能しないように思われました。デバッグ中に、再クエリが機能しました。テストのために再クエリする前にコードに2〜3秒の待機を追加して、違いを生じさせました。
しかし、「currentdb.execute "sql"」に変更すると、すぐに問題が修正されました。
すべてのコントロールは私たちのものです!
Fionnualaはこれに正しく答えましたが、私のようなスキマーは簡単にポイントを見落とすでしょう。
サブフォームCONTROLを更新するサブフォームは更新しません。実際、allforms()でチェックすると、アクセスに関する限り、サブフォームはロードされません。
メインフォームでサブフォームウィザードが提供するラベルを確認するか、1回クリックするかその周囲の境界線をクリックしてサブフォームを選択し、プロパティの[その他]タブの[キャプション]を確認します。これは、ナビゲーションパネルに表示されるフォームの名前ではなく、再クエリに使用する名前です。
私の場合、frmInvProdSubというサブフォームがあり、何時間もAccessが存在しないと判断した理由を見つけようとしました。私はあきらめて、フォームを削除し、再作成しました。最後のステップでは、コントロールを呼び出すものを指定するので、frmInvProdSubと呼び、ウィザードを終了しました。それから私は試してみました、出来上がりました、うまくいきました!
ナビゲーションウィンドウでフォーム名を見ると、名前に「Sub」を入れるのを忘れていたことがわかりました。それがクリックされたときです。 CONTROLは、フォームではなくfrmInvProdSubと呼ばれ、コントロール名の使用は機能します。
もちろん、両方の名前が同一であれば、この問題はありませんでした笑。
私は同様の問題を抱えていましたが、いくつかの違いがありました...
私の場合、メインフォームには、次のコードを使用して、DBのクエリを更新するために使用したコントロール(ベンダー)があります。
Sub Set_Qry_PedidosRealizadosImportados_frm(Vd As Long)
Dim temp_qry As DAO.QueryDef
'Procedimento para ajustar o codigo do cliente na Qry_Pedidos realizados e importados
'Procedure to adjust the code of the client on Qry_Pedidos realizados e importados
Set temp_qry = CurrentDb.QueryDefs("Qry_Pedidos realizados e importados")
temp_qry.SQL = "SELECT DISTINCT " & _
"[Qry_Pedidos distintos].[Codigo], " & _
"[Qry_Pedidos distintos].[Razao social], " & _
"COUNT([Qry_Pedidos distintos].[Pedido Avante]) As [Pedidos realizados], " & _
"SUM(IIf(NZ([Qry_Pedidos distintos].[Pedido Flexx], 0) > 1, 1, 0)) As [Pedidos Importados] " & _
"FROM [Qry_Pedidos distintos] " & _
"WHERE [Qry_Pedidos distintos].Vd = " & Vd & _
" Group BY " & _
"[Qry_Pedidos distintos].[Razao social], " & _
"[Qry_Pedidos distintos].[Codigo];"
End Sub
最初から、サブフォームレコードソースは「Qry_Pedidos realizados e importados」という名前のクエリでした。
ただし、メインフォームコンテキスト内のサブフォームデータを更新できる唯一の方法は、以下のように、サブフォームのデータソースを自己更新することです。
Private Sub cmb_vendedor_v1_Exit(Cancel As Integer)
'Codigo para atualizar o comando SQL da query
'Code to update the SQL statement of the query
Call Set_Qry_Pedidosrealizadosimportados_frm(Me.cmb_vendedor_v1.Value)
'Codigo para forçar o Access a aceitar o novo comando SQL
'Code to force de Access to accept the new sql statement
Me!Frm_Pedidos_realizados_importados.Form.RecordSource = "Qry_Pedidos realizados e importados"
End Sub
リフレッシュ、再計算、再クエリなどは必要ありませんでした...
通常、メインフォームは閉じたり開いたりすることで、関連するすべてのクエリ(サブフォームに関連するものを含む)を実行します。同様の問題が発生し、クリックイベントで[コマンドの保存]ボタンに次を追加することで解決しました。
DoCmd.Close acForm, "formname", acSaveYes
DoCmd.OpenForm "formname"