2011-01-13 13 views
3

にパラメータを提供するためにどのように、どのようにクエリにパラメータを供給しない?:MSアクセス:次のセットアップ特定のクエリに基づくサブフォームコントロール

  • フォームAはSubformAが含まれています。
  • SubformAは、保存されたクエリであるQueryAをSourceObjectとして使用します。
  • QueryAはパラメータ宣言を使用します
  • FormAには、QueryAにパラメータを供給するコントロールが含まれています。

FormAのコントロールの名前がQueryAのパラメータと同じ場合、これは一般的に機能します。例外は、フォームが読み込まれるときです。このとき、AccessはQueryAのパラメータを求めるプロンプトを表示します。 SubformAのSourceObjectをデザインビューで空白にし、FormAのForm_LoadイベントでSourceObjectを定義することで、この問題を回避しようとしています。 FormAのコントロールの値を設定し、SubformAのSourceObjectを設定しています。ただし、Accessは引き続きパラメータの入力を求めています。私の次の考えは、QueryDefとしてQueryAへの参照を取得し、QueryDefのパラメータを定義することでしたが、QueryDefをSubformAのSourceObjectとして割り当てる方法はないようです。フォームの読み込み時にユーザーにパラメータの入力を促さないという目的をどのように取得するかについての考えはありますか?

+0

なぜ、パラメータではなくリンクの子フィールドとマスターフィールドを使用していませんか?これらの問題はなくなるはずです。 – Fionnuala

+0

この場合、FormAはバインドされていないため、リンクするものはありません。詳細が役立つ場合、FormAにはListBox(RowSourceとしてSQL文を使用する)と2つのTextBox日付フィールドが含まれています。 ListBoxの選択は、WHERE table_field IN FormAListBoxSelectionsの行に沿って何かをQueryAの結果にフィルタリングするために使用されます。 QueryA自体はいくつかのテーブルを結合する他のいくつかのクエリの集合体である – Adam

+0

フォームaが(a)コントロールが含まれているだけですが、この場合は適合しないことがわかります。読み込まれたときにフォームをフィルタリングする必要があるというビジネスルールはありますか?選択するフォームをユーザーに提示することに異論はありませんか条件が満たされていないか完全に完全であるか完全に空のリストであるかどうかを確認することができますか?これが不可能な場合は、前の選択をユーザーに提示することについてどのように感じますか? – Fionnuala

答えて

1

コントロールをサブフォームのレコードソースのパラメータとして定義しましたか?私はサブフォームがメインフォームの前にロードされていると思うので、それがうまくいくかどうかはわかりませんし、ロード後に2度再クエリーされます。

サブフォームに空のレコードソースがあり、フィルタを適用するときにRecordsource SQLを設定することをお勧めします。私はパラメータを定義しませんし、レコードソースSQLのフォームコントロールには全く参照を使用しません。

SQLインジェクションについて何らかの懸念があり、パラメータを使用する必要があると思われる場合は、特にフィルタコントロールのいずれもフリーテキストを許可していない場合は、懸念が払われている可能性があります。

+0

VBAでSQLを維持することの難しさが増えたため、保存されたクエリからの変更を避けていましたが、ついにあなたが示唆した方向を打ち破り始めました。サブフォームSourceObjectをどのように設定しますか? SourceObjectが保存されたQueryオブジェクト(私はまだそれを削除していない)&ボタンをクリックしたときにRecordSourceを変更した場合、正常に動作しますが、空のSourceObjectによって空のコントロールが生成されます。 SourceObjectとして使用して、レコードソースを設定してもデータが表示されない、空のクエリの作成を試みました(たとえば、SELECT NULL AS field1、NULL as field2)。 – Adam

+0

これは、tempQuerySQLの目的のクエリを使用して、CurrentDB()。CreateQueryDef(tempQueryName、tempQuerySQL)を使用して新しいQueryDefを作成することです。サブフォームSourceObjectを "Queries.tempQueryName"に設定します。もちろん、* tempQueryName *が作成されると、再度作成する必要はありません。これを達成する別の方法がありますか?そうでない場合は、* tempQueryName *をDBに残しておくか、フォームが閉じられたときに削除する方が良いかどうかを議論しています。ここに提案はありますか? – Adam

+0

保存されたクエリではなく、実際のサブフォームをSourceObjectとして使用していると仮定しました。私は後者を非常に頻繁に役に立つものにしないことを見つける。つまり、サブフォームを作成するだけで、レコードソースの設定に必要なすべての柔軟性を得ることができます。 –

関連する問題