第3章数据类型与数据运算章前导读VisualFoxPro中包含的数据类型数据之间进行运算的准则各种数据的相互转换方法VisualFoxPro中,除了需要处理表中的数据外,还需要处理其他的数据。VisualFoxPro包括常量、变量、表达式和函数4种形式的数据。每一类数据都属于特定的数据类型,数据类型决定了数据的存储方式和运算方法。3.1常量常量表示一个具体的、不变的值。不同类型的常量有不同的书写格式。VisualFoxPro中常量包括数值型、字符型、日期型、日期时间型、逻辑型和货币型6种。(1)数值型常量就是我们所说的常数,用来表示一个数量的大小,具有运算意义。数值型常量由数字0~9、小数点和正负号组成。例如:65、-26、1.5E7、2.34E-8系统内存用8个字节来表示一个数值型常量,其取值范围是:-9999999999E-19~0.9999999999E20(2)字符型常量习惯上也称“字符串”,由中英文字符、ASCII码、各种符号、空格和数字组成。表示方法:用半角单引号、双引号或方括号将字符串括起来。(定界符)在字符型数据中,一个汉字占两个字节的位置,其他字符占一个字节的位置。例如:’VFP’、”计算机001”、[轻工学院]、[祖国的’花朵’](3)日期型常量用来表示具体日期的常量定界符是{}分隔符是(/)、(-)、(.)和空格传统日期格式与严格日期格式传统日期格式:mm/dd/yy严格日期格式:{^yyyy-mm-dd}如{08-23-98}可以表示1998年8月23日,如{^1998-08-23}就是1998年8月23日。两种日期型的区别传统的日期格式受其他语句的影响。在不同设置状态下,计算机会对同一日期型常量作出不同解释。如{10/08/01}可以被解释为2001年10月8日、2010年8月1日、2001年8月10日等。严格日期格式确切地表示一个日期而不会受到命令语句的任何影响。命令和子句的书写规则(1)以命令动词开始;(2)各部分之间要用空格隔开;(3)命令、子句、函数名都可简写为前4个字符,大、小写等效;(4)一行只能写一条命令,总长度不超过8192个字符,超过屏幕宽度时用续行符“;”;(5)变量名、字段名和文件名应避免与命令动词、关键字或函数名同名,以免运行时发生混乱。命令格式中的符号约定命令中的[]、|、…、符号都不是命令本身的语法成分,使用时不能照原样输入其中:[]表示可选项,根据具体情况决定是否选用|表示两边的部分只能选用其中的一个…表示可以有任意个类似参数,各参数间用逗号隔开表示其中内容要以实际名称或参数代入影响日期格式的设置命令设置日期格式SETDATE[TO]AMERICAN┃ANSI┃BRITISH┃FRENCH┃GERMAN┃ITALIAN┃JAPAN┃USA┃MDY┃DMY┃YMD常用日期格式短语格式短语格式AMERICANmm/dd/yyJAPANyy/mm/ddANSIyy.mm.ddUSAmm-dd-yyBRITISHFRENCHdd/mm/yyMDYmm/dd/yyGERMANdd.mm.yyDMYdd/mm/yyITALIANdd-mm-yyYMDyy/mm/dd命令工作方式中的常见错误(1)命令动词写错(2)格式不符合要求·标点符号不对(一定要用英文标点符号)·缺少必需的空格或添加了不该有的空格·数据类型不一致,要注意字符型、数值型、日期型、逻辑型数据的书写格式(3)打不开所需文件:没有正确输入盘符和路径或文件名输错设置日期分隔符SETMARKTO[日期分隔符]若执行SETMARKTO没有制定任何分隔符,表示恢复系统默认的斜杠(/)分隔符。设置年份的位数SETCENTURYON┃OFF用于设置显示日期型数据时是否显示世纪。也就是说年份是显示4位还是2位。设置日期格式检查SETSTRICTDATETO[0┃1┃2]用于设置是否对日期格式进行检查0表示不进行严格的日期格式检查1表示进行严格的日期格式检查,是系统默认设置。2表示进行严格的日期格式检查,对于CTOD()和CTOT()函数格式也有效。严格的日期格式可以在任何情况下使用,传统的日期格式只能在SETSTRICTDATETO0的情况下使用;当SETSTRICTDATETO1或2的情况下,用户使用传统日期格式,系统会报错。4.日期时间型常量表示具体的日期及时间的常量。分为传统日期时间型常量和严格日期时间型常量。严格日期时间型常量的表示形式:{^yyyy-mm-dd,[hh[:mm[:ss]][a│p]]}5.逻辑型常量用来表示逻辑真和逻辑假的常量。逻辑型常量只有逻辑真和逻辑假两个值。逻辑真的表示形式:.T.、.t.、.Y.、.y.逻辑假的表示形式:.F.、.f.、.N.、.n.逻辑型数据占用1个字节。6.货币型常量用来表示货币值的常量。货币型数据与数值型数据的不同之处就是前面的货币符号($),如:$100货币型数据采用4位小数存储,如果超出,系统会将多余小数位四舍五入掉。货币型常量没有科学记数法形式,在内存中也占8个字节。它的取值范围是:-922337203685447.5807~922337203685447.58073.2变量变量和常量都是VisualFoxPro中数据运算和数据处理的基本对象,常量表示一个固定的值,而变量的值是能随时改变的。3.2.1变量的基本概念1.变量的命名规则由字母、汉字、下划线和数字组成。例如#、$不能用来组成变量。以字母、汉字、下划线开头,不能以数字开头。如1ac不能作为变量名。不能使用系统保留字(系统中的命令)。例如,creat为创建表的命令,不能作为变量名。字母不区分大小写。如ab、Ab在系统中被同等对待。除了自由表的字段名、表的索引标识名至多只能有10个字符外,其余名称的长度可以是1~128个字符。2.变量的分类VisualFoxPro中的变量分为字段变量内存变量(1)字段变量就是我们所说的表中的字段。因为字段的取值是可变的,所以表中的字段名又叫字段变量。字段变量在创建表结构时定义如:”student”表中的”sno”、”sname”等字段名就是字段变量。(2)内存变量可以分为简单内存变量和数组。内存变量是内存中的一个存储区域,变量值就是存放着这个区域里的数据。内存变量的类型可以改变,可以把不同类型的数据赋给同一个内存变量。内存变量的类型取决于变量值的类型。变量就像是一个盒子,而变量的值就相当于放在盒子里的物体。盒子是固定不变的,而放在盒子里的物体却能更换。内存变量的类型字符型(C)、数值型(N)、货币型(Y)、逻辑型(L)、日期型(D)、日期时间型(T)例如:A=123,其中A表示一个数值型变量,123是变量值B={^2006-8-1},其中B表示一个日期型变量,{^2006-8-1}是变量值C=‘中国’,其中C表示一个字符型变量,‘中国’是变量值由于内存变量存放在独立于数据库文件的临时存储单元中,所以内存变量可以和字段变量重名。这种情况下,字段变量具有更高的优先级。这种情况下,如果用户想访问内存变量,需要在内存变量前加m.或m→作为前缀。但对内存变量赋值时不能加前缀。内存变量——数组数组中的每个元素都可以看成是一个简单的内存变量。例如:把班级中的每个学习小组看成是一个数组,小组中的每个学生就是这个数组中的元素。内存变量——数组数组由数组名和数组序号组成。序号被称作下标,是数值型数据。用户通过数组名及对应的下标实现对数组元素的访问。数组从结构上可分为一维数组和二维数组。数组在使用前要用DIMENSION或DECLARE命令创建,用以规定数组名、数组的维数和大小。数组的定义格式:DIMENSION数组名(下标上限1[下标上限2])[,……]DECLARE数组名(下标上限1[下标上限2])[,……]举例DIMENSIONx(3),y(2,3)一维数组x中包含3个元素:x(1),x(2),x(3)二维数值y中包含6个元素:y(1,1),y(1,2),y(1,3),y(2,1),y(2,2),y(2,3)变量的作用域即变量起使用的有效范围就是每个变量都有它的作用范围,在它的定义域内有效。①全局变量在整个程序中,包括上下级过程中都有效。②局部变量只在定义它的模块内有效。③私有变量在定义它的模块和它的下级子程序或过程内有效。变量的作用域——局部变量变量作用域定义:localvariable(本地变量)作用域的关键字:LOCAL特点:只能在一个函数或过程中被访问,其他过程或函数不能访问此变量的数据。当其所属程序停止运行时,局部变量将被释放。变量的作用域——私有变量变量作用域定义:privatevariable(私有变量)作用域的关键字:PRIVATE特点:私有变量在VFP中是默认的,不需要特殊的关键字定义。但是,如果在更高一级例程(routine)中已经有同名变量,可以用PRIVATE关键字予以声明,以限定其范围。当定义此变量的例程结束时,此变量也被相应释放。可使用私有变量在被调用的函数中共享数据。变量的作用域——公共变量变量作用域定义:publicvariable(全局变量)作用域的关键字:PUBLIC特点:可用于所有过程和函数,而不限于定义该变量的过程和函数。可使用全局变量在多个过程或函数之间共享数据,在命令窗口中创建的任何变量自动具有全局属性。数组类型的声明私有数组——用DECLARE或DIMENSION定义全局数组——用PUBLIC命定义局部数组——用LOCAL定义3.2.2内存变量的常用命令(1)内存变量的赋值STORE表达式TO内存变量名表如:STORE王兰TOcStudSTORE王兰TOcStud,cstno内存变量名=表达式如:cStud=王兰(2)表达式的显示?表达式结果在下一行的起始处输出??表达式结果在当前行的光标所在处直接输出(3)内存变量的显示LISTMEMORY[LIKE通配符][TOPRINTER│TOFILE文件名]不暂停,直到显示结束。DISPLAYMEMORY[LIKE通配符][TOPRINTER│TOFILE文件名]分屏显示注:VisualFoxPro中通配符包括*和?(4)变量的清除CLEARMEMORY清除所有内存变量RELEASE内存变量名表清除指定内存变量RELEASEALLEXTENDED清除所有内存变量,加上EXTENDED能清除公共内存变量RELEASEALL[LIKE通配符│EXCEPT通配符]选用LIKE短语清除与通配符相匹配的变量,选用EXCEPT短语清除与通配符不相匹配的变量。(5)表中数据与数组数据之间的交换从当前记录中取特定字段的值赋给数组scatter[fields字段名表]to数组名从当前记录中取所有字段的值赋给数组scatterto数组名从当前表中取所有字段的值赋给数组COPYTOARRAY数组名(5)表中数据与数组数据之间的交换把数组中的数据复制到表的当前记录gatherfrom数组名[fields字段名表]用数组向当前表添加记录:appendfromarray数组名[for条件][fields字段名表]3.3表达式用来表示某个求值规则,由常量、变量、函数用运算符连接起来的特定式子。即:变量、操作符、常量、函数、字段名、控制以及属性的组合,求值结果为单个值。表达式的类型数值表达式:由算术操作符和数值型数据构成的表达式。字符表达式:由字符操作符和字符型数据构成的表达式。日期表达式:由日期操作符和日期、时间型数据构成的表达式。逻辑表达式:由逻辑操作符和逻辑型数据构成的表达式。(1)数值表达式由算术运算符、数值型常量、变量、函数和圆括号组成。如:5+23*2*(3+8)运算符:()、^或**