第 3 章 数据、函数与表达式

67
第 3 第 第第 第第第第第第

Upload: wynne-gregory

Post on 01-Jan-2016

129 views

Category:

Documents


5 download

DESCRIPTION

第 3 章 数据、函数与表达式. 常量. 其值不发生变化的量,分为四种类型: 1)数值型(N):直接由数字或+、-、小数点构成。 2)字符型(C):由字符、汉字组成,需加定界符。如’沈阳’、”沈阳”、[沈阳],同一定界符不能嵌套,如:“ AB ”CD” ”, 但 ‘AB ”CD” ’ 是合法的。 3)日期型(D):用{}定界。 如{00-08-30} 或CTOD(“01/08/30”) 4)逻辑型(L):用.定界。如 .t.、.f.,.Y.,.N.等 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第  3 章  数据、函数与表达式

第 3章 数据、函数与表达式

Page 2: 第  3 章  数据、函数与表达式

其值不发生变化的量,分为四种类型:1 )数值型( N ):直接由数字或 + 、 - 、小数点构成。2 )字符型( C ):由字符、汉字组成,需加定界符。

如’沈阳’、”沈阳”、 [ 沈阳 ] ,同一定界符不能嵌套,如 :“ AB ”CD” ”, 但 ‘ AB ”CD” ’ 是合法的。

3 )日期型( D ):用 {} 定界。 如 {00-08-30}

或 CTOD(“01/08/30”)

4 )逻辑型( L ):用 . 定界。如 .t. 、 .f.,.Y.,.N. 等说明:请注意 C 、 D 、 L 型常量的定界符。注意区分”

2010” 为字符型常量,而不是数值型常量。逻辑型常量必须用“ .” 定界。注意各类型数据的宽度。

常量

Page 3: 第  3 章  数据、函数与表达式

变量:– 程序运行中,值可能会发生变化的量–变量是内存中的一个存储单元的位置–变量名是存储位置的符号标识–存储位置中存放的数据在程序操作期间通过该名称来读写

变量

Page 4: 第  3 章  数据、函数与表达式

变量分类:1 )字段名变量

•数据表中已定义的数据项•每一个字段可有不同的取值

–表有一个记录指针,它指向的记录定义为当前记录,字段名变量现值,就是当前记录中对应字段值。

–记录指针是可以移动的,因此,字段名的取值随着指针的移动而改变,所以它是变量

2 )内存变量:独立于数据库之外的

Page 5: 第  3 章  数据、函数与表达式

变量的创建• 赋值格式:

•Store 表达式 to 变量•变量 = 表达式

• 在赋值的同时,完成了变量的创建 STORE

3 TO nVar

nVar = 3

Page 6: 第  3 章  数据、函数与表达式

访问变量• 如字段变量和内存变量同名:

– 则字段变量具有更高的优先权– 此时内存变量访问

• M. 内存变量• M-> 内存变量

Page 7: 第  3 章  数据、函数与表达式

字段名变量• 数据表中已定义的数据项• 每一个字段可有不同的取值

– 表有一个记录指针,它指向的记录定义为当前记录,字段名变量的现值,就是当前记录中对应字段的值。

– 记录指针是可以移动的,因此,字段名的取值随着指针的移动而改变,所以它是变量

• 当前记录:记录指针指向的记录 ** 表刚打开,当前记录是第一条记录

• 移动记录指针:GO TOP|BOTTOM|[< 数值表达式 >] :绝

对移动记录指针。SKIP [< 数值表达式 >] :相对移动记录指

Page 8: 第  3 章  数据、函数与表达式

移动记录指针实例

• Go 1• Skip 2• ? 编号• skip• Go bottom• ? 编号• Skip –1• ? 编号

编号 姓名101 张三102 王一103 刘六104 李四105 赵七106 朱八

表一

2

Page 9: 第  3 章  数据、函数与表达式

内存变量• 变量名 :

– 是以汉字、字母、数字或下划线组成的字符串,串长最多为 10 个字符或 5 个汉字

– 变量名必须以字母或汉字开头,下划线必须嵌在变量名中间,但不能嵌入空格符

• 内存变量分为四种类型:– 数值型、字符型、逻辑型和日期型

• 变量赋值格式:– 〈内存变量〉 = 〈表达式〉– STORE 〈表达式〉 to < 内存变量表〉功能:把〈表达式〉的值送到内存变量中

