線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2605
推到 Plurk!
推到 Facebook!

暫存Table處理

尚未結案
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-18 14:15:03 IP:61.219.xxx.xxx 未訂閱
請前輩們指教 在TQuery1中,SQL==>Select * from TableA Q1:我可以將TQuery1中的資料再找出我所需要的資料 暫存在記憶體中(TableB) ? Q2:我可以將暫存在記憶體中TableB的所有資料Show在 DBGrid上嗎? Q3:如果Q1,Q2是可行的那麼和一般直接從資料庫的Table將資料取出有何不同? Thank You !
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-18 16:47:24 IP:61.220.xxx.xxx 未訂閱
參考一下:    你可以用filter的做法    例如 :      
     query1.close;
     query1.filter := // 你要過濾的條件
     query1.filtered := True;
     query1.open;    
  
這樣就可解決1,2的問題 而不用作暫存的動作 至於第3點 則是filter是把query元件select出來的資料 再select一次 有像SQL的子查詢 但是QUERY的筆數是要算query元件所select出來的資料 而不是filter的筆數(雖然你只能看到filter的資料 其他的看不到) 但SQL的子查詢就直接算所查詢出來的筆數 所以這兩種的比數會不一樣 天行健 君子當自強不息~~@.@ 發表人 - T.J.B 於 2003/04/18 17:06:46 發表人 - T.J.B 於 2003/04/18 17:09:42
------
天行健
君子當自強不息~~@.@
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-18 17:49:47 IP:211.76.xxx.xxx 未訂閱
請參考這篇. http://delphi.ktop.com.tw/topic.php?TOPIC_ID=25964 是不能從dataset中 select 一次資料的, 變通的做法如T.J.B兄的方式是利用 filter, 或是用 subquery (要看資料庫是否有支援)!!
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-18 20:18:43 IP:218.172.xxx.xxx 未訂閱
我的Table中有兩個欄位是和日期有關 A,B,date1,date2 我現在要做的是取date2的當月份最後一天--(20030415-->20030430) 然後再select 出 date1>date2的當月份最後一天的所有資料 所以我先用一個TQuery Select 出所有資料 然後再計算出date2的當月份最後一天 再做一次Selectdate1>date2的當月份最後一天的所有資料 如果使用兩位前輩的方法請問我要如何做? ps.date2的當月份最後一天我用自製函數可以算出
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-18 20:30:49 IP:61.217.xxx.xxx 未訂閱
如果你要取出當月份所有資料,不需要計算最後一天. Query1.SQL.Add('SELECT * FROM Table WHERE date1 like ' #39 '200304' '%' #39); //這樣就可以取出所有2003年4月份的資料了.. TRY TRY SEE
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-18 21:32:23 IP:61.221.xxx.xxx 未訂閱
請先說明你的資料庫種類. 以下假設是支援 subquery 的作法. select * from tablea where date1 > (select max(date2) from tablea where date2 between '2003/04/01' and '2003/05/01') and date1 >= '2003/4/1' 其中 subquery 是找 4 月份 date2 出現的最後一天. 外面的主 query 是 date1 是 4月份且大於 subquery 出來的 date2 條件可以依你實際的狀況再作修改...
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-19 09:34:29 IP:218.172.xxx.xxx 未訂閱
我可能表達不清楚造成chih,timhuang 兩位誤會    不是當月份所有資料也不是找 4 月份 date2 出現的最後一天. 我是要經由date2的日期找出date2的該月份的最後一天 ex. date2,我求算出來的日期 ====================== 20030601,20030630 20030525,20030531 20030224,20030228 就是這樣 但是我的重點不是以上 我想問的重點是我已經可以求出date2當月的份的最後一天的日期 接下來我要如何做可以一個TQuery就可以得到我想要的資料 date1>date2當月的份的最後一天的日期 再次請教各位 Thank You
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-19 10:48:24 IP:61.221.xxx.xxx 未訂閱
你的問題很明顯的是要由 date2 再找 date2 當月的最後一天. 然後再下 query 找出 date1 > date2 當月的最後一天 的資料, 那含不含最後一天呢? 如: 20030525,20030531 date2 = 2003/5/25 , date2 的當月最後一天是 2003/5/31. 你要找的資料是 date1 > 2003/5/31 沒錯吧.    若是會含最後一天的話, 2003/5/31 這個日期就會出現在 query 之中, select ... from tablea where date1 >= '2003/5/31'    若是不含最後一天的話, 其實就是 下個月起的所有資料沒錯吧~ 所以 query就會是: select ... from tablea where date1 >= '2003/6/1' (可以用 2003/5/31 1天來得到) 那另外, 由於 date2 也是 tablea 中的其中一欄, 所以上面的 query 的條件得都要修改一下, 將 date2 帶入 query 中, 要注意的地方是找 date2 該月的最後一天不好找, 但是找 date2 下個月的第一天是比較容易的, 所以找法可以利用找下個月的第一天再減一天就可以得到 date2 該月份的最後一天了. 由於資料庫種類你一直沒提, 以下的 query 假設是 mssql 的語法: 若 date2 是 2003/5/25, 則 convert(datetime, left(convert(varchar, dateadd(m,1, date2 ), 111),7) '/01') 會轉為 2003/6/1 所以若含最後一天的語法為: select ... from tablea where date1 >= (convert(datetime, left(convert(varchar, dateadd(m,1,date2), 111),7) '/01') - 1) 若不含最後一天的語法為: select ... from tablea where date1 >= convert(datetime, left(convert(varchar, dateadd(m,1,date2), 111),7) '/01')
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-19 11:17:52 IP:61.217.xxx.xxx 未訂閱
請問一下你可以將計算date2的公式寫出來嗎??你應該是丟date1進去在算出date2吧??
引言: 我可能表達不清楚造成chih,timhuang 兩位誤會 不是當月份所有資料也不是找 4 月份 date2 出現的最後一天. 我是要經由date2的日期找出date2的該月份的最後一天 ex. date2,我求算出來的日期 ====================== 20030601,20030630 20030525,20030531 20030224,20030228 就是這樣 但是我的重點不是以上 我想問的重點是我已經可以求出date2當月的份的最後一天的日期 接下來我要如何做可以一個TQuery就可以得到我想要的資料 date1>date2當月的份的最後一天的日期 再次請教各位 Thank You
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-20 13:32:58 IP:163.28.xxx.xxx 未訂閱
*** 我的資料庫是DB2 *** date2不是經由date1計算出來的 我說明一下我在提出問題之前所想到要處理的想法 1. TQuery1:Select * from TableA 2. 然後再取出所有TableA的所有欄位的值 3. 使用自製函數求出date2的該月份的最後一天(假設是Date3) 4. TableA Date3存到一個暫存的TableB 5. 在以一個TQuery2:Select * From TableB where Date1>Date3 6. 將資料秀在DBGrid上 就這樣,請各位前輩再指教. PS. 很抱歉一時無法提供計算date2的公式 (我是使用自製函數計算出的) 明天我再將計算date2當月最後一天的函數寫出來.
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-21 08:54:58 IP:211.74.xxx.xxx 未訂閱
如果Date2是這樣有二個資料的話,那你應該用date2的筆數做迴圈去SELECT資料. for i = 1 to x do //x是Date2共有幾筆 begin Query1.Close; Query1.SQL.Clear; Query1.SQL.ADD(' Select * From TableB where Date1 between ' #39 Date2(1) #39 ' AND ' #39 Date2(2) #39);//Date2(1)->'20030601',Date2(2)->'20030630' Query1.open; Query1.First while not Query1.eof do begin //這裡把Select出來的資料丟進TempTable end; end; TRY TRY SEE
引言: ex. date2,我求算出來的日期 ====================== 20030601,20030630 20030525,20030531 20030224,20030228
發表人 - chih 於 2003/04/21 09:03:10
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-21 09:47:47 IP:211.76.xxx.xxx 未訂閱
[/quote] 1. TQuery1:Select * from TableA 2. 然後再取出所有TableA的所有欄位的值 3. 使用自製函數求出date2的該月份的最後一天(假設是Date3) 4. TableA Date3存到一個暫存的TableB 5. 在以一個TQuery2:Select * From TableB where Date1>Date3 6. 將資料秀在DBGrid上 [/quote] 若是這樣的話, 其實不用自製函數, 在 sql 中就可以解決了, 何必將資料全部帶出再到 client 端處理呢? 這樣不僅效能差, 而且資料量多的時候問題會更多, 弟的前一篇提到的方法應該就可以處理你的問題了, 只是其中 convert 函數對應於 db2 的語法可能要麻煩你自己再查一下, 該函數是作資料型態的轉換, db2 應該會有對應的功能. 而且其中的由 date2 找出該月的最後一天也是由 db 直接完成, 所以也不會用到 temp table 的, 這樣的效能才是比較理想, 也是較佳的處理方式!
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-21 17:53:53 IP:61.219.xxx.xxx 未訂閱
以下是我計算月底日期的函數    function DaysOfMonth(sNMdate : String) : String; var    sYear, sMonth, sDay : String;    sMonth1,sYear1:Integer; begin   sYear:=copy(sNMdate,1,4);   sMonth:=copy(sNMdate,5,2);   sDay:=copy(sNMdate,7,2);   sMonth1:=strtoint(sMonth);   sYear1:=strtoint(sYear);   Case sMonth1 of   1,3,5,7,8,10,12 :     result := sYear+sMonth+'31';   4,6,9,11 :     result := sYear+sMonth+'30';   2 :     if ((sYear1 mod 4 = 0) and ((sYear1 mod 100<>0) or (sYear1 mod 400 = 0))) then       Result:=sYear+sMonth+'29'     else       Result:=sYear+sMonth+'28';   else     Result:='';   end; end; showmessage(daysofMonth('20040201')); ==> 20040228 請先不要考慮執行效率的問題,即使問題沒有完美的解決,但還是有其學習的價值 我個人認為暫存Table的使用還是蠻重要的,可否講解一下 如何將TQuery1 Select出來的結果存在暫存Table(TableB) 又如何利用TQuery2 將TablB Select 出來 請各位再指教 Thank You!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-21 22:11:05 IP:61.221.xxx.xxx 未訂閱
引言: 以下是我計算月底日期的函數 function DaysOfMonth(sNMdate : String) : String; ... 請先不要考慮執行效率的問題,即使問題沒有完美的解決,但還是有其學習的價值 我個人認為暫存Table的使用還是蠻重要的,可否講解一下 如何將TQuery1 Select出來的結果存在暫存Table(TableB) 又如何利用TQuery2 將TablB Select 出來
基本上, 要 select 到 temp table 是不能利用 client 的 function 的, 所以你寫的 function 對於 select 進 temp table 是沒有意義的, 再者和你說明, 除了使用 filter 以外的方式外, 不能對 dataset 這種元件再下 sql command 來找出資料. 若是你想要學習 temp table 的用法其實不難, 我將我前面回答的問題再修改一下就可以達到你要的 temp table 解法: select *, convert(datetime, left(convert(varchar, dateadd(m,1,date2), 111),7) '/01') - 1 as date3 into #tmp from tablea --其中 #tmp 就是 temp table select * from #tmp where date1 > date3 drop #tmp 這樣就可以了
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-23 11:34:55 IP:61.219.xxx.xxx 未訂閱
謝謝各位前輩指教 在Delphi上有問題還請各位幫忙.
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-04-23 11:35:08 IP:61.219.xxx.xxx 未訂閱
謝謝各位前輩指教 在Delphi上有問題還請各位幫忙.
系統時間:2024-07-01 18:50:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!