怎样检测修改记录时的重复数据

cybercobra 2000-08-09 02:13:00
程序中要修改一个表中的数据,程序由一个DBGrid通过Table控件(CachedUpdates为True)与表相连,表中一个域"物资"允许重复,但与另一个域"序号"对应的"物资"各记录则不允许重复(序号也是可重复的),即序号都为1的各记录"物资"域的值不得重复
我现在采取的检测方法是在向"物资"域中写入数据时检测是否有重复,采用的是如下的办法:
if Table.locate('p_code',InputData,[loCaseInsensitive]) then
Application.MessageBox(表中已有此物资,请重新输入.','提示',mb_Ok);
else
{继续}
但是使用此方法的问题是if后的语句一执行,如果有重复的记录,当前记录就会变成已有的那条记录;更糟糕的是如果是在添加新纪录,则执行此操作会使得新纪录"丢失"(因为"物资"是第一个要输入的域)。
于是我添加了一个Table控件"Table_Locate",Table_Locate和Table各设置均相同,然后把上面那条语句的Table改为Table_Locate,即Locate操作在Table_Locate上进行,而修改则在Table上进行则以上问题就都解决了,但是有了新的问题:当在表中同时输入两条"序号"相同的记录时,如果这两条记录的"物资"也相同(但与原有记录的"物资"不重复),程序不报错!!!
估计原因是当我对Table进行修改操作时,相应的修改在Post之前是放在Cache里面的,而此时Table_Locate中则没有相应的记录,因此Locate操作没有发现有重复。
我可是已经没辙了,在这里请教各位大虾,怎样让Table_Locate和Table两个Table控件保持完全的一致――甚至连Cache都一致?或者另有解决办法?
请各位大虾多多指教,在下先行谢过了!!!
...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cybercobra 2000-08-10
  • 打赏
  • 举报
回复
To jnww:1.我得数据还没有Post,用SQL恐怕不行,最好还是能同步;
2.用Locate恢复的话就会发生上面所说的新纪录丢失现象,所以也不能用;
To yijun2000:怎样进行这两个Table之间的同步?麻烦您再指点一下
lotto 2000-08-10
  • 打赏
  • 举报
回复
locate会将记录指针移到查找到的记录上去,所以会发生你所说的新记录丢失现象
试试下面的方法看是否可以
1.为TAble中主键建立永久字段,如TAble1id
2.在table1的beforepost事件中加入代码
with tquery.create(self) do
begin
sql.databasename:='database';
sql.add('select count(*) from tablename');
sql.add('where id='+''''+table1id.value+'''');
active:=true;
if fields[0].value>0 then
begin
showmessage('相同的记录已存在');
abort; //中止post动作.
end;
end;
如还有问题请Mail至lotto@njjxrj.com
jnww 2000-08-09
  • 打赏
  • 举报
回复
同步好象是没有办法,但你可以先记下当前位置,LOCATE后在恢复回去,不过太麻烦了,我觉得还是用QUERY的好!
yijun2000 2000-08-09
  • 打赏
  • 举报
回复
你能不能增加一个table_locate和table之间的同步操作.
jnww 2000-08-09
  • 打赏
  • 举报
回复
你用QUERY,使用SQL来判断不是很好吗?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