2023年12月16日发(作者:)

第2章 表的操作

表是VFP基本内容。数据库的管理最终是对表的管理。表是对数据进行有效的加工、管理,使数据更能显示出它的价值,由于表可以独立于程序,因而表使得数据得以共享,同时使数据得到充分的利用。VFP中的表可分为自由表、数据库表两种。本章讲的表是针对自由表而言的,数据库表将在后续章节中介绍。本章主要介绍表的建立、表的基本操作。

2.1 表的建立

在VFP中表的建立方式有多种。本节中只介绍可视化的界面建立表和用命令建立表两种方式,其他几种方式将在后续章节中逐步介绍。建立表的过程一般可分为三步。第一步要确立表的结构,第二步用界面或用命令开始建表,以上步骤实际上就是对表结构的定义。第三步输入表的内容。表2.1所示是学生自然情况表。

表2.1 学生自然情况表

学号

C(9)

105010101

105010102

105010103

105010104

105010105

105010201

105010202

105010203

105020101

105020101

姓名

C(6)

刘晓华

李立明

王丽华

赵文学

刘美文

张小峰

王艳丽

刘英

王雪梅

李绕勇

性别

C(2)

出生

D

08/02/80

06/23/79

03/21/79

12/11/80

11/12/80

08/12/81

02/23/80

11/21/80/

12/03/80

12/22/80

团员 入学成绩 近照

L N(3) G

F

T

T

F

T

F

T

F

T

T

420

480

460

500

680

650

620

510

600

600

gen

gen

gen

gen

gen

gen

gen

gen

gen

gen

备注

M

meno

meno

meno

meno

meno

meno

meno

meno

meno

meno

VFP中表的命名规则已在1.3.2中介绍过了,表的扩展名为.dbf。下面就学生自然情况表介绍表的建立及相关知识。

2.1.1 确定表的结构

一个二维表是由它的列项与行项组成,从1.2.2节中已经掌握了表的列项称为字段,表中内容一行称为一个记录。学段也是一种变量,它的命名规则已在前面介绍了。字段变量类型可为表1.1数据类型中的所有数据类型。由表2.1来确定学生自然情况表的结构:学号C(9)、姓名C(6)、性别C(2)、出生D、团否L、入学成绩N(3)、近照G及备注M。

2.2.2 建表、修改、显示

一个表的建立应确定表建立在磁盘中的位置,这样,在建立表后,需要打开表时,按表在磁盘中的位置找到表将表打开。为了叙述的方便本书规定用“―〉”表示进行下一步操作。

在X盘上已经建立一个Y文件夹,X盘表示任意盘,Y文件夹表示任意名的文件夹。例如在D盘建立一个名为学生的文件夹,也可由用户自定义文件夹的名。建文件夹可通过win的我的电脑或资源管理器等建立。如果用户不给出路径,VFP可以建立默认路径,当打开VFP时它自动在默认路径上。

下面给出默认路径的方法:

单击工具菜单->[选项],打开选项对话框,如图2.1所示。->[文件位置]选项卡->选[默认目录]->[修改]按钮,打开[更改文件位置]对话框->使用[默认目录]复选框->在定位默认目录文本框中输入路径。如D:学生路径。->[确定],关闭更改位置对话框->返回图2.1[确定],关闭选项对话框,此时完成文件的默认路径的建立。

图2.1 选项对话框

除了用上述方法建立默认路径外,还可以通过命令窗口建立。如,SET DEFAULT TO D:学生。

1. 建立表

(1)用界面建表

1)用菜单或工具栏打开表设计器创建表

操作步骤:

选定[文件]菜单->[新建]或常用工具栏中的新建按钮打开[新建]对话框,如图2.2所示。

图2.2 新建对话框

在新建对话框文件类型中,选[表]->[新建文件],打开创建对话框,如图2.3所示。

图2.3 创建对话框

在输入表各文本框中输入一个表明,如学生->[保存],打开表设计器对话框,如图2.4所示。

图2.4 表设计器对话框

选字段选项卡->在字段各列中输入字段名,如学号->在类型列中选类型,如字符型->在宽度列中选宽度,如图2.6。

图2.6 表设计器对话框

在小数位列中可输入少数位,如果字符型是不能输小数位的。若需要索引,可在索引中选排列方式。若需要字段接受空值NULL,就可以选NULL。

VFP支持NULL,NULL是一个不确定的值,它不同于0、空串、空格。

前面的一系列操作就完成了一个字段的定义。接着单击下一行字段各列处,就可以开始对下一个字段进行定义,直到将表结构中的所有字段的定义完成。

当结构建立后,单击[确定],打开确定对话框如图2.7所示,若选[是]立即输入记录,选否,输入记录。

图2.7 确认对话框

对于表中G型字段,M型字段内容输入,可双击该字段内容处或按CRTL+PGDN打开G型字段可以输入图像、声音等,也可以输入OLE对象,具体步骤是在进入G型字段编辑窗口中以后,选编辑菜单->[插入对象](或粘贴或选择性粘贴)->在对象类型中选择需要的类型->[确定]。

对G型,M型字段为空时内容显示gen与meno。若G型M型字段不为空则显示Gen与Meno。若向浏览G型与M型字段必须进入相应的编译窗口。

2)用命令打开表设计器

格式:CREATE <表名>

功能:打开表设计器创建表。

例如在命令窗口中输入create学生回车此时表被打开,就可以按上面的方法建立表了。

3)用向导创建表

操作步骤:

文件菜单—>[新建],打开新建对话框,在文件类型中选表->向导,打开,

打开表向导对话框,如图2.8所示。

图2.8 步骤1字段选取对话框

在样表中选表,若无表可选可用[加入按钮]将需要的表加到样表列表框中->从可用字段中讲需要的字段一道选定字段列表框中->下一步,进入表向导步骤选数据库如图2.9所示

图2.9

下一步,进入步骤2修改字段设置如图2.10所示,此时可对所在创建的表字段定义进行修改

图2.10 步骤2修改字段设置

下一步,进入步骤3为表索引,如图2.11所示

图2.11 步骤3为表建索引

为表选出关键字和索引字段->下一步,进入步骤4完成,如图2.12所示

图2.12 步骤4完成

选择一种保存表的选项->完成,打开另存对话框,->在输入表各文本框中输入一个表名。此时完成了用向导创建表的过程。

(2)用命令创建表

格式:create table | DBF <表名> (<字段名1> 类型 (<宽度>) [<字段名2> <类型> (<宽度>) ……])

功能:创建表。以命令不用表设计器创建表。

说明:宽度对于数值型要包括小数。如学生成绩5位,小数占2位,可写N(5, 2)。

例2.1 用命令方式创建表2.1中的学生自然情况表,表名为学生。

create table 学生 (学号 c(9), 姓名 c(6), 性别 c(2), 出生 d, 团否 l, 入学成绩 n(3), 近照 g,

备注 m)。

2. 显示表的结构

1)用界面显示表结构

步骤:显示菜单->表设计器

2)用命令显示表结构

格式:LIST | DISPLAY STRUCTURE

功能:显示为前一打开的表的结构。

例2.2 显示学生表的结构

LIST STRUCTURE

3. 表的结构修改

一个表在建立以后,有时由于实际需要发生了变化,或在建表时标的结构就不对,需要全面对

已存在的表结构进行修改,VFP提供了界面与命令两种方式。

(1)用界面修改表的结构

1)用菜单或工具拉开表设计器修改表结构在表一打开的情况下修改表结构步骤:单击显示菜单—〉打开表设计器。如图2.13所示—〉对字段意义进行修改。

图2.13 表设计器

2)用命令打开表设计器修改结构

格式:MODIFY STRUCTURE

功能:打开标设计器。从表设计器框中修改当前使用的表结构。

例2.3 修改学生表的结构,将综合成绩字段改为N(6.2)

显示菜单—〉打开表设计器—〉选定综合成绩字段按题要求进行修改—〉选定备注段,按插入按钮将个人简历全部分段定义—〉单击[确定] ,打开[确认对话框]—〉选是。

例2.4 将表的结构恢复为表2.1所示的结构

在命令窗口中输入MODI STRUC选定综合成绩字段改为N(5.1)

选定个人简历字段—〉单击[删除]—〉[确定]。打开修改确认对话框—〉选是。

(2)用命令修改

格式:ALTER TABLE <表名>ADD∣ALTER [LOLUMN] <字段名> <字符类型> [(<字段宽度>[,

<小数位数>] DROP [COLNME] <字段名1> REMAME <字段名2> TO <字段名3>

功能:修改表的结构

说明 1)ADD [column]子句 用于增加新的字段。

2)ALTER [column]子句 用于修改原有字段。

3)DROP [column]子句 用于删除字段。

4)RENAME [column]子句 用于将字段2指定的字段名改为字段3指定的字段名。

例2.5 ①对学生表增加爱好字段C(20);

②将修改字段暗号字段为C(30);

③将爱好字段按名改为特长;

④删除特长字段。

①在命令窗口中输入

ALTER TABLE 学生 ALTER COLUMN 爱好 C(20) ↙

②显示->表设计器->确定 ↙

③在命令窗口中输入

ALTER TABLE学生 ALTER COLUMN 爱好 C(30) ↙

④显示->表设计器->确定 ↙

⑤ALTER TABLE 学生 ALTER COLUMN 爱好 TO特长 ↙

⑥显示->表设计器->确定 ↙

⑦ALTER TABLE 学生 PROP 特长 ↙

⑧显示->表设计器->确定 ↙

2.1.3 表的打开,关闭及相关操作(表的复制等)

1.表的打开

(1)用界面打开表

单击文件菜单—〉打开(或常用工具拉单击打开按钮)打开了打开对话框如图2.14所示。在文件类型中选类型为表(*.dbf)—〉选所示打开的表→确定

(2) 用命令打开表

格式:USE 表名

功能:打开表

例2.6 用命令打开学生表

在命令窗口输入USE 学生

2.关闭表

(1)用界面关闭表

单击文件→关闭

(2)用命令关闭表

格式:USE

功能:关闭当前表

3.表的相关操作

(1)表的复制

1)文件的复制命令

格式:COPY FILES <文件1> TO <文件2>

功能:将文件1复制为文件2。在使用命令前文件1必须关闭。

例2.7 将学生.dbf复制成学生

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]]]

功能:将当前表复制成一个由文件名指定的新表或其它类型的文件。

说明:

①<范围> VFP的范围有4种:ALL表示所有记录,NEXT N 表示从当前记录算起N条记录,RECORD 表示第N条记录,REST从当前记录开始到表的最后一条记录。若无<范围>,系统默认范围为ALL。

②FOR <条件>、WHILE <条件>都为条件,但FOR与WHILE是有区别的,FOR是在指定范围内进行判断条件是否成立,而WHILE是当在指定范围若遇到一个条件不满足的就停止操作。当FOR与WHILE同时存在,WHILE优先。

③FIELDS <字段名表> 用字段名表中的字段形成新文件。

④FIELDS LIKE <通配符>用符合通配符的字段形成新文件。通配符可为*与?,*代表任意多个任意字符,?代表一个任意字符。

