2017-08-18 11 views
0

Access 2013では、クエリに基づいてチェックボックスが表示されるようにする方法はありますか?私はどこでも検索し、答えを見つけていません。レコードがクエリ結果に含まれている場合、チェックボックスをチェックして表示する必要があります。それ以外の場合はチェックされません。クエリに基づいてチェックボックスがチェックされて表示される

私はおそらくこれに簡単な答えがあることは知っていますが、私はちょうどGoogleからの答えのロックを解除する単語の適切な組み合わせを見つけることができません。 :)

ありがとう!クエリのSQLを追加するために編集

は私がにあるチェックボックスをバインドしたい:

SELECT DBA_WellZoneIntrvlValue.UWI, DBA_WellZoneIntrvlValue.ZONE_NAME, DBA_WellZoneIntrvlValue.ZATTRIBUTE_NAME, Format([ZATTRIBUTE_VALUE_STRING],"True/False") AS ZATTRIBUTE_VALUE 
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")); 

CPerkins、私はこれがあなたが求めているものであると思います。これは、問題が発生しているチェックボックスの式コードです。私は、クエリとカラムの名前をチェックボックスに追加するだけでいいのですが、単純ではありません。これは私が持っているものです。

[qry_OBO_WELLS]![ZATTRIBUTE_VALUE] 

これはばかな質問のように思えるが、私は独学ですので、私の教育に大きな穴がアクセスプログラミングに存在する場合、私はお詫び申し上げます。私はあなたにこれを手伝っていただきありがとうございます。

+0

バインドされたコントロールはよく知っていますか?チェックボックスコントロールは、ブールフィールド(a.k.a. Yes/NoまたはTrue/Falseフィールド)にバインドできます。これがあなたが意味するものでないなら、あなたが描いていることが私にはちょっと奇妙に聞こえるので、少し詳しく説明する必要があります。レコードがクエリ結果に含まれていない場合は、フォームまたはレポートには表示されません。つまり、クエリのレコードだけが表示されるため、説明したようなチェックボックスは常にチェックされます。代わりに、メインフォーム/レポートのクエリとは異なる別のクエリを意味しますか? –

+0

はい、私は、チェックボックス専用の別のクエリを作成しました。 – Heather

+0

これはhttps://stackoverflow.com/questions/1311885/sql-as-control-source-for-access-form-fieldの複製でもあります。重要なアイデアは、何らかの方法でクエリを実行する式にチェックボックスコントロールをバインドすることです。しかし、(フォーム/レポートの)プライマリレコードのソースクエリとチェックボックスのソースとして必要な補足クエリを投稿すると、おそらくより具体的で効率的なソリューションがあります。 (漠然とした、おおよその、またはまったく答えが必要な場合を除き、尋ねた時点での事項が重要ではないと思っても、サンプルコードまたはSQLを投稿します) –

答えて

0

私はちょうど私がカヌーに立っていることを発見し、これを困難な方法でやろうとしました。

CPerkinsが投稿したことを考えた後、フォームのクエリに戻り、チェックボックスに使用したいテーブルを追加しました。その後、OBO_WELLフィールドのコメントに投稿したIIfステートメントを使用しました。私はその後、OBO_WELLフィールドにチェックボックスを結んで、それは働いた。

CPerkinsさん、ありがとうございました。 :)

+0

素晴らしい!あなたが私の長い答えの要点を手に入れる前に、投稿が終わったようです。もちろん、私はあなたのテーブル構造やプライマリクエリの詳細を知らなかったので、必要以上に複雑になるかもしれません。あなたのプライマリクエリにあなたの単純なフィールドを含めるだけでいいですね。 –

0

コントロール(この場合はチェックボックス)をSQL式にバインドする方法は複数あります。ここでは、これをセカンダリクエリと呼び、フォーム/レポートにバインドされたプライマリクエリと区別します。 1)フォーム/レポートにバインドされているプラ​​イマリレコードセットのサイズ、2)プライマリクエリを更新可能にする必要があるかどうか、3)セカンダリSQLクエリの効率、たとえばインデックス付きここでは2つのアプローチを概説します。各レコード

チェックボックスは、他の制御と同様であるため、既にSQL as Control Source for Access Form fieldに概説されている接近基本的に直接クエリを実行

。しかし、その質問とその答えは、値を取得するという狭いアプローチに焦点を当てています。

すでに保存されたクエリがあり、返されたレコードの存在をテストする必要があるだけなので、ドメイン集計関数を使用できます。これは、主フォーム/レポートでは、集計関数に渡されます[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 
関連する問題