代码之家  ›  专栏  ›  技术社区  ›  Dale

访问有时会跳转到保存新记录时的现有记录-access2k fe/sql2005 be

  •  12
  • Dale  · 技术社区  · 15 年前

    我真的是出于绝望,在四处寻找答案,尝试了一些不同的事情却没有成功之后,发布了这篇文章。

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

    但是,自从转到Access FE/SQL BE安装程序后,用户一直在报告 有时 在输入新记录时,单击子窗体(保存记录)或单击菜单本身上的“保存”,它将跳转到现有记录。新记录已保存,但由于某些原因,在刷新时,访问会切换到其他记录。然后,用户必须关闭、查找保存的记录并继续编辑。

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

    这种奇怪的行为只发生在插入新记录时,而不是在编辑现有记录时。用户告诉我它发生了' 更经常 '当他们在打开数据库后要添加新的(报价、客户、任何内容)时。

    我注意到它只发生在具有子窗体的窗体上,所以我首先想到的是,它必须与保存窗体数据之前通过子窗体数据发送的访问有关,从而导致pk冲突。但似乎没有发生这种情况:SQL Server上没有错误,并且记录已成功保存。强制用户在添加子窗体记录之前保存主窗体记录(即在报价单上,强制用户在添加行项目之前保存报价单)不起作用,这只会导致保存时跳转(有时)。

    它不是在save或current上运行的vba,而是在所有事件处理程序跳转时设置了断点,并且没有执行vba。有些“跳转”窗体在窗体上没有VBA。但都有亚型。我怀疑这和记录锁定有关。

    运行这些表的服务器是SQL Server 2005,用户使用的是Access 2000和2003的组合,其中大多数是xp sp3和几个旧的win2k框。他们正在使用合并复制,一些用户正在运行复制的SSEE2005版本并订阅主服务器。大多数用户没有被复制,只是通过ODBC或SQL本机客户端连接直接连接到服务器。但我已经验证了这是发生在所有用户身上的,通常一天一到两次,而且以前也发生过。所以这不是用户的问题。

    这种行为最糟糕的部分是它只在某些时候发生,而我还没有找到一个可以 总是 因为它会发生。

    如果以前有人经历过类似的事情,请告诉我你是如何解决的,甚至欢迎提出建议。

    更新: (1/10/09)多亏了大卫·芬顿,问题解决了。在打开表单以添加记录之前,将其设置为数据输入模式(form.data entry=true)确实可以防止跳转。自从我一周前换了这个客户就没有任何问题。

    7 回复  |  直到 7 年前
        1
  •  8
  •   Tony Toews    15 年前

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

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

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

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

        2
  •  4
  •   Philippe Grondier    15 年前

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

    如果插入的记录的pk 之后 表中的插入与插入前给定的pk保持类似(例如,在代码中添加一些“debug.print”)?

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

        3
  •  3
  •   David-W-Fenton    15 年前

    我想知道,在这种情况下,您将使用一个表单来添加包含任何其他记录供用户跳转的记录。

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

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

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

    但是我仍然建议最好的架构是通过只加载单个记录来避免这种可能的场景,因此没有其他记录可以跳转到。这当然会限制当问题发生时用户可能会在哪里结束的可能性。

        4
  •  1
  •   Cynthia    15 年前

    当有多种方法做同一件事时,我看到了这样的行为。(也就是说,从文本框中弹出一个标签来触发丢失的焦点,而不是单击一个按钮),因此,如果您还没有,请确保情况并非如此。

        5
  •  1
  •   zmatic    14 年前

    合并复制触发器解决了这个问题。在此触发器中(此问题从SQL 2005 Server转移,在SQL 2000 Server中,此问题不是NAKE问题),复制将一些数据插入具有标识的复制表中,并访问获取此数量的标识,而不是实际形式的缩进插入。我读到access使用了作用域标识的@@identity insetad,这是个问题。要避免这种情况,您应该更改合并触发器,方法是:在开始时插入触发器时,将变量中@@identity的当前值和触发器结束时的值保存为变量中写入内容的起始值的标识在临时表中插入值。这将更正@@IDdentity,Acces将获得正确的值。

    在触发器开始时 声明@identity int 声明@strsql varchar(128) 设置@identity=@@标识 最后是这样的 将@strsql='select identity(int,'+cast(@identity as varchar(15))+',1)设置为id到temp' Excel(@ SRSQL) ET和它应该放在 如果@@error<gt;0 转到故障
    和 返回

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

    我正在寻找如何自动添加这个以合并复制触发器(主要是insert)的方法。

        6
  •  1
  •   zmatic    14 年前

    这是访问和SQL通信中的错误。Access从@@Identity获取新记录的标识,输入完记录后,它将根据SQL中@@Identity值的值重新加载数据。在SQL 200中,插入的合并触发器和acces通常工作正常。从SQL 2005合并触发器的某些部分中,数据被输入到某些合并复制表中,这些合并复制表具有标识to,并且更改了@iddentity form的值,而该值是从Access新输入的rcord的值。

    一种解决方案是通过chanege all merege insert trigger在变量的开头保存@iddentity,在触发器的结尾将temp表中的dumy记录作为标识列插入,变量的起始值预先保存。

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

    我用这个来解决问题(从网络上的某个地方获取)。

    在合并开始处插入触发器

    声明@identity int

    声明@strsql varchar(128)

    设置@identity=@@标识

    在合并结束时插入触发器

    将@strsql='select identity(int,'+cast(@identity as varchar(15))+',1)设置为id到temp'

    Excel(@ SRSQL)

    在合并复制代码中,最后一个代码应该放在/*insert end on this place*/的位置。

    如果@@error<gt;0

    转到故障

    /*在此位置插入结尾*/

    返回

    但我正在寻找一种方法来自动完成这项工作,包括发布时的所有现有合并触发器,以及现有订阅和将来订阅时的所有现有合并触发器。

        7
  •  0
  •   zmatic    14 年前

    0我找到了这个

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

    但我不知道能否在SQL 2008上使用它。

    推荐文章