2011-12-02 2 views
0

私は私のパラメータ化レポートをしたい場合はどのような私の質問はthis 1と非常に類似しており、依存するレポートを複数のフォームからロードする必要がある場合、Accessクエリの内部WHERE句にパラメータを渡す方法はありますか。

を、私は後者にコメントでフォローしているだろうが、私はコメントしてまだ十分な担当者を持っていないので...様々な異なる形式で読み込むことができるでしょうか?問合せに直接フォームへの参照があると、これは排除されますが、そうではありませんか?それは私にはうんざりタイトなカップリングのように思えます。

質問をフォームに参照させることなく、クエリにパラメータを入力する方法はありませんか? (そして、中節はそれほどのDoCmdにWHERE句は、トリックを行いません給餌、ネストされたSELECTに埋め込ま上記のリンク問題、関連のように。)

答えて

0

ここに私が到着した解決策があります。それにはいくつかの欠陥がありますが、私はいつも特定のフォームへの参照を私の質問から守りながら、Accessで通常の方法でクエリを保存することができます:

私はParamというモジュールを作成しました。コード:

Option Compare Database 

Private m_params As Collection 

Public Function ParamLookup(paramName As String) As Variant 
    If Not m_params Is Nothing Then 
     ParamLookup = m_params(paramName) 
    End If 
End Function 


Public Function FeedParamsTo(reportName As String, theParams As Collection) 

    Set m_params = theParams 

    If Application.CurrentProject.AllReports(reportName).IsLoaded Then 
     DoCmd.Close acReport, reportName 
    End If 

    DoCmd.OpenReport reportName, acViewPreview 

End Function 

はその後、私の入力コントロールを含むフォームで、私は、以下のクリックハンドラで例えばボタン:レポートは、私ができる使用するクエリで最後に

Private Sub Button_Click() 
    Dim params As Collection 
    Set params = New Collection 
    params.Add Me!AnInputControl, "param1" 
    params.Add Me!AnotherInputControl, "param2" 

    Param.FeedParamsTo "nameOfSomeReport", params 
End Sub 

、 ParamLookup fuを使用してパラメータparam1とparam2を参照してくださいnctionは、そのよう:

SELECT * FROM someTable WHERE someColumn = ParamLookup("param1") AND someOtherColumn = ParamLookup("param2") 

いくつかの欠点:

  • それはグローバルモジュールですので、一度に読み取ることができ、パラメータのセットは1つだけです。 2つのレポートをロードすると、最初のレポートのパラメータが上書きされ、フォームのリフレッシュによって奇妙なエラーが発生する可能性があります。もちろん、このアイデアをクラスに拡張して、フォームごとに1つのインスタンスを作成することは可能ですが、現時点ではそれほど魅力的なものは必要ありません。
  • あなたが(例えばアクセスオブジェクトパネルから)ボタンを使用せずにレポートビューでレポートを開き、ひいてはFeedParamsTo方法、場合、ParamLookupsは失敗とレポートがレコードなし
0
what are you coding this in C# ..? 
if so have a Switch statement perhaps to check the form type 
or what ever it is you are passing and 
dynamically build the where clause based on that should not be to difficult 

you can still use code to do this assuming you know VB 
or create a Macro do utilize the vb script code behind 
+0

これがあると現れますすべてAccessで、残念ながら – ralbatross

2

FILTERNAMEを見てくださいとWhereCondition引数OpenReportメソッドのまた、レポートのRecordSourceを、レポートのOpenArgsを使用して作成するSQL文字列に設定することもできます。 OpenReportを呼び出すと、OpenArgsパラメーターにパラメーターとして使用するフォームとコントロールの名前を渡し、レポートのOpenArgsプロパティを使用してこのデータにアクセスできます。

"コンパイルされたクエリは高速です"という理由で、RecordSourceにSQL文字列を使用することを賢明に避けていた元の同僚がいます。しかし、スピードの違いが気付くほど十分なケースは見つかりませんでした。

+0

上記のようにFilterNameとWhereConditionの引数は私のためにはできません。 SQLを動的に構築すると、うまくいくかもしれませんが、私はすぐにすぐに投稿できるようになりました。 – ralbatross

関連する問題