【发布时间】:2020-09-01 16:55:56
【问题描述】:
这是针对 MS Access 2016 中的一个项目。我想在以连续形式显示的所有记录之间实现一个单选按钮切换。只有一条记录可以将切换“打开”,因此当单击它时,必须将前一条记录的标志重置为关闭。我只是在单选按钮使用方面寻找帮助,以便从一个记录的多个字段值中进行选择,通常在单个表单上。这个可以吗?
【问题讨论】:
标签: ms-access
这是针对 MS Access 2016 中的一个项目。我想在以连续形式显示的所有记录之间实现一个单选按钮切换。只有一条记录可以将切换“打开”,因此当单击它时,必须将前一条记录的标志重置为关闭。我只是在单选按钮使用方面寻找帮助,以便从一个记录的多个字段值中进行选择,通常在单个表单上。这个可以吗?
【问题讨论】:
标签: ms-access
单选按钮必须绑定到是/否字段,然后使用 UPDATE 操作 SQL 确保除当前记录之外的所有记录都将字段设置为 0。需要一个唯一的记录标识符字段,例如自动编号。
Private Sub Option29_Click()
CurrentDb.Execute "UPDATE tablename SET fieldname = 0 WHERE ID <>" & Me.ID
End Sub
请注意,在多用户数据库中,用户可能会相互冲突,因此需要另一种解决方案。取决于您需要对所选记录执行什么操作。
【讨论】:
AND fieldname <> 0 添加到 WHERE 子句中。因此,只有一条现有的“真实”记录被更新,而不是全部更新。
使用表单的RecordSetClone:
Private Sub Active_AfterUpdate()
Dim Records As DAO.Recordset
Me.Dirty = False
If Me!Active.Value = True Then
Set Records = Me.RecordsetClone
Records.MoveFirst
While Not Records.EOF
If Records!Id.Value <> Me!Id.Value Then
If Records!Active.Value = True Then
Records.Edit
Records!Active.Value = False
Records.Update
End If
End If
Records.MoveNext
Wend
Records.Close
End If
End Sub
【讨论】:
您可以轻松做到:
1- 在您的表格中添加一个新的 Yes/No 字段(例如,名为 CurrentRec)
2- 放置单选按钮并将其链接到此字段(例如命名为 rdCurrRec)
3- 对于单选按钮,将“启用”属性设置为 False,将“锁定”属性设置为“真”。这将禁用单击 - 双击和悬停响应。
4- 输入以下代码
Dim PreBookmark(4) As Byte 'Save old bookmark
Private Sub Form_Current()
If Not Me.NewRecord Then 'Make sure not on new record
Me.rdCurrRec = True
If (PreBookmark(0) <> 0 Or PreBookmark(1) <> 0 Or PreBookmark(2) <> 0 Or PreBookmark(3) <> 0) Then
Me.RecordsetClone.Bookmark = PreBookmark
Me.RecordsetClone.Edit
Me.RecordsetClone.Fields("CurrentRec") = False
Me.RecordsetClone.Update
End If
PreBookmark(0) = Me.Bookmark(0)
PreBookmark(1) = Me.Bookmark(1)
PreBookmark(2) = Me.Bookmark(2)
PreBookmark(3) = Me.Bookmark(3)
Else 'If new record remove bullet from previous record
If (PreBookmark(0) <> 0 Or PreBookmark(1) <> 0 Or PreBookmark(2) <> 0 Or PreBookmark(3) <> 0) Then
Me.RecordsetClone.Bookmark = PreBookmark
Me.RecordsetClone.Edit
Me.RecordsetClone.Fields("CurrentRec") = False
Me.RecordsetClone.Update
End If
End If
End Sub
Private Sub Form_Close()
'Remove the mark before exiting to avoid it appear next time to open the form in two places
If Not Me.NewRecord Then
If (PreBookmark(0) <> 0 Or PreBookmark(1) <> 0 Or PreBookmark(2) <> 0 Or PreBookmark(3) <> 0) Then
Me.RecordsetClone.Bookmark = PreBookmark
Me.RecordsetClone.Edit
Me.RecordsetClone.Fields("CurrentRec") = False
Me.RecordsetClone.Update
End If
End If
End Sub
这不会迭代所有数据,因此对于大量记录它不会延迟响应,因为它仅适用于两条记录
【讨论】: