1
i s u a l
F
V
o x P r o
2
4.1 表的建立
4.2 表的显示与维护
4.3 表的排序与索引
4.4 表的统计与计算
4.5 多个表的操作
3
4.1.1 设计表的结构
1.字段名
字段名是表中每个字段的名字,它必须以汉字、字母
或下划线开头,由汉字、字母、数字或下划线组成。
自由表中的字段名最多为 10个字符,数据库表中的
字段名最多为 128个字符。当数据库表转化为自由
表时截去超长部分的字符。
2.字段类型
字段类型 表示该字段中存放数据的类型。 在第三章中,
已经介绍了 Visual FoxPro的类型类型。在设计表的
结构时,可根据需要确定表中各字段的类型。
4.1 表的建立
4
3.字段宽度
字段宽度用以表明该字段允许存放的最大字节数或数
值位数。在建立表结构时,应根据所存数据的具体
情况规定字符型、数值型、浮动型这 3种字段的宽
度,若有小数部分则小数点也占一位。其他类型字
段的宽度均由系统统一规定,它们是:货币型、日
期型、日期时间型、双精度型字段宽度均为 8字节,
逻辑型字段宽度为 1字节,整型、备注型字段和通
用型字段宽度均为 4字节。
注意,备注型和通用型字段的内容都没有直接存放在
表文件中,而是存放在一个与表文件同名的 备注文
件(扩展名为,fpt) 中。它们 4个字节的宽度仅用于
存放有关内容在备注文件中的实际存储地址。
5
4.小数位数
只有数值型与浮动型字段才有小数位数,小数位数至
少应比该字段的宽度值小 2。若字段值是整数,则
应定义小数位数为 0。双精度型字段允许输入小数,
但不需事先定义小数位数,小数点将在输入数据时
输入。
5.是否允许为空
表示是否允许字段接受空值( NULL)。空值是指无
确定的值,它与空字符串、数值 0等是不同的。例
如,表示成绩的字段,空值表示没有确定成绩,0
表示 0分。一个字段是否允许为空值与字段的性质
有关,例如作为关键字的字段是不允许为空值的。
6
4.1.2 建立表的结构
1.菜单操作方式
在 Visual FoxPro中,要建立文件可选择“文件”菜单
项中的“新建”命令,系统提供一系列的窗口与对
话框,用户只要根据屏幕的提示,就可完成有关操
作。
( 1)选择“文件”菜单项中的“新建”命令,将出现
“新建”对话框。这个对话框让用户选择新建文件
的类型。在实际操作中,可能要建立各种类型的文
件,新建对话框中的文件类型框中列出了可供选择
的文件类型。
7
“新
建”



8
( 2)在这里是建立表文件,所以需要选择“表”文
件类型,然后可以选择“新建文件”或“向导”去
建立新的文件。向导是一个交互式程序,由一系列
对话框组成。利用向导可以引导用户完成一系列操
作。“表向导”是众多 Visual FoxPro向导中的一种,
在有样表可供利用的条件下,可以使用表向导来定
义表结构,但操作很烦琐。这里不介绍利用向导建
立表,而是直接建立新表。从新建对话框中选择
“新建文件”,此时首先出现“创建”对话框,在
其中可以输入表名、选择保存表的位置,然后单击
“保存”按钮,此时便出现表设计器窗口。在该窗
口中,有字段、索引和表 3个标签,利用字段标签
可建立表结构。
9
表设计器窗口
10
( 3)在表设计器窗口中,可输入表的字段参数:
①在“字段名”下面的文本编辑区输入字段的名字。
②按 Tab键或单击“类型”,选择类型列,其中列出
所有的 Visual FoxPro字段类型,可以单击类型列右
边的向下箭头或按空格键进行选择。
③按 Tab键或单击“宽度”进入宽度列,可直接键入
所需的字段宽度或连续单击右侧的上下箭头,使数
字变化到所需的大小。如果类型是数值型或浮动型,
还需要设置小数点位数。
④索引列可确定索引字段及索引方式。
⑥ NULL列设置字段可否接受 NULL值。选中此项意
味该字段可接受 NULL值。
11
( 4)表字段设置完成后,选择“确定”按钮,结束
表结构的建立。这时将弹出对话框,询问“现在输
入数据记录吗?”,选择“否”,则退出建表工作,
以后需要时可以打开该表并输入数据。若选择
“是”,则可以立即输入数据。
是否输入记录对话框
12
( 5)在表设计器窗口中,还有一些别的按钮,它
们用来修改表结构。在字段名列左方有一列按钮,
其中按钮上标有双向箭头的一行是当前字段行,
将按钮上下拖动能改变字段的次序。要删除或插
入一个字段,可选择相应命令按钮。若想放弃建
立表的操作,则在对话框中选择“取消”按钮或
双击控制菜单按钮。
13
2.命令操作方式
以上介绍了利用菜单操作方式建立表结构的过程,
还可以在命令窗口中使用 CREATE命令来建立表的
结构。其命令格式是:
CREATE [<表文件名 >|?]
在命令中使用?或省略该参数时,打开“创建”对话
框,提示输入表名并选择保存表的位置。
CREATE命令执行后,屏幕上弹出表设计器窗口,以
后的操作方法与菜单操作相同。
14
4.1.3 向表输入记录
在把刚建立好的表结构存盘以后,若要立即输入记
录,此时,屏幕显示记录输入窗口,用户可通过它
输入一个个记录。
记录输入窗口
15
1.记录输入窗口
在记录输入窗口的标题栏上给出了表的名称,窗
口左上角有控制菜单按钮,通过它可关闭该窗口,
窗口的右上角有最小化、最大化和关闭按钮,窗口
的右边和下边各为纵向和横向滚动条。如果已经输
了很多数据记录,可以使用纵向滚动条,使记录内
容上、下移动。如果某个字段定义得很宽,它的输
入内容被隐蔽在窗口的后面。这里可以使用横向滚
动条,使窗口内容左右推移。
16
窗口内左侧纵向列出该表的所有字段名称,以供
输入记录,记录和记录之间有一条横线分隔。字段
名右边文本区示意出每个字段的宽度,控制着输入
的字符个数。输入到定义的宽度时机器会发出“蜂
鸣”声以示警告,并立即自动进到下一字段去。如
果字段中输入的内容比定义的宽度要小,那么在输
入完后,按 Tab键或回车键可进到下一个字段去。
17
对于数值型字段,且带有小数点,系统在该字段
中会自动给出小数点。对于日期型字段,系统自动
给出斜杠,以分开年、月、日的输入位置。 Visual
FoxPro中,日期的显示格式有多种。因此在输入日
期型字段数据时,必须搞清楚当前采用的日期格式,
否则系统会发出警告,需要重新输入。
如果字段是备注型的或是通用型的,输入它们的
数据时就要采用其他方法了。
18
2.备注型字段数据的输入
在记录输入窗口中,备注型字段显示,memo”标志,
其值通过一个专门的编辑窗口输入。具体的操作
方法是:
( 1)将光标移到备注型字段的 memo处,按
Ctrl+PgDn或双击字段的 memo标志,进入备注型
字段编辑窗口。
( 2)在此窗口,Visual FoxPro提供了一个字处理
环境,可以像任何字处理软件那样输入、编辑文
本。
19
( 3)编辑完成后,按 Ctrl+W将数据存入相应的备
注文件之中,并返回到记录输入窗口。或按
Ctrl+Q或 Esc则废弃本次输入的备注数据并返回到
记录输入窗口。
在备注型字段输入数据后,该字段的 memo标志变
成 Memo了。通过字段中 memo里的第一个字母是
大写还是小写,可以判断出该备注型字段是否已经
输入了内容。
20
3.通用型字段数据的输入
通用型字段的显示与备注型字段类似,不同的是对于
通用型字段在编辑窗口中标识是 Gen或 gen,其中该
字段为空时为 gen,若在其中已经存入对象,则变为
Gen。
通用型字段的输入可使用编辑菜单的插入对象命令,
或通过剪贴板粘贴。具体操作方法是:
( 1)将光标移到通用型字段的 gen处,按 Ctrl+PgDn
或双击字段的 gen标志,进入通用型字段编辑窗口。
21
( 2)选择“编辑”菜单中的“插入对象”命令,
出现“插入对象”对话框。若插入的对象是新建
的,则单击“新建”单选按钮,然后从“对象类
型”列表框中选择要创建的对象类型。若插入的
对象已经存在,则单击“由文件创建”单选按钮,
在“文件”文本框中直接输入文件的路径及文件
名,也可按下“浏览”按钮进行浏览查找。若不
是将已存在的文件实际插入表中,而是建立一种
链接的关系,则需单击“链接”复选框。若需要
将插入的对象显示为一个图标,则单击“显示图
标”复选框。
22
经过上述操作后,单击“确认”按钮,所选定的
对象将自动插入到表中。
上述过程也可以通过剪贴板来完成。先用图形编辑程
序(如 Windows 95的画图程序)将图形送至剪贴板,
再回到通用型字段编辑窗口,选择编辑菜单中的粘
贴命令,剪贴板中的图形就送至该窗口。
( 3)关闭通用型字段编辑窗口。
23
4.2.1 表的打开与关闭
1.表的打开
对表进行操作,首先要打开表。具体操作方法是:
选择“文件”菜单下的“打开”命令,出现“打开”
对话框。在该对话框中 选择要打开的表,或在“文
件名”文本框中直接键入表文件名,然后按“确定”
按钮将其打开。若打开了新的表,则会关闭原先已
打开的表。
4.2 表的显示与维护
“打
开”



