数据库应用基础
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 Visual FoxPro语言基础

Visual FoxPro是集编程语言和数据库为一体的数据库管理系统,具有一般计算机高级语言的特点和功能。要开发高质量的数据库应用系统,必须掌握Visual FoxPro的编程语言。而要学好一门计算机程序设计语言,掌握数据类型、常量、变量、表达式和函数等是编程的基础。

1.4.1 数据类型

Visual FoxPro的数据都具有特定的类型,数据类型是数据的基本属性,它决定了数据的存储方式和运算方式。在Visual FoxPro 9.0中,涉及的数据类型近20种,可以分为两类:一类用于变量、数组,另一类只能用于表字段。现将其中主要数据类型描述如下。

1.数值型数据

数值型数据(Numeric)是用于表示数量的一种数据类型,用N表示。它由数字0~9、小数点和正负号组成。数值型数据的长度为1~20位,在计算机的内存中,每个数据占用8个字节的存储空间,其取范围为-0.999999 999 9E+19~+0.999999 999 9E+20。

该类数据用于数学计算。例如,工资、单价、金额等一般用数值型表示。

2.字符型数据

字符型数据(Character)由字母、数字、空格、符号和标点等一切可打印的ASCII字符和汉字组成,用C表示。字符最大长度为254,一个字符占一个字节的存储空间,汉字也是字符,一个汉字占两个字节的存储空间。

字符型数据一般用来表示姓名、地址、单位等文本信息。有一类数据,如学号、商品号、电话号码等,虽然都由数字组成,但不用来计算,一般也用字符型数据表示。

3.逻辑型数据

逻辑型数据(Logical)通常用来表示某个条件是否成立,可取值为逻辑真(.T.)和逻辑假(.F.)两个值,用L表示。逻辑型数据长度固定为1字节。

逻辑型数据主要用于逻辑判定。例如,是否已婚、是否满足给定的条件等两种状态的数据,可用逻辑型表示。

4.日期型数据

日期型数据(Date)用来表示日期,用D表示。长度固定为8位,存储格式为“yyyymmdd”。

日期型数据的显示格式有多种,默认采用美国格式mm/dd/yy(月/日/年)。可以通过SET DATE、SET CENTURY和SET MARK TO命令改变其显示格式。

(1)SET DATE命令

格式:

          SET  DATE  [TO]  AMERICAN/ANSI/BRITISH/FRENCH/GERMAN/ITALIAN/JAPAN/USA/
                           MDY/DMY/YMD

功能:指定日期表达式和日期时间表达式的显示格式。

日期的默认显示格式是AMERICAN。SET DATE设置也决定日期在日期时间表达式中的格式。SET DATE在当前数据工作期有效。表1-2列出了有效的设置值及其对应的日期格式。

表1-2 SET DATE设置的日期格式

active=true

(2)SET CENTURY命令

格式:

            SET CENTURY OFF/ON

功能:设置显示的日期数据中年份用2位还是4位表示。

(3)SET MARK TO命令

格式:

            SET MARK TO <字符>

功能:设置显示的日期数据中使用的分界符,如SET MARK TO '_'。

此外,日期格式还有传统日期格式和严格日期格式之分。

5.日期时间型数据

日期时间型数据(DateTime)用于保存日期和时间两部分,用T表示。日期时间型数据占用8个字节,前4字节保存日期,后4字节保存时间,分别是时、分、秒。存储格式为:“yyyymmddhhmmss”。

6.货币型数据

货币型数据(Currency)一般用于金融计算,用Y表示。它具有自动控制小数位数的功能,例如,当货币型字段或变量的数值小数位数超过4位时,Visual FoxPro将该数据四舍五入。货币型数据存储时占用8个字节,其取值范围介于-922337 203685 477.580 8~922337 203685 477.580 7之间,并在货币型数据前加上一个符号“$”。

7.备注型数据

备注型数据(Memo)用来存放一些内容较多或长度不确定的文本信息,用M表示。备注型数据在表字段中的长度为4个字节,它存放的只是一个指针,用于指向字段的真正内容,而该字段的真正内容存放在与表文件同名的一个表备注文件(.FPT)中。当复制和修改含有备注字段的数据表名时,必须同时复制和修改它的表备注文件名,否则,复制和修改后的表将无法使用。备注字段保存信息的大小仅受可用磁盘空间大小的限制。当在同一数据表中有多个备注型字段时,这些字段的具体数据是存放在同一个.FPT备注文件中的。

8.通用型数据

通用型数据(General)专门用来存储OLE对象,用G表示。所谓OLE对象,其具体内容可以是一个电子表格、字处理文档或图像、声音等,通常这些OLE对象由其他应用程序产生。与备注型数据一样,通用型数据在表字段中的长度为4个字节,它存放的只是一个指针,其真正的内容也是存放在与数据表同名、扩展名为.fpt的备注文件中。通用字段存储OLE对象的大小仅受可用磁盘空间的限制。

9.双精度型数据

双精度型数据(Double)用于存储精度较高且固定位数的浮点数据,用B表示。例如,科学计算的数据最好设置为双精度型。双精度型数据占用8个字节,其取值范围介于±4.940656 458412 47E-324~±8.988465 674311 5E+307之间。

10.浮点型数据

浮点型数据(Float)功能上与数值型数据等价,用F表示。Visual FoxPro提供浮点型数据主要是为了保持与其他开发软件和系统的兼容性。浮点型数据在内存中占8个字节,在表中占1~20个字节,其取值范围为-0.999999 999 9E+19~+0.999999 999E+20。

11.整型数据

整型数据(Integer)用于存储无小数部分的数值,只能用于数据表中的字段,用I表示。整型数据占用4个字节,以二进制数的形式存储,不像Numeric那样需转换成ASCII码存储,可以提高程序的性能。整数型数据的取值范围为-214748 364 7~214748 364 6。

12.二进制大型对象

二进制大型对象(Blob)型数据是用来存储各种ASCII文本、可执行文件、字节流,以及具有不确定长度的二进制数据,用W表示。Blob型数据在表中占4个字节,范围受可用内存的限制或2GB文件大小限制。

Blob型数据为在SQL Server中存储图像提供了更多的便利。要存储固定长度的二进制值,可以使用Varbinary型数据。

13.可变型数据

可变型数据(Variant)是一种特殊的数据类型,除了固定长度的字符串外,Variant中可以包含任意类型的数据,还可以被设置为Empty、Error、和NULL等特殊值。

此外,Visual FoxPro 9.0还提供了Character Binary、Integer Autoinc、Memo Binary、Varchar、Varchar Binary、Varbinary和对象等类型数据。限于篇幅,这里不进行讨论,有兴趣的读者可查阅相关手册。

1.4.2 数据存储

