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

使用RESTful 抓回 Json 資料於ClientDataSet,請問可以傳參數條件進ClientDataSet中篩選資料嗎?

答題得分者是:GrandRURU
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-06-08 21:57:03 IP:117.19.xxx.xxx 訂閱
不好意思,請教一個問題
使用RESTful 抓回 Json 資料於ClientDataSet,請問可以傳參數條件進ClientDataSet中篩選資料嗎?
試了一些方法都不成功(locate, lookup..)...
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-06-09 06:31:39 IP:211.79.xxx.xxx 訂閱
篩選 = Filiter
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-06-09 13:46:06 IP:220.133.xxx.xxx 訂閱
filter不支援中文,最後用setrange解決.
謝謝
===================引 用 GrandRURU 文 章===================
篩選 = Filiter
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-06-09 15:02:46 IP:59.120.xxx.xxx 訂閱
SetRange 也可以。

Filter 有支援 Unicode,但不知道你用的文字是什麼,無法測試。


===================引 用 bear28 文 章===================
filter不支援中文,最後用setrange解決.
謝謝
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-06-09 15:26:31 IP:220.133.xxx.xxx 訂閱
xe8下
Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //這句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //這句查有資料

google很久,皆說是中文支援有問題.
可否指教或簡單的例子.
謝謝

===================引 用 GrandRURU 文 章===================
SetRange 也可以。

Filter 有支援 Unicode,但不知道你用的文字是什麼,無法測試。


===================引 用 bear28 文 章===================
filter不支援中文,最後用setrange解決.
謝謝
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-06-09 20:02:56 IP:118.160.xxx.xxx 未訂閱
你用的是ClientDataSet嗎?
我也是用ClientDataSet 不會有這個問題!

試試這樣
Dm.cdsUBike.Filter:='sarea = '' 信義區 '' '; ''是兩個 ' 不是一個 "
===================引 用 bear28 文 章===================
xe8下
Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //這句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //這句查有資料

google很久,皆說是中文支援有問題.
可否指教或簡單的例子.
謝謝

===================引 用 GrandRURU 文 章===================
SetRange 也可以。

Filter 有支援 Unicode,但不知道你用的文字是什麼,無法測試。


===================引 用 bear28 文 章===================
filter不支援中文,最後用setrange解決.
謝謝
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-06-10 01:08:25 IP:101.15.xxx.xxx 訂閱
謝謝
但結果還是不行,查出來是空白的.
===================引 用 P.D. 文 章===================
你用的是ClientDataSet嗎?
我也是用ClientDataSet 不會有這個問題!

試試這樣
Dm.cdsUBike.Filter:='sarea = '' 信義區 '' '; ''是兩個 ' 不是一個 "
===================引 用 bear28 文 章===================
xe8下
Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //這句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //這句查有資料

google很久,皆說是中文支援有問題.
可否指教或簡單的例子.
謝謝

===================引 用 GrandRURU 文 章===================
SetRange 也可以。

Filter 有支援 Unicode,但不知道你用的文字是什麼,無法測試。


===================引 用 bear28 文 章===================
filter不支援中文,最後用setrange解決.
謝謝
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2015-06-10 01:48:36 IP:114.32.xxx.xxx 訂閱
HI bear28,
我也很好奇你說不行,於是研究了delphi的源碼,發現你說的 filtered有中文問題應該是在 d2009版以前才會發生。即當時若 type是 ftwidestring時 filter會有中文上的問題。
接著我又查了你說的 rest client 去接 json 變成 clientdataset 的源碼,發現,的確 clientdataset 的欄位型別是被設成 ftwidestring。不過…我又深入了看了相關的程式,發現 xe 8理當不會發生錯誤 (或精準講是d2009後都不會)。
最後,我忍不住開了 xe7 來試一下 (不用 xe7很久了…),試了你的 ubike 的程式 (我看你的命名與程式碼,可能確定你就是李維大哥過去講過的範例),發現… clientDataset1.Filter:='sarea = ' QuotedStr('文山區'); 是有資料的啊~~~
好奇的想知道你說不行是啥情形? android? windows vcl? 還是啥…可能的話把專案 po 上來。
花了我三小時追這個問題… T_T (我範例用文山區是為了容易看出結果並做成圖片佐證,當然,用信義區也是ok的)



