《数据库管理与程序设计语言.doc》由会员分享,可在线阅读,更多相关《数据库管理与程序设计语言.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4、2 VFP数据库管理与程序设计语言FoxPro是Fox Software公司在FoxBASE数据库软件基础上,于80年代末90年代初推出的一个功能较强的微机数据库管理系统软件,它继承了微机数据库如dBASE等的一些主要特征,并在功能及运行速度上由于优于其它同类产品,因此受到用户的广泛青睐。Fox归并Microsoft后推出的Visual FoxPro 系列产品具有Windows界面,它不仅在性能上缩短了与大型数据库系统的距离,而且引进了可视化编程技术,属中小型数据库管理软件设计的首选工具。启动VFP系统后的主界面窗口如图4-7所示。它由三个窗口组成:项目管理器窗口、命令窗口、和它们后面的主
2、窗口。项目管理器窗口将在后面介绍,现在可以把它关掉。命令窗口是用用于调试命令或以命令方式管理系统的。如在命令窗口中输入a=1就把1赋值给a,再在命令窗口中输入? a就会在主窗口中显示出变量a的值1。“?变量(或表达式)”这一命令用于在主窗口显示变量或表达式的值。它在调试命令的使用方法时是很有用的,后面介绍的大部分命令都可以用这种方法调试。1、数据类型、内存变量、字段、运算符和表达式在VFP中有13种不同的数据类型:字符型、货币型、数值型、浮点型、日期型、日期时间型、双精度型、整型、逻辑型、备注型、通用型、二进制字符型、二进制备注型等。其中比较常用的有字符型、数值型、日期型、逻辑型、备注型等。字
3、符型数据包括字母、数字、空格、符号、和标点符号等。字符字段或变量用于存储文本信息,包括名称、地址等。号码和不在数值计算中使用的一些数据,如电话号码,零件编码等,也可作为字符型数据处理。VFP中字符型数据要用两个“”后“”括起来,如a=9表示a是字符型的,其符号值为9,而a=9表示a是数值型的其值为数值9。数值型数据包括正、负小数和整数,可表示的数值范围在-0.999,999,999,91019 到0.999,999,999,91020之间,只允许使用十进制数据,有效精度为10位,要提高数据精度可以使用双精度型数据,数据精度可提高到15位。日期型数据一般用“yyyymmdd”的格式表示年、月、日
4、,内存中占8字节。要给日期型变量赋值,必须用括号将日期值括起,例如:dDate=2000/2/23。逻辑型变量或字段只有两个值:T和F。如果赋予其它值则会出现错误。备注型数据主要用于存储ASCII数据块,数据块的大小取决于磁盘可用空间的大小或用户实际输入的数据量。表中记录的备注字段内容是用与表同名的一个单独文件加以保存的,扩展名为.FPT。内存变量是保存在内存中且在程序运行期间其值可以改变的量。内存变量是程序设计的基本元素,在许多情况下程序的输入、输出及中间运算结果都保存在内存变量中。内存变量的使用中应注意以下几点:1)VFP中变量名最多不超过256字符,一般应以字母开头,名称中只能使用字母、
5、数字及下划线,不区分大、小写,且不要使用系统保留字。命名变量时,建议使用变量类型前缀,如dDate中的d表示它是一个日期型变量,但这种要求并不是必须的。2)在VFP中对内存变量的数据类型限制较少,因此变量不必提前声明,变量的数据类型由赋予变量的实际值来决定。这给增加变量带来了方便,但使用中要求编程人员掌握变量的性质,否则可能在程序运行中产生错误。3)和其它编程语言一样,内存变量分为局部变量和全局变量。局部变量的作用域是当前子程序(或过程、方法)段,局部变量可以不用说明。全局变量必须用关键字public来说明,如public dDate,说明dDate是一个全局变量。全局变量的作用域是整个应用程
6、序。系统变量是VFP中固有的一种特殊的全局变量,系统变量以下划线开头,如 _SCREEN,代表当前应用程序的窗口屏幕,它在一次VFP程序运行的整个过程中有效,并且系统可能有时会自动改写该变量,使用时须慎重。4)内存变量的赋值可使用 STORE TO 的命令,更常用的是使用 = 的操作符赋值法。字段是数据表的基本组成部分.数据表中的一行称为一个记录,数据表中的一列称为一个字段,同一字段的各记录具有相同的数据类型。在创建一个数据表时至少必须同时创建数据表的一个以上字段,必须给字段命名,且必须指定字段的数据类型。如使用命令 “ CREATE TABLE 装配明细表 ( PartID c(6), Na
7、me c(20), Number n(2), Weight n(8,3) )” 就创建了一个表名为“装配明细表”,具有4个字段的数据表。这4个字段的字段名分别是: PartID, Name, Number和 Weight。它们的数据类型分别是:字符型(6位宽度,相当于3个汉字或6个西文数码),字符型(20位宽度),数值型(2位宽度,可表示-9到99以内的数),数值型(8位宽度,其中包括3位小数)。关于字段需要说明的是:1)字段名的命名规则和变量名基本相同,但名字的长度最好不要超过8个西文字符。2)字段的数据类型必须是确定的,如果把不同数据类型的数据赋值给某字段则出错。3)字段的宽度也必须在创建
8、或修改表结构时给定,同一数据类型,较大宽度的数据被赋予某字段时,数据将被截取,并且不给错误提示,因此设计数据表时要预测好数据的宽度。4)当前打开的表的当前记录的各个字段是和内存变量一样保存在内存中的。如果某内存变量与当前表的字段重名,当前记录的字段内容就会自动覆盖该内存变量。如果有必要重名时,可用“m.”的前缀修饰该变量,如m.Name,这时,Name的数据是当前记录的数据,而m.Name是与Name不同的内存变量。只有当使用命令“SCATTER MEMVAR”时才把字段Name的数据赋予m.Name。当使用命令“GATHER MEMVAR”时可以用m.Name的数据修改Name的内容。表达式
9、是有变量、常量和运算符组成的具有确定运算结果的式子。表达式的数据类型是指表达式计算结果的数据类型,由于有确定的运算结果,所以其数据类型是确定的。运算符用于操作相同类型的数据。可分为字符运算符、时间运算符、逻辑运算符、关系运算符和数值运算符5类。字符运算符主要有连接符+、取消符-、和包含符$三个。其中+号比较常用,如a=part+id,则a的值成为partid。包含符$的用法如a=part$t, 则a的值成为T。时间运算符主要是+和-,其用法和数值运算相近。逻辑运算符主要有Not或!代表逻辑非、AND逻辑与、OR逻辑或。如a=F, b=T, c=(a AND b) OR (a OR b)则c的值
10、为T。关系运算符中、=(大于等于)、=(小于等于)只用于数值表达式的比较,、#、!=都代表不等于,=代表恒等于,=代表等于。它们即可用于各种数据类型的比较。数值运算符有加(+)、减(-)、乘(*)、除(/)、幂(*或)、取模(%)等,它们的含义和常规科学计算一致。2、数据库操作命令1)建立数据库命令:CREATE DATABASE 路径数据库名。数据库名可以包括路径,如果没有指定路径,则所建数据库保存在当前默认路径下。2)建立数据表命令: CREATE TABLE 路径数据表名 FREE ( 字段名1 字段类型 (字段宽度, 小数位数) PRIMARY KEY | UNIQUE ,字段名2 .
11、 ) 。这里中的关键字是可选项。如果有FREE则所建数据表是一个不属于任何数据库的自由表,否则属于当前打开的数据库,如果当前没有打开的数据库,有没有FREE都一样。符号“|”表示PRIMARY KEY 和 UNIQUE两个关键字是只能单选的,有前者表示该字段是普通索引,UNIQUE则是唯一索引。索引是为便于查询中排序使用的,数据表中作为唯一索引的字段,其各记录的内容必须是不同的,普通索引则没有这种要求。没有这两个关键字则表示该字段不是索引项。3)打开数据库命令:OPEN DATABASE 数据库名 | ?EXCLUSIVE | SHARED 。这里如果选择“?”则显示一个打开文件的对话框。EX
12、CLUSIVE | SHARED表示独占或共享,无该选项时由SET EXCLUSIVE设定的系统状态决定。4)工作区选择命令:SELECT n | cTableAlias。该命令中有一个单选项:n表示某个工作区的编号。工作区是内存中存放数据表的区域,内存中可以有许多工作区,每个工作区中只能打开一个数据表,被选中的当前工作区也只能有一个,选中了某个工作区,其它工作区就变成非当前工作区了。除特别说明外,数据表操作命令都只对当前工作区有效。单选项cTableAlias是数据表的别名,也可以是数据表名。由于工作区中的表是唯一的,表名、别名都代表着唯一的表,所以工作区编号、数据表别名、数据表名三者实际上
13、是一样的。当要打开许多表时,由于工作区编号是难于记忆的,故一般直接用数据表名,当有重名表时可以用别名。5)打开数据表命令:USE DatabaseName. Table | ? IN nWorkArea ORDER TagName ASCENDING | DESCENDING ALIAS cTableAlias EXCLUSIVE SHARED NOUPDATE 。该命令的最简单形式是只有关键字USE,它关闭当前工作区中的数据表。当有选项DatabaseName. Table时表示要把该数据表在当前工作区中打开,打开的同时就关闭了该工作区中原来的表。?表示以对话框方式由用户选择要打开的表。选项
14、IN nWorkArea表示要在哪个工作区中打开。有一种特别常用的用法是:“USE Table IN 0”,他形式上是把表在工作区0打开,实际上是要在编号最小的空工作区中把表打开。ORDER TagNameASCENDING | DESCENDING表示打开表时以索引标识名TagName所指索引排序,可升序也可降序,默认为升序。NOUPDATE选项表示只读打开,无该选项表示该表是可读、可写的。6)添加空记录命令:APPEND BLANK IN n 。在表的末尾添加一个新记录。BLANK选项在当前表的末尾添加一个空记录。IN n指定要添加新记录的表所在的工作区。如果省略则将添加到当前选定工作区的
15、表中。当发出 APPEND 或 APPEND BLANK 命令,并且没有在当前选定工作区中打开表时,将显示一个打开对话框,您可以在对话框中选择需要添加记录的表。7) 字段替换命令:REPLACE FieldName1 WITH eExpression1 ADDITIVE , FieldName2 WITH eExpression2 ADDITIVE . Scope FOR lExpression1 WHILE lExpression2IN n 。参数“FieldName1 WITH eExpression1 , FieldName2 WITH eExpression2 . ”指定用表达式 eE
16、xpression1 的值来代替 FieldName1 字段中的数据;用表达式 eExpression2 的值来代替字段 FieldName2 中的数据,依此类推。ADDITIVE把对备注字段的替代内容追加到备注字段的后面。ADDITIVE 只对替换备注字段有用。如果省略 ADDITIVE,则用表达式的值改写备注字段原有内容。Scope指定要替换内容的记录范围,只替换指定范围内记录字段的内容。范围子句有:ALL(全部)、NEXT n(后面n个记录)、RECORD n(第n个记录) 和 REST(后面的其余记录)等。默认范围是当前记录 ( NEXT 1 )。FOR lExpression1只有当
17、指定记录使表达式 lExpression1 求值结果为“真”(.T.) 时,它的字段才会被替换为新的内容。因此,包含 FOR 子句可以使命令有条件地更新记录,而将那些不需要更新的记录筛选掉。WHILE lExpression2指定一个逻辑表达式 lExpression2 作为替换字段内容的条件。只要逻辑表达式 lExpression2 计算为“真”(.T.),就替换记录中的数据,直至遇到第一个计算结果为“假”(.F.) 为止。IN n指定要更新记录的表所在的工作区。8)定位记录:LOCATE FOR lExpression1 Scope WHILE lExpression2 。 LOCATE
18、命令按顺序搜索当前表以找到满足逻辑表达式 lExpression1 的第一个记录。Scope指定要在何范围定位记录。WHILE lExpression2是另一种确定范围的方法,它指定一个条件,只要逻辑表达式 lExpression2 计算值为“真”(.T.),就继续查找记录。LOCATE 发现一个满足条件的记录后,则 FOUND( ) 返回T,EOF( ) 返回F。可使用 RECNO( ) 返回该记录号。若找不到满足条件的记录,则,FOUND( ) 返回F,EOF( ) 返回T,RECNO( ) 返回表中的记录数加 1。LOCATE 发现一个满足条件的记录之后,可执行 CONTINUE,从而在
19、表的剩余部分寻找其他满足条件的记录。当执行 CONTINUE 时,搜索操作从满足条件的记录的下一条记录开始继续执行。可重复执行 CONTINUE,直到到达范围边界或表尾。LOCATE 和 CONTINUE 只能用于当前工作区。若选择了另一工作区,则当重选原来的工作区时可继续原来的搜索过程。9)记录跳转命令:SKIP n:它表示跳过n个记录,n可以是正数也可以是负数。GOTO n:它表示把记录跳转到第n号记录,GOTO BOTTOM或GOTO TOP则表示跳转到表的第一个记录或最后一个记录。10)字段与内存变量转化命令:SCATTER FIELDS FieldNameList MEMO TO A
20、rrayName | MEMVAR 。该命令将字段的内容传送到内存变量或数组中。参数FIELDS FieldNameList指定字段,如果省略 FIELDS FieldNameList,则传送所有字段。如果在字段列表后放一个关键字 MEMO ,则字段列表中可以包含备注字段。TO ArrayName将字段的内容传送到数组中。ArrayName指定接受记录内容的数组。从第一个字段起,SCATTER 按顺序将每个字段的内容复制到数组的每个元素中。如果指定数组的元素比字段数多,则多余数组元素的内容不发生变化。如果指定数组不存在,或者它的元素个数比字段数少,则系统自动创建一个新数组,数组元素与对应字段具
21、有相同的大小和数据类型。MEMVAR把数据传送到一组内存变量而不是数组中。SCATTER 为表中每个字段创建一个内存变量,并把当前记录中各个字段的内容复制到对应的内存变量中。新创建的内存变量与对应字段具有相同的名称、大小和数据类型。内存变量名前有限定符 “m”,以和字段区别。GATHER FROM ArrayName | MEMVAR FIELDS FieldList MEMO 命令的作用与SCATTER恰好相反,但各选项参数及用法相同。11)删除命令:DELETE Scope FOR lExpression1 WHILE lExpression2IN n 。该命令的作用是给记录做删除标记。参
22、数Scope指定要做删除标记的记录范围,DELETE 的默认范围是当前记录 (NEXT 1)。FOR lExpression1指定一个条件,仅给满足逻辑条件 lExpression1 的记录做删除标记。WHILE lExpression2指定一个条件。IN n指定要添加记录删除标记的表所在的工作区。标有删除标记的记录在使用 PACK 前并不从表上做物理删除。标有删除标记的记录可以用 RECALL 恢复(清除标记)。PACK命令从当前表中永久删除标有删除标记的记录,使用 PACK 命令之后,不可能再恢复已删除的记录。PACK 命令需要以独占方式使用表,否则会提示错误。12)APPEND FROM
23、 FileName | ? FIELDS FieldList FOR lExpression Type DELIMITED WITH Delimiter | WITH BLANK | WITH TAB 。参数FileName指定从哪个文件中读入记录。如果给出的文件名不包含扩展名,则将文件默认为.DBF。如果文件是 VFP表,无论 SET DELETED 为何种设置,表中标记为删除的记录也将添加到当前表中。?显示打开对话框,从中可以选择从哪个表中读入记录。FIELDS FieldList指定添加哪些字段数据。FOR lExpression为当前选定表中每一条 lExpression 为“真”(.
24、T.) 的记录追加新记录,直至达到当前选定表的末尾。如果省略 FOR,则整个源文件记录都追加到当前表中。Type指定源文件类型。如果指定的源文件类型不是 VFP表,则必须指定文件类型,如FOXPLUS 、 FOX2X 、 DIF 、MOD、 SDF 、SYLK 、 WK1、 WKS 、 WR1 、 WRK 、 XLS 、 XL5等,但不必包括 Type 关键字。其中SDF是指文本文件,常用于和文本文件接口。13)用当前选定表的内容创建新文件。COPY TO FileName FIELDS FieldList Scope FOR lExpression1 WHILE lExpression2Type DELIMITED WITH Delimiter | WITH BLANK | WITH TAB参数FileName指定 COPY TO 要创建的新文件名。3、程序控制命令与函数1)程序控制命令:VFP中常用的程序控制命令有IFENDIF、FORENDFOR、DO WHILE ENDDO、DO CASEENDCASE 等。它们的用法与其他程序设计语言基本相同,其语法格式如图4-8所示。2)常用函数:在VFP中有大量的函数,常用函数如附录4-1所示。具体的参数和使用方法可参阅VFP的帮助系统。