1. <small id="kntrr"><delect id="kntrr"></delect></small>
    2. <sub id="kntrr"></sub>
        1. <form id="kntrr"><listing id="kntrr"></listing></form>
            江蘇省高校計算機等級考試命題研究院 江蘇省高校計算機等級考試輔導
            江蘇省二級VFP常用編程命令及常用函數
            VFP常用編程命令及常用函數
            常用編程命令及常用函數
            注:在語法中如用方括號“[  ]”括起來的詞句,表示可以不用。
            常用命令

            假設(if...endif)
            循環(do while...enddo)
            分支(do case...endcase)
            賦值(store...to)
            調用表單(do form)
            啟動事件處理(read events)
            清除事件處理(clear events)
            開關命令執行狀態(set talk on/off)
            結束程序(cancel)
             

             常用函數

            取年份(year())
            取月份(month())
            取天日(day())
            取整(int())
            四舍五入(round())
            刪除標記(delete())
            記錄號(recno())
            記錄數(reccount())
            找到記錄(found())
            表結尾(eof())
            表開頭(bof())
             
             

            假設語句
            根據一邏輯表達式的值,有條件的執行一組命令。
            語法
            IF 邏輯表達式 [THEN]
                程序組1
            [ELSE
                程序組2]
            ENDIF
            參數
            邏輯表達式代表一邏輯值,如果這邏輯值為真,系統執行程序組1,否則不執行程序組1,如果有else及程序組2的話,則執行程序組2,如沒有則什么也不執行,直接執行endif后面的語句。
            備注
            在if...endif之間還可以有if...endif,即該命令是可以嵌套的。
            then可以有也可以沒有,對程序沒有影響。
            else及程序組2可以有也可以沒有,但如果有的話,在邏輯表達式的值為假時,程序組2將被執行。
            if 與 endif 必須配對使用,即有一個 if 必須有一個 endif, 否則程序會出錯。
            舉例
            例1:假如分數字段的值大于等于90,則讓等級字段的值為“優”,并顯示該記錄。程序如下:
            if 分數>=90
              replace 等級 with '優'
              display
            endif
             例2:在數據庫中可以把性別字段設為邏輯型,“真”代表“男”,“假”代表“女”,但顯示時不能顯示真、假,否則別人看不懂,而應顯示男、女,因此我們設一變量xb,根據性別字段的具體值,將xb的值設為男或女,然后在需要的時候顯示xb的值即可。程序如下:
            if  性別
              xb='男'
            else
              xb='女'
            endif
            其中第一句:if  性別,表示“假如性別為真”的意思,不要寫成“if  性別=.t.”。
            以上程序也可以寫成如下形式,效果相同:
            if  .not. 性別
              xb='女'
            else
              xb='男'
            endif
            即,假如性別不為真的話,xb的值就為女,否則為男。
            循環語句(do while...enddo)
            根據條件重復執行一組程序。
            語法
            DO WHILE lExpression
                Commands
                [LOOP]
                [EXIT]
            ENDDO
            參數
            lExpression 為一邏輯表達式,其值如果是“真”,即執行commands程序組,如果表達的值為“假”,則跳過該段程序組,執行enddo后面的語句。
            Commands 當表達式 lExpression 值為真時所要執行的程序組。
            LOOP 此為 do while...enddo 命令的一個子句,它可以放在 commands 程序組中間的任何地方,當程序一旦執行到該子句時,則返回 do while 重新執行。此子句根據需要可以有,也可以沒有。
            EXIT 與loop一樣是 do while...enddo 命令的一個子句,它可以放在 commands 程序組中間的任何地方,當程序一旦執行到該子句時,則跳出循環,執行enddo后面的語句。此子句根據需要可以有,也可以沒有。
            備注
            程序一旦執行到do while 語句,如果 lExpression 的值為真,則執行 commands 程序組,該程序組執行完后,就到enddo語句,enddo會將程序返回 do while 再次驗證 lExpression 是否為真,如仍是,則又一次執行 commands ,如此循環往復,直到 lExpression 為假,或遇上 exit 語句。
            該語句可以嵌套,即循環中還可以有循環。
            do while 與 enddo 必須配對使用,即有一個 do while 必須有一個 enddo 否則程序會出錯。
            舉例
            例1:在數據庫中不斷將記錄指針往下移,直到數據庫結尾。程序如下:
            do while .not. eof()
              skip
            enddo
             例2:在上面的例子加入此功能,當遇到性別字段為“女”時,跳出循環。程序如下:
            do while .not. eof()
              if  性別='女'
                exit
              endif
              skip
            enddo
             例3:不斷將記錄指針往下移,當遇到數量字段的值大于等于600時退出循環,如遇到值小于400的,將其值乘2,然后再檢驗一次是否大于600,如是則退出循環。程序如下:
            do while 數量<600
              if  數量<400
                replace 數量 with 數量*2
                loop
              endif
              skip
            enddo
            分支語句(do case...endcase)
            根據不同的條件執行不同的程序組。
            語法
            DO CASE
                CASE 邏輯表達式1
                    程序組1
                [CASE 邏輯表達式2
                    程序組2
                ...
                CASE 邏輯表達式n
                    程序組n]
                [OTHERWISE
                    程序組0]
            ENDCASE
            參數
            CASE 邏輯表達式 程序組 ... 當程序執行到 do case 時,便檢驗第一個 case 的邏輯表達式(邏輯表達式1)是否為真,如不為真,接著檢驗第二個 case 的邏輯表達式,以此類推直到邏輯表達式n。當檢測到第一個為真的邏輯表達式時,便執行跟隨在其后面的程序組,執行完后跳過后面所有的 case ,接著執行 endcase 后面的語句,也就是說即使后面還有為真的邏輯表達式也不執行了。
            如果所有 case 后面的邏輯表達式都為假,則執行 otherwise 后面的程序組(如果有的話, otherwise 及其程序組是可以沒有的,如果沒有則什么都不做,直接執行 endcase 以后的程序)
            備注
            在do case 和 endcase 之間可以有任意多個 case 。
            do case 和 endcase 必須配對使用,即有一個 do case 必須有一個 endcase ,否則程序會出錯。
            舉例
            如果工資在200元以下,增加50%;300元以下,增加30%;500元以下,增加20%;其它增加10%。程序如下:
            do case
              case 工資<=200
                replace 工資 with 工資*1.5
              case 工資<=300
                replace 工資 with 工資*1.3
              case 工資<=500
                replace 工資 with 工資*1.2
              otherwise
                replace 工資 with 工資*1.1
            endcase
            在這里要注意一個問題,不能把300元的 case 放在200元之前,否則一個100元的,按理應加50%,但當遇到小于300元的 case 時,其邏輯表達式為真(小于200元的肯定小于300元),因此就會執行后面的程序,加30%,并且執行完后,就不再執行其它的 case 了,這樣就產生了錯誤的結果,所以應按從小到大的順序來排列。
            賦值語句(store...to)
            將一個數據賦給一個變量。
            語法
            STORE 表達式 TO 變量名表
            參數
            表達式的值即為要賦給變量的數據。
            變量名表即為要被賦值的各變量。在這里可以是一個變量,也可以是多個變量,如果有多個變量,其間用“,”(逗號)隔開。
            備注
            如果是給一個變量賦值,該語句可寫成如下形式:
            變量名=表達式
            表達式可以是一個數值,也可以是一個算術式。
            舉例
            例1:將3賦給ab、xyz、jfz三個變量,程序如下:
            store 3 to ab,xyz,jfz
            例2:將變量gz的值加100賦給yfgz。程序如下:
            yfgz=gz+100
            調用表單語句
            運行一個由表單設計器設計的表單文件。該文件是經編譯過的。
            語法
            DO FORM 表單文件名 [NAME 變量名 [LINKED]]
            參數
            表單文件名即是要運行的由表單設計器設計的表單文件名稱。
            變量名為調用該表單所用的變量名稱,做為表單,不能直接用這的名稱去調用它,必須將其賦給一個變量,然后用這個變量來調用它。如果您不會在這個表單之外調用它,也可以不要這個變量。
            在程序中產生的所有變量在程序運行結束后將被釋放,即這些變量不再存在,因此也就無法繼續調用這些變更,如果為了調試程序需要在程序運行結束后在命令窗口中調用這個表單,必須加上 linked 子句。
            舉例
            在程序中調用xy7表單,并將賦給一個變量lucky,程序如下:
            do form xy7 name lucky
            調用子程序語句(do)
            運行一個VFP程序。當我們要在一個程序中調用另一個程序(子程序)時使用此命令。
            語法
            DO 程序名
            參數
            程序名即為被調用的程序名稱。
            備注
            如被調用的程序的擴展名是“prg”,調用時可不用帶擴展名,否則要帶上擴展名。
            舉例
            有一個程序,名稱為 xy7.prg,調用它的程序如下:
            do xy7
            返回調用程序語句(return)
            返回調用本程序(該語句所在程序)的程序。
            前面講過調用子程序的語句,從一個程序A調用另一個程序B后,系統便開始執行B程序中的語句,到一定時候往往要從程序B返回程序A,便可使用該語句。
            語法
            RETURN
            備注
            程序A調用程序B,當從B返回A后,系統接著執行調用語句(do b)下面的一條語句。
            舉例
            程序a.prg如下:
            do while .not. eof()
            if 工資<100
            do b
            endif
            skip
            enddo
            程序b.prg如下:
            replace 工資 with 工資*1.5 &&將工資增加50%
            display &&顯示出該記錄,這樣可以將所有增加了工資的記錄顯示出來
            return
            首先執行程序a.prg,當程序執行到 do b 語句時,便轉去執行程序 b.prg ,在程序 b 中執行到 return語句時,又返回程序 a ,并接著執行 do b 的下一條語句 endif 。
            啟動事件處理語句(read events)
            啟動VFP的事件處理程序。
            語法
            READ EVENTS
            備注
            當該命令執行后,系統即停止繼續執行后續的語句,這時我們可以調用之前所啟動的菜單、表單等對象,并用這些對象的事件程序去完成相應的任務,直到發出 clear events 命令,系統才接著執行 read events 后面的命令語句。
            可能初學者看了上面的內容還不是很清楚,不要緊,我們在后面課程中會進一步講解。
            清除事件處理語句(clear events)
            終止由 read events 語句啟動的事件處理程序。
            語法
            clear events
            備注
            發出該命令后,系統將繼續執行 read events 之后的語句。
            開關命令執行狀態語句(set talk on/off)
            確定是否顯示VFP命令執行的狀態。
            語法
            SET TALK ON | OFF
            參數:
            ON 顯示VFP命令執行的狀態。
            OFF 不顯示VFP命令執行的狀態。
            備注:
            使用時,on、off 二者之中必須選擇一個。
            很多VFP命令執行后,會顯示執行后的結果狀態,如 locate for 命令執行,如找到記錄的會顯示被找到的記錄號,否則會顯示“已到文件尾”,但一般我們在程序中是不需要這些顯示的,比如找到了記錄就直接顯示出來,沒找到一般用一個對話框來給出更清楚的提示,所以在程序一開始往往要將 set talk 關閉。
            結束程序語句(cancel)
            結束當前正在運行的所有程序,返回VFP或操作系統。
            語法
            cancel
            備注
            數值轉換字符函數(str())
            返回與指定數值表達式對應的字符。
            語法
            str(數值表達式[,長度[,小數位數]])
            返回值的類型
            字符型
            參數
            數值表達式:要被轉換為字符的數值表達式。
            長度:轉換后字符的長度。該長度等于小數點和小數點右邊第個數字所占字符的數目總和。
            如果指定長度大于所需長度,自動在前面加空格補齊。
            如果指定長度小于所需長度,返回一串星(*)號,表示數值溢出。
            如省略長度,則默認長度為10。
            小數位數:指定返回字符串中的小數位數。
            如指定位數小于實際位數,則返回值四舍五入。
            如指定位數大于實際位數,則加0補齊。
            如省略小數位數,默認為0。
            在指定了小數位數的情況下,如指定長度(第二個參數)小于總長度,但大于整數長度,則返回對小數部分做了四舍五入的字符。
            備注
            返回后的值看起來還是數的形式,但它的數據類型已經變了,不再是一個數值,也就是不能再用來做加、減、乘、除的算術運算,但可以和字符進行加減。比如:
            ? '季度'+1
            就會出錯,因為一個字符是不能和一個數值相加的。寫成如下形式就可以了:
            ? '季度'+str(1,1)
            結果是:
            季度1
            注意,這里一定要指定長度,否則由于默認長度是10,就會出現如下結果:
            季度         1
            假如不知道數值有幾位數怎么辦呢?請參見ltrim()函數。
            字符轉換數值函數(val())
            將數字組成的字符表達式轉換成數字值。
            語法
            val(字符表達式)
            返回值的類型
            數值型
            參數
            字符表達式:要被轉換為數值的字符表達式。該表達式由最多16位的數字組成,若超過16位,則對其圓整。
            備注
            val()函數從左到右返回字符表達式中的數字,直到遇到非數值型字符(忽略前面的空格)時為止。
            若字符表達式的第一個字符不是數字,也不是正、負號,則返回0。
            舉例
            a='123'
            如果按下面的寫法,就會出錯,因為一個字符不能與一個數值相加:
            ? a+3
            寫成如下形式便可以了:
            ? val(a)+3
            結果是126。
            取系統日期函數(date())
            返回由操作系統控制的當前系統日期。
            語法
            date()
            返回值的類型
            日期型
            取年份函數(year())
            從指定的日期表達式中返回年份。
            語法
            year(日期表達式)
            返回值的類型
            數值型
            參數
            日期表達式:指定的日期表達式,該函數即是返回其年份值。
            舉例
            ? year(date())
            如果當前的系統日期是1999年2月5日,則顯示的結果為1999。
            取月份函數(month())
            從指定的日期表達式中返回月份。
            語法
            month(日期表達式)
            返回值的類型
            數值型
            參數
            日期表達式:指定的日期表達式,該函數即是返回其月份值。
            舉例
            ? month(date())
            如果當前的系統日期是1999年2月5日,則顯示的結果為2。
            取天日函數(day())
            以數值型返回日期表達式是當月的第幾天。
            語法
            day(日期表達式)
            返回值的類型
            數值型
            參數
            日期表達式:指定的日期表達式,該函數返回該日期是當月的第幾天。
            舉例
            ? day(date())
            如果當前的系統日期是1999年2月5日,則顯示的結果為5。
            取整函數(int())
            返回數值表達式值的整數部分。
            語法
            int(數值表達式)
            返回值的類型
            數值型
            參數
            數值表達式:指定的數值表達式,該函數返回其整數部分。
            舉例
            ? int(123.47)
            結果是123。
            四舍五入函數(round())
            對指定表達式進行四舍五入運算,并把結果返回。
            語法
            round(數值表達式,小數位數)
            返回值的類型
            數值型
            參數
            數值表達式:指定的數值表達式,該函數返回其四舍五入后的值。
            小數位數:保留的小數位數。
            舉例
            ? int(123.457,2)
            結果是123.46。
            刪除標記函數(delete())
            確定當前記錄是否已做刪除標記,若已做刪除標記,返回真(.t.),否則返回假(.f.)。
            語法
            delete([表別名|工作區])
            返回值的類型
            邏輯型
            參數
            表別名|工作區:該參數指定所要確定的表的別名或所在工作區,即您可以在一個工作區去檢測另一工作區的表的記錄是否做了刪除標記,而另一工作區的表可用其別名或工作區號來指定。該參數如省略,隱含為當前工作區,如有該參數的話,別名或工作區只選一個。
            記錄號函數(recno())
            返回當前表或指定表中的當前記錄號。
            語法
            recno([表別名|工作區])
            返回值的類型
            數值型
            參數
            表別名|工作區:該參數指定所要確定的表的別名或所在工作區,即您可以在一個工作區去得到另一工作區的表的當前記錄號,而另一工作區的表可用其別名或工作區號來指定。該參數如省略,隱含為當前工作區,如有該參數的話,別名或工作區只選一個。
            記錄數函數(reccount())
            返回當前表或指定表中的記錄數目。
            語法
            reccount([表別名|工作區])
            返回值的類型
            數值型
            參數
            表別名|工作區:該參數指定所要確定的表的別名或所在工作區,即您可以在一個工作區去得到另一工作區的表的記錄數,而另一工作區的表可用其別名或工作區號來指定。該參數如省略,隱含為當前工作區,如有該參數的話,別名或工作區只選一個。
             找到記錄函數(found())
            如果locate、continue、seek等查找記錄的命令成功(即找到了記錄),該函數返回“真”(.t.),否則返回“假”(.f.)。
            語法
            found([表別名|工作區])
            返回值的類型
            邏輯型
            參數
            表別名|工作區:該參數指定所要確定的表的別名或所在工作區,即您可以在一個工作區知道另一個工作區上次查找記錄是否找到,而另一工作區的表可用其別名或工作區號來指定。該參數如省略,隱含為當前工作區,如有該參數的話,別名或工作區只選一個。
            舉例
            locate for 姓名='莊稼'
            ?found()
            如找到記錄,顯示結果為.t.,否則為.f.。
            表結尾函數(eof())
            確定記錄指針是否在表的結尾處。
            語法
            eof([表別名|工作區])
            返回值的類型
            邏輯型
            參數
            表別名|工作區:該參數指定所要確定的表的別名或所在工作區,即您可以在一個工作區知道另一個工作區表的指針是否在尾部,而另一工作區的表可用其別名或工作區號來指定。該參數如省略,隱含為當前工作區,如有該參數的話,別名或工作區只選一個。
            備注
            這里所說的結尾處,并非是指最后一個記錄,而是最后一個記錄的后面,即沒有記錄。
            舉例
            go bottom
            skip
            ?eof()
            顯示結果為.t.。
            如果沒有skip,僅僅走到最后一個記錄,返回的將是.f.,而必須再往下跳一下才會是“真”結尾。
            此時如輸入命令:display,則沒有記錄顯示。這一點與bof()函數不同。
            表開頭函數(bof())
            確定記錄指針是否在表的開頭。
            語法
            bof([表別名|工作區])
            返回值的類型
            邏輯型
            參數
            表別名|工作區:該參數指定所要確定的表的別名或所在工作區,即您可以在一個工作區知道另一個工作區表的指針是否在開頭,而另一工作區的表可用其別名或工作區號來指定。該參數如省略,隱含為當前工作區,如有該參數的話,別名或工作區只選一個。
            備注
            這里所說的開頭,并非是指第一個記錄,而是第一個記錄的前面。
            舉例
            go top
            skip -1
            ?bof()
            顯示結果為.t.。
            如果沒有skip -1,僅僅走到第一個記錄,返回的將是.f.,而必須再往上跳一下才會是“真”開頭。
            但與eof()函數不同,此時如輸入命令display,將顯示第一條記錄。
            消除后續空格函數(trim())
            將字符表達式的后續空格全部刪除,并將結果返回。
            語法
            trim(字符表達式)
            返回值的類型
            字符型
            參數
            字符表達式:指定的字符表達式,該函數將刪除其后續空格。
            備注
            trim()函數等同于rtrim()函數。
            舉例
            如表的“姓名”字段長度為10,當前內容為“張三”,那么如下語句:
            ? 姓名+'先生:'
            其顯示結果是:
            張三 先生:
            而語句:
            ? trim(姓名)+'先生:'
            顯示結果是:
            張三先生
            消除前導空格函數(ltrim())
            將字符表達式前面的空格全部刪除,并將結果返回。
            語法
            trim(字符表達式)
            返回值的類型
            字符型
            參數字符表達式:指定的字符表達式,該函數將刪除其后續空格。
            舉例
            在講str()函數時我們舉過一個例,即把一個字符與一個數值相加時,應采用如下形式:
            ? '季度'+str(1,1)
            但是當我們沒有辦法確定這個數值的位數時,這個辦法就行不通了,您不可能規定它的長度只能是1或2等等。那么怎么辦呢,采用ltrim()函數可以解決了:
            ? '項目'+ltrim(str(sz))
            這里假設事先已有一個數值存入了sz變量,但不知道這個數值是幾,也就更不知道有幾位數,那么在隱含狀態下,str()函數將把sz轉換為長度為10的字符,其前面可能有若干空格,通過ltrim()函數的處理,不論前面有多少空格,都可以得到如下結果(假設數值是15):
            項目15
            更多編程命令

            BLANK 命令
            如果發出該命令時不帶任何參數,則清除當前記錄中所有字段的數據。
            語法
            BLANK
              [FIELDS 字段名列表]
              [范圍]
              [FOR 條件]
              [WHILE 條件]
              [NOOPTIMIZE]
             說明
            如果使用了字段名列表,則清除指定字段中的數據,另外也可以在字段名前面加上別名,以清除其它工作區的表中數據,但要注意一點,如果當前工作區的記錄指針指在了表的末尾,那么它也不能清除您所指定的其它工作區中的字段,即使其它工作區的記錄指針沒有指向末尾。
            COPY FILE 命令
            復制文件。
            語法
            COPY FILE 文件名1 TO 文件名2
            說明
            文件名中可以用“*”和“?”,如 *.prg。
            要注意的一點是“文件名2”必須有,比如:
            copy file *.prg to c:\temp\*.prg
            不象 DOS 的 COPY 命令可以沒有目的文件名,而且命令中的“FILE”也一定要有。
            COPY STRUCTURE EXTENDED 命令
            將當前工作區的表結構信息復制到另一表中。
            語法
            COPY STRUCTURE EXTENDED TO 表文件名 [FIELDS 字段名表]

            參數說明
            FileName :指定結構信息所存放的表文件名。

            FIELDS 字段名表 :指定需要復制表結構中哪些字段的信息,如省略,則復制所有字段的信息。
            說明
            該命令將一個表的各字段信息復制到一個新表中,每個字段為一個記錄,這是一個專門的表,其字段是固定,這些字段分別記錄各字段的字段名、長度、數據類型等等,各字段的字段名及其意義如下:

            字段名
            數據類型
            意義
            FIELD_NAME
            字符
            字段名。
            FIELD_TYPE
            字符
            數據類型。C=字符型,Y=貨幣型,N=數值型,F=浮點型,I=整數型,B=雙精度型,D=日期型,T=日期時間型,L=邏輯型,M=備注型,G=通用型
            FIELD_LEN
            數值
            字段長度。
            FIELD_DEC
            數值
            小數位數。
            FIELD_NULL
            邏輯
            字段是否可用 null 值。
            FIELD_NOCP
            邏輯
            字段是否允許代碼頁翻譯。
            FIELD_DEFA
            備注
            字段的隱含值。
            FIELD_RULE
            備注
            字段驗證規則。
            FIELD_ERR
            備注
            字段驗證規則出錯時的提示信息。
            TABLE_RULE
            備注
            表驗證規則。
            TABLE_ERR
            備注
            表驗證規則出錯時的提示信息。
            TABLE_NAME
            字符
            長表名。
            INS_TRIG
            備注
            插入觸發器代碼。
            UPD_TRIG
            備注
            更新觸發器代碼。
            DEL_TRIG
            備注
            刪除觸發器代碼。
            TABLE_CMT
            備注
            表說明。

            圖1,即為用 COPY STRUCTURE EXTENDED 命令生成的 rsda 表的結構信息表,在這個表中就可以看到 rsda.dbf 表的各字段情況。
            那么用這個命令產生的結構信息表有什么用呢?這可以讓我們在編程時改變一個表的結構,因為信息結構表也是個表,我們可以象操作一般表一樣去修改它的內容,當然修改時要遵從表結構的有關規定,比如字段名不能超過10個字符,字段類型必須是上表中的字符之一,字段名不能重名等等。
            當然我們修改了這個表后不會對原表馬上產生作用,因為它們已經是分別獨立的兩個表,在物理上沒有任何聯系,但我們可以首先使用以下命令:
            CREATE 表文件名 FROM 結構信息表文件名
            根據結構信息表創建一個新表,再將原表的數據加到這個新表中,刪除原表,將新表改為原表名,這樣就修改了表的結構。比如,我們要將 rsda 表部門字段的長度改為20,程序如下:

            select rsda  &&選擇 rsda 表。
            copy structure to rsdajg extended  &&將 rsda 表的結構信息復制到 rsdajg 表。
            use rsdajg  &&打開 rsdajg 表,同時關閉 rsda 表。
            replace field_len with 20 for trim(field_name)= ='部門'  &&將部門字段的字段長度修改為20。
            *實際上上一句的意思是將 rsdajg 表的 field_name 為“部門”的記錄的 field_len 字段值改為20。
            use  &&關閉 rsdajg 表,要從這個表創建新表,必須將其關閉。
            create rsda2 from rsdajg  &&從 rsdajg 中提取信息創建 rsda2 表。
            append form rsda  &&從 rsda 表中獲取數據。
            erase rsda.dbf  &&刪除 rsda.dbf 表。
            rename rsda2.dbf to rsda.dbf  &&將 rsda2.dbf 改名為 rsda.dbf。

             FLUSH 命令
            將表和索引中的數據存入磁盤。
            語法
            FLUSH
            說明
            當我們修改一個表時,修改完后,我們可能并不馬上將表關閉,那么這時所做的修改可能只是在內存中,而沒有真正存到盤,如果這時死機或停電,那么......,所以我們可以在程序適當的地方用此命令確保數據存盤。
            比如,我們可以在菜單中加個“保存”命令,該命令就調用 FLUSH 語句,供操作者在適當的時候調用此命令來保存數據。
            還可以用一個表單,在其中放一個計時器,在計時器的 timer   事件中用此命令,這樣就做成一個具有自動保存數據的功能,甚至可以在菜單中加一個設置計時器時間的命令,以供操作者設置自動保存數據的間隔時間。
            FOR...ENDFOR 命令
            按指定的次數循環執行一組命令。
            語法
            FOR 變量=初始值 TO 結束值 STEP 步長值
              命令組
              [EXIT]
              [LOOP]
            ENDFOR | NEXT
            參數描述
            變量:指定一個變量作為計數器,該變量可以不預先存在,FOR 命令會自動創建。
            初始值 TO 結束值:即計數器的初始值和結束值,也就是指定循環的次數。
            STEP 步長值:設定計數器每次增加或減少的量,如果省略此子句,則每次增加1,比如 for jsq=1 to 10,那么將會循環10次,如果是 for jsq=1 to 10 step 2,那么循環將會是5次,因為每循環1次計數器增加2,從1到10只需增加5次就行了。
            可能有人會問了,既然循環5次,那為什么不 for jsq=1 to 5 呢?這往往是為了在某些情況下使程序編起來方便和易于理解,比如要對數據表中的記錄進行某項操作,要求每隔一條記錄做一次,起始和結束的記錄是根據具體情況變化的,也就是初始值和結束值都是變量,那么我們就可以使用步長子句,并將步長設為2,這樣就不用具體去計算到底需要多少次循環了,如果再加上步長也是變量,即有時隔一條記錄,有時會隔多條記錄,則步長子句就更必要了。

            注意
            步長的變化是指在不同次的完整循環中步長會變,一般在一次完整的循環中不要更改初始值、結束值和步長。

            另外步長可以是負的,這又有什么必要?當我們需要根據一個數值不斷減小來進行某項操作時就需要了,比如我們需要對記錄進行某項操作,這個操作要求先處理第10條記錄,再第9條(因為在處理第9條時需要根據第10條的情況),依次到第1條,那么我們就可以:

            for jsq=10 tp 1 step -1
            * 操作命令組
              go jsq  &&設上面的操作移動了記錄指針,此時已不指在第10條記錄上,則不能用 skip -1 將指針移到第9條
            endfor

            很明顯,雖然可以用其它方法,但這樣編出的程序最簡潔,一目了然。
            EXIT 和 LOOP:與 DO WHILE 中的意義一樣。
            說明
            計數器只有在大于結束值時才結束循環,即當計數器等于結束值時仍要循環,也就是說:
            for jsq=1 to 10
            是循環10次,而不是9次,也就是當 jsq 的值為10時,還要循環一次,當它為11時,則退出循環,執行 endfor 之后的程序。

            注意
            DO WHILE...ENDDO 與 FOR...ENDFOR 都是循環,它們有什么區別呢?在需要使用計數器的情況下,由于 FOR...ENDFOR 不需要專門的計數語句,所以程序執行的速度快,因此能用 FOR...ENDFOR 時盡量用。

            ON ERROR 命令
            設置一命令,當系統錯誤發生時,該命令執行。
            這也就是程序員們常說的錯誤捕獲陷井。所謂錯誤捕獲陷井的意思就是在系統中啟動一個監控程序,一旦錯誤發生,這個監控程序就將錯誤捕獲,并不讓錯誤顯示出來,可保證程序的繼續運行,然后用一個命令去對出現的錯誤進行處理,比如顯示一個錯誤提示等。如果錯誤不發生,這個命令則始終不執行。
            語法
            ON ERROR [命令]
            參數說明
            命令:此即為指定的在捕獲錯誤后所要執行的程序。一旦程序執行到某個語句發生錯誤,該命令即被執行,執行完后,接著執行發生錯誤的下一條語句。

            提示
            有時為了對錯誤進行處理,一條命令可能是不夠的,則可用該命令調用一個子程序,那么需要在子程序執行完后才接著執行發生錯誤的下一條語句。
            如果子程序中有 RETRY 命令,該命令將使子程序返回,并重新執行發生錯誤的語句,這個命令一般用在這種情況下,當子程序對錯誤進行了處理,使得再執行該命令時不會發生錯誤了,這樣就可以使程序按照正常情況運行下去。
             多學一招
            當處理錯誤子程序執行時,您還可以用 ERROR(), MESSAGE(), LINE(), PROGRAM() 等函數返回出錯的編號、信息、出錯的語句所在行號以及出錯的程序等,這些可能對處理錯誤有幫助。

            如省略命令參數,則取消錯誤捕獲陷井。
            說明
            ON ERROR 命令不能嵌套,也就是說在 ON ERROR 所執行的子程序中不能再有 ON ERROR 命令,否則等于取消錯誤捕獲。
            示例
            當 DBF 文件的結構化復合索引損壞時,如果您打開 DBF 文件就會出錯,下面的例子就捕獲錯誤并自動修復索引:

            *主程序
            on error do xfsy  &&設置錯誤陷井
            use rsda  &&打開表,如果索引損壞,則會產生錯誤,xfsy 程序將會執行
            on error  &&取消錯誤陷井
            ...
            cancel
            *修復子程序
            procedure xfsy  &&修復子程序的過程名
            erase rsda.cdx  &&刪除索引文件
            use rsda  &&打開表
            index on 編號 tag of rsda.cdx  &&重建索引“編號”
            index on 姓名 tag of rsda.cdx  &&重建索引“姓名”

             ON ESCAPE 命令
            設置一命令,當按了ESCAPE時,該命令執行。
            語法
            ON ESCAPE
                [命令]
            參數說明
            命令:該命令即為指定的按下 ESC 鍵后所要執行的命令。
            假設當程序執行到第10條語句時您按下了 ESC,那么在命令執行完后,將接著執行第11條語句,如果命令是調用一個子程序,而子程序中有 RETRY 語句,則返回重新執行第10句。
            說明
            假如 ON KEY LABEL 命令也同時指定了 ESC 鍵,ON ESCAPE 所指定的命令優先執行。
            如 SET ESCAPE OFF 則該命令也不起用。

            注意
            這個命令常常用來在一個循環中退出循環,比如:
            on escape exit
            do while .t.
              *循環體中的命令組
            enddo
            on escape
            這樣在循環中執行命令時,只要您隨時動用您的玉指按下 ESC 鍵,即可令程序退出循環。
            但別高興得太早,上面這個程序在執行時常常出錯,但也不是總出錯,為什么呢?因為 exit 命令必須在循環體中,假如程序正執行到 do while 或 enddo,這時您動了玉指,程序就會出錯,怎么解決這個問題呢?這樣:
            on escape tc=.t.
            tc=.f.
            do while .t.
              *循環體中的命令組
              if tc
                exit
              endif
            enddo
            on escape
            思考題:上面這個程序為什么不會出錯?

             ON KEY LABEL 命令
            指定一個命令,當鍵盤上某個鍵(也可以是組合鍵或鼠標)被按下后,該命令執行。
            語法
            ON KEY LABEL 鍵名 [命令]
            參數描述
            各鍵的鍵名如下:

            鍵名
            LEFTARROW
            RIGHTARROW
            UPARROW
            DNARROW
            HOME
            HOME
            END
            END
            PAGE UP
            PGUP
            PAGE DOWN
            PGDN
            DEL
            DEL
            BACKSPACE
            BACKSPACE
            SPACEBAR
            SPACEBAR
            INS
            INS
            TAB
            TAB
            SHIFT+TAB
            BACKTAB
            ENTER
            ENTER
            F1 to F12
            F1, F2, F3 ...
            CTRL+F1 to CTRL+F12
            CTRL+F1, CTRL+F2 ...
            SHIFT+F1 to SHIFT+F12
            SHIFT+F1, SHIFT+F2 ...
            ALT+F1 to ALT+F12
            ALT+F1, ALT+F2, ALT+F3 ...
            ALT+0 to ALT+9
            ALT+0, ALT+1, ALT+2 ...
            ALT+A to ALT+Z
            ALT+A, ALT+B, ALT+C ...
            CTRL+LEFT ARROW
            CTRL+LEFTARROW
            CTRL+RIGHT ARROW
            CTRL+RIGHTARROW
            CTRL+HOME
            CTRL+HOME
            CTRL+END
            CTRL+END
            CTRL+PAGE UP
            CTRL+PGUP
            CTRL+PAGE DOWN
            CTRL+PGDN
            CTRL+A TO CTRL+Z
            CTRL+A, CTRL+B, CTRL+C ...
            CTRL+0
            CTRL+0
            RIGHT MOUSE BUTTON
            RIGHTMOUSE
            LEFT MOUSE BUTTON
            LEFTMOUSE
            MOUSE BUTTON
            MOUSE
            ESC
            ESC

            ON KEY LABEL 鍵名 后面不跟命令則解除該鍵所要執行的命令(即解除所設的程序陷井)。
            說明
            該命令的用法與 ON ESCAPE 的用法基本上是一樣的。

            注意
            該命令對于在系統菜單及系統對話框上的按鍵不起作用。
            對于 on mouse 等命令,在鼠標點擊件時不起作用。

            示例
            on key label ctrl+e tc=.t.
            tc=.f.
            do while .t.
              *循環程序組
              if tc
                exit
              endif
            enddo
            on key label ctrl+e
            PACK DATABASE 命令
            將數據庫所有表中作了刪除標記的記錄物理刪除,即真正從磁盤上刪除。
            語法
            PACK DATABASE
            說明
            執行該命令時,數據庫必須以獨占方式打開。
            該命令可用于在程序中定期清理數據庫各表中的刪除記錄,因為軟件可能經常要作刪除,對大的表會影響運行速度,所以可以在軟件中設置 set delete on,即隱去作了刪除標記的記錄,但這些記錄并沒有真正刪除,但這些垃圾記錄太多了也對系統不利,故可設一功能由操作人員在需要時運行此命令來清理整個數據庫。
             SCAN...ENDSCAN 命令
            將記錄指針由頭到尾掃描一遍,每移動一次記錄指針可執行一組命令。
            類似于循環 DO...ENDDO 或 FOR...ENDFOR,只是這是專門針對表的循環。
            語法
            SCAN [范圍] [FOR 條件1] [WHILE 條件2]
                [命令組]
                [LOOP]
                [EXIT]
            ENDSCAN
            參數描述
            范圍:在指定范圍內掃描,即不從開頭掃描到最后。
            FOR 條件1 及 WHILE 條件2:只掃描符合條件的記錄。
            如果不帶范圍和條件子句,則隱含掃描表中的全部記錄。
            示例
            庫存日記帳表(字段有日期、入庫數、出庫數,庫存數),每記錄一筆出入庫,則計算相應的庫存數并放入表中,有時意外情況可能導致庫存數出錯,因此需要有一功能將庫存數重新計算一遍,下面這個程序就是完成這個功能:

            go top
            dqkc=庫存數  &&記下第一條記錄的庫存數
            skip  &&跳到第2條記錄
            scan  rest &&只需掃描從第2條記錄起的所有記錄
              replace 庫存數 with dqkc+入庫數-出庫數
              dqkc=庫存數  &&記下當前記錄的庫存數
            endscan

            上面這段程序與下面這段程序是等價的:

            go top
            dqkc=庫存數  &&記下第一條記錄的庫存數
            skip  &&跳到第2條記錄
            do while .not. eof()
              replace 庫存數 with dqkc+入庫數-出庫數
              dqkc=庫存數  &&記下當前記錄的庫存數
              skip
            endscan

            所不同的就是不用每次都 skip,系統自動移動記錄指針,這樣程序運行的速度快,尤其對于按條件掃描的情況就更快了,因為用 do 的話每次都要用 locate 或 continue 進行查詢,速度很受影響。
            與這段程序也是等價的:

            go top
            dqkc=庫存數  &&記下第一條記錄的庫存數
            skip  &&跳到第2條記錄
            for jsq=2 to reccount()
              replace 庫存數 with dqkc+入庫數-出庫數
              dqkc=庫存數  &&記下當前記錄的庫存數
              skip
            endfor

            您喜歡用哪個呢?

            注意
            上面第三段程序中有個小問題,在 for 語句中用了 reccount() 函數,而函數都要經過運算才能得到結果,比起直接從一個變量中獲取值要慢,假如只執行1次,兩者相差無幾,但上面是用在循環中,for 這一句可能會執行幾十萬次,那么就會使速度降低很多,為此可改成下面這樣:
            ...
            jls=reccount()
            for jsq=2 to jls
            ...

            SET CONFIRM 命令
            當輸入的內容填滿輸入區域時是否需要按回車鍵跳出輸入區域。
            語法
            SET CONFIRM ON | OFF
            參數描述
            ON 需要按回車鍵。也可以按 TAB 或其它箭頭鍵等。

            提示
            對表單上的文本框也起作用。當對于需要慎重輸入的地方,可將其設置為 ON,以便讓操作者在離開輸入之前可再看一下所輸入的內容有沒有問題,如果不設置為 ON,當輸入內容輸入滿時,光標會自動離開文本框,不利于發現錯誤。

            OFF 不需要按回車鍵(隱含)。
            SET DEFAULT 命令
            設置隱含的驅動器及目錄。
            設置了隱含的路徑,我們可以在程序運行打開每個隱含路徑下的文件時不用再指定路徑了。
            語法
            SET DEFAULT TO [路徑]
            參數說明
            路徑:可以是符合操作系統要求的任何路徑,比如:
            set default to d:\soft\rsgl
            set default to \
            set default to ..

            注意
            如果路徑中帶有空格,必須用引號將路徑括起來,否則會出錯。比如:
            set default to "d:\soft\rsgl  佳帆"

            示例
            當我們的程序在運行時,一般我們都需要知道該程序運行所在的目錄,因為往往許多數據也是放在這個目錄下,我們不能指定一個絕對的路徑,因為程序編好后可能拿到另一臺電腦上用,其路徑可能發生變化,一旦變化便找不到所需要的數據文件了,因此我們必須有一種方法獲取其當前所在的路徑,有一種辦法是這樣:
            cxlj=sys(5)+sys(2003)+'\'
            這在程序編譯成獨立 EXE 文件時運行是對的,但在 VFP 系統中運行 PRG 程序卻不對,它返回的是 VFP 所在的目錄,為了解決這個問題,可采用如下程序:

            CXLJ=SYS(16)  &&獲取當前運行的程序名及其所在路徑
            FOR JSQ=1 TO LEN(CXLJ)  &&用一個循環找出最右邊一個反斜線,將其后的程序名去掉,只剩路徑
              CXZF=LEFT(RIGHT(CXLJ,JSQ),1)  &&從 CXLJ 的右邊依次取出每個字符
              IF CXZF='\'  &&查看這個字符是不是反斜線
                CXLJ=STUFF(CXLJ,LEN(CXLJ)-JSQ+1,JSQ,'')  &&如果是,就將反斜線之后的字符全刪掉并退出循環
                EXIT
              ENDIF
            ENDFOR
            SET DEFAULT TO "&CXLJ"  &&用宏替換設置隱含路徑,用引號是為了帶空格的路徑也能正確設置

             SET SKIP TO 命令
            在表之間建立一對多關系。
            語法
            SET SKIP TO [表1 [, 表2] ...]
            參數描述
            表1 [, 表2] ... 為一對多表中的子表的別名?梢杂卸鄠子表,它們之間用逗號隔開。
            如省略此參數,則取消一對多關系,但一對一關系仍存在。
            說明
            我們用 SET RELATION 命令可創建表之間的一對一關系,也就是當我們將父表的記錄指針移到某一個記錄上時,子表的記錄指針也會移到相應的關聯記錄上,比如我們有一個人事檔案(rsda,有字段編號、姓名等),另有一個參加項目表(cjxm,有字段編號和項目,項目中記錄該人員所參加過的項目,編號建立了索引),然后用如下程序:

            close all
            use rsda
            select 0
            use cjxm
            set order to 編號
            select rsda
            set relation to 姓名 into cjxm

            那么當我們將 rsda 的記錄指針移到一個記錄上時,cjxm 也會移到相同編號的記錄上,但由于是一對一關系,只有 cjxm 中的相同編號的第1個記錄會與 rsda 中的記錄對應,其它的記錄不會與之對應。
            但我們知道一個人可能參加了多個項目,由于一對一的關系,我們沒法從父表中知道子表中有多少個記錄與之對應,比如這時您在父表中鍵入如下命令:
            display 編號,姓名,cjxm,項目 for 編號='10'
            那么只會有一條記錄出現,因為 rsda 中只有一個編號為 10 的記錄,雖然可能他參加了多個項目,但這時不會顯示出來,要想顯示出來就必須建立一對多的關系,比如我們在 rsda 所在工作區鍵入如下命令:
            set skip to cjxm
            然后再運行上面的 display 命令,子表中所有對應的記錄都會顯示出來,即可看到 10 號人員所參加的所有項目,而編號和姓名都是一樣的。
            怎么樣,很不錯吧!
            這時如果您用 browse 看 rsda 表,假如 cjxm 中有多條編號為 10 的記錄,您會發現 10 號記錄下面會多出幾條記錄來,它們的內容全部是“*”,且不可修改,這就是系統根據一對多關系增加的假記錄,依靠這些記錄,上面的 display 命令才能帶來我們想要的結果。

            注意
            如果這時刪除子表中的記錄,且做了 pack,那么關聯將被解除,包括一對多和一對一,如仍需要一對多關系,必須重新用 set relation 和 set skip to 建立一對多關系。

            思考題
            大家思考下用 set skip to 是否能很好地解決問題。

            在中文版VFP6.0中,有一些數據分布在三個數據庫中,如A庫中有各個企業的基本情況,在B庫中有各個企業的董事會組成成員情況,在C庫中有各個企業的分支機構情況,三者可以通過企業編號進行索引,其相互關系是:A庫中一個記錄即一個企業,對應于B庫中的至少三個記錄(即不同的組成成員),再對應于C庫中的至少三個記錄(即不同的分支機構),現在的問題是,我如何能在一張頁面上,同時打印A庫中的一條記錄,B庫和C庫中的三條以上的記錄。

             SET SKIP OF 命令
            設置菜單或菜單項是否跳過,即是否可用。
            語法
            SET SKIP OF MENU 主菜單名 邏輯表達式
            SET SKIP OF PAD 主菜單項名 OF 主菜單名 邏輯表達式
            SET SKIP OF POPUP 子菜單名 邏輯表達式
            SET SKIP OF BAR 子菜單項 OF 子菜單名 邏輯表達式
            參數描述
            MENU 主菜單名 邏輯表達式
            設置主菜單是否跳過,邏輯表達式為“真”時跳過,即整個菜單不可用,反之則可用。
            例如,可以使用以下命令禁止 VFP 的系統菜單 _MSYSMENU:
            set skip of menu _msysmenu .t.
            使用以下命令則啟用它:
            set skip of menu _msysmenu .t.
             PAD 主菜單項名 OF 主菜單名 邏輯表達式
            設置主菜單中某個菜單項是否跳過,如果設置為跳過,假如該項下有子菜單,則子菜單不能拉下來。
            可用如下命令禁止 VFP 主菜單上的“編輯”菜單:
            set skip of pad _msm_edit of _msysmenu .t.
             POPUP 子菜單名 邏輯表達式
            設置某個子菜單是否跳過,如設置為跳過,該子菜單可以拉下,但其中的菜單項都不可用。
            可用如下命令禁止 VFP 的“編輯”子菜單:
            set skip of popup _medit .t.
             BAR 子菜單項 OF 子菜單名 邏輯表達式
            設置某個子菜單中的某個菜單項是否跳過。
            可以用下面的命令設置 VFP “文件”子菜單中的“新建”不可用:
            set skip of bar _mfi_new of _mfile .t.
            說明
            那么對于菜單設計器設計的我們自己的菜單怎樣進行設置呢?其實當我們用菜單設計器設計好一個菜單并完成生成后,就會生成一個擴展名為 mpr 的菜單程序,它與 prg 程序是一樣的,我們可以用如下命令將其打開來看:
            modify command xxx.mpr
            打開后我們就可以看到其中的主菜單名及其相應的主菜單項、子菜單、子菜單項等。下面便是一個 mpr 文件:

            *菜單的說明信息略
            SET SYSMENU TO
            SET SYSMENU AUTOMATIC
            DEFINE PAD _s950ndhs4 OF _MSYSMENU PROMPT "系統錄入及查詢" COLOR SCHEME 3
            DEFINE PAD _s950ndhs6 OF _MSYSMENU PROMPT "系統維護" COLOR SCHEME 3
            DEFINE PAD _s950ndhs7 OF _MSYSMENU PROMPT "統計" COLOR SCHEME 3
            DEFINE PAD _s950ndhs8 OF _MSYSMENU PROMPT "備份數據" COLOR SCHEME 3
            ON PAD _s950ndhs4 OF _MSYSMENU ACTIVATE POPUP 系統錄入及
            ON PAD _s950ndhs6 OF _MSYSMENU ACTIVATE POPUP 系統維護
            ON PAD _s950ndhs7 OF _MSYSMENU ACTIVATE POPUP 統計
            ON PAD _s950ndhs8 OF _MSYSMENU ACTIVATE POPUP 備份數據
            *主菜單即為 _MSYSMENU
            *主菜單中的菜單項分別為 _s950ndhs4, _s950ndhs6 等
            *_s950ndhs4 下的子菜單是“系統錄入及”
            *_s950ndhs6 下的子菜單是“系統維護”
            DEFINE POPUP 系統錄入及 MARGIN RELATIVE SHADOW COLOR SCHEME 4
            DEFINE BAR 1 OF 系統錄入及 PROMPT "數據錄入" ;
            KEY ALT+L, "ALT+L" ;
            MESSAGE '錄入房地產廣告信息'
            DEFINE BAR 2 OF 系統錄入及 PROMPT "數據查詢" ;
            KEY ALT+C, "ALT+C" ;
            MESSAGE '查詢和修改錄入的房地產廣告信息'
            DEFINE BAR 3 OF 系統錄入及 PROMPT "數據整理" ;
            KEY ALT+Z, "ALT+Z" ;
            MESSAGE '如發現數據有問題,可調用此命令進行整理,如整理后仍有問題,請與軟件供應商聯系'
            DEFINE BAR 4 OF 系統錄入及 PROMPT "\-"
            DEFINE BAR 5 OF 系統錄入及 PROMPT "退出系統" ;
            KEY ALT+E, "ALT+E"
            ON SELECTION BAR 1 OF 系統錄入及 do sjlr
            ON SELECTION BAR 2 OF 系統錄入及 do lrsjcx
            ON SELECTION BAR 3 OF 系統錄入及 do sjzl
            ON SELECTION BAR 5 OF 系統錄入及 clear event
            *“系統錄入及”子菜單中的各菜單項為 1、2、3 等
            *以下略

            比如可以在程序中使“系統錄入及查詢”下的“數據整理”不可用,即“系統錄入及”子菜單中的第3個菜單項,命令為:
            set skip of bar 3 of 系統錄入及 .t.
            我們知道在菜單設計器可為每個菜單項設置跳過表達式,那么這個命令還有什么用嗎?有時用它還是比較方便,比如我們要讓一個子菜單中的所有菜單項不可用,我們可以設置該子菜單不可用,如用跳過要一個個菜單項去設,或者每個菜單項都設一個比較復雜的表達式,再要不就設調這個子菜單的主菜單項不可用,那樣又看不到子菜單中有什么內容了(有時雖然不可用但也想看看),總之是比較麻煩,那么用這個命令就好一些。
            不好的地方是要把 mpr 程序打開來記住那些菜單名、菜單項,你們也看到上面了,不是那么好記的。反正這個世界沒有十全十美的東西,我們只好將就點了。
            VALIDATE DATABASE 命令
            保證當前庫中表和索引位置的正確性。
            語法
            VALIDATE DATABASE
              [RECOVER]
              [NOCONSOLE]
              [TO PRINTER [PROMPT] | TO FILE 文件名]
            參數描述
            RECOVER:顯示一個對話框,該對話框允許您定位表和索引,這些表和索引不在被檢查的數據庫, 中。必須在命令窗口中發出 VALIDATE DATABASE RECOVER 命令,在程序中發布該命令會產生錯誤信息。
            NOCONSOLE:如發現數據庫中有錯誤,不向屏幕輸出錯誤信息。
            TO PRINTER [PROMPT]:打印錯誤信息。
            TO 文件名:將錯誤信息輸出到一個文件。
            說明
            該命令確保數據庫包含的表和索引處于正確位置,確保數據庫中的表包含正確的字段,以及確定數據庫中索引標識是否存在。
            該命令對當前數據起作用,而且要求數據庫必須是以獨占方式打開。
            雖然該命令一般不用在程序中,但由于一些初學者是第一次接觸數據庫(不是表),故這個命令還是有必要講一下。當我們發現數據庫有不正常的情況時,就可用這個命令檢測和恢復數據庫。
            示例
            下面的示例打開 testdata 數據庫,并使用 VALIDATE DATABASE 命令,以確保表和索引的位置在數據庫中是正確的。

            close databases
            set path to (home(2)+'data\')  &&設置數據庫路徑
            open database testdata exclusive  &&以獨占方式打開數據庫

            validate database

             CALCULATE 命令
            對字段或帶有字段的表達式進行統計計算。
            語法
            CALCULATE 表達式列表
             
            [范圍][FOR 條件][WHILE 條件]
              [TO 變量列表| TO ARRAY 數組名]
              [NOOPTIMIZE]
             參數描述
            表達式列表
            這里所用到的表達式與其它命令中所用到的表達式不一樣,這里必須是規定的幾個函數表達式,如下:

            函數
            含義
            AVG(表達式)
            計算表達式的平均值。
            CNT()
            返回表中記錄的個數。
            MAX(表達式)
            返回表達式中的最大值。
            MIN(表達式)
            返回表達式中的最小值。
            NPV(表達式1,表達式2,[表達式3])
            計算一個固定周期利率下,一系列現金流的凈現值。表達式1為十進制表示利率;表達式2代表一系列現金流的字段、字段表達式或數值表達式,每個現金流可正可負,當它是字段時,每個記錄的字段值都認為是一個現金流;表達式3指定可選的初始投資,如果不包括初始投資,則假定初始投資發生在第一階段末,這個初始投資就是第一個記錄,而且是負的,代表現金流出。
            STD(表達式)
            計算表達式的標準偏差。
            SUM(表達式)
            對表達式的值求和。
            VAR(表達式)
            計算表達式的均方差。

            注意:這里的函數是不能單獨使用的,它們與單獨同名的函數也是不一樣的,比如,CALCULATE MIN() 與 MIN() 是不同的,前者計算某一字段中各記錄的最小值,函數只需寫一個字段名,后者則是計算一系列表達式中的最小值,所有的表達式都必須寫入函數中。
             TO 變量列表
            將計算結果存入指定的變量。注意變量列表中的變量數必須與表達式列表中的表達式個數相同。
             TO ARRAY 數組名
            將計算結果存入指定的數組。數組可存在,系統會自動創建,數組中的元素也不一定與表達式列表中的個數一樣,如果不夠,系統會自動增加,如果多了,則多出的元素保持不變。
             示例
            CALCULATE SUM(工資),AVG(工資),MIN(工資),MAX(工資) TO HJ,PJ,ZX,ZD
            計算出工資合計、平均工資、最少工資、最多工資,并分別存入各變量。
            從這個例子可以看出,用這個命令比分別用 SUM、AVERAGE 等命令方便,且執行的速度快,因為它只需要將表掃描一次就能將各值計算出來了,而分別用命令就要掃描幾次,對于一個很大表這可不能等閑視之。
            国产在线精品一区二区三区不卡_亚洲第一极品精品无码_永久免费无码网站在线观看_亚洲av综合日韩