MS Access VBA在更新后使用连续(子)表单在屏幕上保持相同位置的记录

时间:2018-06-02 18:48:24

标签: ms-access access-vba ms-access-2016

多次询问如何在更新后在屏幕上的同一位置保留记录的问题,并且已经有许多精心设计的解决方案。我把它简化为一个简单的解决方案 - 不幸的是有一个小问题。

我在这里使用子表单。一个屏幕显示13条记录。屏幕上第一个记录的位置,即Me.CurrentSectionTop = 660缇。第13名是7860缇。所以每条记录都高达600缇。

如果我使用Refresh或Requery,那没关系。

我的代码如下所示:

    Private Sub txtQtyOrderedA_AfterUpdate()

      RecNum = Me.CurrentRecord
      screenPosition = ((Me.CurrentSectionTop - 660) / 600) + 1
      lastRecordToShow = 13 - screenPosition + RecNum

      compID = DLookup("ID", "tblcustomers", "CompShortName = '" &  Me.txtCompanyName & "'")
       updateStr = "UPDATE tblOrderDetails " _
                   & " SET ODEQtyOrdered = " & Me.txtQtyOrderedA & " WHERE tblOrderDetails.ODEOrderID=" & compID & "" _
                   & " and tblOrderDetails.ODEProductFK = '" & Me.txtProductID & "'"

       CurrentDb.Execute updateStr, dbFailOnError
       Forms![frmOrderDetails].Requery

       Me.SelTop = lastRecordToShow

    End Sub

这按照我想要的方式工作,即正确的记录显示为屏幕上的最后一条记录,从而将更新的记录放在与更新前相同的位置。

有一个小问题。如果我以步进模式运行代码(即使用F8),它可以完美地工作。但是,如果我自动运行代码(即使用F5),表单将滚动到表格中的第一条记录,我必须滚动屏幕以获取更新的记录。

任何人都可以使用我的代码(或代码的轻微变化)来帮助我停止滚动问题吗?

提前谢谢你。

2 个答案:

答案 0 :(得分:0)

me.refresh不会更改记录位置,只会显示现有记录的更新。重新查询将移动/重置记录指针。一个简单的刷新应该工作。

另外,为什么要对" main"进行完整的重新查询?形成的?

如果您的代码在表单中运行,那么您想使用:

  me.SubFormControlName.Form.Refresh

答案 1 :(得分:0)

感谢您提供用于保持屏幕位置不变的代码,请稍后再试。 就运行时(相对于步进模式)总是刷新到屏幕顶部而言,我在使用Application.echo时很幸运

Private Sub control_onclick()

    varcurrentlineid = Me.lineitemid '(current subform line item id)
    Application.Echo False

...run code that does modify data

...form!mainform.refresh (which refreshes the subform too)

   Application.Echo True
   DoEvents
   DoEvents  'seems to need  two to work

   Set rs = Forms!fmainform!fSubForm.Form.RecordsetClone
   rs.FindFirst "lineitemid=" & varlineitemid
   If Not rs.EOF Then
     Forms!fmainform!fSubForm.Form.bookmark = rs.bookmark
   End If
End Sub