3

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

基本的に私はこれをしたい:

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

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

VBA 経由の方法があることをここで読みましたが、VBA をコントロールの行ソースと組み合わせて使用​​する方法がわかりません。

4

4 に答える 4

3

場合によっては、FROM ソースとしてパススルー クエリを使用して SQL SELECT を記述すると、効率的な結果が得られます。

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]

これは、コードでパススルーの QueryDef を編集するのと同じくらい効率的である可能性が高く、パススルーが独自の SELECT でフィルタリングする必要があるフィールドを返さない場合にのみ失敗します。変更する価値があるかどうかは、パススルーを何に使用しているか、およびそれがどれほど複雑かによって異なります。

一般に、保存した QueryDefs を編集することは常に避けています。これを考慮してください: DDL を使用して SQL Server VIEW をどのくらいの頻度で変更しますか? しばしばあるわけではない!Access では、それが小さな肥大化につながる可能性があり (場合によってはそれほど大きくないこともあります)、私は可能な限り、フロント エンドが肥大化する原因となるものは常に避けています。

于 2011-02-11T23:41:23.167 に答える
3

Remou が彼の回答で述べたように、リンクされたテーブルはこれを容易にします。ただし、 という名前のパススルー クエリがある場合は、次の操作を実行して、値が変化したときにコントロールMyQueryの RowSource をMyComboOrListBox動的に更新することができます。CompanyID_Control

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

to:のAfterUpdateプロパティも設定する必要があります。CompanyID_Control
[Event Procedure]

Remou が提案したようにリンクされたテーブルを使用したとしてもAfterUpdateCompanyID_Controlコンボボックス/リストボックスの RowSource を更新するためにコードが必要になることに注意してください。

Private Sub CompanyID_Control_AfterUpdate()
    Me.MyComboOrListBox.Requery
End Sub
于 2011-02-10T21:29:27.963 に答える
1

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

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

うまくいきます。

クエリの SQL を永続的に変更するには、QueryDef の SQL プロパティを使用できます。

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

フォームのレコード ソース、またはコンボまたはリストボックスの行ソースを 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"
于 2011-02-10T21:19:27.757 に答える
0

これは簡単な修正であり、フォームで呼び出したいものを使用してパススルーを作成しますが、空白のままにしてすべてを呼び出し、パススルーを保存します。それを閉じて新しいクエリを作成し、パススルーからすべての列を追加します。パススルー add を呼び出す新しいクエリの基準で、[Forms]![Reporting]![CompanyID_Control]フォームが開いていることを確認してください。あなたのフォーム

于 2011-03-09T21:40:46.030 に答える