Access有时会在保存新记录时跳转到现有记录 - Access2k FE / SQL2005 BE

时间:2009-09-15 05:14:08

标签: sql database sql-server-2005 ms-access access-vba

在寻找答案并尝试一些不同的事情但没有成功之后,我真的是在绝望中发布这个。

我有一个Access数据库,我最近将表迁移到SQL 2005,Access继续作为前端提供表单,报表和查询。

但是,由于转到Access FE / SQL BE设置,用户一直在报告有时,当他们输入新记录时,他们会点击子表单(保存记录)或单击菜单本身的保存,它会跳转到现有记录。新记录已保存,但由于某些原因,访问在刷新时切换到不同的记录。然后,用户必须关闭,找到保存的记录,然后继续编辑它。

  

场景:用户输入报价并填写所有报价详细信息,客户,   日期等,然后点击行项目子表单添加产品(或点击菜单中的保存),然后突然   报价表(和行项目子表单)显示一些随机报价的详细信息。随机引用可能是最近的,也可能是几年前的,并且与他们输入的报价没有任何共同之处。

这种奇怪的行为只发生在插入新记录时,从不编辑现有记录。用户告诉我,当他们在打开数据库后添加新的(引用,客户等)时,会发生“更多”。

我注意到它只发生在具有子表单的表单上,所以我首先想到的是它必须与Access在保存表单数据之前通过子表单数据发送,从而导致PK违规。但这似乎没有发生:SQL服务器上没有错误,并且记录已成功保存。在添加子表单记录之前强制用户保存主表单记录(即在报价上,强制他们在添加行项目之前保存报价)不起作用,它只会导致保存时跳转(有时)。

不是vba在save或on current上运行,我在所有事件处理程序上都设置了断点,因为它跳转并且没有执行vba。一些“跳跃”表单在表单上没有vba。但都有子表格。我怀疑它与记录锁定有关。

运行表的服务器是SQL Server 2005,用户使用的是Access 2000和2003的混合,主要是XP SP3和几个旧的Win2k盒。他们正在使用合并复制,并且有几个用户正在运行复制的SSEE2005版本并订阅主服务器。大多数用户不会被复制,只是通过ODBC或SQL本机客户端连接直接连接到服务器。但我已经证实这种情况发生在所有用户身上,通常是一天一次或两次,而且之前发生在我身上。所以这不是用户问题。

关于这种行为的最糟糕的部分是它只在某些时候发生,我还没有设法找到总是导致它发生的场景。

如果有人之前经历过这样的事情,请告诉我你是如何整理出来的,甚至欢迎提出建议。

更新 (1/10/09)由于David Fenton,问题解决了。在打开它以添加记录之前将表单设置为数据输入模式(Form.DataEntry = true)确实可以防止跳转。自从我在一周前更改此内容以来,客户端一直没有报告任何问题。

7 个答案:

答案 0 :(得分:8)

客户报告偶尔出现类似问题。它在开始使用合并复制后立即启动。

我已经通知了Microsoft Access产品组中的几个联系人以及我的Access和SQL Server MVP。

请将您的电子邮件地址通过电子邮件发送给我,以便我可以将其转发给Microsoft的联系人,因为我认为他们希望直接与您联系。在granite.ab.ca的托尼

BTW优秀的故障排除和详细的问题描述。

答案 1 :(得分:4)

这听起来像是一个记录锁定问题。您使用自动编号作为PK吗?您是否尝试过2台计算机同时在同一表单上添加记录(意味着其中一台计算机将触发插入事件,而另一台计算机在表单上添加了一条新记录但仍在编辑它)?

如果表格中插入后插入的记录的PK与插入之前给出的PK保持相似(例如添加一些'debug.print'),你能否检查一下?你的代码)?

一个场景可能是机器为同一个PK提供了两个挂起的插入,第二个插入在插入时自动更改,导致您的表单丢失“活动”记录。

答案 2 :(得分:3)

