Visual FoxPro程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 VFP的语言成分

VFP的语言成分是指VFP的语言构成要素,这些要素主要有命令动词、函数、常量、变量、表达式等。

1.5.1 数据类型

1.VFP的主要数据类型

数据类型是数据的基本属性,不同的数据类型有不同的存储方式和运算规则。表1.2所示为VFP的主要数据类型。

表1.2 VFP的主要数据类型

2.VFP 9.0新增数据类型

为了更好地与SQL Server兼容,VFP 9.0新增了三种数据类型:VarChar、VarBinary和BLOB。这些数据类型可以在本地数据库中作为字段类型,也可由CAST()函数创建或者由远程数据取得。

(1)VarChar。它是一种字符型数据类型,但不像普通字符串那样长度不够的时候会以空格补齐,而是将其截取。这有点类似于SQL Server中的SET ANSI_PADDING ON命令。如果VarChar中本身有空格则不会被截取。假如在一个表达式中将VarChar和Character两种数据类型混合计算,那结果会是VarChar类型。

VarChar在VFP中是一个定长域,它的最大长度限定为255字节。但在SQL Server中,一个VarChar域的最大长度可以达到8000字节。

(2)VarBinary。VarBinary与VarChar有些类似,如果没有达到最大长度,多余的域不会被填充,而是被截取。但它们的本质区别在于FoxPro不会为VarBinary类型做任何代码页的转换。

(3)BLOB。BLOB数据类型没有固定的长度限制,与Memo类型有些相似。它被存储在以.FPT结尾的文件中,被.DBF文件引用。BLOB字段与Memo字段有相同的限定条件,并且它们都不支持索引。

与VarBinary数据类型一样,VFP 9.0不会将BLOB类型做代码页转换,而是保持它原始的二进制格式。

BLOB数据类型的设计意图旨在取代最初的Gerneral字段。如果图形或者其他一些媒体类型以BLOB的格式存储,可用Image控件的PictureVal属性对它们进行浏览。

Memo与BLOB类型的数据不能直接修改,如果直接修改的话,则只会显示它们的十六进制的映像。

在以前的版本中,VFP在建表语句CREATE TABLE创建字段类型时,一般用字段名称的第一个字母来取代。但随着数据类型的增多,例如,Character和Currency这两种字段类型如果采用第一个字母的简写方式,会导致同名冲突。现在的版本可以同时支持字段类型的全称、全称的简写、第一个大写字母等多种方式。

1.5.2 常量和变量

1.常量

常量是指在命令操作或程序运行过程中其值始终保持不变的量。VFP中经常用到的常量类型有字符型、数值型、货币型、日期型、日期时间型、逻辑型和浮点型。

(1)字符型常量。字符型常量也叫字符串,它由字母、汉字、下画线、空格、数字等可打印的字符组成,使用时必须用定界符括起来,定界符有单引号(' ')、双引号("")或方括号([ ]),如"计算机"、'110'、[ABCD]等都是字符串常量。VFP字符串的最大长度为254字节。若字符串中含有定界符,则须用另一种定界符括起来,如[I am a 'student']。

(2)数值型常量。数值型常量即数学中的常数,由整数、小数和正负号构成,如3.14159、-560、0.35E3等。

(3)货币型常量。货币型常量用来表示货币值,以“$”或“¥”符号开头,货币数据在存取和计算时采用4位小数。多于4位时,系统自动将多余的小数四舍五入。

(4)日期型常量。日期型常量用来表示一个日期,其表示方式是用花括号{ }将日期括起来,花括号中包含以分隔符“/”分隔的年、月、日三部分内容。“/”是系统默认的分隔符,还可用连字符(-)或句点(.)作为分隔符。其格式分为传统格式和严格格式两种。

① 传统格式为{mm/dd/yy},是系统默认的格式,为美国日期格式“月/日/年”,其中月、日、年各为两位数字,如{10/15/03},表示2003年10月15日。

② 严格格式为{^yyyy-mm-dd},其中第一个字符必须是字符“^”,年份必须是四位,年、月、日的顺序不能颠倒,其取值范围是{^0001/01/01}~{^9999/12/31}。

(5)日期时间型常量。日期时间型常量包括日期和时间两部分内容,使用一对花括号来作为定界符,其格式为:{<日期> <时间>}。<日期>部分的格式与日期型常量相似,<时间>部分的格式为[hh[:mm[:ss]]][a/p]。其中,hh表示小时(默认为12),mm表示分钟(默认为0),ss表示秒(默认为0),a代表上午,p代表下午,如果不加a或p,默认为a。如{05/18/98 10:15:05}表示1998年5月18日上午10时15分零5秒。

