1、Visual FoxPro程序设计教程,教师:徐红波 E-mail: x_h_,第2章 表的操作,表是Visual FoxPro的基本内容 数据库的管理是对表的管理 表能够实现对数据的管理和加工 表中的数据可以供多个程序共享 VFP中的表分为自由表和数据库表,2.1 表的建立,在VFP中表的建立方式有多种,本节只介绍用可视化的界面建立表和用命令建立表两种方式。建表过程一般可分为三步: 确定表的结构 用界面或命令建表 输入表的内容,表2.1 学生自然情况表,2.1.1 确定表的结构,一个二维表格是由列行组成,表的列称为字段,表的行称为记录。字段是一种变量。字段变量类型可为表1.1数据类型中的所有
2、数据类型。由表2.1确定学生自然情况表的结构:学号C(9)、姓名C(6)、性别C(2)、出生D、团否L、入学成绩N(3)、近照G、备注M。,2.1.2 表的建立、修改、显示,一个表的建立应确定表建立在磁盘中的位置,这样,在建立表后,需要打开表时,按表在磁盘中的位置找到表将表打开。 用VFP可以建立默认路径,一旦默认路径建好,当打开VFP时它自动在默认路径上。,建立默认路径的方法:,通过界面建立 通过命令建立SET DEFAULT TO f:table,1、建表,(1)用界面建表1)用菜单打开表设计器2)用命令打开表设计器格式:CREATE 功能:打开表设计器创建表3)用向导创建表,(2)用命令
3、创建表,格式: CREATE TABLE|DBF (), () ) 功能:创建表 说明:宽度对于数值型可以包括小数的位数。 如学生成绩字段的宽度为5位,其中小数占2位,写成N(5, 2),例2.1 用命令方式创建学生自然情况表,create table 学生 (学号 C(9), 姓名 C(6), 性别 C(2), 出生 D,团否 L,入学成绩 N(3),近照 G,备注 M),2、显示表的结构,1)用界面显示表的结构 2)用命令显示表的结构格式:LIST|DISPLAY STRUCTURE功能:显示当前表的结构,例2.2 显示学生表的结构use 学生 list structure,3、修改表的结
4、构,一个表在建立以后,由于实际需要发生变化,或在建表时表的结构就不对,需要对已存在的表结构进行修改,VFP提供了界面与命令两种方式。(1)用界面修改表的结构1)用菜单打开表设计器修改表结构2)用命令打开表设计器修改表结构格式:MODIFY STRUCTURE功能:打开表设计器。,例2.3 修改学生表的结构,将入学成绩字段改为N(6,2),在备注字段前插入个人简历字段,类型为M。,例2.4 将表的结构回复为表2.1所示的结构,(2)用命令修改,格式:ALTER TABLE ADD ( , ) |ALTER ( , ) |RENAME TO |DROP 功能:修改表的结构 说明:1、ADD子句增加
5、新字2、ALTER子句修改原有字段3、DROP子句删除字段4、RENAME子句将字段2改名为字段2,例2.5,对学生表增加爱好字段C(20) 将爱好字段的类型改为C(30) 将爱好字段改名为特长 删除特长字段alter table 学生 add column 爱好 c(20) alter table 学生 alter column 爱好 c(30)alter table 学生 rename 爱好 to 特长alter table 学生 drop 特长,2.1.3 表的打开、关闭及相关操作,1、表的打开 (1)用界面打开表 (2)用命令打开表格式:USE 功能:打开表,例2.6 用命令开打学生表
6、,USE 学生,2、关闭表,(1)用界面关闭表 (2)用命令关闭表格式:USE功能:关闭当前表,3、表的复制,1)文件的复制命令格式:COPY FILES TO 功能:将文件1复制为文件2在使用命令前文件1必须关闭 例2.7 将学生表复制成学生1表copy files 学生.* to 学生1.* 2)显示文本文件内容命令格式:TYPE 功能:显示文本文件内容,3)表文件的复制命令,COPY TO FOR WHILE FIELDS | FIELDS LIKE | FIELDS EXCEPT TYPE SDF|XLS| DELIMITED WITH | WITH BLANK | WITH TAB功
7、能:将当前表复制成一个由文件名指定的新表或其它类型的文件说明:1)VFP的范围有4种:ALL表示所有记录,NEXT N表示从当前记录算起N条记录,RECORD 表示第N条记录,REST从当前记录开始到表的最后一条记录。若无,系统默认范围为ALL。2)FOR 、 WHILE 都为条件,但FOR与WHILE是有区别的,FOR是在指定范围内进行判断条件是否成立,而WHILE是当在指定范围中若遇到一个条件不满足的就停止操作。当FOR与WHILE同时存在,WHILE优先。,3)FIELDS 用字段名表中的字段形成新文件 4)FIELDS LIKE 用符合通配符的字段形成新文件。通配符可为*与?,*代表任
8、意多个任意字符,?代表一个任意字符。 5)FIELDS EXCEPT 用除了符合通配符的字段形成新文件。 6)TYPE子句,当形成新文件为文本文件时,子句取SDF,数据之间无定界符和分隔符。当取DELIMITED WITH BLANK时空格作为分隔符,无定界符。取DELIMITED WITH TAB时,制表符作为分隔符,双引号为定界符。当形成文件为Excel文件时,子句必须取XLS。,例2.8 将学生表中性别为男的复制为文本文件学生.txt,use 学生 copy to 学生.txt for 性别=男 type sdf type 学生.txt,4)表结构的复制,格式:COPY STRUCTUR
9、E TO FIELDS 功能:将当前表复制为文件名指定的表且只复制结构不复制数据,例2.9 将学生表的结构复制成学生2,use 学生 copy structure to 学生2 use 学生2 list structure,2.2 表的基本操作,2.2.1 记录的显示、追加、删除、修改、插入 2.2.2 记录指针的移动 2.2.3 内存变量与表之间的数据传递 2.2.4 记录的筛选与排序 2.2.5 索引文件的建立 2.2.6 统计与计数 2.2.7 工作区与多表使用,2.2.1 记录的显示、追加、删除、修改、插入,1、记录的显示 (1)用界面显示记录 (2)用命令显示记录格式1:BROWSE
10、 FIELDS ,格式2: LIST|DISPLAY FIELDS FOR WHERE OFF TO PRINT PROMPT | TO FILE 功能:按范围与条件要求显示记录内容。 说明: 1)LIST是滚动显示,即使满屏也不停止;DISPLAY是分屏显示。 2)当省略范围子句时LIST默认范围为ALL,而DISPLAY默认范围是当前记录,即NEXT 1。 3)若使用OFF子句,记录号不显示。 4)TO PRINT子句,结果输出到打印机,若再用PROMPT在打印前会出现打印机设置对话框,可对打印机进行相应的设置。 5)TO FILE 子句,结果输出到由文件名指定的文件,文件的扩展名默认为.
11、txt。,例2.10 显示学生表:显示全部内容,显示性别为男的学生,显示性别为女且输出到g1.txt文件中,use 学生 browse browse fields 学号, 姓名, 性别, 出生 list for 性别=男 list for 性别=女 to file g1.txt type g1.txt,2、追加记录,(1)用界面追加记录 (2)用命令追加记录格式1:APPEND BLANK功能:向当前表中追加记录。若选BLANK是追加一条空白记录,此空白记录当时不可编辑,用REPLACE等命令可对其进行编辑。,格式2:APPEND FROM FIELDS FOR 功能:从文件名指定的表文件中将
12、符合条件的记录追加到当前表的尾部。,例2.11 在学生2表中追加一条空记录。将学生1表中性别为男的学生记录追加到表学生2中,use 学生2appendappend from 学生1 for 性别=男,3、删除表中记录,删除表中的记录: 1、逻辑删除:只是将记录加了删除标记 2、物理删除:将具有删除标记的记录真正从表中删除 (1)逻辑删除与恢复1)用界面为记录加删除标记或去掉删除标记2)用命令为记录加删除标记与去掉删除标记,逻辑删除命令格式: DELETE 范围 FOR 功能:对满足条件的记录加删除标记,若范围省略,默认范围为当前记录即NEXT 1. 记录恢复命令格式:RECALL 范围 FOR
13、 功能:为符合条件的记录去掉删除标记,若范围省略,默认范围为当前记录即NEXT 1.,(2)物理删除记录:1)用界面进行物理删除2)用命令进行物理删除格式:PACK功能:将带有删除标记的记录,从表中真正删除3)物理删除表中所有记录格式:ZAP功能:将表中所有记录删除,只保留表的结构,例2.12 将学生2表中性别为女的记录逻辑删除,物理删除,将学生2表中的记录全部物理删除,use 学生2 delete all for 性别=女 list pack list zap list list structure,4、修改记录,(1)用界面修改记录1)显示-浏览2)在命令窗口上用命令EDIT或CHANGE
14、,(2)用命令修改记录,格式: REPLACE WITH , WITH FOR WHILE 功能:在指定范围内将符合条件的记录中的相关字段用相关表达式来替换。若省略范围,默认范围为NEXT 1,例2.13 将学生1表中入学成绩在400500分之间的加10分,replace all 入学成绩 with 入学成绩+10 for 入学成绩=400 and 入学成绩=500,5、插入记录,格式:INSERT BEFORE BLANK 功能:插入一条记录,若无BEFORE字符,则在当前记录后插入一条新纪录;当有BEFORE子句时在当前记录之前插入一条新纪录。当有BLANK子句时插入一条空白记录,当时不能
15、编辑,可用REPLACE、EDIT、CHANGE等命令进行编辑,2.2.2 记录指针的移动,1、用界面方式移动记录指针 2、用命令方式移动记录指针 1)绝对移动:格式:GO |功能:实现记录指针的绝对移动。当用TOP子句时指针指向第一条记录;当用BOTTOM子句时指针指向最后一条记录。当用记录号子句时指针指向记录号确定的记录,2)相对移动:格式:SKIP +|-N功能:N可为正、负整数,当N为正数时指针从当前记录向表尾方向移动N条记录。当N为负数时,指针从当前记录向表头方向移动N条记录,当省略N时,默认N为1.,例2.14 go与skip的应用,clear use 学生 go top go b
16、ottom go 2 skip 1 skip -1,2.2.3 内存变量与表之间的数据传递,1、单条记录与内存变量的数据传递 (1)将当前记录字段数据传送给内存变量SCATTERFIELDS |FIELDS LIKE |FIELDS EXCEPT MEMO TO |MEMVAR,例2.15 表与变量数据的传送应用,clear dimension a(8) use 学生2 go 3 scatter memvar ?m.学号, m.姓名, m.性别, m.出生, m.团否, m.入学成绩 go 5 scatter to a ?a(1), a(2), a(3), a(4), a(5), a(6),
17、a(7), a(8),(2)将内存变量数据传给当前记录GATHER FROM | MEMVAR FIELDS | FIELDS LIKE | FIELDS EXCEPT MEMO,例2.16 内存变量与表之间数据传送的应用,use 学生2 append from 学生1 append blank dimenson a(8) a(1)=105010106 a(2)=王小丽 a(3)=女 a(4)=1980-10-2 a(5)=.t. a(6)=100 gather from a list append blank 学号=105010107 姓名=刘丽华 性别=女 出生=1981-10-3 gat
18、her memvar list,2、将多条记录与数组传送 (1)将多条记录数据传送给数组 COPY TO ARRAY FIELDS FOR WHILE ,例2.17 多条记录数据传送给数组,use 学生2 dimension b(2, 8) copy to array b ?b(1, 1), b(1, 2), b(1, 3), b(1, 4), b(1, 5), b(1, 6), b(1, 7), b(1, 8) ?b(2, 1), b(2, 2), b(2, 3), b(2, 4), b(2, 5), b(2, 6), b(2, 7), b(2, 8),(2)将数组数据追加到表中APPEND
19、 FROM ARRAY FOR FIELDS ,例2.18 数组数据追加给表,use 学生2 append from array b list,2.2.4 记录的筛选与排序,1、记录的筛选 (1)设置筛选记录条件命令1)用界面方式2)用命令方式格式:SET FILTER TO 功能:设置访问当前表中记录的条件。当省略时,取消所有条件。,例2.19 过滤器命令应用,use 学生1 set filter to 性别=女 list set filter to list,(2)查找定位命令,格式:LOCATE FOR 功能:查找符合条件第一个记录的位置,指针指向该记录。若表中无符合条件的记录,指针指向
20、表尾。 说明:若符合条件的记录有多条,可用CONTINUE继续查找下一个符合条件的记录。,例2.20 locate命令应用,use 学生2locate for 性别=男?found()displaycontinuedisplay,2、排序,在建表时没有按一定顺序建或者按某个字段的顺序建表。在实际应用中需要对字段的顺序加以改变,或需要按另外一种或多种字段进行有序排列的表。如何解决这类问题,VFP用sort排序命令来解决。 VFP中的排序是指根据条件,由已存在表的内容,产生另一个新的排序表,而原表不变。,格式:SORT TO ON /A|/D/C , /A|/D/D 范围 FOR WHILE FI
21、ELDS | FIELDS LIKE | FIELDS EXCEPT 功能:在指定范围内将符合条件的记录,按字段的升序或降序进行排序,将排序的结果形成一个新的表。 说明:1)ON子句中为第1排序字段, 为第2排序字段。/A/B表示升序或降序排序,默认为升序。/C不区分字段中的大小写字母。2)M,G字段不能用于排序字段。,例2.21 sort命令应用,use 学生1sort to 学生3 on 出生use 学生3list,排序命令解决对已存在表按实际需要,按某一个字段或多个字段排序的问题。由于它使原表不变而又形成了一个新表,这样就在磁盘中造成了很大的冗余,浪费了存储空间。如何解决这样的问题,VF
22、P用索引文件来解决。,2.2.5 索引文件的建立 1、索引的概念,索引是根据表中一个或多个字段建立的逻辑顺序的文件。 索引不生成表文件,并不改变表的物理位置。 建立索引的字段称为关键字。 索引文件的内容只是关键字与记录号,占用存储空间与排序表相比要小得多,存储的是索引与表的映射关系。 它就像一本书的目录一样,由标题查到在书中的页码,查找的速度很快。 当对表记录进行增、删、改操作时,索引文件会随着表而更新。,索引文件分类:,单索引文件:只存储一个索引的索引文件,扩展名为.IDX 标准单索引文件 压缩单索引文件 复合索引文件存储多个索引的索引文件,扩展名为.CDX 结构化复合索引文件 非结构化复合
23、索引文件,索引方式:,主索引: 关键字不可重复 候选索引:关键字不可重复 唯一索引:关键字可重复,与旧版本兼容 普通索引:关键字可重复,2、建立索引,用界面建立结构化复合索引 单字段索引 复合字段索引 用命令建立索引INDEX ON TO | TAG OF FOR COMPACT ASCENDING|DESCENDING UNIQUE|CANDICATEADDITIVE 功能:建立索引文件或增加索引标识,说明: 1)索引关键字可以是单个字段名,或用字段名组成的表达式。 2)TO子句是建立单索引文件。 3)TAG是建立复合索引标识,当不选OF子句时建立的是与表同名的结构化复合索引文件,当选OF子
24、句时建立的是非结构化复合索引文件。 4)COMPACT用来指定单索引文件是压缩的。复合索引总是压缩的。 5)ASCENDING、DESCENDING子句表示升、降序,默认为升序。 6)UNIQUE子句建立唯一索引。 7)CANDIDATE子句建立候选索引。 8)ADDITIVE子句建立该索引文件是不关闭以前打开的索引文件,默认是关闭以前打开的索引文件。,例2.22 索引的应用,use 学生 index on 学号 to x1 unique list index on 性别+str(入学成绩) to x2 list index on 入学成绩 tag s1 descending list ind
25、ex on 姓名 tag s2 candidate index on 姓名 tag s3 of x3,3、索引的使用,(1)打开索引文件格式1:SET INDEX TO ADDITIVE功能:打开当前表索引说明:1)在中第一个为主控索引文件2)省略ADDITIVE子句关闭当前工作区除结构化复合索引以外的所有索引文件格式2:USE INDEX 功能:打开表与相应的索引文件,例2.23 打开索引文件应用,use 学生 set index to x1.idx, x2.idx, x3.cdx,(2)设置主控索引格式:SET ORDER TO | | TAG OF ASCENDING | DECENDI
26、NG 功能:设置主控索引文件 1)是指定主控索引文件或索引标识编号。先按USE或INDEX出现顺序打开的单索引文件,然后按创建顺序指定结构化复合索引表示的编号,最后按创建顺序指定非结构化复合索引的编号。 2)是指定此索引文件为主控索引 3)TAG OF 指定结构化、非结构化复合索引文件中的索引标识为主控索引。OF 适用于打开非结构化复合索引文件。 4)无任何选项或SET ORDER TO 为取消主控索引 5)ASCENDING、DESCENDING用于重新设置主控索引文件升或降序。,例2.24 set order to应用,set index to x1.idx, x2.idx, x3.cdx
27、 list set order to s1 list set order to s3 of x3.cdx list set order to use,(3)删除索引 格式: DELETE TAG ALL | , 功能:删除打开的复合索引文件的索引标识,例2.25 DELETE TAG应用,use 学生1index on 学号 to x4index on 性别 tag x5delete tag alluse,(4)索引的更新格式:REINDEX COMPACT功能:重建当前打开的索引文件。COMPACT子句可将已打开的.IDX索引文件转为压缩单索引文件,4、索引中的查询命令,索引应用于对关键字的
28、快速查询,VFP中有两个索引查询命令,FIND与SEEK (1)FIND命令格式:FIND |功能:在索引关键字中查找与指定的字符串或数值相匹配的第一条记录。若找到,指针指向此记录,否则指针指向表尾。用FOUND()函数判断是否查找到。若用字符变量查找必须用&运算符。若要查找下一个匹配记录可用SKIP命令。字符串可不用定界符,但字符串若有前导与尾部空格要加定界符。,例2.26 find应用,use 学生index on 姓名 to x6find 李立明?found()displayx=刘美文find &x?found()displayindex on 入学成绩 to x7find 620?fo
29、und()displayuse,(2)SEEK命令格式:SEEK 功能:在索引关键字中查找与表达式相匹配的第一条记录。当查找与之匹配的下一条记录时可用SKIP命令。当表达式为字符串时要求用定界符。表达式可为关键字所能取得任何一种类型。,例2.27 seek的应用,use 学生index on 性别 to x6seek “男”?found()displayindex on 出生 tag s3seek 1979-3-21?found()displayuse,2.2.6 统计与计数,1、计数命令 格式:COUNT FOR TO 功能:计算当前表中指定范围内满足条件的记录个数,且存于中。缺省范围是指表
30、的所有记录,例2.28 count应用,use 学生count to x1count for 性别=女 to x2?x1, x2use,2、求和命令 格式:SUM FOR TO |ARRAY 功能:在当前表中在指定范围内对符合条件的数值表达式表中的各表达式求和,且将结果一次存入内存变量表中的变量或数组中。缺省范围是指表的所有记录。,例2.29 建立学生成绩表、学生成绩F表,并统计各科成绩的总分,create 学生成绩index on 学号 tag a1sum 数学,VFP,英语 to x1, x2, x3?x1, x2, x3create 学生成绩Fsum 原理,网络,C to array a
31、?a(1),a(2),a(3)use,3、求平均值命令 格式:AVERAGE FOR TO | ARRAY 功能:在当前表中在指定范围内对符合条件的数值表达式表中的各表达式求平均值,且将结果依次存入内存变量表中的变量或数组中。缺省范围是指表的所有记录。,例2.30 对学生成绩、学生表中各数值字段求平均值,clear use 学生成绩 average 数学, VFP, 英语 to y1, y2, y3 ?y1, y2, y3 average 数学, VFP, 英语 to array b ?b(1), b(2), b(3) use 学生 average 入学成绩 to z1 ?z1,4、计算命令
32、格式:CALCULATE FOR TO | ARRAY 功能:在当前表的指定范围内对符合条件的数值表达式表中的各数值表达式进行计算。,例2.31 求学生成绩表中数学、VFP的总分,VFP最高与最低分,clear use 学生成绩 calculate sum(数学), sum(VFP) to z1, z2 ?z1, z2 calculate min(VFP), max(VFP) to array a ?a(1), a(2) use,5、分类汇总命令 格式:TOTAL TO ON FIELDS FOR 功能:对已排序或已索引过的表,在指定范围内符合条件的记录,按指定关键字相同的那些记录进行分组并对
33、数值字段列向求和,对于非数值字段取组内第一个记录中的字段的值,每组形成一个新纪录,将这些记录按原来的顺序形成由文件名指定的新表。,例2.32 建一个学生成绩表1,内容在表2.4基础上增加姓名与性别字段,该两个字段内容参照表2.1建立。将学生成绩表1按性别索引分类汇总,create 学生成绩1 index on 性别 to x9 total to 学生成绩h on 性别 use 学生成绩h list use,2.2.7 工作区与多表使用,在实际应用中很多情况都需要多表同时打开操作,同时从多表中获取有价值的数据。这类问题VFP用工作区方式给予解决 一个工作区只能打开一个表,但VFP提供32767个
34、工作区,因此可以打开多个表。,1、工作区,(1)指定表所在的工作区USE IN 工作区号 1)工作区号取值可为1-32767,若取0,则选择一个未使用的最小编号工作区为当前工作区。工作区号1-10也可用A-J字母表示。 2)SELECT()函数可以返回当前工作区号。,(2)指定工作区命令 格式:SELECT 功能:由工作区号指定一个当前工作区 (3)关闭工作区中的表 格式:CLOSE ALL 功能:关闭所有工作区打开的表,选择工作区1为当前工作区,例2.34 select的应用,select 1 use 学生专业 index on 学号 to xs1 list select 0 use 校专业
35、 list index on 专业号 tag xs2 select 3 use 课程 list close all,(4)工作区字段互访 格式:-字段名 | .字段名 功能:在当前工作区访问非当前工作区中的字段,例2.35 工作区字段访问应用,select 1 use 学生专业 use 校专业 in 2 use 课程 in 3 select 1 list 学号, 姓名, 专业号, B-专业号, B-专业名, C-课程号, C-课程名, C-学分 close all,2、多表使用,(1)表的关联表的关联是指在两个表之间当一个表(父表)的记录指针移动时,另一个表(子表)的记录指针根据父表的要求指向
36、子表的相应记录上。用这种关联控制或将表之间建立关系从而实现多表同时使用,在多表之间同时获取有价值的数据的目的。,(2)关系1)一对一关系由关联条件,父表只有一条记录与子表只有一条记录相对应2)一对多关系由关联条件,父表只有一条记录与子表多条记录相对应3)多对一关系由关联条件,父表有多个记录与子表只有一个记录相对应。4)多对多关系由关联条件,父表有M条记录与子表有N条记录相对应。,(3)用界面进行关联 (4)用命令建立关联 格式:SET RELATION TO INTO ADDITIVE 功能:以当前表为父表,以为关联条件与别名1表为子表建立关联。 说明:1)若无任何选项,将已建立的关联删除2)
37、ADDITIVE子句是在建立关联时保留以前建立的关联,例2.36 用命令建立关系的应用,clear select 1 use 学生 index on 学号 tag t1 additive select 2 use 学生成绩 index on 学号 tag t2 additive select 1 set relation to 学号 into 学生成绩 additive list 学号, 姓名, B-数学, B-VFP, B-英语 browse fields 学号, 姓名, B-数学, B-VFP, B-英语 set realtion to close all,(5)一对多关联的建立 格式:S
38、ET SKIP TO 功能:以当前表为父表,以为子表建立一对多关系。若无任何选项,取消一对多关系,而由SET RELATION建立的一对多关系任存在。,例2.37 用命令建立一对多关系的应用,select 2 use 选修 index on 学号 tag t3 additive select 1 use 学生专业 index on 学号 tag t3 additive select 1 set relation to 学号 into 选修 additive set skip to 选修 list browse fields 学号,姓名,B-课程号,B-成绩 close all,2.3 小结,本章介绍了表的建立、表的基本操作。在VFP中表分为两种,一种为自由表,一种为数据库表。本章介绍的自由表,它独立于程序,具有共享性,因此在VFP中表的操作显得格外重要。本章介绍了用界面与命令两种建表方式,界面操作对于初学者来讲,非常方便。命令主要在后续章节中可运用到程序中,最终形成自动化工作方式。,