批處理問題
1楼: ADOQuery的LockType設為ltBatchOptimistic,用DBGridEh進行操作,但是很難實現判斷所輸入重復問題,因為當前輸入的值並沒有正真保存到數據庫表中.用變量去記錄可以做到,但是不夠准確.如有更好的方法,請賜教!
字串2
2楼: 设个主键,用触发器 字串6
3楼: IndexField为非重复字段则,在AfterOpen事件中: ADOQuery1.FieldByName(IndexField).ProviderFlags := [pfInUpdate, pfInWhere, pfInKey];字串5
4楼: 先感謝BusinessPower,xeen的解答,但是如果該字段不是主Key那該怎麼辦呢?因為要檢測的是從表字段. 字串9
5楼: 从表也可以设主键的字串2
6楼: 这个我已经用过的方法,绝对可以用实现!字串7
7楼: TO:BusinessPower,設主Key是可以.但是我的從表記錄只是相對同一主表的從表記錄不能重復.如:A為主表.B為從表.關聯主段A.ID=B.MasterID,當B表的B.MasterID相同時B.Code不能有重復,但不同的B.MasterID則允許相同的B.Code 字串5 8楼: 在ADOQuery1的BeforePost事件中 if 检测到有重复记录 then begin ShowMessage(‘发现重复记录‘); Abort; end;字串6
9楼: To:Xeen,思路上是正確的.問題是我們沒有很好的辦法去檢測到有重得記錄,請註意我們是用 ltBatchOptimistic,當前新增的記錄並未保存到后端. 字串8 10楼: 怎么没有,TADODataset有 Locate 和 Lookup方法,都可以找到重复记录. 字串6 11楼: 我試過,用Locate,Lookup都會自動保存記錄,不可取.字串7
12楼: 根据上面的正确的思路给你一个方法,按照步骤来,一定要读清楚:
将你需要编辑的那个AdoQuery先预设为 adoQryEdit 吧:)
将你的需要保持唯一的那个字段名预设为 KeyField 吧 :)
1、放一个ClientDataSet,我们命名为cdsTmp,Filtered为True .目的是为了用来中转数据,如果用adoquery.clone也应该可以的,我们就先用clientdataset来试吧
2、放一个datasetprovider,我们命名为dsprvTmp,设置dataset为你编辑的那个adoquery,目的也是为了中转数据
3、在你编辑的那个dataset的BeforePost中写:
cdsTmp.Data := dsprvTmp.Data;
cdsTmp.Filtered := ‘KeyField=‘+dataset.fieldbyname(KeyField).AsString;
if cdsTmp.RecordCount>0 then
begin
showmessage(‘重复,请修改!‘);
Abort;
end; 字串1
13楼: 对,你也可以用另一个TADOQuery,然后Clone一下,就没自动保存这事了。 字串3 14楼: 可能我的表述有误, 我的意思是将从表的: B.MasterID,B.Code 设为key 不可重复,(相同单据里不能有相同CODE出现), 这样当你提交时就会出错,用触发器或delphi的异常 处理都可以解决这个问题. [:(!]如果再不明白就不要再问我了. 字串5 15楼: 多謝hongxing_dl,xeen,BusinessPower的指點,分先送上.我試試! 字串2 16楼: 多人接受答案了。字串6
17楼: TO:hongxing_dl
你的方法你有用过吗.
我刚才试了一下好象不行.
你有没有例子,发一个给我如何?
kycheung@163.com 字串6
上一篇:我的xp不能安装delphi 下一篇:没有了