⑤FIELDS EXCEPT <通配符>用除了符合通配符的字段形成新文件。

⑥TYPE子句,当形成新文件为文本文件时,子句取SDF,数据之间无定界符和分隔符。当取DELIMITED WITH<定界符>时,逗号作为分隔符,由<定界符>指定的字符作为定界符。取DELIMITED WITH BLANK空格作为分隔符,无定界符。取DELIMITED WITH TAB时,制表符作为分隔符,双引号为定界符。当形成新文件为Excel文件时,子句必须取XLS。

例2.8 将学生表中性别为男的复制为文本文件“学生.txt”

USE 学生

COPY TO 学生.txt FOR 性别=’男’ TYPE SDF

TYPE 学生.txt

(2) 表结构的复制

格式:COPY STRUCTURE TO <文件名> [FIELDS <字段名表>]

功能:将当前表复制为文件名指定的表且只复制结构不复制数据。

例2.9 将学生表的结构复制成学生2

USE 学生

COPY STRUCTURE TO 学生2

USE 学生2

LIST STRUCTURE

2.2 表的基本操作

2.2.1 记录的显示、追加、删除、修改、插入

1.记录的显示

(1)用界面方式显示表中记录

在表打开的前提下,显示→浏览,此时将显示当前表中记录内容。

(2)用命令显示记录

格式1:BROWSE [FIELDS <字段名表>]

功能:以窗口方式显示当前表的内容。

说明:<字段名表>中的字段包含若干选项:

<字段名> [:R] [:<数值表达式>] [:V=<表达式1> [:F] ] [:E=<字符表达式1>] [:P=<字符表达式2>]

[B:=<表达式2>, <表达式3>[:F]] [:H=<字符表达式3>] [:W=<逻辑表达式1>]

1):R表示该字段为只读。

2):<数值表达式>表示该字段的显示栏的宽度。

3):V=<表达式1>[:F][:E=<字符表达式1>]为检验选项。

:V=<表达式1> 表示字段级数据校验,<表达式1> 为校验条件。

:F是不管字段值修改与否都进行校验。

:E=<字段表达式1> 为用户为校验设置的出错信息。

4):P=<字符表达式2> 表示格式代码列表。如表2.2所示,控制浏览窗口显示和输入数据,它也是一种掩码。

表2.2掩码表

掩码

x

9

#

$

*

.

,

含义

允许输入任何字符

只允许输入数字

允许输入数字、空格、+、-

显示(SET CURRENCY命令指出的)货币号

在指定宽度中,数值前显示*号

指定小数点位置

用来分隔小数点左边的数字

5):B=<表达式2> <表达式3> [:F] 该字段用来对指定字段的范围进行检查。<表达式2>为下界,<表达式3>为上界。:F为不管字段是否修改都校验。

6):H=<字符表达式3> 默认字段名为栏目名,若用此选项<字符表达式3>为栏目名。

7):W=<逻辑表达式1> 设置光标进入该字段的条件。当<逻辑表达式1>值为.T.,表示可以进入该字段,否则不可以。

格式2:LIST | DISPLAY [[FIELDS] <字段名表>] [<范围>] [FOR <条件>] [WHILE <条件>]

[OFF] [TO PRINT [PROMPT] | TO FILE <文件名>]

功能:按范围与条件要求显示记录内容。

说明:

1)LIST是滚动显示,即使满屏也不停止;DISPLAY是分屏显示。

2)当省略范围子句时,LIST默认范围为ALL,而DISPLAY默认范围是当前记录,即NEXT1。

3)若选用OFF子句,记录号不显示。

4)TO PRINT 子句,结果输出到打印机,若再用PROMPT 在打印前会出现打印机设置对话框,可对打印机进行相应的设置。

5)TO FILE<文件名>子句,结果输出到由文件名指定的文件,文件的扩展名默认为.txt。

例2.10 显示学生表:显示全部内容,显示性别为男的学生,显示性别为女且输出到文件中。

USE 学生

BROWSE

BROWSE FIELDS 学号:R,姓名,性别,出生:H='出生年月日'

LIST FOR 性别='男'

LIST FOR 性别='女' TO FILE

TYPE

2.追加记录

(1)用界面追加记录

在表打开前提下,显示→浏览(显示打开的表)→显示→追加方式,此时可输入新的记录内容。

(2)用命令追加记录

格式1:APPEND [BLANK]

功能:向当前表中追加记录。若选BLANK是追加一条空白记录,此空白记录当时不可以编辑,用REPLACE等命令可对其进行编辑。

格式2:APPEND FROM <文件名> [FIELDS <字段名表>[FOR <条件>]]

功能:从文件名指定的表文件中将符合条件的记录追加到当前表的尾部。

例2.11 在学生2表中追加一条空记录。将学生1表中性别为男的学生记录追加到学生2表中。

在命令窗口输入:

USE 学生2

APPEND

APPEND FROM 学生1 FOR 性别=’男’

LIST

3.删除表中记录

删除表中的记录有三种方法:一种为逻辑删除,这种删除只是将记录加了删除标记。第二种删除是物理删除,这种是将具有删除标记的记录真正从表中删除。第三种是物理删除表中所有记录,剩下一个空表。

(1)逻辑删除与恢复

1)用界面为记录加删除标记或去掉删除标记

在表打开前提下,显示→浏览打开浏览窗口,如图2.13所示,单击记录左边小方框,使该方框变深色,即加删除标记。若要恢复记录,再次单击神色方框使其变浅即可。

图2.13 添加删除标记

2)用命令为记录加删除标记与去掉删除标记

