0

私が現在持っているクエリはある程度機能します。アクセス クエリ デザインで以下のクエリを実行すると、関連する会社 ID を持つすべての従業員が表示されます。Link_Table.FirstNameただし、VBA では、文字列の最初のレコードのみが表示されますMe.txtbxFirstName = rst!FirstName。たとえば、値はLink_Table.FirstNameテーブルの最初のレコードだけですか? または、反復できる複数の値を保持できますか?

Public Function DataLookup()
Dim CompDetailSQL As String
Dim rst As DAO.Recordset
CompDetailSQL = "SELECT Companies.CompanyID, Companies.CompanyName, 
Companies.AddressNo, 
Companies.AddressLine1, Companies.AddressLine2, Companies.AddressLine3, 
Companies.AddressPostcode, Companies.AddressCounty, 
Companies.Description, 
Companies.MainTelephone, 
Companies.MainEmail, 
Companies.WebAddress, 
Link_Table.FirstName
FROM Companies 
INNER JOIN Link_Table ON Companies.CompanyID = Link_Table.CompanyID 
WHERE Companies.CompanyID = " & Me.lstBoxCompanyName.Value
Debug.Print CompDetailSQL
Set rst = CurrentDb.OpenRecordset(CompDetailSQL, dbOpenSnapshot)
Me.lblDescription.Caption = rst!Description
Me.txtbxAddressLine1.Value = rst!AddressLine1
Me.txtbxAddressLine2.Value = rst!AddressLine2
Me.txtbxAddressLine3.Value = rst!AddressLine3
Me.txtbxAddressPostcode.Value = rst!AddressPostcode
Me.txtbxAddressCounty.Value = rst!AddressCounty
Me.txtbxMainTelephone.Value = rst!MainTelephone
Me.txtbxMainEmail.Value = rst!MainEmail
Me.txtbxMainWeb.Value = rst!WebAddress
Me.txtbxFirstName = rst!FirstName    
rst.Close
Set rst = Nothing
End Function
4

1 に答える 1

2

レコードセットは、クエリが返したすべてのレコードを保持しますが、テキスト ボックスには一度に 1 つのレコードしか表示できません。現在、コードはレコードセットを閉じて Nothing に設定しているため、レコードセットを永続化する方法を選択する必要があります。

1 つの方法は、このプロシージャ内だけでなく、フォーム自体またはグローバル変数内など、より大きなスコープにレコードセットを配置することです。他の場所よりも処理する必要があるため、レコードセットを作成したり、完了したら閉じるなどの作業が複雑になる可能性があります。スコープを大きくしすぎると、メモリも過剰に使用する可能性があります。永続的なレコードセットを取得したら、次のようにナビゲートできます。

If Not (rst.BOF And rst.EOF) Then
    'Do something here'
    rst.MoveNext 'Navigate to the next sequential record'
    'or rst.MovePrevious to go backward'
End If

また

Do While Not rst.EOF
    'Do something here'
    rst.MoveNext
Loop

また、フォームにバインドできる一時テーブルにクエリでレコードを挿入することを検討することもできます。これにより、データベース内の他のテーブルと同様に、静的テーブルとして扱うことができます。レコードは削除するまでテーブルに存在するため、レコードセット自体を永続化する必要はありません。


アップデート

レコードセットのすべてのレコードを一度に表示しようとすると、各レコードの各テキスト ボックスのコピーが 1 つ必要になります。10 個のフィールドと 3 つのレコードの例を考えると、それらをすべて表示するには、フォームに 30 個のコントロールを表示する必要があります。これは、最初のセットにデータを入力し、次のレコードに移動して次のセットにデータを入力するなどの方法で実行できます。

Do While Not rst.EOF
    Me.lblDescription1.Caption = rst!Description
    rst.MoveNext
    Me.lblDescription2.Caption = rst!Description
    rst.MoveNext
    Me.lblDescription3.Caption = rst!Description
Loop

特に、レコードが 3 つではなく 2 つまたは 4 つある場合、エラー、空のフィールド、または表示されないデータが発生するため、これはちょっと厄介です。代わりに、連続フォームを使用することをお勧めします。これにより、1 セットのテキスト ボックスを作成し、返されるすべてのレコードをカバーするために必要な回数だけ繰り返すことができます。ラベルでこれができるかどうかはわかりませんが、テキストボックスの場合は非常に簡単です。フォームを作成し、既定のビュー設定で連続フォームとしてマークしてから、レコードセットの各フィールドに TextBox を作成するだけです。デザイナーでそれらをバインドしないままにし、次のコードを使用して実行時にアタッチします。

Set Me.Recordset = rst

Me.txtbxAddressLine1.ControlSource = "addressline1"
Me.txtbxAddressLine2.ControlSource = "addressline2"
Me.txtbxAddressLine3.ControlSource = "addressline3"

Set rst = Nothing

通常、継続的なフォームでは、それを別のフォームのサブフォームにして、メイン フォームに固有のデータとコントロールを持たせ、サブフォームにレコードセットからの繰り返しデータを含めることができます。

フォームへのレコードセットのバインドの詳細。

非バインド データ コントロールの作成の詳細。

于 2013-09-24T16:25:00.443 に答える