Page 10: 第  3 章  数据、函数与表达式

• 数组 :

– 名字相同、用下标区分的内存变量称为数组

• 主要有以下特点:(1) 数组元素的类型,由所赋的值来决定

(2) 数组和数据表之间可相互转换即数据表中数据可以转换为数组数据数组数据也可以转换为数据表中的数据

Page 11: 第  3 章  数据、函数与表达式

1. 定义数组• 数组名的取法和一般的变量名取法相同• 定义数组命令: DIMENSION < 数组名 >(< 数值表达式 1> [ ,< 数值表达式 2>

] ) [ ,< 数组名 >(< 数值表达式 1>…]• 命令功能:定义一个或多个内存变量数组。• 说明:

– 最多可有 3600 个元素,显示内存时只算一个变量– 数组下标起始值是 1– 数组元素隐含的逻辑值为“假”** 二维数组,可用一维下标来存取。这是由于在内存中,二

维数组元素是按行列次序排列– 它们每个元素都可看作单独一个内存变量使用,

Page 12: 第  3 章  数据、函数与表达式

数组实例• DIMENSION A(2 , 3) • ? A4

• ? A(2,1)• ? A6• ? A(2,3) A(1,1) A(1,2) A(1,3)

1 2 3

A(2,1) A(2,2) A(2,3) 4 5 6

Page 13: 第  3 章  数据、函数与表达式

• 变量:– 专用

• 在程序中用 DIMENSION 建立的数组为专用– 公用

• 命令窗口下建立的数组为公用• 在程序中建立公用的数组用 PUBLIC 命令• 格式为:

PUBLIC 〈数组名〉 (<N 表达式 1> , [<N表达式 2> ] )• 例如: DIMENSIOM A(4) , B(2 , 3)• 建立一维数组 A 和二维数组 B• 二维数组有六个元素 :• 分别为

B(1 , 1) 、 B(1 , 2) 、 B(1 , 3)B(2 , 1) 、 B(2 , 2) 、 B(2 , 3)

Page 14: 第  3 章  数据、函数与表达式

数组的赋值• 格式:

– STORE 〈表达式 〉 TO 〈数组名〉 〈数组名〉 = 〈表达式〉

• 命令功能:– 将表达式的值赋给数组变量– 上述两个命令是完全等价的

Page 15: 第  3 章  数据、函数与表达式

表达式• 表达式 :

– 是由常数、变量、函数和运算符组成的一个有物理意义的式子

– 表达式总有一定的运算结果,即有一个值,所以表达式也是一种数据

• 表达式分为(表达式结果):– 数值表达式– 字符表达式– 关系表达式– 逻辑表达式

Page 16: 第  3 章  数据、函数与表达式

表达式的输出命令:• 格式:

?[[?]< 表达式 >,[< 表达式 >]]• 功能:

计算表达式的值,并在屏幕或打印机上输出

• 例如: ? 4*6+10 34

Page 17: 第  3 章  数据、函数与表达式

1. 数值表达式• 数值表达式 :

– 是由算术运算符和数值型常数、变量、函数组成。– 运算结果为数值型数据。– 算术运算符为: + - * / ^ ( )

• 优先次序 :– 括号、函数、乘方、乘除和加减,同级运算从左到右依次进行

• 如 :– 3 + 6 / 2 - EXP(8) LOG(20) 2^5

Page 18: 第  3 章  数据、函数与表达式

2. 字符表达式• 字符表达式 :

– 是由字符运算符和字符型常数 ( 即用定界符括起来的字符串 ) 、变量、函数组成

– 运算结果是字符型数据• 三种字符串运算:

* 完全连接运算– 格式: " 〈字符串 1 〉 "+ " 〈字符串 2 〉 "– 功能:将两个字符串连接为一个字符串。– 例如:? "THIS IS " + "A PEN"THIS IS A PEN * 完全连接是指两个字符串合并,即包括空格在内

的字符串中所有字符相加。

Page 19: 第  3 章  数据、函数与表达式

不完全连接运算– 格式: " 〈字符串 1 〉 "- " 〈字符串 2 〉 "

– 功能:•也是将两个字符串连接为一个字符串,但

是删去字符串 1 尾部的空格符– 例如:– ? “首都∶ ***" - " 北京 "

– 首都:北京 ***– 注:串 1 尾部的空格移到串 1 后

Page 20: 第  3 章  数据、函数与表达式

包含运算• 格式:

– 〈串 1 〉$〈串 2 〉• 功能:

– 如串 1 包含在串 2 中,表达式的值为真,否则为假

• 例如:– "AB" $ "ACBTE" 结果为假 ( . F. )– "AB" $ "ABCDE" 结果为真 ( . T . )

• 注:– 包含运算是字符串的关系运算– 关系运算返回的是逻辑值

Page 21: 第  3 章  数据、函数与表达式

3. 关系表达式• 关系表达式:

– 是由关系运算符与字符表达式或数值表达式组成– 结果是一个逻辑值– 关 系 成 立 结 果 取真 (.T.) , 不 成 立 结 果 取 假

( . F. )– 关系运算符两边的数据类型要一致, ( 同类型 )

• 关系运算符有 6 种:<= , < , = , >= , > , <> 、 # 或 !=

• 注:– 字符的比较是 ASCII码值的大小

•空格 <0-9<A-Z<a-z• 例:

– ? 123>100– ? "CH"<"CA"

Page 22: 第  3 章  数据、函数与表达式

表达式例: 1 )算术表达式:结果为数值型。如 3+2 2 )字符表达式:结果为字符型 如 ’Good ’+’Morning’ 或’ Good ’-’Morning’