===================引 用 bear28 文 章===================
xe8下
Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //這句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //這句查有資料
google很久,皆說是中文支援有問題.
可否指教或簡單的例子.
謝謝
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2015-06-10 01:53:06, 註解 無‧
aftcast 重新編輯於 2015-06-10 01:57:55, 註解 無‧
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2015-06-10 02:04:03 IP:101.15.xxx.xxx 訂閱
不好意思,浪費你許久時間,謝謝
是在android下取UBIKE資料回來秀在ListVi

Dm.RESTClient3.BaseURL:='';
Dm.RESTClient3.BaseURL:='http://its.taipei.gov.tw/atis_index/data/youbike/youbike.json';
Dm.RESTResponseDataSetAdapter3.Dataset:=Dm.cdsUBike;
Dm.RESTRequest3.Execute;

Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //此句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //此句查有資料
Dm.cdsUBike.Filtered:=True;

用SetRange信義區有資料,故現在用此法,但還是想知道Filter的解法

===================引 用 aftcast 文 章===================
HI bear28,

我也很好奇你說不行,於是研究了delphi的源碼,發現你說的 filtered有中文問題應該是在 d2009版以前才會發生,即當時若 type是 ftwidestring時。

接著我又查了你說的 rest client 去接 json 變成 clientdataset 的源碼,發現,的確 clientdataset 的欄位型別是被設成 ftwidestring,不過…我又深入了看了相關的程式,理當在 xe 8不會發生 (或精準講是d2009後都不會)。

最後,我忍不住開了 xe7 來試一下 (不用 xe7很久了…),試了你的 ubike 的程式 (我看你的命名與程式碼,可能確定你就是李維大哥過去講過的範例),發現… cdsUBike.Filter:='sarea = ' QuotedStr('文山區'); 是有資料的啊~~~

好奇的想知道你說不行是啥情形? android? windows vcl? 還是啥…可能的話把專案 po 上來。

花了我三小時追這個問題… T_T (我範例用文山區是為了容易看出結果並做成圖片佐證,當然,用信義區也是ok的)



===================引 用 bear28 文 章===================

xe8下

Dm.cdsUBike.Filtered:=False;

Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //這句查無資料

//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //這句查有資料



google很久,皆說是中文支援有問題.

可否指教或簡單的例子.

謝謝

GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2015-06-10 12:01:43 IP:59.120.xxx.xxx 訂閱
我想,如果沒辦法把問題完整還原,至少也把專案做個小 Sample,這樣才能讓要解答的人比較容易進入你的問題。

學習新的 RESTClient 花了一個上午的時間,FireMonkey就不做了,只針對 ClientDataSet1.Filter 做貼圖
XE7:


XE1:


以上
===================引 用 bear28 文 章===================
不好意思,浪費你許久時間,謝謝
是在android下取UBIKE資料回來秀在ListVi

Dm.RESTClient3.BaseURL:='';
Dm.RESTClient3.BaseURL:='http://its.taipei.gov.tw/atis_index/data/youbike/youbike.json';
Dm.RESTResponseDataSetAdapter3.Dataset:=Dm.cdsUBike;
Dm.RESTRequest3.Execute;

Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //此句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //此句查有資料
Dm.cdsUBike.Filtered:=True;

用SetRange信義區有資料,故現在用此法,但還是想知道Filter的解法
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2015-06-10 13:14:10 IP:114.32.xxx.xxx 訂閱
HELLO,
既然你說的是 android,我就照android的寫了一個測試。昨天是 vcl 在windows上沒問題。
搞了1小時,測了一下, 在 android 上也沒問題的啊~~~ 我儘量照你說講的情形處理了。比如 listview,還有我認為你應該也是 livebinding。
另外,要注意,一但你用 setrange後,是無法用 filter 再回原狀(原來的百來筆)。
以下是程式碼與圖:
procedure TForm12.Button1Click(Sender: TObject); // filter
begin
self.ClientDataSet1.Filter := 'sarea = ' QuotedStr('文山區');
self.ClientDataSet1.Filtered := True;
//ShowMessage(IntToStr(self.ClientDataSet1.RecordCount));
self.LinkFillControlToField1.Active := false;
self.LinkFillControlToField1.Active := true;
end;

