使用RESTful 抓回 Json 資料於ClientDataSet,請問可以傳參數條件進ClientDataSet中篩選資料嗎? |
答題得分者是:GrandRURU
|
bear28
一般會員 發表:44 回覆:53 積分:19 註冊:2002-09-10 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
bear28
一般會員 發表:44 回覆:53 積分:19 註冊:2002-09-10 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
bear28
一般會員 發表:44 回覆:53 積分:19 註冊:2002-09-10 發送簡訊給我 |
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.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
你用的是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 發送簡訊給我 |
謝謝
但結果還是不行,查出來是空白的. ===================引 用 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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
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 |
bear28
一般會員 發表:44 回覆:53 積分:19 註冊:2002-09-10 發送簡訊給我 |
不好意思,浪費你許久時間,謝謝
是在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
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
我想,如果沒辦法把問題完整還原,至少也把專案做個小 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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
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 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我就好人做到底。幫你測了你的專案。我發現關鍵點似乎是你自己加入了 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 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
補充以下內容
在這個專案中 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 發送簡訊給我 |
謝謝,我再試試看...
再次謝謝 ===================引 用 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 我不懂,請再參閱蕭大俠的文章。 以上 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |