第 3 章 Visual FoxPro 的数据元素
知识结构图 在数据库系统(DBS)中,数据是操作和管理的基本对象,用户通过数据库管理系统 (DBMS)提供的功能对数据库中各种类型的数据进行组织和管理,不同类型的数据,其组织 方式与运算方式不同。本章介绍 Visual FoxPro 6.0 中常用的数据类型及其运算方法,主要目的 是为后续各章的学习打下良好的基础。 根据计算机系统处理数据的形式来划分,Visual FoxPro 中的数据可分为常量、变量、表 达式和函数 4 种形式。 常量和变量是数据运算和处理的基本对象, 使用函数可以实现特定的功 能, 表达式体现了对数据进行综合运算和处理的能力。 本章将对各种形式的数据进行详细介绍。3.1 常量
Visual FoxPro 中的每个数据都属于一定的数据类型。数据类型与数据形式不同,数据类 型决定了数据在计算机中的存储方式和运算方式。常量、变量、表达式和函数这 4 种形式的数 测试函数 日期时间型:{<日期>,<时间>} 数值表达式:()、**或^、*、/、%、+、 数值函数 日期时间函数 常量 变量 表达式 函数 数值型:常数(数字、小数点、正负号) 货币型:定界符($),四舍五入 字符型:定界符(""、''、[ ]) 日期型:{^yyyymmdd} 逻辑型:真.T.、假.F. 字段变量 内存变量 简单内存变量 数组:定义(DIMENSION、DECLEAR) 字符表达式:+、 日期时间表达式:+、 逻辑表达式:NOT、AND、OR 关系表达式:<、<=、>、>=、< >、#或!=、=、= =、$ 字符处理函数 数据类型转换函数 赋值:=、STORE TO 显示输出:?、??据都包括以下 6 种数据类型:数值型、货币型、字符型、日期型、日期时间型和逻辑型。 常量通常用于表示一个具体的、不变的值。常量在命令和程序中可以直接引用,其特征 是在操作过程中它的值和表现形式保持不变。常量包括数值型、货币型、字符型、日期型、日 期时间型和逻辑型 6 种,不同类型的常量输入格式和运算规则不同。 3.1.1 数值型常量 数值型常量又称常数,是由数字 0~9、小数点和正负号组成的,可以表示整数或实数的 值。数值型数据用大写字母 N(Numeric)表示。 数值型常量的表示形式有两种:基本表示法和科学记数法。 基本表示法,如 100、250、0、20.09、1234.567 等分别是数值型常量中的整数和实数。 科学记数法, 用来表示很大的或很小的数值型常量, 如 1.2345E8 表示 1.2345×10 8 、 9.87E8 表示 9.87×10 8 。 例 3.1 在命令窗口中输入以下两条命令: ?100 ??1234.567 分别按 Enter 键执行,输出结果如下: 1001234.567 屏幕显示如图 31 所示。 在例 3.1 使用的命令中,单问号“?”指的是表达式 的显示命令,表示在屏幕的当前光标处输出一个回车符, 使光标跳到下一行,接着在光标处显示“?”后表达式的值,即先换行后输出内容;双问号“??” 的功能与单问号“?”相似,区别是不输出回车符,直接在当前光标处显示“??”后面表达式 的值,即不换行直接输出内容。 3.1.2 货币型常量 货币型常量用来表示货币的值。货币型数据用大写字母 Y(Currency)表示。 货币型常量以“$”符号开头,并由数字和小数点组成。其输入格式与数值型常量类似,即在 数值型常量前面加上一个$符号作为定界符,用以和数值型常量区分,如$12.3456、$100.01 等。 货币型常量在存储和计算时采用 4 位小数, 如果小数位数多于 4 位, 系统会自动将多余的 小数位进行四舍五入; 如果小数位数少于 4 位, 系统将自动补零至 4 位, 如货币型常量$12.34567 将存储为$12.3457。 货币型常量的输出格式与输入格式不同,输出时不显示$,并且四舍五入保留四位小数。 例 3.2 在命令窗口中输入以下 3 条命令: ?$12 ?$12.34567 ?$100.01 分别按 Enter 键执行,输出结果如下: 12.0000 12.3457 100.0100 屏幕显示如图 32 所示。 图 31 例 3.1 的执行过程及结果 图 32 例 3.2 的执行过程及结果
3.1.3 字符型常量 字符型常量是指由定界符括起来的一组字符串,字符串中的字符可以是数字、字母、汉 字或其他符号。单引号(' ')、双引号("")和方括号([ ])都可以作为字符型常量的定界符, 如"100"、'Visual FoxPro 6.0 程序设计'、[计算机等级考试]都是字符型常量。字符型数据用大 写字母 C(Character)表示。 很多常量都有定界符,定界符不作为常量本身的内容,只规定常量的类型和常量的起止 界限。给字符型常量加定界符是为了将其与其他类型的常量、变量和标识符相区别。如 1 为数 值型常量,而"1"为字符型常量;又如"a"为字符型常量,而 a 为变量。 在使用字符型常量定界符时需要注意以下几个问题: (1)定界符必须是在英文半角状态下输入的,并且要成对出现。 (2)如果字符串中的内容包含某种定界符,则必须使用其他定界符为此字符串定界。 (3)空串("")与包含空格的字符串(" ")不同,空串指不包含任何内容的字符串, 此字符串的长度为 0,空格也是字符型常量,包含一个空格的字符串的长度是 1。 (4)字符型常量区分字母大小写,即"a"与"A"是两个不同的字符型常量。 (5)字符型常量在输出时不显示定界符,即除了定界符之外的其他字符按原样输出。 例 3.3 在命令窗口中输入以下两条命令 ( “□”代表空格) : ?"-100",'Visual□FoxPro6.0 程序设计' ?['计算机等级考试',"a"],"",'A' 分别按 Enter 键执行,输出结果如下: 100 Visual□FoxPro6.0 程序设计 '计算机等级考试',"a" A 屏幕显示如图 33 所示。 注意:这里的"100"是字符型常量而不是数 值型常量,要学会区分数值型数字和字符型数 字,加了字符串定界符的数字是字符型数字,不加任何定界符的数字是数值型数字,它们的运 算规则不同。另外需要注意的问题是,要学会区分字符型常量和变量。变量将在 3.2 节做详细 介绍。 思考:在命令窗口中输入以下命令,按 Enter 键执行后,在屏幕上的输出结果是什么? ?"计算机二级 Visual FoxPro 6.0",["中国 China"],'123456' 3.1.4 日期型常量 日期型常量是用来表示日期值的数据, 花括号{}为日期型常量的定界符。 日期型常量包括 年、 月、 日 3 个部分, 各部分内容之间用日期分隔符进行分隔。 日期型数据用大写字母 D (Date) 表示。和其他类型的常量一样,日期型常量也有两种格式,即输入格式(又称为严格的日期格 式)和输出格式(又称为传统的日期格式)。 1.输入格式 日期型常量的输入格式为{^yyyymmdd}。 说明:①花括号{ }为日期型常量的定界符,不可省略;②脱字符“^”为日期型常量中的 图 33 例 3.3 的执行过程及结果
第一个字符,不可省略;③y 代表年份,占 4 位,m 代表月份,占 1 位或 2 位,d 代表具体的 日子,也占 1 位或 2 位,年、月、日的次序不可颠倒,不能缺省;④“”为年、月、日之间 的分隔符,连字号()、斜杠(/)、空格或句点(.)等也可以作为年、月、日之间的分隔符。 例如,2009 年 8 月 20 日可以表示为{^20090820}。这种格式又称为严格的日期格式。 2.输出格式 日期型常量的输出格式为 mm/dd/yy。 说明: ①斜杠 (/) 为输出日期型数据时系统默认的显示分隔符。 例如, 日期常量{^20090820} 的输出结果为 08/20/09;②日期型数据在输出时不显示定界符({ }) ;③输出格式默认为 mm/dd/yy,此格式可通过命令进行更改。 例 3.4 在命令窗口中输入以下两条命令: ?{^2009820} ?{^20080808} 分别按 Enter 键执行,输出结果如下: 08/20/09 08/08/08 屏幕显示如图 34 所示。 3.影响日期输出格式的命令 在 Visual FoxPro 中经常要用到一些命令,这些命令可以输入到命令窗口中并执行,也可 以编写到程序文件中。在命令窗口中执行的,即在某条命令的结尾按 Enter 键代表执行本条命 令。命令关键字不区分大小写,书写或输入时可以只取前面 4 个字符,后面的字符可以省略。 本书中介绍的所有命令格式均采用以下规定:方括号([])中的参数表示可选,用竖杠(|)分 隔的参数表示只能任选其一,尖括号(<>)中的参数由用户提供。 日期型常量的输出格式可以通过命令进行更改,以下是使用日期型数据时常用的设置 命令: (1)设置日期显示的分隔符。 格式:SET MARK TO [<日期分隔符>] 功能:用于设置显示日期型数据时所使用的分隔符,如“” 、 “.”等。在使用该命令时, 分隔符两边要加字符串定界符(''、" "或[]) 。如果命令后面不指定任何分隔符,则表示恢 复系统默认的斜杠(/)分隔符。 例 3.5 在命令窗口中输入以下命令: ? {^2009820} SET MARK TO "" ? {^2009820} SET MARK TO ? {^2009820} 分别按 Enter 键执行,输出结果如下: 08/20/09 082009 08/20/09 屏幕显示如图 35 所示。 (2)设置日期的显示格式。 格式:SET DATE TO <YDM|YMD|DMY|AMERICAN|BRITISH|…> 图 35 例 3.5 的执行过程及结果 图 34 例 3.4 的执行过程及结果
功能:用于设置输出日期型数据时年、月、日的显示次序。 “< >”中使用的短语如表 31 所示。
表 31 常用的日期格式
短语 格式 短语 格式
AMERICAN mm/dd/yy ANSI yy.mm.dd USA mm/dd/yy JAPAN yy/mm/dd ITALIAN ddmmyy YMD yy/mm/dd BRITISH/FRENCH ddmmyy MDY mm/dd/yy GERMAN dd/mm/yy DMY dd.mm.yy
例 3.6 在命令窗口中输入以下命令( “□”代表空格) : ?{^20090828} SET DATE TO YMD SET MARK TO "□" ?{^20090828} 分别按 Enter 键执行,输出结果如下: 08/28/09 09□08□28 屏幕显示如图 36 所示。 (3)设置日期中年份的显示位数。 格式:SET CENTURY ON | OFF 功能:用于设置输出日期时年份是以两位还是 4 位显示。SET CENTURY ON 表示以 4 位 显示年份,SET CENTURY OFF 表示以两位显示年份,为系统默认状态。 例 3.7 在命令窗口中输入以下命令: ?{^20090828} SET DATE TO DMY SET MARK TO "." SET CENTURY ON ?{^20090828} 分别按 Enter 键执行,输出结果如下: 08/28/09 28.08.2009 屏幕显示如图 37 所示。 4.在“选项”对话框中设置日期的输出格式 选择“工具”→“选项”→“区域”命令,弹出“选项”对话框,在“区域”选项卡中 可以更改日期的输出格式,如图 38 所示。但是无论使用命令方式还是使用对话框方式对日期 的输出格式进行设置,其有效范围都是在未关闭 Visual FoxPro 6.0 窗口之前。如果重新启动 Visual FoxPro 6.0,日期的输出格式将恢复到系统默认的方式。 对于日期型常量,在输入时通常使用的是默认情况下的严格的日期格式。如果要使用传 统的日期格式,必须先执行 SET STRICTDATE TO 0 命令,否则会出现错误提示信息。如果要 重新将输入格式设置为严格的日期格式,可以执行 SET STRICTDATE TO 1 命令。建议在输入 图 36 例 3.6 的执行过程及结果 图 37 例 3.7 的执行过程及结果
时采用默认的严格的日期格式,以防止出现错误。 图 38 “选项”对话框的“区域”选项卡 3.1.5 日期时间型常量 日期时间型常量是用来表示具体的日期时间值的数据。日期时间型数据用大写字母 T (DateTime)表示。 1.输入格式 日期时间型常量的输入格式为{<日期>,<时间>}。 说明:①日期时间型常量由日期和时间两部分构成,两部分之间用逗号相隔,且逗号不 可以省略;②在日期时间型常量中,日期部分的输入格式和日期型常量的输入格式相同;时间 部分的输入格式为[hh[:mm[:ss]][a|p]],其中 h 代表小时数,m 代表分钟数,s 代表秒数,三部 分之间用冒号(:)相隔,顺序不可颠倒,从后往前省略;a 代表上午时间,p 代表下午时间, 可以省略。 2.输出格式 日期时间型常量的输出格式为 mm/dd/yy hh:mm:ss AM|PM。 说明:①日期部分按照日期型数据的格式进行输出,且受影响日期输出格式的命令控制; ②日期部分和时间部分之间的逗号输出时变为空格;③时间部分的各个参数在输入时如果省 略,则输出时 hh、mm、ss、AM|PM 各参数对应的默认值分别为 12、00、00、AM;④如果指 定的时间大于等于 12,则默认为下午时间。 例 3.8 在命令窗口中输入以下命令: ?{^20090827,10:15 a} ?{^20090827,10:15 p} ?{^20090827,20:15} ?{^20090827,} ?{^20090827} 分别按 Enter 键执行,输出结果如下: 08/27/09 10:15:00 AM 08/27/09 10:15:00 PM
08/27/09 08:15:00 PM 08/27/09 12:00:00 AM 08/27/09 屏幕显示如图 39 所示。 注意: 常量{^20090827,}和{^20090827}的数据类型 不同。{^20090827,}是日期时间型常量,书写时省略了时 间部分,在默认状态下,输出时显示为 08/27/09 12:00:00 AM;而{^20090827}是日期型常量,在默认状态下,输 出时显示为 08/27/09。 3.1.6 逻辑型常量 逻辑型常量是用来表示逻辑判断结果“真”与“假”的逻辑值。逻辑型常量只有两个值, 即“真”和“假” 。逻辑型数据用大写字母 L(Logical)表示。 逻辑型常量的格式也有输入格式和输出格式两种。 1.输入格式 在输入格式中,用.T.、.t.、.Y.或.y.表示逻辑“真”值,用.F.、.f.、.N.或.n.表示逻辑“假”值。 表示逻辑型常量值的字母左右两侧各有一个小圆点, 它们代表逻辑型常量的定界符, 这样 可以将逻辑型常量与其他类型的常量、变量、标识符等区分开,以免混淆。逻辑型常量的定界 符不能省略。 2.输出格式 在输出格式中,逻辑“真”值的输出表示为.T.,逻辑 “假”值的输出表示为.F.。 例 3.9 在命令窗口中输入以下命令: ?.T.,.N. ?.y.,.f. 分别按 Enter 键执行,输出结果如下: .T. .F..T. .F. 屏幕显示如图 310 所示。 常量是 Visual FoxPro 中最基本的数据形式。在使用 常量时,需要注意各类型常量的两种格式:输入格式和输出格式,在输入格式中不要忘记书写 相应的定界符。
3.2 变量
变量是指在命令操作和程序运行过程中可以改变其值和类型的数据项。变量实质上就是 计算机内存中的一个存储区域, 给这个存储区域取个名字以标识该存储单元的位置, 称为变量 名;存放在这个存储区域里的数据称为变量值,变量值的类型即为该变量的类型。变量由变量 名和变量值组成。 在 Visual FoxPro 中,把变量分为两大类:字段变量和内存变量。字段变量指的是表结构 中的字段;内存变量又分为简单内存变量和数组。内存变量的类型也包括数值型、货币型、字 符型、日期型、日期时间型和逻辑型 6 种。 图 310 例 3.9 的执行过程及结果 图 39 例 3.8 的执行过程及结果3.2.1 字段变量
Visual FoxPro 6.0 是一种关系型数据库管理系统,一个关系就是一张二维表。在 Visual FoxPro 6.0 中,称二维表中的行为记录,列为字段,也称字段变量,其中字段由字段名和字 段值组成。在图 311 中,把学号、姓名、性别 等称为字段名,把每个字段所对应的记录值称 为 该 字 段 的 值 。 例 如 , 学 号 字 段 的 值 有 s0201303、 s0201104 等, 性别字段的值有 “男” 、 “女”等。 用户在对表中的记录进行操作时, 表的记录 指针会发生变化。当打开一个表文件时,表中记 录指针自动指向表的第一条记录, 此时每个字段 变量的取值即为第一条记录对应的值。例如,当 前学号字段变量的值为 s0201303,当表的记录指针指向第二条记录时,学号变量的取值变为 s0201104,可见字段变量的取值是随着表中记录指针的变化而不断变化的。 字段变量的类型包括字符型、货币型、数值型、浮动型、日期型、日期时间型、双精度 型、整型、逻辑型、备注型、通用型、字符型(二进制)和备注型(二进制)13 种类型。字 段变量类型的定义需要在表结构定义时指定。 3.2.2 内存变量 1.内存变量的赋值 在使用变量值时,通常是通过引用该变量的变量名来使用的。当把一个数据存储到某区 域时,这个数据会覆盖该区域中原来的数据,作为该变量的新的取值,把这个存储过程称为变 量的赋值。变量的值和变量的类型都可以通过重新赋值来进行更改。 内存变量的赋值命令有以下两种格式: 格式 1:<内存变量名>=<表达式> 功能:将<表达式>的值计算出来并赋值给指定的内存变量。格式 1 一次只能给一个内存 变量赋值。 内存变量名一般由用户自己定义,表示一定的意义,如 num 可以表示此内存变量存储的 是某个数值或某种事物的数量。内存变量的命名一般遵循以下规则: (1)以字母或下划线开头。 (2)由字母、数字、下划线组成。 (3)可使用 1~128 个字符。 (4)不可以与系统中的保留字同名。 (5)变量名不区分大小写。 格式 2:STORE <表达式> TO <内存变量名表> 功能:将<表达式>的值计算出来并赋值给指定内存变量名表中的各个内存变量,内存变量 名表中的变量名与变量名之间用逗号相隔。格式 2 一次可以将同一个值赋值给多个内存变量。 格式 1 与格式 2 的功能基本相同,两者的区别是格式 1 一次只能给一个内存变量赋值, 格式 2 一次可以为多个内存变量赋同一个值。 图 311 学生表中的记录和字段
当退出 Visual FoxPro 系统后,内存变量的值会自动从内存中清除。 2.简单内存变量 简单内存变量在赋值前不需要事先定义,赋值的同时即表示定义了此变量。 例 3.10 将数值型常量 100 赋值给简单内存变量 A,并在屏幕上输出结果。 在命令窗口中依次输入以下命令并执行: A=100 ?A 命令的执行过程及结果如图 312 所示。 赋值之后简单内存变量 A 的值为 100,值的类型为数值型,即简单内存变量 A 是数值型 变量。 例 3.11 将字符型常量“Hello”赋值给简单内存变量 B,并在屏幕上输出结果。 在命令窗口中输入以下命令并执行: B="Hello" ?B 命令的执行过程及结果如图 313 所示。 图 312 例 3.10 的执行过程及结果 图 313 例 3.11 的执行过程及结果 赋值之后简单内存变量 B 的值为“Hello” ,即简单内存变量 B 是字符型变量。 例 3.12 将日期 2009 年 6 月 1 日赋值给简单内存变量 C,并在屏幕上输出结果。 在命令窗口中输入以下命令并执行: C={^200961} ?C 命令的执行过程及结果如图 314 所示。 赋值之后简单内存变量 C 的值为{^200961},即简 单内存变量 C 是日期型变量。 例 3.13 将数值型常量 100 同时赋值给简单内存变 量 x、y、z,并在屏幕上输出简单内存变量 x、y、z 的值。 在命令窗口中输入以下命令并执行: STORE 100 TO x,y,z ?x ?y,z 命令的执行过程及结果如图 315 所示。 赋值之后简单内存变量 x、y、z 都是数值型的变量。注意内存变量名不区分大小写。 例 3.14 将逻辑型数据.t.同时赋值给简单内存变量 E 和 F, 并在屏幕上输出简单内存变量 E 和 F 的值。 图 314 例 3.12 的执行过程及结果
在命令窗口中输入以下命令并执行: STORE .t. TO e,f ?e,f 命令的执行过程及结果如图 316 所示。 图 315 例 3.13 的执行过程及结果 图 316 例 3.14 的执行过程及结果 赋值之后简单内存变量 E 和 F 都是逻辑型的变量。 例 3.15 将数值型常量 2 分别赋值给内存变量 X1 和 X2, 并在主屏幕上输出内存变量 X1 和 X2 的值。 方法 1: X1=2 X2=2 ?X1,X2 方法 2: STORE 2 TO X1,X2 ?X1,X2 3.数组的定义及使用 数组是计算机内存中连续的一片存储区域。数组可以看做是一组简单内存变量的有序集 合,每个简单内存变量称为一个数组元素。每个数组元素相当于一个简单内存变量,可以给数 组中的各个元素分别赋相同或不同的值。 (1)数组的定义。数组与简单内存变量的区别是简单内存变量在使用前不必事先定义, 赋值即表示定义了简单内存变量;数组在使用前必须先经过 DIMENSION 或 DECLARE 命令 定义之后,才能使用。 定义数组的命令格式有如下两种: 格式 1:DIMENSION <数组名 1>(<数组下标 1>[,<数组下标 2>])[,…] 格式 2:DECLARE <数组名 1>(<数组下标 1>[,<数组下标 2>])[,…] 两种命令格式的功能完全相同,指的是定义一维数组或二维数组。只有一个下标的数组 称为一维数组;有两个下标的数组称为二维数组,两个下标之间用逗号相隔。 数组定义之后,系统自动在计算机内存中为其开辟一块连续的存储区域,以准备存储数 据。存储区域的大小即为数组的长度,数组的长度取决于所定义的数组下标。 例 3.16 使用命令定义一个长度为 4 的一维数组 a。 命令如下: DIMENSION a(4) 该语句的功能是定义一个一维数组,数组名为 a,数组 a 中共包含 4 个数组元素,分 别为 a(1)、a(2)、a(3)、a(4),由于在 Visual FoxPro 中数组下标是从 1 开始的,因此称数组
的下标下限为 1。 例 3.17 使用命令定义一个 2 行 3 列的二维数组 b。 命令如下: DECLARE b(2,3) 该语句的功能是定义一个 2 行 3 列的二维数组 b,数组 b 中共有 2×3=6 个数组元素,分 别为 b(1,1)、b(1,2)、b(1,3)、b(2,1)、b(2,2)、b(2,3)。 例 3.18 使用命令定义一个长度为 5 的一维数组 x 和一个 3 行 2 列的二维数组 y。 命令如下: DIMENSION x(5),y(3,2) 该语句的功能是定义一个一维数组 x 和一个二维数组 y。数组 x 中共有 5 个数组元素,分 别为 x(1)、x(2)、x(3)、x(4)、x(5);数组 y 中共有 6 个数组元素,分别为 y(1,1)、y(1,2)、y(2,1)、 y(2,2)、y(3,1)、y(3,2)。 整个数组的数据类型为 A(Array),而数组中的各个数组元素可以分别存放不同类型的数 据。数组的赋值方法与简单内存变量的赋值方法基本相似。 在使用数组时,必须注意以下几个问题: 1)数组创建后,系统自动给数组中的每个数组元素赋以逻辑值假.F.。 例 3.19 在命令窗口中输入以下命令: DIMENSION x(5) ?x(1),x(2),x(3),x(4),x(5) 分别按 Enter 键执行,输出结果如下: .F. .F. .F. .F. .F. 屏幕显示如图 317 所示。 2)一个数组中各数组元素的数据类型可以不同。 数组创建以后, 可以用内存变量的赋值命令给数组中的各个数组元素重新赋值。 各数组元 素赋的值的类型可以不同。 例 3.20 在命令窗口中输入以下命令: DIMENSION x(5) x(3)=$50 STORE "Hello" TO x(2),x(5) ?x(1),x(2),x(3),x(4),x(5) 分别按 Enter 键执行,输出结果如下: .F. Hello 50.0000 .F. Hello 屏幕显示如图 318 所示。 图 317 例 3.19 的执行过程及结果 图 318 例 3.20 的执行过程及结果
3)给数组名赋值则表示给数组中的每个元素赋值。 例 3.21 在命令窗口中输入以下命令: DIMENSION y(3,2) y=2009 ?y(1,1),y(1,2),y(2,1),y(2,2),y(3,1),y(3,2) 分别按 Enter 键执行,输出结果如下: 2009 2009 2009 2009 2009 2009 屏幕显示如图 319 所示。 4) 可用一维数组形式访问二维数组。 例如, 数组 y(3,2)中的各个数组元素分别对应于 y(1)、 y(2)、y(3)、y(4)、y(5)、y(6)。 例 3.22 在命令窗口中输入以下命令: DIMENSION y(3,2) y(2,1)="Visual FoxPro 6.0" y(3,2)={^20090601} ?y(1),y(2),y(3),y(4),y(5),y(6) 分别按 Enter 键执行,输出结果如下: .F. .F. Visual FoxPro 6.0 .F. .F. 06/01/09 屏幕显示如图 320 所示。 图 319 例 3.21 的执行过程及结果 图 320 例 3.22 的执行过程及结果 (2)数组与数据库表之间的数据交换。表文件中的数据是以记录的方式进行存储和使用 的, 而数组中的数据也是以批量的形式进行存储的, 这种存储上的特点可以方便数组与数据库 表之间进行数据交换,且数据传递速度快,能够使编写出来的程序更加简洁。Visual FoxPro 提供了数组与数据库表之间数据交换的命令。 1)将数组中的数据传递到表的当前记录中。 格式:GATHER FROM <数组名>[FIELDS<字段名表>][MEMO] 功能:将数组中各数组元素的值依次存放到当前已经打开的数据库表的当前记录中。 如果使用 FIELDS 短语,则将数组中各个元素的值按顺序依次存放到指定的字段名表中; 否则,将数组中第一个元素的值存放到表中当前记录的第一个字段变量中,第二个元素的 值存放到表中当前记录的第二个字段变量中,依此类推。若数组中数组元素的个数少于表 中字段的个数,则多余字段中的内容保持不变;若数组中数组元素的个数多于表中字段的 个数,则多余数组元素的内容保持不变。若使用 MEMO 短语,则表示传递时包括备注型字 段,否则不包括。 例 3.23 打开学生表,表结构和表中记录如图 321 所示,向表中追加一条空记录,将数 组 ST 中的内容传递到学生表中。
图 321 学生表初始记录
DIMENSION STUD(5) &&创建包含 5 个元素的一维数组 STUD STORE "s0201115" TO STUD(1) &&给数组元素赋值,注意数据类型 STORE "米兰" TO STUD(2)
STORE "女" TO STUD(3)
STORE {^1988520} TO STUD(4) STORE 600 TO STUD(5)
USE Student &&打开 Student 表
APPEND BLANK &&在表的结尾追加一条空记录 GATHER FROM STUD ?学号,姓名,性别,出生日期,入校总分 &&显示字段变量的值 执行后,在主屏幕上显示结果为: s0201115 米兰 女 05/20/88 600 注意:当内存变量名和字段变量名相同时,使用该变量名时被系统默认为字段变量,若 要引用的是内存变量,则需要在内存变量名前面加上“M..”或“M>” ,以和同名字段变量相 区分。例如,在命令窗口中输入以下两条命令并执行: store "杰克" to 姓名 ? 姓名,M.姓名 屏幕上的显示结果为: 刘雨 杰克 2)将表的当前记录传递到数组中。 格式:SCATTER [FIELDS<字段名表>][MEMO] TO <数组名> [BLANK] 功能:将当前打开的表的当前记录内容依次存放到数组中从第一个数组元素开始的内存 变量中。如果使用 FIELDS 短语,则将字段名表中指定的字段内容依次存放到数组中的各个数 组元素中;否则,将从第一个字段开始的字段内容依次存放到数组中的各个数组元素中。如果 指定的数组不存在,则系统自动创建该数组;若数组中数组元素的个数少于表中字段的个数, 则系统自动创建其余数组元素; 若数组中数组元素的个数多于表中字段的个数, 则多余的数组 元素的内容保持不变。若使用 BLANK 短语,则产生一个空数组,数组中各数组元素的类型与 表中当前记录对应的字段类型相同。若使用 MEMO 短语,则表示传递时包括备注型字段,否 则不包括。 例 3.24 打开学生表,表结构和表中记录如图 321 所示,将表中第一条记录的内容传递 到数组 ST1 中。
USE 学生 &&打开 Student 表 SCATTER TO STUD1
执行后,在主屏幕上显示结果为: S0201303 刘雨 女 02/08/96 565 4.内存变量的其他命令 (1)内存变量的赋值命令。 格式 1:<内存变量名>=<表达式> 格式 2:STORE <表达式> TO <内存变量名表> 功能:计算表达式并将表达式的值赋给一个或多个内存变量。格式 1 一次只能给一个变 量赋值;格式 2 一次可以给多个变量赋相同的值,各变量之间用逗号相隔。内存变量的赋值命 令在前面已经详细介绍过,在此作为复习内容不再赘述。 (2)表达式值的显示命令。 格式 1:?[<表达式表>] 格式 2:??<表达式表> 功能:计算表达式表中的各个表达式,并在屏幕上输出各表达式的值。表达式表中的各 表达式之间用逗号相隔。格式 1 是先输出回车符,然后再输出表达式的值,即换行输出。格式 2 是直接在屏幕上的当前光标处输出表达式的值,即同行输出。 例 3.25 在命令窗口中输入以下命令: STORE "1+2+3" TO a b=["1"+"2"+"3"] ?a ??"不等于"+b 分别按 Enter 键执行,输出结果如下: 1+2+3 不等于"1"+"2"+"3" 屏幕显示如图 322 所示。 (3)内存变量的显示命令。 格式 1:LIST MEMORY [LIKE<通配符>] 格式 2:DISPLAY MEMORY [LIKE<通配符>] 功能:显示内存变量的当前信息,包括变量名、作用域、类型和取值。若使用 LIKE 短语, 则表示在主屏幕上显示与通配符相匹配的内存变量。通配符包括“*”和“?” , “*”表示 0 个 或多个任意字符, “?”表示任意一个字符。 格式 1 与格式 2 的区别是格式 1 是一次显示与通配符相匹配的所有内存变量,如果内存 变量一屏显示不下,则自动滚屏,直到显示到最后一屏停止;格式 2 是分屏显示与通配符相匹 配的所有内存变量,一屏显示不下则暂停显示,等待用户按任意键之后继续显示下一屏,直到 显示到最后一屏。 例 3.26 在命令窗口中输入以下命令: DIMENSION x(5),y(3,2) STORE "你好" TO x(2),x(5) y(2,1)="Visual FoxPro 6.0" y(3,2)={^20070601} DISPLAY MEMORY 分别按 Enter 键执行,在主屏幕上显示第一屏的结果,按任意键之后跳到下一屏继续显示 结果。屏幕显示如图 323 和图 324 所示。
图 322 例 3.25 的执行过程及结果 图 323 例 3.26 中显示内存变量 x 和 y 的信息 图 324 例 3.26 的执行结果中第一屏的显示信息 (4)内存变量的清除命令。 格式 1:CLEAR MEMORY 格式 2:RELEASE ALL [EXTENDED] 格式 3:RELEASE <内存变量名表> 格式 4:RELEASE ALL [LIKE <通配符>|EXCEPT <通配符>] 功能:格式 1 和格式 2 表示清除所有的内存变量,区别是格式 3 若出现在程序中,必须 加上 EXTENDED 短语,否则不能清除公共内存变量。格式 3 和格式 4 表示清除指定的内存变 量。格式 4 若选用 LIKE 短语,表示清除与通配符相匹配的内存变量;若选用 EXCEPT 短语, 则表示清除与通配符不匹配的内存变量。通配符可选用“*”或“?” ,在内存变量的显示中已 做详细介绍,这里不再赘述。 3.2.3 Visual FoxPro 命令格式与规则 1.命令格式 格式:命令动词 [命令参数] 说明:命令动词表示“做什么?” ,而命令参数表示“如何做?” 。命令动词和命令参数
中出现的关键字、函数、系统变量、属性、事件、方法程序、预处理器指令及运算符等都作为 Visual FoxPro 的保留字。在编程时,要避免使用保留字作为名称(如窗口、表和字段名),否 则将会产生语法错误。 命令中的“[ ]” 、 “|” 、 “< >” 、 “…”符号都不是命令本身的语法成分,使用时不能按照原 样输入。命令格式中的符号约定如下: (1) “[ ]”表示可选项,可以根据具体情况决定是否选用。 (2) “|”表示两边的内容只能选用其中的一个。 (3) “< >”表示其中的内容要以实际名称或参数代入。 (4) “…”表示可以有任意个类似的参数,各参数之间用逗号隔开。 2.命令规则 Visual FoxPro 中的命令在书写时需要参照以下规则: (1)每条命令以命令动词开头,必须严格符合 Visual FoxPro 规定的命令语法格式。 (2)命令中的子句可以有多个,各子句之间由若干个空格隔开并允许按任意次序排列。 (3)命令行的总长度包括空格在内最多可达 8192 个字符。 (4)命令动词和 Visual FoxPro 保留字均可用 4 个以上字母简写。 (5)命令在输入时,可以以小写、大写或大小写混合等多种形式书写,但是为了使程序 规范化,最好统一使用大写形式或者小写形式进行书写。 (6)程序设计时,如果某条命令语句太长,可以分为几行进行书写,但每行(最后一行 除外)末尾要使用一个分行符“;” ,代表此条命令没有结束,在下一行接着书写。 在命令窗口中输入命令时或者编写程序时,命令的书写格式和规则很重要,是判别一 条命令是否能够正确执行或者一段程序是否规范化的重要标准。因此,在书写命令时要尤 为注意。
3.3 表达式
表达式是指由常量、变量和函数通过特定的运算符连接起来的、可以计算出结果的式子, 计算出来的结果称为表达式的值。 在 Visual FoxPro 的命令、 SQL 语句和程序中, 表达式起着很重要的作用。 在 Visual FoxPro 中,有 5 种类型的运算符:算术运算符、字符串运算符、日期时间运算符、关系运算符和逻辑 运算符。 由这 5 种运算符可以构成 5 类表达式: 算术表达式、 字符串表达式、 日期时间表达式、 关系表达式和逻辑表达式,表达式值的类型即为表达式的类型。单个的常量、变量和函数也可 称为表达式,是表达式的一种特例。 3.3.1 数值表达式 数值表达式是由算术运算符将数值型数据连接起来的式子,其中的数值型数据可以为数 值型的常量、变量或运算结果为数值型的函数。数值表达式的运算结果仍然为数值型数据。 1.算术运算符 数值表达式中的算术运算符的含义及其优先级如表 32 所示。 在运算时,先计算优先级别较高的运算符,再计算优先级别较低的运算符。对于同级运 算符,按照从左到右出现的顺序进行计算。表 32 算术运算符及其优先级 运算符 说明 优先级 () 圆括号 1 **或^ 乘方运算 2 *、/、% 乘运算、除运算、求余运算 3 +、 加运算、减运算 4 2.数值表达式的应用 例 3.27 将数学算式 1 1 52.69 859 75 860 æ ö - ´ + ç ÷ è ø 改写为数值表达式,并计算表达式的值。 1 1 52.69 859 75 860 æ ö - ´ + ç ÷ è ø 的数值表达式形式为:(1/751/860)*52.69+859。 表达式的值为 859.64,如图 325 所示。 例 3.28 将数学算式 b b b 4ac 2a - + ´ - 改写为数值表达式,并计算当 a=1,b=2,c=1 时 表达式的值。 b b b 4ac 2a - + ´ - 的数值表达式形式为:(b+(b**24*a*c)^(1/2))/2*a。 当 a=1,b=2,c=1 时,表达式的值为 1,如图 326 所示。 图 325 例 3.27 的执行过程及结果 图 326 例 3.28 的执行过程及结果 例 3.29 分别求数值表达式 10%3、10%3、10%3 和 10%3 的值。 注意:算术运算符中的求余运算“%”和数值型函数中的取余函数 MOD() 的作用相同。 特点是余数的正负号与除数一致,且余数的绝对值小于除数的绝对值。 在命令窗口中输入以下命令: ? 10%3, 10%3, 10%3, 10%3 按 Enter 键执行,在主屏幕上显示的结果为: 1 1 2 2 求余运算的计算过程如下: 3 3 10 9 1 3 3 10 9 1 - - - - 4 3 10 2 2 - - - 1 4 3 10 2 2 - - 1
-命令的执行过程及结果如图 327 所示。 图 327 例 3.29 的执行过程及结果 例 3.30 计算数值表达式 37%2**4 和 37%2*4 的值。 在命令窗口中输入以下命令: ?37%2**4 ?37%2*4 分别按 Enter 键执行,输出结果如下: 5 4 注意:表达式 1 先做乘方运算,后做求余运算;表达式 2 先做求余运算,后做乘法运算。 3.3.2 字符表达式 字符表达式是由字符串运算符将字符型数据连接起来的式子,其中的字符型数据可以为 字符型的常量、变量或运算结果为字符型的函数。字符表达式的运算结果仍然为字符型数据。 1.字符串运算符 字符串运算符有两种:完全连接运算符“+”和不完全连接运算符“” 。 “+” :将前后两个字符串首尾连接,形成一个新的字符串。 “” :连接前后两个字符串,并将前字符串的尾部空格移到合并后的新字符串尾部。 完全连接运算符和不完全连接运算符的运算优先级相同。 2.字符表达式的应用 例 3.31 在命令窗口中输入以下命令( “□”代表空格) : ?"计算机□"+"等级" ?"计算机□""等级" 分别按 Enter 键执行,输出结果如下: 计算机□等级 计算机等级□ 屏幕显示如图 328 所示。 例 3.32 在命令窗口中输入以下命令( “□”代表空格) : A="计算机□"+"等级"+"考试!" B="计算机□""等级"+"考试!" ?A ?B 分别按 Enter 键执行,输出结果如下:
计算机□等级考试! 计算机等级□考试! 屏幕显示如图 329 所示。 图 328 例 3.31 的执行过程及结果 图 329 例 3.32 的执行过程及结果 例 3.33 计算以下字符表达式的值( “□”代表空格) : "ABC"+"DEF" "ABC""DEF" "ABC□"+"DEF" "ABC□""DEF" "AB□C□""DEF" "A□""B"+"C" 结果为: ABCDEF ABCDEF ABC□DEF ABCDEF□ AB□CDEF□ AB□C 3.3.3 日期时间表达式 日期时间表达式是由日期时间运算符将日期型、日期时间型数据或数值型数据连接起来 的式子。日期时间表达式运算结果的数据类型根据运算格式不同,可以为日期型、日期时间型 或数值型。 1.日期时间运算符 日期时间运算符有两种,即“+”和“” ,两个运算符的运算优先级相同。 “+”和“”既可以作为日期时间运算符,也可以作为算术运算符和字符串连接运算符, 在使用中要根据其连接的数据类型判断其运算符的类型。 日期时间表达式的运算格式有一定的限制,要表达一定的意义。例如,不能将两个<日期 >或<日期时间>进行相加,不能使用<天数><日期>或者<秒数><日期时间>等。 日期时间表达式的合法运算格式如表 33 所示。 2.日期时间表达式的应用 例 3.34 在命令窗口中输入以下命令: ?{^20090813}+5,{^20090813}10 ?{^20090813}{^20090713},{^20090813}20 分别按 Enter 键执行,输出结果如下:
08/18/09 08/03/09 31 07/24/09 表 33 日期时间表达式的格式 格式 说明 结果类型 <日期>+<天数> 指定日期若干天后的日期 日期型 <天数>+<日期> 指定日期若干天后的日期 日期型 <日期><天数> 指定日期若干天前的日期 日期型 <日期><日期> 两个指定日期相差的天数 数值型 <日期时间>+<秒数> 指定日期时间若干秒后的日期时间 日期时间型 <秒数>+<日期时间> 指定日期时间若干秒后的日期时间 日期时间型 <日期时间><秒数> 指定日期时间若干秒前的日期时间 日期时间型 <日期时间><日期时间> 两个指定日期时间相差的秒数 数值型 屏幕显示如图 330 所示。 例 3.35 在命令窗口中输入以下命令: ?{^20090813,11:10}+5 ?{^20090813,}10 ?{^20090813,11:10}{^20090813,10:10} ?{^20090813,12:30:25}20 分别按 Enter 键执行,输出结果如下: 08/13/09 11:10:05 AM 08/12/09 11:59:50 PM 3600 08/13/09 12:30:05 PM 屏幕显示如图 331 所示。 图 330 例 3.34 的执行过程及结果 图 331 例 3.35 的执行过程及结果 思考: (1)计算日期时间表达式{^20090813}20 的值和值的数据类型。 (2)计算日期时间表达式{^2009813 10:00:00}{^2009813 9:00:00}的值和值的数据 类型。 3.3.4 关系表达式 关系表达式又称简单逻辑表达式,是由关系运算符将两个运算对象连接起来形成的式子。
关系表达式的格式为<表达式 1> <关系运算符> <表达式 2>。关系运算符的主要功能是比 较前后两个表达式的大小关系, 前后两个表达式的类型要相同。 关系表达式的运算结果为逻辑 型数据(.T.或.F.),即不是“真”就是“假” 。 1.关系运算符 关系表达式中的关系运算符及其含义如表 34 所示。 表 34 关系运算符及其含义 运算符 说明 <、<=、>、>= 小于、小于或等于、大于、大于或等于 < >、#或!= 不等于 = 等于(比较字符串时,受 SET EXACT 命令的影响) = = 精确等于(不受 SET EXACT 命令影响,仅适用于字符型数据) $ 子串包含测试(仅适用于字符型数据) 所有关系运算符的优先级相同,其中“= =”和“$”仅适用于字符型数据的比较,其他运 算符适用于任何类型的数据。 2.各种类型数据的比较方法 关系运算符在进行比较运算时,对于不同类型的数据,其“大小”的含义不同。数值型 数据比较的是值的大小; 日期或日期时间型数据比较的是日期或时间的先后顺序; 而字符型数 据比较的是字符在 ASCII 码表中的先后排列顺序。 (1)数值型和货币型:按数值的大小进行比较。 例 3.36 在命令窗口中输入以下命令: ?0>5,0.1>0.1 ?$120>$102 分别按 Enter 键执行,输出结果如下: .F. .T. .T. 屏幕显示如图 332 所示。 (2)日期型和日期时间型:按日期或日期时间的早晚进行比较,日期或日期时间晚的大 于日期或日期时间早的。 例 3.37 在命令窗口中输入以下命令: ?{^200861}>{^200961} ? {^200961,10}>{^200961,9} 分别按 Enter 键执行,输出结果如下: .F. .T. 屏幕显示如图 333 所示。 (3)逻辑型:真值大于假值,即.T.>.F.。 例 3.38 在命令窗口中输入以下命令: ?.T.>.F. ?.n.>.y. , .n.>.N.
图 332 例 3.36 的执行过程及结果 图 333 例 3.37 的执行过程及结果 分别按 Enter 键执行,输出结果如下: .T. .F. .F. 屏幕显示如图 334 所示。 例 3.39 在命令窗口中输入以下命令: ?(3>5 )<({^2009912}<{^2009918}) 按 Enter 键执行,输出结果如下: .T. (4)字符型。 1)$(子串包含测试) 。 格式:<字符表达式 1>$<字符表达式 2> 功能:如果<字符表达式 1>是<字符表达式 2>的子串,结果为逻辑真(.T.),否则结果为 逻辑假(.F.)。 例 3.40 在命令窗口中输入以下命令( “□”代表空格) : STORE "Visual□FoxPro" TO s1 STORE "FoxPro" TO s2 STORE "foxpro" TO s3 STORE "VisualFoxPro" TO s4 ?s2$s1,s3$s1,s4$s1 分别按 Enter 键执行,输出结果如下: .T. .F. .F. 屏幕显示如图 335 所示。 图 334 例 3.38 的执行过程及结果 图 335 例 3.40 的执行过程及结果 2)>、<(比较两个字符串的大小关系) 。 在 Visual FoxPro 中,字符型数据的比较相对复杂,两个字符串进行比较的基本原则是对 于两个字符串从左到右逐个字符进行对应比较, 第一个字符相等的情况下比较第二个, 依此类
推,直到比较出第一个不相同的字符为止。
如何判断两个字符的大小,与系统中的字符序列的排序设置有关。在 Visual FoxPro 中有 3 种字符排序序列,分别为 Machine(机器)、PinYin(拼音)和 Stroke(笔画)。当设置为不 同的排序序列时,字符大小的比较方法不同。 字符序列的排序设置有两种方法:人机会话方式和命令方式。 l 人机会话方式。 选择“工具”→“选项”命令,弹出“选项”对话框,单击“数据”选项卡,在“排序 序列”下拉列表框中选择要设置的选项,单击 “确定”按钮,如图 336 所示。 l 命令方式。 格式:SET COLLATE TO"<排序次序名>" 说明:<排序次序名>两边加英文半角引号, 次序名可以为"Machine"、"PinYin"或"Stroke"。 Machine(机器)次序:对于西文字符,按 照 ASCII 码表的顺序排列,空格<大写字母<小 写字母。大小写字母之间按照英文字母表的顺 序排列,a 最小,z 最大。对于汉字,按照汉语 拼音的顺序进行比较。 PinYin(拼音)次序:对于西文字符,空格 <小写字母<大写字母;大小写字母之间按照英 文字母表的顺序排列,a 最小,z 最大。对于汉字,按照汉语拼音的顺序进行比较。 Stroke(笔画)次序:无论是中文还是西文,均按照笔画的多少进行比较。 例 3.41 在命令窗口中输入以下命令( “□”代表空格) : SET COLLATE TO "Machine" ?"a"<"A","a"<"□A","ab"<"ac","a"<"abc" ?"张"<"王","计算机"<"计算","陈"<"程" SET COLLATE TO "Pinyin" ?"a"<"A","a"<"□A","ab"<"ac","a"<"abc" ?"张"<"王","计算机"<"计算","陈"<"程" SET COLLATE TO "Stroke" ?"a"<"A","a"<"□A","ab"<"ac","a"<"abc" ?"张"<"王","计算机"<"计算","陈"<"程" 分别按 Enter 键执行,输出结果如下: .F. .F. .T. .T. .F. .F. .T. .T. .F. .T. .T. .F. .F. .T. .T. .F. .T. .T. .F. .F. .T. 屏幕显示如图 337 所示。 3)= =、=与 EXACT 设置。 = =称为恒等比较,比较方法是:只有当左右两 图 336 “选项”对话框的“数据”选项卡 图 337 例 3.41 的执行过程及结果
个字符串中的字符完全相等且位置完全匹配时值为真,否则值为假。= =运算符的比较结果不 受 SET EXACT 设置的影响。
=称为相等比较, 比较的结果受 SET EXACT 设置的影响。 比较方法是: 在 SET EXACT OFF 状态下,当右边字符串与左边字符串前面部分的内容相匹配时,结果为真,否则结果为假。 SET EXACT OFF 为系统默认状态。 在 SET EXACT ON 状态下,先在较短字符串的尾部加上若干个空格,使两个字符串的长 度相等,再进行比较,二者完全相等时结果为真,否则结果为假。 例 3.42 在命令窗口中输入以下命令( “□”代表空格) : SET EXACT OFF ? "ABC"="AB" ?? "ABC"="AB□" ?? "□ABC"="AB" ?? "A□BC"="AB" SET EXACT ON ? "ABC"="AB" ?? "ABC"="AB□" ?? "AB□" ="AB" ?? "□ABC"="AB" ?? "A□BC"="AB" 分别按 Enter 键执行,输出结果如下: .T. .F. .F. .F. .F. .F. .F. .F. .F. 屏幕显示如图 338 所示。 例 3.43 在命令窗口中输入以下命令( “□”代表空格) : SET EXACT OFF STORE "信息" TO a1 STORE "信息□" TO a2 STORE "信息技术" TO a3 ?a1=a3,a3=a1,a1=a2,a2=a1,a2==a1 SET EXACT ON ?a1=a3,a3=a1,a1=a2,a2=a1,a2==a1 分别按 Enter 键执行,输出结果如下: .F. .T. .F. .T. .F. .F. .F. .T. .T. .F. 屏幕显示如图 339 所示。 3.3.5 逻辑表达式 逻辑表达式是由逻辑运算符将逻辑型数据连接起来形成的式子,其中的逻辑型数据可以 为逻辑型的常量、 变量或运算结果为逻辑型的函数。 逻辑表达式的运算结果仍然为逻辑型数据。 1.逻辑运算符 逻辑运算符的含义及其优先级如表 35 所示。 逻辑运算符两边都是逻辑表达式,优先级顺序为.NOT.>.AND.>.OR.。逻辑运算符两边的 圆点可以省略。逻辑运算规则如表 36 所示,其中 A、B 表示两个逻辑型数据对象。 图 338 例 3.42 的执行过程及结果 图 339 例 3.43 的执行过程及结果
表 35 逻辑运算符及其优先级 运算符 说明 优先级 .NOT.或! 逻辑非(取反) 1 .AND. 逻辑与(两边同时为真才为真) 2 .OR. 逻辑或(两边有一个为真就为真) 3 表 36 逻辑运算真值表
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. 2.逻辑表达式的应用 例 3.44 在命令窗口中输入以下命令: ?.NOT. .F. , .T. .AND. .F. , .T. .OR. .F. 按 Enter 键执行,输出结果如下: .T. .F. .T. 屏幕显示如图 340 所示。 图 340 例 3.44 的执行过程及结果 3.3.6 各种运算符的优先级 以上介绍了各种类型的表达式及其使用的运算符,每类表达式中的运算符都有其优先级 顺序。当不同类型的运算符出现在同一表达式中时,各类运算符的优先级顺序如表 37 所示。 表 37 各种运算符及其优先级 运算符 优先级 圆括号 1 算术运算符、字符串运算符、日期时间运算符 2 关系运算符 3 逻辑运算符 4
当算术运算符、字符串运算符和日期时间运算符同时出现时,按自左到右的顺序依次 执行。 例 3.45 在命令窗口中输入以下命令: ?3+3>5 .OR. 42<3 .AND. 3+3=5 按 Enter 键执行,输出结果如下: .T. 例 3.46 在命令窗口中输入以下命令: X="12" Y="1122" ?NOT(X==Y) AND (X$Y) 按 Enter 键执行,输出结果如下: .T.
3.4 系统函数
函数是指由命令代码组成的并能完成特定功能的一段程序。Visual FoxPro 6.0 提供了大量 的函数(称为系统函数)供用户直接使用,另外用户还可以自己编写函数(称为自定义函数) 。 本节将介绍系统函数中一些比较常用的函数, 把这些常用函数分为 5 类: 数值函数、 字符函数、 日期和时间函数、数据类型转换函数和测试函数。 每个函数都有函数名,函数名决定了函数的功能。函数名后面带有一对圆括号,圆括号 里的内容称为自变量,不同函数含有的自变量的个数不同,有的函数无自变量。各个函数的格 式和运算方法不同,函数的运算结果称为函数值或者返回值,函数值的类型即为函数的类型。 3.4.1 数值函数 数值函数是指函数值为数值的一类函数,其自变量和返回值均为数值型数据。数值函数 主要用于数值运算。 1.求绝对值函数和符号函数 格式:ABS(<数值表达式>) SIGN(<数值表达式>) 功能:ABS()返回指定数值表达式的绝对值;SIGN()返回指定数值表达式的符号,当表达 式的结果为正、负和零时,返回值分别是 1、1 和 0。 例 3.47 在命令窗口中输入以下命令: STORE 5 TO x ?ABS(x),ABS(x+5),ABS(x*(2)),ABS(3.14*3^2) ?SIGN(x),SIGN(x+5),SIGN(x*(2)),SIGN(3.14*3^2) 分别按 Enter 键执行,输出结果如下: 5 0 10 28.26 1 0 1 1 2.四舍五入函数 格式:ROUND(<数值表达式 1>,<数值表达式 2>)功能:返回指定数值表达式在指定位置四舍五入后的结果。<数值表达式 1>表示在指定位 置要进行四舍五入的数据,<数值表达式 2>表示指定四舍五入的位置。当<数值表达式 2>大于 等于 0 时,表示要保留的小数位数;当<数值表达式 2>小于 0 时,表示整数部分的舍入位数, 即整数中从个位开始 0 的个数。 例 3.48 在命令窗口中输入以下命令: STORE 987.654 TO x ?ROUND(x,2),ROUND(x,1),ROUND(x,0), ??ROUND(x,1),ROUND(x,2),ROUND(x,3),ROUND(x,4) 分别按 Enter 键执行,输出结果如下: 987.65 987.7 988 990 1000 1000 0 例 3.49 在命令窗口中输入以下命令: STORE 756.456 TO y ?ROUND(y,3) 按 Enter 键执行,输出结果如下: 1000 3.求圆周率函数 格式:PI(<数值表达式>) 功能:返回圆周率p的值(数值型)。该函数没有自变量。 例 3.50 在命令窗口中输入以下命令: ?PI() 按 Enter 键执行,在主屏幕上显示的结果如下: 3.14 4.求整数函数 格式:INT(<数值表达式>) CEILING(<数值表达式>) FLOOR(<数值表达式>) 功能:INT()返回指定数值表达式的整数部分(不进行四舍五入) ;CEILING()返回大于或 等于数值表达式的最小整数;FLOOR()返回小于或等于数值表达式的最大整数。 例 3.51 在命令窗口中输入以下命令: STORE 20.5 TO x ?INT(x),INT(x) ?CEILING(x),CEILING(x) ?FLOOR(x),FLOOR(x) 分别按 Enter 键执行,输出结果如下: 20 20 21 20 20 21 例 3.52 在命令窗口中输入以下命令: ? INT(PI( )*3^2) 按 Enter 键执行,输出结果如下: 28
5.求余数函数 格式:MOD(<数值表达式 1>,<数值表达式 2>) 功能:返回两个数值表达式相除后的余数。<数值表达式 1>是被除数,<数值表达式 2>是 除数。余数的正负号与除数相同。此函数的运算方法和求余符号“%”相同,相当于求<数值 表达式 1>%<数值表达式 2>的值。 例 3.53 在命令窗口中输入以下命令: x=10 y=3 ? MOD(x,y), MOD(x,y), MOD(x,y), MOD(x,y) 按 Enter 键执行,输出结果如下: 1 1 2 2 6.求最大值和最小值函数 格式:MAX(<数值表达式 1>,<数值表达式 2>[,<数值表达式 3>…]) MIN(<数值表达式 1>,<数值表达式 2>[,<数值表达式 3>…]) 功能:MAX()计算各自变量表达式的值,并返回其中的最大值;MIN()计算各自变量表达 式的值,并返回其中的最小值。 自变量表达式的类型也可以是字符型、货币型、逻辑型、日期型和日期时间型,但所有 表达式的类型必须相同。比较大小时,按照关系表达式中所叙述的方法进行比较。 例 3.54 在命令窗口中输入以下命令: ?MAX(2,10,5),MAX("good","morning","everyone"),MIN("2","10","05") 按 Enter 键执行,在主屏幕上显示的结果为: 10 morning 05 3.4.2 字符函数 字符函数是处理字符类型数据的一类函数,其自变量或函数值中至少有一个是字符型的 数据。 1.求字符串长度函数 格式:LEN(<字符表达式>) 功能:返回指定字符表达式值的长度,即所包含的字符的个数。一个字母或一个字符的 长度为 1,一个汉字的长度为 2。 返回值:数值型。 例 3.55 在命令窗口中输入以下命令( “□”代表空格) : ?LEN("HAPPY"),LEN("中文 Visual□FoxPro6.0") ??LEN(""),LEN("□□□") ?LEN(SPACE(3)SPACE(2)) 分别按 Enter 键执行,输出结果如下: 5 20 0 3 5 2.空格字符串生成函数 格式:SPACE(<数值表达式>) 功能:返回由数值表达式中指定数目的空格组成的字符串。
例 3.56 在命令窗口中输入以下命令: ?LEN(SPACE(10)) 按 Enter 键执行,在主屏幕上显示的结果为: 10 3.删除前后空格函数 格式:TRIM(<字符表达式>) LTRIM(<字符表达式>) ALLTRIM(<字符表达式>) 功能:TRIM()返回指定字符表达式值去掉尾部空格后形成的字符串;LTRIM()返回指定字 符表达式值去掉前导空格后形成的字符串;ALLTRIM()返回指定字符表达式值去掉前导和尾 部空格后形成的字符串。 例 3.57 在命令窗口中输入以下命令( “□”代表空格) : STORE SPACE(2)+"中文 Visual□FoxPro6.0"+SPACE(3) TO x ?x,TRIM(x) ?LTRIM(x),ALLTRIM(x) ?LEN(x),LEN(TRIM(x)),LEN(LTRIM(x)),LEN(ALLTRIM(x)) 分别按 Enter 键执行,输出结果如下: □□中文 Visual□FoxPro6.0□□□ □□中文 Visual□FoxPro6.0 中文 Visual□FoxPro6.0□□□ 中文 Visual□FoxPro6.0 25 22 23 20 4.大小写转换函数 格式:LOWER(<字符表达式>) UPPER(<字符表达式>) 功能: LOWER()将指定字符表达式中的大写字母转换成小写字母, 其他字符不变; UPPER() 将指定字符表达式中的小写字母转换成大写字母,其他字符不变。 例 3.58 在命令窗口中输入以下命令: STORE "中文 Visual FoxPro 6.0" TO x ?LOWER(x),UPPER(x) 按 Enter 键执行,输出结果如下: 中文 visual foxpro6.0 中文 VISUAL FOXPRO6.0 5.取子串函数 格式:LEFT(<字符表达式>,<N>) RIGHT(<字符表达式>,<N>) SUBSTR(<字符表达式>,<起始位置>,[,<N>]) 功能: LEFT()返回从指定字符表达式的左端开始的 N 个字符作为函数值; RIGHT()返回从 指定字符表达式的右端开始的 N 个字符作为函数值;SUBSTR()返回从指定字符表达式的<起 始位置>开始的 N 个字符作为函数值,若缺省第三个自变量<N>,则函数从起始位置开始一直 取到最后一个字符。 例 3.59 在命令窗口中输入以下命令: ?LEFT("HELLO WORLD",5) ?RIGHT("HELLO WORLD",5) ?SUBSTR("HAPPY NEW YEAR",5)
?SUBSTR("HAPPY NEW YEAR",5,3) ?SUBSTR("计算机等级考试",7,4) 分别按 Enter 键执行,输出结果如下: HELLO WORLD Y NEW YEAR Y N 等级 6.计算子串出现次数函数 格式:OCCURS(<字符表达式 1>,<字符表达式 2>) 功能:如果<字符表达式 1>是<字符表达式 2>的子串,则返回<字符表达式 1>在<字符表 达式 2>中出现的次数,否则返回数值 0。 返回值:数值型。 例 3.60 在命令窗口中输入以下命令: STORE "This is my sister" TO x ?OCCURS("is",x),OCCURS("sis",x),OCCURS("ss",x),OCCURS("IS",x) 按 Enter 键执行,输出结果如下: 3 1 0 0 7.求子串位置函数 格式:AT(<字符表达式 1>,<字符表达式 2>[,<数值表达式>]) ATC(<字符表达式 1>,<字符表达式 2>[,<数值表达式>]) 功能:AT(),若<字符表达式 1>是<字符表达式 2>的子串,则返回<字符表达式 1>的首字 符在<字符表达式 2>中的位置,否则返回 0;ATC(),若<字符表达式 1>是<字符表达式 2>的子 串,则返回<字符表达式 1>的首字符在<字符表达式 2>中的位置,否则返回 0,与 AT()功能类 似,区别是在子串比较时不区分字母大小写。 返回值:数值型。 例 3.61 在命令窗口中输入以下命令: STORE "This is my sister" TO x ?AT("is",x),AT("IS",x),ATC("is",x),ATC("IS",x) ?AT("sis",x),AT("SIS",x),ATC("sis",x),ATC("SIS",x) 分别按 Enter 键执行,输出结果如下: 3 0 3 3 12 0 12 12 8.字符串匹配函数 格式:LIKE(<字符表达式 1>,<字符表达式 2>) 功能: 若<字符表达式 1>与<字符表达式 2>对应位置的所有字符都匹配, 则返回逻辑真值, 否则返回逻辑假值。<字符表达式 1>中可以包含通配符“*”和“?” ,<字符表达式 2>中不可 以使用通配符。 例 3.62 在命令窗口中输入以下命令: ?LIKE("ABC","AB"),LIKE("AB*","ABC"),LIKE("AB","AB*") 按 Enter 键执行,输出结果如下: .F. .T .F.
9.宏替换函数 格式:&<字符型变量>[.] 功能:替换出<字符型变量>的内容。如果宏替换函数后面还有非空的字符表达式,则以 “.”作为函数的结束标识。宏替换符(&)后面的字符型变量名中可以包含宏替换函数,即 宏替换可以嵌套使用。 例 3.63 在命令窗口中输入以下命令: s1="Visual FoxPro 6.0" s2="s1" s3="中文" ?s3+&s2 按 Enter 键执行,输出结果如下: 中文 Visual FoxPro 6.0 3.4.3 日期和时间函数 日期和时间函数主要是处理日期类型或日期时间类型数据的函数,其自变量或者为空或 者为日期型、日期时间型表达式。常用的日期和时间函数如表 38 所示。 表 38 常用的日期和时间函数 类别 格式 功能 返回值 DATE() 返回系统当前的日期 日期型 TIME() 返回系统当前的时间,以 24 小时制 字符型 求系统日期 和时间 DATETIME() 返回系统当前的日期时间 日期时间型 YEAR(<<日期时间表达式>) 返回指定日期或日期时间表达式中的年份 数值型 MONTH(<日期表达式>|<日期 时间表达式>) 返回指定日期或日期时间表达式中的月份 数值型 求年份、月 份和天数 DAY(<日期表达式>|<日期时间 表达式>) 返回指定日期或日期时间表达式中的天数 数值型 HOUR(<日期时间表达式>) 返回指定日期时间表达式中的小时部分 (24 小时制) 数值型 MINUTE(<日期时间表达式>) 返回指定日期时间表达式中的分钟部分 数值型 求时、分、 秒 SEC(<日期时间表达式>) 返回指定日期时间表达式中的秒数部分 数值型 例 3.64 在命令窗口中输入以下命令: ?DATE(),TIME(),DATETIME() 按 Enter 键执行,在主屏幕上显示的结果为(由系统当前日期时间决定) : 04/30/09 20:29:35 04/30/09 08:29:35 PM 例 3.65 在命令窗口中输入以下命令: STORE {^20090601} TO x ?YEAR(x),MONTH(x),DAY(x) 按 Enter 键执行,输出结果如下: 2009 6 1
例 3.66 在命令窗口中输入以下命令: STORE {^20090601 10:30:40 PM} TO x ?HOUR(x),MINUTE(x),SEC(x) 按 Enter 键执行,输出结果如下: 22 30 40 3.4.4 数据类型转换函数 在数据库的应用过程中, 一般同类数据才能进行正常的运算, 此时不同数据类型的数据必 须将它们转换成同一类型,Visual FoxPro 提供了数据类型转换函数。 1.数值转换成字符串函数 格式:STR(<数值表达式>[,<长度>[,<小数位数>]]) 功能:将<数值表达式>的值转换成字符串。 返回值:将数值表达式按指定的<长度>和<小数位数>转换成字符串。 在转换时,需要注意以下几点(设理想长度 L=整数位数+小数位数+小数点): (1)当<长度>大于 L 时,字符串前加上空格,满足规定的<长度>要求。 (2)当<长度>大于等于整数部分位数但又小于 L 时,优先考虑整数部分而自动调整小数 位数。 (3)当<长度>小于整数部分位数时,返回一串星号(*) 。 (4)当<小数位数>的默认值为 0 时,<长度>的默认值为 10。 例 3.67 在命令窗口中输入以下命令: X=314.159 ?STR(X,9,2),STR(X,6,2),STR(X,3) ?STR(X,6),STR(X) 分别按 Enter 键执行,输出结果如下: 314.16 314.2 *** 314 314 2.字符串转换成数值函数 格式:VAL(<字符表达式>) 功能:将自变量中的字符串转换成数值。 返回值:将由数字符号(包括正负号、小数点)组成的字符型数据转换成相应的数值型 数据。若字符串内出现非数字字符,那么只转换前面部分;若字符串的首字符不是数字符号, 则返回数值 0,但忽略前导空格。 例 3.68 在命令窗口中输入以下命令( “□”代表空格) : ?VAL("123.56"),VAL("a123.56"),VAL("12a3.56"),VAL("□□□123.56") 按 Enter 键执行,在主屏幕上显示的结果为: 123.56 0.00 12.00 123.56 3.字符串转换成日期函数 格式:CTOD(<字符表达式>) 功能:将<字符表达式>转换成日期型数据。其中的<字符表达式>要按日期的格式进行书写。 例 3.69 在命令窗口中输入以下命令: SET CENTURY ON ?CTOD("12/31/09")
按 Enter 键执行,输出结果如下: 12/31/2009 4.日期或日期时间转换成字符串函数 格式:DTOC(<日期表达式>) 功能:将<日期表达式>转换成字符型数据。转换后的字符型数据的格式和日期的格式相 一致,并受相关日期格式命令的影响。 例 3.70 在命令窗口中输入以下命令: SET CENTURY ON ?DTOC({^20091231}) 按 Enter 键执行,输出结果如下: 12/31/2009 3.4.5 测试函数 为了了解有关数据对象的类型、状态等属性,Visual FoxPro 系统提供了一组相关的测试 函数,使用户能够准确地获取操作对象的相关属性。 1.值域测试函数 格式:BETWEEN(<表达式 1>,<表达式 2>,<表达式 3>) 功能:判断一个表达式是否介于另外两个表达式的值之间。若表达式 1 的值大于等于表 达式 2 的值并且小于等于表达式 3 的值,则返回逻辑真,否则返回逻辑假;若表达式 2 或表达 式 3 值为 NULL,则返回值也为 NULL。 注意:自变量中 3 个表达式的数据类型要一致。 例 3.71 在命令窗口中输入以下命令: ?BETWEEN(5,2,10),BETWEEN("good","morning","everyone") ?BETWEEN("2","05","10"),BETWEEN(2,.NULL.,05) 分别按 Enter 键执行,输出结果如下: .T. .F. .F. .NULL. 2.空值(NULL 值)测试函数 格式:ISNULL(<表达式>) 功能:若自变量表达式的结果为 NULL,则返回逻辑真(.T.),否则返回逻辑假(.F.) 。 例 3.72 在命令窗口中输入以下命令: A=.NULL. ?A,ISNULL(A) 按 Enter 键执行,输出结果如下: .NULL. .T. 3. “空”值测试函数 格式:EMPTY(<表达式>) 功能:若表达式结果为“空”值,则返回逻辑真(.T.),否则返回逻辑假(.F.)。 “空”值 与空值(NULL 值)是两个不同的概念。关于不同类型的数据, “空”值的规定如表 39 所示。 例 3.73 在命令窗口中输入以下命令: A=.NULL. B=""
? ISNULL(A),EMPTY(A),ISNULL(B),EMPTY(B) 按 Enter 键执行,输出结果如下: .T. .F. .F. .T. 表 39 不同类型数据的“空”值规定 数据类型 “空”值 数据类型 “空”值 数值型 0 逻辑型 .F. 货币型 0 整型 0 字符型 空串、空格、制表符、回车 双精度型 0 日期型 空(如 CTOD(" ")) 浮点型 0 日期时间型 空(如 CTOT(" ")) 备注字段 空(无内容) 4.数据类型测试函数 格式:VARTYPE(<表达式>[,<逻辑表达式>]) 功能:测试<表达式>的类型。根据表达式的值返回一个代表<表达式>数据类型的大写字 母。各数据类型所对应的返回的大写字母如表 310 所示。 表 310 各数据类型由 VARTYPE( )测试返回的结果 返回的字母 数据类型 返回的字母 数据类型 N 数值型、整型、浮点型或双精度型 L 逻辑型 Y 货币型 X NULL 值 C 字符型或备注型 O 对象型 D 日期型 G 通用型 T 日期时间型 U 未定义 例 3.74 在命令窗口中输入以下命令: ?VARTYPE(DATE()) 按 Enter 键执行,在主屏幕上显示的结果为: D 5.条件测试函数 格式:IIF(<逻辑表达式>,<表达式 1>,<表达式 2>) 功能:判断<逻辑表达式>的值,若<逻辑表达式>的值为真,则返回<表达式 1>的值,否 则返回<表达式 2>的值。<表达式 1>和<表达式 2>的数据类型可以不同。 例 3.75 在命令窗口中输入以下命令: ?IIF(100>5,100,5),IIF(100>5,.T.,"OK") 按 Enter 键执行,在主屏幕上显示的结果为: 100 .T. 3.4.6 与表操作有关的测试函数 1.表文件尾测试函数 格式:EOF(表名)
功能:测试指定表文件中的记录指针是否指向文件尾(最后一条记录的后面位置)。 说明:①使用 EOF()函数测试的是当前表文件;②如果当前没有打开的表文件,则函数返 回值为.F.;③如果当前表中没有记录,则函数返回值为.T.;④此函数一般用于程序的选择语 句或循环语句中。 2.表文件首测试函数 格式:BOF(表名) 功能:测试指定表文件中的记录指针是否指向文件首(第一条记录的前面位置)。 说明:①使用 BOF()函数测试的是当前表文件;②如果当前没有打开的表文件,则函数返 回值为.F.;③如果当前表中没有记录,则函数返回值为.T.。 3.记录号测试函数 格式:RECNO(表名) 功能:返回指定表文件中当前记录的记录号。 说明:①使用 RECNO()函数测试的是当前表文件;②如果当前没有打开的表文件,则函 数返回值为 0;③当使用 BOF()函数测试的结果为真时,此函数返回值为 1;④当使用 EOF() 函数测试的结果为真时,此函数返回值为 n+1,即当前表最后一条记录的记录号加 1。 4.记录个数测试函数 格式:RECCOUNT(表名) 功能:测试指定表文件中的记录个数。 说明:①使用 RECCOUNT()函数测试的是当前表文件;②如果当前表中没有记录,则函 数返回值为 0。
习题三
一、选择题 1.以下关于空值(NULL 值)叙述正确的是( )。 A.空值等于空字符串 B.空值等同于数值 0 C.空值表示字段或变量还没有确定的值 D.Visual FoxPro 不支持空值 2.说明数组后,数组元素的初值是( )。 A.整数 0 B.不定值 C.逻辑真 D.逻辑假 3.设 a="计算机等级考试",结果为“考试”的表达式是( )。A.Left(a,4) B.Right(a,4) C.Left(a,2) D.Right(a,2)
4.如果内存变量和字段变量均有变量名“姓名” ,那么引用内存的正确方法是( )。 A.M.姓名 B.M>姓名 C.姓名 D.A 和 B 都可以 5.命令?(VAR(TIME()))的结果是( )。 A.C B.D C.T D.出错 6.命令?LEN(SPACE(3)SPACE(2))的结果是( )。 A.1 B.2 C.3 D.5