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
请教下各位
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
请教下各位
A下面包含
b
b
这种情况。如果真的出现,建议在TQuery的beforeInsert中先认为判断当前要插入的数据是否已经存在。
在编辑状态下新增记录,根本就不应该插入b
先取同一个ParentCode下,ItemCode的最大值,加1,作为新的b
那我放弃保存时却发现数据已经被删除啦? 这样是不行的我需要的是在query的编辑状态下 可以同时删除、新增。
那么TQuery就有两条数据需要更新,一条insert,一条delete我判断最先执行的应该insert语句所以才导致的主键重复的错误
1、在编辑状态下执行删除时,将当前记录的IsDel更改为1,
同时通过query的Filter将IsDel为1的记录隐藏起来,以达到显式删除的效果2、在保存时query中检测ItemCode+IsDel是否存在IsDel为1的记录
如果存在则将当前记录的UseQty值赋给IsDel=1的标记为已删除的记录,并更改被赋值记录的IsDel=0
再从query中删除当前记录
通过此番操作之后 第二个b在query中被清除掉了,它的值被保存到了原来被删除的记录上,这样就能避免删除掉第一个b,而新增第二个b保存报主键约束的问题虽然很绕,但是问题勉强算是解决了。 谢谢诸位的参与,也从中得到了一些启发.