procedure TForm12.Button2Click(Sender: TObject); // org cnt
begin

self.ClientDataSet1.Filter := '';
self.ClientDataSet1.Filtered := True;
ShowMessage(IntToStr(self.ClientDataSet1.RecordCount));
self.LinkFillControlToField1.Active := false;
self.LinkFillControlToField1.Active := true;
end;

procedure TForm12.Button3Click(Sender: TObject); // setfrange
begin
self.ClientDataSet1.SetRange(['文山區'],['文山區']);
self.LinkFillControlToField1.Active := false;
self.LinkFillControlToField1.Active := true;
end;



浪費時間也不能算是,就當練習。只是希望得到真象。這樣對大家都有幫助。 不過至此,依然不清楚你的問題是什麼。有必要的話要我上傳專案嗎?
期待問題的真象與解決方式。 :)

===================引 用 bear28 文 章===================
不好意思,浪費你許久時間,謝謝
是在android下取UBIKE資料回來秀在ListVi

Dm.RESTClient3.BaseURL:='';
Dm.RESTClient3.BaseURL:='http://its.taipei.gov.tw/atis_index/data/youbike/youbike.json';
Dm.RESTResponseDataSetAdapter3.Dataset:=Dm.cdsUBike;
Dm.RESTRequest3.Execute;

Dm.cdsUBike.Filtered:=False;
Dm.cdsUBike.Filter:='sarea = ' QuotedStr('信義區'); //此句查無資料
//Dm.cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist'); //此句查有資料
Dm.cdsUBike.Filtered:=True;

用SetRange信義區有資料,故現在用此法,但還是想知道Filter的解法

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2015-06-10 21:22:02 IP:101.11.xxx.xxx 訂閱
謝謝大家指教.

好像新開問題才可附加檔案,所以才新開一個問題,不是浪費版面,請見諒.

sample中,中文還是不行,英文可以,新手開發有很多不懂的地方,謝謝...
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2015-06-10 22:39:38 IP:211.79.xxx.xxx 訂閱
求助專案已協助移動

===================引 用 bear28 文 章===================
謝謝大家指教.



好像新開問題才可附加檔案,所以才新開一個問題,不是浪費版面,請見諒.



sample中,中文還是不行,英文可以,新手開發有很多不懂的地方,謝謝...
編輯記錄
GrandRURU 重新編輯於 2015-06-11 08:36:26, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#14 引用回覆 回覆 發表時間:2015-06-11 01:04:22 IP:61.228.xxx.xxx 訂閱
我就好人做到底。幫你測了你的專案。我發現關鍵點似乎是你自己加入了 clientdataset 的欄位造成。我用你的專案,一開始 listview 裡都是亂碼。然後如你說的中文也不能filter。於是我把你已增加的欄位通通殺了。事實上,它會在 rest client 取回資料後自動又生出來,而生出來的欄位型別與結果才是正確的。
另外,對於你的程式碼寫法,我覺得不好。不應該在button中 RESTRequest3.Execute; 接著下 cdsUBike.Filtered:=False; 等等等…
RESTRequest3.Execute; 會自動產生 dataset欄位與資料,並且 livebinding也會跟著動。
但這時候若在 click 中馬上又 filter 其實是沒做用的。
故,請參照我以下的寫法
procedure TForm1.Button2Click(Sender: TObject); // 先按這個button
begin
RESTClient3.BaseURL:='';
RESTClient3.BaseURL:='http://its.taipei.gov.tw/atis_index/data/youbike/youbike.json';
RESTResponseDataSetAdapter3.Dataset:=cdsUBike;
RESTRequest3.Execute;
end;