记录逻辑删除命令格式:DELETE [范围] [FOR<条件>]

功能:对满足条件的记录加删除标记,若范围省略,默认范围为当前记录即NEXT1。

记录恢复命令格式:RECALL[范围][FOR<条件>]

功能:为符合条件的记录去掉删除标记,若范围省略,默认范围为当前记录即NEXT1。

(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

(2)用命令修改记录

格式:REPLACE [<范围>] <字段名1> WITH <表达式1> [, <字段名2> WITH <表达式2>…]

[FOR <条件>] [WHILE <条件2>]

功能:在指定范围内将符合条件的记录中的相关字段用相关表达式来替换。若省略范围,默认范围为NEXT1。

例2.13 将学生1表中入学成绩在400-500分之间的加10分。

REPLACE ALL入学成绩 WITH 入学成绩+10 FOR 入学成绩>=400 AND 入学成绩<=500

5.插入记录

格式:INSERT [BEFORE] [BLANK]

功能:插入一条记录,若无BEFORE子句时,在当前记录后插入一条新记录;当有BEFORE子句时,在当前记录之前插入一条新记录。当有BLANK子句时插入一条空白记录,当时不能编辑,可用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的应用

USE 学生

GO TOP

?RECNO()

?BOF()

DISPLAY

SKIP -1

?RECNO()

?BOF()

DISPLAY

GO BOTTOM

?RECNO()

?EOF()DISP

?RECNO()

?EOF()

DISPLAY

GO 4

SKIP -2

?RECNO()

SKIP 3

?RECNO()

2.2.3内存变量与表之间的数据传递

1.单条记录与内存变量的数据传递

1)将当前单个记录数据传送给内存变量

格式:SCATTER [FIELDS <字段名表>|FIELDS LIKE <通配字段名>|FIELDS EXCEPT <通配字段名>][MEMO] TO <数组名>[BLANK]|MEMVAR[BLANK]

功能:将当前表中当前记录的字段数据依次传送给内存变量。

说明:

1)TO <数组名>子句是字段数据传给由数组名指定的数组,若数组元素个数不够,系统自动为其扩充元素个数,若此数组没定义,系统将自动创建数组,若后面选BLANK,系统将自动创建一个与字段类型、大小相同的空值数组。

2)使用MEMVAR子句时将字段数据送给同名简单内存变量,这些简单变量由系统自动创建,若后面有BLANK,系统自动创建与字段同名的空值变量。

例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), a(7), a(8)

(2)将内存变量数据传给当前表的当前记录

格式:GATHER FROM <数组名>|MEMVAR[FIELDS <字段名表>|FIELDS LIKE <通配字段名>|FIELDS EXCEPT <通配字段名>][MEMO]

功能:将内存变量数据依次传送给当前表中的当前记录。

说明:

1) 当数组元素个数多于字段个数,多出的元素不传送。当元素个数少于字段个数,多出的字段值不改变。

2) 简单内存变量数据必须传送给同名字段,否则不传送。

3) 若用FIELDS<字段名表>子句,只有列在字段名表中的字段,内存变量数据才传送。

4) 省略MEMO子句时不对备注字段传送,即使有MEMO子句也不对通用字段传送。

例2.16 内存变量与表之间数据传送的应用。

USE 学生2

APPEND FROM 学生1

APPEND BLANK

DIMENSION 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}

GATHER MEMVAR &&简单内存变量数据传给字段

LIST

2.将多条记录与数组传送

(1)将多条记录数据传送给数组

格式:COPY TO ARRAY <数组名>[FIELDS <字段名表>] [<范围>] [FOR<条件>] [WHILE<条件>]

功能:将当前表中符合条件的记录的字段数据传给由数组名指定的数组中,但不复制M、G字段。

说明:

1)若数组没定义,系统会自动创建数组。

2)可将单条记录字段数据传给一维数组。将多个记录字段数据传给二维数组,一个记录传送给二维数组的一行,若二维数组的列数少于字段个数,多于字段数据不传送,若二维数组列数多于字段个数,多余列元素值不变。若二维数组行数少于记录数,多余记录不传,若二维数组行数多于记录个数,多余行的元素值不变。

例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 FROM ARRAY <数组名>[FOR<条件>][FIELDS<字段名表>]

功能:将符合条件的数组行数据追加到当前表尾。M字段不被追加。

说明:

1)一维数组追加一条记录,二维数组每行追加一条记录,多行追加多条记录。

2)数组列数多于字段个数,多余列上元素忽略。数组列数少于字段个数,多余字段为空值。

例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 <条件>

功能:查找符合条件第一个记录的位置,指针指向该记录。若表中无符合条件的记录,指针指向表尾。

说明:若符合条件的记录有多条,可用CONTINUE 继续查找下一个符合条件的记录。

例2.20 LOCATE 命令应用

USE 学生2

LOCATE FOR 性别='男'

?FOUND()

DISPLAY

CONTINUE

DISPPLAY

2.排序

有时我们在建表时并没有按一定的顺序建或者按某个字段的顺序建立表。在实际应用中,可能有需要对本字段的顺序加以改变,或需要按另外一种或多种字段进行有序排列的表。如何解决这类问题,VFP用SORT排序命令来解决。

VFP中的排序是指根据条件,由已存在表的内容,产生另一个新的排序表,而原表不变。

格式:SORT TO <新文件名> ON <字段名1> [/A|/D] [/C] [, <字段名2> [/A|/D][/C]…] [<范围>]

[FOR<条件>] [WHILE<条件>] [FIELDS <字段名表> | FIELDS LIKE <通配字段名> | FIELDS

EXCEPT <通配字段名>]

