当前位置:主页>delphi7/进销存和数据库> 文章内容

批處理問題

发布时间:2010-01-26 | QQ免费站
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   下一篇:没有了