2011-02-08 12 views
3

フォーム内の別の値に依存するパススルークエリを行ソースに割り当てるにはどうすればよいですか?MS Accessはフォームの値に応じてパススルーする

SELECT x.companyid, 
     x.companyname, 
     x.productid 
    FROM x 
WHERE (((x.CompanyID) = [Forms]![Reporting]![CompanyID_Control])) 
ORDER BY x.productid; 

しかし、もちろんパススルークエリは、任意のフォームコントロールへの参照をサポートしていません。

基本的に私はこれをしたいです。

私はhereを読んでいますが、VBAを介してメソッドがあるとは言いますが、コントロールの行ソースと組み合わせてVBAを使用する方法はわかりません。

+0

VBAでクエリのSQLを更新すると、参照ではなく値を送信できますか? – Fionnuala

+0

これはまた、なぜ単にあなたがテーブルをリンクしていないのか不思議に思っています。 – Fionnuala

+0

テーブルがリンクされています。参照ではなく値を送ることができるように、VBAでクエリのSQLを更新する方法の例を教えてください。 –

答えて

3

:それは十分に簡単であるリンクテーブルを持つ文字列、 Remouは彼の答えで述べた、リンクテーブルはこれをより簡単にするでしょう。

Private Sub CompanyID_Control_AfterUpdate() 
Dim SQL As String, qdf AS DAO.QueryDef 
    Set qdf = CurrentDB.QueryDefs("MyQuery") 
    qdf.SQL = " SELECT x.companyid, x.companyname, x.productid " & _ 
       " FROM x " & _ 
       " WHERE x.CompanyID =" & Me.CompanyID_Control & _ 
       " ORDER BY x.productid;" 
    Me.MyComboOrListBox.RowSource = "MyQuery" 
End Sub 

ます。また、設定する必要があります:あなたはMyQueryという名前パススルークエリを持っている場合しかし、あなたはCompanyID_Control変化の値が動的にするときMyComboOrListBox制御更新の値集合ソースを作るために次の操作を行うことができますCompanyID_ControlAfterUpdateプロパティは:
[Event Procedure]です。 Remouが示唆したように、あなたがリンクされたテーブルを使用している場合でも、あなたはまだあなたのコンボボックス/リストボックスの値集合ソースをリフレッシュするためにCompanyID_ControlAfterUpdateイベントにコードが必要になること

注:いくつかのケースでは

Private Sub CompanyID_Control_AfterUpdate() 
    Me.MyComboOrListBox.Requery 
End Sub 
+0

偉大な、私は最終的にそれを得ると思う、ありがとう皆。 DAOまたはADOを使用する必要がありますか?それは明示的にVBAで与えられなければならないのですか? –

+0

Jetを使用している場合は、DAOを使用する必要があります。 MSは、新しい.mdbを作成するときに、デフォルトとして設定されているものを前後しています。あなたは同じプロジェクトで両方を使うことができますが、オブジェクトとメソッドの点で2つのライブラリの間に重複があります。両方を参照として設定すると、参照のリスト内での順序が重要になります。あなたのコードに明示的にしたいのであれば、私のサンプルコードで行ったように、メソッドやオブジェクトへの参照を完全修飾することができます: 'qdf As DAO.QueryDef'。 – mwolfe02

+0

うわー。何年も後にこのポストは私のベーコンを救った。私はアクセスレポートのレコードソースとしてテーブルUDFを使用する方法を見つけようとしていました。この回答は本当にうまくいきます。 – Rocky

1

テーブルがリンクされている場合は、Accessテーブルであるかのようにクエリを実行できます。これにはフォームの参照も含まれます。したがって:

SELECT * FROM MyLinkedTable 
WHERE ID = Forms!MyForm!MyID 

正常に動作します。

Set qdf = CurrentDB.QueryDefs("MyQuery") 
qdf.SQL = "SELECT * FROM MyLinkedTable " & _ 
      "WHERE ID = " & Forms!MyForm!MyID ''Or on MyForm, Me.MyID 

あなたはまた、SQLにフォームのレコードソースまたはコンボまたはリストボックスの行ソースを設定することができます。

が恒久的にクエリのSQLを変更するには、クエリ定義のSQLプロパティを使用することができます

Me.RecordSource = "SELECT * FROM MyLinkedTable " & _ 
      "WHERE ID = " & Forms!MyForm!MyID ''Or on MyForm, Me.MyID 

それとも

Me.MyCombo.RowSource = "SELECT * FROM MyLinkedTable " & _ 
      "WHERE ID = Forms!MyForm!MyID" 
+0

最初のオプションを使用すると、パフォーマンス上のペナルティはないと思いますか?特に、バックエンドが非MSの場合、DB2またはOracle ... –

+1

多くのことを言っているわけではありませんが、Accessで適度に単純でsargableなクエリを実行するのに大きな違いはありません。空想的なものやテーブルスキャンがある場合、パススルーはおそらく良い考えです。 – Fionnuala

+0

ありがとうございます。パススルークエリを介して直接バックエンドにアクセスしようとしているため、SQL領域のフォームコントロールを参照してクエリを直接編集することはできません。私はVBAを使う必要があることを知っています。上記のVBAコードはどこに置くのですか? –

3

、あなたが取得しますあなたのパススルークエリを使用してSQL SELECTを書き込むことによって、効率的な結果のソースから:これは非常に可能性の高いコードにパススルーのクエリ定義を編集するのと同じくらい効率的になり、唯一のwは失敗するだろう

SELECT MyPassthrough.* 
    FROM MyPassthrough 
    WHERE [criteria here] 

フィルタリングする必要があるフィールドをパススルーがSELECTで返しません。変更する価値があるかどうかは、パススルーを使用しているものとその複雑さによって異なります。

一般に、私は常に保存されたQueryDefを編集しないでください。 DDLでSQL Serverのビューをどのくらい頻繁に変更するのですか?しばしばあるわけではない!アクセスでは、マイナーな膨らみ(場合によってはマイナーではない)につながる可能性があります。私はフロントエンドを膨らませるようなものは、可能な限り避けるようにしています。

0

試してみたところ、これは簡単な修正です。フォームを呼び出すときにパススルーを作成しますが、空白のままにしてすべてを呼び出し、パススルーを保存します。それを閉じて、新しいクエリを作成し、passthrouhのすべての列を追加します。新しいクエリの条件で今すぐパススルーを呼び出します。[Forms]![Reporting]![CompanyID_Control]を追加して、フォームが開いていることを確認します。あなたのフォームを使用

+1

これは私の答えで示唆したものではありませんか?それを正解として選ぶべきではありませんか?それとも、私が提案したものと違う何かをしましたか? –

関連する問題