1
第二章
Visual FoxPro程序设计基础
2
2.1 Visual FoxPro编程基础
2.1.1 数据和数据类型
1,数据的分类
Visual FoxPro的全部数据类型可分为二大类:
一类称为 Visual FoxPro( 基本)数据类型:它们用于变量和数组,也可以用于表的字段中;
另一类称为 Visual FoxPro字段类型,它们只能用于表的字段中
3
2.数据类型
(1)可用于变量、数组或字段的类型
①字符型 (C)(character) ② 货币型 (Y)(currency) 8
③ 日期型 (D)(date) 8 ④日期时间型 (T) (datetime) 8
⑤ 逻辑型 (L)(logical) 1 ⑥ 数值型 (N)(numeric)
其中红色数字表示该类型的固定宽度
4
(2) 下种 7种类型只能用于数据表中
⑦双精度型 (B)(double) 8 ⑧ 浮点型 (F)(float) 8
⑨ 通用型 (G)(general) 4 ⑩整型 (I)(Integer) 4
⑴ 备注型 (M)(memo) 4 ⑵ 字符型 (二进制 )
⑶备注型 (二进制 ) 4
5
2.1.2 常量与变量运行过程中,保持不变的数据为,常量,。
1,常量
Visual FoxPro定义了如下类型的常量:
① 数值型常量如,-20,16.68,3.14,1.6E-12表示 1.6× 10-12
② 字符型常量用字符串定界符括起来的一串字符,字符串定界符有单引号或双引号和方括号,如,"ABCD",?字符 ’,
[123ABC]
6
③ 逻辑型常量逻辑值只有真和假两种,通常用小圆点括起来的,T.,.t.、
.Y.,.y.表示真,,F.,,f.,.N.,.n.表示假
④ 日期型常量和日期时间型常量如,{^1999-04-22},{^l999-04-24 10:00am}
⑤ 货币型常量货币型常量与数值型数据书写方法类似,但数字前面要加上 $,如,$123,$321.123456小数部分保留 4位,多余的位数四舍 5入
7
2,变量在程序的执行过程中可取不同数值的量称为变量 。 有 2种形式的变量:内存变量和字段变量 。 每个变量都有一个名称,叫做变量名,变量名的命名规则是
(1)以字母,数字及下划线组成,可以使用汉字作变量名