我想知道您使用表单添加记录的情况,该记录具有任何其他记录供用户跳转。

也就是说,我不相信使用相同的表格来编辑用于创建记录的记录。

相反,我使用未绑定的对话框来收集所有必需的字段,在SQL中插入记录,然后将主编辑表单打开到该单个记录(而不是将整个表导航到刚刚添加的记录的表单)

请记住,在主窗体/子窗体方案中,在未保存父窗体时在子窗体中创建记录会导致保存父窗口。您可能想要检查主窗体的Insert和Update事件中是否有任何代码会导致在插入新记录时重新查询主窗体(通过编辑子窗体触发)。

但我仍然建议最好的架构是通过仅加载单个记录来避免这种可能的情况,因此没有其他记录可以跳转到。这肯定会限制用户在问题发生时最终可能出现的可能性。

答案 3 :(得分:1)

当有多种方法可以做同样的事情时,我看到过'喜欢'这种行为。 (即跳出文本框触发lostfocus而不是单击按钮)所以如果你还没有,请确保不是这种情况。

答案 4 :(得分:1)

合并复制触发器可以解决此问题。在这个触发器中(这个问题来自sql 2005服务器,在SQL 2000服务器中这不是nake问题)复制在具有标识和访问的复制表中插入一些数据获取此数量的标识而不是真实形式的indentity插入。我读到该访问使用了SCOPE_IDENTITY的@@ IDENTITY insetad,这是个问题。为了避免这种情况,你应该改变合并触发器的方式,在插入触发器中,开始在变量中保存当前值@@ identity并在临时表中作为标识的触发器插入值的末尾保存当前写入变量的值。这将纠正@@ iddentity和access将获得正确的价值。

在触发开始时  DECLARE @identity int  DECLARE @strsql varchar(128)  设置@identity = @@ IDENTITY 结束类似的东西  set @ strsql ='select identity(int,'+ CAST(@identity as varchar(15))+',1)as id into #temp'  EXEC(@strsql) 和它应该放在之间     if @@ error<> 0         转到FAILURE
和     返回

access中的问题不仅会出现在表单上,​​还会直接出现在ODBC链接表中。

我正在寻找如何自动添加到合并复制触发器(主要是插入)的方法。

答案 5 :(得分:1)

这是Access和SQL通信中的错误。 Access从@@ IDENTITY获取新记录的标识,当您完成输入记录后,它将根据SQL中@@ IDENTITY值的值重新加载数据。在SQL 200中插入合并触发器和Acces usualy工作正常。从SQL 2005合并触发器中有一些部分,其中数据在某些合并复制表中输入,该表具有与来自Access新输入的rcord的@IDDENTITY的标识和更改值。

一个解决方案是chanege所有merege插入触发器以保存@IDDENTITY在变量中开始它并在触发器插入dumy记录结束时在#temp表中作为标识列,其变量的起始值已被保存。

这个解决方案我发现网前的某个地方我也受到了这个问题的影响。我正在将数据库从SQL 200移动到SQL 2008,然后我在Access中发现了这个问题。我怀疑复制,因为当我删除其中一个订阅时,所有开始工作正常,但重新创建它后再次擦除。

我用它来解决问题(从网上的某个地方拿走)。

在合并插入触发器的开始

DECLARE @identity int

DECLARE @strsql varchar(128)

设置@identity = @@ IDENTITY

并在合并结束时插入触发器

set @ strsql ='select identity(int,'+ CAST(@identity as varchar(15))+',1)as id into #temp'

EXEC(@strsql)

最后一个代码应该放在/ * insert end的地方* /在合并复制代码中

如果@@ error<> 0

转到失败

/ *在此地点插入* /

返回

但我正在寻找一种方法来自动执行发布时的所有现有合并触发器以及现有和未来订阅的所有现有合并触发器。

答案 6 :(得分:0)

0我找到了这个

http://jagbarcelo.blogspot.com/search/label/identity

但我不知道我可以在SQL 2008上使用它。