【发布时间】:2020-02-25 13:46:13
【问题描述】:
到目前为止,这是一段令人沮丧的旅程,我直觉解决方案是显而易见的,但我看不到森林中的树木。
我有 MS Access db,它打开一个拆分表单。数据表位于底部,表单顶部包含添加或导出按钮以及其他内容。要添加新记录,用户将单击一个按钮并打开空白绑定子表单“新学生”。
如果用户单击数据表侧 (action:DoCmd.OpenForm "New Student", , , "[ID]=" & Me.ID, , acDialog) 中的条目,则会打开相同的表单,其中填充了数据表中的信息;使用身份证。像冠军一样工作。
请求是在该子表单上包含一个按钮“新学生”,该按钮将前进到“学生列表”中的下一条记录。应该很容易。我的代码在 ID 列列表中存在空白时除外。 ID条目是'Primary Key'设置为自动编号。如果用户删除了允许的记录,则该列表中存在间隙。
是的,我尝试了创建按钮,然后选择下一个或上一个记录技巧,但这根本不起作用,无论 ID 编号差距如何。
如何克服编号上的差距,或者有更好的方法来打开“下一条记录”。我到目前为止的代码如下。我已经尝试了同一过程的多次迭代,但成功有限。
Dim rs As dao.Recordset
On Error GoTo ErrorHandle
Set rs = Forms![Student Listing].Form.RecordsetClone
'MsgBox rs.RecordCount
rs.Bookmark = Me.Bookmark
If (Me.CurrentRecord < rs.RecordCount) And (Me.CurrentRecord <> 1) Then
DoCmd.GoToRecord , , acNext
ElseIf (Me.CurrentRecord < rs.RecordCount) And (Me.CurrentRecord = 1) Then
DoCmd.GoToRecord , , acGoTo, 1
Else
ErrorHandle:
MsgBox "At the first record, will re-start at the last record.", vbOKOnly, "First Record"
DoCmd.GoToRecord , , acLast
End If
主题的变化:
Dim rs As dao.Recordset
On Error GoTo ErrorHandle
Set rs = Forms![Student Listing].Form.RecordsetClone
rs.Bookmark = Me.Bookmark
'MsgBox "Open Record: " & Me.CurrentRecord, vbOKOnly
If (Me.CurrentRecord < rs.RecordCount) And (Me.CurrentRecord <> rs.RecordCount) Then
rs.MoveNext
'DoCmd.GoToRecord , , acNext
ElseIf (Me.CurrentRecord = rs.RecordCount) Then
DoCmd.GoToRecord , , acGoTo, Me.CurrentRecord
Else
ErrorHandle:
MsgBox "At last record, will re-start at first record.", vbOKOnly, "Last Record"
DoCmd.GoToRecord , , acFirst
End If
Set rs = Nothing
'下面的工作,但如果它必须跳过一个 ID 号码,则跳转到下一个可用的'主键'号码:
Dim val As Integer
On Error GoTo ErrorHandler
val = Me.ID.Value
val = val + 1
DoCmd.OpenForm "New Student", , , "[ID]=" & val, , acDialog
ErrorHandler:
Resume Next
val = 0
如果我的条目有点冗长,我深表歉意,我从事这项特殊任务已经有一段时间了。
感谢您的帮助。
【问题讨论】:
-
你说
subform,但由于表单是独立打开的,它并不是真正的子表单。 -
你想在“学生列表”还是“新学生”上推进哪种形式?
-
感谢您的反馈。回答您的问题/cmets: 1. 是的,您是对的,它不是子表单,而是从表单调用的,所以我只是使用子表单。 2. 新生。
标签: ms-access record recordset