如何對ClientDataSet的GetNextPacket,先進行過慮重覆的DATA? |
答題得分者是:leveon
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
李維大師書有提到CloneCursor+SQL語句會產生重覆數據的情形中?
例: ClientDataSet.FetchOnDemand:=false; ClientDataSet.PacketRecords:=5; 假設取得了前5筆id 0001,0002,0003,0004,0005 此時我用查詢方式加入了0007 dm.M_cds.AppendData(dm.Searchcds.Data,False); 目前總共記錄為 0001,0002,0003,0004,0005,0007 接這始用了GetNextPacket取回下五筆時,就發生了重覆0007 0001,0002,0003,0004,0005,0006,0007,0007,0008,0009,0010 請問該在那各事件中將重覆的0007刪掉內? 試過在BeforeGetRecord,取得是目前前5筆,而不是後五筆,放在AfterGetRecords也一樣 procedure Tdm.M_cdsBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin if(not(VarIsEmpty(OwnerData)) or( not VarIsNull(OwnerData)) ) then begin with Sender as TClientDataSet do begin if Active then begin cds4.Data:=Data; end; end; end; end;
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
沒有合適的事件
想要先行整理OwnerData 就不要使用內建的Packetrecord 功能 得自己想一個機制 取OwnerData 整理OwnerData 最後 AppendData AfterScroll 可能是個時機 另外OwnerData 格式沒開放 必需靠ClientDataSet 處理 效率不太好 ===================引 用 chris681016 文 章=================== 李維大師書有提到CloneCursor SQL語句會產生重覆數據的情形中? 例: ClientDataSet.FetchOnDemand:=false; ClientDataSet.PacketRecords:=5; 假設取得了前5筆id 0001,0002,0003,0004,0005 此時我用查詢方式加入了0007 dm.M_cds.AppendData(dm.Searchcds.Data,False); 目前總共記錄為 0001,0002,0003,0004,0005,0007 接這始用了GetNextPacket取回下五筆時,就發生了重覆0007 0001,0002,0003,0004,0005,0006,0007,0007,0008,0009,0010 請問該在那各事件中將重覆的0007刪掉內? 試過在BeforeGetRecord,取得是目前前5筆,而不是後五筆,放在AfterGetRecords也一樣 procedure Tdm.M_cdsBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin if(not(VarIsEmpty(OwnerData)) or( not VarIsNull(OwnerData)) ) then begin with Sender as TClientDataSet do begin if Active then begin cds4.Data:=Data; end; end; end; end;
|
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
|
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
如果你願意修改ClientDataset的Source Code
可以在DBClient.pas 自己加事件處理 function TCustomClientDataSet.DoGetRecords(Count: Integer; out RecsOut: Integer; Options: Integer; const CommandText: WideString; Params: OleVariant): OleVariant; var OwnerData: OleVariant; begin DoBeforeGetRecords(OwnerData); if VarIsEmpty(Params) and (Self.Params.Count > 0) then Params := PackageParams(Self.Params); Result := AppServer.AS_GetRecords(ProviderName, Count, RecsOut, Options, CommandText, Params, OwnerData); DoFixRecords(Result ); //自加事件 UnPackParams(Params, Self.Params); DoAfterGetRecords(OwnerData); end; ===================引 用 chris681016 文 章=================== 感謝大大解說,我還是下sql去取回來好了~~ |
chris681016
中階會員 發表:69 回覆:122 積分:98 註冊:2006-10-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |