上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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而言能用滑鼠點的,一般就不想去用鍵盤輸入名字
而且不太能指望使用者記得一些有的沒的
所以一開始就應該先想好
那一類的檔案放在那裡,以何種形式命名
到程式複雜時就顯示出這些安排的重要性了 |
|
回頂端 |
|
|
|