尝试在 Microsoft Dynamics GP 中发布分析会计事务或保存主记录时出错:无法在对象“AAGXXXXX”中插入重复密钥

本文提供了在 Microsoft Dynamics GP 中发布分析会计事务或保存主记录时发生的错误的解决方案。

适用于: Microsoft Dynamics GP
原始 KB 编号: 897280

症状

尝试在 Microsoft Dynamics GP 中发布分析会计事务时,可能会收到以下错误消息:

[Microsoft][ODBC SQL Server驱动程序][SQL Server]违反 PRIMARY KEY 约束“PKAAG30000”,无法在对象“AAG30003”中插入重复键

注意

在此错误消息 中,AAG30000 是表的占位符。 单词“contraint”是“约束”的拼写错误。

收到的实际错误消息可能包含以下表之一:

  • AAG00103
  • AAG00500
  • AAG00600
  • AAG00601
  • AAG00602
  • AAG00603
  • AAG00400
  • AAG00401
  • AAG00201
  • AAG00310
  • AAG00900
  • AAG00901
  • AAG00902
  • AAG00903
  • AAG10000
  • AAG10001
  • AAG10002
  • AAG10003
  • AAG20000
  • AAG20001
  • AAG20002
  • AAG20003
  • AAG30000
  • AAG30001
  • AAG30002
  • AAG30003

原因

出现此问题的原因是,AAG00102表中 (aaTableID) 指示的下一个可用值 (aaRowID) 已在适用的表 (或子表系列) 中使用。

例如,AAG00102表中的“30000”表将查看AAG30000、AAG30001、AAG30002和AAG30003表,因此请务必为适用的表检查系列中的所有表。

解决方案

若要解决此问题,请使用以下方法之一,将 AA 表 (和子表中) 的最高使用值与存储在 AAG00102 表中的下一个可用值进行比较。

注意

在按照本文中的说明操作之前,请确保拥有数据库的完整备份副本,可在出现问题时还原该副本。

方法 1:使用 SQL 脚本更新大多数 AA 表AAG00102中的值

可以使用下面的链接下载 SQL 脚本,并在 SQL Server Management Studio中针对公司数据库运行该脚本,以自动更新存储在 AAG00102 表中的下一个可用数字,而与 AA 表中最后使用的值相比。 该脚本将查看下表:

AAG10000、AAG20000、AAG30000、AAG00201、AAG00400、AAG00401、AAG00500、AAG00600、AAG00900和AAG00903

因此,它查看大多数 AA 表,但不是全部,而不是序列的子表。

方法 2:手动方法,一次研究和更新一个 AA 表的 AAG00102 值

  1. 打开 SQL Server Management Studio。 为此,请单击“开始”,指向“程序”,指向“Microsoft SQL Server版本”,然后单击“SQL Server Management Studio”。

  2. “连接到SQL Server”窗口中,使用 sa 密码登录到 SQL Server Management Studio。

  3. 单击“新建查询”图标可打开查询窗口,并在查询窗口中复制或键入以下脚本。 针对公司数据库执行。

    select MAX (aaGLHdrID) from AAG30000
    */Insert in the appropriate column/table for the aaGLHdrID and AAG30000 placeholders in the script.
    
  4. 请注意查询结果,该结果将显示表中上次使用的最高值。 (如果表包含子表,请确保检查这些子表中上次使用的值的最高值。)

  5. 在查询窗口中键入以下脚本,然后针对 Dynamics 数据库执行:

    select * from AAG00102 where CMPANYID = 'nnn'
    

    在此查询中,将 nnn 占位符替换为公司 ID。 若要查找公司 ID,请在查询窗口中键入以下查询。

    select * from SY01500
    

    在窗口顶部的列表中选择 DYNAMICS 数据库,然后按 F5。

  6. 验证 aaTableID30000 (或相应表) 的 aaRowID 字段中的值是否等于或大于在步骤 4 中记录的值。

  7. 使用以下脚本更新值。 为此,请在查询窗口中键入以下脚本,然后按 F5。

    update aag00102 set aaROWID = 'yyyy' where aaTableID = 30000 and CMPANYID = 'zzz'
    

    注意

    在此脚本中,将 yyyy 占位符替换为步骤 4 中记录的值。 将 zzz 占位符替换为公司 ID。 此外,将 aaTableID 替换为相应的表。