在Visual FoxPro中,用于存储数据的常量、变量、数组、对象属性和表字段统称为数据存储容器,它决定了数据的类型和存储方法。

1.常量

常量是指在整个程序的执行过程中其值固定不变的量。常量中能包含任意数据类型,应用程序的操作不能修改常量的值。Visual FoxPro中常用的常量包括:数值型、字符型、逻辑型、日期型、日期时间型和货币型。

(1)数值型常量

数值型常量可以是十进制整数或实数,也就是一般意义上的常数。数值型常量的长度包括整数位数、小数点和小数位数。例如,50、-100、3.141592 6等都是数值型常量。

实数有两种表示方法,一种是带小数的实数(如3.14),另一种是用科学计数法(即指数形式)表示的实数(如1.23E+15,它表示1.23×1015),一般用于数据位数较多的实数。

(2)字符型常量

字符型常量是用定界符括起来的字符串,定界符可以是西文单引号、双引号或方括号三种之一,字符串由ASCII码中可打印的字符和汉字组成。例如,"X= "、'123'、[数据库]等都是字符型常量。

字符型常量要注意空格串和空串的区别:" "是含有3个空格的空格串,而""是长度为零的空串。

定界符必须在英文的状态下输入并成对出现。当字符串本身包含某种定界符时,要选择另两种定界符作为该字符串的定界符,以示区别,例如,'She said: " I am a student." '。

(3)逻辑型常量

逻辑型常量用圆点定界符括起来,只有真和假两个值。逻辑真常量可用.T.、.t.、.Y.、.y.表示;逻辑假常量则可用.F.、.f.、.N.、.n.表示。

(4)日期型常量

日期型常量用来表示一个确切的日期,在默认情况下,用严格的日期格式{^yyyy-mm-dd}表示,例如,{^2008-7-30}、{^1999-12-30}等。日期型常量还可以用函数CTOD("07/30/08")表示,它表示将字符型常量"07/30/08"转换成日期型常量。通常,日期型数据有传统和严格两种格式。

① 传统日期格式

系统默认日期型数据为美国日期格式“mm/dd/yy”,可以借助SET DATE TO等命令改变其设置。例如,{07/30/08}为一个日期型常量,在美国格式时表示2008年7月30日。

② 严格日期格式

用{^yyyy-mm-dd}格式书写的日期型数据能表达一个确切的日期,它不受SET DATE TO等语句设置的影响。例如,{^2008-07-30}为严格日期常量。

应当注意,系统在默认情况下只接受严格日期常量,如果要接受传统日期格式表示的常量,需要通过下面的命令改变。

命令格式:

            SET STRICTDATE TO [0/1/2]

命令功能:用于设置是否对日期格式进行检查。

0表示不进行严格的日期格式检查,目的是与早期Visual FoxPro兼容;

1表示进行严格的日期格式检查,它是系统默认的设置;

2表示进行严格的日期格式检查,并且对CTOD( )和CTOC( )函数的格式也有效。

【例1.1】用不同日期格式显示系统当前日期。

在命令窗口中输入以下命令(&&后的内容为注释,可以不输入):

            ?DATE()                 && 调用系统日期函数
            SET DATE TO YMD         && 设置年月日格式
            ?DATE()
            SET CENTURY ON          && 设置年份为4位数字
            ?DATE()
            SET MARK TO "-"         && 设置分隔符为"-"
            ?DATE()
            ?{^2008-07-31}          && 按严格日期格式输出日期常量
            SET STRICTDATE TO 0     && 不进行严格日期检查
            SET DATE TO MDY         && 恢复美国日期格式
            SET MARK TO             && 恢复默认日期分隔符"/"
            SET CENTURY OFF         && 恢复年份为2位数字
            ?{07/31/08}             && 按传统日期格式输出日期常量
            ?CTOD("07/31/08")       && CTOD函数输出日期常量

上述命令的显示结果为(设当前系统日期是2008-07-31):

            07/31/08                && 按默认的美国日期格式显示
            08/07/31                && 按年月日格式显示
            2008/07/31              && 按年份4位数字显示
            2008-07-31              && 按日期分隔符"-"显示
            2008-07-31              && 按严格日期格式显示
            07/31/08                && 按传统日期格式显示
            07/31/08                && 通过CTOD函数转换显示

(5)日期时间型常量

日期时间型常量包括日期和时间两部分,必须用一对花括号将数据括起来。它也有传统和严格两种格式,例如,{07/30/08 10:12:25am}和{^2008-07-30 10:12:25am}。

(6)货币型常量

货币型常量用来表示货币值,其书写格式与数据型常量类似,只要在数值前面加一个“$”符号即可。例如,货币常量$123.23表示123.23元。

货币型常量在存储和计算时,系统自动四舍五入到小数4位,例如$58.12345,计算结果为$58.1235。

2.变量

变量是指在程序执行过程中其值是可以改变的量。变量实际上是用标识符命名的存放数据的计算机内存单元。变量有变量名、变量值、变量类型、变量长度、变量作用域等属性。Visual FoxPro的变量可分为字段变量和内存变量两种。内存变量又分为一般内存变量、系统内存变量和数组变量。

(1)变量的命名

变量名是用来标识变量的符号,每个变量都有一个名称。变量的命名遵守以下规则:

① 由字母、汉字、数字和下划线组成,且必须以字母、汉字或下划线开头;

② 长度为1~128个字符,每个汉字为2个字符;

③ 变量名命名应有意义,且不能与Visual FoxPro的关键字相同。

(2)字段变量

字段变量将数据表中的字段名作为变量,它是在建立数据表时定义的。每个数据表都包含若干字段变量,其值随着数据表中记录的变化而改变。要使用字段变量,必须先打开包含该字段的表文件。有关字段变量的定义和使用将在第2章中详细介绍。

(3)内存变量

我们通常所说的内存变量主要是指一般内存变量。内存变量独立于数据文件,存放在主机的内存储器中,是一种临时的工作单元,使用时定义,使用完成后可以释放,常用来保存数据或程序运行的结果。内存变量的数据类型取决于变量值的类型,不同时刻可以将不同类型的数据赋给同一个内存变量。内存变量常用的数据类型有:字符型(C)、数值型(N)、逻辑型(L)、日期型(D)、日期时间型(T)和货币型(Y)。

应当注意:当字段变量与内存变量同名时,字段变量的优先级高于同名的内存变量。为了强调是内存变量,可以在内存变量名的前面冠以前缀“M.”或“M->”,以示区别。

① 建立内存变量

变量的定义是通过赋值语句实现的。这里介绍赋值语句的两种格式:

格式1:

            <内存变量名>=<表达式>                 &&"="是赋值语句

