第2章 Visual FoxPro 6.0语言基础
VFP是关系型数据库管理系统,能管理和操作数据库;同时也是一种高级程序设计语言,具有一般计算机语言的特点。要开发高质量的数据库应用系统,必须掌握VFP语言。本章主要介绍VFP中使用的数据类型、运算符、表达式、函数及数据存储方式等内容。
2.1 数据类型
数据类型决定了数据的存储方式和运算方式,要管理和操作数据,首先需要定义其类型。在VFP中,数据类型有以下13种。
1. 字符型(Character) 是用各种文字字符表示的数据,由字母、数字、汉字、符号和空格等组成。长度为0~254字节,每个半角字符占1字节。字符型数据可用来保存姓名、地址和不需要进行算术运算的数字(如电话号码、邮编)等。
2. 数值型(Numeric) 是可以进行算术运算的数据,由数字0~9、小数点、正或负号构成,最多1~20位。宽度包含小数点和小数位数。在内存中,占用8字节,取值范围在-0.9999999999×1019~0.9999999999×1020之间,存储时需要转换成ASCII码。
3. 货币型(Currency) 表示货币量时用货币型来代替数值型数据,占用8字节,取值范围在-922337203685477.5808~922337203685477.5807之间,小数位超过4位时将自动四舍五入到四位。
4. 逻辑型(Logic) 是用来进行各种逻辑判断的数据,只有两个值:真或假,长度固定为1字节。实际存储时只存放T或F两个字母中的一个。
5. 日期型(Date) 是用来表示日期的数据,存储格式为“YYYYMMDD”,其中YYYY代表年,MM代表月,DD代表日,长度固定为8字节。
日期型数据的表示有多种格式,VFP默认的是美国日期格式“MM/DD/YY”,如1996年3月20日表示为“03/20/96”。可以通过SET DATE,SET CENTURY命令或通过“工具|选项”菜单,打开“选项”对话框,设置其他日期格式。
日期型数据的取值范围是:公元0001年1月1日~公元9999年12月31日。
6. 日期时间型(DateTime) 是用来描述日期和时间的数据,存储格式为“YYYYMMDDHHMMSS”,其中YYYY代表年,前两个MM代表月,DD代表日,HH代表小时,后两个MM代表分钟,SS代表秒,长度固定为8字节。
日期时间型数据的日期部分也具有多种显示格式,并可以通过SET DATE,SET CENTURY命令进行设置;时间部分的显示格式可以通过SET HOURS,SET SECONDS等命令进行设置。取值00:00:00A.M.~11:59:59P.M.。
以下数据类型只能用于数据表中的字段。
7. 整型(Integer) 是指不包含小数点部分的数值,以二进制形式存储,长度固定为4字节,取值范围在-2147483647~2147483646之间。
8. 浮点型(Float) 是数值型数据的一种,与数值型数据完全等价,但在存储形式上采取浮点格式,由尾数、阶数及字母E组成,占用8字节。采用浮点型数据的主要目的是使计算具有较高的精度。
9. 双精度(Double) 是具有更高精度的数值型数据,占用8字节,取值范围在±4.94065645841247E-324~±1.797693413486232E+308之间。
10. 备注型(Memo) 存储字符型数据块,长度固定为4字节,用来存储指向实际数据存放位置的地址指针,实际数据存放在与数据表文件同名的.FPT文件中,其长度仅受磁盘空间的限制。
11. 通用型(General) 存储OLE对象,该字段包含了对OLE对象的引用,OLE对象的实际内容由其他应用程序建立,可以是文档、图片、电子表格等对象。通用型数据固定长度固定为4字节,用来存储指向.FPT文件位置的地址指针。
12. 字符型(二进制)数据 用于存储任意不经过代码页修改而维护的字符型数据,长度为1~254字节。
13. 备注型(二进制)数据 用于存储任意不经过代码页修改而维护的备注型数据,长度固定为4字节。
数据类型是数据的基本属性,对数据进行操作时,数据必须是同类型的;若同时对不同类型的数据进行操作,系统将判语法出错。
2.2 数据存储
在VFP中,将用于存储数据的常量、变量、数组、字段、记录和对象称为数据的存储容器,它们决定了数据的类型和存储方法。
2.2.1 常量
常量是指在数据处理过程中其值保持不变的量。VFP支持6种类型的常量,即数值型、字符型、逻辑型、日期型、日期时间型和货币型。
1. 数值型
数值型常量是数学中的十进制整数或小数,例如10.25,-123.567(记为N型)。要表示很大或很小的数值型常量,可采用科学计数法,例如,1.234×1015用1.234E+15表示,1.234×10-15用1.234E-15表示(数值型常量的浮点格式,也称浮点型常量,记为F型)。
2. 字符型
字符型常量是用定界符括起来的字符串。定界符有三种,即西文单引号、双引号和方括号,字符串由汉字和ASCII码中可打印的字符组成,如'abc',"123",[VFP数据库]。若无定界符,系统会把该字符串当成变量名。
注意:字符型常量的定界符必须成对出现,不能一边用单引号而另一边用双引号。当字符串本身包含一种定界符时,必须使用另一种定界符来表示该字符串常量,如"古语云:'一份耕耘一份收获'"。
3. 逻辑型
逻辑型常量用下圆点定界符括起来,只有真和假两个值。用.T., .t., .Y., .y.表示逻辑真;用.F., .f., .N., .n.表示逻辑假。圆点和字母都必须是半角符号,相互之间不能有空格。
4. 日期型
日期型常量用来表示一个确切的日期,用花括号作为定界符,默认为美国日期格式(MM/DD/YY)。日期型常量通常通过转换函数CTOD(<字符表达式>)把日期格式的字符串转换成日期型数据,例如,2007年3月20日可用CTOD("03/20/07")表示为日期型常量。通过SET DATE,SET CENTURY等命令可以改变默认的日期格式。
(1)SET DATE命令
格式:SET DATE TO AMERICAN|ANSI|BRITISH|FRENCH|GERMAN|ITALIAN|
JAPAN|USA|MDY|DMY|YMD
功能:设置当前日期的格式,设置结果如表2-1所示。
表2.1 常用日期格式及其设置
说明:命令行中的竖杠分隔内容表示选择其中的一项。
(2)SET CENTURY命令
格式:SET CENTURY ON|OFF
功能:设置年份的位数,ON指定年份为4位,OFF指定年份为2位。
【例2.1】 用不同的日期格式显示系统的当前日期。
在命令窗口中输入以下命令(从 &&开始的内容为注释部分,可以不输入),并分别按回车键执行。
注意:后面的例子中用到的命令都是在命令窗口中输入,按回车键执行的。
?DATE() && 调用日期函数 SET DATE TO YMD && 设置年月日格式 ?DATE() SET CENTURY ON && 设置年份为4位数字 ?DATE()
显示结果为:
05/20/10 && 按默认的美国日期格式显示 10/05/20 && 按年月日格式显示 2010/06/20 && 年份用4位数字显示
在VFP中,还有一种严格的日期格式,其格式为{^YYYY-MM-DD}。(^)符号表明该格式是严格的日期格式,并按照YMD的格式解释。严格的日期格式可以在任何情况下使用,不受SET DATE,SET CENTURY等语句设置的影响。例如,2006年3月20日用严格的日期格式可表示为{^2006-03-20}。
5. 日期时间型
日期时间型常量包括日期和时间两部分内容,例如,2006年03月20日11时35分15秒可表示为{^2006-03-20 12:30:15}。
6. 货币型
货币型常量用符号“$”来标识,如$567.8。
2.2.2 变量
变量是指在数据处理过程中其值可以改变的量,包括字段变量和内存变量两种。内存变量又分为一般内存变量、系统内存变量和数组变量。
1. 变量的命名
每个变量都有一个名称,叫做变量名。变量名的命名规则是:
(1)由汉字、字母、数字和下划线组成,而且必须以汉字、字母或下划线开头。
(2)长度为1~128个字符,国标基本集上的一个汉字占2个字符位,扩充集上的一个汉字占4个字符位。
(3)不能使用VFP的保留字。
2. 字段变量
字段变量存在于数据表文件中,每个数据表中都包含若干个字段变量,其值随着数据表中记录的变化而改变。要使用字段变量,须先打开包含该字段的表文件。
在数据表中,对字段变量必须先定义后赋值,然后才可以使用。对字段变量的定义是在定义数据表结构时完成的,主要给出变量名、变量类型、变量宽度及数值型数据的小数位数等。有关字段变量的定义和使用将在第3章介绍。
3. 内存变量
内存变量独立于数据表文件,存在于内存之中,是一种临时的工作单元,需要时可以临时定义,不需要时可以随时释放,常用来存储常数、程序运行的中间结果及最终结果。内存变量的类型取决于赋予的变量值类型,可以把不同类型的数据赋给同一个变量。内存变量的数据类型有:字符型(C)、数值型(N)、货币型(Y)、逻辑型(L)、日期型(D)和日期时间型(T)。
当内存变量名与数据表中的字段变量名相同时,如要先访问该内存变量,必须在变量名前加上前缀M.或M->(由减号加大于号组成),否则,系统将优先访问同名的字段变量。
(1)建立内存变量
在VFP中,给变量命名,应力求“见名知义”。简单内存变量不必事先定义,可以直接通过赋值语句建立。变量的赋值命令有以下两种格式。
格式1:<内存变量名> = <表达式> && 等号“=”是赋值语句
格式2:STORE <表达式> TO <内存变量名>
功能:在定义内存变量名的同时确定内存变量的值和类型。
说明:
① 定义内存变量名、赋值和确定变量的类型在同一个命令中完成。
② 语句中的<表达式>可以是一个具体的值,也可以是一个表达式。如果是表达式,系统将先计算表达式的值,再将此值赋给变量。
③ 格式1一次只能给一个内存变量赋值,而格式2可以同时给多个变量赋相同的值,但是要求各变量之间必须用西文逗号隔开。
④ 可以通过给内存变量重新赋值来改变其值和类型。
【例2.2】 定义变量。
X=5 && 定义变量X,并把数值5赋给X STORE X+10 TO Y && 定义变量Y,并将表达式X+10的值赋给Y STORE"北京"TO A,B,C && 定义变量A,B,C,并赋给相同的字符数据 X=.F. && 重新定义变量X,并赋给逻辑值.F.
(2)输出内存变量的值
格式1:? <表达式表>
格式2:?? <表达式表>
功能:计算<表达式表>中各表达式的值并在屏幕上显示出来。
说明:格式1在输出前先执行一次回车换行,再输出各表达式的值;格式2直接在当前光标所在位置处输出表达式的值。
【例2.3】 输出内存变量的值,接例2.2的命令操作,继续在命令窗口中输入以下命令,按回车键执行。
?X ?? A,B,C ?Y
显示结果:
.F.北京 北京 北京 15
(3)显示或打印内存变量
格式:LIST|DISPLAY MEMORY [LIKE <通配符>][TO PRINTER|TO FILE <文件名>]
功能:显示或打印内存变量的当前信息。
说明:
① 命令行中方括号中的内容是可选的,尖括号中的内容由用户提供。
② TO PRINTER表示将显示的结果送打印机输出。
③ TO FILE <文件名> 表示将显示结果保存到一个扩展名为.TXT的文本文件中。
④ LIKE <通配符>表示显示或打印所有与通配符一致的内存变量,通配符包括“?”和“*”。“?”表示任意一个字符,“*”表示任意多个字符。
⑤ LIST和DISPLAY用法相同,区别仅在于LIST连续显示,DISPLAY分页显示。
⑥ 无任何选项时,将显示当前内存中的下列信息:已定义的内存变量或数组变量、已定义的菜单系统、下拉菜单和窗口等用户定义信息,以及系统内存变量信息。
⑦ 显示信息的第1列为内存变量的名字,第2列为变量的作用域,第3列为变量的类型,第4列为变量的值,第5列为数值型内存变量的计算机内部表示。
【例2.4】 显示内存变量。
M1="123" && 表示把字符串123赋值给M1 M2=5 && 表示把数值的5赋值给M2 M3=.F. && 表示把逻辑值.F.赋值给M3 LIST MEMORY LIKE M* && 显示所有第1个字符为M的内存变量信息
显示结果:
M1 Priv C "123" && 表示123是字符串,不是数值 M2 Priv N 5 ( 5.00000000) M3 Priv L .F.
(4)释放内存变量
释放内存变量就是将内存中的内存变量删除,腾出在内存中所占用的空间。
格式1:CLEAR MEMORY && 释放所有内存变量
格式2:RELEASE <内存变量名表>
格式3:RELEASE ALL [LIKE <通配符>|EXCEPT <通配符>]
功能:释放所有内存变量或指定的内存变量。
说明:
① 命令只清除用户自定义的内存变量,而不清除系统内存变量。
② 带LIKE <通配符>的选项表示清除与通配符相匹配的内存变量,带EXCEPT<通配符>的选项表示清除与通配符不相匹配的内存变量。
【例2.5】 清除内存变量的几种情况举例。
RELEASE M1 && 释放内存变量M1 RELEASE ALL LIKE M* && 释放所有第1个字母为M的内存变量 RELEASE ALL && 释放所有内存变量,该命令与CLEAR MEMORY的效果相同
4. 系统内存变量
系统内存变量是指VFP系统定义的一些变量,通常以下划线“_”开头,如_PAGENO,_ALIGNMENT等。
5. 数组
数组是内存中连续的一片存储区域,由一组变量组成。每个数组元素通过数组名及相应的下标被引用,相当于一个一般内存变量。通过赋值语句可以为各个元素分别赋值,且所赋值的数据类型可以不同。
(1)数组的定义
格式:DIMENSION <数组名1> (<数值表达式1> [,<数值表达式2>])[,<数组名2>
(<数值表达式3> [,<数值表达式4>])]…
功能:定义一个或若干个一维或二维数组。
说明:
① DIMENSION命令与DECLEAR命令等价,且可以同时定义多个数组。
② <数值表达式>为数组下标,当只选择<数组名1>和<数值表达式1>时,定义的是一维数组,如DIMENSION aa(5),数组aa中包含5个元素:aa(1),aa(2),aa(3),aa(4)和aa(5);当选择<数组名1>、<数值表达式1>和<数值表达式2>时,定义的是二维数组,如DIMENSION bb(2,4),数组bb中包含8个元素:bb(1,1),bb(1,2),bb(1,3),bb(1,4),bb(2,1),bb(2,2),bb(2,3)和bb(2,4)。
注意:数组下标的引用从1开始。
③ 数组的下标可以用圆括号或方括号括起来, 如DIMENSION aa(5)与DIMENSION aa[5]等价。
④ 数组定义后,系统自动给每个元素赋以逻辑假值.F.。可以用有关命令给每个数组元素重新赋值。
⑤ 在同一运行环境下,数组名不能与单个内存变量重名。
【例2.6】 定义一个一维数组AA和一个二维数组BB举例。
DIMENSI0N AA(5),BB(2,3) && 定义一个一维数组AA和一个二维数组BB STORE 0 TO AA && 将数值0赋给数组AA中的所有元素 BB(1,1)="XYZ" && 将字符串XYZ赋给数组元素BB(1,1) BB(2,1)=125 && 将数值125赋给数组元素BB(2,1) BB(2,3)=.T. && 将逻辑真值T赋给数组元素BB(2,3) DISPLAY MEMORY && 查看数组变量
2.2.3 其他数据存储容器
1. 字段、记录和数据表
数据表是一系列相关数据的集合。字段是数据表中存储、处理数据的基本元素,一个具体的字段只能存储一种类型的数据。记录是数据表中一组字段的集合,同一个数据表中的所有记录都具有相同的字段名,且同名字段在每个记录中的数据类型、数据长度都是相同的。字段和记录构成了一个数据表的全部内容,在VFP中就是以记录为单位组织数据的。
2. 对象
对象(Object)是一个具有属性和行为特征的实体,在面向对象程序设计中,对象是编程的基本元素,它将某一数据和使用该数据的一组基本操作或过程封装在一起,构成一个统一体。每个对象都有自己的属性和行为特征。VFP的对象可以是表单、表单集或各种控件。有关对象的概念和使用将在第7章中具体介绍。
2.3 运算符和表达式
运算符是对相同类型的数据进行运算操作的符号。用运算符将常量、变量和函数等数据联接起来的式子称为表达式。表达式的类型由运算符的类型决定,每个表达式按照规定的运算规则产生一个唯一的值。
2.3.1 数值运算符及数值表达式
数值表达式是由算术运算符将数值型常量、变量和函数等联接起来的式子,其结果仍是数值型数据。
VFP提供的算术运算符如表2-2所示,它们的作用与数学中的算术运算符相同,运算优先级依次为:括号→乘方→乘、除、取模→加、减,其中乘、除和取模同级,加和减同级。同级时,分别从左到右进行计算。
表2.2 算术运算符
【例2.7】 计算数值表达式的值。
?2*10/5,128%5 &&(注意表达式间用半角逗号隔开)结果为 4 3 x=2 && 把数值2赋值给x y=3 && 把数值3赋值给y z=4 && 把数值4赋值给z ?(x*y-4)/2 && 结果为 1.0000
2.3.2 字符串运算符及字符表达式
字符表达式是由字符串运算符将字符型常量、变量和函数等联接起来的式子,其结果仍然是字符型数据。字符串运算符有以下两种,它们的优先级相同。
(1)+ 两个字符串首尾相连形成一个新的字符串。
(2)- 两个字符串相连,并将前字符串尾部的空格移到合并后的新字符串的尾部。
【例2.8】 字符串运算。
?"ABCD "+"EFG"+"1234" && 结果为 ABCD EFG1234 ?"ABCD "-"EFG"+"1234" && 结果为 ABCDEFG 1234
2.3.3 日期运算符及日期表达式
日期表达式是由日期运算符将日期型常量、变量、函数等联接起来的式子,其结果为日期型数据或者数值型数据。日期型运算符只有加法(+)和减法(-)两种。
<日期型数据> + <数值型数据>:结果为日期型数据(指定日期若干天后的日期)
<日期型数据> - <数值型数据>:结果为日期型数据(指定日期若干天前的日期)
<日期型数据> - <日期型数据>;结果为数值型数据(两个日期相差的天数)
【例2.9】 日期运算。
Set date to YMD && 设置日期格式为年月日的形式 ?{^2007-01-20}+5 && 结果为日期 2007/01/25 ?{^2007-01-20}-5 && 结果为日期 2007/01/15 ?{^2007-01-20}-{^2006-10-28} && 结果为天数 84
2.3.4 关系运算符及关系表达式
关系表达式是由关系运算符、数值表达式、字符表达式或者日期型表达式组合而成的式子,其结果为逻辑真值(.T.)或逻辑假值(.F.)。
关系运算符及其含义如表2-3所示。
表2.3 关系运算符
说明:
(1)关系运算符的优先级相同,从左到右依次进行比较。
(2)关系运算符的两边可以是字符表达式、数值表达式或者日期表达式,但两边的数据类型必须一致。
(3)数值型数据按数值的大小比较,日期型数据依次按年月日的值比较。字符型数据按照其机内码顺序比较,对于西文字符,是ASCII码的值;对于汉字,是汉字国标码的值。常用的一级汉字按照拼音顺序排列。两个字符串比较时,自左至右逐个字符进行比较。
(4)字符串包含运算符“$”用来检测左边的字符串是否包含在右边的字符串中,若包含(即前者是后者的一个子字符串),结果为逻辑真;否则,结果为逻辑假。
(5)字符串精确比较运算符“==”用于精确匹配,即只有当两个字符串完全相同时,结果才为逻辑真;否则,结果为逻辑假。
在用等号比较运算符“=”比较两个字符串时,运算结果与系统的设置状态SET EXACT ON|OFF有关。当处于OFF状态时(这是系统的默认状态),进行的是不精确匹配,只要“=”右边的字符串是左边字符串的前缀,结果就为真。当处于ON状态时,进行的是精确匹配,只有“=”两边的字符串完全相同,结果才为真。
无论EXACT为ON还是OFF,字符串精确比较运算符“==”进行的都是精确匹配。
EXACT的状态设置可以用命令方式完成,也可以选择“工具|选项”命令,打开“选项”对话框,在“数据”选项卡中设置。
【例2.10】 计算关系表达式的值。
① ?{^2002-01-20}>{^2001-12-30},"Fox"$"FoxPro",5+5<6 S1="读者" && 把字符串常量“读者”赋值给S1 S2="读者文摘" && 把字符串常量“读者文摘”赋值给S2 SET EXACT ON ② ?S1=S2,S2=S1,S2==S1 SET EXACT OFF ③ ?S1=S2,S2=S1,S2==S1
显示结果:
① .T..T..F. ② .F..F..F. ③ .F..T..F.
2.3.5 逻辑运算符及逻辑表达式
逻辑表达式是由逻辑运算符将逻辑型常量、逻辑型内存变量、逻辑型数组、返回逻辑型数据的函数和关系表达式联接起来的式子,其结果仍然为逻辑值。
逻辑运算符及其含义如表2-4所示,逻辑运算规则如表2-5所示。
表2.4 逻辑运算符
(说明:逻辑运算符.AND.,.OR.和.NOT.可以省略两边的点,写成AND,OR和NOT。)
表2.5 逻辑运算规则
逻辑运算符的优先次序为:NOT,AND,OR,可以用括号来改变逻辑运算的先后次序。
在同一表达式中,如使用了不同类型的运算符,则各种运算符的优先顺序由高到低为:括号→算术运算符→字符串运算符→关系运算符→逻辑运算符。
【例2.11】 逻辑运算举例。
?10>5.AND.5<2,10>5.OR.5<2 && 结果为 .F.,.T. x1=3 && 把数值3赋值给x1 y1=-2 && 把数值-2赋值给y1 x2=8 && 把数值8赋值给x2 y2=-6 && 把数值-6赋值给y2 ?x1+y1>x2+y2.AND..NOT.(y1<y2) && 结果为 .F.
最后一个表达式的运算顺序为
2.3.6 类与对象运算符
类与对象运算符专门用于面向对象程序设计,它有两种形式。
(1)点运算符(.)主要用于确定对象与类的关系,以及属性、事件和方法与其对象的从属关系。例如,设计表单时,要将表单的Caption(标题)属性设置为“输入记录”,在程序中用命令表示为:Thisform.caption="输入记录"。
(2)作用域运算符(::)用于在子类中调用父类。例如,MyCommandButton::Click表示MyCommandButton对象继承其父类的Click事件过程。
2.3.7 名称表达式
名称表达式是指能代替字符型变量或数组元素的值的一个引用。名称不是变量,也不是数组元素,但它可以替代字符变量或数组元素中的值。名称表达式为VFP的命令和函数提供了灵活性,将名称存放到内存变量或数组元素中,并用小括号括起该变量,就可以在命令或函数中用变量来代替该名称了。
定义一个名称时,只能以字母、汉字或下划线开头,且名称中只能使用字母、汉字、数字和下划线字符,不能使用VFP的保留字,名称的长度为1~128个字符。一次可定义多个名称,名称之间用逗号分开。
在VFP中,可以使用的名称有:表(.DBF)文件名、表别名、表字段名、索引文件名、内存变量名和数组名、窗口名、菜单名、表单名、对象名、属性名等。
【例2.12】 使用名称表达式打开一个名为“学生.DBF”的数据表文件。
STORE "E:\VFP6\DATA\学生.DBF" TO CC USE(CC) &&USE命令用于打开一个表文件(假设学生表已经建立)
2.4 函数
函数(Function)是按照给定的参数返回一个值的表达式,与命令一样,是系统内部“编制”好的一段程序,能够完成某种特定操作或功能。其一般格式是:
函数名([参数1][,参数2][,…])&&命令中的括号、逗号、圆点、引号等均取西文
一个函数必须有一个函数名,其后必须跟一对圆括号,括号内可以有0~n个参数(自变量),函数的运算结果有唯一的值,称为返回值。
说明:
① 对于某些没有参数的函数,圆括号内为空,如系统日期函数DATE( )。
② 当函数带有多个参数时,参数和参数之间用逗号分隔。
③ 任何可以使用表达式的地方都可以使用函数,表达式将函数的返回值作为运算对象。例如,命令“?DATE( )+100”显示从系统当前日期算起100天后的日期。
使用函数可以大大丰富命令的功能。在VFP中,函数有两种:一种是系统函数,另一种是用户自定义函数。系统函数是由VFP提供的内部函数,大约有380多个,可以随时调用;自定义函数是由用户根据需要自行编写的。
本节主要介绍常用的系统函数,用户自定义函数将在6.4.2节中介绍。
注意:本节例题中使用的命令都在VFP的命令窗口中输入,按回车键执行。
2.4.1 数值处理函数
(1)取整函数
格式:INT(<数值表达式>)
功能:返回数值表达式的整数部分。
【例2.13】
?INT(4.98) && 结果为 4 ?INT(-5.68) && 结果为 -5 ?INT(10.5+7.4) && 结果为 17
(2)四舍五入函数
格式:ROUND(<数值表达式1>,<数值表达式2>)
其中<数值表达式2>指定保留的小数位数。
功能:对<数值表达式1>在由<数值表达式2>指定小数位数后的值进行四舍五入运算。
说明:
①<数值表达式2>大于或等于0时,<数值表达式1>保留指定的小数位数。
②<数值表达式2>小于0时,其绝对值表示整数部分四舍五入的位数。
【例2.14】
?ROUND(35.865,2) && 结果为 35.87 ?ROUND(35.865,0) && 结果为 36 ?ROUND(35.865,-1) && 结果为 40 ?ROUND(135.865,-2) && 结果为 100
(3)取绝对值函数
格式:ABS(<数值表达式>)
功能:求数值表达式的绝对值。
【例2.15】
?ABS(25) && 结果为 25 ?ABS(-25) && 结果为 25
(4)求最大值函数
格式:MAX(<数值表达式1>,<数值表达式2> [,<数值表达式3>…])
功能:返回几个数值表达式中最大的值。
【例2.16】
?MAX(-30,-20) && 结果为 -20 ?MAX(-30,-40,20) && 结果为 20
(5)求最小值函数
格式:MIN(<数值表达式1>,<数值表达式2> [,<数值表达式3>…])
功能:返回几个数值表达式中最小的值。
【例2.17】
?MIN(-30,-20) && 结果为 -30 ?MIN(-30,-40,20) && 结果为 -40
(6)求平方根函数
格式:SQRT(<数值表达式>)
功能:返回数值表达式的算术平方根值。
【例2.18】
?SQRT(25.46) && 结果为 5.05
(7)求自然对数函数
格式:LOG(<数值表达式>)
功能:求数值表达式的自然对数值。
【例2.19】
?LOG(32.78) && 结果为 3.49
(8)幂函数
格式:EXP(<数值表达式>)
功能:求数值表达式对于e的幂的值。
【例2.20】
?EXP(4.43) && 结果为 83.93
(9)求余数函数
格式:MOD(<数值表达式1>,<数值表达式2>)
功能:求<数值表达式1>除以<数值表达式2>的余数,且<数值表达式2>的值不能为0。
说明:函数返回值的符号与<数值表达式2>的符号相同。如果<数值表达式1>与<数值表达式2>同号,函数值即为两数相除的余数;如果<数值表达式1>与<数值表达式2>异号,则函数值为两数相除的余数再加上<数值表达式2>的值。
【例2.21】
?MOD(15,4),MOD(15, -4),MOD(-15,4),MOD(-15, -4)
显示结果: 3-1 1-3
2.4.2 字符处理函数
(1)宏替换函数
格式:&<字符型变量> [.]
功能:替换一个字符型变量的内容,即&的值是变量中的字符串。如该函数与其后的字符无明确分界,则要用西文的圆点“.”作为函数结束标识。宏替换可以嵌套使用。
说明:宏替换可以在任何能接受字符串的命令或函数中使用。
【例2.22】
AA="BB" BB="清华大学" ?AA,BB,&AA && 结果为 BB清华大学 清华大学 ? "&BB.是一所著名的大学" && 结果为 清华大学是一所著名的大学 X="25.5" ?32.5+&X && 结果为 58.00
(2)求字符串长度函数
格式:LEN(<字符表达式>)
功能:计算字符串中的字符个数,返回结果为数值型。
【例2.23】
?LEN("ABCDE") && 结果为 5 X="清华大学" ?LEN(X) && 基本集一个汉字占有2个字符长度,结果为 8
(3)生成空格函数
格式:SPACE(<数值表达式>)
功能:产生由数值表达式指定数目的空格,返回结果为字符型。
【例2.24】
?"清华"+SPACE(4)+"大学" && 结果为 清华 大学(清华与大学间有4个空格)
(4)字符串转换成小写字母函数
格式:LOWER(<字符表达式>)
功能:将字符表达式中的大写字母转换成小写字母。
【例2.25】
?LOWER("Visual FoxPro") && 结果为 visual foxpro
(5)字符串转换成大写字母函数
格式:UPPER(<字符表达式>)
功能:将字符表达式中的小写字母转换成大写字母。
【例2.26】
?UPPER("Visual FoxPro") && 结果为 VISUAL FOXPRO
(6)删除字符串尾部的空格函数
格式:TRIM(<字符表达式>)
功能:将字符串尾部的空格删除。
【例2.27】
X="清华大学" ?LEN(X) && 结果为 10 Y=TRIM(X) ?LEN(Y) && 结果为 8
(7)删除字符串左边空格函数
格式:LTRIM(<字符表达式>)
功能:将字符串的前导空格删除。
【例2.28】
X="清华大学" ?LEN(X) && 结果为 10 Y=LTRIM(X) ?LEN(Y) && 结果为 8
(8)删除字符串右边空格函数
格式:RTRIM(<字符表达式>)
功能:与TRIM( )函数功能相同,删除字符串尾部空格。
(9)删除字符串最左边和最右边的所有空格函数
格式:ALLTRIM(<字符表达式>)
功能:删除字符串中最左边和最右边的所有空格。
【例2.29】
X="Visual FoxPro" ?LEN(X) && 结果为 20 ?LEN(ALLTRIM(X)) && 结果为 13
(10)取子字符串函数
格式:SUBSTR(<字符表达式>,<数值表达式1> [,<数值表达式2>])
功能:从指定的<字符表达式>中,截取一个子字符串。子字符串的起点位置由<数值表达式1>给出,截取子字符串的字符个数由<数值表达式2>给出。
说明:如省略<数值表达式2>,截取的字符串将从<数值表达式1>给出的位置一直到该字符表达式的结尾。
【例2.30】
A="清华大学" ?SUBSTR(A,1,4) && 结果为 清华 ?SUBSTR(A,5) && 结果为 大学
(11)取左边子字符串函数
格式:LEFT(<字符表达式>,<数值表达式>)
功能:从指定的<字符表达式>左边开始截取<数值表达式>指定个数的字符。
说明:如<数值表达式>给出的值大于字符表达式中字符的个数,则返回整个<字符表达式>;如<数值型表达式>的值为0或负数,则返回结果为空串。
【例2.31】
?LEFT("清华大学",4) && 结果为 清华
(12)取右边子字符串函数
格式:RIGHT(<字符表达式>,<数值表达式>)
功能:从指定的<字符表达式>右边截取<数值表达式>指定个数的字符。
说明:如<数值表达式>给出的值大于<字符表达式>中字符的个数,则返回整个字符表达式。如<数值表达式>的值为0或负数,则返回结果为空串。
【例2.32】
?RIGHT("清华大学",4) && 结果为 大学
(13)子字符串位置测试函数
格式:AT(<子字符串>,<主字符串> [,<数字>])
功能:求<子字符串>在<主字符串>中的起始位置,函数返回值为数值型。
说明:<数字>表示<子字符串>在<主字符串>中第几次出现,默认为第1次。如<子字符串>不在<主字符串>中,返回值为零。
【例2.33】
?AT("大学","清华大学是一所著名大学") && 结果为 5 ?AT("大学","清华大学是一所著名大学",2) && 结果为 19
2.4.3 日期和时间处理函数
(1)系统当前日期函数
格式:DATE( )
功能:返回当前系统日期值,函数值为日期型,其格式由SET DATE, SET CENTURY等设置状态决定。
【例2.34】
?DATE() && 结果为 06/20/10(机器上的当前日期) SET CENTURY ON && 设置显示日期表达式中的世纪部分 ?DATE() && 结果为 06/20/2010
(2)系统当前时间函数
格式:TIME([<数值表达式>])
功能:以24小时制的时、分、秒(HH:MM:SS)格式显示系统的当前时间,函数值为字符型。
说明:如函数的参数中包含<数值表达式>,则返回的时间值包含百分之几秒,数值表达式可以是任意值。
【例2.35】
?TIME() && 结果为 18:20:32(机器上的当前时间) ?TIME(2) && 结果为 18:20:32.15
(3)系统日期和时间函数
格式:DATETIME( )
功能:返回当前系统的日期时间,函数值为日期时间型。
【例2.36】
?DATETIME() && 结果为 05/20/10 06:23:20 PM
(4)日子函数
格式:DAY(<日期型表达式>|<日期时间型表达式>)
功能:返回日期型或日期时间型表达式中的日子值,函数返回值为数值型。
【例2.37】
?DAY(DATE()) && 结果为 20(假设系统当前日期为2010年5月20日)
(5)月份函数
格式:MONTH(<日期型表达式>|<日期时间型表达式>)
功能:返回日期型、日期时间型表达式的月份值,函数返回值为数值型。
【例2.38】
?MONTH(DATE()) && 结果为 4(假设系统当前日期为2010年5月20日)
(6)年份函数
格式:YEAR(<日期型表达式>|<日期时间型表达式>)
功能:返回日期型、日期时间型表达式的年份值,函数返回值为数值型。
【例2.39】
?YEAR(DATE()) && 结果为 2010(假设系统当前日期为2010年5月20日)
2.4.4 数据类型转换函数
(l)字符转换成ASCII码函数
格式:ASC(<字符表达式>)
功能:把<字符表达式>中的第一个字符转换成相应的ASCII码数值,函数返回值为数值型。
【例2.40】
?ASC("Visual FoxPro") && 结果为 86
(2)ASCII码值转换成字符函数
格式:CHR(<数值表达式>)
功能:把<数值表达式>的值转化成相应的ASCII码字符,函数返回值为字符型。
说明:<数值表达式>的值必须是0~255之间的整数。
【例2.41】
?CHR(86) && 结果为 V
(3)数值型转换为字符型函数
格式:STR(<数值表达式> [,<长度> [,<小数位数>]])
功能:将<数值表达式>的值转换成字符型数据。
说明:
① 转换时自动进行四舍五入,小数点和负号均计为一位。
② 默认<小数位数>,按整数处理;默认<长度>和<小数位数>,结果将只取整数部分,且长度固定为10位。
③ 如<长度>值大于转换后的字符串长度,则自动在转换后的字符串前加前导空格以满足规定的<长度>要求。
④ 如<长度>值小于<数值表达式>值的整数部分的位数(包括负号),则返回一串星号(*),表示溢出。
【例2.42】
X=12345.6789 ?STR(X,8,2) && 结果为 12345.68(长度8位,小数2位,7以后四舍五入) ?STR(X) && 结果为 12346(带5个前导空格) ?STR(X,3) && 结果为 ***
(4)字符型转换成数值型函数
格式:VAL(<字符表达式>)
功能:将由数字字符(包括正负号和小数点)组成的字符型数据转换为数值型数据。
说明:
① 转换时,只要遇到非数字字符就结束转换。若字符串的首字符就不是数字字符,则返回值为0。
② 转换后的小数位数默认为2位。
【例2.43】
?VAL("12345.678") && 结果为 12345.68 ?VAL("123S45.6789") && 结果为 123.00 ?VAL("S12345.6789") && 结果为 0.00
(5)字符型转换成日期型函数
格式:CTOD(<字符表达式>)
功能:将日期形式的字符串转换成日期型数据。
说明:<字符表达式>必须是一个有效的日期格式,并与SET DATE命令设置的格式一致。
【例2.44】
SET DATE TO MDY ?CTOD("05/20/10") && 结果为 05/20/10 SET DATE TO YMD SET CENTURY ON ?CTOD("2010/05/20") && 结果为 2010/05/20
(6)日期型转换成字符型函数
格式:DTOC(<日期型表达式>|<日期时间型表达式> [,1])
功能:返回对应一个日期或日期时间表达式的字符串。
说明:如有[,1]选项,则按照年月日的格式输出。
【例2.45】
X=CTOD("05/20/10") && 假设当前日期格式为月日年形式 ?DTOC(X) && 结果为 05/20/10 ?DTOC(X,1) && 结果为 20100520
2.4.5 测试函数
(1)条件测试函数
格式:IIF(<逻辑表达式>,<表达式1>,<表达式2>)
功能:如<逻辑表达式>的值为真,则函数值为<表达式1>的值,否则为<表达式2>的值。
【例2.46】
X=20 && 把数值20赋值给X Y=12 && 把数值12赋值给Y ?IIF(X>Y,50-X,100-Y) && 因<逻辑表达式>X>Y的值为真,故结果为30
(2)数据类型测试函数
格式:TYPE(<字符型表达式>)
功能:测试<字符型表达式>值的数据类型。
说明:函数返回一个大写字母,其含义如表2-6所示。
表2.6 TYPE函数的返回值及其含义
【例2.47】
X=15.25 && 把数值型常量15.25赋值给X Y="清华大学" && 把字符型常量赋值给Y Z=.F. && 把逻辑型常量赋值给Z ?TYPE("X"),TYPE("Y"),TYPE("Z") && 结果为 N C L ?TYPE("XYZ") && 结果为 U
(3)表文件首测试函数 && 文件首(文件开头,即第一条记录之前)
格式:BOF(<工作区号| 表别名>)
功能:测试当前或指定工作区中表的记录指针是否位于文件首(即第一条记录之前)。若是,返回逻辑真值(.T.);否则返回逻辑假值(.F.)。
说明:
① 默认参数,默认测试当前工作区中的表文件。
② 如指定工作区中没有打开表文件,则函数返回逻辑假值;如表文件中没有任何记录,则函数返回逻辑真值。
有关记录指针的概念将在3.4.2节中介绍。
【例2.48】
USE E:\VFP6\DATA\学生.DBF && 打开名为"学生"的数据表 ?BOF() && 此时记录指针指向第一条记录,结果为 .F. SKIP-1 && 将记录指针移向当前记录(首记录)之前 ?BOF() && 结果为 .T. && 文件尾(文件结束处,即末记录之后)
(4)表文件尾测试函数
格式:EOF([<工作区号|表别名>])
功能:测试当前或指定工作区中表的记录指针是否位于文件尾(即最后一条记录之后)。若是,则返回逻辑真值(.T.);否则返回逻辑假值(.F.)。
说明:如指定工作区中没有打开表文件,则函数返回逻辑假值;如表文件中没有任何记录,则函数返回逻辑真值。
【例2.49】
USE E:\VFP6\DATA\学生.DBF ?EOF() && 此时记录指针指向第一条记录,结果为 .F. GO BOTTOM && 将记录指针指向最后一条记录 ?EOF() && 结果为 .F. SKIP && 将记录指针移向当前记录(末记录)之后 ?EOF() && 结果为 .T.
(5)记录号测试函数
格式:RECNO([<工作区号|表别名>])
功能:给出当前或指定工作区中表文件当前记录的记录号,函数返回值为数值型。
说明:如指定工作区中没有打开表文件,则函数值为0;如记录指针指向文件尾,则函数值为表中的记录数加1;如记录指针指向文件首,则函数值为表中第一条记录的记录号;如表文件中没有任何记录,则函数值为1。
【例2.50】
USE E:\VFP6\DATA\学生.DBF ?RECNO() && 结果为 1 GO 4 && 将记录指针移向第4条记录 ?RECNO() && 结果为 4 GO BOTTOM && 将记录指针移向末记录 ?RECNO() && 结果为 10(假设表中只有10条记录) SKIP && 将记录指针移向当前记录(末记录)之后 ?RECNO() && 结果为 11
(6)检索测试函数
格式:FOUND([<工作区号|表别名>])
功能:测试在当前或指定工作区中,用FIND, SEEK, LOCATE等命令对表文件或索引文件的检索是否成功。若成功,则结果为逻辑真值;否则为逻辑假值。
(7)测试文件存在函数
格式:FILE(<"文件名">)
功能:测试指定的文件是否存在。若存在,则返回逻辑真值;否则返回逻辑假值。
说明:文件名必须包括扩展名,且文件名两端一定要用西文的引号括起来;如没有引号,系统将默认为是变量名。
【例2.51】 假设已在E:\VFP6\DATA文件夹中建立名为“学生.DBF”的表文件,则
?FILE("E:\VFP6\学生.DBF") && 结果为 .T.
(8)记录删除测试函数
格式:DELETED([<工作区号|表别名>])
功能:测试当前或指定工作区中的当前记录是否有删除标记。若有,则返回逻辑真值;否则返回逻辑假值。
(9)测试表文件名函数
格式:DBF([<工作区号|别名>])
功能:返回当前或指定工作区中打开的数据表文件名,返回值为字符型。
说明:如在指定工作区中没有打开的表文件,则返回空串。
【例2.52】
USE E:\VFP6\DATA\学生.DBF ?DBF() && 结果为 E:\VFP6\学生.DBF
(10)检测工作区号函数
格式:SELECT([0|1|表别名])
功能:返回当前工作区号或者未使用的工作区的最大编号。
说明:参数0指定SELECT返回当前工作区号;参数1指定SELECT返回未使用工作区的最大编号;参数“表别名”指定SELECT返回表文件别名所在的工作区编号。函数返回值为数值型。
(11)测试表文件是否打开函数
格式:USED([工作区|表别名])
功能:测试当前或指定的工作区中是否有表文件打开。若有,则返回逻辑真值;否则返回逻辑假值。
【例2.53】
USE E:\VFP6\学生.DBF ?USED() && 结果为 .T.
2.4.6 其他函数
(1)系统函数
格式:SYS(<数值表达式>)
说明:VFP提供了大量的系统函数SYS( )。根据<数值表达式>值的不同,系统将完成不同的功能。函数返回值为字符型。
例如,SYS( )返回机器名和网络机器号,SYS(5)返回当前默认的驱动器名,SYS(2018) 返回最近错误的出错原因信息。
(2)消息框函数
格式:MessageBox(<字符串表达式1> [,<数值表达式> [,<字符串表达式2>]])
功能:显示一个用户自定义对话框,不仅能给用户传递信息,还可以通过用户在对话框上的选择接收用户的响应,作为继续执行程序的依据。
说明:
① <字符串表达式1>指定对话框中要显示的信息。在字符串中可以含有回车符(CHR(13))以实现多行显示。对话框的高度和宽度将随显示的文本信息的长度自动变化。
② <数值表达式>指定对话框的类型参数,对话框类型参数可控制显示在对话框上的按钮和图标的种类及数目,以及焦点选项的按钮。对话框类型参数如表2-7所示。
表2.7 对话框类型参数及选项
对话框类型参数由三部分组成:按钮类型、图标类型和焦点选项,每一部分只能选择一个值,将三部分的值加在一起就是对话框类型参数的值。如省略该参数,则对话框内只显示一个默认的“确定”按钮,并将此按钮设置为焦点按钮,且不显示任何图标。
③ <字符串表达式2>指定对话框的标题内容。若省略该项,对话框标题将显示为“Microsoft Visual FoxPro”。
④ 当用户从对话框中选择并单击某一按钮后,函数返回一个值,表示某个按钮被选中,返回值与按钮的关系如表2-8所示。
表2.8 MessageBox函数返回值
【例2.54】 ?MessageBox("真的要退出吗? ",4+32+0, "提示信息")
执行该命令后,将弹出图2.1所示的对话框。
图2.1 自定义对话框
本节介绍了VFP中常用的一些系统函数。除此之外,VFP还提供了许多功能丰富的系统函数,由于篇幅限制,这里就不一一介绍了。
2.5 命令
VFP中的各种操作,既可以通过菜单或工具按钮方式完成,也可以通过命令方式完成。无论使用哪种操作,都可以执行VFP的相应命令。
前面已经使用过一些简单命令,如显示内存变量信息的DISPLAY MEMORY命令,输出表达式值的?或??命令等。VFP的命令格式通常为:命令动词+修饰子句,即以命令动词开头,辅以若干个修饰和限制的子句。
1.命令动词
所有命令都以命令动词开头,它决定了该命令的性质。命令动词一般为一个英文动词,表示要执行的命令功能。
2.子句
子句主要用来修饰或限制命令,通常用于对数据库中的数据操作,有3种形式。
(1)范围子句 该子句指明在哪些记录范围内执行命令,可从下面4种范围内选择一种:
RECORD <N> 表示指定第N条记录
NEXT <N> 表示从当前记录开始的N条记录(不含当前记录)
ALL表示数据库的所有记录
REST表示从当前记录开始到最后一条记录(不含当前记录)
(2)FIELDS子句 该子句后面跟一个字段名列表(字段名之间用逗号隔开),指明对数据表中的哪些字段执行命令。如不选择这个子句,表示对记录中的所有字段执行命令。
(3)FOR|WHILE子句 该子句后面跟一个逻辑表达式,表示仅对符合条件(即表达式的结果为.T.)的记录执行命令操作。这两个子句的区别是:FOR子句在整个数据表中对所有记录按条件筛选,对符合条件的记录进行操作;WHILE子句则从当前记录开始按顺序比较条件,对符合条件的记录进行操作,一旦遇到不满足条件的记录就终止命令,不论后面是否还存在符合条件的记录。
例如,用命令方式对学生数据表中的记录进行以下操作(设学生表中有学号、姓名、性别和出生日期等字段)。
① 显示所有女生的信息:
LIST ALL FOR性别="女"
② 显示从当前记录开始连续5条记录的内容:
LIST NEXT 5 && 表示从当前记录开始(不含当前记录)的连续5条记录
若当前记录号为4,则执行该命令后将显示记录号为5,6,7,8和9的5条记录内容。
③ 显示所有女生的学号、姓名和出生日期:
LIST FIELDS学号,姓名,出生日期 FOR性别="女"
3.命令书写规则
使用VFP命令时,一般应遵循以下规则:
(1)必须以命令动词开头,命令中可以含有一个或多个子句,子句的顺序任意。
(2)命令动词和各子句之间用空格分开(空格数任意)。
(3)命令动词可只写不少于前4个字符,且不区分大小写。
(4)命令行的最大长度为254个字符,一行写不下时,要在行尾加续行符“;”(西文分号)分行,并在下一行继续书写。
本书所给出的命令格式中,方括号([ ])表示可选项,尖括号(< >)表示必选项(具体内容由用户提供),竖杠分隔符(|)表示在其左右参量中任选一项。
VFP中提供了大量命令,在后续章节中将具体介绍。本书后的附录中列出了部分常用命令及其功能简介。
习题2
2.1 思考题
1. VFP提供了哪几种数据类型?
2. 字段变量和内存变量有什么不同?
3. 什么是数组?如何定义数组以及为数组元素赋值?
4. 如何表示字符型、日期型和逻辑型常量?举例说明。
5. 什么是表达式?VFP中有哪几种类型的表达式?
6. 如何调用函数?
7. 设有如下变量:性别(C)、出生日期(D)、职称(C)、工资(N)、婚否(L),写出符合以下要求的逻辑表达式。
(1)工资在1000元与2000元之间
(2)年龄在35岁以上的未婚男职工
(3)1970年以前出生、工资高于500元但低于1000元的女职工
(4)职称是“工程师”或“高工”的已婚女职工
2.2 选择题
1. 用DIMENSION命令定义了一个数组,其数组元素在未赋值之前的默认值是( )。
(A)不确定
(B)0
(C).F.
(D)" "(空)
2. 以下数据中属于字符型数据的是( )。
(A)06/10/02
(B)"06/10/02"
(C){06/10/02}
(D)(06/10/02)
3. 若想从字符串“大连市”中取出汉字“连”,应该使用的表达式是( )。
(A)SUBSTR("大连市",2,2)
(B)SUBSTR("大连市",2,1)
(C)SUBSTR("大连市",3,1)
(D)SUBSTR("大连市",3,2)
4. 在VFP中,逻辑型、日期型和备注型字段的长度分别是( )。
(A)1,8,128
(B)1,8,10
(C)1,8,4
(D)1,10,4
5. 以下命令中正确的是( )。
(A)STORE 0 TO X,Y
(B)STORE 0,1 TO X,Y
(C)X=0,Y=1
(D)X=Y=0
6. 下列函数中,函数值为字符类型的是( )。
(A)CTOD('02/03/98')
(B)AT("计算机","全国计算机等级考试")
(C)TYPE('2')
(D)SUBSTR(DTOC(DATE( )),7)
7. 函数TYPE("10/20/99")的值是( )。
(A)10/20/99
(B)C
(C)D
(D)N
8. 函数STR(125.86,7,3)的值是( )。
(A)125.86
(B)"125.86"
(C)125.860
(D)"125.87"
9. 若M="95.5",则执行命令?20+&M的结果是( )。
(A)2095.5
(B)115.5
(C)20+&M
(D)20
10. 以下4个符号中,表示常量的是( )。
(A)F
(B)BOTTOM
(C).F.
(D)TOP
11. 设工资=640,职称="副教授",性别="男",则结果为假的逻辑表达式是( )。
(A)工资>500 .AND. 职称="副教授" .AND. 性别="男"
(B)性别="女" .OR. .NOT.职称="助教"
(C)工资>550 .AND. 职称="副教授" .OR.职称="讲师"
(D)工资=550 .AND.(职称="教授".OR. 性别="男")
12. 下列字段名或变量名中不正确的是( )。
(A)2CLIEN_ID
(B)姓名
(C)COLOR_CODE
(D)年龄
13. 执行SET EXACT OFF命令后,下列表达式的结果为真的是( )。
(A)"上海"="上海市"
(B)"上海市"="上海"
(C)"上海市"=="上海"
(D)"上海"=="上海市"
14. 以下日期值正确的是( )。
(A){^2002-03-20}
(B){"2002-03-20"}
(C){2002-03-20}
(D)(2002-03-20)
2.3 填空题
1. 如打开一个空数据表文件,用函数RECNO( )测试,其结果一定是_____。
2. 若ABC="伟大的祖国",则?SUBSTR(ABC,LEN(ABC)/5+1,4)的结果为_____。
3. 当内存变量名与数据表中的字段变量名相同时,要访问该内存变量,必须在变量名前加上前缀______,否则系统将优先访问同名的字段变量。
4. 执行DIMENSION X(3,4)命令之后,数组X中的元素个数是______。
5. 若X="12345",则执行命令?TYPE("&X")的结果是______。
6. 设X=2,则执行命令?X=X+1的结果是______。
7. 设当前日期为2002年8月4日,则在VFP中用严格的日期格式表示为______。
8. 设当前日期格式为月日年,若要改为年月日的格式,应使用命令______。
9. 内存变量的数据类型由 决定______,可以把不同类型的数据赋给同一个变量。
10. TIME( )函数返回值的数据类型是______。
2.4 上机练习题
1. 变量操作
(1)内存变量的赋值和显示。在命令窗口中定义下述变量,并执行相应的操作。
CLEAR MEMORY X1=4*25 X2="ABC" X3={^2002-03-20} STORE .F. TO Y1,Y2 ?X1,X2,X3,Y1,Y2 DISPLAY MEMORY LIST MEMORY LIKE X* LIST MEMORY LIKE ?2
(2)数组的定义及赋值操作。在命令窗口中定义两个数组变量,并执行相应的操作。
CLEAR MEMORY DIMENSION A1(5),A2(2,3) STORE 0 TO A1 A1(2)= "HELLO" A2(1,3)=10.5 A2(2,1)= "MORNING" LIST MEMORY LIKE A?
2. 函数与表达式操作。在命令窗口中输入下列命令,按回车键执行。
(1)
性别="男" 年龄=25 职称="助教" 工资=1500 婚否=.F. ? 年龄>25.AND. 职称="助教" ? 年龄<25 .OR. 工资<2000 .AND. .NOT. 职称="讲师" ? 性别="女" .AND. (职称="讲师" .OR. .NOT. 婚否) ? 性别="女" .AND. 职称="讲师" .OR. .NOT. 婚否
(2)
A=5 B=STR(A,1) C="学生&B" ?A,B,C
(3)
SET DATE TO MDY 出生日期=CTOD("03/20/96") ?STR(YEAR(出生日期),4)+ "年"+STR(MONTH(出生日期),2)+ "月"; +STR(DAY(出生日期),2)+ "日"
(4)
X=SUBSTR("12340.5",4,4) - "5" Y=RIGHT(X,4) ?X,Y,&X+&Y