功能:在指定范围内将符合条件的记录,按字段的升序或降序进行排序,将排序的结果形成一个新的表。

说明:

1)ON子句中<字段名1>为第1排序字段,<字段名2>为第2排序字段…。/A/D表示升序或降序排序,默认为升序。/C不区分字段中的大小写字母。

2)M、G字段不能用于排序字段。

例2.21 SORT命令应用

USE 学生1

SORT TO 学生3 ON 出生

USE 学生3

LIST

排序命令已经解决了对已存在表按实际需要,按某一个字段或多个字段排序的问题。由于它使原表不变而又形成了一个新表,这样就在磁盘中造成了很大的冗余,浪费了存储空间。如何解决这样的问题,VFP用下面我们学习的建立索引文件来解决。

2.2.5索引文件的建立

1.索引的概念

索引是根据表中的某一个或多个字段建立的一个逻辑顺序的文件,而不生成表文件,它并不改变表的物理位置。人们将这些建立索引的字段称为关键字。索引文件的内容只是关键字与记录号,占用存储空间与排序表相比要小得多,它存储的是索引与表的映射关系。它就像一本书的目录一样,由标题查到在书中的页码,查找的速度很快。当对表记录进行增、删、改操作时,索引文件会随着表而更新。

索引文件主要分为两种,一种是单索引文件,另一种为复合索引文件。单索引文件可分为标准单索引文件和压缩单索引文件。复合索引文件可分为结构化复合索引文件和非结构化复合索引文件。只存储一个索引的索引文件称为单索引文件,它的扩展名为.IDX。能存储多个索引的索引文件称为复合索引,扩展名为.CDX。每个索引都有一个索引标识。复合索引文件名若与表名相同称为结构化复合索引文件,当表打开时,结构化符合索引自动随着打开。反之,复合索引文件名与表名不同称为非结构化复合索引。

VFP的索引方式有4种:主索引、候选索引、唯一索引和普通索引。他们的相关说明如表2.3所示。

表2.3 VFP的索引方式

索引类型

普通索引

唯一索引

候选索引

关键字是否不重复

可重复

可重复

不可重复

说明

可做为1:n永久关系的n方

为旧版本兼容

可作为主关键字,可用于在永久关系中建立参照完整性。

可作为主关键字,可用于在永久关系中建立参照完整性。只有数据库表才能建立索引。

创建修改命令

INDEX

INDEX

INDEX

CREATE TABLE

ALTER TABLE

CREATE TABLE

ALTER TABLE

索引个数

可有多个

可有多个

可有多个

主索引 不可重复 一个

在表2.3说明中提到了永久性关系等将在后续章节中讲到。

2.建立索引

(1)用界面建立索引

1)单字段索引

在表打开的前提下:显示→表设计器→字段选项卡→在字段名列中选中一个字段作为索引字段→索引下拉列表框中选升或降序,此时建立了一个普通索引,索引名与字段名相同,索引表达式就是对应的字段。如果想建立其它类型的索引,可继续单击索引选项卡→单击类型下拉列表框,此时出现三种方式类型,即普通索引、候选索引和唯一索引。注意没有主索引类型,因为主索引只有在数据库表中才能建立。可根据需要选一种索引类型→确定。

2)复合字段索引

在表打开前提下,显示→表设计器→索引选项卡→插入(此时在界面出现一新行)→在索引名下输入索引名→在类型下拉列表框中选索引类型→单击表达式右边的…按钮打开表达式生成器如图2.14所示在表达式中输入索引表达式→确定→确定。如建立一个普通索引表达式为性别+入学成绩。

以上用界面通过表设计其建立的索引都属于结构化复合索引。

图2.14表达式生成器

(2)用命令建立索引

格式:INDEX ON <索引关键字> TO <单索引文件名> | TAG <索引标识符名> [OF <复合索引名>] [FOR <条件>] [COMPACT] [ASCENDING] | [DESCENDING] [UNIQUE | CANDIDATE]

[ADDITIVE]

功能:建立索引文件或增加索引标识。

说明:

1) 索引关键字,可以是单个字段名,或用字段名组成的表达式。

2) TO 子句是建立单索引文件。

3) TAG是建立复合索引标识,当不选OF子句建立的是与表同名的结构化复合索引文件,当选OF子句时建立的非结构化复合索引文件。

4) COMPACT用来指定单索引文件是压缩的。复合索引总是压缩的。

5) ASCENDING、DESCENDING子句表示升、降序,默认为升序。

6) UNIQUE子句是建立唯一索引。

7) CANIDATE子句建立候选索引。

8) ADDITIVE子句建立该索引文件是不关闭以前打开的索引文件,默认是关闭以前打开的索引文件。

从以上命令看若不选⑥⑦子句建立的就是普通索引,但此命令不能建立主索引,建立索引要在数据库表中建立,在后续章节介绍。

例2.22 索引的应用。

OPEN DATABASE 学生

USE 学生

INDEX ON 学号 TO X1 UNIQUE &&建唯一索引

LIST

INDEX ON 性别+STR(入学成绩) TO X2 &&建单索引

LIST

INDEX ON 入学成绩 TAG S1 DESC &&建结构化复合索引

LIST

INDEX ON 姓名 TAG S2 CANDIDATE &&建结构化复合索引,候选索引

INDEX ON 姓名 TAG S3 of x3 &&建非结构化复合索引

LIST

3.索引的使用

(1)打开索引文件

格式1:SET INDEX TO [<索引文件表>] [ADDITIVE]

功能:打开当前表索引。

说明:

1) 在<索引文件表>中第一个为主控索引文件。

