8

専門家の交換所teck republicで利用可能ないくつかの資料があり 、combobox.recordset プロパティを使用して Access フォームにコンボボックスを作成する方法について説明しています。

これらのコントロールには、通常、コントロールの「rowsource」プロパティに「SELECT *」文字列が入力され、アプリのクライアント側で使用可能なテーブルまたはクエリを参照します。サーバー側のデータをコンボボックスに表示する必要がある場合は、一時的なローカル テーブルを作成し、要求されたレコードをインポートします。これは、特に大きなテーブルでは時間がかかります。

レコードセットを使用してコンボボックス コントロールに入力できるようにすると、ユーザーはサーバー側からデータを直接表示できます。

前の 2 つの例に触発されて、次のようなコードを書きました。

Dim rsPersonne as ADODB.recordset
Set rsPersonne = New ADODB.Recordset

Set rsPersonne.ActiveConnection = connexionActive
rsPersonne.CursorType = adOpenDynamic
rsPersonne.LockType = adLockPessimistic
rsPersonne.CursorLocation = adUseClient

rsPersonne.Open "SELECT id_Personne, nomPersonne FROM Tbl_Personne"

fc().Controls("id_Personne").Recordset = rsPersonne

どこ:

  • connexionActive: データベース サーバーへの永続的な ADO 接続です。
  • fc(): 現在の/アクティブなフォームです
  • controls("id_Personne"): 会社のスタッフ リストを入力するコンボボックス コントロールです。
  • 2003年版アクセス

残念ながら、うまくいきません!

デバッグ モードでは、要求された列とデータを使用してレコードセットが適切に作成され、コンボ ボックス コントロールに適切に関連付けられていることを確認できます。残念ながら、フォームを表示すると、レコードのない空のコンボボックスが表示され続けます! どんな助けでも大歓迎です。

編集:

このレコードセット プロパティは、標準のコントロール オブジェクトではなく、特定のコンボボックス オブジェクトで実際に使用できます。数日前に発見して非常に驚きました。コンボボックスのコールバック関数を使用するか、コンボボックスの「addItem」メソッドを使用してリストを作成しようとしました。これらはすべて時間がかかります。

4

6 に答える 6

5

行ソースを受け入れるコントロールをレコードセットに設定するには、次の操作を行います。

Set recordset = currentDb.OpenRecordset("SELECT * FROM TABLE", dbOpenSnapshot)
Set control.recordset = recordset

確かに DAO レコードセットで動作します。ADO レコードセットを使用する本当の理由がないため、ADO レコードセットを試したことはありません。

この方法で行うと、単純な再クエリではデータを更新できず、set ステートメントを繰り返す必要があります。

于 2013-02-01T03:55:18.757 に答える
5

前述のように、コンボボックスにクエリ結果を表示するには、RowSourceType を "Table/List" (フランス語の場合は "Table/Requête") にする必要があります。

レコードセット (rsPersonne) を閉じずに開くと、メモリの問題が発生します。フォームを閉じる/アンロードするときは、それらを閉じる必要があります(ただし、レコードセットはフォームではなく関数で宣言されているため、スコープの問題が発生します)。

また、Access の組み込みのクエリ クリエータを使用してクエリを作成して保存し、同じクエリをコンボボックスの RowSource にプラグインすることもできます。このようにして、クエリは Access 内で検証およびコンパイルされます。

于 2009-07-14T17:24:32.920 に答える
3

トリックを見つけました...コンボボックスコントロールの「rowSourceType」プロパティを「Table/List」に設定する必要があります。表示は問題ありませんが、メモリに別の問題があります。フォームでこれらのADOレコードセットを使用しているため、フォームを参照するたびにAccessのメモリ使用量が増加しています。ブラウジングを停止するかフォームを閉じることによってメモリが解放されないため、MSAccessが不安定になり定期的にフリーズします。この問題を解決できない場合は質問を開きます

于 2009-06-09T10:23:38.283 に答える
2

Recordset プロパティを使用した良い方法です。そのヒントをありがとう!

パトリック、あなたのページに表示されているメソッドには大きな欠点があります (私も自分で試しました): 値リストは 32 KB しかありません。この制限を超えると、関数はエラーをスローします。コールバック メソッドには、非常に遅いという大きな欠点があり、エントリごとに 1 回呼び出されるため、長いリストには使用できません。レコードセット メソッドを使用すると、非常にうまく機能します。SQL 文字列が 32 KB を超えていたため、これが必要でした (WHERE ID IN(x,x,x,x,x...) の多くのインデックス値)。

このアイデアを使用してレコードセットをコンボボックスに設定する簡単な関数を次に示します。

' Fills a combobox with the result of a recordset.
'
' Works with any length of recordset results (up to 10000 in ADP)
' Useful if strSQL is longer than 32767 characters
'
' Author: Christian Coppes
' Date: 16.09.2009
'
Public Sub fnADOComboboxSetRS(cmb As ComboBox, strSQL As String)
    Dim rs As ADODB.Recordset
    Dim lngCount As Long

   On Error GoTo fnADOComboboxSetRS_Error

    Set rs = fnADOSelectCommon(strSQL, adLockReadOnly, adOpenForwardOnly)

    If Not rs Is Nothing Then
        If Not (rs.EOF And rs.BOF) Then
            Set cmb.Recordset = rs
            ' enforces the combobox to load completely
            lngCount = cmb.ListCount
        End If
    End If

fnADOComboboxSetRS_Exit:
    If Not rs Is Nothing Then
        If rs.State = adStateOpen Then rs.Close
        Set rs = Nothing
    End If
    Exit Sub

fnADOComboboxSetRS_Error:
    Select Case Err
        Case Else
            fnErr "modODBC->fnADOComboboxSetRS", True
            Resume fnADOComboboxSetRS_Exit
    End Select
End Sub

(関数 fnADOSelectCommon は、ADO レコードセットを開き、それを返します。関数 fnErr は、エラーがある場合は、メッセージ ボックスを表示します。)

この関数は開いているレコードセットを閉じるため、メモリに問題はありません。私はそれをテストしましたが、コンボボックスでフォームを閉じた後に解放されなかったメモリの増加は見られませんでした.

フォームのアンロード イベントで、さらに「Set rs=Me.Comboboxname.Recordset」を使用してから閉じることができます。これはメモリに関しては必要ありませんが、開いている接続を解放した方がよい場合があります (バックエンド データベース サーバーで使用する場合)。

乾杯、

キリスト教徒

于 2009-09-16T15:54:33.563 に答える
0

MS Access では問題ありませんが、VB では、adodc (Jet 4.0) を使用して次のようなものを使用できます。

Private sub Form1_Load()
   with Adodc1
     .commandtype = adcmdtext
     .recordsource = "Select * from courses"
     .refresh

     while not .recordset.eof
           combo1.additem = .recordset.coursecode
           .recordset.movenext
     wend
   end with
End Sub
于 2011-12-12T04:31:55.220 に答える