【问题标题】:MS Access question about opening the next record in a split form-datasheet关于在拆分表单数据表中打开下一条记录的 MS Access 问题
【发布时间】: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


【解决方案1】:

如果打开表单过滤到单个记录,则没有“上一个”或“下一个”记录可以移动到。但是,代码可以通过设置表单的Filter属性来改变过滤条件。

NewStudent 背后的代码选项:

DoCmd.GoToRecord acDataForm, "StudentListing", acNext
Me.Filter = "ID=" & Forms!StudentListing.ID

或者

With Forms!StudentListing.RecordsetClone
.FindFirst "ID=" & Me.ID
.MoveNext
Me.Filter = "ID=" & !ID
End With

建议不要在命名约定中使用空格。

【讨论】:

  • 感谢您的建议。我没想到直接触摸 student_listing 表格等。太棒了。 ....我同意,我添加了下划线“_”而不是空格。
【解决方案2】:

我找到了适合我的解决方案:

 Dim cBox As Control   
 Set cBox = Me.ActiveControl
 If cBox <> 0 Then
 With Me.RecordsetClone
 .FindFirst "ID =" & ctrl.Column(1) ' <-- the ID column from the query results
 If Not .NoMatch Then
 Me.Bookmark = .Bookmark
 End If
 End With

 End If 

CTRL 以 null 开头,是一个包含两列的组合框。组合框源是一个包含全名和相关 ID 的查询。

又快又干净。

感谢支持!

【讨论】:

  • 我很困惑。问题没有提到组合框。这段代码后面是哪种形式?如果 NewStudent 被过滤为问题所示的单个记录,您如何使用书签移动到另一个记录?不需要声明和设置控制对象变量。
  • 这就是问题所在。如果我通过导航窗格打开 NewStudent 表单,则所有记录都可用,并且下拉菜单有效。如果我通过数据表中的按钮或超链接打开 NewStudent 表单,则只会打开 1 条记录。因此,无法循环到下一条记录或上一条记录。我决定不实施,并强制最终用户单独打开每条记录。除非我错了,否则没有办法从一个打开的记录“记录集/记录集克隆”然后移动下一个。
  • 正确,但我的回答显示了当表单打开到单个记录时如何模拟移动到下一个(或上一个)记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多