Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Me.当前所选记录的脏动作_Sql_Vba_Ms Access - Fatal编程技术网

Sql Me.当前所选记录的脏动作

Sql Me.当前所选记录的脏动作,sql,vba,ms-access,Sql,Vba,Ms Access,我有一张Access 2007表格,这让我有些头疼 我有一个记录列表,从一个组合框开始选择一个公司,然后是一系列复选框来指示公司的角色 如果用户需要添加新公司,他们会从组合框中选择公司名称,然后单击指示公司所扮演角色的复选框。选中该复选框后,表单将按照以下代码显示一个捕获其他信息的弹出窗口: Private Sub chkOperationsAndMaintenance_AfterUpdate() 'DoCmd.RunCommand acCmdSaveRecord' If Me

我有一张Access 2007表格,这让我有些头疼

我有一个记录列表,从一个组合框开始选择一个公司,然后是一系列复选框来指示公司的角色

如果用户需要添加新公司,他们会从组合框中选择公司名称,然后单击指示公司所扮演角色的复选框。选中该复选框后,表单将按照以下代码显示一个捕获其他信息的弹出窗口:

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发送到表单。我需要在表单保存并突出显示第一条记录之前保存该记录编号。谢谢你!