3 )日期表达式:结果为日期或数值。如 DATE()+5 、 DATE()-5

或 DATE()-{00-08-20} 4 )关系表达式:结果为逻辑型。如 ”AB”$”ABCD” 、” AB”<”BC” 5 )逻辑表达式:结果为逻辑型。如 3>2 .AND. .NOT.5>6

Page 23: 第  3 章  数据、函数与表达式

说明:▲在日期型表达式中,两个日期表达式相减,结果为数值,表示两日期之间相差的天数,两日期表达式相加,属非法表达式;一个日期表达式与一个数值表达式相加,结果为日期型表达式,表示从当前日期往后数 N 天;一个日期表达式与一数值表达式相减,表示从当前日期向前数 N 天。

▲逻辑表达式包含关系表达式,关系表达式中包含算术表达式。注意,关系表达式与逻辑表达式的结果都为逻辑型。

Page 24: 第  3 章  数据、函数与表达式

常用函数• 函数是用程序来实现的一种数据运算或转换。每

一个函数都有特定的数据运算或转换功能,它往往需要若干个自变量,即运算对象,但只能有一个运算结果,称为函数值或返回值。函数可以用函数名和一对圆括号加以调用,自变量放在圆括号里,如 LEN(x) 。函数调用可以出现在表达式里,表达式将函数的返回值作为自己运算的对象。函数调用也可作为一条命令使用,但此时系统忽略函数的返回值。本章将常用函数分为数值函数、字符处理函数、日期类函数、数据类型转换函数、测试函数 5 类,通过举例分别介绍。

Page 25: 第  3 章  数据、函数与表达式

数值函数• 数值函数是指函数值为数值的一类函数,它们的自变量和返回值往往都是数值型数据。

1.绝对值函数– 格式: ABS( 〈数值表达式〉 )– 功能:返回指定的数值表达式的绝对值。– 例如: ? ABS(10),ABS(-5) 10 5

Page 26: 第  3 章  数据、函数与表达式

数值函数 2. 符号函数

– 格式: SIGN( 〈数值表达式〉 )– 功能:返回指定数值表达式的符号。当表

达式的运算结果为正、负和零时,函数值分别为 1 、 -1 和 0 。

– 例如: ? SIGN(-10),SIGN(0),SIGN(5)

-1 0 1

Page 27: 第  3 章  数据、函数与表达式

数值函数 3.求平方根函数

– 格式: SQRT( 〈数值表达式〉 )– 功能:返回指定表达式的平方根。自变量

表达式的值不能为负。– 例如:

? SQRT(4) 2

Page 28: 第  3 章  数据、函数与表达式

数值函数4.圆周率函数• 格式: PI()• 功能:返回圆周率 π( 数值型 ) 。该函数没

有自变量。

Page 29: 第  3 章  数据、函数与表达式

数值函数 5.求整数函数

– 格式与功能: INT( 〈数值表达式〉 ) 返回指定数值表达式的整数部分

