1

Access サブフォーム コントロールで 1 つの SQL クエリの結果を表示するにはどうすればよいですか? 以下のコードを試しました

Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Dim qry As String

qry = "SELECT FirstName,Email FROM Customer" '
Set rs = db.OpenRecordset(qry)

Customer_enquiry_subform.Form.Recordset = rs

Customer_enquiry_subformサブフォームの名前はどこにありますか。サブフォームには、FirstName、Email の 2 つの列しか表示できません。

それは私にエラーを投げています

実行時エラー 3251: 操作はこのタイプのオブジェクトではサポートされていません。

誰かが私が間違っていることを教えてもらえますか?

4

2 に答える 2

3

この質問が 2 年前のものであることは承知していますが、つまずいてアクセス サブフォーム コントロールに SQL クエリを使用したいと考えている私たちにとっては (多くの SQL クエリ/ストアド プロシージャは複雑すぎてフォーム レコード ソースに入れることができません)。 ...ADO がうまく機能することがわかりました。適切な説明については、http://support.microsoft.com/kb/281998/EN-US/を参照してください。これをサブフォームで機能させるために、フォームではなく、サブフォームの「オープン時」イベントにコードを配置しました。

1 つの注意点は、サブフォームがメイン フォームにバインドされない (親/子が失われる) ため、他のコードに頼って新しいレコードを追加する必要があることです。私の特定のサブフォームは読み取り専用であるため、親/子である必要はありません。親/子効果を再作成するためにストアド プロシージャを呼び出すときに、メイン フォームのレコード ID をパラメーターとして使用します (私の例については以下のコードを参照してください)。 )。

また、LockType adLockPessimistic または adLockOptimisic を指定しない場合、このコードは機能しません。adLockReadOnly は機能しません (メモリ内、スタンドアロン、切断された ADO レコードセットを参照してください)。「オブジェクトは有効な Recordset プロパティではありません」というエラーが表示され、少し頭痛の種になる可能性があります。:)

私のコード例 ( https://accessexperts.com/blog/2011/01/21/easy-adodb-recordsets-and-commands-in-access/の Juan Soto のユニバーサル ADO 接続の例を使用します):

   Private Sub Form_Open(Cancel As Integer)
   On Error GoTo ErrHandler
   Dim rs As ADODB.Recordset
   Dim strSQL As String
   Dim strPoint As String

   'I use my Point_ID from my main form as a parameter to fill the subform to recreate the "parent/child" effect
   strPoint = Forms!FRM_Vegetation_Strata!Point_ID
   strSQL = "sp_Report_VegWorksheet '" & strPoint & "'"

   'this method of calling the sub "OpenMyRecordset" is from Soto's example listed above
   OpenMyRecordset rs, strSQL, rrOpenStatic, rrLockOptimistic, True
   With rs
   If .RecordCount = 0 Then
   MsgBox "No records returned"
   End If
   End With

   Set Me.Recordset = rs


ExitProcedure:
    On Error Resume Next
    Exit Sub

ErrHandler:
    MsgBox Err.Description & " (" & Err.Number & ") encountered", vbOKOnly + vbCritical, "InitConnect"
    Resume ExitProcedure

    Resume
End Sub

メイン フォームのデータが変更されたときにサブフォームを更新するには:

Private Sub cmdRefresh_Click()
Me.Form.Recordset.Requery
Set Me.Form.Recordset = Me.Form.Recordset
End Sub

フォームが閉じたとき (サブフォームの「on close」イベントで)

Private Sub Form_Unload(Cancel As Integer)
   'Close the ADO connection we opened
   On Error Resume Next
   Dim cn As ADODB.Connection
   Dim rs As ADODB.Recordset

   Set cn = Me.Recordset.ActiveConnection
   If cn.State = adStateOpen Then
    cn.Close
   End If

   Set cn = Nothing
   Set rs = Nothing
   Set Me.Recordset = Nothing

End Sub
于 2014-12-17T05:14:15.323 に答える
1

フォームのレコード ソースをレコードセットに設定する場合は、ADO を使用する必要があります。ただし、あなたの言いたいことは次のとおりだと思います。

 qry = "SELECT FirstName,Email FROM Customer"
 Me.Customer_enquiry_subform.Form.Recordsource = qry

つまり、レコードセットは必要なく、レコード ソースを文字列に設定するだけです。

于 2012-07-30T09:49:38.137 に答える