格式2:

            STORE <表达式> TO <内存变量名表>      &&STORE是赋值语句

功能:在定义内存变量的同时确定内存变量的值和类型。

说明:

定义内存变量、赋值和确定变量的类型在同一个命令中完成。

语句中的<表达式>可以是一个具体的值,也可以是一个表达式。如果是表达式,系统将先计算表达式的值,再将此值赋给变量,即赋值符具有计算和赋值的双重功能。

格式1一次只能给一个内存变量赋值,而格式2可以同时给多个变量赋相同的值,此时,变量之间必须用逗号分隔开。

【例1.2】“=”赋值语句的应用。

            X=5
            X=X+1
            ?"X=",X

显示结果:X=6

注意:X=X+1在数学上是不成立的,这里的“=”不是数学上的等于而是赋值,是将原来X(为5)的值加1后再赋给X,使X变为6。

【例1.3】变量的类型可以有多种。

            STORE  5 TO X1,X2
            STORE "王强" TO姓名
            M=5*X1+X2
            性别=.T.
            DVAR={^2008-08-08}

上述命令用“=”和STORE为变量赋值,而且变量值的数据类型可以有多种。

② 显示内存变量

如果需要了解内存变量的名称、类型和值等信息,可用内存变量显示语句。

格式1:

            LIST / DISPLAY  MEMORY  [LIKE <通配符>]
            [TO PRINTER/TO FILE <文件名>]

功能:显示内存变量的当前信息,包括变量名、属性、数据类型、当前值及总体使用情况等。

说明:

LIST命令连续滚动显示所有的内存变量,可以用Ctrl+S组合键暂停显示,再按任意键继续。DISPLAY分屏显示,一屏显示完后,屏幕提示“按任意键继续”,继续显示下一屏信息。

LIKE <通配符>可用于有选择地显示部分和全部内存变量。通配符有两个,“*”代表所有的字符,“?”代表任意一个字符。

TO PRINTER /TO FILE <文件名>可以将查看的结果通过打印机输出或存入指定的文件。

【例1.4】内存变量赋值并显示。

            A1=10
            A2="VFP数据库管理系统"
            A3=.T.
            A4=CTOD("08/08/08")
            LIST MEMORY LIKE A*        &&显示以A开头的内存变量

显示结果如图1-16所示,包括变量名、变量属性、变量类型和变量值4部分内容。

active=true

图1-16 显示以A开头的内存变量

格式2:

            ?/ ?? [<表达式表>]

功能:换行在下一行起始处/在当前行的光标所在处输出各表达式的值。

说明:

无论有没有指定表达式表,“?”都会输出一个回车换行符。如果指定了表达式表,则各表达式值将在下一行的起始处以标准格式输出各项表达式值。

“??”不会输出一个回车换行符,各表达式值在当前行的光标所在处直接输出。

【例1.5】显示输出上例内存变量A1、A2和A3赋值后的结果。

            ?A1,A2
            ??A3

结果为:

            10  VFP数据库管理系统.T.

③ 保存和恢复内存变量

内存变量存放在内存中,一旦退出Visual FoxPro或遇关机、断电,内存变量将会消失。如果需要保存,则用SAVE命令把它们保存到磁盘的内存变量文件中。

格式:

            SAVE TO <内存变量文件名> [ALL LIKE /EXCEPT <通配符>]

功能:将所选择的内存变量保存到指定的内存变量文件中。

说明:内存变量文件的扩展名为.mem。使用SAVE TO省略可选项,则将所有内存变量(系统内存变量除外)存放到内存变量文件中。

【例1.6】将以字母A开头的所有内存变量保存到内存变量文件A1.MEM中。

            SAVE TO A1 ALL LIKE A*

结果在磁盘的当前文件夹下会出现一个名为A1.MEM的文件。如果需要恢复这些内存变量,可使用RESTORE语句。

格式:

            RESTORE FROM <内存变量文件名> [ADDITIVE]

功能:将保存在内存变量文件中的内存变量恢复到计算机内存中。

说明:若不使用[ADDITIVE]选项,则该命令先清除内存中的所有内存变量,再将内存变量文件中的内存变量恢复到内存中。若使用[ADDITIVE]选项,则不清除内存中现有的内存变量,将内存变量文件中的内存变量追加到内存中。

【例1.7】清除内存中的所有内存变量,将内存变量文件A1.MEM中的内存变量恢复到内存中,并显示输出。

            RESTORE FROM A1
            LIST MEMORY LIKE A*

④ 清除内存变量

为节省存储空间,可通过删除不用的内存变量来释放其所占用的存储空间。

格式1:

            CLEAR MEMORY

格式2:

            RELEASE <内存变量表>

格式3:

            RELEASE ALL [EXTENDED][LIKE /EXCEPT <通配符>]

功能:从内存中清除所指定的内存变量,并释放相应的内存空间。

说明:格式1用于清除除系统内存变量外的所有内存变量。格式2用于清除<内存变量表>列出的内存变量。格式3又可以分为4种情况:

RELEASE ALL清除所有的内存变量,作用同CLEAR MEMORY;

RELEASE ALL [EXTENDED]在人机对话状态下作用与格式1相同,若出现在程序中,则应该加入EXTENDED,否则不能删除公共内存变量;

RELEASE ALL [LIKE <通配符>]清除所有与<通配符>相匹配的内存变量,通配符的含义与DISPLAY MEMORY命令相同;

RELEASE ALL [EXCEPT <通配符>]清除所有与<通配符>不匹配的内存变量。

(4)数组变量

数组是一组有序的数据值的集合,其中的每个数据值称为数组元素,每个数组元素可以通过一个数值下标引用。若数组元素只有一个下标,则称为单下标变量,由单下标变量组成的数组称为一维数组。若数组元素有两个下标,则称为双下标变量,其中第一个叫做行下标,第二个叫做列下标,由双下标变量组成的数组称为二维数组。

与一般内存变量不同,数组在使用前必须先定义,规定数组是一维还是二维,以及数组名和数组大小。数组大小由下标值的上、下限决定,下限规定为1。

格式:

            DIMENSION /DECLARE <数组名1>(<数值表达式1>[,<数值表达式2>])
                      [,<数组名2>(<数值表达式1>[,<数值表达式2>]),…]

功能:建立若干个一维数组和二维数组。

说明:

① 可以用DECLARE或DIMENSION命令建立多个数组。

例如:

            DECLARE A(10),B(2,3)        &&建立一维数组A(10)和二维数组B(2,3)

