bom表结构
create table bom1
(
ParentCode char(10)
ItemCode char(10)
UseQty numeric(15,8)
)
该表设计为单层bom,存在主键约束 ParentCode+ItemCode:
  在同一个成品下料件不能重复出现
现存在这样的问题:在成品A下有料件b
在[编辑状态]下又新增一条记录在bom中变成
A下面包含
b
b
第一个b是原有的,第二个b是新增的
此时将第一个b删除,执行保存将报主键约束错误。
因为sql认为数据表中已存在A+b的主键关系,而第二个b在query中被认为是新增的,更新到数据库时使用的是insert语句所用控件为TQuery+TUpdateSql
请教下各位

解决方案 »

  1.   

    如果数据库设计ParentCode+ItemCode为主键,那么新增时能提交成功吗?应该不会出现
      A下面包含
      b
      b
    这种情况。如果真的出现,建议在TQuery的beforeInsert中先认为判断当前要插入的数据是否已经存在。
      

  2.   

    这只能说明你的程序有问题。
    在编辑状态下新增记录,根本就不应该插入b
    先取同一个ParentCode下,ItemCode的最大值,加1,作为新的b
      

  3.   

    你的意思是已经存在 A + b的话就将其先删除再添加新的 A + b  ???那就按逻辑一步一步来,先删除提交,再添加。
      

  4.   

    不知道是我没有表达清楚还是 没有人看出关键关键是第一个b可以先删除,对吧。然后我再新增第二个b,就算是已经检测不允许重复,但此时query中已经没有b了 所以检测是会通过的。 如onlyou13(流浪哥哥)所说 :那就按逻辑一步一步来,先删除提交,再添加。
    那我放弃保存时却发现数据已经被删除啦? 这样是不行的我需要的是在query的编辑状态下 可以同时删除、新增。
    那么TQuery就有两条数据需要更新,一条insert,一条delete我判断最先执行的应该insert语句所以才导致的主键重复的错误
      

  5.   

    楼主是不是 删除了query中的 第一条B;但实际数据库中没有删除 所以会报错。
      

  6.   

    还是自己解决了...在Query中增加一个字段IsDel,默认为0
    1、在编辑状态下执行删除时,将当前记录的IsDel更改为1,
    同时通过query的Filter将IsDel为1的记录隐藏起来,以达到显式删除的效果2、在保存时query中检测ItemCode+IsDel是否存在IsDel为1的记录
       如果存在则将当前记录的UseQty值赋给IsDel=1的标记为已删除的记录,并更改被赋值记录的IsDel=0
       再从query中删除当前记录
    通过此番操作之后 第二个b在query中被清除掉了,它的值被保存到了原来被删除的记录上,这样就能避免删除掉第一个b,而新增第二个b保存报主键约束的问题虽然很绕,但是问题勉强算是解决了。  谢谢诸位的参与,也从中得到了一些启发.