procedure TForm1.Button3Click(Sender: TObject); // 英文filter
begin
cdsUBike.Filtered:=False;
cdsUBike.Filter:='sareaen = ' QuotedStr('Xinyi Dist.');
cdsUBike.Filtered:=True;
self.LinkListControlToField1.Active := true; // 這行非常的重要 !!!
end;

procedure TForm1.Button4Click(Sender: TObject); // 還原所有資料
begin
cdsUBike.Filtered:=False;
cdsUBike.Filter:='';
cdsUBike.Filtered:=True;
self.LinkListControlToField1.Active := true; // 這行非常的重要 !!!
end;

procedure TForm1.Button5Click(Sender: TObject); // filter 中文
begin
cdsUBike.Filtered:=False;
cdsUBike.Filter:='sarea = ' QuotedStr('信義區');
cdsUBike.Filtered:=True;
self.LinkListControlToField1.Active := true; // 這行非常的重要 !!!
end;

以上四個 button 你可以自己加入試看看。當然最重要的是以下的這圖:



然後測了後一切都正常,中文,英文 filter 都沒問題的! 請務必看我寫的程式碼! 另外,為何自己加入了 欄位後會出事? 我也不是非常清楚,唯一我追了delphi源碼後知道,若你的dataset早有定義 欄位,那麼在 rest 回來後,它就不會再自動生成欄位的資訊。寫到這裡…我突然感覺…你似乎是自己手動一行一行加入dataset的欄位 (依 json的資料) ? 若是那就一定會死。正確的做法應該是在 RESTClient3 這個元件上按右鍵,然後有個叫 execute 的,選它。然後欄位就會被定義出來。接下來就可以做livebinding設計。若你最後要的是「動態」(即按button後再execute)的方式而非一開始就有資料,那就在livebinding設計完成後,在RESTClient3 這個元件上按右鍵,選clear即可! 完全不需要、也不能自己手動輸入 fields 的部份!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2015-06-11 01:17:46 IP:61.228.xxx.xxx 訂閱
有圖有證據,補上修正你專案後在我手機上run的情形。一切是正常的!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#16 引用回覆 回覆 發表時間:2015-06-11 11:11:04 IP:59.120.xxx.xxx 訂閱
補充以下內容



在這個專案中

Fields 和 FieldDefs 的欄位格式是不相同的

REST 回傳的文字格式是 UTF8,對應在 VCL / FireMonkey 是 TWideStringField 格式



實際產出的亂碼即是上述設定錯誤造成的結果。



更有趣的是,開啟該專案後

對 RESTRequest 右鍵下 Excute

我得到錯誤視窗,內容如下:

While trying to execute the request the following error occured: cdsUBike: Type mismatch for field 'iid', expecting: String actual: WideString



很明顯的,這是型別上的設定錯誤。



LiveBinding 我不懂,請再參閱蕭大俠的文章。



以上
編輯記錄
GrandRURU 重新編輯於 2015-06-11 11:12:58, 註解 無‧
bear28
一般會員


發表:44
回覆:53
積分:19
註冊:2002-09-10

發送簡訊給我
#17 引用回覆 回覆 發表時間:2015-06-11 15:16:03 IP:101.13.xxx.xxx 訂閱
謝謝,我再試試看...
再次謝謝
===================引 用 GrandRURU 文 章===================
補充以下內容



在這個專案中

Fields 和 FieldDefs 的欄位格式是不相同的

REST 回傳的文字格式是 UTF8,對應在 VCL / FireMonkey 是 TWideStringField 格式



實際產出的亂碼即是上述設定錯誤造成的結果。



更有趣的是,開啟該專案後

對 RESTRequest 右鍵下 Excute

我得到錯誤視窗,內容如下:

While trying to execute the request the following error occured: cdsUBike: Type mismatch for field 'iid', expecting: String actual: WideString



很明顯的,這是型別上的設定錯誤。



LiveBinding 我不懂,請再參閱蕭大俠的文章。



以上
系統時間:2017-10-20 7:49:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!