该命令建立了一个一维数组A(10)。一维数组A(10)有10个数组元素A(1),A(2),…,A(10),它们都是单下标变量,下标从1开始、到10为止。该命令还建立了一个二维数组B(2,3)。它是一个2行3列的数组,6个数组元素分别为:B(1,1)、B(1,2)、B(1,3)、B(2,1)、B(2,2)、B(2,3),它们都是双下标变量。括号内的数值,既说明了数组元素的个数,又表示该数组元素下标的最大值。在使用数组时,下标不能超界,否则会产生错误。简单变量名、一维数组名和二维数组名不能重名,否则也会产生错误。

② 在建立数组后,数组的各个元素的初始值均为逻辑假.F.。

③ 同一数组的各个元素的数据类型可以不相同。它的类型由最近一次的STORE或SCATTER等赋值命令决定。二维数组中的元素在内存中是按行的顺序存放的,二维数组也可以当做一维数组去存取。

④ 在给数组变量赋值时,如果未指明下标,则对该数组中所有元素同时赋予同一个值。

⑤ 在引用数组时,如果未指明下标,则为该数组的第一个元素。

【例1.8】数组变量的定义与赋值。

            DIMENSION X(5),Y(2,3)   &&定义一维数组X和二维数组Y
            Y=10                    &&将10赋给Y数组的所有元素
            STORE 1 TO X(1)         &&为数组赋给不同类型的数据
            X(2)=X                  &&将X数组第一个元素,即X(1)的值赋给X(2)
            X(3)="奥运会"
            X(4)={^2008-08-08}
            X(5)=.T.
            ?Y(5)                   &&二维数组可以当做一维数组去存取,即显示Y(2,2)内容

(5)系统内存变量

系统内存变量是Visual FoxPro自动创建并维护的内存变量。在默认情况下,它们的属性是PUBLIC(公用变量),也可以声明成PRIVATE(私有变量)。系统内存变量用来保持系统固有信息(例如,文本报表应打印的备份数等)。系统内存变量的名称是通过一个前导下划线(如_PCOPIES)来识别的。可以像使用普通内存变量那样使用系统内存变量,但是因为它们由Visual FoxPro预先定义好了,所以一个系统内存变量的类型是固定的。

1.4.3 表达式

用运算符将常量、变量和函数等连接起来构成的有意义的式子称为表达式。单独的常量、变量和函数是表达式的特例,也是表达式。运算是对数据进行加工的过程,描述各种不同运算的符号称为运算符。表达式进行运算后都将返回一个确定的值,根据该值的数据类型,可以将表达式分为数值表达式、字符表达式、日期表达式、逻辑表达式、关系表达式等。例如,计算半径为R的圆周长表达式2*PI( )*R就是一个数值表达式。

1.数值表达式

数值表达式是由数值运算符将常数、变量和函数连接起来构成的有意义的式子,其运算结果为数值型数据。数值运算符及其运算的优先顺序如下:

() 括号

+ 单目运算符正号

- 单目运算符负号

^或** 乘方

* 乘号

/ 除号

% 取模(余数)

+ 加号

- 减号

各个运算符号进行运算的优先级与数学运算规则相同,其中乘与除、加与减是同级运算,运算时按照从左至右的顺序进行。当我们将数学表达式转换成Visual FoxPro数值表达式时,要注意下列规则。

① 每个符号占1格,每个符号都必须一个一个地并排写在同一横线上,不能有上标和下标。例如,X3要写成X^3,X1+X2必须写成X1+X2。

② 所有运算符都不能省略。例如,2XY必须写成2*X*Y。

③ 所有的括号都是圆括号。例如,5[X+2(Y+Z)]必须写成5*(X+2*(Y+Z))

④ 在转换时,要保持原有数学表达式的优先级,必要时要添加圆括号。例如,分式active=true必须写成(a+b)/(c-d)。

⑤ 表达式中不能出现非Visual FoxPro字符。例如,2πr应写成2*PI( )*R。

2.字符表达式

字符表达式是由字符运算符将常数、变量和函数连接起来构成的有意义的式子,其运算结果是字符串。字符运算符有以下两种。

+:将运算符两边的字符串连接起来,形成一个新的字符串。

-:将两个字符串连接时,把第一个字符串的尾部空格移到后面字符串的尾部。

【例1.9】字符表达式示例。

            X="数据库  "
            Y="基础"
            ?X+Y,X-Y

结果显示为:

            数据库  基础  数据库基础

3.日期表达式

日期表达式是由算术运算符(+或-)将数值表达式、日期型常量、变量和函数连接起来构成的有意义的式子。日期型数据比较特殊,其运算结果可能是日期型或数值型数据。

日期型表达式的运算有3种情况:

① 两个日期型数据可以相减,结果是一个数值,表示两个日期之间相差的天数;

② 日期型数据加上一个整数,其结果为一个新的日期;

③ 日期型数据减去一个整数,其结果为一个新的日期。

【例1.10】日期表达式示例。

            ?{^2008-08-08}-{^2008-08-01}
            ?{^2008-08-08}+31
            ?{^2008-08-08}-31

显示结果为:

            7                       &&两日期的天数之差
            09/08/08                &&新的日期,美国日期格式
            07/08/08                &&新的日期

4.关系表达式

关系表达式是由关系运算符将数值、字符、日期和逻辑表达式连接起来构成的有意义的式子,其运算结果是逻辑型数据。关系运算符两边的表达式必须属于同一种类型。

关系运算符有以下8种,其优先级别相同:

< 小于

<= 小于等于

> 大于

>= 大于等于

= 等于

<>或#或!= 不等于

$ 字符串包含

== 字符串精确比较

(1)同类型的数据进行比较

数值型数据按其值的大小进行比较,字符串“从左向右”按其对应的ASCII码值的大小进行比较,汉字按它的拼音或笔画(汉字机内码)进行比较。关系运算的结果是逻辑真(.T.)或逻辑假(.F.)。

【例1.11】关系表达式示例。

            ?3+5>7*2                             &&结果为.F.
            ?{^2008-07-21}>{^2007-07-21}+5        &&结果为.T.
            ?"bcd">"cbd"+"AB"                     &&结果为.F.
            ?"计算机">"数据库"                    &&结果为.F.
            ?.F.>.T.                              &&结果为.F.

(2)字符串包含运算符的使用

格式:

            <字符串1> $ <字符串2>

功能:当<字符串2>包含<字符串1>时,其结果为.T.;当<字符串2>不包含<字符串1>时,其结果为.F.。

(3)字符串精确比较

在SET EXACT OFF环境下,当用“=”号比较两个字符串是否相等时,并不一定能确定左右两个字符串完全一样,因为在逐一比较每一个字符时,当右边字符串的所有字符比较完后,若还未发现不相同的字符,则认为二者相等。这就是所谓的“左匹配”原则。例如:

            ?'ABC'='ABCD','ABCD'='ABC'
            .F.            .T.