2) 当无任何选项时,关闭当前工作区中除结构化复合索引文件外的所有索引,取消主控索引。

3) 省略ADDITIVE子句关闭当前工作区除结构化复合索引以外的所有索引文件。

格式2:USE <文件名> INDEX <索引文件名表>

功能:打开表与相应的索引文件。

例2.23 打开索引文件应用。

USE 学生

SET INDEX TO ,, &&打开X1、X2、x3索引文件

文件X1为主控索引文件

(2)设置主控索引

格式:SET ORDER TO [<数值表达式> | <单索引文件名> | [TAG] <索引标识> [OF <复合索引文件名>] [ASCENDING | DESCENDING]]

功能:设置主控索引文件

说明:

1) <数值表达式>是指定主控索引文件或索引标识编号。先按USE 或INDEX出现顺序打开的单索引文件,然后按创建顺序指定结构化复合索引表示的编号,最后按创建顺序指定非结构化复合索引的编号。

2) <单索引文件名>是指定此索引文件为主控索引。

3) [TAG]<索引标识>[OF <复合索引文件名>]指定结构化、非结构化复合索引文件中的索引标识为主控索引。[OF <复合索引文件名>]适用于打开非结构化复合索引文件。

4) 无任何选项或SET ORDER TO 为取消主控索引。

5) ASCENDING、DESCENDING用于重新设置主控索引文件升或降序。

例2.24 SET ORDER TO 应用。

OPEN DATABASE 学生

USE 学生

SET INDEX TO , ,

LIST

SET ORDER TO S1

LIST

SET ORDER TO S3 OF

LIST

SET ORDER TO

USE

(3)删除索引

格式:DELETE TAG ALL | <索引标识1>[, <索引标识2>…]

功能:删除打开的复合索引文件的索引标识。

例2.25 DELE TAG 应用

USE 学生1

INDEX ON 学号 TO X4

INDEX ON 性别 TAG X5

DELETE TAG ALL

USE

(4)索引的更新

在表的记录发生变化时,打开的索引文件会随着表的变化而更新。但未打开的索引文件是不会自动根据表的变化而更新的。要想将这些未打开的索引文件更新,首先打开这些文件,然后再用以下讲的更新索引命令就可以了。

格式:REINDEX [COMPACT]

功能:重建当前打开的索引文件。COMPACT子句可将已打开的*.IDX索引文件转为压缩单索引文件。

4.索引中的查询命令

索引的应用在与对关键字的快速查询,VFP中有两个索引查询命令就是FIND与SEEK。

(1)FIND命令

格式:FIND <字符串> | <数值>

功能:在索引关键字中查找与指定的字符串或数值相匹配的第一条记录。若找到,指针指向此记录,否则指针指向表尾。一般用FOUND()函数判断是否查找到。若用字符变量查找必须用&运算符。若要查找下一个匹配记录可用SKIP命令。字符串可不用定界符,但字符串若有前导与尾部空格要加定界符。

例2.26 FIND应用。

USE 学生1

INDEX ON 姓名 TO X6

FIND 李丽明

?FOUND()

DISPLAY

X=’刘美文’

FIND &X

?FOUND()

DISPLAY

INDEX ON 入学成绩 TO X7

FIND 620

?FOUND()

DISPLAY

USE

(2)SEEK 命令

格式:SEEK <表达式>

功能:在索引关键字中查找与表达式相匹配的第一条记录。当查找与之匹配的下一条记录可用SKIP命令。当表达式为字符串时要求用定界符。表达式可为关键字所能取的任何一种类型。

例2.27 SEEK的应用。

USE 学生1

INDEX ON 性别 TO X6

SEEK "男"

?FOUND()

DISPLAY

INDEX ON 出生 TAG S3

SEEK {^1979-3-21}

?FOUND()

DISPLAY

USE

2.2.6 统计与计数

1.计数命令

格式:COUNT [<范围>] [FOR <条件>] [WHILE <条件>] [TO <内存变量>]

功能:计算当前表中指定范围内满足条件的记录个数,且存于<内存变量>中。

例2.28 COUNT 应用。

USE 学生1

COUNT TO X1

COUNT FOR 性别=’女’TO X2

?X1, X2

USE

2.求和命令

格式:SUM [<数值表达式表>] [<范围>] [FOR<条件>] [WHILE <条件>] [TO <内存变量>] |

ARRAY <数组名>

功能:在当前表中在指定范围内对符合条件的数值表达式表中的各表达式求和,且将结果依次存入内存变量表中的变量或数组中。

说明:数值表达式表中的表达式可为数值型字段,或由数值型字段组成的表达式。

例2.29 建立学生成绩表如表2.4,2.5所示,并统计各科成绩总分

表2.4 学生成绩

学号

C(9)

105010101

105010102

105010103

105010104

105010105

105010201

105010202

105010203

105020101

105020102

数学

N(3)

92

60

100

65

92

100

70

80

93

100

VFP

N(3)

80

90

98

70

82

100

65

72

91

100

英语

N(3)

100

90

99

60

93

100

80

83

86

100

表2.5 学生成绩F

学号

C(9)

105010101

105010102

105010103

105010104

105010105

原理

N(3)

100

90

99

60

93

网络

N(3)

98

70

82

100

65

C

N(3)

92

100

70

80

93

105010201

105010202

105010203

105020101

105020102

CREATE 学生成绩

INDEX ON 学号 TAG a1

SUM 数学, VFP, 英语 TO X1, X2, X3

?X1, X2, X3

CREATE 学生成绩F

SUM 原理, 网络, C TO ARRAY a

?a(1), a(2), a(3)

