コントロール(この場合はチェックボックス)をSQL式にバインドする方法は複数あります。ここでは、これをセカンダリクエリと呼び、フォーム/レポートにバインドされたプライマリクエリと区別します。 1)フォーム/レポートにバインドされているプライマリレコードセットのサイズ、2)プライマリクエリを更新可能にする必要があるかどうか、3)セカンダリSQLクエリの効率、たとえばインデックス付きここでは2つのアプローチを概説します。各レコード
すでに保存されたクエリがあり、返されたレコードの存在をテストする必要があるだけなので、ドメイン集計関数を使用できます。これは、主フォーム/レポートでは、集計関数に渡されます[UWI]と呼ばれるキーフィールドを持っていることを前提としてい
=DCount("UWI","qry_OBO_WELLS","UWI = " & [UWI])
にCheckbox.ControlSourceプロパティを設定します。
保存していないクエリを実行する必要がある場合は、独自のVBA関数を作成して同様の方法で呼び出すことができます。キー値を渡して、適切な値を選択する必要があることを確認してください。チェックボックスを設定します。あなたの顧客VBA機能ここで
Public Sub GetCheckBoxValue(vUWI as Variant) As Boolean
GetCheckBoxValue = False 'Set default return value
If IsNull(vUWI) Then
Exit Function
End If
Dim rs As RecordSet2
'* Only TOP 1 is required to test for existence of records
Set rs = CurrentDB.Openrecordset(_
"SELECT TOP 1 [qry_OBO_WELLS].UWI FROM [qry_OBO_WELLS]" & _
" WHERE [qry_OBO_WELLS].UWI = " & vUWI
If Not rs.EOF Then
GetCheckBoxValue = True
End If
rs.Close
End Sub
を指し
=GetCheckBoxValue([UWI])
へのコントロールソースプロパティ私はUWIが数値であると仮定しています。文字列値の場合は、適切にSQLクエリーに挿入するよう注意する必要がありますが、引用符と場合によってはSQLパラメーターを使用します。
このアプローチの欠点は、各プライマリレコードの新しいレコードセットオブジェクト(およびデータベース接続)を繰り返し開いて閉じなければならないことです。これは、多くのレコードを処理する場合は遅くなる可能性があります。いくつかの巧妙なコードで接続とレコードを一度開いたり閉じたりすることを減らすことは可能ですが、これはこの答えの範囲を超えています。
は、以下の代替的なクエリのいずれかが制御レベルで別のクエリに結合することがより効率的であるべきであるフォーム/レポートレコードソース
の一部として二次クエリを含めます。しかし、どちらのアプローチでも、クエリを更新不可能にすることができ、編集可能なフォームを効果的に無効にすることができます。クエリを更新可能にするかどうかをすべて予測したり議論したりすることはできないため、それぞれをテストするだけです。いずれかのクエリで
、CheckBoxがCheckBox.Control Source = [CheckBoxValue]
のような二次クエリに主クエリに参加し、他のどのようクエリ列にバインドすることができます。結合されたSQLステートメントにフォーム/レポート・レコード・ソースを設定します。
SELECT Primary.UWI, Primary.OtherData, (Secondary.records) > 0 AS CheckBoxValue
FROM Primary INNER JOIN
(SELECT Count(DBA_WellZoneIntrvlValue.UWI) As records
FROM DBA_WellZoneIntrvlValue INNER JOIN WELL_MASTER ON DBA_WellZoneIntrvlValue.UWI = WELL_MASTER.UWI
WHERE (((DBA_WellZoneIntrvlValue.ZONE_NAME)="NFX_HEADER") AND ((DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME)="NFX_OBO_WELL")))
AS Secondary
ON Primary.UWI = Secondary.UWI
また、パラメータ化されたクエリを別の列として含めることもできます。これは、他のプライマリクエリ列の更新可能性を維持する可能性が高くなりますが、上記のSQL結合文ほど効率的でない場合があります。
SELECT Primary.UWI, Primary.OtherData,
((SELECT Count(DBA_WellZoneIntrvlValue.UWI) As records
FROM DBA_WellZoneIntrvlValue INNER JOIN WELL_MASTER ON DBA_WellZoneIntrvlValue.UWI = WELL_MASTER.UWI
WHERE ((DBA_WellZoneIntrvlValue.ZONE_NAME="NFX_HEADER") AND (DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME="NFX_OBO_WELL")
AND WellZoneIntrvlValue.UWI = Primary.UWI))
>) 0 As CheckBoxValue
FROM Primary
バインドされたコントロールはよく知っていますか?チェックボックスコントロールは、ブールフィールド(a.k.a. Yes/NoまたはTrue/Falseフィールド)にバインドできます。これがあなたが意味するものでないなら、あなたが描いていることが私にはちょっと奇妙に聞こえるので、少し詳しく説明する必要があります。レコードがクエリ結果に含まれていない場合は、フォームまたはレポートには表示されません。つまり、クエリのレコードだけが表示されるため、説明したようなチェックボックスは常にチェックされます。代わりに、メインフォーム/レポートのクエリとは異なる別のクエリを意味しますか? –
はい、私は、チェックボックス専用の別のクエリを作成しました。 – Heather
これはhttps://stackoverflow.com/questions/1311885/sql-as-control-source-for-access-form-fieldの複製でもあります。重要なアイデアは、何らかの方法でクエリを実行する式にチェックボックスコントロールをバインドすることです。しかし、(フォーム/レポートの)プライマリレコードのソースクエリとチェックボックスのソースとして必要な補足クエリを投稿すると、おそらくより具体的で効率的なソリューションがあります。 (漠然とした、おおよその、またはまったく答えが必要な場合を除き、尋ねた時点での事項が重要ではないと思っても、サンプルコードまたはSQLを投稿します) –