AdoDataset ltBatchOptimistic模式下,重复录入的问题...

大P 2009-07-17 02:12:29
情况是这样的
AdoDataSet =>datasource==>DBGRID

ltBatchOptimistic模式 , 表里有唯一的字段AA

数据是手工输入,如果关键字重复的话,在保存的时候会提示重复数据,然后保存失败...

我希望的结果是 ,输入的时候,有重复的话,就及时的提示......
(因为会输入N条记录,终不能等到输入了N条记录再保存时才提示,会浪费操作人的时间)

尝试过在dataset AA字段里的 Validate里写code控制

也尝试过用locate的办法...均为成功...

希望有做过这个的大侠予以帮助,先在这里谢谢了!!


...全文
230 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
大P 2009-07-19
  • 打赏
  • 举报
回复
这年头delphi 区送分都没人进啊...人气啊...
阿三 2009-07-17
  • 打赏
  • 举报
回复
改了,看着不舒服了:(
大P 2009-07-17
  • 打赏
  • 举报
回复
晕死了....csdn改版了 delphi区的也变成了新版....和SQL Server那的一样了- -
大P 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dinoalex 的回复:]
我希望的结果是 ,输入的时候,有重复的话,就及时的提示......
(因为会输入N条记录,终不能等到输入了N条记录再保存时才提示,会浪费操作人的时间)
................

这样处理不好,即你在每一次KEYDOWN里就要查询一次库(一个值长5,就要查5次库),显然更不合理,处理更慢..

折中一点的话,可以一开始时的AA值全存在STRINGLIST里,每输入一次的话,就用STRINGLIST1.IndexOf()的返回值来判断,这样就快好多
[/Quote]
不会经常去库里核对的...
核对Adodataset ....都是在客户机的内存里操作 ..速度应该还是可以接受的
目前我的办法是clone出一个dataset 然后循环匹配

方法是笨了点..测试起来貌似还算OK...

大伙来拍砖啊..指点 或是交流下其他的方法~ 今天结贴...



procedure TFmBarcodePrint.ADODS_M_barcode300_dtlAfterPost(
DataSet: TDataSet);
var
qry_tmp:TADOQuery;
i,j,mark:Integer;
bk:TBookmark;
begin
inherited;
bk:=ADODS_M_barcode300_dtl.GetBookmark;
qry_tmp:=TADOQuery.Create(Self);

qry_tmp.Clone(ADODS_M_barcode300_dtl);

ADODS_M_barcode300_dtl.First;
for i:=1 to ADODS_M_barcode300_dtl.RecordCount do
begin
mark:=0;
qry_tmp.First;
for j:=1 to qry_tmp.RecordCount do
begin
if ADODS_M_barcode300_dtl.FieldByName('barcodeNo_100').AsString=qry_tmp.FieldByName('barcodeNO_100').AsString then mark:=mark+1;
if mark>1 then
begin
Application.MessageBox('请勿输入重复值', 'Barcode_300', MB_OK +
MB_ICONSTOP);
FreeAndNil(qry_tmp);
ADODS_M_barcode300_dtl.Delete;
Exit;
end;
qry_tmp.Next;
end;
ADODS_M_barcode300_dtl.Next;
end;

FreeAndNil(qry_tmp);
ADODS_M_barcode300_dtl.GotoBookmark(bk);
end;

dinoalex 2009-07-17
  • 打赏
  • 举报
回复
我希望的结果是 ,输入的时候,有重复的话,就及时的提示......
(因为会输入N条记录,终不能等到输入了N条记录再保存时才提示,会浪费操作人的时间)
................

这样处理不好,即你在每一次KEYDOWN里就要查询一次库(一个值长5,就要查5次库),显然更不合理,处理更慢..

折中一点的话,可以一开始时的AA值全存在STRINGLIST里,每输入一次的话,就用STRINGLIST1.IndexOf()的返回值来判断,这样就快好多
大P 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zxf_feng 的回复:]
用stringgrid表格来实现批量录入与提交,判断能容易些
[/Quote]

= =项目基本要交付了.. 这个录入模式基本已经定了...现在改不太实际~ 还是很谢谢你!! 以后再用到的时候 我会尝试用Sringgrid
大P 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 newfang 的回复:]
ADOQUERY手工在DBGRID里面输入的话,换行时就会自动POST,如果主键冲突的话当时就会提示出来
[/Quote]

ltBatchOptimistic模式,到最后保存的时候才一次性updateBatch~
让数据库自动 判断唯一性错误只有在这个时候才会跳出错误提示

阿三 2009-07-17
  • 打赏
  • 举报
回复
用stringgrid表格来实现批量录入与提交,判断能容易些
newfang 2009-07-17
  • 打赏
  • 举报
回复
ADOQUERY手工在DBGRID里面输入的话,换行时就会自动POST,如果主键冲突的话当时就会提示出来
bdmh 2009-07-17
  • 打赏
  • 举报
回复
因为是批量保存,所以涉及到两个部分,一个是数据库中是否有重复,二是内存中的数据是否有重复编码,所以你需要分两步去判断,处理不好很容易出错
可以分步检查,先检查数据库中的,然后对你未提交的数据做一个临时编码列表,然后再到这个列表中查找是否已经有过了

如果是数字型字段的话,可以先行取出最大值ID,然后新增记录顺序加一,但是在多用户并发时,又会有问题,所以具体怎样操作方便,就看你实际情况了
火龙岛主 2009-07-17
  • 打赏
  • 举报
回复
一般情况下,是保存的时候才取唯一值。或者让系统自己取。
这样就不会出现保存的时候提示有重复的主键的问题!

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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