USE

100

80

83

86

100

100

90

99

60

93

80

90

98

70

82

3.求平均值命令

格式:AVERAGE [<数值表达式表>] [<范围>] [FOR<条件>] [WHILE <条件>] 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

USE

4.计算命令

格式:CALCULATE <表达式> [<范围>] [FOR <条件>] [WHILE <条件>] TO <内存变量> |

ARRAY <数组名>

功能:在当前表中,在指定范围内,对符合条件的表达式表中的各表达式进行计算。

说明:表达式必须包含avg(),cnt(),max(),min(),sum(),npv(),std(),var()这8个函数中的一个。前5个函数与4.1.3中select中常用系统函数一致,可见表4.1所示,后3个函数详见系统HELP。

例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 <条件>]

[WHILE <条件>]

功能:对已排序或已索引过的表,在指定范围内符合条件的记录,按指定关键字相同的那些记录进行分组并对数值字段列向求和,对于非数值字段取组内第一个记录中的字段的值,每组形成一个新纪录,将这些记录按原来的顺序形成由文件名指定的新表。

说明:选用FIELDS <数值型字段表>子句时,指出要汇总的字段。

例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 工作区与多表使用

在前面我们对表的操作中,每次只打开一个表。在例2.28中,打开过学生成绩与学生表,但当学生表打开时,学生成绩表自动关闭。还是在表单操作中,在实际应用中很多情况都需要多表同时打开操作,同时从多表中获取有价值的数据。这类问题VFP用工作区方式给予解决。

VFP允许一个工作区只能打开一个表,但VFP提供32767个工作区,因此就可以打开多个表。

(1)指定表的别名

格式:USE [<表名>] [ALIAS <别名> | IN 工作区号]

功能:在打开表的同时为表指定一个别名,若省略了ALIAS<别名>子句,默认表名与表的别名相同。别名的命名规则与表名相同。或在打开表的同时指定工作区,工作区号为0~32767。

说明:

1)工作区号取值可为0~32767,若取0,则选择一个未使用的最小编号工作区为当前工作区。工作区号1~10也可用A~J字母表示。

2)SELECT()函数可以返回当前工作区号。

例2.33 按表2.6-2.9建立4个表,且为每个表指定一个别名。

表2.6学生专业

学号

C(9)

105010101

105010102

105010501

105010204

105010301

105010302

105020101

105020102

105030101

105030102

姓名

C(6)

刘晓华

李立明

王立

刘文峰

赵敏

王良

王雪梅

李德勇

方芳

李金玉

性别

C(2)

专业名

C(20)

计算机应用

计算机软件

专业号

C(3)

J01

J01

J02

J02

J03

J03

S01

S02

D01

D02

表2.7校专业

专业号

C(3)

J01

J02

J03

S01

D01

Z01

G01

G02

课程号

C(3)

K01

计算机硬件

电子商务

电子

自动

工程机械

工程

表2.8课程

课程名

C(20)

数学

学分

N(2)

3

CREATE 学生专业

CREAT 校专业

CREAT 课程

CREAT 选修

USE 学生专业 ALIAS XS1

INDEX ON 学号 TAG Z1

INDEX ON 专业号 TAG Z2

USE 校专业 ALIAS XZ1

INDEX ON 专业号 TAG Z3

USE 课程 ALIAS K1

INDEX ON 课程号 TAG Z4

K02

英语

3

K03

计算机文化基础

3

K04

C语言

5

K05

组成原理

5

K06

商务英语

3

K07

电子商务法

4

K08

自控原理

5

K09

模拟电路

4

K10

数字电路

4

K11

单片机

3

K12

工程机械

5

K13

机械学

4

K14

铁路线路

3

表2.9选修

学号 课程号 成绩

105010101 K01 78

105010101 K02 80

105010101 K03 90

105010101 K04 76

105010101 K05 45

105010101 K06 98

105020101 K07 68

105020101 K08 56

USE 选修 ALIAS X1

INDEX ON 学号 TAG Z5

(2)指定工作区命令

格式:SELECT <工作区号> |<别名>

功能:由工作区号或表的别名指定一个当前工作区用于打开一个表。

(3)关闭工作区中的表

格式:CLOSE ALL

功能:关闭所有工作区打开的表并选择工作区1位当前工作区。

例2.34 select应用。

SELECT 1

USE 学生专业

INDEX ON 学号 TO Xs1

LIST

SELECT 0

USE 校专业

LIST

INDEX ON 专业号 TAG Xs2

SELECT 3

USE 课程

LIST

CLOSE ALL &&若用USE只关闭当前工作区的表

(4)工作区字段互访

格式:<别名>→字段名|<别名>

功能:在当前工作区访问非当前工作区中的字段,即别名所在区的字段。

例2.35 工作区字段访问应用。

SELECT 1

USE 学生专业

USE 校专业 in 2

USE 课程 in 3

SELECT 1

LIST 学号, 姓名, 专业号, B->专业号, B->专业名, C->课程号, C->课程名, C->学分

CLOSE ALL

2.多表使用

(1)表的关联

表的关联是指在两个表之间,当一个表(父表)的记录指针移动时,另一个表(子表)的记录指针根据父表的要求(也称关联条件或称关联表达式)指向子表的相应记录上。VFP用这种关联控制或将表之间建立关系从而实现多表同时使用。在多表之间同时获取有价值的数据的目的。

(2)关系

1)一对一关系

由关联条件,父表只有一条记录与子表只有一条记录相对应。

2)一对多关系

由关联条件,父表只有一条记录与子表多条记录相对应。

3)多对一关系

由关联条件,父表有多个记录与子表只有一条记录相对应。

