Sql Me.当前所选记录的脏动作
我有一张Access 2007表格,这让我有些头疼 我有一个记录列表,从一个组合框开始选择一个公司,然后是一系列复选框来指示公司的角色 如果用户需要添加新公司,他们会从组合框中选择公司名称,然后单击指示公司所扮演角色的复选框。选中该复选框后,表单将按照以下代码显示一个捕获其他信息的弹出窗口:Sql Me.当前所选记录的脏动作,sql,vba,ms-access,Sql,Vba,Ms Access,我有一张Access 2007表格,这让我有些头疼 我有一个记录列表,从一个组合框开始选择一个公司,然后是一系列复选框来指示公司的角色 如果用户需要添加新公司,他们会从组合框中选择公司名称,然后单击指示公司所扮演角色的复选框。选中该复选框后,表单将按照以下代码显示一个捕获其他信息的弹出窗口: Private Sub chkOperationsAndMaintenance_AfterUpdate() 'DoCmd.RunCommand acCmdSaveRecord' If Me
Private Sub chkOperationsAndMaintenance_AfterUpdate()
'DoCmd.RunCommand acCmdSaveRecord'
If Me.Dirty Then Me.Dirty = False
If chkOperationsAndMaintenance.Value = True Then
DoCmd.OpenForm "OmPopupForm", , , "CompanyProjectId = " & Me.CompanyProjectID, , acDialog
Me.Requery
End If
End Sub
此代码将保存CompanyProject表上的记录以创建行。然后,它提取CompanyProject(CompanyProject表的主键),以便知道向弹出窗口提供哪个ID
我遇到的问题是,在Me.Dirty行(以及上面注释掉的acCmdSaveRecord)上,整个表单保存并刷新,将所选行移动到第一条记录(在本例中为“Gamesa”),而不是新输入的记录。因此,随后的弹出窗口将输入第一条记录的CompanyProjectd,而不是新输入的记录,并且它还从第一条记录而不是用户正在处理的记录中读取复选框的“选中”状态
我对代码进行了如下修改:
Private Sub chkOperationsAndMaintenance_AfterUpdate()
Dim CPID As Long
Dim CID As Long
Dim rs As Recordset
Set rs = Me.RecordsetClone
CID = Me.CompanyID
'DoCmd.RunCommand acCmdSaveRecord'
If Me.Dirty Then Me.Dirty = False
CPID = DLookup("MAX(CompanyProjectID)", "CompanyProject", "cpProjectID = " & Me.cpProjectID & _
" AND CompanyID = " & CID)
rs.Find "[CompanyProjectID] = " & CPID
Me.Bookmark = rs.Bookmark
If chkOperationsAndMaintenance.Value = True Then
DoCmd.OpenForm "OmPopupForm", , , "CompanyProjectId = " & Me.CompanyProjectID, , acDialog
Me.Requery
End If
End Sub
这些修改的想法是,我们将从父窗体(“cpprojection”)中获取FK,并从组合框中获取所选内容的CompanyID,然后保存记录。保存记录后,我们已经存储了CompanyProjection,因此rs.Find和Me.Bookmark行将选择与该CompanyProjection匹配的记录
这有时有效,有时无效。通常不会。在本例中,我刷新了父窗体和当前窗体,并尝试添加一个新公司,然后单击“所有者”复选框(使用与上面相同的代码,只是使用了不同的复选框ID),以查看错误行上的书签:
在这一点上,我不知道该怎么办。如果我没有保存记录(通过acCmdSaveRecord或Me.Dirty=False),那么我就没有公司项目作为后续弹出窗口的输入参数发送,但是如果我保存了记录,那么表单会更改记录,发送错误的参数,并读取错误复选框的选中状态。我不能只使用任意索引(例如acNewRec)来处理,因为用户可能需要编辑现有行,而不是添加新行
我已经在这篇文章中尝试了这种方法:,但是find/bookmark并不总是有效
编辑(12/15/2014)
我最终使用了以下VBA代码:
Private Sub chkOperationsAndMaintenance_AfterUpdate()
Dim CPID As Long
Dim CID As Long
Dim rs As Recordset
Set rs = Me.RecordsetClone
CID = Me.CompanyID
If Me.Dirty Then Me.Dirty = False
CPID = DLookup("MAX(CompanyProjectID)", "CompanyProject", "cpProjectID = " & Me.cpProjectID & _
" AND CompanyID = " & CID)
Do While Me.CompanyProjectID <> CPID
If Me.CurrentRecord < Me.Recordset.RecordCount Then
DoCmd.GoToRecord , , acNext
Else
DoCmd.GoToRecord , , acFirst
End If
Loop
If chkOperationsAndMaintenance.Value = True Then
DoCmd.OpenForm "OmPopupForm", , , "CompanyProjectId = " & Me.CompanyProjectID, , acDialog
Me.Requery
End If
End Sub
Private Sub chkooperation和maintenance_AfterUpdate()
黯淡的CPID
暗淡如长
将遥感器作为记录集
设置rs=Me.RecordsetClone
CID=Me.CompanyID
如果是我。肮脏,那么是我。肮脏=错误
CPID=DLookup(“最大(公司项目)”、“公司项目”、“CPPROJECT=”&Me.cpprojectd&_
“和公司ID=“&CID”)
做我自己。公司计划CPID
如果Me.CurrentRecord
我觉得必须有一个更好的答案,但这似乎正在发挥作用。我现在让我的最终用户/实验室老鼠对它进行测试,所以如果成功的话,我会把它标记为完成。我仍然认为必须有更好的解决方案,但目前,该解决方案能够捕获传递到弹出窗口的必要ID,并在捕获该ID后选择适当的行。您是否考虑过保存当前位置-如Me.CurrentRecord,然后在保存后重新定位到所需的记录。例如,可以添加“Before”或“After”插入以保存位置,然后重新定位。见下文:
Option Compare Database
Option Explicit
Dim lCurRec As Long
Private Sub Form_AfterInsert()
lCurRec = Me.CurrentRecord
Debug.Print "After Insert, Current: " & Me.CurrentRecord
End Sub
<<< YOUR SUB>>>
DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, lCurRec
选项比较数据库
选项显式
暗淡如长
专用子表单_后插入()
lCurRec=Me.CurrentRecord
Debug.Print“插入后,当前:”&Me.CurrentRecord
端接头
>
DoCmd.GoToRecord acDataForm,Me.Name,acGoTo,lCurRec
添加新记录和编辑现有记录时,此代码将起作用:
Private Sub chkOperationsAndMaintenance_AfterUpdate()
Dim c As Long
Me.Dirty = False
If chkOperationsAndMaintenance Then
DoCmd.OpenForm "OmPopupForm", , , "CompanyProjectId = " & Me.CompanyProjectID, , acDialog
c = Me.CurrentRecord
Me.Requery
DoCmd.GoToRecord , , acGoTo, c
End If
End Sub
我猜您的弹出式窗体会执行特定于操作和维护的操作,并且不会更改主窗体上任何复选框的值。如果是这种情况,您根本不需要重新查询,代码可以简化:
Private Sub chkOperationsAndMaintenance_AfterUpdate()
Me.Dirty = False
If chkOperationsAndMaintenance Then
DoCmd.OpenForm "OmPopupForm", , , "CompanyProjectId = " & Me.CompanyProjectID, , acDialog
End If
End Sub
Me.Requery
是使事情发生变化的代码。它从头开始重建记录集,使所有书签无效,并移动到表单中的第一条记录。这在Rockie的情况下不起作用“用户可能需要编辑现有行而不是添加新行”正是@Tom,感谢他们的响应。重新查询并没有真正干扰记录的选择,因为问题发生在DoCmd.OpenForm之前,重新查询只是为了最终确定用户对该记录的更改。非常感谢。让我看看我是否能让它工作,稍微调整一下。问题是Me.Dirty或acCmdSaveRecord刷新表单并选择该表单中的第一个条目,因此,如果我尝试处理第三个条目,当它保存记录时,它会突出显示第一个条目,并将第一个条目的ID发送到表单。我需要在表单保存并突出显示第一条记录之前保存该记录编号。谢谢你!