(2)以字母或下划线开始 。
(3)长度为 1~ 128个字符,每个汉字占 2个字符 。
(4)不能使用 VISUAL FOXPRO的保留字 。
8
变量的作用域:
在 Visual FoxPro中,还可以使用 LOCAL,PRIVATE和
PUBLIC命令强制规定变量的作用范围 。 用 LOCAL创建的变量只能在创建它们的过程中使用和修改;不能被更高层或更低层的过程访问 。 PRIVATE用于定义私有变量,它用于定义当前过程的变量,并将以前过程定义的同名变量隐藏起来,在当前过程中使用私有变量而不影响这些同名变量的原始值 。 PUBLIC用于定义全局变量 。 所有过程都可以使用这些全局变量 。 内存变量的数据类型由最近一次赋给该变量的值的类型确定
9
3,内存变量的操作
1),内存变量的赋值格式 1,STORE <表达式 > TO <变量名表 >
格式 2,<内存变量名 > = <表达式 >
2) 表达式的显示格式 1,? [<表达式表 >]
格式 2,?? <表达式 >
功能:计算表达式表中的各表达式并输出各表达式值 。
10
3) 内存变量的显示格式 1,LIST MEMORY [LIKE <通配符 >] [TO PRINTER |
TO FILE <文件名 >]
格式 2,DISPLAY MEMORY [LIKE <通配符 >] [ TO
PRINTER | TO FILE <文件名 >]
LIST MEMORY,如果内存变量多,一屏显示不下,则自动向上滚动 。 DISPLAY MEMORY分屏显示与通配符匹配的所有内存变量,如果内存变量多,显示一屏后暂停,按任意键之后再继续显示下一屏 。
11
4) 内存变量的清除格式 1,CLEAR MEMORY
格式 2,RELEASE <内存变量名表 >
格式 3,RELEASE ALL [EXTENDED]
格式 4,RELEASE ALL [LIKE <通配符 > | EXCEPT <通配符 >]
功能:格式 1清除所有内存变量 。 格式 2清除指定的内存变量 。
例 P24
12
2.1.3 运算符与表达式描述各种不同运算的符号称为运算符,而参与运算的数据称为操作数 。 表达式用来表示某个求值规则,它由运算符和配对的圆括号将常量,变量,函数,对象属性等操作数以合理的形式组合而成 。
在 VISUAL FOXPRO中有 5类运算符和表达式:算术运算符和算术表达式,字符串运算符和字符串表达式,日期运算符和日期表达式,关系运算符和关系表达式,
逻辑运算符和逻辑表达式 。
13
1,算术运算符与算术表达式算术表达式也称数值型表达式,其运算结果为一数值 。
(1)算术运算符 。
Visual FoxPro提供 6个算术运算符,加 (+),减 (-)
,乘 (*),除 (/),取负 (-),乘方 (^或 **)运算的含义与数学中基本相同 。
算术运算符的优先权依次为 ()→^ 或 **→* 和 /→ %
→+ 和 -。
14
(2) 表达式的书写规则 。
1)每个符号占 1格,所有符号都必须一个一个并排写在同一横线上,不能在右上角或右下角写方次或下标 。 例如,23要写成 2^3,X1+X2要写成 X1+X2。
2) 原来在数学表达式中省略的内容必须重新写上 。 例如
,2x要写成 2*x。
3) 所有括号都用小括号 (),括号必须配对 。
4 ) 要把 数 学表 达式 中的 有些 符 号,改成 VISUAL
FOXPRO中可以表示的符号 。 例如:要把 2πr改为
2*pi()*r。 (pi()为函数 )
15
2,字符串运算符与字符串表达式字符运算符有两个 (其运算优先级别相同 ) +,-,表示将两个字符串连接起来。其中,-”表示将前一个字符串的尾部空格移到后面。
例如:
,123ABC”+”666xyz” &&连接后结果为:
” 123ABC666xyz”
“123 45”+”abcd,+” xyz,&&连接后结果为:
” 123 45abcd xyz,
“ABC,-“DEFG” &&连接后结果为:
” ABCDEFG,
16
3,日期时间运算符与日期时间表达式日期型表达式由运算符,十,或,—”,整数,日期型常量,日期型变量和函数组成 。
(1) 两个日期型数据可以相减,例如,{^1999/12/19}-{^1999/11/16}
'结果为数值型数据 33
(2) 一个数值型数据可加到日期型数据中,其结果仍然为一日期型数据 (向后推算日期 )。 例如,{^1999/11/16}+33 '结果为日期型数据,{^1999/12/19}
(3)一个表示天数的数值型数据可从日期型数据中减掉它,其结果仍然为一日期型数据 (向前推算日期 )。 例如:
{^1999/12/19}-33 ‘结果为日期型数据,{^1999/11/16}
注意:两个日期型数据不能相加 !
17
4,关系运算符与关系表达式关系表达式由关系运算符,常量,变量和函数组成 。
VISUAL FOXPRO提供的关系运算符有 >,<,>=,<=
,<>(#,!=),$,==。
关系表达式的运算结果只有真 (.T.)和假 (.F.)。
18
5+3>=7 &&结果为真 (.T.)
ab?$?asdabfh? &&结果为真 (.T.)
{^2003/05/17}<{^1998/10/25} &&结果为假 (.F.)
asdabfh?=?as? &&结果为真 (.T.)
as?=?asdabfh? &&结果为假 (.F.)
asdabfh?= =?as? &&结果为假 (.F.)
asdabfh?<>?as? &&结果为真 (.T.)
&&当 set exact on 时为假 (.F.)
‘ab’+’cd’= =”abcd” &&结果为真 (.T.)
19
5,逻辑运算符与逻辑表达式逻辑表达式由逻辑运算符,逻辑常量,变量和函数组成
。 VISUAL FOXPRO提供的逻辑运算符如表 2.4所示 。
一个逻辑表达式可包含多个逻辑运算符 。 对于较复杂的条件判断必须采用逻辑表达式才能完成 。 参加逻辑运算的对象为逻辑对象其表达式的值也是一个逻辑值

20
表 2.5 逻辑运算真值表
A B NOT A A AND B A OR B
.T.,T.,F.,T.,T.
.T.,F.,F.,F.,T.
.F.,T.,T.,F.,T.
.F.,F.,T.,F.,F.
21
2.2 函数
2.2 函数函数是用程序来实现的一种数据运算或转换 。
函数可以用函数名加一对圆括号调用,如
LEN(x)。
22
2.2.1 函数的分类
VISUAL FOXPRO的函数有两种,一种是用户自定义的函数,一种是系统函数 。 VISUAL FOXPRO提供的系统函数大约有 380多个,主要分为:
数值函数,字符处理函数,表和数据库函数,日期时间函数,类型转换函数,测试函数,菜单函数,窗口函数,数组函数,SQL查询函数,位运算函数,对象特征函数,文件管理函数以及系统调用函数等 14类 。
本节将常用函数分为数值函数,字符处理函数,日期类函数,数据类型转换函数,测试函数 5类,通过举例分别介绍 。
23
2.2.2 常用函数
1,数值函数
绝对值和符号函数格式,ABS(<数值表达式 >)
SIGN(<数值表达式 >)
功能,ABS()返回指定的数值表达式的绝对值 。
例 1 STORE 10 T0 x
ABS(5-x),ABS(x-5),SIGN(5-x),SIGN(x-10)
5 5 -1 0
24
求平方根函数格式,SQRT(<数值表达式 >)
功能:返回指定表达式的平方根 。 自变量表达式的值不能为负 。
例 2? SQRT(2*SQRT(2)),(2*6)^(1/2)
1.68 3.46 (开平方就是 1/2次方,显然函数更简洁一些 )
例 3 STORE -100 To x
SIGN(x)*SQRT(ABS(x))
-10
25
圆周率函数格式,PI()
功能:返回圆周率 π(数值型 )。该函数没有参数。
26
取整数函数格式,INT(<数值表达式 >)
CEILNG(<数值表达式 >)
FLOOR(<数值表达式 >)
功能,INT()返回指定数值表达式的整数部分。
CEILING()返回大于或等于指定数值表达式的最小整数。
FLOOR()返回小于或等于指定数值表达式的最大整数。
例 4 STORE 5.8 TO x
INT(x),INT(-x),CEILING(x),CEILING(-X),FLOOR(x),
FLOOR(-x)
5 -5 6 -5 5 -6
27
四舍五入函数格式,ROUND(< 数值表达式 1>,<数值表达式 2> )
例 5 x= 345.345
ROUND(X,2),ROUND(x,1),ROUND(X,0),
ROUND(x,一 1)
345.35 345.3 345 350
28
求余数函数格式,MOD(<数值表达式 1>,<数值表达式 2>)
功能:返回两个数值相除后的余数。余数的正负号与除数相同。如果被除数与除数同号,那么函数值即为两数相除的余数;如果被除数与除数异号,则函数值为两数相除的余数再加上除数的值。
例 6? MOD(10,3),MOD(10,-3),MOD(-10,3),
MOD(-10,-3)
1 -2 2 -1
29
求最大值和最小值函数例 7? MAX('2','12','05'),MIN('汽车 ','飞机 ','轮船 ')
2 飞机
30
2,字符函数字符函数是指函数参数或函数值为字符型数据的函数 。
求字符串长度函数格式,LEN(< 字符表达式> )
功能:返回指定字符表达式值的长度,即所包含的字符个数 。 函数值为数值型 。
例 8 x= "中文 Visual FoxPro6.0"
LEN(x)
20
31
大小写转换函数格式,LOWER(<字符表达式 >)
UPPER(<字符表达式 >)
功能,LOWER()将指定表达式值中的大写字母转换成小写字母,其他字符不变 。
UPPER()将指定表达式值中的小写字母转换成大写字母,其他字符不变 。
例 9? LOWER('xly2A*'),UPPER('n= 1')
xly2a* N= 1
32
空格字符串生成函数格式,SPACE(< 数值表达式> )
功能:返回由,数值表达式,指定数目的空格组成的字符串 。
33
删除前后空格函数格式,TRIM(< 字符表达式> )
LTRIM(< 字符表达式> )
ALLTRIM(<字符表达式 >)
功能,TRIM()返回指定字符表达式值去掉尾部空格后形成的字符串。
LTRIM()返回指定字符表达式值去掉前导空格后形成的字符串。
ALLTRIM()返回指定字符表达式值去掉前导和尾部空格后形成的字符串

例 10 ss= SPACE(1)十 "TEST"十 SPACE(3)
TRIM(ss)+LTRIM(ss)+ALLTRIM(ss)
TESTTEST TEST
34
取子串函数格式,LEFT(<字符表达式 >,<长度 >)
RIGHT(<字符表达式 >,<长度 >)
SUBSTR(<字符表达式 >,<起始位置 >[,<长度 >])
功能,LEFT()从指定表达式值的左端起取一个指定长度的子串作为函数值。
RIGHT()从指定表达式值的右端起取一个指定长度的子串作为函数值。
SUBSTR()从指定表达式值的指定起始位置取指定长度的子串作为函数值。
在 SUBSTR()函数中,若缺省第三个自变量<长度>,则函数从指定位置一直取到最后一个字符。
例 11 STORE "GOOD BYE!" TO x
LEFT(x,2),SUBSTR(x,6,2)十 SUBSTR(x,6),RIGHT(x,3)
GO BYBYE! YE!
35
计算子串出现次数函数格式,OCCURS(< 字符表达式 1>,<字符表达式 2> )
功能:返回第一个字符串在第二个字符串中出现的次数
,函数值为数值型。若第一个字符串不是第一个字符串的子串,函数值为 0。
例 12 STORE 'abracadabra' TO s
OCCURS('a',s),OCCURS('b',s),OCCURS('c',s),
OCCURS('e',s)
5 2 1 0
36
求子串位置函数格式,AT(<字符表达式 1>,<字符表达式 2>[,<数值表达式 >])
功能,AT()的函数值为数值型。如果<字符表达式 1>是
<字符表达式 2)的子串,则返回<字符表达式 1>值的首字符在<字符表达式 2>值中的位置;若不是子串,
则返回 0。 <数值表达式 >:第几次出现该串的位置。
例 13 STORE“This is Visual FoXPro”TO x
AT(“fox”,x),ATC(“fox”,x),AT(“is”,x,3),
AT(“xo”,x)
0 16 10 0
37
子串替换函数格式,STUFF(< 字符表达式 1>,<起始位置>,<长度>,<字符表达式 2> )
功能:用<字符表达式 2)值替换<字符表达式 1>中由<起始位置>
和<长度>指明的一个子串。替换和被替换的字符个数不一定相等。如果<长度>值是 0,<字符表达式 2)则插在由<起始位置>
指定的字符前面。如果<字符表达式 2>值是空串,那么<字符表达式 1>中由<起始位置>和<长度>指明的子串被删去。
例 14 STORE?GOOD BYE!? TO s1
STORE?MORNING? To S2
STUFF(s1,6,3,s2),STUFF(s1,1,4,)
GOOD MORNING! BYE!
38
字符替换函数格式,CHRTRAN(<字符表达式 1>,<字符表达式 2>,<字符表达式 3>)
该函数的参数是三个字符表达式。当第一个字符串中的一个或多个字符与第二个字符串中的某个字符相匹配时,就用第三个字符串中的对应字符 (相同位置 )替换这些字符。如果第三个字符串包含的字符个数少于第二个字符串包含的字符个数,因而没有对应字符,那么第一个字符串中相匹配的各字符将被删除。如果第三个字符串包含的字符个数多于第二个字符串包含的字符个数,多余字符被忽略。
例 15 x1= CHRTRAN(“ABACAD”,“ACD”,“x12”)
y1= CHRTRAN(“计算机 ABC”,“计算机,,,电脑,)
z1= CHRTRAN(“大家好 !”,,大家,,,您,)
x1,Y1,z1
xBx1x2 电脑 ABC 您好!
39
字符串匹配函数。
格式,LIKE(< 字符表达式 1>,<字符表达式 2))
功能:比较两个字符串对应位置上的字符,若所有对应字符都相匹配,函数返回逻辑真 (.T.),否则返回逻辑假 (,F,)。
< 字符表达式 1>中可以包含通配符,*” 和,?,。,*” 可与任何数目的字符相匹配,?可以与任何单个字符相匹配。
例 16 STORE“abc”TO x
ST0RE,abcd”TO y
LIKE(“ab*”,x),LIKE(“ab*”,y),LIKE(x,y),LIKE(“?b?”,x),LIKE("Abc"
,x)
.T.,T.,F.,T.,F.
40
3,日期和时间函数
系统日期和时间函数格式,DATE()
TIME()
DATETIME()
功能,DATE()返回当前系统日期,函数值为日期型 。
TIME()以 24小时制,hh,mm,ss格式返回当前系统时间,函数值为字符型 。
DATETIME()返回当前系统日期时间,函数值为日期时间型 。
例 16? DATE(),TIME(),DATETIME()
07/ 18/ 03 16,59,05 07/ 18/ 03 04,59,05PM
41
求年份,月份和天数函数格式,YEAR(< 日期表达式> |<日期时间表达式> )
MONTH(< 日期表达式> |<日期时间表达式> )
DAY(< 日期表达式> |<日期时间表达式> )
功能:返回年份 (如 2001),返回月份,返回月天数,这三个函数的返回值都为数值型 。
例 17 STORE {^2001-08-18} T0 d
YEAR(d),MONTH(d),DAY(d)
2001 8 18
42
时、分和秒函数格式,HOUR(< 日期时间表达式> )
MINUTE(< 日期时间表达式> )
SEC(< 日期时间表达式> )
功能,HOUR()从指定的日期时间表达式中返回小时部分 (24小时制 )。
MINUTE()从指定的日期时间表达式中返回分钟部分。
SEC()从指定的日期时间表达式中返回秒数部分。
这三个函数的返回值都为数值型。
例 18 STORE{^2001-03-18 02,30,50PM} TO t
HOUR(t),MINUTE(t),SEC(t)
14 30 50
43
4,数据类型转换函数数据类型转换函数的功能是将某一种类型的数据转换成另 —种类型的数据 。
数值转换成字符串格式,STR(< 数值表达式> [,<长度> [,<小数位数> ]])
功能:将<数值表达式>的值转换成字符串,转换时根据需要自动进行四舍五入 。 返回字符串的理想长度 L应该是<数值表达式>
值的整数部分位数加上<小数位数 >,再加上 1位小数点 。 如果<
长度>值大于 L,则字符串加前导空格以满足规定的<长度>要求;如果<长度>值大于等于<数值表达式>值的整数部分位数 (
包括负号 )但又小于 L,则优先满足整数部分而自动调整小数位数;如果<长度>值小于<数值表达式>值的整数部分位数,则返回一串星号 ( *) 。
<小数位数>的默认值为 0,<长度>的默认值为 10。
44
例 19 STORE -123.456 TO n
"n= "十 STR(n,8,3)
n=-123.456
STR(n,9,2),STR(n,6,2),STR(n,3),STR(n,6)
,STR(n)
-123.46 -123.5 *** -123 -123
45
字符串转换成数值格式,VAL(<字符表达式 >)
功能:将由数字符号 (包括正负号、小数点 )组成的字符型数据转换成相应的数值型数据。从第一个字符开始转换,遇到不符合数值书写规则的字符立即停止转换,若第一个字符不是数字符号,则返回数值 0。
例 20 STORE '-123.' TO x
STORE '45' TO y
STORE 'A45' TO z
VAL(x+y),VAL(x+z),VAL(z+y)
-123.45 -123.00 0.00
46
字符串转换成日期或日期时间格式,CTOD(<字符表达式 >)
功能,CTOD()将<字符表达式>值转换成日期型数据。
字符串中的日期部分格式要与 SET DATE TO命令设置的格式一致。其中的年份可以用四位,也可以用两位。
如果用两位,则世纪由 SET CENTURY TO语句指定。
47
例 21 SET DATE YMD
SET CENTURY ON && 显示日期或日期时间时,用 4位数显示年份
SET CENTURY TO 19 ROLLOVER 51
d1= CTOD('2001/ 03/ 18')
t1= CTOT('2001/ 03/ 18'+''+TIME())
d1,t1,CTOD('50/ 01/ 01'),CTOD('51/ 01/ 0l')
2001/ 03/ 18 2001/ 03/ 18 10:31:54 PM 2050/ 01/ 01 1951/ 01/
01
这里,SET CENTURY TO语句指定:小于 51的两位数年份属于 21世纪 (19+1),而大于等于 51的两位数年份属于 20世纪 (19)。
48
日期或日期时间转换成字符串格式,DTOC(<日期表达式 >[<日期时间表达式 >[,1])
TTOC(<日期时间表达式 >[,1])
功能,DTOC()将日期型数据或日期时间数据的日期部分转换成字符串。 TTOC()将日期时间数据转换成字符串。
字符串中日期部分的格式与 SET DATE TO语句的设置和 SET
CENTURY ON|OFF(ON为四位数年份,OFF为两位数年份 )语句的设置有关。时间部分的格式受 SET HOURS TO 12|24语句的设置影响。
对 DTOC()来说,如果使用选项 1,则字符串的格式总是为
YYYYMMDD,共 8个字符。对 TTOC()来说,如果使用选项 1,则字符串的格式总是为 YYYYMMDDHHMMSS,采用 24小时制,共
14个字符。
49
例 22 STORE DATETIME()TO t
t
08/ 18/ 03 11,54,39 PM
DTOC(t),DTOC(t,1),TTOC(t),TTOC(t,1)
08/ 18/ 03 20030818 08/ 18/ 03 11,54,39PM
20030818235439
50
宏替换函数格式,&<字符型变量> [.]
功能:用字符型变量的值替换宏替换函数。如果该函数与其后的字符无明确分界,则要用,,,作函数结束标识。宏替换可以嵌套使用。
例 23 AB =“ABC”
ABC=?宏替换函数 ’
&AB && 相当于? ABC
宏替换函数
X=10
Y=20
Z=” X+Y”
(&Z.)*5 && 相当于?( X+Y) *5
150
51
5,测试函数在数据处理过程中,有时用户需要了解操作对象的状态
。 例如,要使用的文件是否存在,数据库的当前记录号,是否到达了文件尾,检索是否成功,某工作区中记录指针所指的当前 记录是否有删除标记,数据类型等信息 。 尤其是在运行应用程序时,常常需要根据测试结果 来决定下一步的处理方法或程序走向 。
52
( 1) 空值 (NULL值 )测试函数格式,ISNULL(< 表达式> )
功能:判断一个表达式的运算结果是否为 NULL值,若是
NULL值返回逻辑真 (,T,),否则返回逻辑假 (.F.)。
例 25 STORE,NULL,TO x
x,ISNULL(x)
.NULL.,T.
53
( 2) 数据类型测试函数格式,VARTYPE(<表达式 >[,<逻辑表达式 >])
功能:测试<表达式>的类型,返回一个大写字母,函数值为字符型 。 字母的含义如表 2.8所示 。
表 2.8 用 VARTYPE() 测得的数据类型
54
返回的字母 数据类型返回的字母 数据类型
C 字符型或备注型 G 通用型
N 数值型、整型、浮点型 或双精度型 D 日期型
Y 贷币型 T 日期时间型
L 逻辑型 X NULL值
O 对象型 U 未定义
55
若 <表达式 >是一个数组,则根据第一个数组元素的类型返回字符串,若 <表达式 >的运算结果是 NULL值,则根据<逻辑表达式>值决定是否返回<表达式>的类型:
如果<逻辑表达式>值为,T.,就返回<表达式>的原数据类型 。 如果<逻辑表达式>值为,F.或缺省,则返回 x以表明<表达式>的运算结果是 NULL值 。
例 26 X="AAA"
STORE 10 TO y
STORE,NULL,TO x
STORE $ 100.2 TO Z
VARTYPE(x),VARTYPE(x,.T.),VARTYPE(y),
VARTYPE(z)
X C N Y
EMPTY( )和 IIF函数
56
2.5 Visual FoxPro的工作方式
1,命令交互方式
2,程序执行方式
3,菜单操作方式