【问题标题】:Access continuous form: Add a control without modifying the underlying table?访问连续表单:添加控件而不修改基础表?
【发布时间】:2013-01-02 09:27:11
【问题描述】:

我正在制作一个简单的 Access 表单(连续视图)。这在详细信息部分有一个复选框,在页脚中有一个命令按钮。

这样,用户可以使用复选框“选择”多条记录,然后单击按钮上的命令按钮以运行更新所选记录的脚本。无需永久存储这些检查值。

通常,我会在基础表中添加一个布尔字段并将复选框与该字段相关联。但是有没有办法在不修改表格的情况下做到这一点?即将复选框值存储在内存中?

【问题讨论】:

    标签: ms-access ms-access-2007


    【解决方案1】:

    不,没有。连续表格不是很多活动记录,它是一个活动记录,具有许多其他记录的视图。对未绑定控件的任何更新仅适用于当前记录。您可以使用记录选择器选择一组记录并使用它们:http://wiki.lessthandot.com/index.php/Allow_the_User_to_Select_Multiple_Records_for_Processing

    【讨论】:

    • 谢谢。这是一个技术上可行的选择,但用户不想使用记录选择器。然后我会添加新字段。
    • 别忘了你需要一些方法来隔离用户的选择。
    • 不要忘记人们会无缘无故离开电脑,将数据留在屏幕上,然后回来继续工作。断开连接的记录集确实会变得非常危险,或者只是非常令人沮丧。
    • 这些都是非常有效的可能性。谢谢。
    • 此外,如果您使用断开连接的记录集,除了显示一个复选框之外,您几乎无能为力,还有许多方法可以更容易维护和开发@ 987654322@, "它的用处有明确的限制"。将您的方法更改为易于适应 MS Access 的方法通常是一个好主意,而不是尝试硬塞 Access 以适应您的方法。
    【解决方案2】:

    您可以在基于以下内容的表单中包含记录选择复选框 断开连接的记录集。这是您在内存中创建的 ADO 记录集,未绑定到任何数据源。使用记录集中的主键,您的命令按钮的单击过程可以遍历记录集以检索“选定”记录的主键列表。如果这种方法听起来有用,请参阅 Danny Lesandrini 在 Database Journal 上的这篇文章:Create In-Memory ADO Recordsets

    我根据那篇文章中的代码创建了这个表单。主窗体包括一个基于断开连接记录集的子窗体,该记录集在子窗体的Form_Open 期间加载。

    请注意,您实际上并不需要在表单中显示主键 (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 数据对象 版本设置引用。但是,通过对后期绑定进行适当的修改,它可以正常工作。

    这种方法并不完全是轻量级的。但是,它允许您拥有选择复选框,而无需将它们绑定到实际数据表中的“是/否”字段。当用户可能会覆盖共享表中的其他选择时,这在多用户应用程序中将是一个挑战。断开连接的记录集巧妙地避免了此类冲突。

    【讨论】:

    • 这有点重,但很容易从您的样本中改编,这正是我正在寻找的。它甚至解决了 Remou 对多用户冲突的担忧。我现在正在输入这个版本。谢谢。
    【解决方案3】:

    您当然可以做到这一点。您只需将复选框绑定到 VBA 函数作为它的数据源。

    该函数可以根据行的 PK 返回真/假,并将值存储在集合中。

    我在这里有一个工作示例:

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

    获取多选示例。

    所以这里声称你不能这样做或者你需要一列或者需要使用一些断开连接的记录集的帖子都是 100% 错误的

    【讨论】:

    • 有趣的方法,比断开连接的记录集简单得多。基本上,您将主键添加到模块级 Collections 变量。在您的示例表单中,当我单击一个复选框时,它们都会以大约 1/2 秒的速度闪烁一个黑色方块,然后再更改为预期值。我如何防止这种“闪光”发生?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多