在SET EXACT ON环境下的“=”号,相当于字符串精确比较运算符“= =”,即“=”两边字符串必须逐个字符都相等,结果才为.T.。

5.逻辑表达式

逻辑型表达式是由逻辑运算符将关系表达式、逻辑常量、变量和函数连接起来构成的有意义的式子,其运算结果是逻辑值。

逻辑运算符有3种,按优先级顺序排列如下:

            .NOT.或NOT或!      逻辑非
            .AND.或AND          逻辑与
            .OR.或OR            逻辑或

令A、B是两个逻辑型数据,则3个逻辑运算符的作用可以用表1-3来表示。

表1-3 逻辑运算的规则

active=true

【例1.12】逻辑表达式示例。

            NOT 10-6>10                 &&运算结果为 .T.
            5>4 AND 2>7                 &&运算结果为 .F.
            8<>5 OR NOT 10>12+3         &&运算结果为 .T.

各种运算符的优先级别由高到低分别为:括号、数值运算符、字符运算符、日期运算符、关系运算符、逻辑运算符。所有同一级命令的运算都是从左到右进行的,括号内的运算优先执行,嵌在最内层括号内的运算首先进行,然后依次由内向外执行,如图1-17所示。

active=true

图1-17 运算符优先级

6.计算表达式命令

格式:

            =<表达式1>[,<表达式2>…]

功能:计算一个或多个表达式的值。

说明:该命令的作用是计算一个或多个表达式的值,并不返回其值。常用于需要执行一个Visual FoxPro函数或用户自定义函数,但并不需要将该函数的返回值赋给一个内存变量、数组或数组元素的情况。例如,=MESSAGEBOX("计算表达式") 是正确的命令格式。

7.空值(NULL)

空值是计算机语言中的一个重要概念,空值表示该值目前未知,与数字0、空格字符、逻辑假不同。数字0、空格、逻辑假也是值,只不过是特殊值。

例如,在填写某表格时,某人的年龄不知道或记不清了,则不能在该人的年龄栏中填写数字0,因为数字0与未知有着本质区别。对于字符型和逻辑型也一样,若某人的出生地不详,用空格代替将来就不便于处理。如果用逻辑值代表性别,逻辑假代表女,当不知道某人性别时,若用假代替,就等于此人的性别是女。

空值具有以下特性:

① 空值表示没有任何值;

② 空值与空字符串或空格串不同;

③ 空值排序时在其他数据前面;

④ 在计算中或大多数函数中均可使用空值。

1.4.4 常用函数

Visual FoxPro的函数有两种,即系统函数和用户自定义函数。系统函数是系统为实现一些特定功能而设置的内部程序,作为系统的一部分供用户使用,并由此为程序设计和软件开发提供了强大的支持。Visual FoxPro提供了500多个系统函数,可以实现500多个不同于命令的特殊功能。用户自定义函数是用户根据需要自行编写的函数。按Visual FoxPro函数的功能和用途,可将系统函数分为10余种类型,限于篇幅,本节只介绍系统函数中最常用函数,详细情况请查阅相关手册。

函数的基本形式为:

            函数名([<操作数表达式>])

函数的操作数有3种情况:

① 有可能无操作数,如DATE( )函数;

② 有可能由用户输入操作数,如GETFILE( )函数;

③ 多数函数的操作数是由用户指定的,如用户不指定,系统就按有关规定给出。

对于后两种情况,输入的操作数就相当于一般函数的自变量。Visual FoxPro对每个函数自变量的个数、类型及函数值的类型都有明确的规定,在使用函数时必须遵循这些规定。学习函数,必须注意函数自变量的类型及函数结果的数据类型。

1.数值函数

(1)取整函数

格式:

            INT(<数值表达式>)
            CEILING(<数值表达式>)
            FLOOR(<数值表达式>)

功能:

INT该函数返回<数值表达式>的整数部分(舍尾);

CEILING返回不小于<数值表达式>的最小整数;

FLOOR返回不大于<数值表达式>的最大整数。

例如:

            ?INT(3.14),INT(-3.14),CEILING(3.14), FLOOR(3.14)

结果为:

            3     -3     4     3

(2)四舍五入函数

格式:

            ROUND(<数值表达式1>,<数值表达式2>)

功能:对<数值表达式1>进行四舍五入操作,保留<数值表达式2>位小数。若<数值表达式2>为负数,则对小数点前第<数值表达式2>位四舍五入。

例如:

            ?ROUND(1054.1972,2),ROUND(1054.1972,0),ROUND(1054.1972,-2)

结果为:

            1054.20     1054     1100

(3)取模函数

格式:

            MOD(<数值表达式1>,<数值表达式2>)

功能:返回<数值表达式1>除以<数值表达式2>的余数。若<数值表达式1>与<数值表达式2>同号,则返回值的符号为<数值表达式2>的符号;若<数值表达式1>与<数值表达式2>异号,则返回值为<数值表达式1>除以<数值表达式2>的余数(余数符号与<数值表达式1>相同)加上<数值表达式2>的值。该函数的功能与运算符%相同。

例如:

            ?MOD(5,3),MOD(-5,-3),MOD(-5,3),MOD(5,-3)

结果为:

            2     -2     1     -1

(4)最大、最小值函数

格式:

            MAX/ MIN (<表达式1>,<表达式2>[,<表达式3>…] )

功能:返回若干个表达式中的最大或最小数。表达式可以是各种数据类型,但在同一个函数中的表达式的类型应一致。返回值的数据类型与表达式类型一致。

例如:

            ?MAX(20,5*8,-70/2),MIN(20,5*8,-70/2)

结果为:

            40     -35

(5)绝对值函数

格式:

            ABS(<数值表达式>)

功能:返回<数值表达式>的绝对值。

(6)平方根函数

格式:

            SQRT(<数值表达式>)

功能:返回<数值表达式>的算术平方根,其中<数值表达式>的值不能为负。

(7)指数函数

格式:

            EXP(<数值表达式>)

功能:返回以e为底的指数值,<数值表达式>为e的指数部分。

例如:

            ? ABS(30-75), SQRT(64),EXP(0),EXP(1)

结果为:

            45     8.00     1.00     2.72

(8)对数函数

格式:

            LOG(<数值表达式>)

功能:返回<数值表达式>的自然对数的值。

(9)符号函数

格式:

            SIGN(<数值表达式>)

功能:根据<数值表达式>的值为正、零、负数分别返回1、0、-1。

例如:

            ?SIGN(3.14), SIGN(0), SIGN(-3.14)

结果为:

            1     0     -1

(10)随机函数

格式:

            RAND([<数值表达式>])

