將控件綁定到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
您是否熟悉綁定控件?您可以將複選框控件綁定到布爾字段(a.k.a.是/否或True/False字段)。如果這不是你的意思,你需要提供更多的細節,因爲你描述的對我來說聽起來有點奇怪。如果記錄不在查詢結果中,則它不會顯示在表單或報表上。這意味着您所描述的複選框將始終被檢查,因爲只有查詢中的記錄纔會顯示。相反,你的意思是不同於主窗體/報表查詢的另一個查詢? –
是的,我已經爲該複選框專門創建了一個單獨的查詢。 – Heather
這可能是https://stackoverflow.com/questions/1311885/sql-as-control-source-for-access-form-field的副本。關鍵的想法是將複選框控件綁定到以某種方式執行查詢的表達式。但是,如果您發佈了主要記錄源查詢(表單/報告)和您希望作爲複選框源的補充查詢,那麼可能會有更具體的高效解決方案。 (除非你只需要模糊的,近似的,甚至沒有答案,那麼我總是會發布示例代碼或SQL,即使你不認爲具體問題在你問的時候也是如此。) –