全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2320
推到 Plurk!
推到 Facebook!

如何對ClientDataSet的GetNextPacket,先進行過慮重覆的DATA?

答題得分者是:leveon
chris681016
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-10-01 22:40:50 IP:219.85.xxx.xxx 訂閱
李維大師書有提到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
資深會員


發表:29
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-10-02 11:18:24 IP:118.165.xxx.xxx 訂閱
沒有合適的事件
想要先行整理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
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-10-02 14:44:08 IP:211.75.xxx.xxx 訂閱
感謝大大解說,我還是下sql去取回來好了~~
leveon
資深會員


發表:29
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-10-03 13:46:29 IP:118.165.xxx.xxx 訂閱
如果你願意修改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
中階會員


發表:64
回覆:117
積分:96
註冊:2006-10-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-10-03 14:06:49 IP:211.75.xxx.xxx 訂閱
感謝大大指導^_____________________________^
系統時間:2017-10-20 2:23:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!