Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Ms access Microsoft Access:由数据宏创建记录时出现重复警告_Ms Access_Macros_Foreign Keys_Ms Access 2010_Referential Integrity - Fatal编程技术网

Ms access Microsoft Access:由数据宏创建记录时出现重复警告

Ms access Microsoft Access:由数据宏创建记录时出现重复警告,ms-access,macros,foreign-keys,ms-access-2010,referential-integrity,Ms Access,Macros,Foreign Keys,Ms Access 2010,Referential Integrity,您请求对表进行的更改未成功,因为它们会在索引、主键或关系中创建重复的值。 这是我在将数据键入到子窗体的过程中收到的错误消息。我的子表单的源是一个查询,它以一对一的父子关系连接两个表。我假设在输入数据时会发生以下情况: 我有一个After Insert数据宏,它在子表中创建一行 触发数据宏,并使用相应的外键在子表中创建一行 Microsoft Access不知道我已在子表中创建了该行 当我在子窗体中键入属于子表的数据时,它会自动尝试将新行添加到子表中。此操作失败,因为已存在具有相同外键的行 我有没

您请求对表进行的更改未成功,因为它们会在索引、主键或关系中创建重复的值。

这是我在将数据键入到子窗体的过程中收到的错误消息。我的子表单的源是一个
查询
,它以一对一的父子关系连接两个
。我假设在输入数据时会发生以下情况:

  • 我有一个After Insert数据宏,它在子表中创建一行
  • 触发数据宏,并使用相应的外键在子表中创建一行
  • Microsoft Access不知道我已在子表中创建了该行
  • 当我在子窗体中键入属于子表的数据时,它会自动尝试将新行添加到子表中。此操作失败,因为已存在具有相同外键的行
  • 我有没有办法绕过这种行为?在触发数据宏时,是否可以桥接父表和子表之间的链接?我不能放弃插入后的数据宏,因为它包含一些业务逻辑,有助于识别要插入到哪个子表中,而且重要的是,在子表中填充数据时,而不仅仅是在子表中触及子表的字段时,才在子表中创建行

    非常感谢

    EDIT:我尝试通过在子窗体的After Insert宏中运行
    Me.Requery
    来解决此问题。对于单个记录似乎可以正常工作,但对于批量复制粘贴,事务中不支持错误操作。


    编辑2:我甚至发现这句话说,在一次交易之后,
    重新查询是不可能的。我有点确定应该有办法解决这个问题,因为它似乎对用户不友好…

    我通常不建议使用计时器,但在这种情况下,您可以使用计时器。在AfterInsert上,将窗体的TimerInterval设置为大约500。然后将Me.Requery代码放在计时器事件上,并将TimerInterval设置回0

    AfterInsert事件应将TimerInterval设置回500,这将防止计时器触发,直到所有记录都已粘贴

    我看到您正在使用宏。我不知道你能否在宏中使用定时器。我根本不使用宏,我建议学习VBA而不是使用它们

    Private Sub Form_AfterInsert()
        Me.TimerInterval = 500
    End Sub
    
    Private Sub Form_Timer()
        Me.Requery
        Me.TimerInterval = 0
    End Sub