MasteringVFP/2/4/3

出自VFP Wiki

(修訂版本間差異)
跳轉到: 導航, 搜尋
(revert)
 
第1行: 第1行:
這是一個 !FoxPro 系列獨有的指令,早期的 xBase 系列並沒有此指令.
這是一個 !FoxPro 系列獨有的指令,早期的 xBase 系列並沒有此指令.
-
這一組指令最大的好處是不用使用 ((MasteringVFP/2/4/2|Do while ... enddo)) 配合 eof() 與 skip.
+
這一組指令最大的好處是不用使用 [[MasteringVFP/2/4/2|Do while ... enddo]] 配合 eof() 與 skip.
用處就是可以直接 scan 工作區中每一筆記錄,例如:
用處就是可以直接 scan 工作區中每一筆記錄,例如:
 +
<pre>
go top
go top
scan
scan
-
:if my_field1=="aaa" then
+
  if my_field1=="aaa" then
-
::? "I am aaa"
+
    ? "I am aaa"
-
:endif
+
  endif
endscan
endscan
 +
</pre>
這段 code 就會從工作區的最開頭一筆記錄開始,判斷是不是需要的資料,然後再往下一筆...一直到檔案結尾.
這段 code 就會從工作區的最開頭一筆記錄開始,判斷是不是需要的資料,然後再往下一筆...一直到檔案結尾.
如果改用 do...while 來寫,就得改成這樣
如果改用 do...while 來寫,就得改成這樣
 +
<pre>
go top
go top
do while not eof()
do while not eof()
-
:if my_field=="aaa" then
+
  if my_field=="aaa" then
-
::? "I am aaa"
+
    ? "I am aaa"
-
:endif
+
  endif
-
:skip
+
  skip
enddo
enddo
 +
</pre>
 +
這樣看起來是不是冗長許多,而且常常會有人忘記加上 skip 這行(我也是),而形成無窮回圈.
這樣看起來是不是冗長許多,而且常常會有人忘記加上 skip 這行(我也是),而形成無窮回圈.
第72行: 第77行:
下面的範例中,使用 SCAN ... ENDSCAN 循環來顯示瑞典所有的公司。
下面的範例中,使用 SCAN ... ENDSCAN 循環來顯示瑞典所有的公司。
 +
<pre>
CLOSE DATABASES
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata')
OPEN DATABASE (HOME(2) + 'Data\testdata')
第80行: 第86行:
 ? contact, company, city
 ? contact, company, city
ENDSCAN
ENDSCAN
-
[http://www.hg-fix.com/ 数据恢复]
+
</pre>
-
[http://www.hg-fix.com/ 硬盘数据恢复]
+
-
[http://www.hg-fix.com/ 磁带数据恢复]
+
-
[http://www.hg-fix.com/ raid数据恢复]
+
-
[http://www.hg-fix.com/ 磁盘阵列数据恢复]
+
-
[http://www.hg-fix.com/diskrecover.htm 数据恢复]
+
-
[http://www.hg-fix.com/taperecover.htm 数据恢复]
+
-
[http://www.hg-fix.com/raidrecover.htm 数据恢复]
+
-
[http://www.hg-fix.com/ 数据修复]
+
-
[http://www.hg-fix.com/ 硬盘数据修复]
+
-
[http://www.hg-fix.com/ 磁带数据修复]
+
-
[http://www.hg-fix.com/ raid数据修复]
+
-
[http://www.hg-fix.com/diskrecover.htm 数据修复]
+
-
[http://www.hg-fix.com/raidrecover.htm 数据修复]
+
-
[http://www.hg-fix.com/taperecover.htm 数据修复]
+
-
[http://www.hg-fix.com/ 磁盘阵列数据修复]
+

在2005年4月18日 (一) 01:42的最新修訂版本

這是一個 !FoxPro 系列獨有的指令,早期的 xBase 系列並沒有此指令. 這一組指令最大的好處是不用使用 Do while ... enddo 配合 eof() 與 skip.

用處就是可以直接 scan 工作區中每一筆記錄,例如:

go top
scan
  if my_field1=="aaa" then
    ? "I am aaa"
  endif
endscan

這段 code 就會從工作區的最開頭一筆記錄開始,判斷是不是需要的資料,然後再往下一筆...一直到檔案結尾.

如果改用 do...while 來寫,就得改成這樣

go top
do while not eof()
  if my_field=="aaa" then
    ? "I am aaa"
  endif
  skip
enddo

這樣看起來是不是冗長許多,而且常常會有人忘記加上 skip 這行(我也是),而形成無窮回圈.

scan 也可以加上 for 或 while 子句. 加上 for 子句,會只針對符合 for 子句條件的紀錄來進行 scan. 而 while 子句則是 scan 到符合 while 子句的條件時,就停下來.

這個指令是比 do...while 有效率的, !FoxPro 有針對此指令進行 Rushmore 加速. 所以盡量使用這個來替代 do...while.


目錄

SCAN ... ENDSCAN 命令

用途

在目前選定資料表格中逐個移動記錄指標並在遇到符合指定條件時執行一個命令區塊。

語法

SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
[Commands]
[LOOP]
[EXIT]
ENDSCAN

參數

NOOPTIMIZE

  • 關閉對 SCAN 命令的火速(Rushmore)查詢最佳化。
  • 有關更多的資訊,請參閱 SET OPTIMIZE 和英文版的「使用火速查詢最佳化來加快資料存取的速度(Using Rushmore Query Optimization to Speed Data Access)」。

Scope

  • 指定掃瞄記錄的範圍。只有範圍之內的記錄才可能掃瞄到。範圍子句有 ALL(此為預設值)、NEXT nRecords、RECORD nRecordNumber 和 REST。有關範圍子句更多的資訊,請參閱英文版的「範圍子句(Scope Clauses)」主題。例如:
USE COMPANY
 GOTO 5    && 先將記錄指標移到第 5 筆
 SCAN NEXT 3 && 由於已先下達 GOTO 5 命令,Visual !FoxPro 會
 ? NAME    && 從第 5 筆資料開始向下掃瞄 3 筆而至第 7 筆。
ENDSCAN    && 因此只會顯示第 5 筆到第 7 筆資料的 NAME。

FOR lExpression1

  • 只有使運算式 lExpression1 計算為「真」(.T.)的記錄,才對其執行命令。包含 FOR 子句可以篩選出不想掃瞄的記錄。
  • 當運算式 lExpression1 是最佳化運算式時,Rushmore 將最佳化 SCAN ... FOR 命令建立的查詢。為使系統獲得最佳效能,應在 FOR 子句中使用最佳化的運算式。
  • 有關更多的資訊,請參閱 SET OPTIMIZE 和英文版的「使用火速查詢最佳化來加快資料存取的速度(Using Rushmore Query Optimization to Speed Data Access)」。

WHILE lExpression2

  • 指定一個邏輯運算式 lExpression2 作為執行命令的條件。只要邏輯運算式計算為「真」,就對記錄執行命令,直至遇到使運算式不為「真」(.T.) 的記錄為止。

Commands

  • 指定要執行的 Visual !FoxPro 命令。

LOOP

  • 把控制權直接移回到 SCAN 命令。LOOP 可以放在 SCAN 與 ENDSCAN 之間的任何地方。

EXIT

  • 把程式的控制權從 SCAN ... ENDSCAN 循環語句中交給 ENDSCAN 下面的第一個命令。EXIT 可以放在 SCAN 與 ENDSCAN 之間的任何地方。

ENDSCAN

  • 指示 SCAN 程序的結束。

附註

  • SCAN 命令自動將記錄指標移到下一條滿足指定條件的記錄,並執行相應的命令區塊。
  • 您可以在 ENDSCAN 同一行的後面加一些註釋。註釋在程序編譯和執行時不起作用。
  • SCAN ... ENDSCAN 確定遇到 ENDSCAN 時,Visual !FoxPro 重新選擇 SCAN ... ENDSCAN 循環開始時選定的資料表格。
  • 基本上,SCAN ... ENDSCAN 命令敘述仍然是一個迴圈,但它主要用於資料表格的處理工作,就如同 FOR ... ENDFOR 命令敘述主要用於數值的處理工作一樣。
  • SCAN 命令能於資料表格中做掃瞄的工作,並依設定的條件來執行某些命令敘述。同樣在處理資料表格的工作,SCAN ... ENDSCAN 可能會較 DO WHILE ... ENDDO 來得簡單,也會使您的程式變得更簡潔。而且 SCAN ... ENDSCAN 會自動將記錄指標移往下一筆資料並測試是否符合目前的條件。當然,您必須要先開啟資料表格,才能使用 SCAN ... ENDSCAN。

範例

下面的範例中,使用 SCAN ... ENDSCAN 循環來顯示瑞典所有的公司。

CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata')
USE customer  && 開啟 Customer 資料表格
CLEAR

SCAN FOR UPPER(country) = 'SWEDEN'
 ? contact, company, city
ENDSCAN