功能:返回一个0~1之间的随机数。<数值表达式>是随机数“种子”,如果<数值表达式>为负数,则由系统时钟产生“种子”。为了获得一组真正的随机序列,可以在第一个RAND中使用负参数,而以后的RAND( )不用任何参数。如果<数值表达式>是相同的正数,则总是产生相同的随机序列。例如,要产生A~B之间的随机实数,可以用表达式(B-A)* RAND( )+A实现。

例如:

            ?RAND(),RAND(-1)

结果可能为:

            0.49     0.24

(11)正弦函数

格式:

            SIN(<数值表达式>)

功能:返回<数值表达式>所表示弧度的正弦值。

(12)π值函数

格式:

            PI()

功能:返回圆周率π的值。

(13)角度转变为弧度函数

格式:

            DTOR(<数值表达式>)

功能:将<数值表达式>由角度转变为弧度。

例如:

            ?SIN(PI()/2), SIN(DTOR(90))

结果为:

            1.00     1.00

2.字符函数

(1)宏代换函数

格式:

            &<字符型内存变量>[.<字符表达式>])

功能:用字符型内存变量的“值”代替内存变量的“名”。宏代换的作用范围是从符号“&”起,直到遇到一个圆点符“.”或空白为止。

例如:

            A='1+2'
            ?&A                         &&结果为数值3
            STORE "ZG.DBF" TO X
            USE &X                      &&相当于执行指令USE ZG.DBF

注意,宏代换函数可以改变数据类型,将某些字符型常量转变为逻辑型、数值型。宏代换函数的替换是间接的。

例如:

            X=".T."
            Y="1"
            A="DATE()"
            B="A"
            ?3>2.AND.&X,&A+&Y           &&结果由.T.和系统日期加1组成

(2)表达式计算函数

格式:

EVALUATE(<字符表达式>)

功能:返回<字符表达式>的值。EVALUATE( )函数具有与&类似的功能。

例如:

            A="9*5"
            ?EVALUATE(A)

结果为:

            45

(3)名表达式

格式:

         (<字符表达式>)

功能:名表达式也具有与上述&和EVALUATE( )函数类似的功能。

说明:所谓名表达式,就是用一对括号将名称括起来,以实现替换功能。Visual FoxPro的许多命令与函数都要指定一个名称以便让其了解处理的对象,这些名称是文件名、字段名、窗口名、菜单名、数组名、内存变量名等。名不是变量或字段,但可以定义一个名表达式,以代替同名的变量或字段的值。

例如:

            A="1+2"
            B="A"
            B,(B),&B,EVALUATE(&B)

结果为:

            A     A     1+2     3

                X="职工.DBF"
                USE(X)             &&相当于执行了USE职工.DBF命令
                Y="姓名"
                REPLACE (Y) WITH  "李明"

上述命令的结果是打开“职工”表后,将第一条记录的姓名字段的值用“李明”替换。

(4)删除空格函数

格式:

            ALLTRIM(<字符表达式>)
            LTRIM(<字符表达式>)
            TRIM/RTRIM(<字符表达式>)

功能:ALLTRIM的功能是删除<字符表达式>中的前后空格,LTRIM的功能是删除字符串前导空格,而TRIM的功能是删除字符串尾部空格。

例如:

            ? ALLTRIM("  数据库  ")+LTRIM("  应用")+TRIM("基础  ")

结果为:

            数据库应用基础

(5)取左子串函数

格式:

            LEFT(<字符表达式>,<数值表达式>)

功能:从<字符表达式>最左边开始截取<数值表达式>个字符。若<数值表达式>的值大于<字符表达式>的长度,则该函数值返回整个字符串;若<数值表达式>小于或等于零,则该函数返回一个空串。

(6)取右子串函数

格式:

            RIGHT(<字符表达式>,<数值表达式>)

功能:从<字符表达式>最右边开始截取<数值表达式>个字符。

(7)取子串函数

格式:

            SUBSTR(<字符表达式>,<数值表达式1>[,<数值表达式2>])

功能:从<字符表达式>的<数值表达式1>开始截取<数值表达式2>个字符。若省略为<数值表达式2>或其值大于<字符表达式>长度,则将截取<数值表达式1>指定位置起至最后一个字符为止的子串。当<数值表达式1>的值为0时,输出空串。

例如:

            X="08/09/08"
            ?RIGHT(X,2)+ "年"+LEFT(X,2)+"月"+ SUBSTR(X,4,2)+"日"

结果为:

            08年08月09日

(8)子串检索函数

格式:

            AT(<字符表达式1>,<字符表达式2>[<数值表达式>])

功能:返回<字符表达式1>在<字符表达式2>中第<数值表达式>次出现的位置。若<字符表达式1>不在<字符表达式2>中,则返回0;若不给出<数值表达式>,则隐含为1。输出值的类型为数值型。

例如:

            ?AT("Fox","Visual FoxPro9.0")

结果为:

            8

(9)字符串替换函数

格式:

            STUFF(<字符表达式1>,<数值表达式1>,<数值表达式2>,<字符表达式2>)

功能:用<字符表达式2>替换<字符表达式1>中的一部分字符。<数值表达式1>指定替换的起始位置,<数值表达式2>为要替换的字符个数。

例如:

            ?STUFF("浙江财经学院",9,4,"大学")

结果为:

            浙江财经大学

(10)字符串长度函数

格式:

            LEN(<字符表达式>)

功能:返回<字符表达式>的长度。输出值的类型为数值型。

例如:

            ?LEN("Visual FoxPro 9.0"),LEN("数据库")

结果为:

            16     6

(11)空格函数

格式:

            SPACE(<数值表达式>)

功能:返回<数值表达式>个空格。输出值的类型为字符型。

例如:

            ?"浙江"+SPACE(6)+"杭州"

结果为:

            浙江      杭州

(12)字符重复函数

格式:

            REPLICATE(<字符表达式>,<数值表达式>)

功能:将<字符表达式>重复<数值表达式>次输出。输出值的类型为字符型。

例如:

            ?REPLICATE("*",10)

结果为:

            **********

3.日期时间函数

(1)系统日期函数

格式:

            DATE( )

功能:返回当前系统日期。输出值的类型为日期型。

(2)系统时间函数

格式:

            TIME([<数值表达式>])

功能:以时、分、秒(hh:mm:ss)返回当前系统时间。如果包含有<数值表达式>,则返回的时间包含百分之几秒,<数值表达式>可以是任何值。输出值的类型为字符型。

(3)日期时间函数。

格式:

            DATETIME()

功能:该函数返回当前系统日期时间。输出值的类型为日期时间型。

(4)年份函数

格式:

            YEAR(<日期表达式/日期时间表达式>)

功能:返回<日期表达式>或<日期时间表达式>的年份的数值。输出值的类型为数值型。

(5)月份函数

格式:

            MONTH(<日期表达式/日期时间表达式>) /CMONTH(<日期表达式/日期时间表达式>)

