VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

不需要MSCOMCTL.OCX的自制Select-SQL進度條
前往頁面 上一頁  1, 2, 3
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 31 樓

發表發表於: 星期一 九月 09, 2013 9:53 am    文章主題: 引言回覆

依此例,改成LEFT JOIN 是可行的
但,萬一(我是說萬一),某些場合,務必得下 INNER JOIN 不可時,要如何是好?
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
jerryclt



註冊時間: 2009-03-10
文章: 334
來自: 佛心來的

第 32 樓

發表發表於: 星期四 九月 12, 2013 8:22 am    文章主題: 引言回覆

ckp6250 寫到:
依此例,改成LEFT JOIN 是可行的
但,萬一(我是說萬一),某些場合,務必得下 INNER JOIN 不可時,要如何是好?


老實說,
小弟還從沒用過 inner join 子句,
都是用 left 或 right join 的方式,
如果怕有 .NULL. 產生,
可以加入一個判斷式...
Select Acc4.invent, Acc13.Date, Acc13.mount;
FROM Acc4 LEFT Join Acc13 ;
ON Acc4.invent = Acc13.invent;
ORDER By Acc4.invent, Acc13.Date ;
WHERE (Mod(Recno(),Ceiling(Reccount()/100))=0 Or Recno()=Reccount()) And progress_bar(Recno()*100/Reccount()) ;
OR (!Deleted() And Between(Acc13.Date,'01/01','12/31') AND !ISNULL(Acc4.invent));
Into Cursor _tmpf
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 33 樓

發表發表於: 星期四 九月 12, 2013 10:18 am    文章主題: 引言回覆

inner join , left join , right join
各有其用途,
效率應該會有差別

我經常一道指令,七八個 join 搞在一起,也常三種 join 一起用
您的方法當然也沒問題,只是 where 要多下些 ! isnull()

我的概念是,下 where 時要很謹慎,一要精準,二要精簡,這關係到效率,多一項判斷,就多項負擔
不知道這樣的概念對不對?
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
jerryclt



註冊時間: 2009-03-10
文章: 334
來自: 佛心來的

第 34 樓

發表發表於: 星期四 九月 12, 2013 11:12 am    文章主題: 引言回覆

除非有哪位前輩可以提供知識,
更精簡 (Mod(Recno(),Ceiling(Reccount()/100))=0 Or Recno()=Reccount()) And progress_bar(Recno()*100/Reccount()) 來達到 inner join 的需求,
否則小弟直覺是在SELECT後加一行 progress_bar(100)
就可以不管是用 inner / left / right / full 的哪一種,
都可以顯示未滿100%的部份,
順便可以關閉 progress_bar!
把它想像成 WAIT WINDOW / CLEAR WINDOW 一般!
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 35 樓

發表發表於: 星期四 九月 12, 2013 11:57 am    文章主題: 引言回覆

jerryclt 寫到:

把它想像成 WAIT WINDOW / CLEAR WINDOW 一般!



這個有點強詞奪理Razz

wait window
-----
一些程式碼
-----
clear window

各人造業各人擔,今天要下 clear window ,是因為我們在程式碼之前下了 wait window

而 progress_bar() 是被 select 給『夾』進去的
自己『夾』進去的,當然要自己『夾』出來
自己的屁股自己擦
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
jerryclt



註冊時間: 2009-03-10
文章: 334
來自: 佛心來的

第 36 樓

發表發表於: 星期四 九月 12, 2013 1:24 pm    文章主題: 引言回覆

SELECT 0
USE Acc13 ALIAS Acc13
GO TOP
SELECT 0
USE Acc4 ALIAS Acc4
GO TOP
pub_num=INT(SECONDS())
Select Acc4.invent,Acc13.Date,Acc13.mount FROM Acc4 inner Join Acc13 ON Acc4.invent=Acc13.invent;
WHERE ((MOD(RECNO(),CEILING(RECCOUNT()/100))=0 OR RECNO()=RECCOUNT()) AND progress_bar(IIF(RECCOUNT()=0,100,RECNO()*100/RECCOUNT())) AND .F.) OR;
(!DELETED() AND BETWEEN(Acc13.Date,'01/01','12/31'));
ORDER By Acc4.invent,Acc13.Date Into Cursor _tmpf
*progress_bar(100)
pub_num2=_TALLY
=MESSAGEBOX('筆數=['+TRANSFORM(pub_num2)+'], ['+stoc(INT(SECONDS())-pub_num)+'] 秒',64,'操作訊息')
SELECT _tmpf
USE IN _tmpf

Select Acc13
GO TOP
Select Acc4
GO TOP
pub_num=INT(SECONDS())
Select Acc4.invent,Acc13.Date,Acc13.mount FROM Acc4 left Join Acc13 ON Acc4.invent=Acc13.invent;
WHERE ((MOD(RECNO(),CEILING(RECCOUNT()/100))=0 OR RECNO()=RECCOUNT()) AND progress_bar(IIF(RECCOUNT()=0,100,RECNO()*100/RECCOUNT())) AND .F.) OR;
(!DELETED() AND BETWEEN(Acc13.Date,'01/01','12/31') AND !ISNULL(Acc4.invent));
ORDER By Acc4.invent,Acc13.Date Into Cursor _tmpf
*progress_bar(100)
pub_num2=_TALLY
=MESSAGEBOX('筆數=['+TRANSFORM(pub_num2)+'], ['+stoc(INT(SECONDS())-pub_num)+'] 秒',64,'操作訊息')
SELECT _tmpf
USE IN _tmpf

你自己比較看看執行速度,
因為我的電腦硬體算很強,
不管怎麼測都是<=1秒,
比較不出一個所以然來...

上例 inner join 會跑兩段 progress bar,
且第二次會停在 94% 的地方;
而 left join + !ISNULL() 的方式,
完美跑完100%且自己會擦乾淨自己的屁股.
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 上一頁  1, 2, 3
3頁(共3頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作