CEILING( 〈数值表达式〉 ) 返回大于或等于指定数值表达式的最小整数

FLOOR( 〈数值表达式〉 ) 返回小于或等于指定数值表达式的最大整数例如:

X=5.8? INT(X) ; INT(-X) ; CEILING(X) ;

CEILING(-X) ; FLOOR(X) ; FLOOR(-X) 5 -5 6 -5 5 -6

Page 30: 第  3 章  数据、函数与表达式

数值函数 6. 四舍五入函数

– 格式: ROUND( 〈数值表达式 1 〉,〈数值表达式2 〉 )

– 功能:返回指定表达式在指定位置四舍五入后的结果。– 说明:〈数值表达式 2 〉指明四舍五入的位置。若〈数

值表达式 2 〉大于等于 0 ,那么它表示的是要保留的小数位数:若〈数值表达式 2 〉小于 0 ,那么它表示的是整数部分的舍入位数。

– 例如:X=645.345? ROUND(X,2)

ROUND(X,1),ROUND(X,0),ROUND(X,-1) 645.35 645.3 645 650

Page 31: 第  3 章  数据、函数与表达式

数值函数 8. 求最大值和最小值函数

– 格式: MAX( 〈数式 1 〉 , 〈数式 2 〉,[,〈数式 3 〉…] MIN( 〈数式 1 〉 , 〈数式 2 〉,[,〈数式 3 〉…]– 功能: MAX( ) 计算各自变量表达式值,并返回其中的最大值。 MIN( ) 计算各自变量表达式值,并返回其中的最小值。– 说明:自变量表达式的类型可以是数值型、字符型、货币

型、双精度型、浮点型、日期型和日期时间型,但所有表达式的类型必须相同。

– 例如: ? MAX(8,100),MAX(‘8’,‘100’) 100 8

Page 32: 第  3 章  数据、函数与表达式

字符函数• 字符函数是指自变量一般是字符型数据的函数。1.求字符串长度函数

– 格式: LEN( 〈字符表达式〉 )– 功能:返回指定字符表达式值的长度,即所包

含的字符个数。函数值为数值型。– 例如: X="book“ ? LEN(X)

4

Page 33: 第  3 章  数据、函数与表达式

字符函数 2.空格字符串生成函数

– 格式: SPACE( 〈数值表达式〉 )– 功能:返回由指定数目的空格组成的字符串。

3. 删除前后空格函数TRIM( 〈字符表达式〉 ) 返回指定字符表达式值去掉尾部空格后形成的字符串LTRIM( 〈字符表达式〉 ) 返回指定字符表达式值去掉前导空格后形成的字符串ALLTRIM( 〈字符表达式〉 ) 返回指定字符表达式值去掉前导和尾部空格后形成的

字符串例如: STORE SPACE(1)+"VFP"+SPACE(3) TO X ? TRIM(X) +LTRIM(X)+ALLTRIM(X) VFPVFP VFP ? LEN(X) , LEN(TRIM(X)) , LEN(LTRIM(X)) , LEN(ALLTRIM(X))

7 4 6 3

Page 34: 第  3 章  数据、函数与表达式

字符函数 4.取子串函数

格式与功能: LEFT( 〈字符表达式〉,〈长度〉 ) 从指定表达式值的左端取一个指定长度的子串作为函数值 RIGHT( 〈字符表达式〉,〈长度〉 ) 从指定表达式值的右端取一个指定长度的子串作为函数值 SUBSTR( 〈字符表达式〉,〈起始位置〉[,〈长度〉] ) 从指定表达式的值起始位置取指定长度的子串作为函数值说明:在 SUBSTR() 函数中,若缺省第三个自变量〈长度〉,

则函数从指定位置一直取到最后一个字符。例如: STORE "GOOD BYE!" TO X ? LEFT(X,2),SUBSTR(X,6,2)+SUBSTR(X,6),RIGHT(X,3) GO BYBYE! YE!

Page 35: 第  3 章  数据、函数与表达式

字符函数 11. 字符串匹配函数

– 格式: LIKE( 〈字符表达式 1 〉,〈字符表达式 2 〉 )– 功能:比较两个字符串对应位置上的字符,若所有对应

字符都相匹配,则函数返回逻辑真 (.T.) ,否则返回逻辑假 (.F.) 。

– 说明:〈字符表达式 1 〉中可以包含通配符 * 和 ? 。 *可与任何数目字符相匹配, ? 可以与任何单个字符相匹配。

– 例如: STORE "abc" TO X STORE "abcd" TO y ?LIKE("ab*",x),LIKE("ab*",y),LIKE(x,y),LIKE("?

b?",x),LIKE("Abc",x) .T. .T. .F. .T. .F.

Page 36: 第  3 章  数据、函数与表达式

日期和时间函数 日期和时间函数的自变量一般是日期型数据或日期时间型

数据。 1. 系统日期和时间函数

– 格式与功能: DATE( ) 返回当前系统日期,函数值为日期型。 TIME( ) 以 24小时制、 hh:mm:ss 格式返回当前系统

时间,函数值为字符型。 DATETIME( ) 返回当前系统日期时间,函数值为日期

时间型。– 例如: ? DATE() , TIME() , DATETIME()

08 / 25 / 03 16 : 59 : 05 08 / 25 / 03 04 : 59 :05PM

Page 37: 第  3 章  数据、函数与表达式

日期和时间函数 2.求年份、月份和天数函数

格式与功能: YEAR( 〈日期表达式〉 | 〈日期时间表达式〉 ) 从指定的日期表达式或日期时间表达式中返回年份 MONTH( 〈日期表达式〉 | 〈日期时间表达式〉 ) 从指定的日期表达式或日期时间表达式中返回月份 DAY( 〈日期表达式〉 | 〈日期时间表达式〉 ) 从指定的日期或日期时间表达式中返回月里面的天数说明:这三个函数的返回值都为数值型。例如:

STORE {^2001-08-25} TO d? YEAR(d),MONTH(d),DAY(d) 2003 8 25

Page 38: 第  3 章  数据、函数与表达式

日期和时间函数 3. 时、分和秒函数

– 格式与功能: HOUR( 〈日期时间表达式〉 ) 从指定的日期时间表达式中返回小时部分 (24小时制 ) MINUTE( 〈日期时间表达式〉 ) 从指定的日期时间表达式中返回分种部分 SEC( 〈日期时间表达式〉 ) 从指定的日期时间表达式中返回秒数部分– 说明:这三个函数的返回值都为数值型。– 例如:

STORE {^2003-08-25 04:20:40 P} TO t ? HOUR(t) , MINUTE(t) , SEC(t) 16 20 40

Page 39: 第  3 章  数据、函数与表达式

数据类型转换函数• 数据类型转换函数的功能是将某一种类型的数据转换成另

一种类型的数据。 1. 数值转换成字符串

– 格式: STR( 〈数式〉[ , 〈长度〉[,〈小数位数〉]] )– 功能:将〈数值表达式〉的值转换成字符串,转换时根

据需要自动进行四舍五入。– 说明:(1) 返回字符串的理想长度 L应该是〈数式〉值的整数部

分位数加上〈小数位数〉值,再加上 1 位小数点(2) 如果〈长度〉值大于 L,则字符串加前导空格以满足规定的〈长度〉要求;

(3) 如果〈长度〉值大于等于〈数式〉值的整数部分位数( 包括负号 ) 但又小于 L,则优先满足整数部分而自动调整小数位数;

Page 40: 第  3 章  数据、函数与表达式

数据类型转换函数(4) 如果〈长度〉值小于〈数值表达式〉值的整数部分位数,

则返回一串星号 (*) 。(5) 〈小数位数〉的默认值为 0 ,〈长度〉的默认值为 10 。– 例如: STORE -834.456 TO X ? "X="+STR(X , 8 , 3) X=-834.456 ?

STR(X , 9 , 2) , STR(X , 6 , 2) , STR(X , 3) , STR(X , 6) , STR(X) -834.46 -834.5 *** -834 -834

Page 41: 第  3 章  数据、函数与表达式

数据类型转换函数 2. 字符串转换成数值

– 格式: VAL( 〈字符表达式〉 )– 功能:将由数字符号 ( 包括正负号、小数点 ) 组

成的字符型数据转换成相应的数值型数据。– 说明:

(1)若字符串内出现非数字字符,那么只转换前面部分;

(2)若字符串的首字符不是数字符号,则返回数值零,但忽略前导空格。

– 例如:

Page 42: 第  3 章  数据、函数与表达式

数据类型转换函数 STORE '-6789'TO x STORE '.23' TO y STORE 'A42'TO z ? VAL(x),VAL(x+y),VAL(x+z),VAL(z+y) -6789 -6789.23 -6789.00 0.00

Page 43: 第  3 章  数据、函数与表达式

数据类型转换函数 3. 字符串转换成日期或日期时间

– 格式与功能: CTOD( 〈字符式〉 ) 将〈字符式〉值转换成日期

型数据 CTOT( 〈字符表达式〉 ) 将〈字符式〉值转换成

日期时间型数据– 说明:字符串中的日期部分格式要与 SET DATE

TO 命令设置的格式一致。其中的年份可以用四位,也可以用两位。如果用两位,则世纪由 SET CENTURY TO 语句指定。

– 例如:

Page 44: 第  3 章  数据、函数与表达式

SET DATE TO YMDSET CENTURY ON SET CENTURY TO 19 ROLLOVER 51d1=CTOD('2003/07/25')? d1 , CTOD('50/01/01') , CTOD('51 / 01 /

01') 2003 / 07 / 25 2050 / 01 / 01 1951 / 01/ 01

这里, SET CENTURY TO语句指定:小于 51 的两位数年份属于 21世纪 (19+1) ,而大于等于 51 的两位数年份属于 20世纪 (19) 。

Page 45: 第  3 章  数据、函数与表达式

数据类型转换函数 4. 日期或日期时间转换成字符串

– 格式与功能 DTOC( 〈日期表达式〉 | 〈日期时间表达式〉[, 1 ] ) 将日期型数据或日期时间数据的日期部分转换成字符串 TTOC( 〈日期时间表达式〉[, 1 ] ) 将日期时间数据转换成字符串。– 说明: (1) 字符串中日期部分的格式与 SET DATE TO语句的设置和 SET CENTURY ON|OFF(ON 为四位年份, OFF为两位数年份 )语句的设置有关。

(2) 时间部分的格式与 SET HOURS TO 12|24语句的设置有关。

(3)DTOC() 函数,如果使用选项 1 ,则字符串的格式总是YYYYMMDD ,共 8 个字符。对 TTOC() 来说,如果使用选项 1 ,则字符串的格式总是为 YYYYMMDDHHMMSS ,采用 24小时制,共 14 个字符

Page 46: 第  3 章  数据、函数与表达式

数据类型转换函数– 例如:

STORE DATETIME() TO t? t08 / 25 / 03 10:54:49 PM? DTOC(t),DTOC(t,1),TTOC(t),TTOC(t,1)

08 / 25 / 03 20030825

08 / 25 / 03 19:54:49PM 20030825225449

Page 47: 第  3 章  数据、函数与表达式

数据类型转换函数 5.宏替换函数

– 格式: & 〈字符型变量〉[ .]– 功能:替换出字符型变量的内容,即 & 的值是变量中的字

符串。– 说明:如果该函数与其后的字符无明确分界,则要用“ .”

作函数结束标识。宏替换可以嵌套使用。– 例如:

STORE "ZGDA" TO XUSE & X && 相当于 USE ZGDAXM=" 姓名 "? &XM +"你好 !" && 相当于 ? 姓名 +"你好 !" 张黎黎你好 ! && 字段变量姓名的值是张黎黎SKIP && 转到下条记录? XM , & XM && 相当于 ? XM ,姓名 姓名 李艳

Page 48: 第  3 章  数据、函数与表达式

测试函数• 在数据处理过程中,有时用户需要了解操作对象的状态。

例如,要使用的文件是否存在、数据库的当前记录号、是否到达了文件尾、检索是否成功、某工作区中记录指针所指的当前记录是否有删除标记、数据类型等信息。尤其是在运行应用程序时,常常需要根据测试结果来决定下一步的处理方法或程序走向。

1. 空值 (NULL 值 )测试函数– 格式: ISNULL( 〈表达式〉 )– 功能:判断一个表达式的运算结果是否为 NULL 值,若

是 NULL 值返回逻辑真 (.T.) ,否则返回逻辑假 (.F.) 。– 例如:

STORE .NULL.TO X? X , ISNULL(X) .NULL. .T.

Page 49: 第  3 章  数据、函数与表达式

测试函数• 2.“ 空”值测试函数

– 格式: EMPTY( 〈表达式〉 )– 功 能 :根据 指 定 表 达 式 的 运 算 结 果 是否为

“空”值,返回逻辑真 (.T.) 或逻辑假 (.F.) 。– 说明: (1) 这里所指的“空”值与 NULL 值是两个不同

的概念。函数 EMPTY(.NULL.) 的返回值为逻辑假 (.F.) 。

(2)该函数自变量表达式的类型可以是数值型、字符型、逻辑型、日期型等类型。不同类型数据的“空”值,有不同的规定,如表 3.6 所示。

Page 50: 第  3 章  数据、函数与表达式

测试函数• 表 3.6 不同类型数据的“空”值规定

———————————————————— ———————————

数据类型 “空”值 数据类型 “空”值———————————————————— ———————

————数值型 0 双精度型 0货币型 0 日期时间 空 ( 如 CTOT("))浮点型 0 逻辑型 .F.整型 0 备注字段 空 (无内容 )日期型 空 ( 如 CTOD("))字符型 空串、空格、 制表符、回车、换行———————————————————— ———————

——————

Page 51: 第  3 章  数据、函数与表达式

测试函数 3. 数据类型测试函数

– 格式: VARTYPE( 〈表达式〉[,〈逻辑表达式〉] )

– 功能:测试〈表达式〉的类型,返回一个大写字母。

– 说明: 函数值为字符型。字母的含义如下表所

示。

Page 52: 第  3 章  数据、函数与表达式

测试函数用 VARTYPE()测得的数据类型——————————————————————————— ————————

————————————————返回的字母 数据类型 返回的字母 数据类型——————————————————————————— ————————

———————————————— C 字符型或备注型 G 通用型 Y 货币型 D 日期型 T 日期时间型 L 逻辑型 X Null 值 O 对象型 U 未定义 N 数值型、整型、浮点或双精度型• 若〈表达式〉是一个数组,则根据第一个数组元素的类型返回字符串。若〈表达式〉的运算结果是 NULL 值,则根据〈逻辑表达式〉值决定是否返回〈表达式〉的类型;如果〈逻辑表达式〉值为 .T. ,就返回〈表达式〉的原数据类型。如果〈逻辑表达式〉值为 .F. 或缺省,则返回 X 以表明〈表达式〉的运算结果是 NULL 值。

Page 53: 第  3 章  数据、函数与表达式

测试函数• 例如:

X="AAA" STORE 10 TO X STORE .NULL. TO Y STORE $100.2 TO Z ?

VARTYPE(X) , VARTYPE(Y , .T.) ,VATRYPE(Y) , VARTYPE(Z)

N C X Y

Page 54: 第  3 章  数据、函数与表达式

测试函数 4. 表文件尾测试函数

– 系统对表中的记录是逐条进行处理的。对于一个打开的表文件来说,在某一时刻只能处理一条记录。 VFP 为每一个打开的表设置了一个内部使用的记录指针,指向正在被操作的记录,该记录称为当前记录 。记录指针的作用是标识表的当前记录。

– 表文件的逻辑结构如图 3.1 所示。最上面的记录是首记录 , 记 为 TOP , 最 下面的 记 录 是尾记 录 , 记 为BOTTOM 。在第一个记录之前有一个文件起始标识,称为 Beginning of File(BOF)

– 在最后一个记录的后面有一个文件结束标识,称为End of File(EOF) 。使用测试函数能够得到指针的位置。刚刚打开表时,记录指针总是指向首记录。

Page 55: 第  3 章  数据、函数与表达式

  首记录 (TOP)

  第 2 个记录

  :

记录指针 第 i 个记录

  :

 尾记录(BOTTOM)

Page 56: 第  3 章  数据、函数与表达式

测试函数– 格式: EOF( [〈工作区号〉 | 〈表别名〉] )– 功能:测试指定表文件中的记录指针是否指向文件尾, 是返回逻 辑真 .T. ,否则返回逻 辑假 .F. 。

– 说明:表文件尾是指最后一条记录的后面位置。若缺省自变量,则测试当前表文件。若在指定工作区上没有打开表文件,函数返回逻辑假 .F. 。若表文件中不包含任何记录,函数返回逻辑真 .T. 。

– 例如:

Page 57: 第  3 章  数据、函数与表达式

USE ZGDAGO BOTTOM? EOF() .F.SKIP? EOF() , EOF(2) &&2 号工作区没有打开表 .T. .F.

Page 58: 第  3 章  数据、函数与表达式

测试函数5. 表文件首测试函数

– 格式: BOF( [〈工作区号〉 | 〈表别名〉] )

– 功能:测试当前表文件 ( 若缺省自变量 )或指定表文件中的记录指针是否指向文件首,若是返回逻辑真 .T. ,否则返回逻辑假 .F. 。

– 说明:表文件首是指第一条记录的前面位置。若指定工作区上没有打开表文件,函数返回逻辑假 .F. 。若表文件中不包含任何记录,函数返回逻辑真 .T. 。

Page 59: 第  3 章  数据、函数与表达式

测试函数 6. 记录号测试函数

– 格式: RECNO( [〈工作区号〉 | 〈表别名〉] )– 功能:返回当前表文件 ( 若缺省自变量 ) 或指定表文件中当前记录 ( 记录指针所指记录 ) 的记录号。

– 说明:如果指定工作区上没有打开表文件,函数值为 0 。如果记录指针指向文件尾,函数值为表文件中的记录数加 1 。如果记录指针指向文件首,函数值为表文件中第一条记录的记录号。

Page 60: 第  3 章  数据、函数与表达式

测试函数 7. 记录个数测试函数

– 格式: RECCOUNT( [〈工作区号〉 | 〈表别名〉] )

– 功能:返回当前表文件 ( 若缺省自变量 ) 或指定表文件中的记录个数。如果指定工作区上没有打开表文件,函数值为 0 。

– 说明:该函数返回的是表文件中物理上存在的记录个数。不管记录是否被逻辑删除以及 SET DELETED 的状态如何,也不管记录是否被过滤 (SET FILTER) ,该函数都会把他们考虑在内。

Page 61: 第  3 章  数据、函数与表达式

测试函数• 例如:

USE ZGDA && 假定表中有 8 条记录? BOF() , RECNO() && 显示 .F. 1SKIP -1? BOF() , RECNO() && 显示 .T. 1GO BOTTOM? EOF() , RECNO() && 显示 .F. 8SKIP? EOF() , RECNO() , RECCOUNT() && 显示 .T. 9 8

Page 62: 第  3 章  数据、函数与表达式

测试函数 8. 条件测试函数

– 格式: IIF( 〈逻辑表达式〉,〈表达式 1) ,〈表达式 2 〉 )

– 功能:测试〈逻辑表达式〉的值,若为逻辑真 .T. ,函数返回〈表达式 1 〉的值,若为逻辑假 .F. ,函数返回〈表达式 2) 的值。

– 说明:〈表达式 1) 和〈表达式 2 〉的类型不要求相同。

– 例如:

Page 63: 第  3 章  数据、函数与表达式

X=100Y=300? IIF(X>100 , X-50 , X+50) , IIF(Y>100 , Y-

50 , Y+50) 150 250SET CENTURY ONSTORE DATE() TO DSTORE DTOC(D) TO X? X , IIF(LEN(X)=8 , "这是两位数年份 ", " 年份

是: "+STR(YEAR(D) , 4)) 08 / 25 / 2003 年份是: 2003

Page 64: 第  3 章  数据、函数与表达式

测试函数 9. 记录删除测试函数

– 格 式 : DELETED( [ 〈 表 的 别 名 〉 |〈工作区号] )

– 功能:测试指定的表,或在指定工作区中所打开的表,记录指针所指的当前记录是否有删除标记“ *” 。若有为真,否则为假。若缺省自变量,则测试当前工作区中所打开的表。

– 例如:

Page 65: 第  3 章  数据、函数与表达式

SELECT 0 &&选择最小号空闲工作区USE ZGDA && 打开职工表DELETE FOR 性别 =" 女 " AND 职称 ="助教

“ && 逻辑删除记录 2 删除记录LIST 姓名,性别 FOR DELETED( ) && 列出被逻辑删除的记录 记录号 # 姓名 性别 1 * 张黎黎 女 2 * 李艳 女

Page 66: 第  3 章  数据、函数与表达式

VFP6.0提供非常丰富的函数,在此仅举出一些常用函数的例子,希望读者在今后的深入学习中逐渐体会各种函数的功能。

Page 67: 第  3 章  数据、函数与表达式

习题 ( P.60)

一、单项选择题二、思考题(不必交)三、上机操作题