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

问题描述 投票:0回答:2

更新后如何在屏幕上将记录保持在同一位置的问题有很多精心设计的解决方案。我将其简化为一个小问题的简单解决方案。

我正在使用子窗体。一个屏幕显示13条记录。第一条记录在屏幕上的位置,即Me.CurrentSectionTop = 660缇。 13号是7860缇。因此,每条记录都是600缇高。

我使用刷新还是重新查询都没有关系。

我的代码如下:

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),则表单将滚动到表中的第一条记录,并且我必须在屏幕上滚动才能找到更新的记录。

如何使用代码(或代码的细微变化)如何停止滚动问题?

ms-access access-vba ms-access-2016
2个回答
0
投票

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

还为什么要对“主”表单进行完整的重新查询?

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

  me.SubFormControlName.Form.Refresh

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
© www.soinside.com 2019 - 2024. All rights reserved.