24
在“打开”对话框中还有“以只读方式打开”
和“独占”两个复选框可供选择,如果选择“以
只读方式打开”复选框,则不允许对表进行修改,
默认的打开方式是读 /写方式,即可修改。如果选
择“独占”复选框即不允许其他用户在同一时刻
也使用该表,如果不选择“独占”复选框即允许
其他用户在同一时刻也使用该表,也就是以“共
享”方式打开表。默认的打开方式由 SET
EXCLUSIVE ON|OFF的设置值确定,系统原默
认设置为 ON。
25
也可以在命令窗口使用 USE命令打开表。
命令格式是:
USE <表文件名 > [NOUPDATE]
[EXCLUSIVE|SHARED]
其中 NOUPDATE指定以只读方式打开
表,EXCLUSIVE指定以独占方式打开
表,SHARED指定以共享方式打开表。
26
2.表的关闭
对表操作完毕后,应及时关闭,以保证更新后的
内容能写入相应的表中。关闭表的具体操作方法是:
选择“窗口”菜单中的“数据工作期”命令,弹出
数据工作期窗口,在数据工作期窗口中选择“关闭”
按钮关闭表。
在命令窗口中使用不带文件名的 USE命令,亦可
关闭打开的表。
27
4.2.2 表的显示
1.表结构的显示
列出指定表的结构,包括文件更新日期、记
录个数、记录长度及各字段的名称、类型、宽度
和小数位数等内容。命令格式是:
LIST|DISPLAY STRUCTURE [TO PRINTER
[PROMPT]|TO FILE <文件名 >]
两个命令的作用基本相同,区别仅在于 LIST
是连续显示,当显示的内容超过一屏幕时,自动
向上滚动,直到显示完成为止。 DISPLAY是分
屏显示,显示满屏时暂停,待用户按任一键后继
续显示后面的内容。
28
有关命令子句的含义是:
( 1)若选择 TO PRINTER子句,则一边显示一边打印。
若包括 PROMPT命令,则在打印前显示一个对话框,用
于设置打印机,包括打印份数、打印的页码等。( 2)
若选择 TO FILE <文件名 >,则在显示的同时将表结构输
出到指定的文本文件中。
2.表记录的显示
显示当前表中的记录或指定的表达式的值也是使
用 LIST或 DISPLAY命令。命令格式是:
LIST|DISPLAY [[FIELDS] <表达式表 >] [<范围 >]
[FOR <条件 >] [WHILE <条件 >]
[TO PRINTER [PROMPT]|TO FILE <文件名 >]
[OFF]
29
命令中各子句的含义是:
( 1) FIELDS <表达式表 >指定要显示的表达式。
表达式可直接使用字段名,也可以是含有字段名的
表达式,甚至是不含字段名的任何表达式。
如果省略 FIELDS命令,则显示表中所有字段的
值。但备注型和通用型字段内容不显示,除非备注
型和通用型字段明确地包括在表达式表中。
( 2)若选定 FOR子句,则显示满足所给条件的所有
记录。若选定 WHILE子句,显示直到条件不成立
时为止,这时后面即使还有满足条件的记录也不再
显示。 FOR子句和 WHILE子句可以同时使用,同
时使用时 WHILE子句优先。
30
( 3) <范围 >,FOR子句和 WHILE子句用于决定对
哪些记录进行操作。如果有 FOR子句,缺省的范围
为 ALL,有 WHILE子句,缺省的范围为 REST。
如果 FOR子句或 WHILE子句以及范围全省略,
对于 LIST缺省为所有记录,即取 ALL,对于
DISPLAY缺省为当前记录,即取 NEXT 1。此外,
对于 DISPLAY命令是分屏输出,对于 LIST是连续
输出。
( 4)选用 OFF时,表示只显示记录内容而不显示
记录号。若省略该项则同时显示记录号和记录内容。
31
例 就学生表,写出进行如下操作的命令:
( 1)显示前 5条记录。
( 2)显示记录号为奇数的记录。
( 3)显示汉族男学生的记录。
( 4)显示湖北 /湖南学生的姓名、性别、年龄以及简历
操作命令如下:
USE 学生
LIST NEXT 5
LIST FOR MOD(RECNO(),2)=1
LIST FOR !少数民族否 AND 性别 ="男 "
LIST 姓名,性别,YEAR(DATE())-YEAR(出生日期 ),
简历 FOR "湖 "$籍贯
USE
32
4.2.3 表的修改
1.表结构的修改
要修改当前表的结构,既可修改各字段的名字、
类型、宽度、小数位数,又可增加、删除、移动
字段或者修改索引标记。命令格式是:
MODIFY STRUCTURE
33
修改表结构时,屏幕上会出现表设计器窗口,
这和建立表时的屏幕画面是一样的(如图 4.2所
示)。不过在修改表结构时,在窗口上会显示出原
有表的结构,此时可以根据需要修改表的结构。
“插入”按钮用来在光标所在字段之前插入新的字
段。“删除”按钮用来删除光标处的字段。用鼠标
拖动每个字段最左侧的小方块,可以调整字段的排
列顺序。如果要修改原有字段的属性,可先将光标
移到需要修改的位置,然后进行修改。
34
表结构修改完成后,在表设计器窗口单击“确定”
按扭,出现询问“结构更改为永久性更改?”确
认对话框,选“是”将保存对表结构所作的修改,
否则放弃修改。单击“取消”按扭,出现询问
“放弃结构更改?”确认对话框,选“是”表示
修改无效且关闭表设计器窗口,否则可继续修改。
35
2.全屏幕编辑修改
全屏幕编辑修改是指对显示在屏幕上的记录数据,
通过移动光标,对光标处的字段进行修改。常用的
命令有 BROWSE,EDIT,CHANGE等。这里重点
介绍 BROWSE浏览窗口的操作。
( 1)打开浏览窗口。打开表后,在“显示”菜单中
选择“浏览”命令,则打开浏览窗口,表的内容将
出现在浏览窗口中。也可以在打开表后,输入
BROWSE命令打开浏览窗口。
36
在浏览窗口,可以用鼠标单击浏览窗口的滚动
条或滚动块查看未出现在窗口中的信息,也可用键
盘的光标控制键 PgUp,PgDn来查看。
对于备注型字段和通用型字段,若其中含有内
容,则分别显示为 Memo和 Gen,若字段中没有内
容,则显示为 memo和 gen。双击 Gen和 Memo或亮
条在其上面时,按 Ctrl+PgDn键可看到其中的内容。
37
( 2)数据的两种显示方式。浏览窗口中的数据有浏
览和编辑两种显示方式。浏览方式每行显示一个记
录,可以同时看到多个记录,而编辑方式每行显示
一个字段,一个记录的所有字段都显示完后再显示
第二个记录的字段。用“显示”菜单中的“编辑”
命令(在浏览方式时)或“浏览”命令(在编辑方
式时)可在两种显示方式之间切换。
38
( 3) Browse窗口的分割与同步
浏览窗口左下角有一黑色小方块,可用于窗口的分
割。用鼠标将小方块向右拖动,便可把窗口分为两
个分区。两个分区显示同一表的内容,显示方式可
根据需要任意设置。光标所在的分区称为活动分区,
只有活动分区的内容才允许改变。单击某分区可使
它成为活动分区,“表”菜单项中的切换分区命令
也用于改变活动分区。图中示出了以两种不同方式
显示表内容的两个窗口。
39
浏览窗口的分割
40
经分割后的两个分区通常是同步的,也就是说当
在一个分区选定某记录时,另一分区中也会显示该
记录。这样,同一记录必然在两个分区同时看到。
“表”菜单项中的链接分区命令可解除这种同步
(消除该命令前的,√”)。此后当记录在一个窗
口中滚动时,另一个窗口的记录保持不动,这样就
能在一幅屏幕上查看到更多的记录内容,也便于在
表的前后记录之间进行对照。重新在该命令前打
,√”后,又能恢复同步。
41
3.成批替换修改
有时对记录数据的修改是有规律的,对这种数据的修
改如果仍用 BROWSE等命令逐个修改就很麻烦,而
使用成批替换修改的方法就非常方便。命令格式是:
REPLACE <字段 1> WITH <表达式 1> [ADDITIVE]
[,<字段 2> WITH <表达式 2> [ADDITIVE]] [,…][< 范
围 >] [FOR <条件 >] [WHILE <条件 >]
该命令用一个表达式的值替换当前表中一个字段的值。
42
命令中各子句的含义是:
( 1)若不选择 <范围 >和 FOR子句或 WHILE子句,
则默认为当前记录。如果选择了 FOR子句,则 <范
围 >默认为 ALL,选择了 WHILE子句,则 <范围 >默
认为 REST。
( 2) ADDITIVE只能在替换备注型字段时使用。
使用 ADDITIVE,备注型字段的替换内容将附加到
备注型字段原来内容的后面,否则用表达式的值改
写原备注型字段内容。
43
例 写出对学生表进行如下操作的命令:
( 1)将少数民族学生的入学成绩增加 20分。
( 2)将 6号记录的出生日期修改为 1983年 9月 7日;
操作命令如下:
USE 学生
REPLACE 入学成绩 WITH 入学成绩 +20 FOR 少
数民族否
GO 6 &&将记录指针定位到 6号记录
REPLACE 出生日期 WITH {^1983-09-07}
44
4.2.4 表记录指针的定位
1.绝对定位
绝对定位是将记录指针定位到指定记录。命令格式
是:
[GO[TO]] <记录号 >|TOP|BOTTOM
命令中记录号的取值范围是 1至当前表中的最大记
录个数,即函数 RECCOUNT()的值,否则出错。
TOP和 BOTTOM分别表示表的首、末记录。
45
2.相对定位
相对定位是以当前记录位置为基准,向前或向后
移动记录指针。命令格式是:
SKIP [<记录数 >]
如果 <记录数 >的值为正数,则记录指针往表尾方向
移动,若为负数,则往表头方向移动。若省略此项,
则记录指针移到下一个记录。如果记录指针指向未
记录而执行 SKIP,则 RECON()返回一个比表记录
数大 1的数,且 EOF()返回,T.。如果记录指针指向首
记录而执行 SKIP -1,则 RECNO()返回 1,且 BOF()
返回,T.。利用 BOF()和 EOF()这两个函数可以掌握
有关记录指针移动的情况。当 BOF()和 EOF()这两个
函数的值已经为,T.时,如企图向相同方向各再执行
SKIP命令就会出错。
46
3.查询定位
这里先介绍顺序查询,索引查询在后面介绍表的索引
时介绍。
顺序查询的命令格式是:
LOCATE [<范围 >] FOR <条件 >|WHILE <条件 >
如果指定 <范围 >,则按指定 <范围 >查找,省略 <范围
>时默认为 ALL。找到后,记录指针指向该记录,
函数 FOUND()值为,T.,否则,记录指针指向 <范围
>的最末一个记录上,省略 <范围 >则指向文件尾,
函数 FOUND()值为,F.。当查找到第一个满足条件
的记录后,如果执行 CONTINUE命令,则继续寻
找满足条件的记录,直到 <范围 >结束为止 。
47
例 在学生表中查询汉族男生的姓名、入学成绩和年龄。
操作命令如下:
USE 学生
LOCAT FOR !少数民族否 AND 性别 ="男 "
DISP 姓名,入学成绩,YEAR(DATE())-YEAR(出生日期 )
CONTINUE
RECNO(),姓名,入学成绩,YEAR(DATE())-YEAR(出
生日期 )
48
4.2.5 表记录的增加与删除
1.插入记录
命令格式是:
INSERT [BLANK] [BEFORE]
该命令在当前表的指定位置上插入一个新记录。
若给出 BLANK选项,则插入一个空记录。若不给
出此项,则进入全屏幕数据记录输入窗口。若给出
BEFORE选项,则在当前记录的前面插入一个新记
录,即插入的新记录成为当前记录,而原来的当前
记录及其后面记录的记录号均加 1。若不给出该选
项,则在当前记录的后面插入一个新记录。
49
例 对学生表增加 6号和 7号记录。
USE 学生
GO 6
INSERT BEFORE &&此时新增加的 6号记录
变成当前记录
INSERT &&在 6号记录之后插入一条新记
录,即第 7号记录
50
2.追加记录
命令格式是:
APPEND [BLANK]
该命令在当前表的末尾追加一个新记录。若选用
BLANK选项,则追加一个空记录到表的末尾。
APPEND命令是在当前表的末尾增加新记录,而
INSERT命令可以在指定位置上增加新记录。两条
命令的屏幕操作方式是相同的。
51
例 在学生表末记录后增加两个记录。
USE 学生
APPEND
APPEND
显然,APPEND命令与下面两条命令等价:
GO BOTT
INSERT
52
3.删除记录
Visual FoxPro对部分记录的删除分两步进行:首先
对想要删除的记录加上删除标志( *),这时被标
记的记录并没有真正被删除,需要时仍可以恢复。
然后对加了删除标志的记录真正地从表中删除掉。
( 1)给记录加删除标志
命令格式是:
DELETE [<范围 >] [FOR<条件 >] [WHILE <条件 >]
该命令给指定的记录加上删除标志。若不选择可选
项,则仅对当前记录加上删除标志。
53
( 2)取消删除标记
命令格式是:
RECALL [<范围 >] [FOR<条件 >] [WHILE<条件 >]
该命令取消指定记录上的删除标志,若不选择可
选项,则仅取消当前记录的删除标志 。
54
( 3)真正删除记录
命令格式是:
PACK
该命令清除所有带删除标志的记录。
例 删除学生表中 5~ 10之间的全部记录。
USE 学生
GO 5
DELETE NEXT 6
PACK
55
( 4)删除全部记录
命令格式是:
ZAP
该命令删除当前表的全部记录,只留下表结构。
56
4.2.6 表的复制
1.复制表的结构
命令格式是:
COPY STRUCTURE TO <文件名 > [FIELDS <
字段名表 >]
该命令将当前表的结构复制到指定的表中。仅复
制当前表的结构,其记录数据不复制。
命令中各子句的含义是:
57
( 1) <文件名 >是复制产生的表名,复制后只有结
构而无任何记录。
( 2)若给出了 FIELDS <字段名表 >选项,则生成
的空表文件中只含有 <字段名表 >中给出的字段,
若省略此项,则复制的空表文件的结构和当前表相
同。
58
2.复制表
命令格式是:
COPY TO <文件名 > [FIELDS] <字段名表 > [<范围 >]
[FOR<条件 >] [WHILE <条件 >]
[[TYPE] SDF|DELIMITED|XLS] [WITH <定界符
>|BLANK]
该命令将当前表中的数据与结构同时复制到指定的
表中,即复制了一个新的表。此命令还可以将当前
表复制生成一个其他格式的数据文件。
59
命令中各子句的含义是:
( 1) <文件名 >表示复制后产生的新的文件名。
( 2)若选择了 FIELDS <字段名表 >,则将 <字段
名表 >中给出的部分字段的数据复制到指定的文件
中,省略此项,则等价于当前表的全部字段。字
段名表中还可包含有其他工作区表的字段。
( 3) <范围 >和 FOR <条件 >,WHILE <条件 >决
定了对哪些记录进行复制。省略这些子句时,则
复制当前表的所有记录。
( 4)复制含有备注型字段的表时,如果指定要复
制该备注型字段,则在复制表的同时,复制相应
的备注文件。
60
( 5)若选择了 SDF或 DELIMITED,则将当前表复
制成指定的文本文件,默认扩展名为 TXT。其格式
由 SDF和 DELIMITED决定。 SDF为标准格式,记
录定长,不用分隔符和定界符,每个记录均从头部
开始存放,均以回车符结束。 DELIMITED为通用
格式,记录不等长,每个记录均以回车符结束。若
选用 BLANK,字段之间用一个空格分隔,否则用
一个逗号分隔。若选用 <定界符 >,字符型数据用指
定的 <定界符 >括起来,否则用双引号括起来。若选
择了 XLS,则得到一个 Excel文件,该文件只能在
Excel中打开。
61
例 对学生表进行复制操作,并分析目标文件
的类型。
( 1)将入学成绩大于 600分的记录复制到
new.dbf中。
( 2)分别生成标准格式和通用格式的文本文
件 new1.txt和 new2.txt。
62
操作命令如下:
USE 学生
COPY TO new1 FOR 入学成绩 >600
USE new1 &&查看新表的记录
LIST
COPY TO new1 SDF
TYPE new1.txt &&查看新文本文件的内容
COPY TO new2 DELIMITED
TYPE new2.txt &&注意和 new1.txt文件格式上
的差异。
63
3.从其他文件向表添加数据
命令格式是:
APPEND FROM <文件名 > [FIELDS <字段名表 >]
[FOR <条件 >] [WHILE <条件 >] [[TYPE] <文
件类型 >]
该命令将指定文件(源文件)中的数据添加到当
前表的尾部。
命令中各子句的含义是:
( 1) <文件名 >说明从哪个文件读取添加数据,即
源文件的名字。若没有给出扩展名,则系统认定
为 dbf。
64
( 2)若给出 FIELDS <字段名表 >选项,则数据只
添加到在 <字段名表 >中说明的字段。 FOR <条件 >
或 WHILE <条件 >是对源文件记录的限制。
( 3) <文件类型 >选 SDF或 DELIMITED,取决于
源文件的格式。
( 4)要注意源文件中的数据与当前表字段类型、
顺序和长度要匹配。
65
4.表与数组间的数据传送
表与数组间的数据传送是指可将表的记录数据传送
到数组中而成为数组元素,反过来也可以将数组元
素值传送到表而成为记录数据。
(1)将表的记录数据传送到数组
命令格式是:
SCATTER [FIELDS <字段名表 >] TO <数组名 >
[MEMO]
66
命令按顺序将当前表当前记录指定字段的内容依
次存入数组。第一个字段存入数组的第一个元素中,
第二个字段存入数组的第二个元素中,依次类推。
如果未指定 FIELDS <字段名表 >,则将除备注型
字段以外所有的字段存入数组中。如果要对备注型
字段同样处理,就需在命令中加上 MEMO选项。如
果数组元素个数比字段个数多,则多余的数组元素
内容仍保留;如果数组元素个数比字段个数少,则
系统自动重新建立数组。
67
例 分析下列命令执行后,数组元素值的变化。
CLEAR MEMORY
USE 学生
DIMENSION y(5)
STORE 7645 TO y(5)
GO 4
SCATTER FIELDS 姓名,出生日期,少数民族否,
籍贯 TO y
LIST MEMORY LIKE y?
68
(2)将数组数据传送到表记录
命令格式:
GATHER FROM <数组名 > [FIELDS <字段名表 >]
[MEMO]
命令将数组中的数据作为一个记录传送到当前打开
的表中的当前记录。
69
如果指定 FIELDS <字段名表 >短语,则只向指定
的字段填加数据,其他字段填空。如果未指定
FIELDS <字段名表 >短语,则按字段顺序填加数据。
当省略 MEMO 选项时将忽略备注型字段。如果数组
元素个数少于指定字段个数,则多余的字段填空;
如果数组元素个数多于指定字段个数,则忽略多余
的数组元素。当数组元素的数据类型与表相应字段
类型不同且不兼容 ( 如数值型数组元素仍能被传送到
字符型字段之中,它们虽类型不同却是兼容的 )时,
该字段将自动被初始化为空值。字符型与数值型的
默认空值分别是空格与 0,日期型与逻辑型的默认空
值为 { / / }与,F.。
70
例 通过数组 y向学生表添加记录。
USE 学生
APPE BLAN
DIMENSION y(5)
Y(1)=’100100’
STORE "邓杰辉 " TO y(2)
y(3)="女 "
y(4)={^1986-07-23}
STORE,T,TO y(5)
GATHER FROM y
GO BOTT
DISP
71
(3)把表的一批记录同时复制到数组
命令格式:
COPY TO ARRAY <数组名 > [FIELDS] <字段名表 >]
[<范围 >] [FOR<条件 >] [WHILE<条件 >]
命令将当前表指定记录中指定字段的数据复制到指定
的数组之中。
若可选项都缺省,则复制除备注型字段以外的全部记
录数据。命令中指定的数组如不存在。 Visual
FoxPro会根据需要自动建立此数组,若数组已事先
定义好,该命令将不会自动调整数组的大小以满足要
求。可以复制表的单个记录的数据到一个一维数组中,
但与 SCATTER命令不同的是该命令不能把备注型字
段的数据复制到数据中。
72
COPY TO ARRAY命令能够一次把当前表中的多
个记录同时复制到指定二维数组中,一个记录的数
据送入数组的同一行中,即第一个字段数据送到该
行的第一列,第二个字段数据被送到该行的第二列,
依此类推。如果二维数组的列数小于表的字段数,
则多余的字段的数据将被丢失;如果大于,则多余
的数组列元素值保持不变。类似地,表的各个指定
记录会按顺序被复制到数组的各行之中。如果数组
的行数少于被指定的记录数,则多出的记录数据便
不被复制,否则剩下的数组行各元素保持原值不变。
73
(4)从数组向表添加记录
命令格式,
APPEND FROM ARRAY <数组名 > [FOR<条件 >]
[FIELDS <字段名表 >]
命令将满足条件的数组行的数据按记录形式依次添
加到当前表中,但它忽略备注型字段。
74
若选择 FIELDS子句,则在添加记录时只向其中
列出的字段传送数据。命令中指定的数组可以是
一维或二维,一维数组一次向表添加一个记录;
而二维数组的每一行将添加到表成为一个新记录,
所以二维数组的行数即为所添加的新记录个数。
若数组所具的列数多于表的字段数,这些多余列
的数组元素将被忽略;反过来,若表的字段数多
于数组的列数,则多出来的字段被自动赋以空值。
类似于单个记录与数组间的数据传送,当数组元
素的数据类型与表相应字段类型不同且不兼容时,
该字段将自动被赋以空值。
75
例 分析下列命令执行后,new.dbf的内容。
USE 学生
DIMENSION y(3,5)
COPY TO ARRAY y FOR AT("湖 ",籍贯 )>0 FIEL
学号,姓名,籍贯,出生日期,入学成绩
COPY STRU TO new FIEL 学号,姓名,籍贯,出生日
期,入学成绩
USE new
APPE FROM ARRA y
LIST
76
4.3.1 表的排序
排序 是根据不同的字段对当前表的记录做出不同的
排列,产生一个新的表。新表与旧表内容完全一样,
只是它们的记录排列顺序不同而已。
命令格式是:
SORT TO <文件名 > ON <字段 1>[/A|/D][/C][,<字段
2>[/A|/D][/C]…]
[FIELDS <字段名表 >] [<范围 >] [FOR <条件 >]
[WHILE <条件 >]
该命令对当前表中的记录按指定的字段排序,并将
排序后的记录输出到一个新的表中。
4.3 表的排序与索引
77
命令中各子句的含义是:
( 1) <文件名 >是排序后产生的新表文件名,其扩
展名默认为,dbf。
( 2)由 <字段 1>的值决定新表中记录的排列顺序,
缺省时,按升序排列。不能按备注型或通用型字段
排序。
可以用多个字段排序。 <字段 1>为首要排序字段,
<字段名 1>的值相等的记录再按 <字段 2>进一步排序,
依此类推。
( 3)对于在排序中使用的每个字段,可以指定升
序或降序的排列顺序。 /A表示升序,/D表示降序,
/A或 /D适合于任何类型的字段。
缺省时,字符型字段中的字母大小写是不同的。如
果在字符型字段后加上 /C,则忽略大小写。可以把
/C与 /A或 /D选项结合在一起使用。例如,/AC/DC。
78
( 4)由 FIELDS指定从当前表中的字段来生成
新表中包含的字段名。如果省略 FIELDS子句,
当前表中的所有字段都包含在新表中。
( 5)各种类型的字段名都可用做排序关键字。
数值型字段按数值大小进行排序,字符型字段
值的大小根据组成字符串的字符的 ASCII码值
的大小进行排序,汉字按其内码大小,日期型
字段按年、月、日的先后顺序进行排序,逻辑
型字段,F.小于,T.。
( 6)若省略 <范围 >,FOR <条件 >和 WHILE <
条件 >等选项,表示对所有记录排序。
79
例 就学生表,显示入学成绩最高的 5名职工的
记录。
操作命令如下:
USE 学生
SORT ON 入学成绩 /D TO cjb
USE cjb &&打开排序后生成的新表文件
LIST NEXT 5
80
4.3.2 索引概述
1.索引的概念
排序由于要建立一个新的表,因此数据记录很多
时,既费时间,又占用磁盘空间,为此,常用建立
索引文件的方法对表的记录重新组织。
索引并不是重新排列表记录的物理顺序,而是另
外形成一个索引关键表达式值与记录号之间的对照
表,这个对照表就是索引文件。索引文件中记录的
排列顺序称为逻辑顺序。索引文件发生作用后,对
表进行操作时将按索引表中记录的逻辑顺序进行操
作,而记录的物理顺序只反映了输入记录的历史,
对表的操作将不会产生任何影响。
对于用户来说,索引不但可以使数据记录重新组
织时节省磁盘空间,而且可以提高表的查询速度。
81
2.索引文件的种类
Visual FoxPro提供了两种不同类型的索引文件:单
索引文件和复合索引文件。
( 1)单索引文件。 单索引文件是指一个索引文件中
只能保存一个索引,其扩展名为 idx。采用单索引时,
对于每一个索引都要建立一个文件,这势必造成索
引文件的增多,特别是在更新索引时,必须打开所有的索引文件,这是不方便的。
单索引文件有普通的和压缩的两种。压缩的索引文
件可以使索引文件少占存储空间。
( 2)复合索引文件。 复合索引文件可以存储多个索
引,其扩展名为,cdx。复合索引文件中的每个索引
用一个索引标志( Index Tag)来表示。一个复合索
引文件中可包含的索引的数目亦即索引标志的数目
仅受内存空间的限制。复合索引文件一定是压缩的
索引文件。
82
有一类特殊的复合索引文件叫做 结构复合索引文件,
它的文件名与相应的表名相同,扩展名仍为 cdx。结
构复合索引文件的特殊性在于无论何时打开表,该索
引文件将由系统自动打开。这就意味着当对表的记录
进行修改时,全部索引也将自动更新。所以一般情况
下,使用结构复合索引是极为方便的。
复合索引将多个索引集中到一个索引文件,和单索
引相比,效率更高,使用更为方便。但单索引并非没
有用处,一方面使用单索引文件可以和 FoxBASE+等
早期的表产品兼容,另一方面单索引文件可以作为临
时性索引使用,因为如果复合索引所含的索引太多,
在更新索引时速度就会很慢。
83
4.3.3 建立索引文件
1.用命令建立索引
命令格式是:
INDEX ON <索引表达式 >
TO <单索引文件名 >|TAG <索引标志名 > [OF <复
合索引文件名 >]
[FOR <条件 >] [COMPACT]
[ASENDING|DESCENDING] [UNIQUE]
[ADDITIVE]
该命令对当前表建立一个索引文件或增加索引标志。
84
命令中各子句的含义是:
( 1) <索引表达式 >是包含当前表中的字段名的表
达式,表达式中的操作数应具有相同的数据类型。
( 2) 若给出 TO <单索引文件名 >子句,则建立一个
单索引文件。若给出 TAG <索引标志名 > [OF <复合
索引文件名 >],则建立一个复合索引文件,或为已
建立并打开的复合索引文件增加索引标志。 OF <复
合索引文件名 >选项用于指定非结构复合索引文件
的名字,省略此选项时,表示建立结构复合索引文
件。
85
( 3) 若选择 FOR <条件 >选项,则只有哪些满足条
件的记录才出现在索引文件中。
( 4) 选用 COMPACT,则建立一个压缩的单索引
文件。复合索引文件自动采用压缩方式。
( 5) 复合索引时,系统默认或选用 ASCENDING,
按索引表达式的升序建立索引。选用
DESCENDING按降序建立索引。单索引文件只能
按升序索引。
( 6) 选用 UNIQUE,则对于索引表达式值相同的
记录,只有第一个记录列入索引文件。
( 7) 选用 ADDITIVE,则建立本索引文件时,以
前打开的索引文件仍保持打开状态。
86
例 用建立索引文件的方法完成例 4.11的操作。
USE 学生
INDEX ON -入学成绩 TO sy
LIST NEXT 5
例 就学生表建立结构复合索引文件,其中包含 2个索
引:
( 1)按学号的升序排列,不允许有编号相同的记录。
( 2)先按性别升序,性别相同再按入学成绩降序排列。
USE 学生
INDEX ON 学号 TAG sy1 UNIQUE
INDEX ON 性别 +STR(1000-入学成绩 ) TAG sy2
87
2.在表设计器中建立索引
表设计器中的“索引”选项

