Visual FoxPro
1
i s u a l
F
V
o x P r o
Visual FoxPro
2
3.1 Visual FoxPro的数据类型
3.2 Visual FoxPro的常量与变量
3.3 Visual FoxPro的内部函数
3.4 Visual FoxPro的表达式
Visual FoxPro
3
1.字符型
字符型( Character)数据是不能进行算术运算的
文字数据类型,用字母 C表示。字符型数据包
括中文字符、英文字符、数字字符和其他
ASCII字符,其长度(即字符个数)范围是 0~
254个字符。
3.1 Visual FoxPro的数据类型
Visual FoxPro
4
2.数值型
数值型( Numeric)数据是表示数量并可以进行算
术运算的数据类型,用字母 N表示。数值型数据由
数字、小数点和正负号组成。数值型数据在内存中
占用 8个字节,相应的字段变量其长度(数据位数)
最大 20位。
在 Visual FoxPro中,具有数值特征的数据类型还有
整型( Integer)、浮点型( Float)和双精度型
( Double),不过这 3种数据类型只能用于字段变
量。
Visual FoxPro
5
3.货币型
货币型( Currency)数据是为存储货币值而使用的一
种数据类型,它默认保留 4位小数,占据 8字节存储
空间。货币型数据用字母 Y表示。
4.日期型
日期型( Date)数据是表示日期的数据,用字母 D表
示。日期的默认格式是 {mm/dd/yy},其中 mm表示
月份,dd表示日期,yy表示年度,年度也可以是 4
位。日期型数据的长度固定为 8位。日期型数据的
显示格式有多种,它受系统日期格式设置的影响。
Visual FoxPro
6
5.日期时间型
日期时间型( Date Time)数据是表示日期和时间
的数据,用字母 T表示。日期时间的默认格式是
{mm/dd/yyyy hh:mm:ss},其中 mm,dd,yyyy的意
义与日期型相同,而 hh表示小时,mm表示分钟,
ss表示秒数。日期时间型数据也是采用固定长度 8位,
取值范围是:日期为 01/01/0001~ 12/31/9999,时间
为 00:00:00~ 23:59:59。如 {08/16/2003 10:35:30}表
示 2003年 8月 16日 10时 35分 30秒这一日期和时间。
Visual FoxPro
7
6.逻辑型
逻辑型( Logic)数据是描述客观事物真假的数据类
型,表示逻辑判断的结果,用字母 L表示。逻辑型数
据只有真(,t.或,y.)和假(,f.或,n.)两种,长度固定
为 1位。
7.备注型
备注型( Memo)数据是用于存放较多字符的数据
类型,用字母 M表示。备注型数据没有数据长度限制,
仅受限于磁盘空间。它只用于表中字段类型的定义,
字段长度固定为 4个字节,实际数据存放在与表文件同
名的备注文件(,fpt)中,长度根据数据内容而定
Visual FoxPro
8
8.通用型
通用型( General)数据是存储 OLE(对象链接与
嵌入)对象的数据类型,用字母 G表示。通用型数
据中的 OLE对象可以是电子表格、文档、图形、
声音等。它只用于表中字段类型的定义。通用型数
据字段长度固定为 4位,实际数据长度仅受限于磁
盘空间。
9.二进制字符型和二进制备注型
这两类数据是以二进制格式存储的数据类型,只能
用在表中字段数据的定义。所存储的数据不受代码
页改变的影响。
Visual FoxPro
9
3.2.1 常量
1.字符型常量
字符型常量是用定界符括起来的一串字符。在
Visual FoxPro中,定界符有 3种:单撇号、双撇号
和方括号。如 'Central South University',"410075"、
[教授 ]等都是字符型常量。
如果某一种定界符本身是字符型常量中的字符,就
应选择另一种定界符。例如,"That's right!"表示
字符常量,That's right!,含有 13个字符。
3.2 Visual FoxPro的常量与变量
Visual FoxPro
10
2,数值型常量
数值型常量就是平时所讲的常数,由数字、小
数点和正负号组成。在 Visual FoxPro中,数值型常
量有两种表示方法:小数形式和指数形式。如 75、
-3.75是小数形式的数值型常量。指数形式通常用来
表示那些绝对值很大或很小、而有效位数不太长的
一些数值,对应于日常应用中的科学记数法。
指数形式用字母 E来表示以 10为底的指数,E左边
为数字部分,称为尾数,右边为指数部分,称为阶
码。阶码只能是整数,尾数可以是整数,也可以是
小数。尾数与阶码均可正可负。例如,常量
0.6947× 10-6,4.9523× 109分别用指数形式表示为
0.6947E-6,4.9523E9。
Visual FoxPro
11
3.货币型常量
货币型常量的书写格式与数值型常量类似,但要加上
一个前置的 $。货币型数据在存储和计算时,采用 4
位小数。如果一个货币型常量多于 4位小数,那么
系统会自动将多余的小数位四舍五入。例如,货币
型常量 $3.1415926将存储为 $3.1416。货币型常量不
能采用指数形式。
4.日期型常量
日期型常量要放在一对花括号中,花括号内包括年、
月、日 3部分内容,各部分内容之间用分隔符分隔。
分隔符可以是 /,-,.等。 Visual FoxPro的默认日期
格式是 {mm/dd/[yy]yy}。
Visual FoxPro
12
5.日期时间型常量
日期时间型常量也要放在一对花括号中,其中既含
日期又含时间。日期的格式与日期型常量相同,时
间包括时、分、秒,时分秒之间用,,”分隔。日期
时间型常量的默认格式是:
{mm/dd/[yy]yy [,] [hh[:mm[:ss]][a|p]]}
其中 hh,mm,ss的默认值分别为 12,0和 0。 a和 p
分别表示 AM(上午)和 PM(下午),默认为 AM。
如果指定时间大于等于 12,则自然为下午的时间。
Visual FoxPro
13
日期值和日期时间值的输入格式与输出格式并不完
全相同,特别是输出格式受系统环境设置的影响,
用户可根据应用需要进行相应设置。下面介绍有关
命令。
( 1)日期格式中的世纪值
通常日期格式中用 2位数表示年份,但涉及到世纪
问题就不便区分。 Visual FoxPro提供设置命令对此
进行相应设置。
命令格式, SET CENTURY ON | OFF | TO [nCentury]
Visual FoxPro
14
命令功能,用于设置显示日期时是否显示世纪。其
中,ON表示日期值输出时显示年份值,即日期数据
显示 10位,年份占 4位。 OFF(默认值)表示日期值
输出时不显示年份值,即日期数据显示 8位,年份占
2位。 TO [nCentury]指定日期数据所对应的世纪值,
nCentury是一个 1~ 99的整数,代表世纪数。
Visual FoxPro
15
( 2)设置日期显示格式
用户可以调整、设置日期的显示输出格式。
命令格式,
SET DATE [TO] AMERICAN | ANSI | BRITISH |
FRENCH | GERMAN | ITLIAN | JAPAN | USA |
MDY | DMY | YMD | SHORT | LONG
命令功能,设置日期的显示输出格式。系统默认为
AMERICAN(美国日期格式)。如果日期格式设
置为 SHORT或 LONG格式,Visual FoxPro将按
Windows系统设置的短日期格式或长日期格式显示
输出日期数据,而且 SET CENTURY命令的设置被
忽略。
Visual FoxPro
16
( 3)设置日期分隔符
命令格式, SET MARK TO [日期分隔符 ]
命令功能,设置显示日期时使用的分隔符,如 /,-,.
等。如没有指定任何分隔符,则恢复系统默认的斜
杠分隔符。
( 4)设置日期 2000年兼容性
通常日期型和日期时间型数据的结果,与 SET
DATE命令和 SET CENTURY命令设置状态及当前
系统时间有关。由于系统时间与相应设置不同,同
一数据的结果可能有不同的解释。如日期值
{10/11/12}可以解释为 1912年 10月 11日,2012年 10月
11日,1912年 11月 10日,1910年 11月 12日或者 2010
年 11月 12日等。这显然会导致系统混乱,而且还可
能造成 2000年兼容性错误,影响系统正常运行。
Visual FoxPro
17
Visual FoxPro增加了一种所谓严格的日期格式。不
论哪种设置,按严格日期格式表示的日期型和日期
时间型数据,都具有相同的值和表示形式。严格的
日期格式是,
{^yyyy-mm-dd[,][hh[:mm[:ss]][a|p]]}
其中,^表明该格式是严格的日期格式,并按照 YMD
的格式解释日期型和日期时间型数据,它是严格日
期格式的标志,不可缺少。有效的日期型和日期时
间型数据分隔符为,/,-,.和空格。如 {^2003-08-
16},{^2003-08-16 10:35:30a},分别以严格的日期
格式表示 2003年 8月 16日及该日上午 10时 35分 30秒
Visual FoxPro
18
Visual FoxPro默认采用严格的日期格式,并以此检
测所有日期型和日期时间型数据的格式是否规范、
合法。
命令格式,SET STRICTDATE TO [0 | 1 | 2]
命令功能,用于设置是否对日期格式进行检测。其中,
0表示不进行严格的日期格式检测。 1表示进行严格
的日期格式检测(默认值),要求所有日期型和日
期时间型数据均按严格的格式。 2表示进行严格的
日期格式检测,并且对 CTOD和 CTOT函数的格式
也有效。省略各选项时,恢复系统默认值,等价于
1的设置。
Visual FoxPro
19
除了利用命令方式设置外,也可以用菜单方式进行
设置设置。在, 工具, 菜单中选择, 选项,,将打开
,选项, 对话框,在, 区域, 选项卡中可以设置日期
和时间的显示格式。在, 常规, 选项卡中可以设置
2000年兼容性。
6.逻辑型常量
逻辑型常量表示逻辑判断的结果,只有, 真, 和
,假, 两种值。在 Visual FoxPro中,逻辑真
用,T.,.t.,.Y.或,y.表示,逻辑假用,F.,.f.,.N.或,n.
表示。注意字母前后的圆点一定不能丢。
Visual FoxPro
20
3.4.2 变量
变量是在操作过程中可以改变其值的数据对象。
在 Visual FoxPro中变量分为字段变量、内存变量、
数组变量和系统变量 4类。此外,作为面向对象的
程序设计语言,Visual FoxPro在进行面向对象的程
序设计中引入了对象的概念,对象实质上也是一类
变量。确定一个变量,需要确定其 3个要素:变量
名、数据类型和变量值。
Visual FoxPro
21
1.命名规则
( 1)使用字母、汉字、下划线和数字命名。
( 2)命名以字母或下划线开头。除自由表中字段
名、索引的 TAG标识名最多只能 10个字符外,其
他的命名可使用 1~ 128个字符。
( 3)为避免误解、混淆,避免使用 Visual FoxPro
的保留字。
( 4)文件名的命名应遵循操作系统的约定。
Visual FoxPro
22
2.字段变量
字段变量就是表中的字段名,它是表中最基本的数
据单元。字段变量是一种多值变量,一个表有多少
条记录,那么该表的每一字段就有多少个值,当用
某一字段名做变量时,它的值就是表记录指针所指
的那条记录对应字段的值。字段变量的类型可以是
Visual FoxPro的任意数据类型。字段变量的名字、
类型、长度等是在定义表结构时定义的。
Visual FoxPro
23
3.内存变量
Visual FoxPro中,除了字段变量外,还有一种变
量,它独立于表,是一种临时工作单元,称为内
存变量。内存变量的类型有字符型、数值型、货
币型、逻辑型、日期型和日期时间型等。
可直接用内存变量名对内存变量进行访问,但若
它与字段变量同名时,则应该用如下格式进行访
问:
M.内存变量名
M->内存变量名
Visual FoxPro
24
( 1)内存变量的赋值
给内存变量赋值的命令有两种格式:
<内存变量 >=<表达式 >
STORE <表达式 > TO <内存变量表 >
该命令先计算表达式的值,然后将表达式的值赋给一
个或几个内存变量。第一种格式只能给一个内存变
量赋值。第二种格式可以同时给多个内存变量赋相
同的值,各内存变量名之间用逗号分隔。内存变量
的数据类型取决于表达式值的类型。可以通过对内
存变量重新赋值来改变其值和类型。
Visual FoxPro
25
( 2) 内存变量的显示
可以用命令显示当前已定义的内存变量的有关信息,
包括变量名, 作用域, 类型和取值 。 命令格式为:
DISPLAY MEMORY [LIKE < 通配符 >] [TO
PRINTER][TO FILE <文件名 >]
LIST MEMORY [LIKE < 通配符 >] [TO
PRINTER][TO FILE <文件名 >]
其中, LIKE选项表示显示与通配符相匹配的内存变
量, 在 <通配符 >中允许使用符号?和 *,分别代表单
个字符和多个字符 。 TO PRINTER或 TO FILE <文
件名 >选项可将内存变量的有关信息在打印机上打
印出来, 或者以给定的文件名存入文本文件中 ( 扩
展名为,txt) 。
Visual FoxPro
26
LIST命令一次显示所有内存变量,如果内存
变量多,一屏显示不下,则连续向上滚动。而
DISPLY命令分屏显示所有内存变量,如果内
存变量多,显示一屏后暂停,按任意键后再继
续显示下一屏。
Visual FoxPro
27
( 3)内存变量文件的建立
将所定义的内存变量的各种信息全都保存到一个文件
中,该文件称为内存变量文件。其默认的扩展名
为,mem。建立内存变量文件命令的格式为:
SAVE TO <内存变量文件名 > [ALL [LIKE|EXCEPT
<通配符 >]]
其中,ALL表示将全部内存变量存入文件中。 ALL
LIKE <通配符 >表示内存变量中所有与通配符相匹
配的内存变量都存入文件。 ALL EXCEPT <通配符
>表示把与通配符不匹配的全部内存变量存入文件
中。
Visual FoxPro
28
( 4)内存变量的恢复
内存变量的恢复是指将已存入内存变量文件中的内存
变量从文件中读出,装入内存中。其命令格式为:
RESTORE FROM <内存变量文件名 > [ADDITIVE]
若命令中含有 ADDITIVE任选项,系统不清除内存中
现有的内存变量,并追加文件中的内存变量。
Visual FoxPro
29
( 5)内存变量的清除
清除内存变量并释放相应的内存空间,所采用命
令的格式为:
CLEAR MEMORY
RELEASE [<内存变量表 >][ALL
[LIKE|EXCEPT <通配符 >]]
其中第一条命令是清除所有的内存变量,第二条
命令是清除指定的内存变量。
Visual FoxPro
30
4.数组变量
在 Visual FoxPro中,数组变量被定义为一组变量的集
合,这些变量可以具有不同的数据类型。数组由数
组元素组成,每个数组元素就相当于一个内存变量,
它可以用数组名后接顺序号来表示,顺序号也叫下
标。
( 1)数组的定义
Visual FoxPro规定,数组在使用之前必须用数组说明
命令进行定义,即定义数据名、维数和大小。其命
令格式为:
DIMENSION <数组名 >(<下标上界 1>[,<下标上界
2])[,… ]
DECLARE <数组名 >(<下标上界 1>[,<下标上界 2])[,… ]
Visual FoxPro
31
两条命令的功能完全相同,用于定义一维或二维
数组。下标上界是一数值量,下标的下界由系
统统一规定为 1。
数组一经定义,它的每个元素都可当作一个内存
变量来使用,因此它具有与内存变量相同的性
质。 Visual FoxPro命令行中可以使用内存变量
的地方都能用数组元素代替。
Visual FoxPro
32
( 2)数组的赋值
可以使用赋值命令给数组元素赋值,也可以给整个数
组的各个元素赋以相同的值。例如命令:
b=73
为上面定义的二维数组 b的 6个元素都赋以同样的值 73。
在没有向数组元素赋值之前,数组元素的初值均为逻
辑假(,F.)值。
在 Visual FoxPro中,二维数组各元素在内存中按行的
顺序存储,它们也可按一维数组元素的顺序来存取
数据。如上述二维数组 b中的元素 b(2,1)是排在第 2
行第 1列,由于每一行是 3个元素,所以 b(2,1)也可
按 b(4)表示。
Visual FoxPro
33
3.3.1 数值函数
1,求绝对值函数
格式,ABS(<数值型表达式 >)
功能:求数值型表达式的绝对值 。 函数值为数值型 。
2,求平方根函数
格式,SQRT(<数值型表达式 >)
功能:求数值型表达式的算术平方根, 数值型表达
式的值应不小于零 。 函数值为数值型 。
3,求指数函数
格式,EXP(<数值型表达式 >)
功能:将数值型表达式的值作为指数 x,求出 ex的值 。函数值为数值型 。
3.3 Visual FoxPro的内部函数
Visual FoxPro
34
4,求对数函数
格式,LOG(<数值型表达式 >)
LOG10(<数值型表达式 >)
功能,LOG求数值型表达式的自然对数, LOG10
求数值型表达式的常用对数, 数值型表达式的
值必须大于零 。 函数值为数值型 。
5,取整函数
格式,INT(<数值型表达式 >)
CEILING(<数值型表达式 >)
FLOOR(<数值型表达式 >)
Visual FoxPro
35
功能,INT取数值型表达式的整数部分 。 CEILING
取大于或等于指定表达式的最小整数 。 FLOOR取
小于或等于指定表达式的最大整数 。 函数值均为数
值型 。
举例:
x=56.72
INT(x),INT(-x),CEILING(x),CEILING(-
x),FLOOR(x),FLOOR(-x)
三个函数的值依次为 56,-56,57,-56,56,-57。
Visual FoxPro
36
6,求余数函数
格式,MOD(<数值型表达式 1>,<数值型表达式 2>)
功能:求 <数值型表达式 1>除以 <数值型表达式 2>
所得出的余数, 所得余数的符号和表达式 2相同 。
如果被除数与除数同号, 那么函数值即为两数相
除的余数 。 如果被除数与除数异号, 则函数值为
两数相除的余数再加上除数的值 。 函数值为数值
型 。
Visual FoxPro
37
举例:
MOD(25,7),MOD(25,-7),MOD(-25,7),MOD(-25,-7)
输出的函数值依次为 4,-3,3,-4。
显然如果 M除以 N的余数为 0,则 M能被 N整数 。 例如
x=521
x1=INT(x/100)
x2=INT(MOD(x,100)/10)
x3=MOD(x,10)
x1+10*x2+100*x3
输出为 125。 显然 x1,x2,x3分别为 x的百, 十, 个位
数字 。
Visual FoxPro
38
7,四舍五入函数
格式,ROUND(<数值型表达式 1>,<数值型表达式 2>)
功能:对 <数值型表达式 1>求值并保留 n位小数, 从
n+1位小数起进行四舍五入 n的值由数值型表达式 2
确定 ),若 n小于 0,则对 <数值型表达式 1>的整数部
分按 n的绝对值进行四舍五入 。
举例:
ROUND(3.1415*3,2),ROUND(156.78,-1)
输出的函数值分别为 9.42和 160。
Visual FoxPro
39
8,求最大值和最小值函数
格式,MAX(<表达式 1>),<表达式 2>,…,<表达式 n>)
MIN(<表达式 1>,<表达式 2>,…,<表达式 n>)
功能,MAX求 n个表达式中的最大值, MIN求 n个表
达式中的最小值 。 表达式的类型可以是数值型, 字
符型, 货币型, 浮点型, 双精度型, 日期型和日期
时间型, 但所有表达式的类型应相同 。 函数值的类
型与自变量的类型一致 。
Visual FoxPro
40
举例:
MAX({^2003-08-16},{^2002-08-16}),MIN(? 助
教 ’,?讲师 ’,?副教授 ’,?教授 ’ )
输出的函数值分别为 08/16/03,副教授 。
9.π函数
格式,PI()
功能:返回圆周率 π的近似值 。
Visual FoxPro
41
3.3.2 字符函数
字符函数是处理字符型数据的函数, 其自变量或函
数值中至少有一个是字符型数据 。
1,宏代换函数
格式,&<字符型内存变量 >[.字符表达式 ]
功能:代换出一个字符型内存变量的内容 。 若 <
字符型内存变量 >与后面的字符无空格分界, 则 &
函数后的,,”必须有 。
Visual FoxPro
42
举例:
i="1"
j="2"
x12="Good"
Good=MAX(96/01/02,65/05/01)
x&i.&j,&x12
输出的内容依次是 Good和 48。 又如
m="245*SQRT(4)"
34+&m
输出为 524.00。
Visual FoxPro
43
2,求字符串长度函数
格式,LEN(字符型表达式 )
功能:求字符串的长度, 即所包含的字符个数 。
若是空串, 则长度为 0。 函数值为数值型 。
3,求子串位置函数
格式,AT(<字符型表达式 1>,<字符型表达式 2>)
ATC(<字符型表达式 1>,<字符型表达式 2>)
功能:若 <字符型表达式 1>的值存在于 <字符型表
达式 2>的值中, 则给出 <字符表达式 1>在 <字符型
表达式 2>中的开始位置, 若不存在, 则函数值为
0。 函数值为数值型 。 ATC函数在子串比较时不
区分字母大小写 。
Visual FoxPro
44
举例:
xm="李小四 "
AT(" 李 ",xm),AT("PRO","Visual
FoxPro"),ATC("PRO","Visual FoxPro")
输出的函数值分别为 1,0,11。
Visual FoxPro
45
4,取子串函数
格式,LEFT(<字符型表达式 >,<数值型表达式 >)
RIGHT(字符型表达式 >,<数值型表达式 >
SUBSTR(<字符型表达式 >,<数值型表达式 1>[,<数值型
表达式 2>]
功能,LEFT函数从字符型表达式左边的第一个字符
开始截取子串, RIGHT函数从字符型表达式右边的
第一个字符开始截取子串 。 若数值型表达式的值大
于 0,且小于等于字符串的长度, 则子串的长度与
数值型表达式值相同 。 若数值型表达式的值大于字
符串的长度, 则给出整个字符串 。 若数值型的表达
式小于或等于 0,则给出一个空字符串 。
Visual FoxPro
46
SUBSTR函数对字符型表达式从指定位置开始截取若
干个字符 。 起始位置和字符个数分别由数值型表达
式 1和数值型表达式 2决定 。 若字符个数省略, 或字
符个数多于从起始位置到原字符串尾部的字符个数,
则取从起始位置起, 一直到字符串尾的字符串作为
函数值 。 若起始位置或字符个数为 0,则函数值为
空串 。 显然 SUBSTR函数可以代替 LEFT函数和
RIGHT函数的功能 。
举例:
xm="李小四 "
SUBSTR(xm,1,2),LEFT(xm,1)
输出的函数值均为:李 。 若 xm代表职工姓名, 则用这
两个函数可以取出职工的姓 。
Visual FoxPro
47
5,删除字符串前后空格函数
格式,LTRIM(<字符型表达式 >)
RTRIM(<字符型表达式 >)
ALLTRIM(<字符型表达式 >)
功能,LTRIM删除字符串的前导空格 。
RTRIM 删除字符串的尾部空格 。 RTRIM亦可写成
TRIM。
ALLTRIM 删 除 字 符 串 中 的 前 导 和 尾 部 空 格 。
ALLTRIM函数兼有 LTRIM和 RTRIM函数的功能 。
Visual FoxPro
48
6,生成空格函数
格式,SPACE(<数值型表达式 >)
功能:生成若干个空格, 空格的个数由数值型表达
式的值决定 。
举例:
name=SPACE(8)
LEN(LTRIM(name))
输出的函数值为 0。
Visual FoxPro
49
7,字符串替换函数
格式,STUFF(<字符型表达式 1>,<数值型表达式
1>,<数值表达式 2>,<字符型表达式 2>)
功能:用 <字符型表达式 2>去替换 <字符型表达式 1>中
由起始位置开始所指定的若干个字符 。 起始位置和
字符个数分别由数值型表达式 1和数值型表达式 2指
定 。 如果字符型表达式 2的值是空串, 则字符型表
达式 1中由起始位置开始所指定的若干个字符被删
除 。
举例:
STORE ?中国 长沙 ’ TO x
STUFF(x,6,4,?北京 ’ )
输出为:中国 北京 。
Visual FoxPro
50
8,产生重复字符函数
格式,REPLICATE(<字符型表达式 >,<数值型表达
式 >)
功能:重复给定字符串若干次, 次数由数值型表达
式给定 。
举例:
REPLICATE (?*?,6)
输出为,******。
Visual FoxPro
51
9,大小写字母转函数
格式,LOWER(<字符型表达式 >)
UPPER(<字符型表达式 >)
功能,LOWER将字符串中的大写字母转换成小写 。
UPPER将字符串中的小写字母转换成大写 。
举例:
yn="y"
UPPER(yn),LOWER("YES")
输出的函数值为,Y,yes。 在字符串中, 同一字母的
大小写为不同字符, 如果利用大小字母转换函数,
就可以不考虑字符串中的字母是大写还是小写 。
Visual FoxPro
52
3.3.3 日期和时间函数
日期时间函数是处理日期型或日期时间型数据的
函数 。
1,系统日期和时间函数
格式,DATE()
TIME()
DATETIME()
功能,DATE函数给出当前的系统日期, 函数值为日
期型 。
TIME函数给出当前的系统时间, 形式为 hh:mm:ss,
函数值为字符型 。
DATETIME函数给出当前的系统日期和时间, 函数
值为日期时间型 。
Visual FoxPro
53
2,求年份, 月份和天数函数
格式,YEAR(<日期型表达式 >|<日期时间型表达式 >)
MONTH(<日期型表达式 >|<日期时间型表达式 >)
DAY(<日期型表达式 >|<日期时间型表达式 >)
功能,YEAR函数返回日期表达式或日期时间型表达
式所对应的年份值 。
MONTH函数返回日期型表达式或日期时间型表达式
所对应的月份, 月份以数值 1~ 12来表示 。
DAY函数返回日期型表达式或日期时间型表达式所对
应月份里面的天数 。
Visual FoxPro
54
举例:
d={^2003-08-16}
YEAR(d),MONTH(d),DAY(d)
输出的函数值分别为 2003,8,16。
Visual FoxPro
55
3,求时, 分和秒函数
格式,HOUR(<日期时间型表达式 >)
MINUTE(<日期时间型表达式 >)
SEC(<日期时间型表达式 >)
功能,HOUR函数返回日期时间型表达式所对应的
小时部分 (按 24小时制 )。
MINUTE函数返回日期时间型表达式所对应的分钟
部分 。
SEC函数返回日期时间型表达式所对应的秒数部分 。
Visual FoxPro
56
举例:
d={^2003-08-16,5:43:56 P}
HOUR(d),MINUTE(d),SEC(d)
输出的函数值分别为 17,43,56。
Visual FoxPro
57
3.3.4 数据类型转换函数
1,将字符转换成 ASCII码的函数
格式,ASC(<字符型表达式 >)
功能:给出指定字符串最左边的一个字符的 ASCII
码值 。 函数值为数值型 。
2,将 ASCII值转换成相应字符函数
格式,CHR(<数值型表达式 >)
功能:将数值型表达式的值作为 ASCII码, 给出
所对应的字符 。
Visual FoxPro
58
举例:
ch1="M"
ch2=CHR(ASC(ch1)+ASC("a")-ASC("A"))
ch2
字符变量 ch2的值为 m。 若 ch1的值为某个大写
字母, 则利用求 ch2的表达式可求出对应的小
写字母 。 注意, 在 ASCII表中, 字母是连续排
列的, 任何一个字母其大小写 ASCII码值之差
是相等的 。
Visual FoxPro
59
3,将字符串转换成日期或日期时间函数
格式,CTOD(<字符型表达式 >)
CTOT(<字符型表达式 >)
功能,CTOD函数将指定的字符串转换成日期型
数据, CTOT函数将指定的字符串转换成日期时
间型数据 。 字符型表达式中的日期部分格式要与
系统设置的日期显示格式一致, 其中的年份可以
用 4位, 也可以用 2位 。 如果用 2位, 则世纪值由
SET CENTURY TO 命令指定 。
Visual FoxPro
60
举例:
ch1="M"
ch2=CHR(ASC(ch1)+ASC("a")-ASC("A"))
ch2
字符变量 ch2的值为 m。 若 ch1的值为某个大写字
母, 则利用求 ch2的表达式可求出对应的小写字
母 。 注意, 在 ASCII表中, 字母是连续排列的,
任何一个字母其大小写 ASCII码值之差是相等的 。
Visual FoxPro
61
4,将日期或日期时间转换成字符串函数
格式,DTOC(<日期表达式 >|<日期时间表达式 >[,1])
TTOC(<日期时间表达式 >[,1])
功能,DTOC函数将日期数据或日期时间数据的日
期部分转换为字符型, TTOC函数将日期时间数据
转换为字符型 。 字符串中日期和时间的格式受系统
设置的影响 。 对 DTOC来说, 若选用 1,结果为
yyyymmdd格式 。 对 TTOC来说, 若选用 1,结果为
yyyymmddhhmmss格式 。
Visual FoxPro
62
5,将数值转换成字符串函数
格式,STR(<数值型表达式 1>[,<数值型表达式
2>[,<数值型表达式 3>]])
功能:将数值型表达式 1的值转换成字符串 。 转换
后字符串的长度由数值型表达式 2决定, 保留的小
数位数由数值表达式 3决定 。 省略数值型表达式 3
时, 转换后将无小数部分 。 省略数值型表达式 2和
数值表达式 3时, 字符串长度为 10,无小数部分 。
如果指定的长度大于小数点左边的位数, 则在字
符串的前面加上空格, 如果指定的长度小于小数
点左边的位数, 则返回指定长度个星号 *,表示出
错 。
Visual FoxPro
63
举例:
x=1234.587
STR(x,10,2),STR(x,10,4),STR(x,7,2),
STR(x,7),STR(x,3),STR(x)
输出为:
□ □□ 1234.59□□ 1234.5870□ 1234.59□
□□□ 1235□ ***
其中的 □ 代表空格 。
Visual FoxPro
64
6,将字符串转换成数值函数
格式,VAL(<字符型表达式 >)
功能:将由数字, 正负号, 小数点组成的字符
串转换为数值, 转换遇上非上述字符停止 。 若
串的第一个字符即非上述字符, 函数值为 0。 前
导空格不影响转换 。
Visual FoxPro
65
3.3.5 测试函数
1,数据类型测试函数
格式,VARTYPE(<表达式 >,[<逻辑表达式 >])
功能:测试引号内表达式的数据类型, 返回用字
母代表的数据类型 。 函数值为字符型 。 未定义或
错误的表达式返回字母 U。 若表达式是一个数组,
则根据第一个数组元素的类型返回字符串 。 若表
达式的运算结果是 NULL值, 则根据函数中逻辑
表达式的值决定是否返回表达式的类型 。 具体规
则是:如果逻辑表达式为,T.,则返回表达式的原
数据类型 。 如果逻辑表达式为,F.或省略, 则返回
X,表明表达式的运算结果是 NULL值 。
Visual FoxPro
66
举例:
a=DATE()
a=NULL
VARTYPE(3.46),VARTYPE($385),VARTYPE(
[FoxPro]),VARTYPE(a,.T.),VARTYPE(a)
输出为,N Y C D X。
Visual FoxPro
67
2,表头测试函数
格式,BOF([<工作区号 >])|<别名 >])
功能:测试指定或当前工作区的记录指针是否超过
了第一个逻辑记录, 即是否指向表头, 若是, 函数
值为,T.,否则为,F.。 <工作区号 >用于指定工作区,
<别名 >为工作区的别名或在该工作区上打开的表的
别名 。 当 <工作区号 >和 <别名 >都缺省不写时, 默认
为当前工作区 。
3,表尾测试函数
格式,EOF([<工作区号 >|<别名 >])
功能:测试指定或当前工作区中记录指针是否超过
了最后一个逻辑记录, 即是否指向表的末尾, 若是,
函数值为,T.,否则为,F.。 自变量含义同 BOF函数,
缺省时默认为当前工作区 。
Visual FoxPro
68
4,记录号测试函数
格式,RECNO([<工作区号 >|<别名 >])
功能:返回指定或当前工作区中当前记录的记录
号, 函数值为数值型 。 省略参数时, 默认为当前
工作区 。 如果记录指针在最后一个记录之后, 即
EOF()为,T.,RECNO()返回比记录总数大 1的值 。
如果记录指针在第一个记录之前或者无记录, 即
BOF()为,T.,RECONO()返回 1。
Visual FoxPro
69
5,记录个数测试函数
格式,RECCOUNT([<工作区号 |别名 >])
功能:返回当前或指定表中记录的个数 。 如果在
指定的工作区中没有表被打开, 则函数值为 0。 如
果省略参数, 则默认为当前工作区 。 RECCOUNT()
返回的值不受 SET DELETED和 SET FILTER的影
响, 总是返回包括加有删除标记在内的全部记录数 。
Visual FoxPro
70
6,查找是否成功测试函数
格式,FOUND([<工作区号 |别名 >])
功能:在当前或指定表中, 检测是否找到所需的
数据 。 如果省略参数, 则默认为当前工作区 。 数
据 搜 索 由 FIND, SEEK, LOCATE 或
CONTINUE命令实现 。 如果这些命令搜索到所
需的数据记录, 函数值为,T.,否则函数值为,F.。
如果指定的工作区中没有表被打开, 则 FOUND()
返回,F.。 如果用非搜索命令如 GO移动记录指针,
则函数值为,F.。
Visual FoxPro
71
7.文件是否存在测试函数
格式,FILE(<文件名 >)
功能:检测指定的文件是否存在 。 如果文
件存在, 则函数值为,T.,否则函数值为,F.。
文件名必须是全称, 包括盘符, 路径和扩展
名, 且 <文件名 >是字符型表达式 。
Visual FoxPro
72
8,判断值介于两个值之间的函数
格式, BETWEEN(<被测试表达式 >,<下限表达式 >,
<上限表达式 >)
功能,判断表达式的值是否介于相同数据类型的两个
表达式值之间 。 BETWEEN()首先计算表达式的值 。
如果一个字符, 数值, 日期, 表达式的值介于两个
相同类型表达式的值之间, 即被测表达式的值大于
或等于下限表达式的值, 小于或者等于上限表达式
的值, BETWEEN()将返回一个真,T.值, 则返回,F.。
举例:
gz=375
BETWEEN(gz,260,650)
输出为,T.。
Visual FoxPro
73
9,条件函数 IIF
格式,IIF(<逻辑型表达式 >,<表达式 1>,<表达式 2>)
功能:若逻辑型表达式的值为,T.,函数值为 <表达
式 1>的值, 否则为 <表达式 2>的值 。
举例:
xb="女 "
IIF(xb=[男 ],1,IIF(xb=[女 ],2,3))
输出为 2。
Visual FoxPro
74
3.4.1 算术表达式
用算术运算符将数值型数据连接起来的式子叫
算术表达式 。
算术运算符有 ( 按优先级从高到低的顺序排
列 ), ()( 括号 ), **或 ^( 乘方 ), *( 乘 ), /
( 除 ), %( 求余数 ), +( 加 ), -( 减 ) 。
各运算符运算的优先顺序和一般算术运算规则完
全相同 。 同级运算按自左向右的方向进行运算 。 各
运算符的运算规则也和一般算术运算相同, 其中求
余运算符 %和求余函数 MOD的作用相同 。 余数的
符号与除数一致 。
3.4 Visual FoxPro的表达式
Visual FoxPro
75
书写 Visual FoxPro表达式应遵循以下规则:
( 1) 表达式中所有的字符必须写在同一水平线上,
每个字符占一格 。
( 2) 表达式中常量的表示, 变量的命名以及函数
的引用要符合 Visual FoxPro的规定 。
( 3) 要根据运算符运算的优先顺序, 合理地加括
号, 以保证运算顺序的正确性 。 特别是分式中的分
子分母有加减运算时, 或分母有乘法运算, 要加括
号表示分子分母的起始范围 。
Visual FoxPro
76
3.4.2 字符表达式
1,连接运算
连接运算符有完全连接运算符, +, 和不完全连接
运算符, -, 两种 。, +, 运算的功能是将两个字
符串连接起来形成一个新的字符串 。, -, 运算的
功能是去掉字符串 1尾部的空格, 然后将两个字符
串连接起来, 并把字符串 1末尾的空格放到结果串
的末尾 。 例如
"姓名 □ "- "李小四 "+"张得猾 "
输出为:
姓名李小四 □ 张得猾
Visual FoxPro
77
2,包含运算
包含运算的结果是逻辑值 。 一般格式为:
<字符串 1>$<字符串 2>
若 <字符串 1>包含在 <字符串 2>之中, 其表达式值
为,T.,否则为,F.。 例如
zhch="副教授 "
"教授 "$zhch
输出为,T.。
Visual FoxPro
78
3.4.3 日期和时间表达式
格式 1,<日期型数据 >+ <天数 >
<天数 >+ <日期型数据 >
其结果是将来的某个日期 。
格式 2,<日期型数据 >- <天数 >
其结果是过去的某个日期 。
格式 3,<日期型数据 1>- <日期型数据 2>
其结果是两个日期之间相差的天数 。
Visual FoxPro
79
格式 4,<日期型数据 >+ <秒数 >
<秒数 >+ <日期型数据 >
其结果是若干秒后的某个日期时间 。
格式 5,<日期型数据 >- <天数 >
其结果是若干秒前的某个日期时间 。
格式 6,<日期时间型数据 1>- <日期时间型数据 2>
其结果是两个日期时间之间相差的秒数 。
Visual FoxPro
80
3.4.4 关系表达式
关系运算符有, < ( 小于 ), <= ( 小于等于 ), >
( 大于 ), >= ( 大于等于 ), = ( 等于 ), ==
( 精确等于 ), <>或 #或 !=( 不等于 ) 。 它们的运
算优先级相同 。
关系表达式一般形式为:
e1 <关系运算符 > e2
其中 e1,e2可以同为数值型表达式, 字符型表达式,
日期型表达式或逻辑型表达式 。 但 ==仅适用于字符
型数据 。 关系表达式表示一个条件, 条件成立时值
为,T.,否则为,F.。
Visual FoxPro
81
各种类型数据的比较规则如下:
( 1) 数值型和货币型数据根据其代数值的大小进行
比较 。
( 2) 日期型和日期时间型数据进行比较时, 离现在
日期或时间越近的日期或时间越大 。
( 3) 逻辑型数据比较时,,T.比,F.大 。
Visual FoxPro
82
( 4) 对于字符型数据, Visual FoxPro可以设置字符
的排序次序 。 在, 工具, 菜单中选择, 选项,, 将
打开, 选项, 对话框, 在, 数据, 选项卡的, 排序
序列, 下拉列表框中选择, Machine”,,PinYin”
或, Stroke”项并确定 。
若选择, Machine”,字符按照机内码顺序排序 。
对于西文字符而言, 按其 ASCII码值大小进行排列:
空格在最前面, 大写字母在小写字母前面, 数字在
字母之前 。 因此, 空格最小, 大写字母小于小写字
母, 数字字符小于字母 。 对于汉字字符, 按其国标
码的大小进行排列, 对常用的一级汉字而言, 根据
它们的拼音顺序比较大小 。
Visual FoxPro
83
若选择, PinYin”,字符按照拼音次序排序 。 对于
西文字符, 空格在最前面, 小写字母再前, 大写字母
在后 。
若选择, Stroke”,字符按笔画数多少排序, 因而,
字符笔画数的多少就决定其大小 。
也可以用命令设置字符的排序次序 。 命令格式为:
SET COLLATE TO,<排序次序名 >”
排 序 次 序 名 可 以 是, Machine”,, PinYin” 或
,Stroke”。
比较字符串时, 先取两字符串的第一个字符比较, 若
两者不等, 其大小就决定了两字符串的大小, 若相等,
则各取第二个字符比较, 依次类推, 直到最后, 若每
个字符都相等, 则两个字符串相等 。
Visual FoxPro
84
例 在不同的字符排序次序下, 比较字符串的大小 。
SET COLLATE TO,Machine”
,助教, >”教授,,“abc”>”a”,“”>”a”,“XYZ”>”a”
.T.,F.,F.,F.
SET COLLATE TO,PinYin”
,助教, >”教授,,“abc”>”a”,“”>”a”,“XYZ”>”a”
.T.,F.,F.,T.
SET COLLATE TO,Stroke”
,助教, >”教授,,“abc”>”a”,“”>”a”,“XYZ”>”a”
.F.,F.,F.,T.
Visual FoxPro
85
注意 =( 等于 ) 和 ==( 精确等于 ) 两个关系运算符的
区别 。 它们主要是对字符串进行比较时有所区别 。
字符串的, 等于, 比较有精确和非精确之分, 精
确等于是指只有在两字符串完全相同时才为真, 而
非精确等于是指当, =”号右边的串与, =”号左边的
串的前几个字符相同时, 运算结果即为真 。 可以用
命令 SET EXACT ON 来设置字符串精确比较, 此
时, =和 ==的作用相同, 用命令 SET EXACT OFF
可设置字符串非精确比较, 此时, =和 ==的作用是
不相同的, ==为精确比较, =为非精确比较 。
Visual FoxPro
86
例 字符串比较举例 。
SET EXACT OFF
zc="教授 □□ "
zc="教授 ","教授 "=zc,"教授 "==LEFT(zc,4),zc==
"教授 "
输出结果为,.T.,F.,T.,F.。
请注意在非精确比较状态下, 条件 zc="教授 "与条
件 "教授 "=zc不等价 。
Visual FoxPro
87
3.4.5 逻辑表达式
逻辑表达式 是由逻辑运算符将逻辑型数据连接起来
的式子 。 其值仍是逻辑值 。
逻辑运算符有, NOT或,NOT.或 !( 逻辑非 ),
AND或,AND.( 逻辑与 ), OR或,OR.( 逻辑或 ) 。
其运算优先级是 NOT最高, OR最低 。
逻辑非运算符是 单目运算符, 只作用于后面的一
个逻辑操作数, 若操作数为真, 则返回假, 否则
返回真 。
Visual FoxPro
88
逻辑与与逻辑或是双目运算符, 所构成的逻辑表达
式为:
L1 AND L2
L1 OR L2
其中 L1和 L2均为逻辑型操作数 。
对于逻辑与运算, 只有 L1和 L2同时为真, 表达
式值才为真, 只要其中一个为假, 则结果为假 。
对于逻辑或运算, L1和 L2中只要有一个为真,
表达式即为真, 只有 L1和 L2均为假时, 表达式才
为假 。
Visual FoxPro
89
当一个表达式包含多种运算时, 其运算的优先级由
高到低排列为:
算术运算 → 字符串运算 → 日期运算 → 关系运算
→ 逻辑运算
在对表进行各种操作时常常要表达各种条件, 即对满
足条件的记录进行操作, 此时就要综合运用本章的
知识 。 下面的例子希望读者能认真领会, 这些知识
对以后章节的学习十分重要 。
Visual FoxPro
90
( 1) 姓, 张, 的学生 。
( 2) 20岁以下的学生 。
( 3) 家住湖南或湖北的学生 。
( 4) 汉族学生 。
( 5) 入学成绩在 580分以上的湖南或湖北的学生 。
( 6) 20岁以下的少数民族学生 。
例 学生表的结构如下:
学生 ( 学号 C 6,姓名 C 10,性别 C 2, 出生日
期 D,少数民族否 L,籍贯 C 10,入学成绩 N 5.1,
简历 M,照片 G)
针对学生表, 写出下列条件:
Visual FoxPro
91
( 1) 由于学生的, 姓, 包含在姓名字段且为第一个汉
字, 所以可写出 4种条件:
条件 1,"张 "$姓名
条件 2,AT("张 ",姓名 )=1
条件 3,SUBSTR(姓名,1,2)="张 "
条件 4:姓名 ="张 "
( 2) 由于年龄包含在代表学生出生日期的字段中, 所
以关键是如何根据出生日期求出年龄 。
条件 1,DATE()-出生日期 <=30*365
条件 2,YEAR(DATE())-YEAR(出生日期 )<=30
( 3) 根据籍贯字段, 可以写出 3种条件:
条件 1:籍贯 ="湖南 " OR籍贯 ="湖北 "
条件 2,"湖 "$籍贯
条件 3,AT("湖 ",籍贯 )>0
Visual FoxPro
92
( 4) 根据少数民族否字段, 可写出 3种条件:
条件 1,NOT少数民族否
条件 2:少数民族否=,F.
条件 3,IIF(少数民族否,"少数民族 ","汉族 ")="汉族 "
( 5) 根据入学成绩字段和籍贯字段, 可写出 3种条件
条件 1:入学成绩 >580 AND "湖 "$籍贯
条件 2:入学成绩 >580 AND (籍贯 ="湖南 " OR籍贯 ="
湖北 ")
由于 AND运算优先级比 OR要高, 为了保证先做 OR运
算, 条件 2中的括号是必不可少的 。
( 6) 根据出生日期字段求出年龄, 再结合少数民族
否字段, 写出条件:
YEAR(DATE())-YEAR(出生日期 )<=20 AND 少数民
族否
1
i s u a l
F
V
o x P r o
Visual FoxPro
2
3.1 Visual FoxPro的数据类型
3.2 Visual FoxPro的常量与变量
3.3 Visual FoxPro的内部函数
3.4 Visual FoxPro的表达式
Visual FoxPro
3
1.字符型
字符型( Character)数据是不能进行算术运算的
文字数据类型,用字母 C表示。字符型数据包
括中文字符、英文字符、数字字符和其他
ASCII字符,其长度(即字符个数)范围是 0~
254个字符。
3.1 Visual FoxPro的数据类型
Visual FoxPro
4
2.数值型
数值型( Numeric)数据是表示数量并可以进行算
术运算的数据类型,用字母 N表示。数值型数据由
数字、小数点和正负号组成。数值型数据在内存中
占用 8个字节,相应的字段变量其长度(数据位数)
最大 20位。
在 Visual FoxPro中,具有数值特征的数据类型还有
整型( Integer)、浮点型( Float)和双精度型
( Double),不过这 3种数据类型只能用于字段变
量。
Visual FoxPro
5
3.货币型
货币型( Currency)数据是为存储货币值而使用的一
种数据类型,它默认保留 4位小数,占据 8字节存储
空间。货币型数据用字母 Y表示。
4.日期型
日期型( Date)数据是表示日期的数据,用字母 D表
示。日期的默认格式是 {mm/dd/yy},其中 mm表示
月份,dd表示日期,yy表示年度,年度也可以是 4
位。日期型数据的长度固定为 8位。日期型数据的
显示格式有多种,它受系统日期格式设置的影响。
Visual FoxPro
6
5.日期时间型
日期时间型( Date Time)数据是表示日期和时间
的数据,用字母 T表示。日期时间的默认格式是
{mm/dd/yyyy hh:mm:ss},其中 mm,dd,yyyy的意
义与日期型相同,而 hh表示小时,mm表示分钟,
ss表示秒数。日期时间型数据也是采用固定长度 8位,
取值范围是:日期为 01/01/0001~ 12/31/9999,时间
为 00:00:00~ 23:59:59。如 {08/16/2003 10:35:30}表
示 2003年 8月 16日 10时 35分 30秒这一日期和时间。
Visual FoxPro
7
6.逻辑型
逻辑型( Logic)数据是描述客观事物真假的数据类
型,表示逻辑判断的结果,用字母 L表示。逻辑型数
据只有真(,t.或,y.)和假(,f.或,n.)两种,长度固定
为 1位。
7.备注型
备注型( Memo)数据是用于存放较多字符的数据
类型,用字母 M表示。备注型数据没有数据长度限制,
仅受限于磁盘空间。它只用于表中字段类型的定义,
字段长度固定为 4个字节,实际数据存放在与表文件同
名的备注文件(,fpt)中,长度根据数据内容而定
Visual FoxPro
8
8.通用型
通用型( General)数据是存储 OLE(对象链接与
嵌入)对象的数据类型,用字母 G表示。通用型数
据中的 OLE对象可以是电子表格、文档、图形、
声音等。它只用于表中字段类型的定义。通用型数
据字段长度固定为 4位,实际数据长度仅受限于磁
盘空间。
9.二进制字符型和二进制备注型
这两类数据是以二进制格式存储的数据类型,只能
用在表中字段数据的定义。所存储的数据不受代码
页改变的影响。
Visual FoxPro
9
3.2.1 常量
1.字符型常量
字符型常量是用定界符括起来的一串字符。在
Visual FoxPro中,定界符有 3种:单撇号、双撇号
和方括号。如 'Central South University',"410075"、
[教授 ]等都是字符型常量。
如果某一种定界符本身是字符型常量中的字符,就
应选择另一种定界符。例如,"That's right!"表示
字符常量,That's right!,含有 13个字符。
3.2 Visual FoxPro的常量与变量
Visual FoxPro
10
2,数值型常量
数值型常量就是平时所讲的常数,由数字、小
数点和正负号组成。在 Visual FoxPro中,数值型常
量有两种表示方法:小数形式和指数形式。如 75、
-3.75是小数形式的数值型常量。指数形式通常用来
表示那些绝对值很大或很小、而有效位数不太长的
一些数值,对应于日常应用中的科学记数法。
指数形式用字母 E来表示以 10为底的指数,E左边
为数字部分,称为尾数,右边为指数部分,称为阶
码。阶码只能是整数,尾数可以是整数,也可以是
小数。尾数与阶码均可正可负。例如,常量
0.6947× 10-6,4.9523× 109分别用指数形式表示为
0.6947E-6,4.9523E9。
Visual FoxPro
11
3.货币型常量
货币型常量的书写格式与数值型常量类似,但要加上
一个前置的 $。货币型数据在存储和计算时,采用 4
位小数。如果一个货币型常量多于 4位小数,那么
系统会自动将多余的小数位四舍五入。例如,货币
型常量 $3.1415926将存储为 $3.1416。货币型常量不
能采用指数形式。
4.日期型常量
日期型常量要放在一对花括号中,花括号内包括年、
月、日 3部分内容,各部分内容之间用分隔符分隔。
分隔符可以是 /,-,.等。 Visual FoxPro的默认日期
格式是 {mm/dd/[yy]yy}。
Visual FoxPro
12
5.日期时间型常量
日期时间型常量也要放在一对花括号中,其中既含
日期又含时间。日期的格式与日期型常量相同,时
间包括时、分、秒,时分秒之间用,,”分隔。日期
时间型常量的默认格式是:
{mm/dd/[yy]yy [,] [hh[:mm[:ss]][a|p]]}
其中 hh,mm,ss的默认值分别为 12,0和 0。 a和 p
分别表示 AM(上午)和 PM(下午),默认为 AM。
如果指定时间大于等于 12,则自然为下午的时间。
Visual FoxPro
13
日期值和日期时间值的输入格式与输出格式并不完
全相同,特别是输出格式受系统环境设置的影响,
用户可根据应用需要进行相应设置。下面介绍有关
命令。
( 1)日期格式中的世纪值
通常日期格式中用 2位数表示年份,但涉及到世纪
问题就不便区分。 Visual FoxPro提供设置命令对此
进行相应设置。
命令格式, SET CENTURY ON | OFF | TO [nCentury]
Visual FoxPro
14
命令功能,用于设置显示日期时是否显示世纪。其
中,ON表示日期值输出时显示年份值,即日期数据
显示 10位,年份占 4位。 OFF(默认值)表示日期值
输出时不显示年份值,即日期数据显示 8位,年份占
2位。 TO [nCentury]指定日期数据所对应的世纪值,
nCentury是一个 1~ 99的整数,代表世纪数。
Visual FoxPro
15
( 2)设置日期显示格式
用户可以调整、设置日期的显示输出格式。
命令格式,
SET DATE [TO] AMERICAN | ANSI | BRITISH |
FRENCH | GERMAN | ITLIAN | JAPAN | USA |
MDY | DMY | YMD | SHORT | LONG
命令功能,设置日期的显示输出格式。系统默认为
AMERICAN(美国日期格式)。如果日期格式设
置为 SHORT或 LONG格式,Visual FoxPro将按
Windows系统设置的短日期格式或长日期格式显示
输出日期数据,而且 SET CENTURY命令的设置被
忽略。
Visual FoxPro
16
( 3)设置日期分隔符
命令格式, SET MARK TO [日期分隔符 ]
命令功能,设置显示日期时使用的分隔符,如 /,-,.
等。如没有指定任何分隔符,则恢复系统默认的斜
杠分隔符。
( 4)设置日期 2000年兼容性
通常日期型和日期时间型数据的结果,与 SET
DATE命令和 SET CENTURY命令设置状态及当前
系统时间有关。由于系统时间与相应设置不同,同
一数据的结果可能有不同的解释。如日期值
{10/11/12}可以解释为 1912年 10月 11日,2012年 10月
11日,1912年 11月 10日,1910年 11月 12日或者 2010
年 11月 12日等。这显然会导致系统混乱,而且还可
能造成 2000年兼容性错误,影响系统正常运行。
Visual FoxPro
17
Visual FoxPro增加了一种所谓严格的日期格式。不
论哪种设置,按严格日期格式表示的日期型和日期
时间型数据,都具有相同的值和表示形式。严格的
日期格式是,
{^yyyy-mm-dd[,][hh[:mm[:ss]][a|p]]}
其中,^表明该格式是严格的日期格式,并按照 YMD
的格式解释日期型和日期时间型数据,它是严格日
期格式的标志,不可缺少。有效的日期型和日期时
间型数据分隔符为,/,-,.和空格。如 {^2003-08-
16},{^2003-08-16 10:35:30a},分别以严格的日期
格式表示 2003年 8月 16日及该日上午 10时 35分 30秒
Visual FoxPro
18
Visual FoxPro默认采用严格的日期格式,并以此检
测所有日期型和日期时间型数据的格式是否规范、
合法。
命令格式,SET STRICTDATE TO [0 | 1 | 2]
命令功能,用于设置是否对日期格式进行检测。其中,
0表示不进行严格的日期格式检测。 1表示进行严格
的日期格式检测(默认值),要求所有日期型和日
期时间型数据均按严格的格式。 2表示进行严格的
日期格式检测,并且对 CTOD和 CTOT函数的格式
也有效。省略各选项时,恢复系统默认值,等价于
1的设置。
Visual FoxPro
19
除了利用命令方式设置外,也可以用菜单方式进行
设置设置。在, 工具, 菜单中选择, 选项,,将打开
,选项, 对话框,在, 区域, 选项卡中可以设置日期
和时间的显示格式。在, 常规, 选项卡中可以设置
2000年兼容性。
6.逻辑型常量
逻辑型常量表示逻辑判断的结果,只有, 真, 和
,假, 两种值。在 Visual FoxPro中,逻辑真
用,T.,.t.,.Y.或,y.表示,逻辑假用,F.,.f.,.N.或,n.
表示。注意字母前后的圆点一定不能丢。
Visual FoxPro
20
3.4.2 变量
变量是在操作过程中可以改变其值的数据对象。
在 Visual FoxPro中变量分为字段变量、内存变量、
数组变量和系统变量 4类。此外,作为面向对象的
程序设计语言,Visual FoxPro在进行面向对象的程
序设计中引入了对象的概念,对象实质上也是一类
变量。确定一个变量,需要确定其 3个要素:变量
名、数据类型和变量值。
Visual FoxPro
21
1.命名规则
( 1)使用字母、汉字、下划线和数字命名。
( 2)命名以字母或下划线开头。除自由表中字段
名、索引的 TAG标识名最多只能 10个字符外,其
他的命名可使用 1~ 128个字符。
( 3)为避免误解、混淆,避免使用 Visual FoxPro
的保留字。
( 4)文件名的命名应遵循操作系统的约定。
Visual FoxPro
22
2.字段变量
字段变量就是表中的字段名,它是表中最基本的数
据单元。字段变量是一种多值变量,一个表有多少
条记录,那么该表的每一字段就有多少个值,当用
某一字段名做变量时,它的值就是表记录指针所指
的那条记录对应字段的值。字段变量的类型可以是
Visual FoxPro的任意数据类型。字段变量的名字、
类型、长度等是在定义表结构时定义的。
Visual FoxPro
23
3.内存变量
Visual FoxPro中,除了字段变量外,还有一种变
量,它独立于表,是一种临时工作单元,称为内
存变量。内存变量的类型有字符型、数值型、货
币型、逻辑型、日期型和日期时间型等。
可直接用内存变量名对内存变量进行访问,但若
它与字段变量同名时,则应该用如下格式进行访
问:
M.内存变量名
M->内存变量名
Visual FoxPro
24
( 1)内存变量的赋值
给内存变量赋值的命令有两种格式:
<内存变量 >=<表达式 >
STORE <表达式 > TO <内存变量表 >
该命令先计算表达式的值,然后将表达式的值赋给一
个或几个内存变量。第一种格式只能给一个内存变
量赋值。第二种格式可以同时给多个内存变量赋相
同的值,各内存变量名之间用逗号分隔。内存变量
的数据类型取决于表达式值的类型。可以通过对内
存变量重新赋值来改变其值和类型。
Visual FoxPro
25
( 2) 内存变量的显示
可以用命令显示当前已定义的内存变量的有关信息,
包括变量名, 作用域, 类型和取值 。 命令格式为:
DISPLAY MEMORY [LIKE < 通配符 >] [TO
PRINTER][TO FILE <文件名 >]
LIST MEMORY [LIKE < 通配符 >] [TO
PRINTER][TO FILE <文件名 >]
其中, LIKE选项表示显示与通配符相匹配的内存变
量, 在 <通配符 >中允许使用符号?和 *,分别代表单
个字符和多个字符 。 TO PRINTER或 TO FILE <文
件名 >选项可将内存变量的有关信息在打印机上打
印出来, 或者以给定的文件名存入文本文件中 ( 扩
展名为,txt) 。
Visual FoxPro
26
LIST命令一次显示所有内存变量,如果内存
变量多,一屏显示不下,则连续向上滚动。而
DISPLY命令分屏显示所有内存变量,如果内
存变量多,显示一屏后暂停,按任意键后再继
续显示下一屏。
Visual FoxPro
27
( 3)内存变量文件的建立
将所定义的内存变量的各种信息全都保存到一个文件
中,该文件称为内存变量文件。其默认的扩展名
为,mem。建立内存变量文件命令的格式为:
SAVE TO <内存变量文件名 > [ALL [LIKE|EXCEPT
<通配符 >]]
其中,ALL表示将全部内存变量存入文件中。 ALL
LIKE <通配符 >表示内存变量中所有与通配符相匹
配的内存变量都存入文件。 ALL EXCEPT <通配符
>表示把与通配符不匹配的全部内存变量存入文件
中。
Visual FoxPro
28
( 4)内存变量的恢复
内存变量的恢复是指将已存入内存变量文件中的内存
变量从文件中读出,装入内存中。其命令格式为:
RESTORE FROM <内存变量文件名 > [ADDITIVE]
若命令中含有 ADDITIVE任选项,系统不清除内存中
现有的内存变量,并追加文件中的内存变量。
Visual FoxPro
29
( 5)内存变量的清除
清除内存变量并释放相应的内存空间,所采用命
令的格式为:
CLEAR MEMORY
RELEASE [<内存变量表 >][ALL
[LIKE|EXCEPT <通配符 >]]
其中第一条命令是清除所有的内存变量,第二条
命令是清除指定的内存变量。
Visual FoxPro
30
4.数组变量
在 Visual FoxPro中,数组变量被定义为一组变量的集
合,这些变量可以具有不同的数据类型。数组由数
组元素组成,每个数组元素就相当于一个内存变量,
它可以用数组名后接顺序号来表示,顺序号也叫下
标。
( 1)数组的定义
Visual FoxPro规定,数组在使用之前必须用数组说明
命令进行定义,即定义数据名、维数和大小。其命
令格式为:
DIMENSION <数组名 >(<下标上界 1>[,<下标上界
2])[,… ]
DECLARE <数组名 >(<下标上界 1>[,<下标上界 2])[,… ]
Visual FoxPro
31
两条命令的功能完全相同,用于定义一维或二维
数组。下标上界是一数值量,下标的下界由系
统统一规定为 1。
数组一经定义,它的每个元素都可当作一个内存
变量来使用,因此它具有与内存变量相同的性
质。 Visual FoxPro命令行中可以使用内存变量
的地方都能用数组元素代替。
Visual FoxPro
32
( 2)数组的赋值
可以使用赋值命令给数组元素赋值,也可以给整个数
组的各个元素赋以相同的值。例如命令:
b=73
为上面定义的二维数组 b的 6个元素都赋以同样的值 73。
在没有向数组元素赋值之前,数组元素的初值均为逻
辑假(,F.)值。
在 Visual FoxPro中,二维数组各元素在内存中按行的
顺序存储,它们也可按一维数组元素的顺序来存取
数据。如上述二维数组 b中的元素 b(2,1)是排在第 2
行第 1列,由于每一行是 3个元素,所以 b(2,1)也可
按 b(4)表示。
Visual FoxPro
33
3.3.1 数值函数
1,求绝对值函数
格式,ABS(<数值型表达式 >)
功能:求数值型表达式的绝对值 。 函数值为数值型 。
2,求平方根函数
格式,SQRT(<数值型表达式 >)
功能:求数值型表达式的算术平方根, 数值型表达
式的值应不小于零 。 函数值为数值型 。
3,求指数函数
格式,EXP(<数值型表达式 >)
功能:将数值型表达式的值作为指数 x,求出 ex的值 。函数值为数值型 。
3.3 Visual FoxPro的内部函数
Visual FoxPro
34
4,求对数函数
格式,LOG(<数值型表达式 >)
LOG10(<数值型表达式 >)
功能,LOG求数值型表达式的自然对数, LOG10
求数值型表达式的常用对数, 数值型表达式的
值必须大于零 。 函数值为数值型 。
5,取整函数
格式,INT(<数值型表达式 >)
CEILING(<数值型表达式 >)
FLOOR(<数值型表达式 >)
Visual FoxPro
35
功能,INT取数值型表达式的整数部分 。 CEILING
取大于或等于指定表达式的最小整数 。 FLOOR取
小于或等于指定表达式的最大整数 。 函数值均为数
值型 。
举例:
x=56.72
INT(x),INT(-x),CEILING(x),CEILING(-
x),FLOOR(x),FLOOR(-x)
三个函数的值依次为 56,-56,57,-56,56,-57。
Visual FoxPro
36
6,求余数函数
格式,MOD(<数值型表达式 1>,<数值型表达式 2>)
功能:求 <数值型表达式 1>除以 <数值型表达式 2>
所得出的余数, 所得余数的符号和表达式 2相同 。
如果被除数与除数同号, 那么函数值即为两数相
除的余数 。 如果被除数与除数异号, 则函数值为
两数相除的余数再加上除数的值 。 函数值为数值
型 。
Visual FoxPro
37
举例:
MOD(25,7),MOD(25,-7),MOD(-25,7),MOD(-25,-7)
输出的函数值依次为 4,-3,3,-4。
显然如果 M除以 N的余数为 0,则 M能被 N整数 。 例如
x=521
x1=INT(x/100)
x2=INT(MOD(x,100)/10)
x3=MOD(x,10)
x1+10*x2+100*x3
输出为 125。 显然 x1,x2,x3分别为 x的百, 十, 个位
数字 。
Visual FoxPro
38
7,四舍五入函数
格式,ROUND(<数值型表达式 1>,<数值型表达式 2>)
功能:对 <数值型表达式 1>求值并保留 n位小数, 从
n+1位小数起进行四舍五入 n的值由数值型表达式 2
确定 ),若 n小于 0,则对 <数值型表达式 1>的整数部
分按 n的绝对值进行四舍五入 。
举例:
ROUND(3.1415*3,2),ROUND(156.78,-1)
输出的函数值分别为 9.42和 160。
Visual FoxPro
39
8,求最大值和最小值函数
格式,MAX(<表达式 1>),<表达式 2>,…,<表达式 n>)
MIN(<表达式 1>,<表达式 2>,…,<表达式 n>)
功能,MAX求 n个表达式中的最大值, MIN求 n个表
达式中的最小值 。 表达式的类型可以是数值型, 字
符型, 货币型, 浮点型, 双精度型, 日期型和日期
时间型, 但所有表达式的类型应相同 。 函数值的类
型与自变量的类型一致 。
Visual FoxPro
40
举例:
MAX({^2003-08-16},{^2002-08-16}),MIN(? 助
教 ’,?讲师 ’,?副教授 ’,?教授 ’ )
输出的函数值分别为 08/16/03,副教授 。
9.π函数
格式,PI()
功能:返回圆周率 π的近似值 。
Visual FoxPro
41
3.3.2 字符函数
字符函数是处理字符型数据的函数, 其自变量或函
数值中至少有一个是字符型数据 。
1,宏代换函数
格式,&<字符型内存变量 >[.字符表达式 ]
功能:代换出一个字符型内存变量的内容 。 若 <
字符型内存变量 >与后面的字符无空格分界, 则 &
函数后的,,”必须有 。
Visual FoxPro
42
举例:
i="1"
j="2"
x12="Good"
Good=MAX(96/01/02,65/05/01)
x&i.&j,&x12
输出的内容依次是 Good和 48。 又如
m="245*SQRT(4)"
34+&m
输出为 524.00。
Visual FoxPro
43
2,求字符串长度函数
格式,LEN(字符型表达式 )
功能:求字符串的长度, 即所包含的字符个数 。
若是空串, 则长度为 0。 函数值为数值型 。
3,求子串位置函数
格式,AT(<字符型表达式 1>,<字符型表达式 2>)
ATC(<字符型表达式 1>,<字符型表达式 2>)
功能:若 <字符型表达式 1>的值存在于 <字符型表
达式 2>的值中, 则给出 <字符表达式 1>在 <字符型
表达式 2>中的开始位置, 若不存在, 则函数值为
0。 函数值为数值型 。 ATC函数在子串比较时不
区分字母大小写 。
Visual FoxPro
44
举例:
xm="李小四 "
AT(" 李 ",xm),AT("PRO","Visual
FoxPro"),ATC("PRO","Visual FoxPro")
输出的函数值分别为 1,0,11。
Visual FoxPro
45
4,取子串函数
格式,LEFT(<字符型表达式 >,<数值型表达式 >)
RIGHT(字符型表达式 >,<数值型表达式 >
SUBSTR(<字符型表达式 >,<数值型表达式 1>[,<数值型
表达式 2>]
功能,LEFT函数从字符型表达式左边的第一个字符
开始截取子串, RIGHT函数从字符型表达式右边的
第一个字符开始截取子串 。 若数值型表达式的值大
于 0,且小于等于字符串的长度, 则子串的长度与
数值型表达式值相同 。 若数值型表达式的值大于字
符串的长度, 则给出整个字符串 。 若数值型的表达
式小于或等于 0,则给出一个空字符串 。
Visual FoxPro
46
SUBSTR函数对字符型表达式从指定位置开始截取若
干个字符 。 起始位置和字符个数分别由数值型表达
式 1和数值型表达式 2决定 。 若字符个数省略, 或字
符个数多于从起始位置到原字符串尾部的字符个数,
则取从起始位置起, 一直到字符串尾的字符串作为
函数值 。 若起始位置或字符个数为 0,则函数值为
空串 。 显然 SUBSTR函数可以代替 LEFT函数和
RIGHT函数的功能 。
举例:
xm="李小四 "
SUBSTR(xm,1,2),LEFT(xm,1)
输出的函数值均为:李 。 若 xm代表职工姓名, 则用这
两个函数可以取出职工的姓 。
Visual FoxPro
47
5,删除字符串前后空格函数
格式,LTRIM(<字符型表达式 >)
RTRIM(<字符型表达式 >)
ALLTRIM(<字符型表达式 >)
功能,LTRIM删除字符串的前导空格 。
RTRIM 删除字符串的尾部空格 。 RTRIM亦可写成
TRIM。
ALLTRIM 删 除 字 符 串 中 的 前 导 和 尾 部 空 格 。
ALLTRIM函数兼有 LTRIM和 RTRIM函数的功能 。
Visual FoxPro
48
6,生成空格函数
格式,SPACE(<数值型表达式 >)
功能:生成若干个空格, 空格的个数由数值型表达
式的值决定 。
举例:
name=SPACE(8)
LEN(LTRIM(name))
输出的函数值为 0。
Visual FoxPro
49
7,字符串替换函数
格式,STUFF(<字符型表达式 1>,<数值型表达式
1>,<数值表达式 2>,<字符型表达式 2>)
功能:用 <字符型表达式 2>去替换 <字符型表达式 1>中
由起始位置开始所指定的若干个字符 。 起始位置和
字符个数分别由数值型表达式 1和数值型表达式 2指
定 。 如果字符型表达式 2的值是空串, 则字符型表
达式 1中由起始位置开始所指定的若干个字符被删
除 。
举例:
STORE ?中国 长沙 ’ TO x
STUFF(x,6,4,?北京 ’ )
输出为:中国 北京 。
Visual FoxPro
50
8,产生重复字符函数
格式,REPLICATE(<字符型表达式 >,<数值型表达
式 >)
功能:重复给定字符串若干次, 次数由数值型表达
式给定 。
举例:
REPLICATE (?*?,6)
输出为,******。
Visual FoxPro
51
9,大小写字母转函数
格式,LOWER(<字符型表达式 >)
UPPER(<字符型表达式 >)
功能,LOWER将字符串中的大写字母转换成小写 。
UPPER将字符串中的小写字母转换成大写 。
举例:
yn="y"
UPPER(yn),LOWER("YES")
输出的函数值为,Y,yes。 在字符串中, 同一字母的
大小写为不同字符, 如果利用大小字母转换函数,
就可以不考虑字符串中的字母是大写还是小写 。
Visual FoxPro
52
3.3.3 日期和时间函数
日期时间函数是处理日期型或日期时间型数据的
函数 。
1,系统日期和时间函数
格式,DATE()
TIME()
DATETIME()
功能,DATE函数给出当前的系统日期, 函数值为日
期型 。
TIME函数给出当前的系统时间, 形式为 hh:mm:ss,
函数值为字符型 。
DATETIME函数给出当前的系统日期和时间, 函数
值为日期时间型 。
Visual FoxPro
53
2,求年份, 月份和天数函数
格式,YEAR(<日期型表达式 >|<日期时间型表达式 >)
MONTH(<日期型表达式 >|<日期时间型表达式 >)
DAY(<日期型表达式 >|<日期时间型表达式 >)
功能,YEAR函数返回日期表达式或日期时间型表达
式所对应的年份值 。
MONTH函数返回日期型表达式或日期时间型表达式
所对应的月份, 月份以数值 1~ 12来表示 。
DAY函数返回日期型表达式或日期时间型表达式所对
应月份里面的天数 。
Visual FoxPro
54
举例:
d={^2003-08-16}
YEAR(d),MONTH(d),DAY(d)
输出的函数值分别为 2003,8,16。
Visual FoxPro
55
3,求时, 分和秒函数
格式,HOUR(<日期时间型表达式 >)
MINUTE(<日期时间型表达式 >)
SEC(<日期时间型表达式 >)
功能,HOUR函数返回日期时间型表达式所对应的
小时部分 (按 24小时制 )。
MINUTE函数返回日期时间型表达式所对应的分钟
部分 。
SEC函数返回日期时间型表达式所对应的秒数部分 。
Visual FoxPro
56
举例:
d={^2003-08-16,5:43:56 P}
HOUR(d),MINUTE(d),SEC(d)
输出的函数值分别为 17,43,56。
Visual FoxPro
57
3.3.4 数据类型转换函数
1,将字符转换成 ASCII码的函数
格式,ASC(<字符型表达式 >)
功能:给出指定字符串最左边的一个字符的 ASCII
码值 。 函数值为数值型 。
2,将 ASCII值转换成相应字符函数
格式,CHR(<数值型表达式 >)
功能:将数值型表达式的值作为 ASCII码, 给出
所对应的字符 。
Visual FoxPro
58
举例:
ch1="M"
ch2=CHR(ASC(ch1)+ASC("a")-ASC("A"))
ch2
字符变量 ch2的值为 m。 若 ch1的值为某个大写
字母, 则利用求 ch2的表达式可求出对应的小
写字母 。 注意, 在 ASCII表中, 字母是连续排
列的, 任何一个字母其大小写 ASCII码值之差
是相等的 。
Visual FoxPro
59
3,将字符串转换成日期或日期时间函数
格式,CTOD(<字符型表达式 >)
CTOT(<字符型表达式 >)
功能,CTOD函数将指定的字符串转换成日期型
数据, CTOT函数将指定的字符串转换成日期时
间型数据 。 字符型表达式中的日期部分格式要与
系统设置的日期显示格式一致, 其中的年份可以
用 4位, 也可以用 2位 。 如果用 2位, 则世纪值由
SET CENTURY TO 命令指定 。
Visual FoxPro
60
举例:
ch1="M"
ch2=CHR(ASC(ch1)+ASC("a")-ASC("A"))
ch2
字符变量 ch2的值为 m。 若 ch1的值为某个大写字
母, 则利用求 ch2的表达式可求出对应的小写字
母 。 注意, 在 ASCII表中, 字母是连续排列的,
任何一个字母其大小写 ASCII码值之差是相等的 。
Visual FoxPro
61
4,将日期或日期时间转换成字符串函数
格式,DTOC(<日期表达式 >|<日期时间表达式 >[,1])
TTOC(<日期时间表达式 >[,1])
功能,DTOC函数将日期数据或日期时间数据的日
期部分转换为字符型, TTOC函数将日期时间数据
转换为字符型 。 字符串中日期和时间的格式受系统
设置的影响 。 对 DTOC来说, 若选用 1,结果为
yyyymmdd格式 。 对 TTOC来说, 若选用 1,结果为
yyyymmddhhmmss格式 。
Visual FoxPro
62
5,将数值转换成字符串函数
格式,STR(<数值型表达式 1>[,<数值型表达式
2>[,<数值型表达式 3>]])
功能:将数值型表达式 1的值转换成字符串 。 转换
后字符串的长度由数值型表达式 2决定, 保留的小
数位数由数值表达式 3决定 。 省略数值型表达式 3
时, 转换后将无小数部分 。 省略数值型表达式 2和
数值表达式 3时, 字符串长度为 10,无小数部分 。
如果指定的长度大于小数点左边的位数, 则在字
符串的前面加上空格, 如果指定的长度小于小数
点左边的位数, 则返回指定长度个星号 *,表示出
错 。
Visual FoxPro
63
举例:
x=1234.587
STR(x,10,2),STR(x,10,4),STR(x,7,2),
STR(x,7),STR(x,3),STR(x)
输出为:
□ □□ 1234.59□□ 1234.5870□ 1234.59□
□□□ 1235□ ***
其中的 □ 代表空格 。
Visual FoxPro
64
6,将字符串转换成数值函数
格式,VAL(<字符型表达式 >)
功能:将由数字, 正负号, 小数点组成的字符
串转换为数值, 转换遇上非上述字符停止 。 若
串的第一个字符即非上述字符, 函数值为 0。 前
导空格不影响转换 。
Visual FoxPro
65
3.3.5 测试函数
1,数据类型测试函数
格式,VARTYPE(<表达式 >,[<逻辑表达式 >])
功能:测试引号内表达式的数据类型, 返回用字
母代表的数据类型 。 函数值为字符型 。 未定义或
错误的表达式返回字母 U。 若表达式是一个数组,
则根据第一个数组元素的类型返回字符串 。 若表
达式的运算结果是 NULL值, 则根据函数中逻辑
表达式的值决定是否返回表达式的类型 。 具体规
则是:如果逻辑表达式为,T.,则返回表达式的原
数据类型 。 如果逻辑表达式为,F.或省略, 则返回
X,表明表达式的运算结果是 NULL值 。
Visual FoxPro
66
举例:
a=DATE()
a=NULL
VARTYPE(3.46),VARTYPE($385),VARTYPE(
[FoxPro]),VARTYPE(a,.T.),VARTYPE(a)
输出为,N Y C D X。
Visual FoxPro
67
2,表头测试函数
格式,BOF([<工作区号 >])|<别名 >])
功能:测试指定或当前工作区的记录指针是否超过
了第一个逻辑记录, 即是否指向表头, 若是, 函数
值为,T.,否则为,F.。 <工作区号 >用于指定工作区,
<别名 >为工作区的别名或在该工作区上打开的表的
别名 。 当 <工作区号 >和 <别名 >都缺省不写时, 默认
为当前工作区 。
3,表尾测试函数
格式,EOF([<工作区号 >|<别名 >])
功能:测试指定或当前工作区中记录指针是否超过
了最后一个逻辑记录, 即是否指向表的末尾, 若是,
函数值为,T.,否则为,F.。 自变量含义同 BOF函数,
缺省时默认为当前工作区 。
Visual FoxPro
68
4,记录号测试函数
格式,RECNO([<工作区号 >|<别名 >])
功能:返回指定或当前工作区中当前记录的记录
号, 函数值为数值型 。 省略参数时, 默认为当前
工作区 。 如果记录指针在最后一个记录之后, 即
EOF()为,T.,RECNO()返回比记录总数大 1的值 。
如果记录指针在第一个记录之前或者无记录, 即
BOF()为,T.,RECONO()返回 1。
Visual FoxPro
69
5,记录个数测试函数
格式,RECCOUNT([<工作区号 |别名 >])
功能:返回当前或指定表中记录的个数 。 如果在
指定的工作区中没有表被打开, 则函数值为 0。 如
果省略参数, 则默认为当前工作区 。 RECCOUNT()
返回的值不受 SET DELETED和 SET FILTER的影
响, 总是返回包括加有删除标记在内的全部记录数 。
Visual FoxPro
70
6,查找是否成功测试函数
格式,FOUND([<工作区号 |别名 >])
功能:在当前或指定表中, 检测是否找到所需的
数据 。 如果省略参数, 则默认为当前工作区 。 数
据 搜 索 由 FIND, SEEK, LOCATE 或
CONTINUE命令实现 。 如果这些命令搜索到所
需的数据记录, 函数值为,T.,否则函数值为,F.。
如果指定的工作区中没有表被打开, 则 FOUND()
返回,F.。 如果用非搜索命令如 GO移动记录指针,
则函数值为,F.。
Visual FoxPro
71
7.文件是否存在测试函数
格式,FILE(<文件名 >)
功能:检测指定的文件是否存在 。 如果文
件存在, 则函数值为,T.,否则函数值为,F.。
文件名必须是全称, 包括盘符, 路径和扩展
名, 且 <文件名 >是字符型表达式 。
Visual FoxPro
72
8,判断值介于两个值之间的函数
格式, BETWEEN(<被测试表达式 >,<下限表达式 >,
<上限表达式 >)
功能,判断表达式的值是否介于相同数据类型的两个
表达式值之间 。 BETWEEN()首先计算表达式的值 。
如果一个字符, 数值, 日期, 表达式的值介于两个
相同类型表达式的值之间, 即被测表达式的值大于
或等于下限表达式的值, 小于或者等于上限表达式
的值, BETWEEN()将返回一个真,T.值, 则返回,F.。
举例:
gz=375
BETWEEN(gz,260,650)
输出为,T.。
Visual FoxPro
73
9,条件函数 IIF
格式,IIF(<逻辑型表达式 >,<表达式 1>,<表达式 2>)
功能:若逻辑型表达式的值为,T.,函数值为 <表达
式 1>的值, 否则为 <表达式 2>的值 。
举例:
xb="女 "
IIF(xb=[男 ],1,IIF(xb=[女 ],2,3))
输出为 2。
Visual FoxPro
74
3.4.1 算术表达式
用算术运算符将数值型数据连接起来的式子叫
算术表达式 。
算术运算符有 ( 按优先级从高到低的顺序排
列 ), ()( 括号 ), **或 ^( 乘方 ), *( 乘 ), /
( 除 ), %( 求余数 ), +( 加 ), -( 减 ) 。
各运算符运算的优先顺序和一般算术运算规则完
全相同 。 同级运算按自左向右的方向进行运算 。 各
运算符的运算规则也和一般算术运算相同, 其中求
余运算符 %和求余函数 MOD的作用相同 。 余数的
符号与除数一致 。
3.4 Visual FoxPro的表达式
Visual FoxPro
75
书写 Visual FoxPro表达式应遵循以下规则:
( 1) 表达式中所有的字符必须写在同一水平线上,
每个字符占一格 。
( 2) 表达式中常量的表示, 变量的命名以及函数
的引用要符合 Visual FoxPro的规定 。
( 3) 要根据运算符运算的优先顺序, 合理地加括
号, 以保证运算顺序的正确性 。 特别是分式中的分
子分母有加减运算时, 或分母有乘法运算, 要加括
号表示分子分母的起始范围 。
Visual FoxPro
76
3.4.2 字符表达式
1,连接运算
连接运算符有完全连接运算符, +, 和不完全连接
运算符, -, 两种 。, +, 运算的功能是将两个字
符串连接起来形成一个新的字符串 。, -, 运算的
功能是去掉字符串 1尾部的空格, 然后将两个字符
串连接起来, 并把字符串 1末尾的空格放到结果串
的末尾 。 例如
"姓名 □ "- "李小四 "+"张得猾 "
输出为:
姓名李小四 □ 张得猾
Visual FoxPro
77
2,包含运算
包含运算的结果是逻辑值 。 一般格式为:
<字符串 1>$<字符串 2>
若 <字符串 1>包含在 <字符串 2>之中, 其表达式值
为,T.,否则为,F.。 例如
zhch="副教授 "
"教授 "$zhch
输出为,T.。
Visual FoxPro
78
3.4.3 日期和时间表达式
格式 1,<日期型数据 >+ <天数 >
<天数 >+ <日期型数据 >
其结果是将来的某个日期 。
格式 2,<日期型数据 >- <天数 >
其结果是过去的某个日期 。
格式 3,<日期型数据 1>- <日期型数据 2>
其结果是两个日期之间相差的天数 。
Visual FoxPro
79
格式 4,<日期型数据 >+ <秒数 >
<秒数 >+ <日期型数据 >
其结果是若干秒后的某个日期时间 。
格式 5,<日期型数据 >- <天数 >
其结果是若干秒前的某个日期时间 。
格式 6,<日期时间型数据 1>- <日期时间型数据 2>
其结果是两个日期时间之间相差的秒数 。
Visual FoxPro
80
3.4.4 关系表达式
关系运算符有, < ( 小于 ), <= ( 小于等于 ), >
( 大于 ), >= ( 大于等于 ), = ( 等于 ), ==
( 精确等于 ), <>或 #或 !=( 不等于 ) 。 它们的运
算优先级相同 。
关系表达式一般形式为:
e1 <关系运算符 > e2
其中 e1,e2可以同为数值型表达式, 字符型表达式,
日期型表达式或逻辑型表达式 。 但 ==仅适用于字符
型数据 。 关系表达式表示一个条件, 条件成立时值
为,T.,否则为,F.。
Visual FoxPro
81
各种类型数据的比较规则如下:
( 1) 数值型和货币型数据根据其代数值的大小进行
比较 。
( 2) 日期型和日期时间型数据进行比较时, 离现在
日期或时间越近的日期或时间越大 。
( 3) 逻辑型数据比较时,,T.比,F.大 。
Visual FoxPro
82
( 4) 对于字符型数据, Visual FoxPro可以设置字符
的排序次序 。 在, 工具, 菜单中选择, 选项,, 将
打开, 选项, 对话框, 在, 数据, 选项卡的, 排序
序列, 下拉列表框中选择, Machine”,,PinYin”
或, Stroke”项并确定 。
若选择, Machine”,字符按照机内码顺序排序 。
对于西文字符而言, 按其 ASCII码值大小进行排列:
空格在最前面, 大写字母在小写字母前面, 数字在
字母之前 。 因此, 空格最小, 大写字母小于小写字
母, 数字字符小于字母 。 对于汉字字符, 按其国标
码的大小进行排列, 对常用的一级汉字而言, 根据
它们的拼音顺序比较大小 。
Visual FoxPro
83
若选择, PinYin”,字符按照拼音次序排序 。 对于
西文字符, 空格在最前面, 小写字母再前, 大写字母
在后 。
若选择, Stroke”,字符按笔画数多少排序, 因而,
字符笔画数的多少就决定其大小 。
也可以用命令设置字符的排序次序 。 命令格式为:
SET COLLATE TO,<排序次序名 >”
排 序 次 序 名 可 以 是, Machine”,, PinYin” 或
,Stroke”。
比较字符串时, 先取两字符串的第一个字符比较, 若
两者不等, 其大小就决定了两字符串的大小, 若相等,
则各取第二个字符比较, 依次类推, 直到最后, 若每
个字符都相等, 则两个字符串相等 。
Visual FoxPro
84
例 在不同的字符排序次序下, 比较字符串的大小 。
SET COLLATE TO,Machine”
,助教, >”教授,,“abc”>”a”,“”>”a”,“XYZ”>”a”
.T.,F.,F.,F.
SET COLLATE TO,PinYin”
,助教, >”教授,,“abc”>”a”,“”>”a”,“XYZ”>”a”
.T.,F.,F.,T.
SET COLLATE TO,Stroke”
,助教, >”教授,,“abc”>”a”,“”>”a”,“XYZ”>”a”
.F.,F.,F.,T.
Visual FoxPro
85
注意 =( 等于 ) 和 ==( 精确等于 ) 两个关系运算符的
区别 。 它们主要是对字符串进行比较时有所区别 。
字符串的, 等于, 比较有精确和非精确之分, 精
确等于是指只有在两字符串完全相同时才为真, 而
非精确等于是指当, =”号右边的串与, =”号左边的
串的前几个字符相同时, 运算结果即为真 。 可以用
命令 SET EXACT ON 来设置字符串精确比较, 此
时, =和 ==的作用相同, 用命令 SET EXACT OFF
可设置字符串非精确比较, 此时, =和 ==的作用是
不相同的, ==为精确比较, =为非精确比较 。
Visual FoxPro
86
例 字符串比较举例 。
SET EXACT OFF
zc="教授 □□ "
zc="教授 ","教授 "=zc,"教授 "==LEFT(zc,4),zc==
"教授 "
输出结果为,.T.,F.,T.,F.。
请注意在非精确比较状态下, 条件 zc="教授 "与条
件 "教授 "=zc不等价 。
Visual FoxPro
87
3.4.5 逻辑表达式
逻辑表达式 是由逻辑运算符将逻辑型数据连接起来
的式子 。 其值仍是逻辑值 。
逻辑运算符有, NOT或,NOT.或 !( 逻辑非 ),
AND或,AND.( 逻辑与 ), OR或,OR.( 逻辑或 ) 。
其运算优先级是 NOT最高, OR最低 。
逻辑非运算符是 单目运算符, 只作用于后面的一
个逻辑操作数, 若操作数为真, 则返回假, 否则
返回真 。
Visual FoxPro
88
逻辑与与逻辑或是双目运算符, 所构成的逻辑表达
式为:
L1 AND L2
L1 OR L2
其中 L1和 L2均为逻辑型操作数 。
对于逻辑与运算, 只有 L1和 L2同时为真, 表达
式值才为真, 只要其中一个为假, 则结果为假 。
对于逻辑或运算, L1和 L2中只要有一个为真,
表达式即为真, 只有 L1和 L2均为假时, 表达式才
为假 。
Visual FoxPro
89
当一个表达式包含多种运算时, 其运算的优先级由
高到低排列为:
算术运算 → 字符串运算 → 日期运算 → 关系运算
→ 逻辑运算
在对表进行各种操作时常常要表达各种条件, 即对满
足条件的记录进行操作, 此时就要综合运用本章的
知识 。 下面的例子希望读者能认真领会, 这些知识
对以后章节的学习十分重要 。
Visual FoxPro
90
( 1) 姓, 张, 的学生 。
( 2) 20岁以下的学生 。
( 3) 家住湖南或湖北的学生 。
( 4) 汉族学生 。
( 5) 入学成绩在 580分以上的湖南或湖北的学生 。
( 6) 20岁以下的少数民族学生 。
例 学生表的结构如下:
学生 ( 学号 C 6,姓名 C 10,性别 C 2, 出生日
期 D,少数民族否 L,籍贯 C 10,入学成绩 N 5.1,
简历 M,照片 G)
针对学生表, 写出下列条件:
Visual FoxPro
91
( 1) 由于学生的, 姓, 包含在姓名字段且为第一个汉
字, 所以可写出 4种条件:
条件 1,"张 "$姓名
条件 2,AT("张 ",姓名 )=1
条件 3,SUBSTR(姓名,1,2)="张 "
条件 4:姓名 ="张 "
( 2) 由于年龄包含在代表学生出生日期的字段中, 所
以关键是如何根据出生日期求出年龄 。
条件 1,DATE()-出生日期 <=30*365
条件 2,YEAR(DATE())-YEAR(出生日期 )<=30
( 3) 根据籍贯字段, 可以写出 3种条件:
条件 1:籍贯 ="湖南 " OR籍贯 ="湖北 "
条件 2,"湖 "$籍贯
条件 3,AT("湖 ",籍贯 )>0
Visual FoxPro
92
( 4) 根据少数民族否字段, 可写出 3种条件:
条件 1,NOT少数民族否
条件 2:少数民族否=,F.
条件 3,IIF(少数民族否,"少数民族 ","汉族 ")="汉族 "
( 5) 根据入学成绩字段和籍贯字段, 可写出 3种条件
条件 1:入学成绩 >580 AND "湖 "$籍贯
条件 2:入学成绩 >580 AND (籍贯 ="湖南 " OR籍贯 ="
湖北 ")
由于 AND运算优先级比 OR要高, 为了保证先做 OR运
算, 条件 2中的括号是必不可少的 。
( 6) 根据出生日期字段求出年龄, 再结合少数民族
否字段, 写出条件:
YEAR(DATE())-YEAR(出生日期 )<=20 AND 少数民
族否