2013-01-18 18 views
4

我正在製作一個簡單的Access窗體(連續視圖)。在Details部分有一個複選框,在頁腳有一個Command按鈕。訪問連續窗體:添加控件而不修改基礎表?

這樣,用戶可以使用複選框「選擇」多個記錄,然後單擊按鈕上的命令按鈕以運行更新所選記錄的腳本。沒有必要永久存儲這些檢查值。

通常情況下,我會爲基礎表添加一個布爾字段並將複選框與該字段關聯。但有沒有辦法做到這一點,而無需修改表格?即將複選框值存儲在內存中?

回答

2

您可以在基於 斷開記錄集的表單中包含記錄選擇複選框。這是您在內存中創建的ADO記錄集,不受任何數據源的約束。通過記錄集中的主鍵,命令按鈕的單擊過程可以遍歷記錄集以檢索「選定」記錄的主鍵列表。如果這種方法聽起來有用,請參閱Danny Lesandrini在Database Journal的文章:Create In-Memory ADO Recordsets

我根據該文章的代碼創建了此表單。主窗體包含基於子窗體的Form_Open期間加載的斷開記錄集的子窗體。

Form based on disconnected recordset

注意,你實際上並不需要顯示在表格中的主鍵(ID);只要它包含在記錄集中,就可以在記錄集行走時檢索它。

Private Sub Form_Open(Cancel As Integer) 
    Dim dbs As DAO.Database 
    Dim fld As ADODB.Field 
    Dim rstAdo As ADODB.Recordset 
    Dim rstDao As DAO.Recordset 
    Dim strSql As String 

    Set rstADO = New ADODB.Recordset 
    With rstAdo 
     .Fields.Append "EmployeeID", adInteger, , adFldKeyColumn 
     .Fields.Append "FirstName", adVarChar, 10, adFldMayBeNull 
     .Fields.Append "LastName", adVarChar, 20, adFldMayBeNull 
     .Fields.Append "Selected", adBoolean 
     .CursorType = adOpenKeyset 
     .CursorLocation = adUseClient 
     .LockType = adLockPessimistic 
     .Open 
    End With 

    Set dbs = CurrentDb 
    strSql = "SELECT EmployeeID, FirstName, LastName " & _ 
      "FROM Employees ORDER BY LastName, FirstName" 
    Set rstDao = dbs.OpenRecordset(strSql, dbOpenSnapshot) 

    Do Until rstDao.EOF 
     rstAdo.AddNew 
     rstAdo!EmployeeID = rstDao!EmployeeID 
     rstAdo!FirstName = rstDao!FirstName 
     rstAdo!LastName = rstDao!LastName 
     rstAdo!Selected = False 
     rstAdo.Update 
     rstDao.MoveNext 
    Loop 

    Set Me.Recordset = rstAdo 
    rstDao.Close  
    Set rstDao = Nothing 
    Set dbs = Nothing 
End Sub 

該代碼示例使用ADO早期綁定這需要設置一個版本Microsoft ActiveX數據對象的參考。但是,它可以很好地適用於後期綁定的適當修改。

這種方法並不完全是輕量級的。但是,它允許您選擇複選框而不將其綁定到實際數據表中的「是/否」字段。如果用戶可能會在共享表中覆蓋每個其他人的選擇,那麼這對於多用戶應用程序來說是一個挑戰。斷開的記錄集整齊地避免了這種衝突。

+0

這有點沉重,但很容易從你的樣本中調整,正是我期待的。它甚至考慮到Remou對多用戶衝突的擔憂。我現在正在推出一個版本。謝謝。 – PowerUser

3

不,沒有。連續表單不是很多活動記錄,它是一個有許多其他記錄視圖的活動記錄。對未綁定控件的任何更新僅適用於當前記錄。您可以使用記錄選擇器來選擇一組記錄並使用它們:http://wiki.lessthandot.com/index.php/Allow_the_User_to_Select_Multiple_Records_for_Processing

+0

謝謝。這是一個技術上可行的選項,但用戶不想使用記錄選擇器。然後我會添加新的字段。 – PowerUser

+1

不要忘記,你需要一些方法來隔離用戶的選擇。 – Fionnuala

+0

不要忘記,人們會很少或根本沒有理由離開計算機,將數據留在屏幕上並返回並繼續工作。斷開的記錄集可能會非常危險,或者只是非常令人沮喪。 – Fionnuala

0

你絕對可以這樣做。您只需將複選框與數據源綁定到VBA函數即可。

該函數可以根據行的PK值返回true/false,並將值存儲在集合中。

我這裏工作示例:

http://www.kallal.ca/msaccess/msaccess.html

抓住多選的例子。

所以這裏的帖子聲稱,你不能做到這一點,或者你需要一列或一個需要使用一些斷開連接的記錄均爲100%WRONG

+0

有趣的方法,並且比斷開的記錄集簡單得多。基本上,您將主鍵添加到模塊級集合變量。在你的示例表單中,當我點擊一個複選框時,它們會在更改爲期望值之前閃爍一個黑色方塊大約1/2秒。我如何保持這種「閃光」不再發生? – PowerUser