2017-08-18 54 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.是/否或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查詢的效率,例如它是否基於索引價值觀等。這裏我概述了兩種方法。

直接執行查詢的每個記錄

基本走近SQL as Control Source for Access Form field已經概述了自一個複選框是像任何其他控制。然而,這個問題和答案只關注僅僅獲得價值的狹義方法。

既然你已經有一個保存的查詢,並且你只需要測試返回的記錄是否存在,那麼你可以使用域聚合函數。設置Checkbox.ControlSource屬性

=DCount("UWI","qry_OBO_WELLS","UWI = " & [UWI]) 

這假定主要形式/報告有稱爲[UWI]鍵字段,其將被傳遞到的聚合函數。

如果您需要執行未保存的查詢,您可以創建自己的VBA函數,然後以類似的方式調用它。只要確保傳入的關鍵值需要選擇適當的值。設置複選框。控件屬性

=GetCheckBoxValue([UWI]) 

這是指你的客戶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 

在這裏,我假設西印度羣島大學是數字。如果它是一個字符串值,則需要適當注意將其正確注入到SQL查詢中,但使用引號和可能的SQL參數。

這種方法的缺點是它必須反覆打開和關閉每個主記錄的新記錄集對象(和數據庫連接)。如果處理很多記錄,這可能會很慢。用一些聰明的代碼來打開和關閉連接並記錄一次是可能的,但這超出了這個答案的範圍。

包括二次查詢作爲形式/報告記錄源

下列任一替代查詢的部分應該是更有效的是在控制層結合到一個單獨的查詢。但是這兩種方法都可以使查詢不可更新,這可以有效地使可編輯表單無效。在此無法預測或討論使查詢可更新或不可更新的所有條件,因此您只需測試每個條件即可。

採用任一查詢,複選框可以綁定到查詢列作爲任何其他像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