 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
impotence

註冊時間: 2005-02-21 文章: 135 來自: Hong Kong
第 1 樓
|
發表於: 星期三 五月 30, 2007 2:40 pm 文章主題: 我對以下這個程序有點問題 |
|
|
我對以下這個程序有點問題 , 希望有人能幫我解釋 !
有一個 table -- test 如下
SID Nscore
1001 50
1002 60
1003 70
1004 40
1005 80
1006 50
1007 90
1008 50
1009 90
1010 80
運行以下的 test.prg
lnSeq = 0
lnScore = -1
lnNext = 0
lmTmp = -1
SELECT sid, nscore FROM test INTO CURSOR tmp1 ORDER BY nscore DESC
SELECT sid, nscore, GetSeq(@lnSeq, nScore) as nTopNum FROM tmp1 INTO TABLE tmp2
Use in tmp1
SELECT tmp2
BROWSE
FUNCTION GetSeq(tnNumber, tnscore)
IF tnscore # lnScore
lnScore=tnscore
tnNumber=tnNumber+1+lnNext
lnNext=0
RETURN tnNumber
ELSE
lnNext=lnNext+1+lnTmp
lnTmp=0
RETURN tnNumber
ENDIF
ENDFUNC
出來的結果是 :
Sid Nscore Ntopnum
1007 90 1
1009 90 1
1005 80 3
1010 80 3
1003 70 5
1002 60 6
1001 50 7
1006 50 7
1008 50 7
1004 40 10
我試過把 test.prg 更改後 , 如下 :
lnSeq=0
lnScore=-1
lnNext=0
lnTmp=-1
SELECT sid, nscore FROM test INTO CURSOR tmp1 ORDER BY nscore DESC
SELECT sid, nscore, lnseq as seq1 , lnnext as Next1, lntmp as Tmp1, GetSeq(lnSeq, nScore) as nTopNum, lnseq as seq2, lnnext as next2, ;
lntmp as tmp2 FROM tmp1 INTO TABLE test2
USE IN tmp1
SELECT test2
BROWSE
FUNCTION GetSeq(tnNumber, tnscore)
IF tnscore # lnScore
lnScore=tnscore
tnNumber=tnNumber+1+lnNext
lnNext=0
lnSeq=tnNumber
RETURN tnNumber
ELSE
lnNext=lnNext+1+lnTmp
lnTmp=0
RETURN tnNumber
ENDIF
ENDFUNC
sid nscore Seq1 Next1 Tmp1 Ntopnum Seq2 Next2 Tmp2
1007 90 1 0 -1 1 1 0 0
1009 90 1 0 0 1 1 1 0
1005 80 1 1 0 3 3 0 0
1010 80 3 0 0 3 3 1 0
1003 70 3 1 0 5 5 0 0
1002 60 5 0 0 6 6 0 0
1001 50 6 0 0 7 7 0 0
1006 50 7 0 0 7 7 1 0
1008 50 7 1 0 7 7 2 0
1004 40 7 2 0 10 10 0 0
我的問題如下 :
(一) GetSeq(@lnSeq, nScore) 的 @lnSeq 的 @ 是什麼用途 ?
(二) 為什麼 lnTmp 在 GetSeq(@lnSeq, nScore) 之前是 -1 , 但之後就變為 0 ?
謝謝 ! _________________ 一個常常忘記 Command 的人 ! |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 2 樓
|
發表於: 星期三 五月 30, 2007 3:34 pm 文章主題: |
|
|
(一) @ 表示 用"傳址" 的方式來傳遞參數, 表示@變數的內容會隨著在函數裡的運算而被變更.
(二) 你可以在FUNCTION GetSeq裡找到一行
lnTmp=0 _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
impotence

註冊時間: 2005-02-21 文章: 135 來自: Hong Kong
第 3 樓
|
發表於: 星期三 五月 30, 2007 3:42 pm 文章主題: |
|
|
謝謝你 garfield ,
第一個答案我明白了 ,
但 ... 第二個 , 在第一次運行 (1007,90 .. 那時候 lnTmp = -1) GetSeq 之後 -- tnscore # lnScore . 並沒有 lnTmp =0 的動作 , 要在第二次 (1009,90) GetSeq 之後 經 ELSE 才應該變為 0 ..... _________________ 一個常常忘記 Command 的人 ! |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 4 樓
|
發表於: 星期三 五月 30, 2007 5:00 pm 文章主題: |
|
|
對啊
要lnTmp=0的條件是 not ( tnscore # lnScore ) _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
impotence

註冊時間: 2005-02-21 文章: 135 來自: Hong Kong
第 5 樓
|
發表於: 星期三 五月 30, 2007 5:13 pm 文章主題: |
|
|
是啊 ~~~ 但你可從我修改之後 , 得到的答案中比較 , lnTmp 在運行 nscore=90, sid=1007 之前是 -1 (我的表中第一行的 tmp1), 但在運行 GetSeq (nscore=90,sid=1007, 並沒有啟動 ELSE ) 之後 , lnTmp = 0 (我的表中第一行的 tmp2) ..... _________________ 一個常常忘記 Command 的人 ! |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|