(6)逻辑型常量。逻辑型常量的取值只有两个,逻辑真(.T.,.t.,.Y.,.y.)和逻辑假(.F.,.f.,.N.,.n.),前后两个句点是定界符,不能省略。

(7)浮点型常量。浮点型常量也称为浮动型常量,是数值型常量的浮点格式,如23E+8、-4.51E-2等。

2.变量

在命令操作和程序运行过程中其值可以改变的量称为变量,变量包括内存变量、字段变量和系统内存变量三种。

(1)内存变量。内存变量可用来存储数据。定义内存变量时需为它取名并赋初值,内存变量建立后存储于内存中。

内存变量是一种独立于数据表而存在的变量,它是内存中一个临时的工作单元,常用来保存所需要的常数、中间结果或对数据表和数据库进行某种处理后的结果等。

内存变量的类型取决于变量值的类型,主要有字符型、数值型、货币型、日期型、日期时间型、逻辑型和屏幕型。其中,屏幕型内存变量不能进行运算,只能用于保存屏幕画面。当内存变量中存放的数据类型改变时,内存变量的类型也随之改变。

当内存变量名和字段变量名相同时,系统优先引用字段变量。若要引用内存变量,需在内存变量名前加前缀M.或M->。

① 内存变量命名规则。内存变量与字段、文件的命名规则有所不同,在VFP中除字段和文件外,所有的用户命名,如内存变量、函数的取名,均要遵守以下规则:以字母或下画线开始,由字母、数字、下画线组成,至多128字节,不可与系统保留字同名。

② 内存变量的赋值。内存变量赋值有两种命令格式。

【命令格式1】 <内存变量名>=<表达式>

【命令格式2】 STORE <表达式> TO <内存变量名表>

【例1.1】 内存变量赋值命令示例。

S="VFP 9.0"
STORE 4*4 TO n1,n2,n3

③ 内存变量的显示。

【命令格式1】 ? /??<表达式>

【功能】 显示常量、变量、函数和表达式的值。

【说明】 ?为换行显示,??为不换行显示。

【例1.2】 内存变量显示命令示例。

?S
?n2
??"数据库应用"

显示结果如下:

VFP 9.0
16 数据库应用

【命令格式2】 LIST/DISPLAY MEMORY [LIKE<通配符>] [TO PRINTER [PROMPT]/ TO FILE<文件名>]

【功能】 显示或打印一个或多个内存变量的当前内容,或者将这些文件送到一个扩展名为.TXT的文件中。

【说明】 LIKE<通配符>:表示将选出与通配符相匹配的内存变量。

TO PRINTER[PROMPT]:将显示结果送打印机输出,并提示打印窗口。

TO FILE<文件名> :将显示结果存入一个扩展名为.TXT的文件中。

【例1.3】 定义内存变量X的值为3,XY的值为“CHINA”,并在屏幕上显示出来。

X=3
XY="CHINA"
LIST MEMORY  LIKE X*

显示结果如下:

X    Pub    N   3     (   3.00000000)
XY    Pub    C   "CHINA"

④ 内存变量的释放。

【命令格式】 RELEASE [ <内存变量名表> ] [ ALL [ LIKE/EXCEPT <通配符> ] ]

【功能】 删除内存中的指定变量,但不清除系统内存变量。

【例1.4】 释放已定义的内存变量。

RELEASE X , XY
RELEASE ALL

上面两个语句分别为释放已定义的内存变量X、XY和释放所有已定义的内存变量。

(2)字段变量。数据表中的每个字段都是一个字段变量,字段名就是字段变量名。它依附于表,随着表的打开和关闭而在内存中存储和释放。显然,对某一字段而言,它的值因记录的不同可能不同。在建立表结构时就已经定义了字段变量,修改表结构时可重新定义,或增删字段变量,但应注意,这将改变表的结构,也将影响表的记录内容。

字段变量的类型有字符型、数值型、货币型、浮点型、双精度型、整型、日期型、日期时间型、逻辑型、备注型、通用型等。字段变量是一种多值变量,其值随记录指针的变化而不同。一个数据表文件有多少条记录,字段变量就有多少个值。

内存变量简称变量,字段变量简称字段。

