Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 server 更新表单时在链接表中插入重复行';用VBA实现记录源_Sql Server_Vba_Ms Access 2010 - Fatal编程技术网

Sql server 更新表单时在链接表中插入重复行';用VBA实现记录源

Sql server 更新表单时在链接表中插入重复行';用VBA实现记录源,sql-server,vba,ms-access-2010,Sql Server,Vba,Ms Access 2010,我正在Microsoft Access 2010中对一个链接表应用程序进行维护工作,遇到了这个小问题。该应用程序链接到SQL Server 2008数据库。该应用程序有一个主窗体,允许用户选择公园代码和资源的组合,并弹出一个编辑窗体以显示该特定组合的详细信息。如果数据库中不存在该组合,应用程序将在中插入一条新记录,但问题是插入了两条记录 这是问题代码的所在,当我需要在详细信息弹出表单中插入新记录时,会调用它: Private Sub New_Rec(unit_code As String, re

我正在Microsoft Access 2010中对一个链接表应用程序进行维护工作,遇到了这个小问题。该应用程序链接到SQL Server 2008数据库。该应用程序有一个主窗体,允许用户选择公园代码和资源的组合,并弹出一个编辑窗体以显示该特定组合的详细信息。如果数据库中不存在该组合,应用程序将在中插入一条新记录,但问题是插入了两条记录

这是问题代码的所在,当我需要在详细信息弹出表单中插入新记录时,会调用它:

Private Sub New_Rec(unit_code As String, resource As String, sql As String)

   DoCmd.RunSQL ("INSERT INTO PARK_RESOURCES (unit_code, resource, sensitivity) VALUES " _
    & "('" & unit_code & "','" & resource & "','public')")

   'Force an explicit save
   'http://www.pcreview.co.uk/forums/update-cancelupdate-without-addnew-edit-t1150554.html
   If Me.Dirty Then
      Me.Dirty = False
   End If

   Me.RecordSource = sql
End Sub
创建一个“新”记录将导致2条记录插入记录集中。在设置RecordSource之前还是之后移动显式保存代码似乎并不重要。按任一顺序(并在任一顺序后停止)生成插入数据库中的2条新记录(通过在SSMS中查询进行验证)

设置RecordSource属性并单步执行代码时,事件链看起来像:Me.RecordSource=sql-->Form\u BeforeUpdate()-->Form\u AfterUpdate()-->Form\u AfterUpdate()-->Form\u After\u Insert()-->Form\u Current()。在BeforeUpdate结束时,副本不存在,但在我进入AfterUpdate时,副本已经插入。更新之前和更新之后发生了什么导致这种情况

根据:在插入之前→ 更新前→ 更新后→ 后插页。它们还声明,通过Visual Basic设置控件的值不会触发这些事件。但当我在代码中更新RecordSource时,最后3个事件肯定会触发;BeforeInsert是唯一一个单步执行不会停止的工具

根据Daniel Cook的要求,这是呼叫代码

Private Sub Form_Load()
   On Error GoTo Err_Form_Load

   Me.KeyPreview = True
   If Not IsNull(Me.OpenArgs) Then
      ProcessOpenArgs (Me.OpenArgs)
      Me.lblHeader.Caption = Me.unit_code & ": Resource - " & Me.resource
   Else
      Me.lblHeader.Caption = "Information Needs"
   End If
   ... (error trapping)
End Sub
以及ProcessOpenArgs子文件(OpenArgs被设置为“park;resource”):


我将继续梳理事件文档,作为最后的手段,我可能会完全发疯,只需将所有可能的事件粘贴到我的VBA代码中并逐步执行它们,但有人知道会发生什么导致重复吗?

进程OpenArgs
中,如果(rs.RecordCount=0),则
If(rs.RecordCount=0)然后,除非您首先使用
rs.MoveLast
,否则行可能会出现问题-当我设置
Me.unit\u code
Me.unit
时,请参见此处:

Private Sub ProcessOpenArgs(open_args As String)
   On Error GoTo Err_ProcessOpenArgs

   Dim Args() As String
   Args = Split(open_args, ";")

   Me.unit_code = Args(0)
   Me.resource = Args(1)
代码正在创建一条记录,然后在数据库中插入第二条记录。当表单在
Me.RecordSource=sql
之后自动重新查询时,它也会将第一条记录(由
ProcessOpenArgs
中的Me.xxx=yyyy语句创建)粘贴到DB中,然后将这两条记录都拉回到表单记录集。这就是双插入的来源

为了纠正它,我将
Me.unit\u code
Me.resource
更改为本地子例程变量
l\u unit\u code
l\u resource
,并在
ProcessOpenArgs
中使用它们。这解决了这个问题以及我在一种资源类型的记录中遇到的第二个问题o其他资源类型


感谢大家的帮助!

New_Rec正在使用相同的参数多次被调用。您没有显示它是如何被调用的,因此我无法告诉您。您可以在插入之前随时更新New_Rec以检查记录。这需要更长的时间,但可以结束此问题。谢谢Daniel。我已经包含了调用代码,以防出现问题可能会有帮助,但当我单步执行代码时,调试器不会在New_Rec中执行2次吗?对我来说,它只执行1次。在
ProcessOpenArgs
中,
If(rs.RecordCount=0)然后,除非您首先使用
rs.MoveLast
,否则行可能会有问题-请参阅@barrowrc,您的评论引导我找到了解决方案。基本上,当我设置
me.unit\u code
me.unit
时,代码创建一条记录,然后New\u Rec在数据库中插入第二条记录。然后,当表单自动重新查询时,它将将第一条记录ICK到DB中,并将两条记录都拉回到表单记录集中。您的建议导致
ProcessOpenArgs
抛出
运行时错误3201:No Current record
,然后不执行New_Rec。结果是只创建了一条记录--
ProcessOpenArgs中较早启动的记录e> 。这似乎有帮助,我将我的评论变成了一个答案投票b/c。根据上面的评论,这导致了最终的解决方案。这里应该注意的是,
如果rs.RecordCount=0
可以很好地确定记录集中是否存在任何记录。
rs.MoveLast
在尝试获得完整的re时变得非常重要
记录集上的跳线计数
Private Sub ProcessOpenArgs(open_args As String)
   On Error GoTo Err_ProcessOpenArgs

   Dim Args() As String
   Args = Split(open_args, ";")

   Me.unit_code = Args(0)
   Me.resource = Args(1)