1
第十章 数据表的建立与操作
2
10.1 数据表的建立
10.1.1 数据表一个数据表是多行和多列构成的集合,每一列称为一个字段 ( Field) 或属性,它对应表中的数据项 。 字段的取值范围称为域,通常用字段描述表格实体在某一方面的属性 。
数据表的字段名称下面的每一行称为一个记录( Record)或元组,它是字段值的集合。记录中的数据随每一行记录的不同而变化。
3
学号 姓名 性别 班级编号 出生日期 总学分 照片 备注
1995120203 李富强,T,1202 08/03/76 0 gen mem
o1995120212 冯见岳,T,1202 06/18/75 0 gen mem
o1995160308 罗海燕,F,1603 12/06/76 0 gen mem
o1995180105 张丽萍,F,1801 01/08/76 0 gen mem
o1995180102 刘 刚,T,1801 07/13/76 0 gen mem
o1995160311 赵江山,T,1603 05/16/77 0 gen mem
o1995160321 许海霞,F,1603 02/12/75 0 gen mem
o1995120115 王春雷,T,1201 10/20/75 0 gen mem
o1995120207 李家富,T,1202 03/13/76 0 gen mem
o1995120215 张仙见,T,1202 09/21/75 0 gen mem
o1995160302 李小燕,F,1603 02/06/76 0 gen mem
o1995180107 吴亚平,F,1801 03/18/76 0 gen mem
o
4
10.1.2 创建数据表前的准备工作
1),字段名
2),字段类型
3),字段宽度
4),小数位数
5
字段名 类型 宽度 小数位 索引 Nulls
学号 字符型 10 升序 否姓名 字符型 8 是性别 逻辑型 1 否班级编号 字符型 4 否出生日期 日期型 8 否总学分 数值型 4 0 否照片 通用型 4 否备注 备注型 4 否
6
1.利用表设计器创建数据表结构
10.1.3 建立数据表结构
在“字段名”列输入各字段的名称。
在“类型”列选择列表中的某一字段类型。
在“宽度”列中设置列宽。
如果类型是数值型或浮点型,则需设置“小数位数”列中的小数点位数。
在“索引”列可选择按所需字段建立的索引的排列方式。
,NULL”列设置字段可以接受 NULL值。 NULL值表示无明确值,它不同于零、空格或空串。
7
2,利用表向导建立数据表结构
3.使用命令创建数据表结构命令格式一,CREATE [<新表文件名 >]
功能:打开“表设计器”,创建新的表文件结构。
例如:用以下命令建立 student.dbf:
CREATE STUDENT
执行后,将出现表设计器对话框,以后的操作与 1.相同命令格式二,CREATE TABLE <新表文件名 >( <字段名 1> <
类型 >( <长度 >) [,<字段名 2> <类型 >( <长度 >) …]
功能:不进入“表设计器”,直接创建一个 <新表文件名 >所指的数据表的结构。
8
10.1.4 表数据的输入
1,数据输入窗口
① 字段名右侧的光带指示了字段的宽度,若输入的数据达到了字段宽度,光标会自动移到下一字段,若没有,则需按回车键或 TAB键将光标移到下一字段 。
② 逻辑型字段只能接受 T,F,Y,N这四个字母之一;日期型字段数据必须与系统日期格式相符 。
③ 备注型或通用型字段的输入不能直接通过输入窗口输入
,而是在一个专门的编辑窗口中输入并编辑 。
④ 记录输入完毕,按 CTRL+W将输入的数据存盘并关闭记录输入窗口返回命令窗口;按 CTRL+Q或 ESC则废弃本次输入返回命令窗口 。
9
10
2,备注型字段的输入按 CTRL+PgDn或用鼠标双击进入 。 按 CTRL+W存盘,按
CTRL+Q或 ESC废弃本次输入 。
3,通用型字段的输入使用,编辑,菜单的,插入对象,命令
① 在记录输入窗口中,将光标移到通用型字段的,gen”处,按
CTRL+PgDn或用鼠标双击,进入通用型字段编辑窗口 。
② 选择,编辑,菜单的,插入对象,命令,出现插入对象对话框 。 在对话框中选择,新建,或,由文件创建,单选按钮等
,然后单击,确认,按钮,所选定的对象将自动插入到数据表中 。
③前两步也可通过剪贴板来完成。
11
10.1.5 数据表的打开与关闭
1.打开数据表
( 1) 菜单方式从,文件,?,打开,?选,文件类型,为,表*
.DBF”?确定
( 2) 命令方式
USE <文件名 >
12
2,关闭数据表
( 1) 通过使用数据工作期窗口来关闭表
( 2) 通过使用下列命令之一来关闭表
USE:关闭当前工作区中打开的数据表 。
CLEAR ALL:关闭所有的表,并选择 1号工作区;从内存释放所有内存变量及用户定义的菜单和窗口 。 但不释放系统变量 。
CLOSE ALL:关闭所有工作区中打开的数据库,表和索引,
并选择 1号工作区 。 与上条的区别:不关闭内存变量 。
CLOSE DATABASE[ALL]:关闭当前数据库及其中的表 。 若无当前数据库,则关闭所有工作区中所有打开的自由表,索引,
并选择 1号工作区 。 带有 ALL则关闭所有打开的数据库及其中的表和所有打开的自由表 。
CLOSE TABLES[ALL]:关闭当前数据库中所有的表,但不关闭数据库。
( 3)通过退出 VFP来关闭。
13
10.2 数据表结构的显示和修改
10.2.1 数据表结构的显示
LIST|DISPLAY STRUCTURE[TO PRINT[PROMPT]|TO FILE<
文件名 >]
命令功能:显示当前打开的数据表的结构,包括文件更新日期、记录个数、记录长度及各字段的名称、类型、宽度和小数位数等。
【 例 10— 2】 显示 student,dbf的结构 。
USE student
LIST STRU
14
10.2.2 数据表结构的修改
1,使用,表设计器,修改表的结构
( 1) 从菜单打开
( 2) 在命令窗口中使用如下命令打开表设计器修改表的结构:
MODIFY STRUCTURE
2.使用编程方式修改表的结构(本章略)
15
10.3.1记录指针的定位
1,在 Browse窗口中移动在 Browse窗口中,可通过移动光标来移动记录指针,
来定位所需记录 。 也可以通过菜单方式来进行指针的定位:
① 从,表,菜单中选择,转到记录,。
② 在下一级子菜单中可通过选择,第一个,,,最后一个,,,下一个,,,前一个,或,记录号,来移动指针 。
③ 如果选择了,记录号,,将会打开,转到记录,对话框如图 10-15所示,在对话框中输入需定位的记录号,
然后单击,确定,即可 。
10.3 表记录的基本操作
16
2,使用指针定位命令
( 1) 记录指针的绝对定位命令格式:
GO[TO] <记录号 >|TOP|BOTTOM
命令功能:将记录指针定位到指定的记录 。
使用说明:
① GO TOP:将记录指针指向表的第一个记录 。
② GO BOTTOM:将记录指针指向表的最后一个记录
③ <记录号 >可以是数值表达式,按取整数的原则,取值范围在 1
至当前数据表中的最大记录数之间,否则出错 。
( 2) 记录指针的相对定位命令格式:
SKIP [<数值表达式 >]
命令功能:
从当前记录开始移动记录指针,<数值表达式 >表示移动记录的个数。
17
函 数 功 能
EOF() 测试记录指针是否指向文件尾,如指向文件尾,函数返回值为,T.,否则为,F.
BOF() 测试记录指针是否指向文件头,如指向文件头,函数返回值为,T.,否则为,F.
RECNO() 返回指定工作区中当前记录的记录号
RECCOUNT() 返回指定工作区中表的记录个数
DELETED() 测试指定工作区中表的当前记录是否有删除标记,如有删除标记,函数返回值为,T.,否则为,F.
FOUND() 测试指定工作区中最近一次查找数据是否成功,如找到记录,函数返回值为,T.,否则为,F.
VFP常用表操作函数
18
【 例 10-4】 设 计一 个可 以按 记 录浏 览,编辑,学生 情 况表,(student.dbf)的表单 。
19
10.3.2 表记录的显示
1,命令方式命令格式:
LIST | DISPLAY [[FIELDS] <字段名表 >][<范围 >] [FOR<条件表达式 >] [WHILE <条件表达式 >][OFF] [TO PRINTER
[PROMPT] | TO FILE<文件名 >]
,范围,参数有以下四种表示:
● ALL:当前表中的全部记录 。
● NEXT N:从当前记录开始,后面连续的 N条记录 ( 包括当前记录 )
● RECORD N:第 N条记录
● REST:从当前记录起到最后一条记录的全部记录(包括当前记录)。
20
FOR<条件表达式 >:它指定选择记录的条件 。 例如:
USE STUDENT
GO 3 &&记录指针指向第 3个记录
LIST NEXT 5 FOR 性别 =.F,&&显示第 3,4,7三条记录
WHILE<条件表达式 >:也是指定选择记录的条件,但它仅在当前记录满足条件时开始筛选记录,当第一次遇到不满足条件的记录时就停止操作 。
WHILE<条件表达式 >若与 FOR<条件表达式 >同时使用,则
WHILE项优先。
OFF:表示不显示记录号
21
【 例 10-5】 对 STUDENT.DBF数据表进行如下操作,
① 显示表中 2— 6号记录的学号,姓名和性别 。
② 显示所有男生的学号,姓名,性别,班级编号 。
③显示表中 1975年出生的同学的学号、姓名、性别及出生日期。
2,菜单方式查看表内容最快的方法是使用,浏览,窗口 。
( 1) 打开想要查看的表 。
( 2)选择 【 显示 】 → 【 浏览 】 命令,系统弹出记录浏览窗口,
显示当前表中的记录。这时还可以选择 【 显示 】 → 【 浏览 】 或 【 编辑 】 来改变显示方式。
22
10.3.3 表记录的修改
1,浏览修改
( 1) 命令方式命令格式:
BROWSE [<范围 >][FIELDS <字段名表 >][FOR<条件表达式 >]
功能,在浏览窗口中显示当前表中命令选项指定的记录的内容,
以供编辑修改 。
( 2) 菜单方式
2,编辑修改命令格式:
EDIT/CHANGE [FIELDS<字段名表 >][<范围 >][FOR<条件表达式
>][WHILE <条件表达式 >]
功能:按照给定条件编辑修改当前打开的表文件的记录 。
使用说明:
选项的使用同 BROWSE命令。执行命令后将进入浏览窗口的编辑状态。
23
3,替换修改命令格式:
REPLACE <字段名 1> WITH <表达式 1> [ADDITIVE][,<字段名 2>
WITH <表达式 2> [ADDITIVE]],.,[<范围 >][FOR <条件表达式
>][WHILE <条件表达式 >]
命令功能,不进入全屏幕编辑方式,用指定表达式的值替换当前表中满足条件的记录的指定字段的值
【 例 10-7】 将 STUDENT.DBF中 1603班的学生的总学分都增加 3个学分 。
USE STUDENT
REPLACE ALL 总学分 WITH 总学分 +3 FOR 班级编号 =”1603”
24
10.3.4 向表中添加新记录
1,追加记录
( 1) 命令方式命令格式,APPEND [BLANK]
命令功能:在当前已打开的表的末尾追加一条或多条新记录 。
使用说明:若使用 [BLANK]选项,则将在表末尾追加一条空白记录,并自动返回命令窗口,此时系统并不弹出编辑窗口 。 否则,将弹出记录编辑窗口,等待用户输入新记录 。
( 2) 菜单方式
2,从其他数据表中追加记录命令格式:
APPEND FROM <文件名 > [FIELDS <字段名表 >][FOR <条件表达式 >][WHILE<条件表达式 >]
命令功能:
将指定的表文件中符合条件的记录添加到当前表文件的末尾。
25
10.3.5 设置过滤器与字段表
1,设置过滤器
( 1) 通过界面设置若要为表设置过滤器:从,表?,属性,?,工作区属性
”?,数据过滤器,?输入筛选表达式
( 2) 使用命令命令格式,SET FILTER TO [<逻辑表达式 >]
命令功能:从当前表中筛选出满足条件的记录进行操作,而,
滤掉,那些不满足条件的记录 。
使用说明,省略 <逻辑表达式 >表示取消已设置的过滤器 。
例如,SET FILTER TO,NOT.STUDENT.性别
26
2.设置字段表若想只对某些字段起作用,可以设置字段表来限制访问。
( 1)通过界面设置
( 2)使用命令命令格式,SET FIELDS TO [ALL|<字段名表 >]
与之相关的命令有,SET FIELDS ON | OFF
27
3.使用表格控件为了能通过表单更好地控制数据表中的数据的显示,用户可以在表单上使用表格( Grid)控件来显示打开的表中的字段。
表格控件是一个容器对象,按行和列的形式操作和显示数据。
表格、列、表头和列控件都有自己的属性、事件和方法。
( 1)创建表格控件可以用以下两种方法来创建表格控件:
①从数据环境创建先打开表单设计器,在数据环境中添加所需显示的表,然后用鼠标将数据环境中的表窗口的标题栏拖到表单窗口后释放。
②利用表格生成器创建首在表单上创建一个表格,然后用鼠标右键单击表格,在弹出的快捷菜单中选“生成器”命令
28
29
( 2) 常用属性
l 常用的表格属性:
ColumnCount:指定表格的列数 。 默认值为 -1,此时 表格中将列出表的所有字段 。
RecordSource:指定表格数据源,即指定要在表格中显示的记录源 。
RecordSourceType:指定表格数据源的数据类型 。 属性值取值如下:
0— 表 1— 别名 2— 查询 (.QPR) 3— 提示 4— SQL说明
AllowAddNew:该属性的值为,T.时允许用户向表格中的表添加记录 。 将光标移到最后一条记录,按向下的光标键,表格中就会产生新记录行 。 该属性为,F.
时,只能用 APPEND BLANK或 INSERT命令来添加新记录 。
ChildOrder:用于指定在建立一对多关系时,子表所要用到的索引 。
LinkMaster:用于指定表格控件所显示的子表的父表名称 。
l 常用的列属性:
ControlSource:指定要在列中显示的数据源,一般为表的一个字段 。
CurrentControl:指定列对象中用来显示和接收列中活动单元格的值的一个控件,默认为 Text1。
Sparse:用于确定 CurrentControl指定的控件是否影响整个列中的所有元素。属性值为,T,
l 常用的表头属性:
Caption:用于指定表头的标题文本 。
Alignment:用于指定表头的标题文本的对齐方式。
30
【 例 10-8】 设计一个按姓名或班级编号过滤编辑,学生情况表,
的表单 。
① 设计表单界面打开表单设计器,将 student表加入数据环境,通过数据环境在表单上创建一个 grdstudent表格对象,再添加两个标签控件,两个文本框控件,一个命令按钮和一个线条控件
31
② 编写代码编写 Command1的 Click事件代码:
do case
case !empty(thisform.text1.value)
set filter to student.姓名 =allt(thisform.text1.value)
case !empty(thisform.text2.value)
set filter to student.班级编号 =allt(thisform.text2.value)
otherwise
set filter to
endcase
thisform.grdstudent.refresh
32
10.3.6 表记录的删除逻辑删除 物理删除
1,通过浏览窗口操作
2,使用命令
( 1) 逻辑删除记录命令格式,DELETE [<范围 >][FOR<条件 >][WHILE<条件 >]
( 2) 隐藏逻辑删除记录命令格式,SET DELETED ON | OFF
SET DELETED的缺省状态是 OFF。
( 3) 恢复逻辑删除记录命令格式,RECALL [<范围 >] [FOR <条件 >] [WHILE <条件 >]
( 4) 物理删除记录 命令格式,PACK
( 5) 删除全部记录 命令格式,ZAP
功能:将当前打开的表文件中的全部记录删除掉,但保留表结构
33
10.3.7 表的复制
1.复制的表结构命令格式:
COPY STRUCTURE TO <文件名 > [FIELDS <字段名表 >]
2.复制数据表命令格式:
COPY TO <文件名 >[FIELDS <字段名表 >][<范围 >] [FOR <条件表达式 >][WHILE <条件表达式 >][[TYPE]SDF|XLS|DELIMITED
[WITH<定界符 >|WITH BLANK|WITH TAB]]
34
【 例 10-11】 将 STUDENT.DBF复制生成一个 EXCEL文件
XSTUD.XLS。
USE STUDENT
COPY TO XSTUD TYPE XLS
【 例 10-9】 将 STUDENT.DBF中所有女同学记录的姓名,班级编号,性别复制到 STUD2.DBF中 。
USE STUDENT
COPY TO STUD2 FOR 性别 =.F,FIELDS 姓名,班级编号,性别
【 例 10-10】 将 STUDENT.DBF中的前 3个记录复制到 SSTUD.TXT
( SDF格式 ),DSTUD.TXT( DELIMITED格式 ) 中 。
USE STUDENT
COPY TO SSTUD NEXT 3 TYPE SDF
GO TOP
COPY TO DSTUD NEXT 3 TYPE DELIMITED
35
10.3.8 ActiveX绑定控件( OLEBoundControl)
使用方法如下:
( 1) 创建表单的数据环境,在数据环境中添加所需的包含通用型字段的表 。
( 2) 可以直接从数据环境中将通用型字段拖到表单上产生
ActiveX绑定控件,也可以单击表单控件工具栏中的,ActiveX绑定控件,按钮,在表单上先创建一个 OLE绑定型控件,然后设置这个对象的 ControlSource属性值为表中的通用型字段名 。
( 3)运行表单后便可以通过这个对象显示通用型字段的内容
。不过只有当记录指针指向通用型字段中含有数据的记录时,
OLE绑定型控件区域内才会显示数据。
36
10.4 数据表的排序和索引
10.4.1 数据表的排序命令格式:
SORT TO <新文件名 > ON <字段 1>[/A|/D][/C][,<字段 2>[/A|/D]
[/C],..] [FIELDS <字段名表 >][<范围 >][FOR<逻辑表达式
>][WHILE<逻辑表达式 >]
命令功能:对数据表中的记录按指定的字段排序,生成新的表。
37
① <新文件名 >是排序后产生的文件,其扩展名默认为 DBF。
②由 <字段 1>的值决定新表中记录的排列顺序,用作排序的字段的数据类型允许是 N,C,D,L型,不能是 MEMO和
GEN型。当有多个排序字段时,先按 <字段 1>的值排列,其值相同的,再按 <字段 2>的值排列,依此类推。
③对于排序字段,可以指定升序或降序的排列顺序。选项 /A
表示升序,/D表示降序,/C表示不区分大小写,若缺省,则按升序排列。可以把 /C与 /A或 /D选项结合在一起使用,例如
,/AC或 /DC。
38
【 例 10-12】 将 STUDENT.DBF中记录按出生日期进行降序排列,并显示 。
USE STUDENT
SORT TO STUD2 ON 出生日期 /D
USE STUD2 &&打开新表
LIST
39
10.4.2 数据表的索引
Visual FoxPro系统中支持两种不同的索引文件类型,单索引文件和复合索引文件。
单索引文件是指每个索引存放在一个独立的索引文件中,扩展名为,IDX。
复合索引文件中可以包含多个索引,其扩展名为,CDX。复合索引文件又有两种:一种是独立复合索引文件;另一种是结构复合索引文件。
索引可分为下列四种类型:
( 1)主索引 ( 2)侯选索引
( 3)唯一索引 ( 4)普通索引
1.索引的概念
40
2,建立索引
( 1)使用表设计器建立索引
① 打开表文件。
② 选择 【 显示 】 → 【 表设计器 】 命令,打开表设计器对话框,选择“索引”选项卡,注意:用表设计器建立的索引都是结构复合索引文件。
③ 在“索引名”框中输入索引标识名;在“类型”的下拉列表框中选定一种索引类型。
④ 确定好各项后,选择“确定”,关闭表设计器,同时索引建立完成。
41
42
( 2)使用索引命令建立命令格式:
INDEX ON <索引关键字表达式 > TO <单索引文件 >|TAG<
标识名 >[OF<独立复合索引文件名 >][FOR<逻辑表达式 >]
[ASCENDING|DESCENDING] [UNIQUE]
[ADDITIVE][COMPACT][CANDIDATE]
命令功能:
对当前表文件按指定的关键字建立一个索引文件或索引标识。
43
【 例 10-13】 对 STUDENT.DBF进行如下操作:
① 建立按出生日期升序排列的单索引文件 STUD.IDX。
② 建立包含按姓名降序排列的索引标识的结构复合索引文件 。
③ 在表文件 STUDENT.DBF的结构复合索引文件中,
追加一个先按班级编号升序再按学号升序的索引标识 。
USE STUDENT
INDEX ON 出生日期 TO STUD
INDEX ON 姓名 TAG XM DESCENDING
INDEX ON 班级编号 +学号 TAG XBXH
44
3,索引文件的打开命令格式 1:
USE <表文件名 > [INDEX <索引文件名表 |? >][ORDER <数值表达式 >|<单索引文件名 >|[TAG]<索引标识名 >[OF<复合索引文件名 >][ASCENDING|DESCENDING]]
命令格式 2:
SET INDEX TO [<索引文件名表 >][ORDER<数值表达式 >|<单索引文件名 >|[TAG] <标识名 > [ASCENDING |
DESCENDING]][ADDITIVE]
45
4,索引文件的关闭命令格式 1,USE
命令功能:关闭当前工作区中打开的表文件及所有索引文件。
命令格式 2,SET INDEX TO
命令格式 3,CLOSE INDEX
命令功能:关闭当前工作区中打开的所有单索引文件和独立复合索引文件。
46
5,改变主控索引数据表的主控索引可以在打开表或打开索引文件时设置,也可以在需要时设置或更换。
命令格式:
SET ORDER TO [<数值表达式 1> | <单索引文件名 > |
[TAG] <标识名 > [IN <数值表达式 2> | <字符表达式 >]
[ASCENDING | DESCENDING]]
47
6,索引文件的更新索引文件依赖于数据表而存在,当数据表中的数据发生变化时,索引文件也应该相应地更新。
如果在对数据表进行修改时,已经打开了相关的索引文件,则系统会自动地更新索引文件。
如果没有打开索引文件,则索引不能进行相应的更新。
为避免使用旧的索引文件导致错误,这时需要重新索引,
可以在“表”菜单中选择“重新建立索引”,或者使用命令 REINDEX。
48
7,索引的删除
( 1)索引标识的删除命令格式:
DELETE TAG <标识名 1> [,<标识名 2>],..
或,DELETE TAG ALL [OF <复合索引文件名 >]
命令功能:
从指定的复合索引文件中删除索引标识
( 2)单索引文件的删除命令格式,DELETE FILE <单索引文件名 >
命令功能:
删除指定的单索引文件。
使用说明:
关闭的单索引文件才能被删除,文件名必须带扩展名。
49
10.5 数据表的查询
10.5.1 顺序查询顺序查询包括 LOCATE和 CONTINUE两条命令。
命令格式:
LOCATE [FOR<逻辑表达式 >][<范围 >][WHILE <逻辑表达 >]
命令功能:
在当前表中指定范围中查找满足条件的第一条记录。
50
10.5.2 索引查询
1,FIND命令命令格式:
FIND <字符串 >/<数值常量 >
【 例 10-14】 在表文件 STUDENT.DBF中查找姓,赵,的记录 。
USE STUDENT
SET ORDER TO XM
FIND 赵
DISP &&显示第一个姓赵的记录
SKIP &&继续查找第二个姓赵的记录
51
2,SEEK命令命令格式,SEEK <表达式 >
命令功能:在当前表文件中,按已确定的主控索引查找关键字值与 <表达式 >相匹配的第一个记录,若找到,记录指针 。 指向该记录;否则指向文件尾,给出信息,没找到
” 。
使用说明:
① SEEK命令可以查找字符型,数值型,日期型,逻辑型表达式的值 。 但命令中的表达式的类型必须与索引表达式的类型相同 。
② 表达式为字符串时,必须用定界符括起来,字符型内存变量可以直接进行查询,不用进行宏替换 。 日期常量也必须用大括号括起来 。
【 例 10-15】 用 SEEK命令在 STUD.DBF中查找 1977年 5月 16日出生的记录 。
USE STUDENT
INDEX ON 出生日期 TAG CSRQ
SEEK {^1977/05/16}
52
10,6 数据表的统计
10.6.1统计记录个数命令格式:
COUNT [<范围 >] [FOR <逻辑表达式 >] [WHILE <逻辑表达式 >] [TO <内存变量 >]
命令功能:
用于统计当前表中指定范围内满足条件的记录个数。
10.6.2求和命令格式:
SUM [<数值表达式表 >] [<范围 >] [FOR <条件 >] [WHILE <条件 >] [TO <内存变量表 > | TO ARRAY <数组 >]
命令功能:
对指定范围内、满足条件的记录按指定的各个表达式分别求和。
53
【 例 10-16】 有一 表文件 GZGL.DBF 内容如下,对
GZGL.DBF中的基本工资,岗位工资,奖金和工资总额求和,并将结果分别存放在变量 JB,GW,JJ,ZE中 。
USE GZGL
SUM 基本工资,岗位工资,奖金,工资总额 TO JB,GW,JJ,ZE
54
10.6.3求平均值命令格式:
AVERAGE [<数值表达式表 >] [<范围 >] [FOR <逻辑表达式
>] [WHILE <逻辑表达式 >] [TO <内存变量表 > | TO ARRAY <
数组 >]
命令功能:
对当前表文件中指定范围内满足条件的记录,按指定的数值型字段计算平均值。
55
10.6.4综合计算
CALCULATE命令用于对表中的字段进行财经统计,其计算工作主要由函数来完成 。
命令格式:
CALCULATE <表达式表 > [<范围 >] [FOR <逻辑表达式 >] [WHILE
<逻辑表达式 >] [TO <内存变量表 > | TO ARRAY <数组 >]
函 数 功 能
AVG( <数值表达式 >) 求数值表达式的平均值
CNT( ) 统计数据表中指定范围内满足条件的记录个数
MAX( <表达式 >) 求表达式的最大值,表达式可以是数值,
日期或字符型
MIN( <表达式 >) 求表达式的最小值,表达式可以是数值,
日期或字符型
SUM( <数值表达式 >) 求数值表达式之和
56
【 例 10-17】 计算 GZGL.DBF中的人数,奖金收入的平均值和最大值,工资总额的最大值,平均值 。
USE GZGL
CALC CNT(),AVG(奖金 ),MAX(奖金 ),AVG(工资总额 ),MAX(
工资总额 ) TO X1,X2,X3,X4,X5
10.6.5分类汇总命令格式:
TOTAL ON <关键字段 > TO <汇总文件名 > [FIELDS <数值型字段名表 >] [<范围 >] [FOR <逻辑表达式 >] [WHILE <逻辑表达式 >]
57
使用说明:
① FIELDS <数值型字段名表 >指出要汇总的字段,如果缺省则对数据表所有数值型字段汇总 。
② <范围 >缺省值是 ALL。
③ 分类汇总是把所有具有相同关键字表达式值的记录合并成一条记录,对数值型字段进行求和,对非数值型字段,则把关键字值相同的连续记录的第一条记录的字段内容存入新表 。 因此,必须对当前数据表按 <关键字段 >进行排序或建立索引 。 汇总命令执行后,将生成一个新的数据表文件 ( 并没有被打开 ) 。
④汇总文件的结构与当前表的结构完全相同,汇总记录个数由 <关键字段 >的值确定。若数值型字段的汇总值超过了原数据表该字段的宽度,系统会自动修改汇总表中该字段的宽度。
58
【 例 10-18】 对 GZGL.DBF按,车间,分类汇总 。
USE GZGL
INDEX ON 车间 TAG CJ
TOTAL ON 车间 TO GZCJ
USE GZCJ
LIST &&GZCJ表中只有 4条记录
59
10.7 同时使用多个表
10.7.1工作区
1.工作区和当前工作区
2,工作区号与别名每一个工作区可以用工作区号或别名来标识 。
( 1) 工作区号
Visual FoxPro 提供了 32767个工作区,系统用 1~ 32767来作为各工作区的编号 。 系统默认值为 1号工作区 。
( 2) 别名编号 1~ 10的工作区还可用 A~ J这 10个字母来标识,A~ J分别称为 1~ 10号工作区的工作区别名 。 还可采用工作区中已打开的数据表的表名或数据表的别名来作为工作区别名 。
命令格式,USE〈 数据表名 〉 ALIAS〈 别名 〉
命令功能:打开数据表并为该数据表定义一个别名 。
使用说明:给数据表定义了别名后,数据表名就不是默认的别名了 。 Se;ect 0 表示选择未用的最小的工作区 。 测试工作区的函数为
select()
60
3.工作区的选择当系统启动后,1号工作区默认为当前工作区,若想改变当前工作区,则可使用 SELECT命令来将指定的工作区设为当前工作区。命令格式,SELECT <工作区号 >|<别名 >
1 …… 3276
7
Use student
student
Select 3
Use gzgl alias
gz
gz
Select 0
Use stu
stu
61
【 例 10-19】 在 1号和 2号工作区内分别打开 STUDENT.DBF
和 COURSE.DBF表文件,并选择 1号工作区为当前工作区 。
SELECT 2 && 或 SELECT B
USE COURSE
SELECT 1
USE STUDENT
62
4,非当前工作区字段的引用可对当前工作区的表进行任何操作,也可以在当前工作区中对其他工作区中的表中的数据进行访问,但要在非当前表的字段名前加上别名和连接符,引用格式为:
<工作区别名 >-> <字段名 > 或 <工作区别名 >.<字段名 >
【 例 10-20】 在 1号工作区打开 STUDENT.DBF,在 2号工作区内查看当前记录的学号,姓名 。
SELECT A
USE STUDENT && 在 1号工作区中打开 STUDENT
SELECT B
DISPLAY A.学号,A.姓名 &&显示 STUDENT中当前记录的学号、姓名
63
10.7.2 数据工作期窗口数据工作期窗口可通过选定“窗口”菜单中的“数据工作期
”或单击工具栏中的“数据工作期窗口”按钮来打开
64
10.7.3 表的关联
1,表之间的关系在“数据库设计器”中,通过连接不同表的索引可以很方便地建立表之间的关系,这种在数据库中建立的关系被作为数据库的一部分保存起来,称为永久关系。而两表之间仅在运行时存在的关系,称为临时关系。
2,建立表之间的临时关系可以通过下面几种方法创建临时关系:
( 1)在“数据工作期”窗口中创建
( 2) 使用命令创建临时关系命令格式,SET RELATION TO [<关键字表达式 1> INTO<别名
1>|<工作区号 1>[,<关键字表达式 2> INTO<别名 2>|<工作区号
2>… ][ADDITIVE]]
命令功能:将当前工作区的表与 <别名 >( 或工作区号 ) 所指定的工作区中的表按 <关键字表达式 >建立关联 。
SET RELATION TO则表示取消临时关系 。
65
例如,在 1区打开 xs.dbf,在 2区打开 xscj.dbf,按关键字 xh设置关联,然后查看记录:
Use xs
Select 2
Use xscj order xh
Select 1
Set relation to xh into b
Xh,xm,xscj->fox,xscj->sx,xscj.english
66
本章学习的主要命令、函数有:
CREATE USE <文件名 > USE CLEAR ALL CLOSE ALL
CLOSE DATABASE CLOSE TABLES LIST|DISPLAY STRUCTURE
MODIFY STRUCTURE BROWSE GO TOP GO 记录号
GO BOTTOM SKIP EOF() BOF() RECNO() RECCOUNT()
DELETED() FOUND() DISPLAY| LIST EDIT |CHANGE APPEND
APPEND BLANK APPEND FROM SET FILTER TO SET FIELD TO
DELETE RECALL PACK ZAP COPY STRUCTURE TO
COPY TO <文件名 >…… [ SDF | XLS | DELIMITED ]
SORT TO <文件名 > [ /a | /d |/c] INDEX ON <关键字表达式 > TAG 标识
SET INDEX TO CLOSE INDEX SET ORDER TO DELETE TAG
LOCATE FOR COUNTINUE FIND SEEK COUNT SUM
AVERAGE CALCULATE TOTAL SET RELATION TO INTO
第十章 数据表的建立与操作
2
10.1 数据表的建立
10.1.1 数据表一个数据表是多行和多列构成的集合,每一列称为一个字段 ( Field) 或属性,它对应表中的数据项 。 字段的取值范围称为域,通常用字段描述表格实体在某一方面的属性 。
数据表的字段名称下面的每一行称为一个记录( Record)或元组,它是字段值的集合。记录中的数据随每一行记录的不同而变化。
3
学号 姓名 性别 班级编号 出生日期 总学分 照片 备注
1995120203 李富强,T,1202 08/03/76 0 gen mem
o1995120212 冯见岳,T,1202 06/18/75 0 gen mem
o1995160308 罗海燕,F,1603 12/06/76 0 gen mem
o1995180105 张丽萍,F,1801 01/08/76 0 gen mem
o1995180102 刘 刚,T,1801 07/13/76 0 gen mem
o1995160311 赵江山,T,1603 05/16/77 0 gen mem
o1995160321 许海霞,F,1603 02/12/75 0 gen mem
o1995120115 王春雷,T,1201 10/20/75 0 gen mem
o1995120207 李家富,T,1202 03/13/76 0 gen mem
o1995120215 张仙见,T,1202 09/21/75 0 gen mem
o1995160302 李小燕,F,1603 02/06/76 0 gen mem
o1995180107 吴亚平,F,1801 03/18/76 0 gen mem
o
4
10.1.2 创建数据表前的准备工作
1),字段名
2),字段类型
3),字段宽度
4),小数位数
5
字段名 类型 宽度 小数位 索引 Nulls
学号 字符型 10 升序 否姓名 字符型 8 是性别 逻辑型 1 否班级编号 字符型 4 否出生日期 日期型 8 否总学分 数值型 4 0 否照片 通用型 4 否备注 备注型 4 否
6
1.利用表设计器创建数据表结构
10.1.3 建立数据表结构
在“字段名”列输入各字段的名称。
在“类型”列选择列表中的某一字段类型。
在“宽度”列中设置列宽。
如果类型是数值型或浮点型,则需设置“小数位数”列中的小数点位数。
在“索引”列可选择按所需字段建立的索引的排列方式。
,NULL”列设置字段可以接受 NULL值。 NULL值表示无明确值,它不同于零、空格或空串。
7
2,利用表向导建立数据表结构
3.使用命令创建数据表结构命令格式一,CREATE [<新表文件名 >]
功能:打开“表设计器”,创建新的表文件结构。
例如:用以下命令建立 student.dbf:
CREATE STUDENT
执行后,将出现表设计器对话框,以后的操作与 1.相同命令格式二,CREATE TABLE <新表文件名 >( <字段名 1> <
类型 >( <长度 >) [,<字段名 2> <类型 >( <长度 >) …]
功能:不进入“表设计器”,直接创建一个 <新表文件名 >所指的数据表的结构。
8
10.1.4 表数据的输入
1,数据输入窗口
① 字段名右侧的光带指示了字段的宽度,若输入的数据达到了字段宽度,光标会自动移到下一字段,若没有,则需按回车键或 TAB键将光标移到下一字段 。
② 逻辑型字段只能接受 T,F,Y,N这四个字母之一;日期型字段数据必须与系统日期格式相符 。
③ 备注型或通用型字段的输入不能直接通过输入窗口输入
,而是在一个专门的编辑窗口中输入并编辑 。
④ 记录输入完毕,按 CTRL+W将输入的数据存盘并关闭记录输入窗口返回命令窗口;按 CTRL+Q或 ESC则废弃本次输入返回命令窗口 。
9
10
2,备注型字段的输入按 CTRL+PgDn或用鼠标双击进入 。 按 CTRL+W存盘,按
CTRL+Q或 ESC废弃本次输入 。
3,通用型字段的输入使用,编辑,菜单的,插入对象,命令
① 在记录输入窗口中,将光标移到通用型字段的,gen”处,按
CTRL+PgDn或用鼠标双击,进入通用型字段编辑窗口 。
② 选择,编辑,菜单的,插入对象,命令,出现插入对象对话框 。 在对话框中选择,新建,或,由文件创建,单选按钮等
,然后单击,确认,按钮,所选定的对象将自动插入到数据表中 。
③前两步也可通过剪贴板来完成。
11
10.1.5 数据表的打开与关闭
1.打开数据表
( 1) 菜单方式从,文件,?,打开,?选,文件类型,为,表*
.DBF”?确定
( 2) 命令方式
USE <文件名 >
12
2,关闭数据表
( 1) 通过使用数据工作期窗口来关闭表
( 2) 通过使用下列命令之一来关闭表
USE:关闭当前工作区中打开的数据表 。
CLEAR ALL:关闭所有的表,并选择 1号工作区;从内存释放所有内存变量及用户定义的菜单和窗口 。 但不释放系统变量 。
CLOSE ALL:关闭所有工作区中打开的数据库,表和索引,
并选择 1号工作区 。 与上条的区别:不关闭内存变量 。
CLOSE DATABASE[ALL]:关闭当前数据库及其中的表 。 若无当前数据库,则关闭所有工作区中所有打开的自由表,索引,
并选择 1号工作区 。 带有 ALL则关闭所有打开的数据库及其中的表和所有打开的自由表 。
CLOSE TABLES[ALL]:关闭当前数据库中所有的表,但不关闭数据库。
( 3)通过退出 VFP来关闭。
13
10.2 数据表结构的显示和修改
10.2.1 数据表结构的显示
LIST|DISPLAY STRUCTURE[TO PRINT[PROMPT]|TO FILE<
文件名 >]
命令功能:显示当前打开的数据表的结构,包括文件更新日期、记录个数、记录长度及各字段的名称、类型、宽度和小数位数等。
【 例 10— 2】 显示 student,dbf的结构 。
USE student
LIST STRU
14
10.2.2 数据表结构的修改
1,使用,表设计器,修改表的结构
( 1) 从菜单打开
( 2) 在命令窗口中使用如下命令打开表设计器修改表的结构:
MODIFY STRUCTURE
2.使用编程方式修改表的结构(本章略)
15
10.3.1记录指针的定位
1,在 Browse窗口中移动在 Browse窗口中,可通过移动光标来移动记录指针,
来定位所需记录 。 也可以通过菜单方式来进行指针的定位:
① 从,表,菜单中选择,转到记录,。
② 在下一级子菜单中可通过选择,第一个,,,最后一个,,,下一个,,,前一个,或,记录号,来移动指针 。
③ 如果选择了,记录号,,将会打开,转到记录,对话框如图 10-15所示,在对话框中输入需定位的记录号,
然后单击,确定,即可 。
10.3 表记录的基本操作
16
2,使用指针定位命令
( 1) 记录指针的绝对定位命令格式:
GO[TO] <记录号 >|TOP|BOTTOM
命令功能:将记录指针定位到指定的记录 。
使用说明:
① GO TOP:将记录指针指向表的第一个记录 。
② GO BOTTOM:将记录指针指向表的最后一个记录
③ <记录号 >可以是数值表达式,按取整数的原则,取值范围在 1
至当前数据表中的最大记录数之间,否则出错 。
( 2) 记录指针的相对定位命令格式:
SKIP [<数值表达式 >]
命令功能:
从当前记录开始移动记录指针,<数值表达式 >表示移动记录的个数。
17
函 数 功 能
EOF() 测试记录指针是否指向文件尾,如指向文件尾,函数返回值为,T.,否则为,F.
BOF() 测试记录指针是否指向文件头,如指向文件头,函数返回值为,T.,否则为,F.
RECNO() 返回指定工作区中当前记录的记录号
RECCOUNT() 返回指定工作区中表的记录个数
DELETED() 测试指定工作区中表的当前记录是否有删除标记,如有删除标记,函数返回值为,T.,否则为,F.
FOUND() 测试指定工作区中最近一次查找数据是否成功,如找到记录,函数返回值为,T.,否则为,F.
VFP常用表操作函数
18
【 例 10-4】 设 计一 个可 以按 记 录浏 览,编辑,学生 情 况表,(student.dbf)的表单 。
19
10.3.2 表记录的显示
1,命令方式命令格式:
LIST | DISPLAY [[FIELDS] <字段名表 >][<范围 >] [FOR<条件表达式 >] [WHILE <条件表达式 >][OFF] [TO PRINTER
[PROMPT] | TO FILE<文件名 >]
,范围,参数有以下四种表示:
● ALL:当前表中的全部记录 。
● NEXT N:从当前记录开始,后面连续的 N条记录 ( 包括当前记录 )
● RECORD N:第 N条记录
● REST:从当前记录起到最后一条记录的全部记录(包括当前记录)。
20
FOR<条件表达式 >:它指定选择记录的条件 。 例如:
USE STUDENT
GO 3 &&记录指针指向第 3个记录
LIST NEXT 5 FOR 性别 =.F,&&显示第 3,4,7三条记录
WHILE<条件表达式 >:也是指定选择记录的条件,但它仅在当前记录满足条件时开始筛选记录,当第一次遇到不满足条件的记录时就停止操作 。
WHILE<条件表达式 >若与 FOR<条件表达式 >同时使用,则
WHILE项优先。
OFF:表示不显示记录号
21
【 例 10-5】 对 STUDENT.DBF数据表进行如下操作,
① 显示表中 2— 6号记录的学号,姓名和性别 。
② 显示所有男生的学号,姓名,性别,班级编号 。
③显示表中 1975年出生的同学的学号、姓名、性别及出生日期。
2,菜单方式查看表内容最快的方法是使用,浏览,窗口 。
( 1) 打开想要查看的表 。
( 2)选择 【 显示 】 → 【 浏览 】 命令,系统弹出记录浏览窗口,
显示当前表中的记录。这时还可以选择 【 显示 】 → 【 浏览 】 或 【 编辑 】 来改变显示方式。
22
10.3.3 表记录的修改
1,浏览修改
( 1) 命令方式命令格式:
BROWSE [<范围 >][FIELDS <字段名表 >][FOR<条件表达式 >]
功能,在浏览窗口中显示当前表中命令选项指定的记录的内容,
以供编辑修改 。
( 2) 菜单方式
2,编辑修改命令格式:
EDIT/CHANGE [FIELDS<字段名表 >][<范围 >][FOR<条件表达式
>][WHILE <条件表达式 >]
功能:按照给定条件编辑修改当前打开的表文件的记录 。
使用说明:
选项的使用同 BROWSE命令。执行命令后将进入浏览窗口的编辑状态。
23
3,替换修改命令格式:
REPLACE <字段名 1> WITH <表达式 1> [ADDITIVE][,<字段名 2>
WITH <表达式 2> [ADDITIVE]],.,[<范围 >][FOR <条件表达式
>][WHILE <条件表达式 >]
命令功能,不进入全屏幕编辑方式,用指定表达式的值替换当前表中满足条件的记录的指定字段的值
【 例 10-7】 将 STUDENT.DBF中 1603班的学生的总学分都增加 3个学分 。
USE STUDENT
REPLACE ALL 总学分 WITH 总学分 +3 FOR 班级编号 =”1603”
24
10.3.4 向表中添加新记录
1,追加记录
( 1) 命令方式命令格式,APPEND [BLANK]
命令功能:在当前已打开的表的末尾追加一条或多条新记录 。
使用说明:若使用 [BLANK]选项,则将在表末尾追加一条空白记录,并自动返回命令窗口,此时系统并不弹出编辑窗口 。 否则,将弹出记录编辑窗口,等待用户输入新记录 。
( 2) 菜单方式
2,从其他数据表中追加记录命令格式:
APPEND FROM <文件名 > [FIELDS <字段名表 >][FOR <条件表达式 >][WHILE<条件表达式 >]
命令功能:
将指定的表文件中符合条件的记录添加到当前表文件的末尾。
25
10.3.5 设置过滤器与字段表
1,设置过滤器
( 1) 通过界面设置若要为表设置过滤器:从,表?,属性,?,工作区属性
”?,数据过滤器,?输入筛选表达式
( 2) 使用命令命令格式,SET FILTER TO [<逻辑表达式 >]
命令功能:从当前表中筛选出满足条件的记录进行操作,而,
滤掉,那些不满足条件的记录 。
使用说明,省略 <逻辑表达式 >表示取消已设置的过滤器 。
例如,SET FILTER TO,NOT.STUDENT.性别
26
2.设置字段表若想只对某些字段起作用,可以设置字段表来限制访问。
( 1)通过界面设置
( 2)使用命令命令格式,SET FIELDS TO [ALL|<字段名表 >]
与之相关的命令有,SET FIELDS ON | OFF
27
3.使用表格控件为了能通过表单更好地控制数据表中的数据的显示,用户可以在表单上使用表格( Grid)控件来显示打开的表中的字段。
表格控件是一个容器对象,按行和列的形式操作和显示数据。
表格、列、表头和列控件都有自己的属性、事件和方法。
( 1)创建表格控件可以用以下两种方法来创建表格控件:
①从数据环境创建先打开表单设计器,在数据环境中添加所需显示的表,然后用鼠标将数据环境中的表窗口的标题栏拖到表单窗口后释放。
②利用表格生成器创建首在表单上创建一个表格,然后用鼠标右键单击表格,在弹出的快捷菜单中选“生成器”命令
28
29
( 2) 常用属性
l 常用的表格属性:
ColumnCount:指定表格的列数 。 默认值为 -1,此时 表格中将列出表的所有字段 。
RecordSource:指定表格数据源,即指定要在表格中显示的记录源 。
RecordSourceType:指定表格数据源的数据类型 。 属性值取值如下:
0— 表 1— 别名 2— 查询 (.QPR) 3— 提示 4— SQL说明
AllowAddNew:该属性的值为,T.时允许用户向表格中的表添加记录 。 将光标移到最后一条记录,按向下的光标键,表格中就会产生新记录行 。 该属性为,F.
时,只能用 APPEND BLANK或 INSERT命令来添加新记录 。
ChildOrder:用于指定在建立一对多关系时,子表所要用到的索引 。
LinkMaster:用于指定表格控件所显示的子表的父表名称 。
l 常用的列属性:
ControlSource:指定要在列中显示的数据源,一般为表的一个字段 。
CurrentControl:指定列对象中用来显示和接收列中活动单元格的值的一个控件,默认为 Text1。
Sparse:用于确定 CurrentControl指定的控件是否影响整个列中的所有元素。属性值为,T,
l 常用的表头属性:
Caption:用于指定表头的标题文本 。
Alignment:用于指定表头的标题文本的对齐方式。
30
【 例 10-8】 设计一个按姓名或班级编号过滤编辑,学生情况表,
的表单 。
① 设计表单界面打开表单设计器,将 student表加入数据环境,通过数据环境在表单上创建一个 grdstudent表格对象,再添加两个标签控件,两个文本框控件,一个命令按钮和一个线条控件
31
② 编写代码编写 Command1的 Click事件代码:
do case
case !empty(thisform.text1.value)
set filter to student.姓名 =allt(thisform.text1.value)
case !empty(thisform.text2.value)
set filter to student.班级编号 =allt(thisform.text2.value)
otherwise
set filter to
endcase
thisform.grdstudent.refresh
32
10.3.6 表记录的删除逻辑删除 物理删除
1,通过浏览窗口操作
2,使用命令
( 1) 逻辑删除记录命令格式,DELETE [<范围 >][FOR<条件 >][WHILE<条件 >]
( 2) 隐藏逻辑删除记录命令格式,SET DELETED ON | OFF
SET DELETED的缺省状态是 OFF。
( 3) 恢复逻辑删除记录命令格式,RECALL [<范围 >] [FOR <条件 >] [WHILE <条件 >]
( 4) 物理删除记录 命令格式,PACK
( 5) 删除全部记录 命令格式,ZAP
功能:将当前打开的表文件中的全部记录删除掉,但保留表结构
33
10.3.7 表的复制
1.复制的表结构命令格式:
COPY STRUCTURE TO <文件名 > [FIELDS <字段名表 >]
2.复制数据表命令格式:
COPY TO <文件名 >[FIELDS <字段名表 >][<范围 >] [FOR <条件表达式 >][WHILE <条件表达式 >][[TYPE]SDF|XLS|DELIMITED
[WITH<定界符 >|WITH BLANK|WITH TAB]]
34
【 例 10-11】 将 STUDENT.DBF复制生成一个 EXCEL文件
XSTUD.XLS。
USE STUDENT
COPY TO XSTUD TYPE XLS
【 例 10-9】 将 STUDENT.DBF中所有女同学记录的姓名,班级编号,性别复制到 STUD2.DBF中 。
USE STUDENT
COPY TO STUD2 FOR 性别 =.F,FIELDS 姓名,班级编号,性别
【 例 10-10】 将 STUDENT.DBF中的前 3个记录复制到 SSTUD.TXT
( SDF格式 ),DSTUD.TXT( DELIMITED格式 ) 中 。
USE STUDENT
COPY TO SSTUD NEXT 3 TYPE SDF
GO TOP
COPY TO DSTUD NEXT 3 TYPE DELIMITED
35
10.3.8 ActiveX绑定控件( OLEBoundControl)
使用方法如下:
( 1) 创建表单的数据环境,在数据环境中添加所需的包含通用型字段的表 。
( 2) 可以直接从数据环境中将通用型字段拖到表单上产生
ActiveX绑定控件,也可以单击表单控件工具栏中的,ActiveX绑定控件,按钮,在表单上先创建一个 OLE绑定型控件,然后设置这个对象的 ControlSource属性值为表中的通用型字段名 。
( 3)运行表单后便可以通过这个对象显示通用型字段的内容
。不过只有当记录指针指向通用型字段中含有数据的记录时,
OLE绑定型控件区域内才会显示数据。
36
10.4 数据表的排序和索引
10.4.1 数据表的排序命令格式:
SORT TO <新文件名 > ON <字段 1>[/A|/D][/C][,<字段 2>[/A|/D]
[/C],..] [FIELDS <字段名表 >][<范围 >][FOR<逻辑表达式
>][WHILE<逻辑表达式 >]
命令功能:对数据表中的记录按指定的字段排序,生成新的表。
37
① <新文件名 >是排序后产生的文件,其扩展名默认为 DBF。
②由 <字段 1>的值决定新表中记录的排列顺序,用作排序的字段的数据类型允许是 N,C,D,L型,不能是 MEMO和
GEN型。当有多个排序字段时,先按 <字段 1>的值排列,其值相同的,再按 <字段 2>的值排列,依此类推。
③对于排序字段,可以指定升序或降序的排列顺序。选项 /A
表示升序,/D表示降序,/C表示不区分大小写,若缺省,则按升序排列。可以把 /C与 /A或 /D选项结合在一起使用,例如
,/AC或 /DC。
38
【 例 10-12】 将 STUDENT.DBF中记录按出生日期进行降序排列,并显示 。
USE STUDENT
SORT TO STUD2 ON 出生日期 /D
USE STUD2 &&打开新表
LIST
39
10.4.2 数据表的索引
Visual FoxPro系统中支持两种不同的索引文件类型,单索引文件和复合索引文件。
单索引文件是指每个索引存放在一个独立的索引文件中,扩展名为,IDX。
复合索引文件中可以包含多个索引,其扩展名为,CDX。复合索引文件又有两种:一种是独立复合索引文件;另一种是结构复合索引文件。
索引可分为下列四种类型:
( 1)主索引 ( 2)侯选索引
( 3)唯一索引 ( 4)普通索引
1.索引的概念
40
2,建立索引
( 1)使用表设计器建立索引
① 打开表文件。
② 选择 【 显示 】 → 【 表设计器 】 命令,打开表设计器对话框,选择“索引”选项卡,注意:用表设计器建立的索引都是结构复合索引文件。
③ 在“索引名”框中输入索引标识名;在“类型”的下拉列表框中选定一种索引类型。
④ 确定好各项后,选择“确定”,关闭表设计器,同时索引建立完成。
41
42
( 2)使用索引命令建立命令格式:
INDEX ON <索引关键字表达式 > TO <单索引文件 >|TAG<
标识名 >[OF<独立复合索引文件名 >][FOR<逻辑表达式 >]
[ASCENDING|DESCENDING] [UNIQUE]
[ADDITIVE][COMPACT][CANDIDATE]
命令功能:
对当前表文件按指定的关键字建立一个索引文件或索引标识。
43
【 例 10-13】 对 STUDENT.DBF进行如下操作:
① 建立按出生日期升序排列的单索引文件 STUD.IDX。
② 建立包含按姓名降序排列的索引标识的结构复合索引文件 。
③ 在表文件 STUDENT.DBF的结构复合索引文件中,
追加一个先按班级编号升序再按学号升序的索引标识 。
USE STUDENT
INDEX ON 出生日期 TO STUD
INDEX ON 姓名 TAG XM DESCENDING
INDEX ON 班级编号 +学号 TAG XBXH
44
3,索引文件的打开命令格式 1:
USE <表文件名 > [INDEX <索引文件名表 |? >][ORDER <数值表达式 >|<单索引文件名 >|[TAG]<索引标识名 >[OF<复合索引文件名 >][ASCENDING|DESCENDING]]
命令格式 2:
SET INDEX TO [<索引文件名表 >][ORDER<数值表达式 >|<单索引文件名 >|[TAG] <标识名 > [ASCENDING |
DESCENDING]][ADDITIVE]
45
4,索引文件的关闭命令格式 1,USE
命令功能:关闭当前工作区中打开的表文件及所有索引文件。
命令格式 2,SET INDEX TO
命令格式 3,CLOSE INDEX
命令功能:关闭当前工作区中打开的所有单索引文件和独立复合索引文件。
46
5,改变主控索引数据表的主控索引可以在打开表或打开索引文件时设置,也可以在需要时设置或更换。
命令格式:
SET ORDER TO [<数值表达式 1> | <单索引文件名 > |
[TAG] <标识名 > [IN <数值表达式 2> | <字符表达式 >]
[ASCENDING | DESCENDING]]
47
6,索引文件的更新索引文件依赖于数据表而存在,当数据表中的数据发生变化时,索引文件也应该相应地更新。
如果在对数据表进行修改时,已经打开了相关的索引文件,则系统会自动地更新索引文件。
如果没有打开索引文件,则索引不能进行相应的更新。
为避免使用旧的索引文件导致错误,这时需要重新索引,
可以在“表”菜单中选择“重新建立索引”,或者使用命令 REINDEX。
48
7,索引的删除
( 1)索引标识的删除命令格式:
DELETE TAG <标识名 1> [,<标识名 2>],..
或,DELETE TAG ALL [OF <复合索引文件名 >]
命令功能:
从指定的复合索引文件中删除索引标识
( 2)单索引文件的删除命令格式,DELETE FILE <单索引文件名 >
命令功能:
删除指定的单索引文件。
使用说明:
关闭的单索引文件才能被删除,文件名必须带扩展名。
49
10.5 数据表的查询
10.5.1 顺序查询顺序查询包括 LOCATE和 CONTINUE两条命令。
命令格式:
LOCATE [FOR<逻辑表达式 >][<范围 >][WHILE <逻辑表达 >]
命令功能:
在当前表中指定范围中查找满足条件的第一条记录。
50
10.5.2 索引查询
1,FIND命令命令格式:
FIND <字符串 >/<数值常量 >
【 例 10-14】 在表文件 STUDENT.DBF中查找姓,赵,的记录 。
USE STUDENT
SET ORDER TO XM
FIND 赵
DISP &&显示第一个姓赵的记录
SKIP &&继续查找第二个姓赵的记录
51
2,SEEK命令命令格式,SEEK <表达式 >
命令功能:在当前表文件中,按已确定的主控索引查找关键字值与 <表达式 >相匹配的第一个记录,若找到,记录指针 。 指向该记录;否则指向文件尾,给出信息,没找到
” 。
使用说明:
① SEEK命令可以查找字符型,数值型,日期型,逻辑型表达式的值 。 但命令中的表达式的类型必须与索引表达式的类型相同 。
② 表达式为字符串时,必须用定界符括起来,字符型内存变量可以直接进行查询,不用进行宏替换 。 日期常量也必须用大括号括起来 。
【 例 10-15】 用 SEEK命令在 STUD.DBF中查找 1977年 5月 16日出生的记录 。
USE STUDENT
INDEX ON 出生日期 TAG CSRQ
SEEK {^1977/05/16}
52
10,6 数据表的统计
10.6.1统计记录个数命令格式:
COUNT [<范围 >] [FOR <逻辑表达式 >] [WHILE <逻辑表达式 >] [TO <内存变量 >]
命令功能:
用于统计当前表中指定范围内满足条件的记录个数。
10.6.2求和命令格式:
SUM [<数值表达式表 >] [<范围 >] [FOR <条件 >] [WHILE <条件 >] [TO <内存变量表 > | TO ARRAY <数组 >]
命令功能:
对指定范围内、满足条件的记录按指定的各个表达式分别求和。
53
【 例 10-16】 有一 表文件 GZGL.DBF 内容如下,对
GZGL.DBF中的基本工资,岗位工资,奖金和工资总额求和,并将结果分别存放在变量 JB,GW,JJ,ZE中 。
USE GZGL
SUM 基本工资,岗位工资,奖金,工资总额 TO JB,GW,JJ,ZE
54
10.6.3求平均值命令格式:
AVERAGE [<数值表达式表 >] [<范围 >] [FOR <逻辑表达式
>] [WHILE <逻辑表达式 >] [TO <内存变量表 > | TO ARRAY <
数组 >]
命令功能:
对当前表文件中指定范围内满足条件的记录,按指定的数值型字段计算平均值。
55
10.6.4综合计算
CALCULATE命令用于对表中的字段进行财经统计,其计算工作主要由函数来完成 。
命令格式:
CALCULATE <表达式表 > [<范围 >] [FOR <逻辑表达式 >] [WHILE
<逻辑表达式 >] [TO <内存变量表 > | TO ARRAY <数组 >]
函 数 功 能
AVG( <数值表达式 >) 求数值表达式的平均值
CNT( ) 统计数据表中指定范围内满足条件的记录个数
MAX( <表达式 >) 求表达式的最大值,表达式可以是数值,
日期或字符型
MIN( <表达式 >) 求表达式的最小值,表达式可以是数值,
日期或字符型
SUM( <数值表达式 >) 求数值表达式之和
56
【 例 10-17】 计算 GZGL.DBF中的人数,奖金收入的平均值和最大值,工资总额的最大值,平均值 。
USE GZGL
CALC CNT(),AVG(奖金 ),MAX(奖金 ),AVG(工资总额 ),MAX(
工资总额 ) TO X1,X2,X3,X4,X5
10.6.5分类汇总命令格式:
TOTAL ON <关键字段 > TO <汇总文件名 > [FIELDS <数值型字段名表 >] [<范围 >] [FOR <逻辑表达式 >] [WHILE <逻辑表达式 >]
57
使用说明:
① FIELDS <数值型字段名表 >指出要汇总的字段,如果缺省则对数据表所有数值型字段汇总 。
② <范围 >缺省值是 ALL。
③ 分类汇总是把所有具有相同关键字表达式值的记录合并成一条记录,对数值型字段进行求和,对非数值型字段,则把关键字值相同的连续记录的第一条记录的字段内容存入新表 。 因此,必须对当前数据表按 <关键字段 >进行排序或建立索引 。 汇总命令执行后,将生成一个新的数据表文件 ( 并没有被打开 ) 。
④汇总文件的结构与当前表的结构完全相同,汇总记录个数由 <关键字段 >的值确定。若数值型字段的汇总值超过了原数据表该字段的宽度,系统会自动修改汇总表中该字段的宽度。
58
【 例 10-18】 对 GZGL.DBF按,车间,分类汇总 。
USE GZGL
INDEX ON 车间 TAG CJ
TOTAL ON 车间 TO GZCJ
USE GZCJ
LIST &&GZCJ表中只有 4条记录
59
10.7 同时使用多个表
10.7.1工作区
1.工作区和当前工作区
2,工作区号与别名每一个工作区可以用工作区号或别名来标识 。
( 1) 工作区号
Visual FoxPro 提供了 32767个工作区,系统用 1~ 32767来作为各工作区的编号 。 系统默认值为 1号工作区 。
( 2) 别名编号 1~ 10的工作区还可用 A~ J这 10个字母来标识,A~ J分别称为 1~ 10号工作区的工作区别名 。 还可采用工作区中已打开的数据表的表名或数据表的别名来作为工作区别名 。
命令格式,USE〈 数据表名 〉 ALIAS〈 别名 〉
命令功能:打开数据表并为该数据表定义一个别名 。
使用说明:给数据表定义了别名后,数据表名就不是默认的别名了 。 Se;ect 0 表示选择未用的最小的工作区 。 测试工作区的函数为
select()
60
3.工作区的选择当系统启动后,1号工作区默认为当前工作区,若想改变当前工作区,则可使用 SELECT命令来将指定的工作区设为当前工作区。命令格式,SELECT <工作区号 >|<别名 >
1 …… 3276
7
Use student
student
Select 3
Use gzgl alias
gz
gz
Select 0
Use stu
stu
61
【 例 10-19】 在 1号和 2号工作区内分别打开 STUDENT.DBF
和 COURSE.DBF表文件,并选择 1号工作区为当前工作区 。
SELECT 2 && 或 SELECT B
USE COURSE
SELECT 1
USE STUDENT
62
4,非当前工作区字段的引用可对当前工作区的表进行任何操作,也可以在当前工作区中对其他工作区中的表中的数据进行访问,但要在非当前表的字段名前加上别名和连接符,引用格式为:
<工作区别名 >-> <字段名 > 或 <工作区别名 >.<字段名 >
【 例 10-20】 在 1号工作区打开 STUDENT.DBF,在 2号工作区内查看当前记录的学号,姓名 。
SELECT A
USE STUDENT && 在 1号工作区中打开 STUDENT
SELECT B
DISPLAY A.学号,A.姓名 &&显示 STUDENT中当前记录的学号、姓名
63
10.7.2 数据工作期窗口数据工作期窗口可通过选定“窗口”菜单中的“数据工作期
”或单击工具栏中的“数据工作期窗口”按钮来打开
64
10.7.3 表的关联
1,表之间的关系在“数据库设计器”中,通过连接不同表的索引可以很方便地建立表之间的关系,这种在数据库中建立的关系被作为数据库的一部分保存起来,称为永久关系。而两表之间仅在运行时存在的关系,称为临时关系。
2,建立表之间的临时关系可以通过下面几种方法创建临时关系:
( 1)在“数据工作期”窗口中创建
( 2) 使用命令创建临时关系命令格式,SET RELATION TO [<关键字表达式 1> INTO<别名
1>|<工作区号 1>[,<关键字表达式 2> INTO<别名 2>|<工作区号
2>… ][ADDITIVE]]
命令功能:将当前工作区的表与 <别名 >( 或工作区号 ) 所指定的工作区中的表按 <关键字表达式 >建立关联 。
SET RELATION TO则表示取消临时关系 。
65
例如,在 1区打开 xs.dbf,在 2区打开 xscj.dbf,按关键字 xh设置关联,然后查看记录:
Use xs
Select 2
Use xscj order xh
Select 1
Set relation to xh into b
Xh,xm,xscj->fox,xscj->sx,xscj.english
66
本章学习的主要命令、函数有:
CREATE USE <文件名 > USE CLEAR ALL CLOSE ALL
CLOSE DATABASE CLOSE TABLES LIST|DISPLAY STRUCTURE
MODIFY STRUCTURE BROWSE GO TOP GO 记录号
GO BOTTOM SKIP EOF() BOF() RECNO() RECCOUNT()
DELETED() FOUND() DISPLAY| LIST EDIT |CHANGE APPEND
APPEND BLANK APPEND FROM SET FILTER TO SET FIELD TO
DELETE RECALL PACK ZAP COPY STRUCTURE TO
COPY TO <文件名 >…… [ SDF | XLS | DELIMITED ]
SORT TO <文件名 > [ /a | /d |/c] INDEX ON <关键字表达式 > TAG 标识
SET INDEX TO CLOSE INDEX SET ORDER TO DELETE TAG
LOCATE FOR COUNTINUE FIND SEEK COUNT SUM
AVERAGE CALCULATE TOTAL SET RELATION TO INTO