(3)系统内存变量。VFP提供了一批系统内存变量,它们都以下画线开头,分别用于控制外部设备、屏幕输出格式,或处理有关计算器、日历、剪贴板等方面的信息。如,_DIARYDATE用于存储当前日期;_CLIPTEXT接收文本并送入剪贴板;执行命令_CLIPTEXT="VFP"后,剪贴板中就存储了文本VFP。

1.5.3 数组

数组是按一定顺序排列的一组内存变量,数组中的各个变量称为数组元素。数组必须先定义后使用。

1.数组的定义

【命令格式】 DIMENSION/DECLARE<数组名>(<下标1>[,<下标2>])[,…]

【例1.5】 定义一维数组a1(3)和二维数组a2(2,3)。

DIMENSION a1(3),a2(2,3)

【说明】VFP一维数组元素的个数为定义的下标值,二维数组元素的个数为定义的两个下标值的乘积。如上述定义中,数组a1的元素为a1(1)、a1(2)、a1(3),数组a2(2,3)的元素为a2(1,1)、a2(1,2)、a2(1,3)、a2(2,1)、a2(2,2)、a2(2,3)。理论上VFP最多可定义16 384个数组,每个数组最多可包含16 384个元素,实际上最大数将受具体计算机内存空间的制约。

2.数组的赋值

在VFP中,同一数组内各元素的类型可以不一致,这是其他一般高级程序设计语言不允许的。数组定义后,系统自动为数组元素赋初值逻辑假(.F.)。用赋值命令可为数组元素单个赋值,也可为整个数组的各个元素赋以相同的值。

【例1.6】 定义二维数组a1(3,4)、一维数组a2(3),并为其赋初值。

DIMENSION  a1(3,4), a2(3)
STORE 8 TO a1
a2(1)=25
a2(2)="student"
a2(3)=.T.

二维数组各元素在内存中按行的顺序存储,也可用一维数组来表示二维数组元素。

1.5.4 运算符和表达式

运算符是表示数据之间运算方式的符号,不同类型的数据要用不同的运算符。表达式是由常量、变量、函数通过运算符连接起来的式子,单个的常量、变量、函数是一种特殊的表达式。

表达式通过计算均能得到一个结果,称为表达式的值。按表达式值的类型划分,表达式可分为算术表达式、字符表达式、日期时间表达式、关系表达式和逻辑表达式。

1.算术运算符和算术表达式

算术运算符用于对运算对象进行算术运算,算术表达式由数值型常量、变量、函数和算术运算符组成,其运算结果仍是数值型数据。算术运算符有以下几种,按优先级由高到低依次是:

(1)括号,( )。优先级最高。

(2)负号,-。优先级次于括号。

(3)乘方,**或^。优先级次于负号。

(4)*、/、%,分别是乘号、除号和取余号,优先级次于乘方。当表达式中同时出现乘、除、取余运算时,它们的优先级相同,按从左到右顺序运算。

(5)加号和减号,+、-。优先级最低,同时出现时,它们的优先级相同,按从左到右顺序运算。