功能:MONTH( )函数返回<日期表达式>或<日期时间表达式>的月份数值,输出值的类型为数值型。CMONTH( )返回<日期表达式>或<日期时间表达式>的月份的名称,输出值的类型为字符型。

(6)星期函数

格式:

            DOW(<日期表达式/日期时间表达式>)/CDOW(<日期表达式/日期时间表达式>)

功能:DOW( )函数返回<日期表达式>或<日期时间表达式>的星期几的数值,输出值的类型为数值型。星期日是一个星期的第一天。CDOW( )函数返回<日期表达式>或<日期时间表达式>的星期几的名称,输出值的类型为字符型。

(7)日期函数

格式:

            DAY(<日期表达式/日期时间表达式>)

功能:该函数返回<日期表达式>或<日期时间表达式>日期的数值,输出值的类型为数值型。

例如:

            ?YEAR(DATE()),MONTH(DATE()),DAY(DATE()),DOW(DATE()),CDOW(DATE())

结果为:

            2008     08     09     7     星期六

4.转换函数

(1)数值型转换成字符型函数

格式:

            STR(<数值表达式1>[,<数值表达式2>[,<数值表达式3>]])

功能:将<数值表达式1>的值转换成字符型数据。<数值表达式2>决定转换字符串的长度,若其大于实际数值的位数,则在前面补空格;若其小于实际数值的位数,则输出指定个数的“*”号。<数值表达式3>指定小数位数,若位数大于实际数值的小数位数,则在后面补0;若位数小于实际数值的小数位数,则四舍五入处理。若省略<数值表达式3>,则只有整数部分;若同时省略<数值表达式2>,则在字符串前补相应位数的空格使之满10位。

例如:

            ?STR(123.4,6,2),STR(123.4,5),STR(123.4),STR(123.4,2)

结果为:

            123.40     123     123     **

(2)字符转换成数值函数

格式:

            VAL(<字符表达式>)

功能:将字符型数据转换为数值型数据。转换从第一个数字字符开始,直到遇到非数字字符为止,可以包含负号。小数位由SET DECIMALS TO命令决定,默认值为2。

例如:

            ?VAL("-123.4567"),VAL("12ABCD.3456")

结果为:

            -123.46     12.00

(3)字符转换ASCII码

格式:

            ASC(<字符表达式>)

功能:返回<字符表达式>中首字符的ASCII码的十进制数。输出值的类型为数值型。

(4)ASCII码转字符函数

格式:

            CHR(<数值表达式>)

功能:把<数值表达式>的值转换为相应的ASCII码字符。输出值的类型为字符型。

例如:

            ?ASC("APPLE"),CHR(97)

结果为:

            65     a

(5)字母小写转大写函数

格式:

            UPPER(<字符表达式>)

功能:将<字符表达式>中所有小写字母转换成大写字母。

(6)字母大写转小写函数

格式:

            LOWER(<字符表达式>)

功能:该函数将<字符表达式>中所有大写字母转换成小写字母。

(7)字符转换日期函数

格式:

            CTOD(<字符表达式>)

功能:该函数把字符型日期转换成日期型日期,其中日期的默认格式为“mm/dd/yy”。

例如:

            ?CTOD("08/09/08")

结果为:

            08/09/08              &&美国日期格式代表2008年08月09日

(8)日期转换字符函数

格式1:

            DTOC(<日期表达式>[,1])

功能:该函数用于把日期型日期转换成字符型日期。[,1]是可选部分,若增加,则输出格式转换为年、月、日,年份为4位,输出值的类型为字符型。

例如:

            ?DTOC(DATE()),DTOC({^2008-08-09},1)

结果为:

            08/09/08     20080809

格式2:

            DTOS(<日期表达式/日期时间表达式>)

功能:将<日期表达式/日期时间表达式>中的日期按yyyymmdd格式返回字符串。该函输出值的类型为字符型。

说明:若要按日期型字段对表索引,此函数很有用。它与包含参数1的DTOC( )相同。用DTOS( ) 返回的字符串不受SET DATE或SET CENTURY的影响。

例如:设当前系统日期为2011-08-09

            ?DTOS(DATE()),DTOS({^2011-08-09}),DTOS(DATETIME())

结果为:

            20110809     20110809      20110809

5.数据表函数

(1)字段数函数

格式:

            FCOUNT([<工作区号>/<别名>])

功能:返回指定工作区中打开表的字段数。若指定工作区中没有打开的表,则返回0。输出值的类型为数值型。

例如:

            USE职工
            ? FCOUNT()         &&输出职工表的字段数
            9

(2)字段名函数

格式:

            FIELDS(<数值表达式>[<工作区号>/<别名>])

功能:返回指定工作区中第<数值表达式>个字段的名称。输出值的类型为字符型。

例如:

            USE职工
            ?FIELD(1)          &&职工表的第一个字段的名称
            职工号

(3)表头测试函数

格式:

            BOF([<工作区号>/<别名>])

功能:当把记录指针移到表文件的首记录之前(表头)时,该函数值为.T.,否则返回.F.。[<工作区号>/<别名>]用于指定工作区,默认为当前工作区。

(4)表尾测试函数

格式:

            EOF([<工作区号>/<别名>])

功能:当把记录指针移到表文件的末记录之后(表尾)时,该函数值为.T.,否则返回.F.。

(5)记录数测试函数

格式:

            RECCOUNT([<工作区号>/<别名>])

功能:返回指定工作区中表文件记录总数(包括已添加删除标记的记录)。若指定工作区中没有打开的表文件,则返回0。输出值的类型为数值型。

例如:

            USE职工
            ?RECCOUNT()         &&测试职工表的记录总数
            10

(6)记录号测试函数

格式:

            RECNO([<工作区号>/<别名>])

功能:返回指定表中当前记录号,如果指定的工作区没有打开的表文件,则返回0;若是一个空表,则RECNO( )=1,且EOF( )=.T.,BOF( )=.T.;若记录指针移到表尾(EOF( ) =.T.),则RECNO( )=总记录数+1;若记录指针移到表头(BOF( )=.T.),则RECNO( )的值与首记录号相同。输出值的类型为数值型。

6.测试函数

(1)数据类型测试函数

格式:

            TYPE(<表达式>)

功能:返回<表达式>的数据类型所对应的字母。它要求必须将<表达式>用字符定界符括起来。输出值的类型为字符型。

例如:

            ?TYPE("10+8"),TYPE(".F.OR.T."),TYPE("DATE()")

结果为:

            N     L     D

(2)新数据类型测试函数

格式:

            VARTYPE(<表达式>)

