2016-10-07 9 views
0

一連のクエリに基づいてデータをフィルタリングするContinuousサブフォームがあります。私はいくつかのデータに基づいてフッターに配置したサブフォームを作成する必要があり、これを達成するためのクエリを作成しました。サブフォームを再サブセット化するクエリセットのクエリを求めるプロンプトが表示されます

Private Sub UpdateXXXXX_Info() 

    If (Me.FormFooter.Visible <> True) Then 
     Me.FormFooter.Visible = True 
    End If 

    MsgBox "query start" 

    LabelXXXXX_.Caption = "XXXXX for: " & Me.[XXXXX__NAME] & " " & Me.[XXXXX__NAME] & " " & Me.[XXXXX__CATEGORY_NAME] 

    With CurrentDb.QueryDefs("XXXXX_Query") 
     .Parameters("XXXXXParam") = Me.[XXXXX_NAME] 
     .Parameters("XXXXXCategoryParam") = Me.[XXXXX_CATEGORY_NAME] 
     Set Me.XXXXX__Subform.Form.Recordset = .OpenRecordset 
     .Close 

     MsgBox "query complete" 

    End With 
End Sub 

連続フォームの各コントロールに関連付けられたClickイベントから呼び出されます。これはうまく動作し、私が期待しているようにフィルタリングします。連続フォームの性質上

(それ自体が別のフォームのサブフォーム)で、全体の継続的なフォームをリフレッシュする必要があります。

データをリフレッシュするとき、問題を引き起こしている
Private Sub Form_Current() 

    Me.FormFooter.Visible = False 

End Sub 

。これは最初のように動作しますが、上部連続フォームの別のレコードをクリックすると、サブフォームはクエリパラメータの入力を促します。テストに基づいて、Me.FormFooter.Visible = Trueを設定するときにこれを実行しています。 ではなく、の設定Visible = Falseは、このイベントを回避します(他の望ましくない動作を引き起こします)。

アクセスできません。レコードセットを閉じるか、空白またはnull値に設定します。私はまた、Requeryのためのパラメータを設定する方法を見つけることができません。提示されるデータの量は、私がテーブル全体を引っ張って代わりにフィルタを適用することも禁止します。

どうすればこの現象を防ぐことができますか?

編集:明確にするために、ビジネス要件としてストアドクエリを使用する必要があります。

答えて

1

SQLステートメントを使用して、サブフォームのレコードソースを(再)作成します。

SQL = "SELECT * FROM xQuery WHERE xParam = '" & me!Name & "'" AND " & _ 
     "xCategoryParam = '" & me!CategoryName & """ 
me!subform.form.recordsource = SQL 

これにより、レコードセットを開いたり閉じたりする必要がなくなり、元のクエリ定義を変更する必要がなくなります。 (つまり、あなたのパラメータのないクエリを作成し、SQLでWHEREコマンドでは、あなたのために重い物を持ち上げるを行います。

+0

をビジネス要件として、私は私が保存されたクエリを使用しなければならない。このように、生のSQLを使用することはできませんこれを言及するのを忘れた – Thebluefish

+0

あなたが保存されたクエリ(FROM)を使用しています。上記のSQLは、一時的にパラメータ(WHERE条件)をレコードソースに入れます。これは、あなたがやっていることに似ていますあなたのQueryDef。これにより、メインのクエリソースは決して変更されません。 – geeFlo

+0

私のPMでチェックすると、私はまだこれを使うことができません。このような方法でSQL文を作成することにはいくつかのビジネス上の理由があります。 – Thebluefish

0

なるほど!

geeFloの答えはそれで遊んで。フォームのRecordSourceプロパティに私を指摘し、私がいました以下を思い付くことができる:。。

Private Sub ClearXXXXXInfo() 
    If Me.FormFooter.Visible = True Then 
     Me.XXXXX_Subform.Form.RecordSource = "" 
     Me.FormFooter.Visible = False 
    End If 
End Sub 

Private Sub Form_Current() 

    ClearXXXXXInfo 

End Sub 
関連する問題