88
4.3.4 索引文件的使用
1,打开索引文件
索引文件必须先打开才能使用。结构复合索引文件
随相关表的打开而自动打开,但单索引文件和非结
构复合索引文件必须由用户自己打开。打开索引文
件有两种方法,一种是在打开表的同时打开索引文
件,另一种是在打开表后,需要使用索引时,再打
开索引文件。
( 1)表和索引文件同时打开
命令格式是:
USE <表文件名 > INDEX <索引文件名表 >
该命令打开指定的表及其相关的索引文件。
89
命令中各子句的含义是:
① <索引文件名表 >可以包含多个索引文件,这些索
引文件可以是单索引文件,也可以是复合索引文件。
其中只有第一个索引文件对表的操作起控制作用,
称为主索引文件。
②如果第一个索引文件是复合索引文件,由于包含
多个索引标志,无法确定哪个索引标志起作用,所
以在打开后还要确定主索引,否则对表进行操作时,
数据记录仍按物理顺序排列。
90
( 2)打开表后再打开索引文件
命令格式是:
SET INDEX TO [<索引文件名表 >] [ADDITIVE]
该命令功为当前表打开一个或多个索引文件。
命令中各子句的含义是:
①省略任何选项而直接使用 SET INDEX TO,将关
闭当前工作区中除结构复合索引文件之外的全部索
引文件。
②若省略 ADDITIVE选项,则在使用该命令打开索
引文件时,除结构复合索引文件之外的索引文件均
被关闭。
91
2,确定主控索引
命令格式是:
SET ORDER TO [<索引文件顺序号 >|<单索引文件
名 >]|
[TAG] <索引标志名 > [OF <复合索引文件名 >]]
该命令指定表的主控索引文件或主控索引标志。
92
命令中各子句的含义是:
( 1) <索引文件顺序号 >表示已打开的索引文件的序号,
用以指定主控索引。单索引文件首先按打开的先后顺
序标识序号,然后,结构复合索引文件的索引标志按
其生成的顺序计数,最后是非结构复合索引文件的索
引标志按其生成的顺序计数。
( 2)最好使用 <单索引文件名 >指定一个单索引文件为
主控索引文件,这样做比用索引文件顺序号更直观。
( 3) [TAG] <索引标志名 > [OF <复合索引文件名 >]用于
指定一个已打开的复合索引文件中的一个索引标志为
主控索引。
( 4)不带任何短语的 SET ORDER TO命令可以取消主
控索引。
93
使用索引文件后,虽然表中各记录的物理顺序并未
改变。但记录指针不再按物理顺序移动,而是按主
控索引文件中记录的逻辑顺序移动,于是整个表中
的记录是按索引关键表达式值排序的效果。
使用索引文件时,还要特别注意以下几点:
( 1)在使用 GO命令时,GO <数值表达式 >使记录指
针指向具体的物理记录号,而与索引无关,而 GO
TOP|BOTTOM将使记录指针指向逻辑首或逻辑尾
记录,这时 GO TOP不再等同于 GO 1。
( 2) SKIP命令按逻辑顺序移动记录指针。
( 3)表被打开后,记录指针位于 TOP位置,而不一
定指向 1号记录 。
94
例 当有索引文件时,分析记录指针的移动规律。
USE 学生
INDEX ON 入学成绩 TO sy3
GO 6
RECNO(),姓名 &&显示 6 李勤奋
SKIP
RECNO(),姓名 &&显示 5 欧阳天地
95
3,关闭索引文件
命令格式是:
CLOSE INDEX
SET INDEX TO
该命令关闭当前工作区内所有打开的索引文件。但
结构复合索引文件不能关闭,它随表的关闭而自动
关闭。
此外,使用无任何选项的 USE命令,除了关闭当前
工作区的表外,也关闭了与之相关的索引文件。
96
4,删除索引
命令格式是:
DELETE FILE <索引文件名 >
DELETE TAG ALL|<索引标志名表 >
第一种格式的命令用于删除一个单索引文件。第二
种格式的命令用于删除打开的复合索引文件的所有
索引标志或指定的索引标志。如果一个复合索引文
件的所有索引标志都被删除,则该复合索引文件也
就自动被删除了。
97
5.更新索引
索引文件依赖于表而存在,当表中的数据发生
变化时,索引文件也应相应地被更新。如果在对表
进行修改时,已经打开了相关的索引文件,则
Visual FoxPro会对索引文件自动更新。如果没有打
开索引文件,则数据记录的变化无法反映到索引文
件中去。这时需要重新索引,当然可以使用前面介
绍过的 INDEX命令重新建立索引文件,但这样做需
要提供若干选择项,比较烦琐。通常的办法是使用
REINDEX命令来更新所有打开的索引文件。 命令
格式是:
REINDEX [COMPACT]
使用 COMPACT可以把普通的单索引文件变成压缩
的单索引文件。
98
6.索引查询定位
索引查询定位是在当前表中,按已确定的主索引文
件关键字来查询与指定表达式值相匹配的第一条记
录,找到后将记录指针定位于该记录。 命令格式是:
SEEK <表达式 >
命令中的 <表达式 >可以是数值型、字符型、日期型
或逻辑型表达式,但必须与索引表达式一致。对于
字符串表达式,有精确查询和不精确查询之分,精
确查询要求表达式的值与索引关键字值完全相同,
才认为找到,不精确查询只要表达式的值与索引关
键字值左边若干字符相同,就认为找到。查询方式
由 SET EXACT ON|OFF设置。
该命令只能使记录指针定位于符合条件的第一条
记录,可用 SKIP命令使指针指向下一个符合条件的
记录。
99
除 SEEK命令外,FIND命令也可用于索引查询,
其格式为:
FIND <字符常量 >|<数值常量 >
要 注意 FIND后面是字符常量或数值常量,不能是
表达式,所以 SEEK命令更具一般性。
例 就学生表,查询 1983年 9月 7日出生的学生的记录。
USE 学生
INDEX ON 出生日期 TAG sy4
D={^1983-09-07}
SEEK D
DISP
100
4.4.1 统计记录个数
命令格式是:
COUNT [<范围 >] [FOR<条件 >] [WHILE<条件 >]
[TO <内存变量 >]
该命令统计当前表中,在指定范围内满足指定条件
的记录个数。
4.4 表的统计与计算
101
命令中各子句的含义是:
( 1) <范围 >选择项的缺省值为 ALL。使用 TO <内
存变量 >选择项,将统计记录个数的结果存入指定
的内存变量中。
( 2)若设置了 SET TALK OFF,则不显示统计的
结果。若设置了 SET DELETED ON命令,则作了
删除标记的记录不被计数。
( 3)不带任何选项的 COUNT命令与 RECCOUNT()
函数作用相同,都可以获得一个表的记录数。但
RECCOUNT()函数忽略 DELETED设置,它总是把
做了删除标记的记录也计入总数中。要想忽略已删
除的记录或只计数那些符合某些条件的记录,就必
须使用 COUNT命令。
102
例 对学生表,分别统计男女生的人数。
操作命令如下:
USE 学生
COUNT FOR 性别 =”女” TO x1
COUNT FOR 性别 =”男” TO x2
x1,x2
103
4.4.2 求数值表达式之和与平均值
命令格式是:
SUM|AVERAGE [<表达式表 >] [<范围 >] [FOR<条件 >]
[WHILE<条件 >]
[TO <内存变量表 >|ARRAY <数组 >
该命令在当前表中,求指定表达式之和或平均值。
104
命令中各子句的含义是:
( 1)两条命令的格式相同,SUM命令求指定表达式
之和,而 AVERAGE命令求指定表达式的平均值。
( 2) <范围 >选择项的缺省值为 ALL。
( 3) <表达式表 >中的表达式可以包括字段名,也可
以不包括字段名,若省略 <表达式表 >,则对全部数
值型字段求和。计算结果存放在由 <内存变量表 >指
定的内存变量中或 <数组 >指定的数组元素中。
105
例 对学生表,求全体学生的平均年龄。
操作命令如下:
USE 学生
AVER YEAR(DATE())-YEAR(出生日期 ) TO y
y
106
4.4.3 财务统计
命令格式是:
CALCULATE <表达式表 > [<范围 >] [FOR<条件 >]
[WHILE<条件 >]
[TO <内存变量表 >|ARRAY <数组 >]
该命令在当前表中,对指定表达式进行财务统计函数
计算。
107
命令中各子句的含义是:
( 1)若没有选择 <范围 >,FOR <条件 >或 WHILE <
条件 >选项,则统计计算表的全部记录,否则只统
计计算指定范围内满足条件的记录。
( 2) <表达式表 >中的表达式至少应包含一种财务统
计函数。 Visual FoxPro共提供 8种财务统计函数:
AVE(<数值表达式 >):求数值表达式的平均值。
CNT():统计表中指定范围内满足条件的记录个数。
108
MAX(<表达式 >):求表达式的最大值,表达式可以是
数值、日期或字符型。
MIN(<表达式 >):求表达式的最小值,表达式可以是
数值、日期或字符型。
SUM(<数值表达式 >):求表达式之和。
NPV(<数值表达式 1>,<数值表达式 2>[,<数值表达式
3>]):求数值表达式的净现值。
STD(<数值表达式 >):求数值表达式的标准偏差。
VAR(<数值表达式 >):求数值表达式的均方差。
109
例 对学生表,进行如下操作:
( 1)求入学成绩的均方差。
( 2)求最年轻学生的出生日期。
操作命令如下:
USE 学生
CALC VAR(入学成绩 ) TO x1
CALC MAX(出生日期 ) TO x2
x1,x2
110
4.4.4 分类汇总
命令格式是:
TOTAL ON <关键字表达式 > TO <文件名 > [FIELDS
<数值型字段名表 >] [<范围 >]
[FOR <条件 >] [WHILE <条件 >]
该命令对当前表的某些数值型字段,按 <关键字表达
式 >进行分类统计,并把统计结果存放在 <文件名 >
指定的表中。
111
命令中各子句的含义是:
( 1) FIELDS <数值型字段名表 >指出要汇总的字段,
如果缺省则对表所有数值型字段汇总。
( 2) <范围 >缺省值是 ALL。
( 3)分类汇总是把所有具有相同关键字表达式值的
记录合并成一条记录,对数值字段进行求和,对其
他字段则取每一类中第一条记录的值。因此,为了
进行分类汇总,必须对当前表按 <关键字表达式 >进
行排序或建立索引文件。
( 4)如果分类汇总的值超过字段所能容纳的宽度时,
则 Visual FoxPro系统在这个字段上放入若干个,*”
号。为了避免这种情况,可以利用 MODIFY
STRUCTURE命令增加当前表中该字段的宽度,使
其能容纳分类汇总之和。
112
例 对学生表,按籍贯对入学成绩进行汇总。
操作命令如下:
USE 学生
INDEX ON 籍贯 TAG sy5
TOTAL ON 籍贯 TO hz FIELDS 入学成绩
USE hz
LIST 籍贯,入学成绩
113
4.5.1 工作区
1.工作区的概念
工作区是用来保存表及其相关信息的一片内存空间。
平时讲打开表实际上就是将它从磁盘调入到内存的
某一个工作区。在每个工作区中只能打开一个表文
件,但可以同时打开与表相关的其他文件,如索引
文件、查询文件等。若在一个工作区中打开一个新
的表,则该工作区中原来的表将被关闭。
有了工作区的概念,我们就可以同时打开多个表,
但在任何一个时刻用户只能选中一个工作区进行操
作。当前正在操作的工作区称为当前工作区。
4.5 多个表的操作
114
2.工作区号与别名
不同工作区可以用其编号或别名来加以区分。
Visual FoxPro提供了 2551个工作区,系统以 1~
2551作为各工作区的编号。
工作区的别名有两种,一种是系统定义的别名,1~
10号工作区的别名分别为字母 A~ J;另一种是用户
定义的别名,用命令,USE <表文件名 > ALIAS <别
名 >”指定。由于一个工作区只能打开一个表,因此
可以把表的别名作为工作区的别名。若未用 ALIAS
子句对表指定别名,则以表的主名作为别名。
115
3.工作区的选择
命令格式是,SELECT <工作区号 >|<别名 >|0
该命令选择一个工作区为当前工作区,以便打开一
个表或把该工作区中已打开的表作为当前表进行操
作。
116
命令中各子句的含义是:
( 1)工作区的切换不影响各工作区记录指针的位置。
每个工作区上打开的表有各自独立的记录指针。通
常,当前表记录指针的变化不会影响别的工作区中
表记录指针的变化。
( 2) SELECT 0表示选择当前没有被使用的最小号工
作区为当前工作区。用本命令开辟新的工作区,不
用考虑工作区号已用到了多少,使用最为方便。
( 3)也可在 USE命令中增加 IN子句来选择工作区并
打开表。例如,在 1号工作区打开学生表,并给它
取一个别名,可用命令:
USE 学生 ALIAS zg IN 1或 USE 学生 ALIAS zg IN A
117
4.工作区的互访
在当前工作区中可以访问其他工作区中的表的数据,
但要在非当前表的字段名前加上别名和连接符,引
用格式为:别名,字段名或别名 ->字段名。
118
4.5.2 表的关联
所谓关联,就是当前表记录指针的移动,能引起
别的表按某种条件相应地移动记录指针。建立关联
后,我们称当前表为主文件,与主文件建立关联的
表为子文件。
1.一对一的关联
命令格式是:
SET RELATION TO [<关联表达式 1>] INTO <工作
区号 1>|<别名 1>
[,<关联表达式 2> INTO <工作区号 2>|<别名 2>]…]
[ADDITIVE]
该命令使当前表与 INTO子句所指定的工作区上的表
按表达式建立关联。
119
命令中各子句的含义是:
( 1) INTO子句指定子文件所在的工作区,<关联表
达式 >用于指定关联条件。
①可以使用索引表达式建立关联。首先在子文件中
按某表达式建立索引并指定为主索引,然后使用某
关联表达式建立关联,当关联成功后,每当主文件
的记录指针移动时,Visual FoxPro就在子文件中查
找索引表达式的值和主文件中关联表达式的值相匹
配的记录,若找到了,则记录指针指向找到的第一
条记录,如没有找到,则记录指针指向文件尾。注
意,索引表达式和关联表达式不一定相同,当然大
多数情况下是相同的。
120
② 也可以使用数值表达式建立关联。当主文件的
记录指针移动时,子文件的记录指针移至和主文件
中数值表达式值相等的记录。
( 2)若选择 ADDITIVE,则在建立新的关联的同
时保持原先的关联,否则会去掉原先的关联。
( 3)省略所有选项时,SET RELATION TO命令
将取消与当前表的所有关联。
121
2.一对多的关联
前面介绍了一对一的关联,这种关联只允许访问子
文件满足关联条件的第一条记录。如果子文件有多
条记录和主文件的某条记录相匹配,当需要访问子
文件的多条匹配记录时,就需要建立一对多的关联。
命令格式是:
SET SKIP TO [<别名 1>[,<别名 2>…]
命令功能:
使当前表和它的子表建立一对多的关联。
122
命令中各子句的含义是:
( 1)别名指定子文件所在的工作区。如果缺省所
有选项,则取消主文件建立的所有一对多关联。
( 2)一个主文件可以和多个子文件分别建立一对
多的关联。因为建立一对多关联的表达式仍是建立
一对一关联的表达式,所以建立一对多的关联应分
两步完成:
①使用命令 SET RELATION建立一对一的关联
(使用索引方式建立关联)。
②使用命令 SET SKIP建立一对多的关联。
123
4.5.3 表的联接
命令格式是:
JOIN WITH <工作区号 >|<别名 > TO <文件名 > [FOR
<条件 >] [FIELDS <字段名表 >]
该命令将当前表与指定工作区的表按指定的条件进行
联接,联接产生一个新的表。
命令中各子句的含义是:
( 1) <工作区号 >|<别名 >指明被联接的表。 <文件名 >
指定联接后的新库文件名。
( 2) FOR<条件 >给出了联接的依据。联接时,首先
两个工作区的记录指针分别指向联接和被联接表中的
第一条记录,然后顺序检索被联接表中的每条记录,
看是否满足条件。如果条件满足则在新表中生成一条
新记录,当被联接表所有记录扫描完以后,则联接表
的记录指针即下移一条记录。重复上述过程依次处理,
直至联接表中所有记录均处理完毕。
124
由上述过程可以看出,若联接表的一条记录在被联
接表中有 m条符合条件的记录,便可在新数据文件
中生成 m条记录。若联接表有 n条记录(设条件总是
符合),则目的表将有 m× n条记录。当 m,n值较大
时,表联接过程很花时间。如果 <条件 >很宽,将使
很多记录参与联接,并且产生一个庞大的表。因此
使用该命令时应避免无实际意义的联接操作。联接
中最常用的是等值联接,即联接条件为两个表中公
共字段值对应相等。
( 3) FIELDS <字段名表 >指明生成新库文件中包
含有哪些字段,省略该选项时新数据库文件中将包
含两个表中的所有字段。