从主要形式为子形式步进当“数据已更改”错误(“The data has been changed”

2019-09-01 03:17发布

我迁移使用SQL Server迁移助手(SSMA)的Access数据库到SQL Server。 访问应用程序将继续使用,但链接表,而不是本地的。

我已经与一个包含若干子表单形式迁移后的测试过程中遇到了问题。

测试步骤:

1)在编辑的主要形式的字段;

2)焦点切换到在子形式的字段;

3)尝试编辑该子形式的字段。

结果:一个错误信息弹出:“数据已更改另一个用户编辑此记录,您试图保存更改之前保存的更改。”

一旦错误消息被驳回在子形式的字段可以被编辑。 如果在主窗体的字段未编辑的子形式可以在没有错误消息进行编辑。

什么可能会造成这个错误的任何想法?

我试过节省主窗体上的子窗体控件的输入事件处理程序的主要形式记录(即该事件发生在主窗体上,输入包含子窗体,而不是在子窗体本身的控制时) 。 没有任何区别。 我试图重新查询在相同的子窗体控件的主要形式输入事件,但不工作 - 重新查询的主要形式会将焦点从子窗体远,因此不能进行编辑。

一个MS论坛在子窗体的After_Update事件提出Me.Parent.Requery。 这也不能工作。

SQL事件探查器显示一个更新语句,更新表的主要形式底层,当我踏进子形式。 有没有其他的语句击中修改数据的数据库。

我注意到一个有趣的事情:记录源为主要形式实际上是将两个表连接在一起的SELECT语句。 主窗体包含可以在每个记录源表的更新列字段。 在主窗体编辑字段更新的关系,不会导致子表“数据已改变”的错误。 只有编辑,在关系更新父表中的字段时出现的错误。 我试着在每两个表的更新不同的列字段。 结果是一致的:编辑父表中的记录导致错误,编辑在子表中的记录不。

子窗体和主窗体之间的链接连接在子表单表中的列在子表在主窗体的记录源列。

顺便说一句,在主窗体记录源的表实际上是加入了一个1:1的关系(一个记录在子表在父表中的每个记录)。 子表只是父表的扩展表。

我个人不会设计系统,这样,如果我是从头开始,但它是我的本钱一起工作,我希望有一些相当简单的办法,将不需要的表或表格的一个重大的重新设计(给定的主要形式和子形式各自具有超过100控制)。

Answer 1:

多试错后,我解决了这个问题。 在主窗体上的子窗体控件的输入事件处理程序,我重新查询子窗体本身。

例如,在主要形式有:

Private Sub Subform1_Enter()
    Me.Subform1.Form.Requery
End Sub

我不知道为什么这个作品,只是它的作用。



Answer 2:

这种情况发生在记录表中的更新,但主窗体的记录源没有被刷新,以反映这种变化,所以访问得到相互矛盾的信息,认为该记录已被更改。 另请参阅: http://support.microsoft.com/kb/302492



Answer 3:

我通过写更新后的形式事件这样解决这个问题:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    cSQL = "update UnderlinedTable set Field1=" & Me.Controls("Field1") & _
        ", Field2=" & Me.Controls("Field2") & _ ' and all other fields in your form
        " where PrimaryKey=" & Me.Recordset.Fields("PrimaryKeyField")
    ' here command to SQL server that executes this cSQL string
    Me.Requery
    Cancel = True 'stop Access updating
end sub

它可以被wriiten通用更新前形式事件功能基于form.recordsource并可以从通过形式参数的所有更新后的形式事件被调用改变表单字段自动生成UPDATE语句。 我做了这个给我。



文章来源: “The data has been changed” error when stepping from main form into sub form