【例1.7】 计算表达式(11+33) (2/4的值。

?(11+33)*2/4
22

2.字符运算符和字符表达式

字符运算符用于对两个字符型数据进行连接运算。字符表达式由字符型常量、变量、函数和字符运算符组成,其运算结果仍为字符型数据。字符运算符主要有两个。

(1)+:原样连接两个字符型数据。

【例1.8】 将字符串“a”和字符串“bcd”连接起来。

? "a  "+"bcd"
a  bcd

(2)-:在进行字符串的连接时,将前一个字符串尾部的空格移动到连接后的字符串的尾部。

【例1.9】 将字符串“a”和字符串“bcd”连接起来,并将中间的空格移去。

? "a  "-"bcd"
abcd

3.日期运算符和日期时间型表达式

日期运算符用于对日期型、日期时间型或数值型数据进行运算。日期时间型表达式由日期型或日期时间型常量、变量、函数和日期运算符组成。日期运算符主要有两个符号。

(1)+:用于一个日期和一个整数相加的符号。

(2)-:用于一个日期减去另一个日期或整数的符号。

【例1.10】 日期运算示例。

?{^2003-06-18}+30
?{^2007-06-18}- {^2005-04-12}
07/18/03
797

日期时间表达式的运算结果是日期型、日期时间型或数值型数据,格式有一定限制,不能任意组合,比如,不可以用“+”运算符将两个日期连接起来。如表1.3所示为正确的日期时间表达式格式。

表1.3 正确的日期时间表达式格式

4.关系运算符和关系表达式

关系运算符用于完成比较运算,其运算结果为逻辑值.T.或.F.。关系表达式由关系运算符、数值表达式、字符表达式、日期时间表达式或货币表达式组成,但运算符两边的数据类型必须一致。关系运算符有:

(1)<:小于。

(2)>:大于。

(3)=:等于。

(4)<> , # , !=:不等于。

(5)<=:小于等于。

(6)>=:大于等于。

(7)= =:完全相等,两串全同才是真。

(8)$:包含于,左串是右串的子串时才为真。

【例1.11】 关系运算示例。

? 8>10
? 8<>10
? 'a' = ='b'
? "ABCD"$"ABCDEFG"
.F.
.T.
.F.
.T.

5.逻辑运算符和逻辑表达式

逻辑表达式由逻辑运算符、逻辑型常量(.T.或.F.)、逻辑型内存变量、逻辑型数组、返回逻辑型值的函数及关系型表达式构成,其运算结果为逻辑值.T.或.F.。逻辑运算符有:

(1).NOT.或NOT或!:逻辑非。

(2).AND.或AND:逻辑与。

(3).OR.或OR:逻辑或。

【例1.12】 逻辑运算示例。

? . NOT. "ABCD"$"ABCDEFG"
? 5>3 AND 4=5
? 5>3 OR 4=5
.F.
.F.
.T.

逻辑运算符的优先等级从高到低依次为:NOT、AND、OR。

不同类型的运算符可以同时出现在同一个表达式中,此时它们的优先级从高到低依次是:算术运算符、字符运算符、日期时间运算符、关系运算符和逻辑运算符。

1.5.5 VFP命令格式和书写规则

1.命令格式

VFP的命令通常由命令动词和若干个短语构成。VFP命令的一般格式为:

命令动词 [<表达式表>] [<范围>] [FOR<条件>] [WHILE<条件>] [FIELDS <字段名表>]
[LIKE/EXCEPT <通配符>] [IN <别名/工作区>]

各部分的意义如下:

(1)命令动词,VFP的命令名,用来指示计算机要完成的操作。

(2)表达式表,用来指示计算机执行该命令所操作的内容,由常量、内存变量、字段名、函数及运算符组成。

(3)范围,指定命令可以操作的记录集。范围有下列四种选择。

ALL:当前表中的全部记录。

NEXT <n>:从当前记录开始的n条记录。

RECORD <n>:当前表中的第n号记录。

REST:从当前记录开始到最后一条记录为止的所有记录。

(4)FOR <条件>,规定只对满足条件的记录进行操作。

(5)WHILE <条件>,从当前记录开始,按记录号顺序从上向下处理,一旦遇到不满足条件的记录,就停止搜索并结束该命令的执行。

(6)[LIKE/EXCEPT <通配符>],指出包括或不包括与通配符相匹配的文件、字段或内存变量。

(7)IN <别名/工作区>,允许在当前工作区操作指定工作区。

2.命令的书写规则

(1)命令动词必须写在命令的最前面,而各短语的前后顺序可以任意排列。

(2)命令动词、各短语中的保留字及函数名都可以简写为前4个字符。

(3)命令动词与短语之间、短语与短语之间、短语的各部分之间必须用空格分隔开。

(4)一条命令最长可达8192个字符。当一行写不下时,可在适当位置输入续行符“;”并按Enter键换行,继续输入该命令。

(5)变量名、字段名和文件名应避免与命令动词、关键字或函数名同名,以免运行时发生混乱。

(6)命令、关键字、变量名和文件名中的字母既可以大写也可以小写,还可以大、小写混合,三者等效。

(7)命令格式中的符号约定:命令中的[ ] ,/,…,< > 符号都不是命令本身的语法成分,使用时不能照原样输入。其中,

[ ]:表示可选项,根据具体情况决定是否选用。

/:表示两边的部分只能选用其中的一个。

…:表示可以有任意个类似参数,各参数间用逗号隔开。

< >:表示必选项,其中内容要以实际名称或参数代入。

3.命令工作方式中的常见错误

(1)命令动词写错。

(2)格式不符合要求,主要有:

① 标点符号不对(一定要用中文半角或英文标点符号);

② 缺少必需的空格或添加了不该有的空格;

③ 数据类型不一致,要注意字符型、数值型、日期型、逻辑型数据的书写格式。

(3)打不开所需文件,没有正确输入盘符和路径或文件名输入错误。