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

利用VFP8作排名時所產生問題?

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
sthuang66



註冊時間: 2014-04-27
文章: 176


第 1 樓

發表發表於: 星期四 十一月 05, 2015 1:33 am    文章主題: 利用VFP8作排名時所產生問題? 引言回覆

之前有需求要使用VFP對DBF中某個欄位依照大小排名後再給一個新欄位有顯示名次!很感謝論壇各位高手指導!我學到VFP9的兩種語法都超級精簡也很好用
------------------------------------------------------------------------------
第一種
SELECT *,(SELECT COUNT(RATIO) FROM A1 WHERE RATIO> A.RATIO)+1 AS RANK FROM A1 A ORDER BY RANK INTO TABLE TEST
&&跳著加,例如1,2,2,4,5,5,7
第二種
SELECT *, (SELECT COUNT(*)+1 FROM A1 WHERE A.RA< RA) AS RANK FROM A1 A INTO TABLE TEST
----------------------------------------------------------------------------------------
只是我們機構只有提供VFP8所以以上語法!沒有支援!所以又很認真Google看前輩們的內容模仿寫了

ALTER TABLE B2 ADD RANK N(4) && B2是想排名檔案
SET SAFETY OFF
SELECT * FROM B2 ORDER BY Num DESC INTO CURSOR TMP READWRITE && Num根據它大小排名
SELECT TMP
GO TOP
NLASTACHIEVEMENT = 9999
NSEQUENCE = 0
NSAMETIMES = 0
NREPLNO = 0
DO WHILE NOT EOF()
NSEQUENCE = NSEQUENCE + 1
IF Num = NLASTACHIEVEMENT
NSAMETIMES = NSAMETIMES + 1
NREPLNO = NSEQUENCE - NSAMETIMES
ELSE
NSAMETIMES = 0
NREPLNO = NSEQUENCE
ENDIF
REPLACE RANK WITH NREPLNO
NLASTACHIEVEMENT = Num
SKIP
ENDDO
SELECT * FROM TMP INTO TABLE B3 && B3是排名後檔案
Quit
----------------------------------------------------------------------------
只是太多人來問我!覺得很煩!就改寫只要單純填入想排的檔案名和哪個欄位是想排序的標的! 如下

B=INPUTBOX('請輸入想要排名的檔案名,如 C,不需副檔名')
BB=''+B+'.DBF'
IF FILE(BB) =.F.
MESSAGEBOX("請正確輸入檔案名,",0+64,"提醒視窗")
QUIT
ENDIF
A=INPUTBOX('請輸入想要排名的欄位,如 NO')
OUTFILE=B+'_N'


ALTER TABLE &B ADD RANK N(4)
SET SAFETY OFF
SELECT * FROM &B ORDER BY &A DESC INTO CURSOR TMP READWRITE
SELECT TMP
GO TOP
NLASTACHIEVEMENT = 9999
NSEQUENCE = 0
NSAMETIMES = 0
NREPLNO = 0
DO WHILE NOT EOF()
NSEQUENCE = NSEQUENCE + 1
IF &A = NLASTACHIEVEMENT
NSAMETIMES = NSAMETIMES + 1
NREPLNO = NSEQUENCE - NSAMETIMES
ELSE
NSAMETIMES = 0
NREPLNO = NSEQUENCE
ENDIF
REPLACE RANK WITH NREPLNO
NLASTACHIEVEMENT = &A
SKIP
ENDDO
SELECT * FROM TMP INTO TABLE NEW
COPY TO (OUTFILE)
CLOSE DATABASE ALL
ALTER TABLE &B DROP RANK
ERASE NEW.DBF
Quit
--------------------------------------------------------------------------
我的問題是目前我寫的程序在輸入檔案名錯誤時會提示跳開!但是輸入想要排名的欄位錯誤時就會卡住在
SELECT * FROM &B ORDER BY &A DESC INTO CURSOR TMP

請教各位高手有什麼辦法當輸入錯的欄位名就直接跳messagebox
如果太複雜就算了!反正就告訴使用我程序排名的人務必Key對正確名字

謝謝各位高手指教!說真的我從一個很爛菜鳥!因為大家的指點也逐漸有點能力!
回頂端
檢視會員個人資料 發送私人訊息
bx1166



註冊時間: 2011-12-06
文章: 273


第 2 樓

發表發表於: 星期四 十一月 05, 2015 8:02 am    文章主題: 引言回覆

不能直接讓user選出可能的檔案嗎?
誰知道檔案名稱啊?
回頂端
檢視會員個人資料 發送私人訊息
lygcw9603



註冊時間: 2011-12-25
文章: 130


第 3 樓

發表發表於: 星期四 十一月 05, 2015 9:48 am    文章主題: 引言回覆

判断字段是否存在,如果不存在,弹出MESSAGEBOX()
IF TYPE(A)=U
MESSAGEBOX()
ENDIF
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 176


第 4 樓

發表發表於: 星期四 十一月 05, 2015 9:53 am    文章主題: 引言回覆

這是個工具程序!其實user都知道檔案名也知道想排名的欄位!!!所以我一開始用中間所寫的就夠了!
多寫檢查檔案名主要是怕打錯字!至於檢查欄位我功力太低就不行了
至於bx1166說寫讓user選檔案!當然是更好!只是好像更複雜了!我得再想想!若是方便給我提示一下!謝謝
回頂端
檢視會員個人資料 發送私人訊息
bx1166



註冊時間: 2011-12-06
文章: 273


第 5 樓

發表發表於: 星期四 十一月 05, 2015 10:09 am    文章主題: 引言回覆

指定目錄指定副檔名指定b*.dbf之類的
總之,只能選出你要user選的
把其他因素排除掉是程式設計師的必修課程
另外加一行沒有選擇時的退出路
就搞定了
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 176


第 6 樓

發表發表於: 星期四 十一月 05, 2015 10:47 am    文章主題: 引言回覆

謝謝lygcw9603指導
我把您寫的加入果然可以了!也學會用TYPE()函數
只是您寫的
IF TYPE(A)=U
MESSAGEBOX()
ENDIF
我一直試不出來
後來發現是少了引號!!!我加上
IF TYPE(A)='U' 就可以了
太感激了!昨晚Google好久都是關於MYSQL或MSSQL的內容!可能是我關鍵字問不對
原來VFP的 TYPE() 就可以了
回頂端
檢視會員個人資料 發送私人訊息
bx1166



註冊時間: 2011-12-06
文章: 273


第 7 樓

發表發表於: 星期四 十一月 05, 2015 10:51 am    文章主題: 引言回覆

以user而言能用滑鼠點的,一般就不想去用鍵盤輸入名字
而且不太能指望使用者記得一些有的沒的
所以一開始就應該先想好
那一類的檔案放在那裡,以何種形式命名
到程式複雜時就顯示出這些安排的重要性了
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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