功能:返回<表达式>的数据类型所对应的字母,如表1-4所示。该函数的功能与TYPE相同,但不要求将<表达式>用字符定界符括起来,是TYPE功能的升级。输出值的类型为字符型。

例如:

            ?VARTYPE(10+8),VARTYPE(.F.OR.T.),VARTYPE(DATE())

结果为:

            N     L     D

表1-4 测试函数VARTYPE( )的返回值

active=true

(3)之间函数

格式:

            BETWEEN(<表达式1>,<表达式2>,<表达式3>)

功能:当<表达式1>大于或等于<表达式2>而又小于或等于<表达式3>时,函数返回.T.,否则返回.F.。

(4)空函数

格式:

            EMPTY(<表达式>)

功能:当<表达式>为空时,EMPTY( )函数返回.T.,否则返回.F.。<表达式>为空对于不同类型的数据有不同的定义,如表1-5所示。

表1-5 不同数据类型的“空”值定义

active=true

(5)查询结果函数

格式:

            FOUND([<工作区号>/<别名>])

功能:如果LOCATE、CONTINUE、SEEK、FIND等命令查找成功,则返回.T.,否则返回.F.,也可以通过EOF( )的状态来判断。

(6)文件测试函数

格式:

            FILE(<字符表达式>)

功能:测试指定的文件是否存在,其中文件名必须包含扩展名。若该文件存在,则返回.T.,否则返回.F.。

7.其他函数

(1)条件函数

格式:

            IIF(<逻辑表达式>,<表达式1>,<表达式2>)

功能:当<逻辑表达式>的值为.T.时,返回<表达式1>的值,为.F.时返回<表达式2>的值。它通常用于在简单条件表达式中替代IF-ENDIF的结构。输出值的类型由<表达式1>或<表达式2>确定。

例如:

            N=10
            ?IIF(N>9,STR(N,2),STR(N,1))

结果为:

            10

(2)自定义对话框函数

格式:

            MESSAGEBOX(<提示信息>[,<数值表达式> [,<标题信息>]])

功能:显示一个用户自定义对话框。输出值的类型为数值型。

说明:

① <提示信息>:指定在对话框中显示的字符串提示信息。如果要显示多行文字,可以在各行之间加CHR(13)。

② <数值表达式>:指定对话框的类型参数,包括按钮种类、图标类型及焦点选项按钮。对话框类型参数及选项如表1-6所示。省略<数值表达式>时,等同于指定<数值表达式>值为0。

表1-6 对话框类型参数及选项

active=true

③ <标题信息>:指定对话框标题栏中的字符串信息。若省略<标题文本>,标题栏中将显示“Microsoft Visual FoxPro”。

④ MESSAGEBOX( )的返回值标明选取了对话框中的哪个按钮。在含有取消按钮的对话框中,如果按下Esc键退出对话框,则与选取“取消”按钮一样,返回值为2。表1-7列出了MESSAGEBOX( )对应每个按钮的返回值。

表1-7 MESSAGEBOX( )对应每个按钮的返回值

active=true

例如:

            MESSAGEBOX("真的要退出吗?",4+32+0,"提示信息")

结果如图1-18所示。

active=true

图1-18 自定义对话框

1.4.5 Visual FoxPro命令格式与文件类型

1.命令格式

Visual FoxPro命令通常由两部分组成。第一部分是命令动词,也称关键字,它指明命令的功能;第二部分是包含几个跟随在命令动词后面的功能子句,这些子句通常用来对执行的命令进行一些限制性的说明。命令的一般形式为:

            命令动词 [<范围>][FIELDS <字段名表>][FOR <条件>][WHILE <条件>]
                    [TO PRINTER [PROMPT]/TO FILE <文件名>][NOOPTIMIZE] [OFF]

(1)命令动词

所有的命令都有命令动词,这是一个英文动词,它给出该命令应完成的功能。

(2)<范围>子句

表示命令对表文件进行操作的记录范围,一般有4种选择。

ALL:对表文件所有的记录进行操作。

NEXT n:对从当前记录开始的连续若干个指定的记录进行操作。

RECORD n:只对第n条记录进行操作。

REST:对从当前记录开始到表文件尾为止的所有记录进行操作。

其中,n为数值表达式的值。

(3)FOR <条件>和WHILE <条件>子句

FOR <条件>和WHILE <条件>子句均实现对表的记录筛选,完成关系的选择运算,但FOR子句与WHILE子句又有如下区别。

① FOR子句将范围内的所有满足条件的记录都作为操作对象;WHILE子句将范围内的满足条件的记录都作为操作对象,一旦遇到第1条不满足条件的记录时,就停止操作而不管后面是否还有满足条件的记录。

② 当<范围>子句省略时,FOR子句的操作对象是全部记录,WHILE子句的操作对象是REST。

③ 当一条命令中FOR、WHILE同时存在时,WHILE子句优先。

(4)FIELDS<字段名表>子句

该子句实现对表的字段筛选,完成关系的投影运算,用于规定当前处理的字段和表达式。省略时,显示除备注型、通用型字段以外的所有字段。

(5)OFF子句

不显示记录号。如果省略了OFF,就在每个记录前显示记录号。

(6)TO PRINTER [PROMPT]子句

将命令的结果定向输出到打印机。如果包含可选的PROMPT子句,则在打印开始前显示一个对话框,在此对话框中可以调整打印机的设置,包括打印的数目和打印的页数等。

(7)TO FILE<文件名>子句

将命令的结果输出定向到<文件名>指定的文件中。如果文件已经存在,且SET SAFETY设置为ON,将提示是否要改写此文件。

2.命令的书写规则

① 所有命令必须以命令动词开始,回车键结束。命令动词与子句之间、子句与子句之间、子句与保留字、各保留字之间都应至少有一个空格隔开。

② 所有功能子句在命令中出现的次序不影响命令的执行结果。

③ 命令中的所有符号除汉字外,都要在英文半角状态下输入。

④ 为了简化输入,Visual FoxPro 9.0具有智能提示功能,用户在正确输入命令动词或功能子句的前4个字符后按下空格键,系统会自动将命令或保留字补完整,同时显示命令或短语的全部参数选项,供用户选择。

⑤ 如果希望将一条命令分成若干行,只要换行后在新的一行开始处加一个分号“;”,再将后续的命令书写完整即可。

⑥ 命令一般式的符号约定如下。

< >:必选项,表示命令中必须选择该项,但内容可以根据需要确定。

[ ]:可选项,可根据实际需要选用或省略该项内容。

/ :任选项,根据实际需要任选且必选其中一项内容。

应当注意的是,这些符号只是在书面表示时使用,并非命令或函数的组成部分。

3.文件类型

Visual FoxPro的文件类型及其扩展名如表1-8所示。

表1-8 Visual FoxPro的文件类型

active=true