4)多对多关系

由关联条件,父表有M条记录与子表有N条记录相对应。

表之间的多对多关系问题处理起来较为复杂,常是将其中的一个表分解,然后形成一对多或多对一关系。

(3)用界面进行关联

单击窗口菜单→数据工作期或在常用工具栏中单击数据工作期按钮,打开数据工作区窗口,(见图2.15)。

图2.15数据工作期

1)单击打开,选学生表→属性,打开工作区属性→修改,打开表设计器→选学号字段在索引下选升序→确定→在工作区属性对话框中的索引顺序中选学生.学号→单击字段筛选,打开字段选择器对话框→全部→确定→确定,此时回到数据工作期窗口。

2)单击打开→选学生成绩表→属性→打开工作区属性→修改,打开表设计器→选学号字段在索引下选升序→确定→在工作区属性对话框中的索引顺序中选学生成绩.学号→单击字段筛选,打开字段选择器对话框→全部→确定→确定,此时回到数据工作期窗口。

3)在别名框中选学生表→关系→在别名框中选学生成绩表。

4)在命令窗口输入BROW FIELDS 学生.学号,学生.姓名,学生成绩.数学,若要建立一对多关系进行以下步骤:

5)在别名框中选学生表→一对多,打开创建一对多关系对话框,将学生成绩表移到选定别名列表框中→确定,即可。

(4)用命令建立关联

格式:SET RELATION TO [<关联表达式1>] INTO <别名1>, …<关联表达式n> INTO <别名N> [ADDITIVE]

功能:以当前表为父表<关联表达式1>为关联条件与别名1表为子表建立关联,以<关联表达式2>为关联条件与别名n为子表建立关联。

说明:

1)若无任何选项,将已建立的关联删除。

2)[ADDITIVE]子句是在建立关联时,保留以前建立的关联。

例2.36 用命令建立关系的应用。

CLEAR

SELECT 1

USE 学生

INDEX ON 学号 TAG T1 ADDI

SELECT 2

USE 学生成绩

INDEX ON 学号 TAG T2 ADDI

SELECT 1

SET RELATION TO 学号 INTO 学生成绩 ADDITIVE

LIST 学号, 姓名, B->数学, B->VFP, B->英语

BROWSE FIELDS 学号, 姓名, B->数学, B->VFP, B->英语

SET RELATION TO

CLOSE ALL

(5)一对多关联的建立

格式:SET SKIP TO [<别名1> [, <别名2>]…]

功能:以当前表为父表,以别名1,别名2,…为子表建立一对多关系。若无任何选项,取消一对多关系,而由SET RELATION建立的多对一关系仍存在。

例2.37 用命令建立一对多关系的应用。

SELECT 2

USE 选修

INDEX ON 学号 TAG T3 ADDITIVE

SELECT 1

USE 学生专业

INDEX ON 学号 TAG T3 ADDI

SELECT 1

SET RELATION TO 学号 INTO 选修 ADDI

SET SKIP TO 选修

LIST

BROWSE FIELDS 学号, 姓名, B->课程号, B->成绩

CLOSE ALL

2.3小结

本章介绍了表的建立、表的基本操作。在VFP中表分为两种,一种为自由表,一种为数据库表。本章介绍的是自由表,表是VFP数据管理的基本操作有效方式,它独立于程序,具有共享性,因此在VFP中表的操作显得格外重要。本章关于表知识的介绍通过界面与命令两种,界面操作对于初学者来讲,非常方便。命令主要在后续章节中可运用到程序中,最终形成自动化工作方式。

习题与上机题目

1. 选择题

(1)建立表的命令是( )

A. create data B. create table C. USE D. OPEN

(2)修改表的结构命令是( )

A .MODIFY STRUCTURE B .LIST STRU C. REPLACE D. BROW

(3)显示的结构命令是( )

A. BROW B. MODI STRU C. LIST STRU D. DISP

(4)浏览表的命令是( )

A . SHOW B . USE C. EDIT D. BROW

(5)相对移动记录指针命令( )

A. GOTO B. LOCATE C. SKIP D. LIST

(6)绝对移动记录的指针命令( )

A. GOTO . B SKIP C. REPL D. EDIT

(7)打开表的命令是( )

A. OPEN B. create C. USE<表名> D. APPE

(8)逻辑删除表中记录命令是( )

A. PACK B. RECALL C. ZAP D . DELETE

(9)物理删除表中记录命令是( )

A. PACK B. RECALL C. DELETE D. INDEX

(10)指定工作区命令是( )

A. SORT B. SET C . SELECT D. SUM

2. 表的基本操作

(1)建立学生、学生成绩、学生成绩F表。各表结构与内容见本章。

(2)用命令方式分别显示(1)中所建各表的结构与内容。

(3)查找姓名为王丽华学生的记录内容。

(4)显示所有性别为男的学生记录。

(5)将学生表按性别排列形成学生表,将学生表按入学成绩排列形成学生表。

(6)将(1)中的各表按学号分别建立结构化复合索引 , 索引标识分别为T1、T2、T3。

(7)统计学生表的性别为女的学生人数,并将结果存入x1中。

(8)统计学生成绩表中VFP课程的平均分,名并将结果存入x2中。

(9)将(1)中各表追加一条记录,记录内容自定,然后分别显示三个表的内容,再在刚追加的记录前各插入一条记录,记录内容自定,然后分别显示三个表的内容,最后将追加的记录和插入的记录从三个表中彻底删除。

(10)将学生表中的入学成绩统一全部加10分。

(11)用多个工作区的概念,同时显示(1 )中的三个表的内容。