Visual FoxPro

文档属性

名称 Visual FoxPro
格式 rar
文件大小 1.3MB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2008-08-31 19:36:00

文档简介

(共130张PPT)
第三章
数据库的基本操作
本 章 要 点
建立数据库与表
表字段的基本操作
表记录的基本操作
排序与索引
查询
数据统计与计算
多表的操作
建立数据库与表
数据库是表的集合。从Visual FoxPro 3.0开始引入了真正意义上的数据库概念。把一个二维表定义为表,把若干个关系比较固定的表集中起来放在一个数据库中管理,在表间建立关系,设置属性和数据有效性规则使相关联的表协同工作。数据库文件具有.dbc扩展名,其中可以包含一个或多个表、关系、视图和存储过程等。
一个Visual FoxPro表或.dbf文件,能够存在以下两种状态之一:与数据库相关联的数据库表,与数据库不关联的自由表。二者的绝大多数操作相同且可以相互转换。相比之下,数据库表的优点要多一些。当一个表是数据库的一部分时,它就可以具有以下内容:
● 长表名和表中的长字段名
● 表中字段的标题和注释
● 默认值、输入掩码和表中字段格式化
● 表字段的默认控件类
要 点
● 字段级规则和记录级规则
● 支持参照完整性的主关键字索引和表间关系
● INSERT、UPDATE或DELETE事件的触发器
3.1.1 建立数据库
1.命令方式
【格式】CREATE DATABASE [<数据库文件名>|?]
【功能】建立一个新的扩展名为.DBC的数据库文件并打开此数据库。
【说明】<数据库文件名>指定生成的数据库文件,若省略扩展名,则默认为.DBC,同时也自动建立相关联的数据库备注文件扩展名为.DCT,关联的索引文件扩展名为.DCX。如果未指定数据库文件名或用“?”代替数据库名,Visual FoxPro系统会弹出创建对话框,以
建立数据库
便用户选择数据库建立的路径和输入数据库名。保存后该数据库文件被建立,并且自动以独占方式打开该数据库。
2.菜单方式
用菜单方式建立数据库的具体步骤如下:
(1)选择【文件】∣【新建】出现新建对话框。
(2)选择“数据库”单选按钮,再单击“新建文件”按钮,出现“创建”对话框。
(3)在“创建”对话框中输入文件名。选择“保存”按钮,系统自动打开数据库文件,并且将数据库设计器也自动打开。
3.利用项目管理器建立数据库
打开已建立的项目文件,出现项目管理器窗口,选择。
“数据”标签的“数据库”,然后单击“新建”按钮。出现新建数据库对话框,单击“新建数据库”按钮,出现“新建”对话框,选择数据库的路径并输入数据库名后单击“保存”按钮,完成数据库的建立,并打开该数据库设计器
3.1.2 删除数据库
1.命令方式
【格式】DELETE DATABASE <数据库文件名 |?>
【功能】从磁盘上删除一个扩展名为.DBC的数据库文件。
删除数据库
【说明】被删除的数据库不能处于打开状态。被删除的数据库中的表成为自由表。
数据库文件名可以包括数据库的路径和数据库名字。如果用“?”代替数据库文件名,将显示打开对话框,用户可从打开对话框中选择要从磁盘上删除的数据库的名字。
2.使用项目管理器
打开已建立的项目文件,出现项目管理器窗口,单击“数据”标签,选择要删除的“数据库”,然后单击“移去”按钮。出现图3-4选择对话框,若选择“移去”仅将数据库从项目中移去,若选择“删除”将从磁盘上删除数据库。被删除的数据库中的表成为自由表。
3.1.3 打开数据库
1.命令方式
【格式】OPEN DATABASE [<数据库文件名> | ] [EXCLUSIVE|SHARED]
【功能】将磁盘上一个扩展名为.DBC的指定数据库文件打开。
【说明】打开一个数据库文件,同名的.DCT相关的数据库备份文件与.DCX相关的索引文件也一起被打开。
数据库打开后,在常用工具栏中可以看见当前正在使用的数据库名,同时当数据库设计器为当前窗口时,系统菜单上出现【数据库】菜单项。
<数据库文件名>:指定要打开的数据库名。如果用户省略<数据库文件名>或用“?”代替数据库名。系统会显示打开对话框。
打开数据库
注意:在数据库被打开的情况下,它所包含的所有表可以使用。但是,表并没有被真正打开,用户要打开它,仍要用USE命令。
2.菜单方式
①(1)选择【文件】|【打开】,出现打开对话框。
②(2)选择数据库文件所在的文件夹,将文件类型选择为“数据库(.dbc)”。
(3)选择所要打开的数据库文件名,单击“确定”按钮。
3.利用项目管理器打开数据库
打开已建立的项目文件,出现项目管理器窗口,选择“数据”标签,选择要打开的数据库名,然后单击“打开”按钮。
3.1.4 数据库的关闭
数据库文件操作完成后,或暂时不用时,必须将其关闭,保存在外部存贮器中以确保数据的安全性。关闭数据库文件有以下几种方式:
1.命令方式
【格式】CLOSE [ALL|DATABASE ]
【功能】关闭当前打开的数据库。
【说明】ALL用于关闭所有对象。如数据库、表、索引、项目管理器等。
DATABASE关闭当前数据库和数据库表;如果当前没有打开的数据库,则关闭所有打开的自由表、所有工作区内所有索引和格式文件。
数据库的关闭
2.利用项目管理器关闭数据库
打开已建立的项目文件,出现项目管理器窗口,选择“数据”标签,选择“数据库”下面需要关闭的数据库名,然后单击“关闭”按钮。在常用工具栏上的当前数据库下拉列表框中该数据库名消失,同时在项目管理器中“关闭”按钮变成“打开”按钮。
3.1.5 建立表结构
前面我们已经知道表有二种,一种是数据库表,另一种是自由表。如果建表时数据库是打开的,则建立的表为当前数据库表,否则,建立自由表。
无论建立那种表,其方法都相同。一个表由表结构和表记录两部分组成。表结构描述了数据存放形式以及存贮的顺序,确定了表的字段,就完成了对表结构的定义;表记录是表所要保存的数据主体,数据由记录组成,字段是构成记录的基本单元。
建立表结构
建立一个表文件首先第一步就是建立表结构,然后再输入表记录。
建立表结构的方法有很多,在这里主要讲述三种方法:命令方式、菜单方式和使用项目管理器的方式。
1.命令方式
【格式】CREATE [<表文件名> | ]
【功能】建立一个新的、扩展名为.DBF的表文件。
【说明】<表文件名>指定生成的表文件名,若缺省扩展名,则默认为.DBF。
如果使用“?”或末指定表文件名,Visual FoxPro系统会弹出创建对话框,以便用户输入表名。
现在用命令方式来建立本章所用的stud.dbf表。表内容如下:



学号
姓名
性别
班级名
系别代号
地址
出生日期
是否团员
照片
备注
011110
李建国

计0121
01
湖北武汉
09/28/84
T


011103
李宁

电0134
02
江西九江
05/06/85
F


011202
赵娜

英0112
03
广西南宁
02/21/84
F


021204
孙亮

电0134
02
湖南长沙
09/08/86
T


011111
赵琳

计0121
01
江苏南京
11/18/85
T


021405
罗宇波

英0112
03
江苏南通
12/12/85
F


用命令方式建立表的具体步骤为:
(1)如果没有打开STUDENT数据库,先打开它。如果创建自由表,该步可略去。
(2)在命令窗口中输入CREATE STUD回车,系统打开“表设计器”对话框,如图3-5所示。
(3)在“字段名”文本框中输入第一个字段名:“学号”,在“类型”下拉列表框中,选择字段的类型为字符型,在宽度输入框中输入10或单击右边的微调按钮至10。
(4)将输入光标定位在第二个字段的字段名上,用同样的方法依次输入各个字段的字段名、类型、宽度和小数位数。
(5)将所有字段的参数确定好之后,单击“确定”或按快捷键CTRL+W存盘。系统会 打开提示窗口,询问用户是否立即输入记录,选择“是”立即开始输入记录,选择“否”不输入记录,光标返回命令窗口,只建立表结构。
表设计器对话框中包含“字段”、“索引”、“表”三个选项卡。
1)“字段”选项卡:适用于建立表结构,确定表中每个字段的字段名、字段类型、字段宽度和小数位数等。
● 字段名:是某字段的名字。在表中必须为唯一的,字段名必须以汉字、字母和下划线开头,由汉字、字母、数字和下划线组成,对于数据库表支持长字段名,字段名最多为128个字符,自由表不支持长字段名,字段名最多为10个字符。当数据库表转化为自由表时截去超长部分的字符。字段名不能使用系统的保留字。
● 字段类型:表示该字段中存放数据的类型。一个字段即二维表中的一列,其中的数据应具有共同的属性。若存放的是一些符号,不进行数值运算,则定义为字符型;若需要进行数值运算,则根据数值表示的实际意义,选择数值型、货币型、浮点型、双精度型、整型中的一种。对描述日期的字段,可根据需要定义为日期型或日期时间型。对取值只有两种情况,为“真”或为“假”的数据定义为逻辑型。若
存储的字符超过254,为节省存储空间可定义为备注型。若要保存图片或OLE对象,可定义为通用型。备注型和通用型字段的信息都没有直接存放在表文件中,而是存放在一个与表文件同名的.FPT文件中。
● 字段宽度:表示该字段所允许存放数据的最大宽度。由数据的最大宽度决定。过大浪费存储空间,过小数据溢出。字符型字段的最大宽度254个字符,数值型字段和浮点型字段的宽度为20位,逻辑型字段的宽度固定为1,日期型字段的宽度固定为8,通用型字段和备注型字段的宽度固定为4。
● 小数位数:只对数值型字段和浮点型字符等数值类型有效,允许最大宽度20。在计算数值型字段和浮点型字段的宽度时,小数点本身也算作一个字符。数值型字段的小数位数由数据的精度决定位数。
● 字段宽度:表示该字段所允许存放数据的最大宽度。由数据的最大宽度决定。过大浪费存储空间,过小数据溢出。字符型字段的最大宽度254个字符,数值型字段和浮点型字段的宽度为20位,逻辑型字段的宽度固定为1,日期型字段的宽度固定为8,通用型字段和备注型字段的宽度固定为4。
● 小数位数:只对数值型字段和浮点型字符等数值类型有效,允许最大宽度20。在计算数值型字段和浮点型字段的宽度时,小数点本身也算作一个字符。数值型字段的小数位数由数据的精度决定位数。
若建立的是数据库表,则下面还有显示、字段有效性等框。
① 字段的显示属性
● 格式:控制字段在浏览窗口、表单、报表等显示时的样式。格式字符及功能如表3-2所示。
字符
功 能
字符
功 能
A
字母字符,不允许空格和标点符号
R
显示文本框的格式掩码,但不保存到字段中
D
使用当前的SET DATA格式
T
删除前导空格和结尾空格
E
英国日期格式
!
字母字符转换成大写
K
光标移至该字段选择所有内容
^
用科学计数法表示数值数据
L
数值字段显示前导0
$
显示货币符号
● 输入掩码:控制输入该字段的数据的格式。掩码字符及功能如表3-3所示。
字符
功 能
字符
功 能
A
字母字符,不允许空格和标点符号
R
显示文本框的格式掩码,但不保存到字段中
D
使用当前的SET DATA格式
T
删除前导空格和结尾空格
E
英国日期格式
!
字母字符转换成大写
K
光标移至该字段选择所有内容
^
用科学计数法表示数值数据
L
数值字段显示前导0
$
显示货币符号
表3-3 字段的显示掩码字符
● 标题:若表结构中字段名用的是英文,则可以在标题中输入汉字,这样显示该字段值时就比较直观了。没有设置标题,则将表结构中的字段名作为字段的标题。
字符
功 能
字符
功 能
X
任意字符
*
左侧显示*
9
数字字符和+-号
.
指定小数点位置
#
数字字符、+-号和空格
,
用逗号分隔整数部分
$
指定位置显示货币符号
$$
货币符号与数字不分开显示
② 字段有效性
● 规则:限制该字段的数据的有效范围。在规则中输入:性别="男".OR.性别="女"。这样当给“性别”字段输入记录值时就只能输入“男”或“女”。
● 信息:当向设置了规则的字段输入不符合规则的数据时,就会将所设置的信息显示出。
● 默认值:当往表中添加记录时,系统向该字段预置的值。在“性别”字段中输入默认值为“男”。输入记录时只有女生才需要改变默认值,可以减少输入。字段有效性的设置如图3-6所示。
2)表选项卡:字段选项卡上主要介绍的是字段属性,它控制了字段值的输入,表选项卡则对表的记录属性进行描述,控制记录数据。
在这里主要介绍记录有效性和触发器。
① 记录有效性
● 规则:指定记录的有效条件,满足该条件,数据才能输入到表中,它确定的是该记录各字段值之间的总体数据关系是否有错。
● 信息:当记录的数据不符合规则时,由系统显示给用户的提示信息。
② 触发器
当对记录进行操作时,若设置了触发器,则对触发器设置的条件表达式进行验证,若其值为真.T.,则允许进行相关操作,否则,则拒绝操作。
● 插入触发器:当向表中插入或追加记录时,判断其表达式的值,为“真”允许插入或追加,为“假”不允许插入或追加。
● 更新触发器:当要修改记录时,判断其表达式的值,为“真”允许修改,为“假”不允许修改。
● 删除触发器:当要删除表中记录时,判断其表达式的值,为“真”允许删除,为“假”不允许删除。
以上三类触发器也可以用相应的命令实现:
CREATE TRIGGER ON 表名FOR INSERT AS触发条件表达式
CREATE TRIGGER ON 表名FOR UPDATE AS触发条件表达式
CREATE TRIGGER ON 表名FOR DELETE AS触发条件表达式
2.菜单方式
选择【文件】|【新建】打开新建对话框,选择“表”,单击“新建文件”出现创建对话框,确定需要建立表的路径和表名,按“保存”按钮后,出现图3-5所示“表设计器”对话框。以下步骤同命令方式。
3.用项目管理器新建表
打开已建立的项目文件,出现项目管理器窗口,选择“数据”选项卡中的“数据库”下的表,然后单击“新建”按钮。出现新建表对话框,选择“新建表”出现创建对话框,确定需要建立表的路径和表名,按“保存”按钮后,出现图3-5所示的“表设计器”对话框。以下步骤同命令方式。
3.1.6 输入表记录
如果在刚建好表结构时,在系统提示是否立即输入记录的对话框中选择“是”可直接进入输入记录窗口。如果选择了“否”,再想输入表记录就要以追加方式输入记录。
输入表记录的方法又分为命令方式和菜单方式两种方法。
1.命令方式
【格式】APPEND [BLANK]
【功能】在当前已打开表的末尾追加一条或多条记录。
输入表记录
【说明】BLANK:表示在表末尾追加一条空记录,并自动返回命令窗口,此时系统并不弹出编辑窗口。
例如:在命令窗口输入命令
USE STUD &&打开表
APPE &&或EDIT
注意:输入逻辑值时只输入T或F,定界符系统自动生成
输入日期值时只输入数码,分隔符系统自动生成
输入备注值时,光标位于MEMO上时,按CTRL+PgDn进入编辑窗口,完成后按CTRL+W返回下一个字段继续输入。
2.菜单方式
(1)首先打开表STUD.DBF。
(2)选择【显示】|【浏览】命令。
(3)选择【表】|【追加新记录】命令,用户可以输入追加记录的各个字段。
3.1.7 表的打开与关闭
1.表的打开
表文件建好后,以文件的形式保存在磁盘上,在进行各种操作之前,首先必须打开表。打开表的过程实质上就是将表从磁盘调入内存,这样就可以对表中的数据进行各种操作。系统在任何时刻都只能对内存中的表进行访问。
(1)命令方式
【格式】USE [[<盘符>][<路径>]<[数据库名!]表文件名 | >
【功能】打开指定磁盘的指定路径下的表和相关的索引文件。
【说明】<盘符>和<路径>:指定表文件所在的驱动器及路径,若省略盘符和路径参数,则打开当前盘、当前路径下的表文件。
表的打开与关闭
[数据库名!]表文件名:指定打开指定数据库中的表文件。若末指定数据库名,则在当前数据库中查找,没有则在自由表中查找。两者同名,则打开数据库中的表。
如果表文件中含有通用型、备注型字段,同名的.FPT文件也同时打开。
若不指定表文件名而使用“ ”,系统会弹出“使用”对话框,以便用户指定打开表的文件名。
【例3-1】打开在E盘VFP子目录中STUD.DBF表。
USE E:\VFP\STUD
(2)用项目管理器打开表
在项目管理器中选中需要打开的表,选择“浏览”或“修改”都能直接打开表且进行浏览或修改,关闭浏览或修改窗口后,该表仍处于打开状态。
2.表的关闭
表文件操作完成后,或暂时不用时,必须将其关闭,保存到外存中以确保数据的安全性。关闭表就是将表文件从内存中调出,保存在磁盘上。关闭表文件有以下几种方式:
(1)打开另一个表文件
如果工作区中已打开有表文件,打开另一表文件时,系统将自动将先前打开的表文件关闭。
(2)使用不带任何选项的USE命令
【格式】USE
【功能】关闭当前已打开的表文件。
(3)使用CLEAR命令
【格式】CLEAR ALL
【功能】关闭所有工作区中已打开的表文件、索引文件、格式文件及备注文件等,同时释放所有的内存变量。并选择工作区1为当前工作区。
(4)使用CLOSE命令
【格式1】CLOSE ALL
【功能】关闭各种类型文件,并选择工作区1为当前工作区。
【格式2】CLOSE DATABASES
【功能】关闭所有已打开的数据库文件、表文件、索引文件、格式文件及备注文件等,并选择工作区1为当前工作区。
(5)退出Visual FoxPro系统
QUIT
【功能】退出Visual FoxPro系统,并关闭所有打开的文件,返回操作系统。
(6)在数据工作窗口中关闭
在数据工作窗口中选择要关闭的表文件,然后选择“关闭”按钮,系统将关闭所选择的表文件。
3.1.8 表的删除
1.删除自由表
【格式】DELETE FILE [表文件名|?]
【功能】将指定的表文件从磁盘上删除。
【说明】如果删除的表文件存在有与之相关的.fpt备注文件和(.cdx或.idx)索引文件,则同时删除这些文件。
删除一个表文件,应保证该表文件是处于关闭状态的。
要删除的表文件如果不是在默认的路径下,则文件名应指明路径。
表文件名不能包含通配符
表的删除
若不指定文件名或使用“ ”,系统会弹出“删除”对话框,选择要删除的表文件路径、文件类型及文件名后,单击“删除”按钮。
2.删除数据库表
先将数据库表从数据库中移去,然后再用删除自由表的方法进行删除。
移去数据库表的命令是:
【格式】REMOVE TABLE [表文件名|?][DELETE][RECYCLE]
【功能】从当前数据库中移去一个表。
【说明】表文件名:准备从数据库中移去的表文件名。
选择?将出现移去对话框,从中选择一个要从当前数据库中移去的表。
选择DELETE在移去数据库表的同时,从磁盘上删除。
选择RECYCLE在移去数据库表的同时,不会立即从磁盘上删除,而是放入回收站中。
3.在项目管理器中删除表
在项目管理器中选中需要删除的表,选择“移去”按钮或选择主菜单中【项目】|【移去文件】命令,出现一个选择对话框,若选择“移去”按钮,则将表文件移出项目文件,若选择“删除”按钮,则将表文件从磁盘上删除。
3.2.1 表结构的显示
在表的使用过程,要经常查看表的结构和记录,以随时了解表的变化情况。
【格式】LIST | DISPLAY STRUCTURE [TO PRINT [PROMPT] | TO [FILE] [<文件名>]]
【功能】显示或打印当前表文件的结构。
表字段的基本操作
在执行以上命令时,如果系统中没有已打开的表文件,系统提示输入文件名。用LIST命令,所有信息连续显示,信息较多时,屏幕停止在最后一屏;用DISPLAY命令,如果信息较多则分屏显示,敲任意键继续显示下一屏。
【例3-2】显示表STUD.DBF的结构。
USE STUD
LIST STRUCTURE
需要指出的是,最后一行显示出的记录字节数是所有字段宽度之和再加1。这额外的一个字节是用来存放记录的删除标记(*)的。
3.2.2 表结构的修改
表结构的改变有时会引起表记录的变化,所以在一般情况下不轻易进行修改。但在确实需要时也可以进行修改。无论进行何种修改,使用的命令都是一个。
表结构的修改
1.命令方式
【格式】MODIFY STRUCTURE
【功能】将当前已打开的表文件的表设计器打开进行修改。
【说明】要修改表结构必须要先打开需要修改结构的表文件。如果当前工作区中没有已打开的数据库,执行此命令时系统会弹出“打开”对话框,以便用户选择需要修改表结构的文件名及路径等信息,用户选择完成后,系统将弹出表设计器对话框。
主要有增加、修改、删除和移动几种操作。
(1)增加字段:将光标移至需插入位置上的字段上,选择“插入”按钮或按快捷键ALT+I,在该位置上出现一个新字段,原位置以下的各字段均下移一行。确定增加字段的字段名、字段类型、字段宽度等参数,选择“确定”按钮即可。
(2)修改字段:将光标定位在需要修改处,编辑修改,完成后选择“确定”按钮即可。
(3)删除字段:将光标移至需删除的字段上,选择“删除”按钮或按快捷键ALT+D,在该位置上的字段被删除,原位置以下各字段均上移一行。选择“确定”按钮即可。
(4)移动字段:将光标移至需移动位置的字段上,用鼠标拖动字段名前的“”按钮,出现一个虚框,当虚框出现在目标位置上时松开鼠标,移动完成,选择“确定”按钮即可。
无论是何种修改,选择“确定”按钮后,由于表结构的变化要影响表记录数据,所以都要出现对话框由用户确认修改是否有效。
使用MODIFY STRUCTURE命令要注意以下几点:
① 在MODIFY STRUCTURE命令的执行期间,如果强行退出,有可能丢失数据。
② 不能同时修改字段名和它的类型,否则系统将不能正确地送回原来的数据而造成数据的丢失。
③ 如果在修改字段名的同时插入或删除了字段,会引起字段位置发生变化,有可能造成数据丢失。但是,在插入或删除字段的同时却可以修改字段的宽度或字段的类型,MODIFY STRUCTURE将根据字段名正确地从备份文件中传送数据。
④ 如果修改表结构完成后出现了数据丢失现象,或者对其不满意,可利用备份文件将表恢复到修改前的状态,方法是先将新的表文件删除掉,再将备份文件的扩展名.BAK改为表文件扩展名.DBF,将备注备份文件扩展名.TBK改为备注文件的扩展名.FPT。
2.利用数据库设计器
在数据库设计器中选中需要修改的表文件,再选择主菜单中【数据库】|【修改】命令,具体的修改方法同命令方式。
3.利用项目管理器
在项目管理器中选中需要修改的表文件,再选择主菜单中【项目】|【修改】命令或单击项目管理器中的“修改”按钮。
3.3.1 表记录的显示
1.命令方式
【格式】LIST | DISPLAY [FIELDS <字段名表>][<范围>] [FOR<条件表达式>] [WHILE <条件表达式>][OFF][NOCONSOLE] [TO PRINTER [PROMPT] | TO FILE<文件名>]
【功能】将当前表文件的记录按照指定的选项进行显示。
表记录的基本操作
【说明】DISPLAY命令与LIST命令的功能相似,当表文件的数据记录较多时,用DISPLAY命令较为方便。
还有一点不同之处就是,如果同时缺省<范围>和 <条件>子句,DISPLAY命令只显示当前的一条记录,而LIST命令则是取默认值ALL而显示全部记录。
FIELDS <字段名表>:用来指定显示的字段。
<范围>:用来指定显示哪些记录。
“范围”有以下四种表示方法:
● ALL:所有记录。
● NEXT N:从当前记录开始,后面的N条记录(包括当前记录)
● RECORD N:第N条记录。
● REST:当前记录后的全部记录(包括当前记录)。
FOR<条件表达式>:指定对表文件中指定范围内满足条件的记录进行操作。
WHILE<条件表达式>:也是指定对表文件中指定范围内满足条件的记录进行操作,但是,当第一次遇到不满足条件的记录时,停止继续往后搜索。
WHILE<条件表达式>若与FOR<条件表达式>同时使用,则WHILE项优先;若两者都不选用,则显示<范围>中指定的全部记录。
OFF:表示不显示记录号;若不选此项,则在各记录前显示记录号。
【例3-3】显示表STUD.DBF的全部记录。
USE STUD
LIST
【例3-4】显示男生的记录。
USE STUD
DISPLAY FOR 性别=’男’ FIELDS 学号,姓名,性别,班级名,系别代号
【例3-5】显示表中所有记录的学号、姓名和性别。
USE STUD
LIST FIELDS 学号, 姓名, 性别
【例3-6】显示表中1985年出生的同学的学号、姓名、性别及出生日期。
USE STUD
LIST FIELDS 学号,姓名,性别,出生日期 FOR YEAR(出生日期)=1985
2.菜单方式
(1)打开表。
(2)选择【显示】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。这时还可以选择【显示】|【浏览】或【编辑】来改变显示方式。
3.利用项目管理器
在项目管理器中,选择需要显示的表文件,单击“浏览”按钮或选择主菜单中【项目】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。
3.3.2 记录指针的定位
记录号用于标识数据记录在表文件中的物理顺序。
记录指针是一个指示器,它始终指向当前表中正在操作处理的那条记录,此记录被称为当前记录。如果要对某条记录进行处理,必须移动记录指针,使其指向该记录。在任意时刻指针只能指向唯一的一条记录。
记录指针的定位
记录指针定位有绝对定位、相对定位和查询定位三种。在这里暂时只讲前二种,查询定位在讲到查询时再详细介绍。
4.绝对定位
【格式】[GO | GOTO] <[RECORD] <数值表达式1> [IN <数值表达式2> | IN <字符表达式>]
【功能】将记录指针绝对定位到<数值表达式1>指定的记录上。
<数值表达式1>:记录的物理记录号。
IN <数值表达式2> | IN <字符表达式>:指定操作表所在的工作区;若缺省,则对当前工作区表操作。工作区的概念在后面再详细介绍。
绝对定位与是否打开索引文件没有关系。
2.相对定位
【格式1】SKIP [<数值表达式1>] [IN <数值表达式2> | <字符表达式>]
【功能】记录指针从当前记录向前(或向后)移动若干个记录。
【说明】<数值表达式1>:表示移动的记录个数。若数值表达式的值为负值,表示向前移动记录;否则,表示向后移动记录。如果缺省此项,则表示向后移动1个记录。
如果记录指针已经移过文件的最后一个记录,则RECNO() 函数返回的值等于文件中的记录总数加 1,EOF()函数返回逻辑真(.T.)值。
【格式2】GO|GOTO <|TOP | BOTTOM>
【功能】将记录指针移动到表文件的首记录或尾记录
TOP:将记录指针移动到表文件的首记录。
BOTTOM:将记录指针动到表文件的最后一条记录。
相对定位与是否打开索引文件有关。如果打开有索引,记录指针按索引文件中顺序移动。否则按表文件中物理顺序移动。
【例3-8】绝对定位命令的用法。
USE STUD
GOTO 2
GO 3
【例3-9】相对定位的用法。
USE STUD
SKIP 4 && 系统主窗口显示为5
SKIP –3 && 系统主窗口显示为2
SKIP 8 && 超出了记录总数6
go top && 系统主窗口显示为1
3.3.3 删除记录
表记录的删除也是表维护的一项经常性的工作,因为删除意味着数据的消失,所以对记录的删除操作比较慎重,删除可分为逻辑删除和物理删除两种操作。逻辑删除还可以恢复,而物理删除则不可恢复。
1.逻辑删除记录
逻辑删除就是给指定的记录作删除标记“*”。
(1)命令方式
【格式】DELETE [<范围>] [FOR <条件>] [WHILE <条件>]
【功能】对当前表中指定范围内满足条件的记录作删除标记“*”。
【说明】DELETE命令仅仅是在要删除的记录前加上一个删除标记“*”,并不是真正地从表文件中将该记录删除掉。可以用LIST或DISP命令显示带删除标记的记录。
删除记录
<范围>,FOR<条件>、WHILE<条件>等各项选项意义同前;如果同时缺省<范围>和 <条件>子句,则仅仅删除当前的记录。
【例3-10】删除STUD.DBF中所有男同学的记录。
USE STUD
DELETE FOR 性别="男"
LIST FIELDS 学号,姓名,性别,班级名,系别代号,地址,出生日期,是否团员
(2)菜单方式
利用菜单方式逻辑删除记录的具体操作步骤如下:
① 首先打开表文件
② 选择【显示】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。主菜单上增加【表】菜单项。
③ 选择【表】|【删除记录】命令,出现图3-11所示的“删除”对话框。
④ 单击删除对话框中的For…按钮或While…按钮,系统弹出表达式生成器,用户可以在表达式框中输入一个逻辑表达式,如性别=”男”,单击【确定】按钮完成条件表达式的输入。
⑤ 在“作用范围”下拉列表框中选择范围,如ALL。
⑥ 单击“删除”对话框中的“删除”按钮,系统将完成对指定范例内满足指定条件的记录的逻辑删除。
2.隐藏逻辑删除记录
【格式】SET DELETED ON | OFF
【功能】将表文件中已逻辑删除的记录隐藏,仿佛真正删除一样。
【说明】表文件中被逻辑删除的记录只是在该记录上加一个删除标记,当SET DELETED设置为OFF时,对该表文件的各种操作,对被删除的记录同样有效。当SET DELETED ON时,可使对表文件中数据的各种操作,一般均不包括有删除标记的记录,但下列情况例外:命令的记录范围是当前记录或RECORD(n)时;INDEX或REINDEX命令不受SET DELETED的影响,始终处理带删除标记的记录。
SET DELETED的缺省状态是OFF。
【例3-12】隐藏上题中STUD.DBF的标记删除记录。
USE STUD
SET DELETED ON
3.恢复逻辑删除记录
恢复逻辑删除是将被逻辑删除的记录恢复为正常记录。即去掉“*”号。
(1)命令方式
【格式】RECALL [<范围>] [FOR <条件>] [WHILE <条件>][NOOPTIMIZE]
【功能】将当前表文件中指定范围内满足条件的已作删除标记“*”的记录恢复,即去掉这些删除记录的删除标记,使之成为正常记录。
【说明】RECALL命令与DELETE命令相对应,它可以去掉被逻辑删除记录的删除标记“*”。
<范围>,FOR<条件>、WHILE<条件>等各项选项意义同前;如果同时缺省<范围>和 <条件>子句,则仅仅恢复当前记录。
【例3-13】恢复STUD.DBF中删除的所有记录。
USE STUD
RECALL ALL
(2)菜单方式
① 首先打开表文件
② 选择【显示】|【浏览】命令。
③ 选择【表】|【恢复记录】命令,出现类似图3-11所示对话框。余下操作与“删除”对话框的操作相同。
4.物理删除记录
物理删除是将当前表文件中被逻辑删除的记录全部清除。
(1)命令方式
【格式】PACK [MEMO][DBF]
【功能】将当前表文件中所有带删除标记(*)的记录全部真正地删除掉。
【说明】若选用MEMO选项,PACK MEMO将压缩与表文件同名的备注文件中的无用空间,但并不删除表文件中作了删除标记的记录。
若选用DBF选项,而不用MEMO选项,则只删除表文件中作了删除标记的记录,而不压缩相应的备注文件。
若不带任何选项,PACK命令将删除数据库文件中作了删除标记的记录,同时压缩相应的备注文件。
注意:执行该命令后被删除的记录将不能被恢复,因此使用时应特别小心。
【例3-14】将STUD.DBF中的学号为“021405”的记录进行物理删除。
USE STUD
DELETE FOR 学号=”021405”
PACK
(2)菜单方式
利用菜单方式物理删除表记录的具体步骤如下:
① 首先打开表文件
② 选择【显示】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。主菜单上增加【表】菜单。
③选择【表】|【彻底删除】命令,出现图3-12所示的“确认”对话框。
④单击“是”按钮,完成物理删除过程。
注意:用户也可以在EDIT、CHANGE、BROWSE窗口中,按Ctrl+T键对当前记录作(或取消)删除标记,也可以用鼠标单击记录最左边的删除标记栏作(或取消)删除标记。
5.删除全部记录
【格式】ZAP
【功能】将当前打开的表文件中的所有记录完全删除掉。
【说明】执行该命令之后,将只保留表文件的结构,而不再有任何数据存在。这种删除无法恢复,因此,为防止用户发生错误操作而删除有用的表文件记录,执行该命令时,系统会弹出如图3-13所示ZAP提示窗口,以确认是否删除全部记录,单击“是”按钮清除所有记录,单击“否”按钮放弃ZAP操作。
3.3.4 修改记录
在表的使用维护过程中,有大量的工作是对数据记录的修改、编辑与更新,通常可以采用编辑修改、浏览修改和替换修改三种方式。
1.编辑修改
【格式】EDIT / CHANGE [FIELDS <字段名表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>]
修改记录
【功能】按照给定条件编辑修改当前打开的表文件的记录。
【说明】[FIELDS <字段名表>]:若选择此选项,则只列出字段名表中的字段,且显示顺序同字段名表中的顺序;若未选择此选项,将显示表中的所有字段,显示顺序同表中的字段顺序。
[<范围>]:若未选择此选项,则EDIT/CHANGE命令的范围为全部记录。
[FOR <逻辑表达式1>]和[WHILE <逻辑表达式2>]:同前面其他命令所述,在此不再重复叙述。
【例3-15】修改STUD.DBF中计0121班学生的学号、姓名和性别等信息。
USE STUD
EDIT FIELDS 学号,姓名,性别 FOR 班级名=”计0121”
全部修改完毕,使用 Ctrl+End 或 Ctrl+W 键保存所有修改的结果。
2.浏览修改
(1)命令方式
【格式】BROWSE [FIELDS <字段名表>] [FOR <逻辑表达式1>]
【功能】显示当前表的记录内容,以供编辑修改。
【说明】编辑结束后,按Ctrl+W或Ctrl+End存盘退出BROWSE编辑窗口,或者按Ctrl+Q或Esc键放弃存盘退出BROWSE窗口。
(2)菜单方式
利用菜单方式进行浏览修改的操作步骤如下:
① 打开表。
② 选择【显示】|【浏览】命令,系统弹出记录浏览窗口。
③ 在编辑修改窗口中编辑修改数据内容,完成后按Ctrl+W键存盘退出Beowse窗口。
3.替换修改
(1)命令方式
【格式】REPLACE <字段名1> WITH <表达式1> [ADDITIVE][, <字段名2> WITH <表达式2> [ADDITIVE]] ... [<范围>][FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [NOOPTIMIZE]
【功能】用指定表达式的值替换当前表中满足条件记录的指定字段的值。
【说明】:该命令适合对当前库进行成批地、有规律地修改。
缺省范围、条件时,仅替换当前记录
该命令回车后,数据修改自动完成。适用于程序设计。
ADDITIVE 只对备注型字段修改有效。
选择:表示添加内容 不选择:表示替换内容
表达式的类型必须与字段类型一致
表达式的值不能超出字段宽度,否则,数据无效。
【例3-16】修改STUD.DBF中的“学号”字段数据,。
USE STUD
REPLACE 学号 WITH ”20”+学号 ALL
(2)菜单方式
① 打开表文件。选择【显示】|【浏览】命令。
② 选择【表】|【替换字段】命令,弹出图3-16所示的“替换字段”对话框。
③ 单击字段下拉按钮选择要进行替换操作的字段名,在“替换为”显示栏中输入替换表达式,再选择“替换条件”显示框中的范围、条件。
④ 单击“替换”按钮,系统将自动完成替换操作。
3.3.5 表的复制
1.表结构的复制
【格式】COPY STRUCTURE TO <文件名> [FIELDS <字段名表>][[WITH] CDX | [WITH] PRODUCTION]
【功能】复制当前表文件的结构作为新表文件的结构。
【说明】命令执行前,需复制的表文件必须是打开的。
执行后,生成的新表文件只有结构。
<字段名表>:确定新表结构的字段名,<字段名表>中的字段必须是原表文件中具有的字段名。若省略该选项,则原样复制当前表文件的结构。
【例3-17】用复制命令将STUD.DBF中的学号、姓名、性别、出生日期等四个字段,构成一个新表结构。
表的复制
USE STUD
COPY STRUCTURE TO STUD1 FIELDS 学号,姓名,性别,出生日期
2.表文件的复制
【格式】COPY TO <文件名>[FIELDS <字段名表>][<范围>] [FOR <逻辑表达式1>][WHILE <逻辑表达式2>][[WITH] CDX] | [[WITH] PRODUCTION]
【功能】将当前打开的表文件全部或部分复制到一个新生成的表文件中。
【说明】新生成表文件中的字段顺序由FIELDS选择项<字段名表>确定,缺省表示新表的结构与原表的结构完全相同,新表文件中的记录由<范围>选择项以及<条件>选择项确定。同时缺省<范围>、<条件>表示将原表的全部记录都复制到新表中。
若<范围>、<条件>和<字段名表>都缺省,则表示将原表进行备份。
<文件名> 指定新生成的表文件。若当前原表文件中有备注型字段,则相应的备注文件(.FPT文件)将同时被复制。新表文件名不能与被复制的原表文件同名,省略盘符和路径表示在当前盘当前目录下生成新表文件。
【例3-18】复制STUD.DBF中所有女同学的记录到STUD2.DBF中。
USE STUD
COPY TO STUD2 FOR 性别=“女”
3.表记录保存为文本文件
【格式】COPY TO <文件名>[FIELDS <字段名表>][<范围>] [FOR <逻辑表达式1>][WHILE <逻辑表达式2>]
| WITH BLANK | WITH TAB]>
【功能】将当前表的记录全部或部分保存到一个文本文件中。
【说明】 FIELDS<字段名表>:确定文本文件中的字段顺序,缺省表示将表中记录的全部字段值保存到文本文件中,。
<范围>以及<条件>选择项:确定哪些记录的字段值保存到文本文件中。同时缺省<范围>、<条件>表示将原表的全部记录的字段值都保存到文本文件中。
[TYPE]:当用户生成的新文件不是DBF格式文件时,可以用TYPE选项指定新文件的格式,系统会自动产生不同格式的新文件,并为新文件加上相应的扩展名。
TYPE文件类型包括下列几种:
● SDF:复制为SDF(System Data Format)格式的ASCII文本文件,默认扩展名为.TXT。
● DELIMITED [WITH <定界符> WITH BLANK | WITH TAB]:复制为带分隔符的ASCII文本文件,默认扩展名为.TXT。
SDF和DELIMITED格式的区别:
SDF是将表文件的每一条记录复制到SDF文本文件中,在每一行中,字段与字段间没有分隔符,每一行以回车换行结束。字段在SDF文件中的宽度是固定的,等于源表中该字段的定义宽度。在SDF文件中,表文件中的字符型字段和数值型字段原样存贮,即字符型左对齐存贮,不足部分在右边填以空格;数值型则以右对齐方式存贮,不足部分在左边填以空格。日期型数据以YYYYMMDD格式存贮。逻辑型数据以T或F存贮。SDF文本文件不接受备注型字段和通用型字段。
DELIMITED文件带定界符格式文本文件,也是将源表文件中的每一条记录作为一行存贮,每行以回车换行结尾。但记录的各字段间以分隔符隔开,各字段的宽度为字段值的实际宽度。
字段间的分隔符默认为“,”号,字符型字段的定界符为双引号。用户可以用WITH <定界符>WITH BLANK | WITH TAB指定分隔符,WITH <定界符>表示用指定的<定界符>为字符型字段的定界符;WITH BLANK | WITH TAB则指定空格或Tab键作为字段间的分隔符。若使用WITH BLANK,则字符型字段不再有定界符。
注意:该命令和表文件的复制命令实际上是同一个命令,是复制为表文件还是文本文件,看是否带TYPE子句。
【例3-19】复制STUD.DBF中的记录内容复制到SSTUD.TXT(SDF格式)、DSTUD.TXT(DELIMITED格式)和ESTUD.TXT(以空格为分隔符的DELIMITED格式)中。
USE STUD
COPY TO SSTUD SDF
COPY TO DSTUD DELIMITED
COPY TO ESTUD DELIMITED WITH BLANK
3.3.6 表记录的追加
维护数据库的一项经常性的操作就是根据需要随时向表文件中添加记录,添加记录包括追加记录、插入记录和利用其他文件追加。追加记录在前面已经介绍,在这里就介绍后面两种方法。
1.从另一个表文件中追加记录
【格式】APPEND FROM <文件名 | > [FIELDS <字段名表>][FOR <逻辑表达式>]
【功能】从指定的表文件中读入数据,并添加到当前表文件的末尾。
【说明】数据的追加是从命令中指定的表文件追加到当前表文件中,所以,应先将需要追加记录的表文件打开,设置为当前表,然后再使用该命令进行追加。
表记录的追加
追加原则是同名原则,即将数据来源表中的字段与当前表的字段进行比较,同名则将符合条件的记录的值追加过来。若数据来源表中缺少某些字段,则当前表中该字段值为空。
追加数据记录时,若两个表文件同名字段的宽度不相同,一般情况下,若当前表的字段宽度大于数据来源表的字段宽度,记录能正常追加,对字符型数据后面加空格,对数值型数据前面加“0”,但若当前表的字段宽度小于数据来源表的字段宽度,记录不能正常追加,数据失去原来的意义。对字符型数据截去后面多余字符,对数值型数据进行小数部分的四舍五入,仍不够根据当前表的宽度用“*”号填充,表示溢出。
2.从另一个文本文件中追加记录
(1)命令方式
【格式】APPEND FROM <文件名 | > [FIELDS <字段名表>][FOR <逻辑表达式>] [[TYPE] SDF |[DELIMITED [WITH TAB | WITH <定界符> | WITH BLANK]]
【功能】从指定类型的文本文件中读入数据,并添加到当前表文件的末尾。
【说明】<文件名>是指获取数据的文本文件名。文本文件中的每一行,追加为一条记录。可以在文本文件中输入文本,但要保证文本格式相同,再利用此命令追加为记录。
注意:数据文件若由COPY TO 命令生成的且定义了文本文件的分隔符,则追加记录时也应用相同的分隔符。因为系统以每个分隔符作为字段值的分隔符。这样才能保证数据能正确还原。
(2)菜单方式
① 打开表文件。
② 选择【显示】|【浏览】命令。
③ 选择【表】|【追加记录】命令,弹出图3-17所示的“追加来源”对话框。
④ 单击类型下拉按钮选择用来追加记录的数据文件的类型,在“来源于”显示栏中输入数据来源文件的路径和文件名,再选择“选项”显示框中的字段、条件。确定后返回追加来源窗口。
⑤ 单击“确定”按钮,系统将满足条件的记录完成追加操作。
3.插入记录
【格式】INSERT [BEFORE] [BLANK]
【功能】在当前表文件的指定位置插入新记录或空记录。
【说明】INSERT是在当前记录之后插入新记录,INSERT BEFORE是在当前记录之前插入新记录,INSERT BLANK是在当前记录之后插入空记录。
若表文件建立了索引,则插入的新记录按索引值进行排列。
【例3-20】在表STUD.DBF的第2号记录前插入一条新记录,在第4号记录后插入一条新记录。
USE STUD
GOTO 2
INSERT BEFORE && 在2号记录前插入一条新记录
GOTO 5 && 因已插入了一条新记录,原4号现为5号
INSERT && 在4号记录后插入一条新记录
3.3.7 文件管理命令
Visual FoxPro除了表文件之外,还有其他多种类型的文件,系统对各类文件提供了通用的管理手段,其功能类似于DOS的文件管理命令,但必须注意它们之间的区别。
1.显示文件目录
【格式】DIR | DIRECTORY [ON <盘符>][[LIKE] [<路径>] [<通配符>]][TO PRINTER [PROMPT] | TO FILE <文件名>]
或LIST | DISPLAY FILES [ON <盘符>] [LIKE <通配符>][TO PRINTER [PROMPT] | TO FILE <文件名>]
【功能】显示磁盘文件目录信息。
【说明】该命令类似于DOS操作系统的DIR命令。
ON<盘符>:指定所显示文件目录所在的驱动器符号,缺省此项为当前盘。
[LIKE] [<路径>] [<通配符>]:<路径>指定显示文件所在路径;
文件管理命令
2.文件改名
【格式】RENAME <文件名1> TO <文件名2>
【功能】将<文件名1>改为<文件名2>。
【说明】该命令类似于DOS操作系统的REN命令。
改名之前文件必须关闭,正在使用的文件不能改名。如果有备注文件,对表文件改名时,不要忘记为相应的.FPT文件改名,否则打不开改名后的表。
【例3-22】将STUD.DBF改为GL.DBF。
USE
RENAME STUD.DBF TO GL.DBF
RENAME STUD.FPT TO GL.FPT
3.文件删除
【格式】ERASE [<文件名> | ]
或 DELETE FILE [<文件名> | ]
【功能】从磁盘上删除指定的文件。
【说明】此命令类似于DOS操作系统的DEL命令。
如果选择参数 或缺省文件名选项,系统将弹出Open对话框,供用户选择所需删除的文件。
为防止误操作,该命令不默认扩展名,所以<文件名>必须用全称,<文件名>不能使用通配符,如果<文件名>不在目录下,则需指定路径。同时,此命令也不能删除已打开的文件。
【例3-23】删除当前目录下的.BAK文件。
ERASE ABC.BAK
ERASE STUD.BAK
DELETE FILE XSCJ.BAK
DIR *.BAK
4.文件复制
【格式】COPY FILE <文件名1> TO <文件名2>
【功能】对各类文件进行复制
【说明】此命令类似于DOS操作系统的COPY命令。
<文件名1>和<文件名2>必须给出全名,不能使用通配符;不能复制已打开的文件;当复制含有备注型字段或已建立索引的表文件时,必须复制相应的备注文件和索引文件。
【例3-24】将STUD.DBF改名为STUDBAK.DBF复制到A:盘上。
COPY FILE STUD.DBF TO A:STUDBAK.DBF
COPY FILE STUD.FPT TO A:STUDBAK.FPT && 复制.FPT备注文件
5.显示文本文件
【格式】TYPE <文件名1> [AUTO] [WRAP] [TO PRINTER [PROMPT] | TO FILE <文件名2>][NUMBER]
【功能】显示或同时打印文本文件
【说明】此命令类似于DOS操作系统的TYPE命令。
文本文件是指非结构式文件,即没有任何内部控制符的ASCII码文件。例如命令文件.PRG、屏幕格式文件.FMT和文本文件.TXT。
<文件名1>和<文件名2>:必须带扩展名,不能使用通配符,且不能是打开的文件。
6.调用外部命令
如果觉得Visual FoxPro的文件管理命令不方便,可以调用DOS的有关命令。
【格式】RUN | ! [/N [K]]
【功能】执行MSDOS的系统命令。
【说明】此命令直接完成外部程序的功能。使用本命令必须有足够的内存空间,否则会产生“内存不足”的错误。
3.4 排序与索引
为了高效方便地存取数据,往往要求表记录以某一定的顺序排放或显示,因此,Visual FoxPro提供了两种方法重新组织数据,即排序和索引。
排序是从物理上对表进行重新整理,按照指定的关键字段来重新排列表中数据记录的顺序,并产生一个新的表文件。由于新表的产生即费时间也浪费空间,实际中很少用。
排序与索引
索引是从逻辑上对表进行重新整理,按照指定的关键字段的建立索引文件。一个表文件可以建立多个索引文件,但对于打开的表文件,任何时侯只有一个索引文件起作用,此索引文件称为主控索引。
3.4.1 表的排序
【格式】SORT TO <新文件名> ON <字段1> [/A | /D] [/C] [, <字段2> [/A | /D] [/C] ...]
[ASCENDING | DESCENDING] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>]
[FIELDS <字段名表>]
【功能】对当前打开的表,按指定的字段进行排序,生成新的表文件。
表的排序
生成的排序文件也是一个数据库文件。
范围、条件的含义同COPY TO命令。
用作排序的字段的数据类型允许是N、C、D、L型。
/A 表示升序 /D 表示降序 /C 表示不区分大小写
当有多个关键字段时,先按字段1的值排列,其值相同的,再按字段2的值排列。
原库中的记录发生变化,排序文件不能自动完成同步修改。
该命令执行后,当前表不变,产生的新表不会自动打开。
占空间、废时间,很少用。
【例3-25】将STUD.DBF按性别进行降序排列
USE STUD
SORT TO STUD2 ON 性别/D
3.4.2 表的索引
1.索引及索引文件的概述
索引是以索引文件的形式存在的,它根据指定的索引关键字表达式建立的。索引文件可以看成索引关键字的值与记录号之间的对照表,关键字可以是一个字段,也可以是几个字段的组合。在建立索引文件时,把表所有记录的索引关键字表达式的值按指定顺序排序,并把每个索引关键字表达式值与该值在表中所对应的记录对应起来,保存在索引文件中。
索引文件必须与原表一起使用,查询时根据索引关键字表达式的值先在索引文件中找到某字段所在的记录号,然后再到表里直接定位。这样的查找方式使顺序查找和随机查找都有较高的效率。打开索引文件时,将改变表中记录的逻辑顺序,但并不改变表中记录的物理顺序。
表的索引
一个表文件可建立多个索引文件,也可同时打开多个索引文件,但在同一时间内只有一个索引起作用,这个索引称为主控索引。
Visual FoxPro系统中支持两种不同的索引文件类型,即单索引文件和复合索引文件。
单索引文件是根据一个索引关键字表达式(或关键字)建立的索引文件,文件扩展名为.IDX,它可用INDEX命令的各种形式建立。单索引文件分为标准和压缩两种类型。
复合索引文件是指索引文件中可以包含多个索引标识的扩展名为.CDX。每个索引标识与单索引文件类似,也可以根据一个索引关键字表达式(或关健字)建立。每一个索引标识均有一个特殊的标识名(TAG)。标识名由字母或下划线开头,由字母、数字或下划线组成,长度不超过10个字符。用户可以利用标识名来使用标识,向复合索引文件中追加标识。复合文件中标识的数目,仅受内存和磁盘空间的限制。
复合索引文件又有两种:一种是独立复合索引文件;另一种是结构复合索引文件。
结构复合索引文件是由Visual FoxPro自动命名的,与相应的表文件同名,扩展名为.CDX。当Visual FoxPro打开一个表时,便自动查找一个结构复合索引文件,如果找到便自动打开,该索引文件随表文件同时打开和同时关闭。
独立复合索引文件不与表文件同名,扩展名为.CDX。在打开表时不会自动打开此索引文件,由命令指定打开。
索引可分为下列四种类型:
(1)主索引
主索引是一个永远不允许在指定字段和表达式中出现重复值的索引。它也是在数据库表的永久关联中创建参照完整性时主表和被引用表使用的索引。每一个表只能建立一个主索引,只有数据库表才能建立主索引。
(2)侯选索引
侯选索引也是一个不允许在指定字段和表达式中出现重复值的索引。数据库表和自由表都可以建立侯选索引,一个表可以建立多个侯选索引。
主索引和侯选索引都存储在.CDX结构复合索引文件中,不能存储在独立复合索引文件和单索引文件中,因为主索引和侯选索引都必须与表文件同时打开和同时关闭。
(3)唯一索引
系统只在索引文件中保留第一次出现的索引关键字值。数据库表和自由表都可以建立唯一索引
(4)普通索引
是一个最简单的索引,允许关键字值的重复出现,适合用来进行表中记录的排序和查询,也适合于一对多永久关联中“多”的一边(子表)的索引。数据库表和自由表都可以建立普通索引。
普通索引和唯一索引可以存储在.CDX独立复合索引文件和.IDX单索引文件中。
2.索引文件的建立
(1)命令方式
【格式】INDEX ON <索引关键字表达式> TO <单索引文件> | TAG <标识名>
[OF <独立复合索引文件名>] [FOR <逻辑表达式>] [COMPACT]
[ASCENDING | DESCENDING][UNIQUE] [ADDITIVE]
【功能】对当前表文件按指定的关键字建立索引文件。
【说明】<索引关键字表达式>:指定建立索引文件的关键字表达式,可以是单一字段名,也可以是多个字段组成的字符型表达式,表达式中各字段的类型只能是数值型、字符型和日期型和逻辑型。
当表达式是单个字段名时,字段类型不用转换;应转换成同一类型的表达式。
TAG <标识名>:此选项只对建立复合索引文件时有效,指定建立或追加索引标识的标识名。
OF <独立复合索引文件>:指定独立复合索引文件名。若有此选项,表示在指定的独立复合索引文件中追加一个索引标识,若指定的独立复合索引文件不存在,系统将自动建立指定的文件。若没有此选项,表示在结构复合文件中追加一个索引标识,若结构复合索引文件不存在,系统将自动建立结构复合索引文件。
FOR <逻辑表达式>:表示只对满足条件的记录建立索引。
COMPACT:此选项只对单索引文件有效,表示建立压缩索引文件。
ASCENDING|DESCENDING: ASCENDING表示按升序建立索引,DESCENDING表示按降序建立索引。缺省时,按按升序建立索引。单索引文件不能选用DESCENDING选项。
UNIQUE:表示建立的是唯一索引。
ADDITIVE:表示保留以前打开的索引文件。否则,除结构复合索引文件外,以前打开的其他索引文件都将被关闭。
新建的索引文件自动打开,并开始起作用。
【例3-26】对STUD.DBF表文件建立出生日期单索引文件STUD.IDX。
USE STUD
INDEX ON 出生日期 TO STUD
【例3-27】对表文件STUD.DBF,建立一个基于出生日期字段的结构复合索引文件。
USE STUD
INDEX ON 出生日期 TAG 出生日期 DESCENDING
【例3-28】在表文件STUD.DBF的结构复合索引文件中,按学号和姓名各追加一个标识。
USE STUD
INDEX ON 学号 TAG 学号
【例3-29】在表文件STUD.DBF的结构复合索引文件中,先按性别再按学号追加一个标识。
USE STUD
INDEX ON 性别+学号 TAG 性别学号
【例3-30】在表文件STUD.DBF中,先按性别再按是否团员建立一个独立复合索引文件SXBTY.CDX。
USE STUD
INDEX ON 性别+IIF(是否团员,’团员’,’非团员’) TAG 性别团员 OF SXBTY
(2)菜单方式
① 打开表文件。
② 选择【显示】|【表设计器】命令,打开表设计器对话框,选择“索引”标签,如图3-18所示。
③ 在索引名中输入索引标识名,在类型的下拉列表框中确定一种索引类型,在表达式中输入索引关键字表达式,在筛选中输入确定参加索引的记录条件,在排序序列下默认的是升序按钮,单击可改变为降序按钮。
④ 确定好各项后,选择“确定”,关闭表设计器,同时索引建立完成。
⑤ 同样的方法也可以将以前建立的索引调出,利用表设计器上的“插入”或“删除”按钮进行插入或删除。
注意:用表设计器建立的索引都是结构复合索引文件。
3.索引文件的打开
【格式1】USE <文件名> [INDEX <索引文件名表|?>][ORDER <数值表达式2> | <单索引文件> | [TAG] <标识名> [OF <复合索引文件名>][ASCENDING | DESCENDING]]
【功能】打开指定的表文件及相关的索引文件
【说明】:INDEX <索引文件名表> | :表示打开的索引文件;如果选择“ ”,则系统将出现“打开”对话框,供用户选择索引文件名;如果<索引文件名表>中的第一个索引文件是单索引文件,则它是主索引文件,若第一个索引文件是复合索引文件,则表文件的记录将以物理顺序被访问。
<索引文件名表>:指定要打开的索引文件,索引文件中的文件扩展名可以省略,但如果存在同名的单索引文件和复合索引文件,必须带扩展名。
<索引文件名表>中的单索引文件和复合索引文件的标识有一个唯一的编号,编号最小值为1,编号规则为:先将单索引文件按它们在<索引文件名表>中的顺序编号,再将结构复合索引文件按标识产生的顺序连续编号,最后将独立复合索引文件中的标识先按它在<索引文件名表>中的顺序,再按标识产生的顺序连续编号。
[ORDER]子句:指定主索引。选择此选项时,主索引文件将不是<索引文件名表>中的第一个单索引文件,而是此选项指定的单索引文件或标识。[ORDER]子句中各选项的含义如下:
●<数值表达式2>指定主索引的编号,若<数值表达式2>的值为0,表示不设主索引。
●<单索引文件>指定的单索引文件设置为主索引。
● [TAG] <标识名> [OF <复合索引文件名>]:表示将<复合索引文件名>中的指定标识作为主索引。[OF <复合索引文件名>]缺省表示为结构复合索引文件。
● ASCENDING | DESCENDING:表示主索引被强制以升序或降序索引;缺省此选项,主索引按原有顺序打开。
【格式2】SET INDEX TO [<索引文件名表> ] [ORDER <数值表达式> | <单索引文件名> | [TAG] <标识名> [OF <复合索引文件名>] [ASCENDING | DESCENDING]][ADDITIVE]
【功能】在已打开表文件的前提下,打开相关索引文件。
【说明】ADDITIVE:表示保留以前打开的索引文件。否则,除结构复合索引文件外,以前打开的其他索引文件都将被关闭。
4.索引文件的关闭
【格式1】USE
【功能】关闭当前工作区中打开的表文件及所有索引文件。
【格式2】SET INDEX TO
【功能】关闭当前工作区中打开的所有单索引文件和独立复合索引文件。
【格式3】CLOSE INDEXS
【功能】关闭当前工作区中打开的所有单索引文件和独立复合索引文件。
注意:结构复合索引文件不能用以上命令关闭,它随表文件的打开而打开,随表文件的关闭而关闭。
5.改变主索引
【格式】SET ORDER TO [<数值表达式1> | <单索引文件名> | [TAG] <标识名> [OF <复合索引文件名>] [IN <数值表达式2> | <字符表达式>] [ASCENDING | DESCENDING]]
【功能】重新指定打开的索引文件中的主索引。
【说明】<数值表达式1>的值为指定主索引的编号。
如果<数值表达式1>的值为0或缺省,则恢复表文件的原始顺序,使所有打开的索引文件都无效。
【例3-31】打开STUD.DBF表文件及其相关索引文件,并指定结构复合索引文件中的姓名为主控索引。
USE STUD INDE STUD.IDX ORDER TAG 姓名
【例3-32】打开STUD.DBF表及其相关索引文件,改变主索引文件。
USE STUD INDEX STUD.IDX
SET ORDER TO 4
SET ORDER TO && 使所有索引均无效
6.索引文件的更新
当表中的记录被修改时,系统会自动地更新所打开的索引文件,及时反映数据的变化。对于没有打开的索引文件,索引不能自动更新。为避免使用旧的索引文件导致错误,应该使用重新索引命令更新已经建立的索引文件。
(1)命令方式
【格式】REINDEX [COMPACT]
【功能】重新建立已索引过的索引文件。
【说明】COMPACT:表示将标准的单索引文件变为压缩的单索引文件。
【例3-33】将表STUD.DBF的索引文件重新索引。
USE STUD
SET INDEX TO STUD.IDX
REINDEX
(2)菜单方式
① 打开表文件。
② 选择【显示】|【浏览】命令。
③ 选择【表】|【重新建立索引】命令,系统自动根据各索引表达式重新建立索引。
7.索引的删除
(1)标识的删除
【格式】DELETE TAG <标识名1> [OF <复合索引文件名1>][, <标识名2> [OF <复合索引文件名2>]] ...
或:DELETE TAG ALL [OF <复合索引文件名>]
【功能】从指定的复合文件中删除标识
【说明】OF <复合索引文件名>:指定复合索引文件名,若缺省,则为结构复合索引文件。
(2)单索引文件的删除
【格式】DELETE FILE <单索引文件名>
【功能】删除指定的单索引文件
【说明】关闭的索引文件才能被删除,文件名必须带扩展名。
【例3-34】删除表文件STUD.DBF的单索引文件STUD.IDX及结构复合索引文件中的所有标识。
DELETE FILE STUD.IDX
USE STUD
DELETE TAG ALL
8.索引文件的转换
(1)单索引文件复制到复合索引文件
【格式】COPY INDEXES <单索引文件名表> | ALL [TO <复合索引文件名>]
【功能】将当前表文件已打开的所有单索引文件或<单索引文件名表>中所列的单索引文件,复制到指定的复合索引文件中。
【说明】TO <复合索引文件名>:指定的复合索引文件名,缺省为结构复合索引文件。索引标识名为原单索引文件名。
ALL:表示将所有的单索引文件复制到指定的复合索引文件中
复制前必须打开指定的单索引文件。
3.5 查询
在数据资源的管理过程中,使用最频繁的操作莫过于查询满足一定条件的一系列数据,从而为日常决策提供足够的判断依据。对表记录的查询系统提供了两类查询命令:顺序查询和索引查询。
在前面介绍定位时,省略了条件定位,查询操作实际上就是起到了条件定位的作用。
查询
3.5.1 顺序查询
1.命令方式
【格式】LOCATE FOR<逻辑表达式1>[<范围>][WHILE <逻辑表达2>]
【功能】在表指定范围中查找满足条件的记录。
【说明】LOCATE 命令在表指定范围中查找满足条件的第一条记录。
<逻辑表达式1>:表示所需满足的条件。
<范围>:指定查找范围,缺省时为ALL,即在整个表文件中查找。
找到第一条满足条件的记录后,记录指针指向该记录,并将函数FOUND()(用于检测是否找到满足条件的记录)置为.T.;否则,记录指针指向<范围>的底部或文件结束标志,并且将函数FOUND()置为.F,并在状态栏给出提示信息“已到定位范围末尾”。
顺序查询
如果没有打开索引文件,查找按记录号顺序进行。若打开了索引,查找按索引顺序进行。
该命令的最大特点是可以在没有进行排序或索引的无序表中进行任意条件的查询,这是索引查询做不到的,但在大型表中查询速度和效率也是最低的。
CONTINUE命令:LOCATE找到第一条满足条件的记录后,可以用CONTINUE继续查找下一个满足条件的记录。
CONTINUE命令必须在LOCATE命令之后使用,否则出错。
在CONTINUE命令中实际隐含了前一个LOCATE命令中的条件。
【例3-37】在STUD.DBF中查找学号前四位为0111的同学记录。
USE STUD
LOCATE FOR 学号="0111"
2.菜单方式
① 首先打开表文件
② 选择【显示】|【浏览】命令。
③ 选择【表】|【转到记录】|【定位】命令,出现如图3-19所示的定位记录对话框。
④ 在“作用范围”下拉列表框中选择查询范围,在FOR或WHILE框中输入查询条件,选择定位按钮。系统将指针定位于符合条件的第一条记录上。
3.5.2 索引查询(FIND、SEEK)
LOCATE命令用于按条件进行顺序定位,无论索引文件是否打开都可使用。在打开索引文件后,还可以用FIND、SEEK命令进行快速检索。
索引查询(FIND、SEEK)
1.FIND命令
【格式】FIND <字符串>/<数值常量>
【功能】在表文件的主控索引中查找关键字值与<字符串>或<数值常量>相匹配的第一个记录。
【说明】必须打开相应的库文件、主索引文件。
查询字符串,字符串可以不用定界符括起来,但前后有空格的,则必须要括进来。
查询常数,必须使用索引关键字的完整值。
允许查询字符型内存变量,但必须使用宏替换函数。
由于索引文件中关键字表达式值相同的记录总是排在一起的,可用SKIP、DISP命令来逐个查询。
查询完满足条件的记录后,不能自然给出提示,常借助于EOF()函数来判断查询是否完成。
多关键字查询,建立索引时STR函数若没有指定小数位,则应补齐不足10位的空格。

如果用SET EXACT ON命令,则匹配必须是精确的。即FIND命令中的查询内容必须与记录的关键字段值完全相等。如果用SET EXACT OFF命令,则匹配可以是不精确的,即只要FIND命令中的查询内容与记录的关键字段值的左侧相等即可。
【例3-38】打开表文件STUD.DBF,查找姓“赵”的记录。
USE STUD
SET ORDER TO 姓名
FIND 赵
2.SEEK命令
【格式】SEEK <表达式>
【功能】在表文件的主索引中查找关键字值与<表达式>值相匹配的第一个记录。
【说明】SEEK命令可以查找字符型、数值型、日期型、逻辑型表达式的值。
SEEK命令中的表达式的类型必须与索引表达式的类型相同。
可以查找字符、数值、日期和逻辑型字段的值。
内存变量可以直接进行查询,不用进行宏替换。
表达式为字符串时,必须用定界符括起来。日期常量也必须用大括号括起来。
表达式可以为一复杂的表达式,计算机先计算表达式的值,然后用其值进行查询。
由于索引文件中关键字表达式值相同的记录总是排在一起的,可用SKIP、DISP命令来逐个查询。
如果用SET EXACT ON命令,则匹配必须是精确的。
【例3-40】用SEEK命令在STUD.DBF中查找记录。
USE STUD
INDEX ON 是否团员 TAG 是否团员
SET ORDER TO 姓名
SEEK "孙"
3.6.1 统计记录数
【格式】COUNT [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量>]
【功能】用于统计当前表中指定范围内满足条件的记录个数。
【说明】除非指定了<范围>或 FOR/WHILE <条件>,否则将计算所有记录个数,如选择了 TO <内存变量>,则可将计算结果保存在<内存变量>中,否则统计结果只在屏幕上显示。
若选择了SET TALK OFF将不显示统计结果。
若 SET DELETE OFF,则加删除标志的记录将被计算。
【例3-41】统计STUD.DBF中的男同学记录个数和表记录总数。
数据统计与计算
USE STUD
COUNT FOR 性别="男" TO A
COUNT TO B
3.6.2 求和
【格式】SUM [<表达式表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO <内存变量表> | TO ARRAY <数组>] [NOOPTIMIZE]
【功能】对指定范围内、满足条件的记录按指定的各个表达式分别求和。
【说明】缺省范围、条件表示全部记录。
缺省数值型表达式表,表示对库中所有数值型字段求和。
数值型表达式表中表达式的个数应与内存变量的个数一致。
【例3-42】有一表文件GZGL.DBF内容如下,
Record# 姓名 性别 车间 基本工资 岗位工资 奖金 工资总额
1 张小红 女 金工一 645 340 120 1105
2 李建军 男 金工一 690 370 130 1190
3 孙爱国 男 金工一 580 340 120 1040
4 吴晓英 女 金工一 540 360 110 1010
5 张 斌 男 金工二 670 400 140 1210
6 赵 娜 女 金工二 570 330 110 1010
7 赵明明 男 金工二 560 300 100 960
8 李 菲 女 机修 650 350 150 1150
9 苏汉胜 男 机修 600 340 100 1040
10 罗 丹 女 工具 600 350 130 1080
11 李会明 男 工具 670 350 120 1140
对GZGL.DBF中的基本工资、岗位工资、奖金和工资总额求和,并将结果存贮成数组A中。
USE GZGL
SUM TO ARRAY A
3.6.3 求平均值
【格式】AVERAGE [<表达式表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量表> | TO ARRAY <数组>] [NOOPTIMIZE]
【功能】对当前表文件中指定范围内满足条件的记录,按指定的数值型字段计算平均值。
【说明】缺省范围、条件表示全部记录。
缺省数值型表达式表,表示对当前库中所有数值型字段求平均值。
数值型表达式表中表达式的个数应与内存变量的个数一致。
【例3-43】分别计算GZGL.DBF中的男女各项收入的平均值。
USE GZGL
AVER FOR 性别=”男” TO ARRAY B
AVER FOR 性别=”女” TO ARRAY C
3.6.4 综合计算
【格式】CALCULATE <表达式表> [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量表> | TO ARRAY <数组>]
【功能】对当前表文件中指定范围内满足条件的记录进行指定的计算工作。
【说明】<表达式表>可以是表3-4中函数的任意组合。
【例3-44】计算GZGL.DBF中的人数、奖金收入的平均值和最大值、工资总额的最大值、平均值。
USE STUD
CALC CNT(),AVG(奖金),MAX(奖金),AVG(工资总额),MAX(工资总额) TO X1,X2,X3,X4,X5
3.6.5 分类汇总
【格式】TOTAL TO <汇总文件名> ON <关键字段> [FIELDS <字段名表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [NOOPTIMIZE]
【功能】按关键字段对当前表文件的数值型字段进行分类汇总,形成一个新的表文件。
【说明】当前表必须在关键字上排序或索引,否则仅将关键字段值相同的紧挨的记录值汇总。
汇总命令执行后,将生成一个新的数据库文件(并没有被打开)。
对非数值型字段,则把关键字相同的连续记录的第一条记录的字段内容送入新库。
缺省待汇总字段名表,则将所有数值型字段的值进行汇总。
若数值型字段的汇总值超过了原数据库该字段的宽度,系统会自动修改汇总库中该字段的宽度。
汇总文件的结构与当前表的结构完全相同,汇总记录个数由<关键字段>的值确定 。
【例3-45】对GZGL.DBF按“车间”分类汇总。
USE GZGL
INDEX ON 车间 TAG 车间
TOTAL ON 车间 TO GZCJ
TOTAL TO GZCJ ON车间
USE GZCJ
对GZGL.DBF按“性别”分类汇总。
USE GZGL
INDEX ON 性别 TAG 性别
TOTAL TO GZXB ON 性别
USE GZXB
3.7 多表的操作
迄今所讲述的对表的操作都是在一个工作区进行的,每个工作区最多只能打开一个表文件,用USE命令打开一个新的表,同时也就关闭了前面已打开的表。在实际应用中,用户常常需要同时打开多个表文件,以便对多个表文件的数据进行操作。为了解决这一问题,Visual FoxPro引入了工作区的概念。Visual FoxPro允许用户在表间建立临时关系和永久关系。
多表的操作
3.7.1 工作区与多个表
1.工作区和当前工作区
Visual FoxPro 能同时提供32767个工作区。系统默认值为1区。
在任意时刻,只有一个工作区是当前工作区,用户只能在当前工作区对打开的当前库进行操作。
每一个工作区都可以并且只能打开一个数据库文件。
同一个数据库文件不允许同时在多个工作区打开,但在其它工作区中被关闭之后,可以在任意一个工作区中被打开。
各工作区中打开的数据库彼此相互独立(指针不受影响)。
2.选择当前工作区
每一个工作区用工作区号或别名来标识
(1)工作区号
利用数字1~32767来标识32767个不同的工作区
(2)别名
前10工作区用A~J10个字母来标识。
采用该工作区中已打开的数据库的库名来作别名
用户自己定义
【命令格式】 :USE 〈数据库名〉[ALIAS〈别名〉]
【功能】 :打开数据库文件并为该数据库起一个别名。
【说明】给数据库起了别名后,数据库名就不是默认的别名了。
(3)工作区的选择
当系统启动时,1号工作区是当前工作区,若想改变当前工作区,则可使用SELECT命令来转换当前工作区。
【命令格式】:SELECT<工作区号>/<工作区别名>
【功能】:选择一个工作区作为当前工作区。
【说明】:<工作区号> | <工作区别名>:指定当前工作区。选择工作区时,可以直接指定区号,也可以通过别名指定工作区,二者是等效的。
别名可以是系统规定的别名,也可以是用户规定的别名,甚至可以用已打开的表名替代工作区别名。此命令允许选用“0”号工作区。如果指定“0”,则表示选用当前未使用过的编号最小的工作区作为当前工作区。
执行该命令后,对任何工作区中的表及记录指针均不发生影响,仅实现各个工作区之间切换。
【例3-46】在1号和2号工作区内分别打开STUD.DBF和COURSE.DBF表文件,并选择1号工作区为当前工作区。
SELECT 1 && 或 SELECT A
USE STUD
SELECT 2
USE COURS
SELECT 1
3.非当前工作区字段的引用
Visual FoxPro系统对当前工作区上的表可以进行任何操作,也可以对其他工作区中的表文件的数据进行访问。在主工作区可通过以下两种格式访问其他工作区表中的数据。
格式:<工作区别名>-> <字段名>
<工作区别名>. <字段名>
通过用工作区别名指定欲访问的工作区,所得到的字段值为指定工作区打开的表当前记录的字段值。
【例3-47】在1号和2号工作区打开STUD.DBF和SC.DBF,在1号工作区内查看当前记录的学号、姓名、性别、出生日期、课程号、成绩等字段内容。
SELECT A
USE STUD && 在一号工作区中打开STUD
SELECT B
USE SC && 在二号工作区中打开SC
SELECT A && 选择1号工作区为当前工作区
DISPLAY 学号,姓名,性别,出生日期,B->课程号,SC.成绩
3.7.2 表的关联
1.关联的概述
所谓表文件的关联是把当前工作区中打开的表与另一个工作区中打开的表进行逻辑连接,而不生成新的表。当前工作区的表和另一工作区中的打开表建立关联后,当前工作区是表的记录指针移动时,被关联工作区的表记录指针也将自动相应移动,以实现对多个表的同时操作。
在多个表中,必须有一个表为关联表,此表常称为父表,而其他的表则称为被关联表,常称为子表。在两个表之间建立关联,必须以某一个字段为标准,该字段称为关键字段。表文件的关联可分为一对一关联、一对多关联和多对多关联。
表的关联
2.表文件关联的建立
(1)一对一关联的建立
1)命令方式
【格式】SET RELATION TO [<关键字段表达式> | <数值表达式>] [INTO<别名> | <工作区号>] [ADDITIVE]
【功能】将当前工作区的表文件与<别名>(或工作区号)指定的工作区中的表文件按<关键字段表达式>或<数值表达式>建立关联。
【说明】当用<关键字段表达式>建立关联时,关键字必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定关键字段为主索引。
当父表文件的记录指针移动时,子表文件的记录指针根据主索引文件指向关键字段值与父表文件相同的记录。如果子表中没有与关键字段值相同的记录,记录指针指向文件尾,EOF()为.T.。
当按<数值表达式>建立关联时,别名表不需要打开索引文件,两个表文件按照记录号相联系,父表文件的记录指针移动时,子表文件的记录指针移至与数值表达式相等的记录上。若找不到此记录,记录指针指向文件尾,EOF()为.T.。
ADDITIVE:表示当前表与其他工作区表己有的关联仍有效,实现一个表和多个表之间的关联;否则取消当前表与其他工作区表已有的关联,当前表只能与一个表建立关联。
SET RELATION TO则表示取消当前工作区与其他工作区的关联。
【例3-48】 将表文件STUD.DBF和SC.DBF以学号为关键字段建立关联。
SELECT 2 && 选择工作区2
USE SC && 打开表文件SCORE.DBF
INDEX ON 学号 TAG 学号 && 建立学号标识
SET ORDER TO TAG 学号 && 指定学号为主索引
SELECT 1 && 选择工作区1
USE STUD && 打开表文件STUD.DBF
SET RELATION TO 学号 INTO 2 && 建立一对一关联
【例3-49】 将表文件STUD.DBF和SC.DBF按数值表达式建立关联。
SELECT 2 && 选择工作区2
USE SC && 打开表文件SC.DBF
SELECT 1 && 选择工作区1
USE STUD && 打开表文件STUR.DBF
SET RELATION TO RECNO() INTO 2
2)菜单方式
① 选择【窗口】|【数据工作期】,弹出数据工作期窗口。
② 选择【打开】,将需要用到的表在不同的工作区打开。
③ 在别名列表中选择主表,再单击“关系”按钮,再在别名列表中选择子表。
④ 如果子表文件未指定主索引,系统会打开如图3-21所示的“设置索引顺序”对话框,以指定子表文件的主索引。
⑤ 主索引建立后,系统弹出如图3-22所示的“表达式生成器”(Expression Builder)对话框,在字段列表框中选择关联关键字段,然后单击“确定”按钮,返回数据工作期窗口。
⑥ 此时在数据工作期窗口的右侧列表框中出现了子表,在父表和子表之间有一单线相连,说明在两表之间已建立了一对一关联,如图3-23所示。
(2)一对多关联的建立
1)命令方式
【格式】SET SKIP TO [<别名1>[, <别名2>] ...]
【功能】将当前表文件与其他工作区中的表文件建立一对多关联。
【说明】先要用SET RELATION命令建立了一对一的关联,然后才能将一对一的关联进一步定义成一对多的关联。
当前工作区表记录指针移动时,别名库文件的记录指针指向第一个与关键字表达式值相匹配的记录,若找不到相匹配的记录,则记录指针指向文件尾部,EOF()为.T.。
当父表中的一个记录与子库的多个记录匹配时,在父表中使用SKIP命令,并不使父表的指针移动,而子表的指针却向前移动,指向下一个与父表相匹配的记录;重复使用SKIP命令,直至在子表中没有与父表当前记录相匹配的记录后,父表的指针才真正向前发生移动。
无任何选择项的SET SKIP TO命令将取消一对多的关联(一对一的关联仍然存在)。
2)菜单方式
① 选择【窗口】|【数据工作期】,弹出的数据工作期窗口。
② 按前面所述的步骤,建立一对一关联。
③单击【一对多】按钮,系统弹出创建一对多关系对话框。
④ 在创建一对多关系对话框的子表别名列表框选择子表别名,单击“移动”按钮,子表别名将出现在选定别名列表框中,单击“确定”按钮,完成子表别名的指定,并返回到数据工作期窗口。
⑤ 如果子表文件未指定主索引,系统显示“指定索引顺序”对话框,以便用户指定主索引。
⑥ 完成上述工作后,在数据工作期窗口的右侧列表框中出现了子表文件名,在父表和子表之间有一双线相连,说明在两表之间已建立了一对多关联 。
(3)一个表对多个表关联的建立
1)命令方式
【格式】SET RELATION TO [<关联表达式1> INTO <别名1> | <工作区1>[, <关联表达式2> INTO <别名2> | <工作区2> ...][ADDITIVE]]
【功能】将主工作区中的表与多个其他工作区中的表建立关联。
【说明】<关联表达式1>表示与别名1表文件建立关联时的关键字段表达式,<关联表达式2>表示与别名2表文件建立关联时的关键字段表达式,建立关联时,关键字段必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定为主索引。
当父表文件的记录指针移动时,多个子表文件的记录指针根据各自的主索引文件指向关键字段值与父表文件相同的记录。
其他有关参数均同前述。
2)菜单方式
多次利用上节介绍的菜单步骤,只要每次选择的子表不同,就可以分别建立一个表文件同多个表文件的关联。
3.取消表的关联
(1)在建立关联的命令中,如果不选用ADDITIVE选项,则在建立新的关联的同时,取消了当前表原来建立的关联。
(2)命令SET RELATION TO,取消当前表与其他表之间的关联。
(3)命令SET RELATION OFF INTO <别名> | <工作区号>,取消当前表与指定别名表之间的关联。
(4)关闭表文件,关联都被取消,下次打开时,必须重新建立。
3.7.3 数据库的连接
在实际应用中,经常需要把不同数据结构的表文件按一定要求连接形成一个新的表文件,这就是表文件的连接,称为物理连接。
【格式】 JOIN WITH <工作区号> | WITH <别名> TO <新文件名> FOR <逻辑表达式> [FIELDS <字段名表>]
【功能】将当前表文件和另一工作区中打开的<别名>表文件按指定的条件连接,生成一个以<新文件名>为名的新表文件,实现物理上的连接。
【说明】WITH <工作区号> | WITH <别名>指定另一工作区打开的表文件,<新文件名>表示连接生成的新表文件,其扩展名可省略,系统默认为.DBF。
FOR <逻辑表达式>指定两个表文件的连接条件,它不同于其他命令中的FOR子句,其他命令的FOR子句都是选择项,这里的FOR子句不可缺省,否则,JOIN命令无法执行。
数据库的连接
【例3-51】将STUD.DBF和SC.DBF表按学号连接,生成一个新的表文件STUD_SC.DBF。
SELECT 2
USE SC
SELECT 1
USE STUD
JOIN WITH B TO STUD_SC FOR 学号=B->学号 FIELDS 学号,姓名,班级名,系别代号,B->课程号,B->成绩 && 连接生成新文件STUD_SC
3.7.4 表间的数据更新
【格式】UPDATE ON <关键字段> FROM <别名> | <工作区号> REPLACE <字段1> WITH <表达式1> [,<字段2> WITH <表达式2>…] [RANDOM]
【功能】用<别名>或<工作区号>指定的表的数据更新当前区表中的数据。
表间的数据更新
【说明】<关键字段>必须为两个表所共有的。
<别名> | <工作区号>:指定用来进行数据更新的表文件。
<字段1> WITH <表达式1>:用表达式1的值更新字段1的内容, 表达式中出现的别名库中的字段应以前缀“别名->”或“别名.”标识。
如果选用RANDOM选择项,别名区中文件不需索引或按关键字段升序排序;否则两个表文件都必须以关键字段索引或按关键字段升序排序。
若当前区表中有多个关键字值相同的记录,则只对第一个进行更新;若别名库中有多个关键字值相同的记录,则对当前表中相应的记录进行多次更新。
【例3-52】表文件ZFCJ.DBF内容如下,用SC.DBF中的各课成绩值计算ZFCJ.DBF中的总分成绩。
记录号 学号 姓名 总分
1 961101 李建国 90.0
2 961103 李 宁 92.0
3 961202 赵 娜 89.0
4 961204 孙 亮 75.0
5 971110 赵 琳 92.0
6 971405 罗宇波 90.0
SELECT 2
USE SC
SELECT 1
USE ZFCJ
SET ORDER TO TAG 学号 && 指定主索引标识
UPDATE ON 学号 FROM SC REPLACE 总分 WITH 总分+A->成绩 RANDOM
一、选择题
1.若当前驱动器号是C,当前目录是\FoxPro\,要在C盘的USER目录下创建一个名为TEACHER的表,下面不正确的命令是________。
A)CREAT C:\USER\TEACHER.DBF
B)CREAT C:\USER\TEACHER
C)CREAT TEACHER
D)CREAT \USER\TEACHER
2.用DISPLAY命令显示数据时,若未指定<范围>,则________。
A)不停地显示表中的全部记录
B)显示当前一条记录
C)显示下一条记录
D)分屏显示表全部记录
思考题
3.修改表结构的命令是________。
A)MODIFY STRUCTURE B)EDIT STRUCTURE
C)CHANGE STRUCTURE D)BROWSE STRUCTURE
4.若要在表中真正删除记录,先用DELETE命令,再用________。
A)RECALL B)PACK
C)按ESC键 D)不用其他命令
5.若对已有记录的表文件STUD.DBF使用命令
USE STUD
GO 1
BOF( )
则显示结果是________。
A)0 B)1 C).F. D).T.
1.设计一张二维表。
2.建立一个数据表。
3.对已有的表进行数据输入、记录显示和修改、追加记录等操作。
4.对已有的表进行逻辑删除记录和物理删除记录操作。
实验题(共61张PPT)
第2章
Visual FoxPro中的数据与运算
目 录
上一页
下一页
退 出
本 章 要 点
2.1 Visual FoxPro的常量与变量
2.4 Visual FoxPro的表达式
2.2 Visual FoxPro的函数
思考题
2.2 Visual FoxPro的常量与变量
在Visual FoxPro系统中,数据可用常量、变量、数组表示,数据还可以用字段、记录和对象中,由它们存储、容纳各种类型的数据。因此,常把这些供数据存储的常量、变量、数组、字段、记录和对象等称为数据存储容器。用户正是利用不同的数据存储容器,在Visual FoxPro系统中表示、存储、操作、处理各种类型的数据,实现数据处理的应用。
2.2.1 常量
常量是在命令或程序中可直接引用、具有具体值的命名数据项,其特征是在整个操作过程中它的值和表现形式保持不变。Visual FoxPro按常量取值的数据类型,将常量分为6种类型
数值型常量、货币型常量、字符型常量、逻辑型常量、日期型常量、日期时间型常量。
1.数值型常量(N)
由数字0-9、小数点和正负号组成,表示整数或实数值。
如;100,-21,15.31,-21092.5041等分别是数值型常量中的整数和实数。
数值型数据在内存中占用8个字节 .
2.货币型常量(Y)
用来表示货币值,书写格式与数据型常量类似.但要多加一个$前置符号.且采用四位小数.他没有科学记数法,在内存中占8个字节.
3.字符型常量
由任意ASCII字符、汉字和汉字字符组成的字符型数据,字符型常量又称为字符串。为与其他类型常量、变量和标识符相区别,Visual FoxPro要求将字符串中所有字符,用一对双引号“"”或单引号“'”或方括号“[]”作为定界符对括起来。
如“ I am a student..”,‘中华人民共和国’,[Visual FoxPro 6.0系统]都是字符串。
5.日期型常量
日期型常量是表示日期值的数据,其默认格式是{mm/dd/[yy]yy}。如{10/01/02}和{10/01/2002}均表示2002年10月1日这一日期常量值。
6.日期时间型常量
Visual FoxPro系统中增加了一种表示日期和时间值的日期时间型常量,其默认格式是:
{mm/dd/[yy]yy [,] hh:mm:ss[a|p]}
其中a和p分别表示AM(上午)和PM(下午)。
日期值和日期时间值的输入格式与输出格式并不完全相同,特别是输出格式受系统环境设置的影响,用户可根据应用需要进行相应调整、设置。
(1)日期格式中的世纪值
通常日期格式中用2位数表示年份,但涉及到世纪问题就不便区分。Visual FoxPro提供设置命令对此进行相应设置。
命令格式:
SET CENTURY ON | OFF | TO [nCentury]
命令功能:
ON:日期数据显示10位,其中年份4 位,即日期值输出时显示年份值;
OFF:(默认值)。日期数据显示8位,年份2位,即日期值输出时不显示年份值;
TO [nCentury]:指定日期数据所对应的世纪值。nCentury是一个1~99的整数,代表世纪数。
(2)设置日期显示格式
用户可以调整、设置日期值和时间值的显示输出格式。既可以用命令方式设置,也可以用菜单方式设置。
命令格式:
SET DATE [TO] AMERICAN | ANSI | BRITISH | FRENCH | GERMAN | ITLIAN | JAPAN | USA | MDY
| DMY | YMD | SHORT | LONG
命令功能:设置日期型和日期时间型数据的显示输出格式。系统默认为AMERICAN美国格式。
如果日期格式设置为SHORT或LONG格式,Visual FoxPro系统将按Windows系统设置的短日期格式或长日期格式显示输出日期数据,而且SET CENTURY命令的设置被忽略。
各种日期格式设置所对应的日期显示输出格式,见表2-1所示。
表2-1 系统日期格式
设 置 值 日 期 格 式 设 置 值 日 期 格 式
AMERICAN mm/dd/yy USA mm-dd-yy
ANSI yy.mm.dd MDY mm/dd/yy
BRITISH / FRENCH dd//mm/yy DMY dd//mm/yy
GERMAN dd.mm.yy YMD yy/mm/dd
ITALIAN dd-mm-yy SHORT Windows短日期格式
JAPAN yy/mm/dd LONG Windows长日期格式
(3)设置日期2000年兼容性
通常日期型和日期时间型数据的结果,与SET DATE命令和SET CENTURY命令设置状态及当前系统时间有关。由于系统时间与相应设置不同,同一数据的结果可能有不同的解释。如日期值{10/11/12}可以解释为1912 年 10 月 11 日、2012 年 10 月 11 日、1912 年 11 月 10 日、1910 年 11 月 12 日或者 2010 年 11 月 12 日等。这显然会导致系统混乱,而且还可能造成2000年兼容性错误,影响系统正常、有效的操作运行。
Visual FoxPro系统增加了一种所谓严格的日期格式。不论哪种设置,按严格日期格式表示的日期型和日期时间型数据,都具有相同的值和表示形式。严格的日期格式是:
{^yyyy-mm-dd[,][hh[:mm[:ss]][a|p]]}
^ 符号表明该格式是严格的日期格式,并按照 YMD 的格式解释日期型和日期时间型数据,它是严格日期格式的标志,不可缺少。有效的日期型和日期时间型数据分隔符为:连字符“-”、正斜杠“/”、句点“.”和空格。如{^2002-10-01}、{^2002-10-01 10:30:30a},分别以严格的日期格式表示2002年10月1日及该日上午10时30分30秒这两个日期数据。
Visual FoxPro系统默认采用严格的日期格式,并以此检测所有日期型和日期时间型数据的格式是否规范、合法。为与早期版本兼容,用户通过命令或菜单设置改变这一格式。
命令设置的命令格式:
SET STRICTDATE TO [0 | 1 | 2]
命令功能:
0:关闭严格的日期格式检测,即设置日期格式按传统的严格的格式;
1:设置严格的日期格式检测(默认值),要求所有日期型和日期时间型数据均按严格的格式;
2:设置与1相同,但如果程序代码中出现CTOD()和CTOT()函数时,会出现编译错误。这个设置最适合调试时使用,用来检测2000年兼容性错误;
省略:恢复系统默认值,等价于1的设置。
4.逻辑型常量
逻辑型常量就是表示逻辑判断结果“真”或“假”的逻辑值。逻辑常量只有真和假两种值,分别用(.t.或.y.)和(.f.或.n.)表示真和假。一般应在表示逻辑常量的字母左右加注圆点符“.”以示区别。
在内参中占用一个字节.
2.2.2 变量
变量是在操作过程中可以改变其取值或数据类型的数据项。在Visual FoxPro系统中变量分为字段变量、内存变量、数组变量和系统变量4类。此外,作为面向对象的程序语言,Visual FoxPro在进行面向对象的程序设计中引入了对象的概念,对象实质上也是一类变量。
确定一个变量,需要确定其三个要素:变量名、数据类型和变量值。
1.命名约定
在Visual FoxPro系统中,将表示、存储数据的常量、变量、数组、字段、记录、对象、表、数据库等,都称之为数据容器。所有数据容器均需命名以相互区别,为规范各类对象的命名,Visual FoxPro系统推荐了若干“命名约定”供用户参考,以提高操作命令与程序的可读性和规范性。
● 使用字母,下划线和数字命名。一般建议不采用汉字命名;
● 命名以字母或下划线开头;除自由表中字段名、索引的TAG标识名最多只能10个字符外,其他的命名可使用1~128个字符;
● 避免使用 Visual FoxPro的保留字;
● 文件名的命名应遵循操作系统的约定。
2.字段变量
表由若干记录构成,每个记录都包含若干个数量相同的字段,同一字段在不同记录中分别对应不同的字段值,因此,字段也是变量。与其他变量不同的是,字段变量是定义在表中的变量,随表的存取而存取,因而是永久性变量。字段名就是变量名;变量的数据类型为Visual FoxPro中任意数据类型,字段值就是变量值。
3.内存变量
内存变量是在内存中定义的、一种单个数据元素的临时性变量。
(1)内存变量的数据类型
内存变量的数据类型包括:数值型、字符型、逻辑型、日期型和日期时间型;
(2)内存变量的建立
建立内存变量就是给内存变量赋值。内存变量赋值既可定义一个新的内存变量,也可改变已朋内存变量的值或数据类型。
命令格式:
STORE <表达式> TO <内存变量表>
命令功能:计算<表达式>的值并赋值给各个内存变量。
命令格式:
<内存变量> = <表达式>
命令功能:计算<表达式>的值并赋值给指定内存变量。
(3)内存变量的显示输出
可以用两个命令在屏幕上显示输出内存变量的值。
命令格式:
?| ?? <表达式表> [AT <列号>]
命令功能:计算表达式表中各表达式的值,并在屏幕上指定位置显示输出各式的值。
?:先回车换行,再计算并输出表达式的值;
??:在屏幕上当前位置,计算并直接输出表达式的值;
<表达式表>:多个心逗号两两分隔的表达式,各表达式的值输出时,以空格分隔;
AT <列号>子句指定表达式值从指定列开始显示输出。AT的定位只对它前面的一个表达式有效,多个表达式必须用多个AT子句分别定位输出,而且可反序定位。
4.数组变量
数组变量是结构化的变量,是一组具有相同名称、以下标相互区分的有序内存变量。一个数组通常都包含多个数据元素。Visual FoxPro系统中只允许使用一维数组(相当于数列)和二维数组(相当于行列式或矩阵)。
(1)数组元素
● 数组中各有序变量(数据元素)组成数组的成员,称为数组元素。数组元素实质上是一个内存变量,也称数组变量,它们具有相同变量名即数组名,彼此以下标区分;
● 数组元素的名称(变量名)用数组加下标构成。如AA(1),BB(2,3)分别表示一维数组AA的第1个元素,二维数组BB中第2行第3列的元素;
● 下标必须用圆括号对括;一维数组的元素只有一个下标,二维数组的元素有两个以逗号分隔的下标;
● 下标必须是非负数值,可以是常量、变量、函数或表达式,下标值会自动取整。如AA(1.5),AA(nA1),AA(2+10/3)等;
● 数组元素的数据类型决定于最后赋值的数据类型;不同数组元素的数据类型可以不同;
● 数组元素与普通内存变量一样操作,可以赋值和引用。
(2)数组的定义
数组必须先定义后使用,定义数组是向系统申请数组元素在内存中的存储空间。
命令格式:
DIMENSION | DECLARE <数组名1>(<数值表达式1>[,<数值表达式2>])
[,<数组名2>(<数值表达式3>[,<数值表达式4>])…]
命令功能:定义指定的各个数组。
(3)数组的赋值与引用
数组元素的赋值与引用,与普通内存变量的规则相同。
5.系统变量
系统变量是Visual FoxPro系统特有的内存变量,它由Visual FoxPro系统定义、维护。系统变量有很多,其变量名均以下划线“_”开始,因此在定义内存变量和数组变量名时,不要以下划线开始,以免与系统变量名冲突。系统变量设置、保存了很多系统的状态、特性,了解、熟悉并且充分地运用系统变量,会给数据库系统的操作、管理带来很多方便,特别是开发应用程序时更为突出,学习时可对此有所关注。
6.内存变量与数组变量的基本操作
(1)变量的显示
用?/??命令可以分别显示单个或一组变量的值。有时用户还需了解变量其他相关信息,如数据类型、作用范围,或了解系统变量的信息。Visual FoxPro系统提供了相应操作命令。
命令格式;
DISPLAY | LIST MEMORY [LIKE <通配符>] [TO PRINTER [ PROMPT] | TO FILE <文本文件名>] [NOCONSOLE]
命令功能:显示指定变量的信息。
(2)变量的保存
Visual FoxPro提供相应命令,可用文件形式将某些变量保存起来,以便重复使用。
命令格式:
SAVE TO <变量文件名> [ALL LIKE <通配符> | ALL EXCEPT <通配符> ]
命令功能:将指定变量的信息保存到指定的变量文件(*.MEM)中。
ALL LIKE <通配符>:只保存符合通配符条件的所有变量;
ALL EXCEPT <通配符>:只保存不符合通配符条件的所有变量。
(3)变量的恢复
需要保存在文件中的变量信息时,必须先恢复到内存后方可使用。
命令格式:
RESTORE FROM <变量文件名> [ADDITIVE]
命令功能:将指定变量文件(*.MEM)中变量信息恢复到内存中。
ADDITIVE:省略此项,清除内存所有变量后再恢复文件中变量的信息;加选此项,将变量文件中的变量信息追加到内存现有变量信息中。
(4)变量的清除
Visual FoxPro系统对定义内存变量的数量是有限制的,应及时清理,尽量减少内存的占用,定义其他变量。
命令格式:
RELEASE <变量表>
RELEASE ALL [LIKE <通配符> | EXCEPT <通配符> ]
2.3 Visual FoxPro的函数
Visual FoxPro系统中,函数是一段程序代码,用来进行一些特定的运算或操作,支持和完善命令的功能,帮助用户完成各种操作与管理。Visual FoxPro系统有数百种不同函数,按函数提供方式,可分为系统(标准)函数和用户自定义函函数,按函数运算、处理对象和结果的数据类型,可分为数值型函数、字符型函数、逻辑型函数、日期时间型函数、数据转换函数等,按函数的功能和特点,可分为数据处理函数、数据库操作函数、文件管理函数、键盘和鼠标处理函数、输出函数、窗口界面操作函数、程序设计函数、数据库环境函数、网络操作函数、系统信息函数动态数据操作函数等。
Visual FoxPro的函数由函数名与自变量两部分组成。标准函数是Visual FoxPro系统提供的系统函数,其函数名是Visual FoxPro保留字,自定义函数是用户自已定义的函数,函数名用户指定;自变量必须用圆括号对括起来,如有多个自变量,各自变量以逗号分隔;有些函数可省略自变量,或不需自变量,但也必须保留括号;自变量数据类型由函数的定义确定,数据形式可以是常量、变量、函数或表达式等。
函数是一类数据项,除个别(如宏替换)函数外,函数都不能像命令一样单独使用,只能作为命令的一部分进行操作运算。
2.3.1 数值函数
数值函数用于数值运算,其自变量与函数都是数值型数据。
1.取绝对值函数ABS( )
【格式】ABS()
【功能】计算nExp的值,并返回该值的绝对值。
2.指数函数EXP( )
【格式】EXP()
【功能】求以e为底、nExp值为指数的幂,即返回ex的值。
3.取整函数INT( )
【格式】INT()
【功能】计算nExp的值,返回该值的整数部分。
4.上界函数CEILING( )
【格式】CEILING()
【功能】计算nExp的值,返回一个大于或等于该值的最小整数。
5.下界函数FLOOR( )
【格式】FLOOR()
【功能】计算nExp的值,返回一个小于或等于该值的最大整数。
6.自然对数函数LOG( )
【格式】LOG()
【功能】求nExp的自然对数。nExp的值必须为正数。
7.常用对数函数
【格式】LOG10()
【功能】求nExp的常用对数。nExp的值必须为正数。
8.平方根函数SQRT( )
【格式】SQRT()
【功能】求非负nExp的平方根。
9.最大值函数MAX( )和最小值函数MIN( )
【格式】MAX(,< nExp2>[,< nExp3>...])
MIN(,< nExp2>[,< nExp3>...])
【功能】返回数值表达式中的最大值MAX( )和最小值MIN( )。
10.求余数函数MOD( )
【格式】MOD()
【功能】返回nExp1除以nExp2的余数。余数的小数位数与nExp1相同,符号与nExp2相同。
11.四舍五入函数ROUND( )
【格式】ROUND(,< nExp2>)
【功能】返回nExp1四舍五入的值, nExp2表示保留的小数位数。
12.π函数PI( )
【格式】PI( )
【功能】返回常量π的近似值
13.正弦函数SIN( )
【格式】SIN()
【功能】返回nExp的正弦值。nExp以弧度为单位,函数值域为[-1,1]。
14.余弦函数COS( )
【格式】COS()
【功能】返回nExp的余弦值。nExp以弧度为单位,函数的值域为[-1,1]。
15.正切函数TAN( )
【格式】TAN()
【功能】返回nExp的正切值。nExp以弧度为单位,其值为π/2或- π/2时,系统返回一个绝对值很大的数。
16.反正弦函数ASIN( )
【格式】ASIN()
【功能】返回nExp的反正弦值。自变量值必须在[-1,1]内,函数值为弧度,且值域为[-π/2, π/2]。
17.反余弦函数ACOS( )
【格式】ACOS()
【功能】返回nExp的反余弦值。自变量的值必须在[-1,1]内,函数值为弧度,值域为[-π/2, π/2]。
18.反正切函数ATAN( )
【格式】ATAN()
【功能】返回nExp的反正切值。函数值为弧度,值域为(-π/2, π/2)。
2.3.2 字符函数
字符函数是处理字符型数据的函数,其自变量或函数值中至少有一个是字符型数据。函数中涉及的字符型数据项,均以cExp表示。
1.子串位置函数
【格式】AT(,< cExp 2>)
【功能】返回串cExp1在串cExp2中的起始位置。函数值为整数。如果串cExp2不包含串cExp1,函数返回值为零。
2.取左子串函数LEFT( )
【格式】LEFT()
【功能】返回从cExp串中第一个字符开始,截取nExp个字符的子串。
3.取右子串函数RIGHT( )
【格式】RIGHT(,< nExp>)
【功能】返回从cExp串中右边第一个字符开始,截取nExp个字符的子串。有关说明同LEFT( )函数。
4.取子串函数SUBSTR( )
【格式】SUBSTR ( [,< nExp2>] )
【功能】返回从串cExp中第nExp1个字符开始,截取nExp2个字符的子串。
5.字符串长度函数LEN( )
【格式】LEN()
【功能】返回cExp串的字符数(长度)。函数值为N型。
6.删除字符串前导空格函数LTRIM( )
【格式】LTRIM()
【功能】删除cExp串的前导空格字符。
7.删除字符串尾部空格函数RTRIM( ) | TRIM( )
【格式】RTRIM | TRIM()
【功能】删除cExp串尾部空格字符。
8.空格函数SPACE( )
【格式】SPACE ()
【功能】返回一个包含nExp个空格的字符串。
9.字符串替换函数STUFF( )
【格式】STUFF()
【功能】从nExp1指定位置开始,用cExp2串替换 cExp1串中nExp2个字符。
10.字符复制函数 REPLICATE( )
【格式】REPLICATE ()
【功能】返回将cExp串重复nExp次的字符串。
11.定义输出格式函数 TRANSFORM( )
【格式】TRANSFORM ()
【功能】按格式描述式cExp指定的格式,输出任意表达式eExp的值。
12.大小写转换函数LOWER( ) 和UPPER( )
【格式】LOWER ()
UPPER ()
【功能】LOWER( )将cExp串中字母全部变成小写字母,UPPER( )将cExp串中字母全部变成大写字母,其它字符不变。
13.宏替换函数 &
【格式】& < cVar >[.< cExp >]
【功能】替换出字符型变量cVar中字符。
2.3.3 日期时间函数
日期时间函数是处理日期型或日期时间型数据的函数。其自变量为日期型表达式dExp或日期时间型表达式tExp。
1.系统日期函数DATE( )
【格式】DATE()
【功能】返回当前系统日期,此日期由Windows系统设置。函数值为D型。
2.系统时间函数TIME( )
【格式】TIME([])
【功能】返回当前系统时间,时间显示格式为hh:mm:ss。若选择了nExp ,则不管为何值,返回的系统时间还包括秒的小数部分,精确至小数点后两位。函数值为C型。
3.日期函数DAY( )
【格式】DAY()
【功能】返回dExp式中的天数。函数值为N型
4.星期函数DOW( )、CDOW( )
【格式】DOW()
CDOW()
【功能】DOW( )函数返回dExp式中星期的数值,用1~7表示星期日~星期六。函数值为N型。CDOW( ) 函数返回dExp式中星期的英文名称。函数值为C型。
5.月份函数MONTH( )、CMONTH( )
【格式】MONTH()
CMONTH()
【功能】MONTH( )函数返回dExp式中月份数。函数值为N型。CMONTH( )函数则返回月份的英文名。函数值为C型。
6.年份函数YEAR( )
【格式】YEAR()
【功能】函数返回dExp式中年份值。函数值为N型。
2.3.4 转换函数
在数据库应用的过程中,经常要将不同数据类型的数据进行相应转换,满足实际应用的需要。Visual FoxPro系统提供了若干个转换函数,较好地解决了数据类型转换的问题。
1.ASCII码函数ASC( )
【格式】ASC ()
【功能】返回cExp串首字符的ASCII码值。函数值为N型。
2.ASCII字符函数CHR( )
【格式】CHR()
【功能】返回以nExp值为ASCII码的ASCII字符。函数值为C型。
3.字符日期型转换函数CTOD( )
【格式】CTOD()
【功能】把“××/××/××”格式的cExp串转换成对应日期值。函数值为D型。
4.日期字符型转换函数DTOC( )
【格式】DTOC([, 1])
【功能】把日期dExp转换成相应的字符串。函数值为C型。
5.数值字符型转换函数STR( )
【格式】STR([,< nExp2>][,< nExp3>])
【功能】将nExp1的数值转换成字符串形式。函数值为C型。
6.字符数值型转换函数VAL( )
【格式】VAL ()
【功能】将cExp串中数字转换成对应数值,转换结果取两位小数。函数值为N型。
2.3.5 测试函数
在数据库应用的操作过程中,用户需要了解数据对象的类型、状态等属性,Visual FoxPro提供了相关的测试函数,使用户能够准确地获取操作对象的相关属性。
1.数据类型函数TYPE( )
【格式】TYPE()
【功能】返回cExp 串表示的数据对象的数据类型,返回值是一个表示数据类型的大写字母。C:字符型,D:日期型,N:数值型,L:逻辑型,M:备注型,G:通用型,U:未定义。
2.文件查找函数FILE()
【格式】FILE()
【功能】根据cExp串中指定路径查找文件,如未指定路径,则在默认目录中查找。文件存在,返回逻辑真(.T.) 值,否则为逻辑假(.F.)值。
3.条件测试函数IIF( )
【格式】IIF()
【功能】逻辑表达式lExp值为真(.T.),返回表达式eExp1的值,否则返回表达式eExp2的值。eExp1和eExp2可以是任意数据类型的表达式。
4.表结束标志测试函数EOF( )
【格式】EOF([<工作区号> | <别名>])
【功能】测试记录指针是否移到表结束处。如果记录指针指向表中尾记录之后,函数返回真(.T.),否则为假(.F.)。
5.表起始标识测试函数BOF ( )
【格式】BOF ([<工作区号> | <别名>])
【功能】测试记录指针是否移到表起始处。如果记录指针指向表中首记录前面,函数返回真(.T.),否则为假(.F.)。工作区说明见EOF()函数。
6.当前记录号函数RECNO()
【格式】RECNO([<工作区号> | <别名>])
【功能】返回指定工作区中表的当前记录的记录号。对于空表返回值为1。
7.当前记录逻辑删除标志测试函数DELETED( )
【格式】DELETED([<工作区号> | <别名>])
【功能】测试指定工作区中表的当前记录是否被逻辑删除。如果当前记有逻辑删除标记,函数返回真(.T.),否则为假(.F.)。
8.记录数函数RECCOUNT( )
【格式】RECCOUNT ([<工作区号> | <别名>])
【功能】返回指定工作区中表的记录个数。如果工作区中没有打开表则返回0。
9.记录大小测试函数RECSIZE( )
【格式】RECSIZE( [<工作区号> | <别名>] )
【功能】返回指定工作区中表的记录总长度。如果工作区中没有打开表则返回0。
10.屏幕列坐标和行坐标函数 COL( )、ROW( )
【格式】COL ( )
ROW()
【功能】COL ( )返回光标的列坐标值,ROW ( )返回光标的行坐标值。
11.打印机列坐标和行坐标函数PCOL( ),PROW( )
【格式】PCOL( )
PROW()
【功能】返回打印机打印头所处位置的列坐标和行坐标。
2.4 Visual FoxPro的表达式
在Visual FoxPro系统中,表达式是由常量、变量、函数及其他数据容器单独或与运算符组成的有意义的运算式子。
运算符是对数据对象进行加工处理的符号,根据其处理数据对象的数据类型,运算符分为算术(数值)运算符、字符运算符、日期时间运算符、逻辑运算符和关系运算符五类,相应的,表达式也分为算术表达式、字符表达式、日期时间表达式、逻辑表达式和关系表达式五类。
常量、变量和函数可以作为表达式的特例。今后涉及到表达式的描述,除特别指明,均可包含这些特殊的形式。
在一个表达式中可能包含多个由不同运算符连接起来的、具有不同数据类型的数据对象,但任何运算符两侧的数据对象必须具有相同数据类型,否则运算将会出错;由于表达式中有多种运算,不同的运算顺序可能得出不同结果,甚至出现运算错误,因此当表达式中包含多种运算时,必须按一定顺序施行相应运算,才能保证运算的合理性和结果的正确性、惟一性。用户也可以通过给表达式加圆括号的方式,改变其默认运算顺序。在Visual FoxPro系统中,各类运算的优先顺序如下:
圆括号>算术和日期运算>字符串运算>关系运算>逻辑运算
同一类运算符也有一定的运算优先顺序,这在各类表达式中分别介绍。如果多个同一级别的运算,则按在表达式中出现的先后顺序进行运算。
2.4.1 算术表达式
算术表达式又称数值表达式,其运算对象和运算结果均为数值型数据。数值运算符的功能及运算优先顺序,如表2-2所示。表中运算符按运算优先级别从高到低顺序排列。
表2-2 算术运算符
运算符
功 能
表 达 式 举 例
运算结果
优先级别
( )
圆括号
(2-5)*(3+2)
-15
最高
|
|
|
|
最低
-
取相反数
-(3-8)
5
**、^
乘幂
2**5、3^2
32、9
*、/
乘、除
2*10、25/5
20、5
%
取余数
20%5
0
+、-
加、减
36+19、29-47
55、-18
2.4.2 字符表达式
字符表达式是由字符运算符将字符型数据对象连接起来进行运算的式子。字符运算的对象是字符型数据对象,运算结果是字符常量或逻辑常量。表2-3为字符运算符 的功能。
"+"与 "-"都是字符连接运算符,都将两字符串顺序连接,但“+”是直接连接,“-”则将串1尾部所有空格移到串2尾部后再连接;“$”运算实质上是比较两个串的包含关系,因此有些书籍中将其归于关系运算,其作用是比较、判断串1 是否为串2的子串,如果串1是串2的子串,运算结果为“真”,否则为“假”。所谓子串,如果串1中所有字符均包含在串2中、且与串1中排列方式与顺序完全一致,则称串1为串2的子串。
表2-3 字符运算符
两个连接运算的优先级别相同,但高于$的比较运算。
运算符
功能
表达式举例
运算结果
+
串1+串2:两串顺序相连接
’12 ‘+’56’
’12 56’
-
串1-串2:串1尾空格移到串2尾后再顺序相连接
’12 ‘-‘56’
‘1256 ‘
$
串1$串2:串1是否为串2子串
‘1234’$ ‘a12345’
‘1234’$ ‘34512’
.T.
.F.
2.4.3 日期表达式
由日期运算符将一个日期型或日期时间型数据与一个数值型数据连接而成的运算式称为日期表达式。日期运算符分为“+”和“-”两种,其作用分别是在日期数据上增加或减少一个天数,在日期时间数据上增加或减少一个秒数。两个运算的优先级别相同。
2.4.4 关系表达式
由关系运算符连接两个同类数据对象进行关系比较的运算式称为关系表达式。关系表达式的值为逻辑值,关系表达式成立则其值为“真”,否则为“假”。
表2-4 关系运算符
运算符
功 能
表 达 式 举 例
结果
<
小于
15<4*6
.T.
>
大于
‘A’ > ‘1’
.T.
=
等于
2+4 = 3*5
.F.
<>、#、!=
不等于
5 <> -10
.T.
<=
小于或等于
'abc' <= 'AB'
.F.
>=
大于或等于
{10-10-02}>={10/01/02}
.T.
==
字符串恒同
‘abc’==’abcabc’
.F.
关系运算符的优先级别相同。关系表达式运算时,就是比较同类两数据对象的“大小”,对于不同类型的数据,其“大小”或者是值的大小,或者是先后顺序。日期或日期时间数据以日期或时间的先后顺序为序。在Visual FoxPro系统中,字符型数据的比较相对复杂,默认规则为:。
(1)单个字符
单个字符的比较是以字符ASCII码的大小,作为字符的“大小”,也就是先后顺序;
(2)字符串
两个字符串进行比较的基本原则是从左到右逐个字符进行比较,但因系统相关设置状态不同,比较的结果与预期的不完全相同。
● 相等比较:用运算符=进行两串比较时,或者到达右端串的末尾字符为止(当SET EXACT OFF时),或者当到达两串的末端为止(当SET EXACT ON时),以判断两串是否相等;
● 恒同比较:用运算符==进行两串的恒同比较时,不论SET EXACT的设置如何,只有当两串长度相同,字符相同,排列一致时才成立;
● 大小比较:用运算符<或>进行两串比较时,比较到第1个不相同字符为止,否则,长度较长的串较“大”;
● 其他比较:除上述运算符之外的其他运算符<>、<=和>=的比较,均可看作是两个运算符以逻辑“或”的关系构成的复合运算;
● SET ANSI的影响
(3)汉字
系统默认按汉字的拼音排列汉字的顺序,也就是以汉字的拼音顺序比较“大小”,因此,汉字比较实质上是以字母的顺序进行比较;但Visual FoxPro系统可以设置汉字按笔画排列顺序,因而,汉字的“大小”就决定其笔画数的多少。
用菜单设置汉字排列顺序方式的操作步骤为:单击【工具】|【选项】命令,将打开“选项”对话框中,在“数据”选项卡的“排序序列”下拉列表框中选择“Stroke”项并确定,系统将按汉字的笔画数进行汉字的排序、比较运算。
2.4.5 逻辑表达式
由逻辑运算将逻辑型数据对象连接而成的式子称为逻辑表达式。逻辑表达式的运算对象与运算结果均为逻辑型数据。表2-5为逻辑运算符的功能。逻辑运算符前后一般要加圆点“.”标记,以示区别。
表2-5 逻辑运算符
运算符
功 能
优先级别
( )
圆括号
最高
|
|
最低
.NOT.或!
逻辑非
.AND.
逻辑与
.OR.
逻辑或
对于各种逻辑运算,其运算规则可由逻辑运算真值表确定,表2-6所示就是逻辑运算真值表。
表2-6 逻辑运算真值表
A
B
A .AND.B
A .OR. B
.NOT A
.T.
.T.
.T.
.T.
.F.
.T.
.F.
.F.
.T.
.F.
.F.
.T.
.F.
.T.
.T.
.F.
.F.
.F.
.F.
.T.
在Visual FoxPro系统中,经常需要与一种特殊的“数据”空值NULL(或.NULL.)打交道。如数组变量定义而未赋值时,所有数组变量的默认值为NULL,表中字段可根据需要允许或限制其取空值。空值对于逻辑运算的影响如表2-7所示。
表2-7 NULL值对逻辑运算的影响
逻辑运算
A=.T.
A=.F.
A=.NULL
A .AND. NULL
.NULL
.F.
.NULL.
A .OR. NULL
.T.
.NULL.
.NULL.
.NOT. A
.F.
.T.
.NULL.
对于两个逻辑型数据,一般不用比较的方式来确定它们之间的关系,而是直接运用逻辑运算的方式进行处理。如对表中记录实施选择运算时,是用FOR <条件>或WHILE <条件>进行逻辑判断,其中<条件>就是一个关系表达式或逻辑表达式。对于以逻辑型字段进行逻辑判断的情况,一般不用关系表达式而直接用逻辑表达式。如“性别”是一个逻辑型字段,并约定“真”表示男性,“假”表示女性。那么判断某记录对应人员是否为男性,用FOR 性别,而不用FOR 性别=.T.,判断是否为女性,用FOR .NOT. 性别,不用FOR 性别=.F.。(共62张PPT)
第六章
程序设计基础
本 章 要 点
Visual FoxPro的工作方式
程序文件的建立与编辑
程序的基本结构
分支结构
循环结构
过程
Visual FoxPro的工作方式
Visual FoxPro系统提供有三种工作方式:即单命令方式、菜单方式及程序文件方式。
1.单命令方式
Visual FoxPro单命令方式是利用Command 窗口来实现的。用户通过Command 窗口输入命令,并执行操作。在Command 窗口中,可以输入单个的操作命令和系统命令,完成对数据库的操作管理和系统环境的设置;也可以建立命令文件及运行命令文件。
Command 窗口不仅是Visual FoxPro命令的执行窗口,也是Visual FoxPro命令文件的编辑窗口。
所谓单命令方式,即输入一条命令,完成一个操作的工作方式。
要 点
2.菜单方式
在Visual FoxPro 环境下,也可以通过系统提供的菜单选项,对数据库资源进行操作管理和对系统环境进行设置;并通过菜单建立命令文件及运行命令文件。所谓菜单方式,即通过打开不同的菜单选择并完成不同的操作。我们在以前各章所讲的内容其实都可说是菜单方式。
3.程序文件方式
程序文件(简称程序)也叫做命令文件。运用程序文件方式进行数据库管理,是通过程序文件编辑工具,将对数据库资源进行操作管理的命令和对系统环境进行设置的命令,集中在一个以(.PRG)为扩展名的命令文件中,然后再通过菜单方式或命令方式运行该命令文件。所谓命令方式,即通过程序文件中的命令完成不同的操作。
要 点
6.1.1 程序的概念
有关此Visual FoxPro程序的几点说明 :
1.注释语句
【格式1】NOTE <注释内容>
【格式2】* <注释内容>
【格式3】&& <注释内容>
【功能】增强程序文件的易读性或放弃<注释内容>中语句的执行
2.对话开关语句
【格式】SET TALK OFF|ON
【功能】关闭或打开命令执行时的对话开关
3.命令的分行
Visual FoxPro程序是命令行的序列,每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,一行写不下,也可分行书写,并在分行处加上续行符“;”,再按回车键。
6.1.2 程序文件的建立、修改与执行
1.建立或修改程序文件
可用两种方式调用系统内置的文本编辑器建立或修改程序文件 :
命令方式
MODIFY COMMAND [<盘符>] [<路径>]〈程序文件名〉

MODIFY FILE [<盘符>] [<路径>]〈程序文件名〉
菜单方式
打开“文件”菜单,选择“新建”;在“新建”窗口,选择“程序”,再选择“新建文件”
要 点
2.保存程序
程序输入、编辑完毕,单击【文件】|【保存】菜单项,或按Ctrl+W复合键,在“另存为”对话框中指定程序文件的存放位置和文件名,并单击“保存”按钮保存程序文件并退出文本编辑器。程序文件的默认扩展名是.PRG。
3.执行程序
程序文件建立后,可以用多种方式、多次执行它。下面是两种常用的方式。
(1)菜单方式
① 单击【程序】|【运行】菜单项,打开“运行”对话框;
② 从文件列表框中选择要运行的程序文件,并单击“运行”命令按钮,启动运行该程序文件
(2)命令方式
【格式】DO [<盘符>][<路径>\]<文件名>
【功能】执行指定<盘符>、<路径>下的程序文件
执行程序文件时,将依次执行文件中的命令,直到所有命令执行完毕,或者执行到以下命令:
① CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口;
③ RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口;
④ QUIT:结束程序执行并退出Visual FoxPro系统,返回操作系统
6.1.3 简单的输入输出命令
6.1.3 简单的输入输出命令
1.ACCEPT命令
【格式】ACCEPT [<提示信息>] TO <内存变量>
【功能】在程序执行过程中,将用户交互式输入的内容作为字符串赋值给指定内存变量。
该命令只接受字符型数据,输入的字符串不需要加定界符
【例6-2】编程从键盘输入某数据库的文件名,要求打开该数据库并显示其内容。程序文件名为PROG2.PRG。
MODI COMMAND PROG2
SET TALK OFF
CLEAR
ACCEPT “请输入数据库名:” TO AAA
OPEN DATABASE &AAA
ACCEPT "请输入表名" TO BBB
USE &BBB
LIST
USE
SET TALK ON
RETURN
2.INPUT命令
【格式】INPUT [<提示信息>] TO <内存变量>
【功能】在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量
可以输入字符型、数值型、逻辑型、日期型和日期时间型等类型数据,而且可以是常量、变量、函数或表达式等形式,按回车键结束输入,系统将输入的数据赋值给<内存变量>。
【例6-4】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。程序文件名为PROG4.PRG
SET TALK OFF
CLEAR
INPUT “长方形一边的长为:” TO A
INPUT “长方形另一边的长为:” TO B
S=A*B
“长方形的面积为:” , S
SET TALK ON
RETURN
3.WAIT命令
【格式】WAIT [<提示信息>][TO<内存变量>] [WINDOW [AT<行>,<列>]] [NOWAIT] [CLEAR|NOCLEAR] [TIMEOUT<数值表达式>]
【功能】显示提示信息,暂停程序执行,直到用户按任意键或单击鼠标时继续执行程序。
若选择可选项[TO <内存变量>],将输入的单个字符作为字符型数据赋给指定的<内存变量>;若用户是按Enter键或单击鼠标,<内存变量>的值为空串。
若省略所有可选项,屏幕显示“键入任意键继续……”默认提示信息
【例6-6】在STUDENT数据库的STUD表中显示任意一个系学生的情况。程序文件名为PROG6.PRG
SET TALK OFF
CLEAR
OPEN DATABASE STUDENT
USE STUD
WAIT “请输入待查学生的系号(1—3):” TO N
IF VAL(N)<1 .OR. VAL(N)>3
WAIT “输入无效,结束程序运行!” WINDOW TIMEOUT 5
RETURN
ELSE
STORE “0”+N TO AAA
LIST FOR 系别号=AAA
ENDIF
CLOSE DATABASE
SET TALK ON
RETURN
4.三条输入命令的异同
ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束;
WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键;
INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。
程序的基本结构
Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。
Visual FoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、分支、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。常见的控制结构如下:
? 1.顺序结构
顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。Visual FoxPro系统中的大多数命令都可以作为顺序结构中的语句。
? 2.分支结构?
分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。?
要 点
3.循环结构?
循环结构则能够使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。
4.过程结构?
在许多应用程序中,有一些程序段需要反复执行多次,这些程序段不在一个固定的位置上,而是分散在程序的许多位置上重复执行,可将其与嵌入它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。这样做增强了程序的可读性和模块化。我们称这种具有独立功能而且可以被其它程序调用的程序序列为过程。
要 点
分支结构形式有如下三种:
? 1.单向分支?
单向分支语句,即根据用户设置的条件表达式的值,决定某一操作是否执行。
(1)语句格式:
IF〈条件表达式〉?
〈命令行序列〉?
ENDIF
(2)语句功能:
该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列〉;否则,执行ENDIF后面的第一条命令。
分支结构
要 点
【例6-7】求一元二次方程AX2+BX+C=0的实根。程序文件名为PROG7.PRG。
SET TALK OFF
CLEAR
INPUT TO A
INPUT TO B
INPUT TO C
Z=B^2-4*A*C
IF Z>=0
X1=(-B+SQRT(Z))/(2*A)
X2=(-B-SQRT(Z))/(2*A)
X1,X2
ENDIF
SET TALK ON
RETURN
2.双向分支?
双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行。
(1)语句格式:
IF〈条件表达式〉
? 〈命令行序列1〉
? ELSE?
〈命令行序列2〉
? ENDIF?
(2)语句功能:
该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列1〉中的命令;否则,执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。
要 点
【例6-10】编写一密码校验程序(假设密码为ABC)。程序文件名为PROG10.PRG。
SET TALK OFF
CLEAR
ACCEPT “请输入您的密码:” TO AAA
IF AAA=”ABC”
CLEAR
”欢迎使用本系统!”
ELSE
”密码错误!”
WAIT
QUIT
ENDIF
SET TALK ON
3.多向分支?
多向分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行 。
(1)语句格式:
DO CASE
? CASE〈条件表达式1〉
? <命令行序列1〉
? CASE〈条件表达式2〉
? <命令行序列2〉?
… …?
CASE〈条件表达式N〉
?〈命令行序列N〉]?
[OTHERWISE?
〈命令行序列N+1〉]
ENDCASE?
要 点
【例6-12】假设收入(P)与税率(R)的关系如下表,编程求税金。程序文件名为PROG12.PRG。
0 P<800
R= 0.05 800 ≤ P<2000
0.08 2000≤P<5000
0.1 P≥5000
SET TALK OFF
CLEAR
INPUT “请输入收入:” TO P
DO CASE
CASE P<800
R=0
CASE P<2000
R=0.05
CASE P<5000
R=0.08
OTHERWISE
R=0.1
ENDCASE
TAX=P*R
”税金为:”,TAX
SET TALK ON
RETURN
(2)语句功能:
该语句根据给出的N个〈条件表达式〉的值,选择N+1个〈命令行序列〉中的一个执行。当所有CASE中〈条件表达式〉的值都是假时,如果有OTHERWISE项,则执行〈命令行序列N+1〉,再执行ENDCASE后面的第一条命令;否则,直接执行ENDCASE后面的第一条命令。?
要 点
4.使用分支语句应注意的几点?
(1)IF… … ENDIF和DO CASE… … ENDCASE 必须配对使用,DO CASE与第一个CASE〈条件表达式〉之间不应有任何命令。
(2)〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值。?
(3)〈命令行序列〉可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。
(4)DO CASE… … ENDCASE 命令,每次最多只能执行一个〈命令行序列〉。在多个CASE项的〈条件表达式〉值为真时,只执行第一个〈条件表达式〉值为真的〈命令行序列〉,然后执行ENDCASE的后面的第一条命令。
要 点
循环结构
1.DO WHILE循环语句
【格式1】DO WHILE <条件表达式>
<语句序列>
ENDDO
要 点
一个循环结构一般应具备如下的条件:
(1)循环的初始条件:一般为给循环控制变量赋初值;
(2)循环头:循环语句的起始,设置、判断循环条件;
(3)循环尾:循环语句的结尾;
(4)循环体:位于循环头和循环尾之间、循环控制重复执行的语句序列
【格式2】DO WHILE <条件表达式>
<语句序列1>
[LOOP]
<语句序列2>
[EXIT]
<语句序列3>
ENDDO
LOOP语句:强行返回到循环开始语句。
EXIT语句:强行跳出循环,接着执行ENDDO后的语句
【例6-16】编程求1+2+3+……+100之和。程序文件名为PROG16.PRG。
SET TALK OFF
CLEAR
S=0
I=1
DO WHILE I<=100
S=S+I
I=I+1
ENDDO
”1+2+3+……+100=”,S
SET TALK ON
RETURN
【例6-20】逐条显示在STUDENT数据库的STUD表中性别为“男”的所有记录。程序文件名为PROG20.PRG。
SET TALK OFF
CLEAR
OPEN DATABASE STUDENT
USE STUD
DO WHILE .NOT. EOF()
IF 性别=”男”
DISPLAY
ENDIF
SKIP
ENDDO
CLOSE DATABASE
SET TALK ON
RETURN
【例6-22】编程显示STUDENT数据库的STUD表中除“李宁”以外的所有记录。程序文件名为PROG22.PRG。
SET TALK OFF
CLEAR
OPEN DATABASE STUDENT
USE STUD
DO WHILE .NOT. EOF()
IF 姓名=”李宁”
SKIP
LOOP
ENDIF
DISPLAY
SKIP
ENDDO
CLOSE DATABASE
SET TALK ON
RETURN
2.FOR循环语句
【格式】FOR <循环变量>=<初值> TO <终值> [STEP<步长>]
<循环体>
ENDFOR|NEXT
要 点
使用FOR循环语句的有关说明:
① 省略STEP <步长>,则〈步长〉为默认值1;
②〈初值〉、〈终值〉和〈步长〉都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次。循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数;
③ 可以在循环体内改变循环变量的值,但会改变循环执行次数;
④ EXIT和LOOP命令可以出现在循环体内。执行LOOP命令时,结束本次循环,循环变量增加一个步长值,返回FOR循环头判断循环条件是否成立。执行EXIT命令时,程序跳出循环,执行循环尾后面的语句
【例6-23】从键盘输入10个数,编程找出其中的最大值和最小值。程序文件名为PROG23.PRG。
SET TALK OFF
CLEAR
INPUT “请从键盘输入一个数:” TO A
STORE A TO MAX,MIN
FOR I=2 TO 10
INPUT “请从键盘输入一个数:” TO A
IF MAXMAX=A
ENDIF
IF MIN>A
MIN=A
ENDIF
ENDFOR
“最大值为:” , MAX
“最小值为:” , MIN
SET TALK ON
RETURN
3.“指针”型循环控制语句?
“指针”型循环控制语句,即根据用户设置的表中的当前记录指针,决定循环体内语句的执行次数据。
(1)语句格式:
SCAN[〈范围〉][FOR〈条件表达式1〉
[ WHILE 〈条件表达式2〉]]?
〈命令行序列〉?
ENDSCAN?
? (2)语句功能:
该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数EOF()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式1〉或〈条件表达式2〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数EOF()的值,直到函数EOF()的值为真时结束循环。
要 点
【例6-30】输出STUDENT数据库的STUD表中所有团员的姓名和地址。程序文件名为PROG30.PRG。
SET TALK OFF
CLEAR
OPEN DATABASE STUDENT
USE STUD
SCAN FOR 是否团员
姓名,地址
ENDSCAN
CLOSE DATABASE
SET TALK ON
RETURN
4.使用循环语句时应注意的几点
(1)DO WHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必须配对使用。?
(2)〈命令行序列〉可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环。
(3)〈循环变量〉应是数值型的内存变量或数组元素。
(4)EXIT和LOOP命令嵌入在循环体内,可以改变循环次数,但是不能单独使用。EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR、ENDSCAN后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”进行判断,相当于执行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改变〈命令行序列〉中部分命令的执行次数。EXIT、LOOP可以出现在〈命令行序列〉的任意位置。?
要 点
5.多重循环
多重循环即循环的嵌套,是在一个循环结构的循环体中又包含另一个循环。我们称外层循环为外循环,被包含的循环为内循环。嵌套层数一般没有限制,但内循环的循环体必须完全包含在外循环的循环体中,不能相互交叉。正确的嵌套关系如:
DO WHILE <条件表达式1>
<语句序列11>
DO WHILE <条件表达式2>
<语句序列21>
DO WHILE <条件表达式3>
<语句序列3>
ENDDO
<语句行序列22>
ENDDO
<语句行序列12>
ENDDO
【例6-27】编程输出下三角形乘法口诀表。程序文件名为PROG27.PRG。
SET TALK OFF
CLEAR
X=1
DO WHILE X<=9
Y=1
DO WHILE Y<=X
S=X*Y
STR(Y,1)+”*”+STR(X,1)+”=”+STR(S,2)+” “
Y=Y+1
ENDDO

X=X+1
ENDDO
SET TALK ON
RETURN
6.3 过程及过程调用
Visual FoxPro与其他高级语言一样,支持结构化程序设计方法,允许将若干命令或语句组合在一起作为整体调用,这些可独立存在并可整体调用的命令语句组合称为过程 。
1.调用过程语句,即执行已有的过程。?
语句格式:
DO 〈过程名〉 WITH <参数表> ?
语句功能:执行以〈过程名〉为名的过程。
2.过程返回语句,即返回过程的调用处。
语句格式:
RETURN[TO MASTER|TO〈过程名〉]?
语句功能:将控制返回到调用程序中调用命令的下一语句。
要 点
6.3.1 外部过程
外部过程也叫子程序,和主程序一样是以程序文件(.PRG)的形式单独存储在磁盘上
【例】分别建立如下程序文件,
* MAIN.PRG
SET TALK OFF
”正在执行主程序”
DO SUB1
SET TALK ON

*SUB1.PRG
”正在执行SUB1”
RETURN

6.3.2 内部过程
内部过程:把多个过程组织在一个文件中(这个文件称之为过程文件),或者把过程放在调用它的程序文件的末尾。
Visual FoxPro为了识别过程文件或者程序文件中的不同过程,规定过程文件或者程序文件中的过程必需用PROCEDURE语句说明。其格式为:
PROCEDURE <过程名>
<命令序列>
[RETURN [<表达式>]]
过程放在程序文件中
【例】建立如下程序文件,
* MAIN.PRG
SET TALK OFF
”正在执行主程序”
DO SUB1
SET TALK ON

Procedure SUB1
”正在执行SUB1”
RETURN
过程文件的建立
过程文件的建立方法与程序文件相同。可用MODIFY COMMAND <过程文件名>命令或调用其他文字编辑软件来建立。
过程文件的结构一般为:
PROCEDURE <过程名1>
<命令序列1>
RETURN

PROCEDURE <过程名2>
<命令序列2>
RETURN

PROCEDURE <过程名N>
<命令序列N>
RETURN
1.过程文件的调用
调用某过程文件中的过程时,必须先打开该过程文件,打开过程文件命令为:
【格式】SET PROCEDURE TO <过程文件名>
任何时候系统只能打开一个过程文件,当打开一个新的过程文件时,原已打开的过程文件自动关闭。
2.过程文件的关闭
关闭过程文件可用下列命令:
【格式一】SET PROCEDURE TO
【格式二】CLOSE PROCEDURE
【例6-32】用过程文件实现对STUDENT数据库的STUD表进行查询、删除和插入操作。
主程序如下:
* PROG32 && 主程序文件名
SET TALK OFF
CLEAR
OPEN DATABASE STUDENT
SET PROCEDURE TO PROCE && 打开过程文
USE STUD
INDEX ON 姓名 TO XM
DO WHILE .T. && 显示菜单
CLEAR
@ 2,20 SAY “学籍管理系统”
@ 4,20 SAY “A:按姓名查询”
@ 6,20 SAY “B:按记录号删除”
@ 8,20 SAY “C:插入新的记录”
@ 10,20 SAY “D:退出”
CHOISE=” ”
@ 12,20 SAY ”请选择A、B、C、D:” GET CHOISE
READ
DO CASE
CASE CHOISE=”A”
DO PROCE1
CASE CHOISE=”B”
DO PROCE2
CASE CHOISE=”C”
DO PROCE3
CASE CHOISE=”D”
EXIT
ENDCASE
ENDDO
SET PROCEDURE TO && 关闭过程文件
CLOSE DATABASE
SET TALK ON
过程文件如下:
*PROCE.PRG && 过程文件名
PROCEDURE PROCE1 && 查询过程
CLEAR
ACCEPT ”请输入姓名:” TO NAME
SEEK NAME
IF FOUND()
DISPLAY
ELSE
”查无此人”
ENDIF
WAIT
RETURN
PROCEDURE PROCE2 && 删除记录过程
CLEAR
INPUT ”请输入要删除的记录号:” TO N
GO N
DELETE
WAIT ”物理删除吗Y/N:” TO FLAG
IF FLAG=”Y” .OR. ”y”
PACK
ENDIF
RETURN

PROCEDURE PROCE3 && 插入新的记录过程
CLEAR
APPEND
RETURN
6.3.3 过程调用中的参数传递
1.有参过程中的形式参数定义
有参过程中的形式参数定义语句为:
【格式】PARAMETERS <参数表>
该语句必需是过程中第一条语句。<参数表>中的参数可以是任意合法的内存变量名
2.程序与被调用过程间的参数传递
程序与被调用过程间的参数传递是通过过程调用语句DO <过程名> WITH <参数表>中WITH <参数表>子句来实现的。
【说明】
(1)DO命令<参数表>中参数称为实际参数,PARAMATERS命令<参数表>中的参数称为形式参数。两个<参数表>中的参数必须相容,即个数相同,类型和位置一一对应;
(2)实际参数可以是任意合法表达式,形式参数是过程中的局部变量,用来接收对应实际参数的值;
(3)Visual FoxPro的参数传递规则为:如果实际参数是常数或表达式则传值,如果实际参数是变量则传址,即传递的不是实参变量的值而是实参变量的地址,这样,过程中对形参变量值的改变也将使实参变量值改变。如果实参是内存变量而又希望进行值传递,可以用圆括号将该内存变量括起来,强制该变量以值方式传递数据
【例6-34】用参数传递编程,计算圆的面积。
* 主程序名PROG34
SET TALK OFF
CLEAR
S=0
INPUT ”请输入圆的半径:” TO R
DO AREA WITH R,S
”圆的面积为:”,S
SET TALK ON

PROCEDURE AREA && 计算面积的过程
PARAMETER X,Y && 形参说明
Y=3.1416*X**2
RETURN
6.3.4 过程的嵌套调用
Visual FoxPro中允许一个过程调用第二个过程,第二个过程又可调用第三个过程,……,这种调用关系称为过程的嵌套调用
6.3.5 过程的递归调用
Visual FoxPro 允许递归调用,所谓递归调用,即某一过程直接或间接调用自己。过程直接调用自己称为直接递归(见图),间接调用自己称为间接递归
【例6-36】编程用递归方法求N的阶乘。程序文件名为PROG36.PRG。
SET TALK OFF
CLEAR
INPUT ”请输入N:” TO N
Y=1
DO PROCE1 WITH N,Y
STR(N,2)+”!=”,Y
SET TALK ON

PROCEDURE PROCE1 && 求阶乘的过程
PARAMETER X,Y
IF X>1
DO PROCE1 WITH X-1,Y && 递归调用
Y=X*Y
ENDIF
RETURN
6.3.6 内存变量的作用域
1.全局变量
全局变量是指在所有程序模块中都有效的内存变量
在程序或过程中定义全局变量的语句为:
【格式】PUBLIC <内存变量表>
【说明】
(1)当定义多个变量时,各变量名之间用逗号隔开;
(2)用PUBLIC语句定义过的内存变量,在程序执行期间可以在任何层次的程序模块中使用;
(3)变量定义语句要放在使用此变量的语句之前,否则会出错;
(4)任何已经定义为全局变量的变量,可以用PUBLIC语句再定义,但不允许重新定义为局部变量;
(5)使用全局变量可以增强模块间的通信,但会降低模块间的独立性。
2.局部变量
局部变量是指在建立它的程序以及被此程序调用的程序中有效的内存变量
在程序中没有被说明为全局变量的内存变量都被看作是局部变量。局部变量也可以用PRIVATE说明,命令格式为:
【格式1】PRIVATE <内存变量表>
【格式2】PRIVATE ALL [LIKE | EXCEPT <通配符>]
【说明】
(1)用PRIVATE语句说明的内存变量,只能在本程序及其下属过程中使用,退出程序时,变量自动释放;
(2)用PRIVATE语句在过程中说明的局部变量,可以与上层调用程序出现的内存变量同名,但它们是不同的变量,在执行被调用过程期间,上层过程中的同名变量将被隐藏。
6.3.7 自定义函数
自定义函数和过程一样,可以以独立的程序文件形式单独存储在磁盘上,也可以放在过程文件或直接放在程序文件中
自定义函数具有如下语法结构:
FUNCTION <函数名>
PARAMETER <参数表>
<函数体命令序列>
RETURN <表达式>
自定义函数的调用语法与系统函数的调用相同。
【例6-39】计算圆面积
SET TALK OFF
CLEAR
INPUT ”请输入圆的半径:” TO R
”圆的面积为:”,AREA(R)
SET TALK ON

FUNCTION AREA && 计算面积的函数
PARAMETER X && 形参说明
RETURN (3.1416*X**2)(共130张PPT)
第三章
数据库的基本操作
本 章 要 点
建立数据库与表
表字段的基本操作
表记录的基本操作
排序与索引
查询
数据统计与计算
多表的操作
建立数据库与表
数据库是表的集合。从Visual FoxPro 3.0开始引入了真正意义上的数据库概念。把一个二维表定义为表,把若干个关系比较固定的表集中起来放在一个数据库中管理,在表间建立关系,设置属性和数据有效性规则使相关联的表协同工作。数据库文件具有.dbc扩展名,其中可以包含一个或多个表、关系、视图和存储过程等。
一个Visual FoxPro表或.dbf文件,能够存在以下两种状态之一:与数据库相关联的数据库表,与数据库不关联的自由表。二者的绝大多数操作相同且可以相互转换。相比之下,数据库表的优点要多一些。当一个表是数据库的一部分时,它就可以具有以下内容:
● 长表名和表中的长字段名
● 表中字段的标题和注释
● 默认值、输入掩码和表中字段格式化
● 表字段的默认控件类
要 点
● 字段级规则和记录级规则
● 支持参照完整性的主关键字索引和表间关系
● INSERT、UPDATE或DELETE事件的触发器
3.1.1 建立数据库
1.命令方式
【格式】CREATE DATABASE [<数据库文件名>|?]
【功能】建立一个新的扩展名为.DBC的数据库文件并打开此数据库。
【说明】<数据库文件名>指定生成的数据库文件,若省略扩展名,则默认为.DBC,同时也自动建立相关联的数据库备注文件扩展名为.DCT,关联的索引文件扩展名为.DCX。如果未指定数据库文件名或用“?”代替数据库名,Visual FoxPro系统会弹出创建对话框,以
建立数据库
便用户选择数据库建立的路径和输入数据库名。保存后该数据库文件被建立,并且自动以独占方式打开该数据库。
2.菜单方式
用菜单方式建立数据库的具体步骤如下:
(1)选择【文件】∣【新建】出现新建对话框。
(2)选择“数据库”单选按钮,再单击“新建文件”按钮,出现“创建”对话框。
(3)在“创建”对话框中输入文件名。选择“保存”按钮,系统自动打开数据库文件,并且将数据库设计器也自动打开。
3.利用项目管理器建立数据库
打开已建立的项目文件,出现项目管理器窗口,选择。
“数据”标签的“数据库”,然后单击“新建”按钮。出现新建数据库对话框,单击“新建数据库”按钮,出现“新建”对话框,选择数据库的路径并输入数据库名后单击“保存”按钮,完成数据库的建立,并打开该数据库设计器
3.1.2 删除数据库
1.命令方式
【格式】DELETE DATABASE <数据库文件名 |?>
【功能】从磁盘上删除一个扩展名为.DBC的数据库文件。
删除数据库
【说明】被删除的数据库不能处于打开状态。被删除的数据库中的表成为自由表。
数据库文件名可以包括数据库的路径和数据库名字。如果用“?”代替数据库文件名,将显示打开对话框,用户可从打开对话框中选择要从磁盘上删除的数据库的名字。
2.使用项目管理器
打开已建立的项目文件,出现项目管理器窗口,单击“数据”标签,选择要删除的“数据库”,然后单击“移去”按钮。出现图3-4选择对话框,若选择“移去”仅将数据库从项目中移去,若选择“删除”将从磁盘上删除数据库。被删除的数据库中的表成为自由表。
3.1.3 打开数据库
1.命令方式
【格式】OPEN DATABASE [<数据库文件名> | ] [EXCLUSIVE|SHARED]
【功能】将磁盘上一个扩展名为.DBC的指定数据库文件打开。
【说明】打开一个数据库文件,同名的.DCT相关的数据库备份文件与.DCX相关的索引文件也一起被打开。
数据库打开后,在常用工具栏中可以看见当前正在使用的数据库名,同时当数据库设计器为当前窗口时,系统菜单上出现【数据库】菜单项。
<数据库文件名>:指定要打开的数据库名。如果用户省略<数据库文件名>或用“?”代替数据库名。系统会显示打开对话框。
打开数据库
注意:在数据库被打开的情况下,它所包含的所有表可以使用。但是,表并没有被真正打开,用户要打开它,仍要用USE命令。
2.菜单方式
①(1)选择【文件】|【打开】,出现打开对话框。
②(2)选择数据库文件所在的文件夹,将文件类型选择为“数据库(.dbc)”。
(3)选择所要打开的数据库文件名,单击“确定”按钮。
3.利用项目管理器打开数据库
打开已建立的项目文件,出现项目管理器窗口,选择“数据”标签,选择要打开的数据库名,然后单击“打开”按钮。
3.1.4 数据库的关闭
数据库文件操作完成后,或暂时不用时,必须将其关闭,保存在外部存贮器中以确保数据的安全性。关闭数据库文件有以下几种方式:
1.命令方式
【格式】CLOSE [ALL|DATABASE ]
【功能】关闭当前打开的数据库。
【说明】ALL用于关闭所有对象。如数据库、表、索引、项目管理器等。
DATABASE关闭当前数据库和数据库表;如果当前没有打开的数据库,则关闭所有打开的自由表、所有工作区内所有索引和格式文件。
数据库的关闭
2.利用项目管理器关闭数据库
打开已建立的项目文件,出现项目管理器窗口,选择“数据”标签,选择“数据库”下面需要关闭的数据库名,然后单击“关闭”按钮。在常用工具栏上的当前数据库下拉列表框中该数据库名消失,同时在项目管理器中“关闭”按钮变成“打开”按钮。
3.1.5 建立表结构
前面我们已经知道表有二种,一种是数据库表,另一种是自由表。如果建表时数据库是打开的,则建立的表为当前数据库表,否则,建立自由表。
无论建立那种表,其方法都相同。一个表由表结构和表记录两部分组成。表结构描述了数据存放形式以及存贮的顺序,确定了表的字段,就完成了对表结构的定义;表记录是表所要保存的数据主体,数据由记录组成,字段是构成记录的基本单元。
建立表结构
建立一个表文件首先第一步就是建立表结构,然后再输入表记录。
建立表结构的方法有很多,在这里主要讲述三种方法:命令方式、菜单方式和使用项目管理器的方式。
1.命令方式
【格式】CREATE [<表文件名> | ]
【功能】建立一个新的、扩展名为.DBF的表文件。
【说明】<表文件名>指定生成的表文件名,若缺省扩展名,则默认为.DBF。
如果使用“?”或末指定表文件名,Visual FoxPro系统会弹出创建对话框,以便用户输入表名。
现在用命令方式来建立本章所用的stud.dbf表。表内容如下:



学号
姓名
性别
班级名
系别代号
地址
出生日期
是否团员
照片
备注
011110
李建国

计0121
01
湖北武汉
09/28/84
T


011103
李宁

电0134
02
江西九江
05/06/85
F


011202
赵娜

英0112
03
广西南宁
02/21/84
F


021204
孙亮

电0134
02
湖南长沙
09/08/86
T


011111
赵琳

计0121
01
江苏南京
11/18/85
T


021405
罗宇波

英0112
03
江苏南通
12/12/85
F


用命令方式建立表的具体步骤为:
(1)如果没有打开STUDENT数据库,先打开它。如果创建自由表,该步可略去。
(2)在命令窗口中输入CREATE STUD回车,系统打开“表设计器”对话框,如图3-5所示。
(3)在“字段名”文本框中输入第一个字段名:“学号”,在“类型”下拉列表框中,选择字段的类型为字符型,在宽度输入框中输入10或单击右边的微调按钮至10。
(4)将输入光标定位在第二个字段的字段名上,用同样的方法依次输入各个字段的字段名、类型、宽度和小数位数。
(5)将所有字段的参数确定好之后,单击“确定”或按快捷键CTRL+W存盘。系统会 打开提示窗口,询问用户是否立即输入记录,选择“是”立即开始输入记录,选择“否”不输入记录,光标返回命令窗口,只建立表结构。
表设计器对话框中包含“字段”、“索引”、“表”三个选项卡。
1)“字段”选项卡:适用于建立表结构,确定表中每个字段的字段名、字段类型、字段宽度和小数位数等。
● 字段名:是某字段的名字。在表中必须为唯一的,字段名必须以汉字、字母和下划线开头,由汉字、字母、数字和下划线组成,对于数据库表支持长字段名,字段名最多为128个字符,自由表不支持长字段名,字段名最多为10个字符。当数据库表转化为自由表时截去超长部分的字符。字段名不能使用系统的保留字。
● 字段类型:表示该字段中存放数据的类型。一个字段即二维表中的一列,其中的数据应具有共同的属性。若存放的是一些符号,不进行数值运算,则定义为字符型;若需要进行数值运算,则根据数值表示的实际意义,选择数值型、货币型、浮点型、双精度型、整型中的一种。对描述日期的字段,可根据需要定义为日期型或日期时间型。对取值只有两种情况,为“真”或为“假”的数据定义为逻辑型。若
存储的字符超过254,为节省存储空间可定义为备注型。若要保存图片或OLE对象,可定义为通用型。备注型和通用型字段的信息都没有直接存放在表文件中,而是存放在一个与表文件同名的.FPT文件中。
● 字段宽度:表示该字段所允许存放数据的最大宽度。由数据的最大宽度决定。过大浪费存储空间,过小数据溢出。字符型字段的最大宽度254个字符,数值型字段和浮点型字段的宽度为20位,逻辑型字段的宽度固定为1,日期型字段的宽度固定为8,通用型字段和备注型字段的宽度固定为4。
● 小数位数:只对数值型字段和浮点型字符等数值类型有效,允许最大宽度20。在计算数值型字段和浮点型字段的宽度时,小数点本身也算作一个字符。数值型字段的小数位数由数据的精度决定位数。
● 字段宽度:表示该字段所允许存放数据的最大宽度。由数据的最大宽度决定。过大浪费存储空间,过小数据溢出。字符型字段的最大宽度254个字符,数值型字段和浮点型字段的宽度为20位,逻辑型字段的宽度固定为1,日期型字段的宽度固定为8,通用型字段和备注型字段的宽度固定为4。
● 小数位数:只对数值型字段和浮点型字符等数值类型有效,允许最大宽度20。在计算数值型字段和浮点型字段的宽度时,小数点本身也算作一个字符。数值型字段的小数位数由数据的精度决定位数。
若建立的是数据库表,则下面还有显示、字段有效性等框。
① 字段的显示属性
● 格式:控制字段在浏览窗口、表单、报表等显示时的样式。格式字符及功能如表3-2所示。
字符
功 能
字符
功 能
A
字母字符,不允许空格和标点符号
R
显示文本框的格式掩码,但不保存到字段中
D
使用当前的SET DATA格式
T
删除前导空格和结尾空格
E
英国日期格式
!
字母字符转换成大写
K
光标移至该字段选择所有内容
^
用科学计数法表示数值数据
L
数值字段显示前导0
$
显示货币符号
● 输入掩码:控制输入该字段的数据的格式。掩码字符及功能如表3-3所示。
字符
功 能
字符
功 能
A
字母字符,不允许空格和标点符号
R
显示文本框的格式掩码,但不保存到字段中
D
使用当前的SET DATA格式
T
删除前导空格和结尾空格
E
英国日期格式
!
字母字符转换成大写
K
光标移至该字段选择所有内容
^
用科学计数法表示数值数据
L
数值字段显示前导0
$
显示货币符号
表3-3 字段的显示掩码字符
● 标题:若表结构中字段名用的是英文,则可以在标题中输入汉字,这样显示该字段值时就比较直观了。没有设置标题,则将表结构中的字段名作为字段的标题。
字符
功 能
字符
功 能
X
任意字符
*
左侧显示*
9
数字字符和+-号
.
指定小数点位置
#
数字字符、+-号和空格
,
用逗号分隔整数部分
$
指定位置显示货币符号
$$
货币符号与数字不分开显示
② 字段有效性
● 规则:限制该字段的数据的有效范围。在规则中输入:性别="男".OR.性别="女"。这样当给“性别”字段输入记录值时就只能输入“男”或“女”。
● 信息:当向设置了规则的字段输入不符合规则的数据时,就会将所设置的信息显示出。
● 默认值:当往表中添加记录时,系统向该字段预置的值。在“性别”字段中输入默认值为“男”。输入记录时只有女生才需要改变默认值,可以减少输入。字段有效性的设置如图3-6所示。
2)表选项卡:字段选项卡上主要介绍的是字段属性,它控制了字段值的输入,表选项卡则对表的记录属性进行描述,控制记录数据。
在这里主要介绍记录有效性和触发器。
① 记录有效性
● 规则:指定记录的有效条件,满足该条件,数据才能输入到表中,它确定的是该记录各字段值之间的总体数据关系是否有错。
● 信息:当记录的数据不符合规则时,由系统显示给用户的提示信息。
② 触发器
当对记录进行操作时,若设置了触发器,则对触发器设置的条件表达式进行验证,若其值为真.T.,则允许进行相关操作,否则,则拒绝操作。
● 插入触发器:当向表中插入或追加记录时,判断其表达式的值,为“真”允许插入或追加,为“假”不允许插入或追加。
● 更新触发器:当要修改记录时,判断其表达式的值,为“真”允许修改,为“假”不允许修改。
● 删除触发器:当要删除表中记录时,判断其表达式的值,为“真”允许删除,为“假”不允许删除。
以上三类触发器也可以用相应的命令实现:
CREATE TRIGGER ON 表名FOR INSERT AS触发条件表达式
CREATE TRIGGER ON 表名FOR UPDATE AS触发条件表达式
CREATE TRIGGER ON 表名FOR DELETE AS触发条件表达式
2.菜单方式
选择【文件】|【新建】打开新建对话框,选择“表”,单击“新建文件”出现创建对话框,确定需要建立表的路径和表名,按“保存”按钮后,出现图3-5所示“表设计器”对话框。以下步骤同命令方式。
3.用项目管理器新建表
打开已建立的项目文件,出现项目管理器窗口,选择“数据”选项卡中的“数据库”下的表,然后单击“新建”按钮。出现新建表对话框,选择“新建表”出现创建对话框,确定需要建立表的路径和表名,按“保存”按钮后,出现图3-5所示的“表设计器”对话框。以下步骤同命令方式。
3.1.6 输入表记录
如果在刚建好表结构时,在系统提示是否立即输入记录的对话框中选择“是”可直接进入输入记录窗口。如果选择了“否”,再想输入表记录就要以追加方式输入记录。
输入表记录的方法又分为命令方式和菜单方式两种方法。
1.命令方式
【格式】APPEND [BLANK]
【功能】在当前已打开表的末尾追加一条或多条记录。
输入表记录
【说明】BLANK:表示在表末尾追加一条空记录,并自动返回命令窗口,此时系统并不弹出编辑窗口。
例如:在命令窗口输入命令
USE STUD &&打开表
APPE &&或EDIT
注意:输入逻辑值时只输入T或F,定界符系统自动生成
输入日期值时只输入数码,分隔符系统自动生成
输入备注值时,光标位于MEMO上时,按CTRL+PgDn进入编辑窗口,完成后按CTRL+W返回下一个字段继续输入。
2.菜单方式
(1)首先打开表STUD.DBF。
(2)选择【显示】|【浏览】命令。
(3)选择【表】|【追加新记录】命令,用户可以输入追加记录的各个字段。
3.1.7 表的打开与关闭
1.表的打开
表文件建好后,以文件的形式保存在磁盘上,在进行各种操作之前,首先必须打开表。打开表的过程实质上就是将表从磁盘调入内存,这样就可以对表中的数据进行各种操作。系统在任何时刻都只能对内存中的表进行访问。
(1)命令方式
【格式】USE [[<盘符>][<路径>]<[数据库名!]表文件名 | >
【功能】打开指定磁盘的指定路径下的表和相关的索引文件。
【说明】<盘符>和<路径>:指定表文件所在的驱动器及路径,若省略盘符和路径参数,则打开当前盘、当前路径下的表文件。
表的打开与关闭
[数据库名!]表文件名:指定打开指定数据库中的表文件。若末指定数据库名,则在当前数据库中查找,没有则在自由表中查找。两者同名,则打开数据库中的表。
如果表文件中含有通用型、备注型字段,同名的.FPT文件也同时打开。
若不指定表文件名而使用“ ”,系统会弹出“使用”对话框,以便用户指定打开表的文件名。
【例3-1】打开在E盘VFP子目录中STUD.DBF表。
USE E:\VFP\STUD
(2)用项目管理器打开表
在项目管理器中选中需要打开的表,选择“浏览”或“修改”都能直接打开表且进行浏览或修改,关闭浏览或修改窗口后,该表仍处于打开状态。
2.表的关闭
表文件操作完成后,或暂时不用时,必须将其关闭,保存到外存中以确保数据的安全性。关闭表就是将表文件从内存中调出,保存在磁盘上。关闭表文件有以下几种方式:
(1)打开另一个表文件
如果工作区中已打开有表文件,打开另一表文件时,系统将自动将先前打开的表文件关闭。
(2)使用不带任何选项的USE命令
【格式】USE
【功能】关闭当前已打开的表文件。
(3)使用CLEAR命令
【格式】CLEAR ALL
【功能】关闭所有工作区中已打开的表文件、索引文件、格式文件及备注文件等,同时释放所有的内存变量。并选择工作区1为当前工作区。
(4)使用CLOSE命令
【格式1】CLOSE ALL
【功能】关闭各种类型文件,并选择工作区1为当前工作区。
【格式2】CLOSE DATABASES
【功能】关闭所有已打开的数据库文件、表文件、索引文件、格式文件及备注文件等,并选择工作区1为当前工作区。
(5)退出Visual FoxPro系统
QUIT
【功能】退出Visual FoxPro系统,并关闭所有打开的文件,返回操作系统。
(6)在数据工作窗口中关闭
在数据工作窗口中选择要关闭的表文件,然后选择“关闭”按钮,系统将关闭所选择的表文件。
3.1.8 表的删除
1.删除自由表
【格式】DELETE FILE [表文件名|?]
【功能】将指定的表文件从磁盘上删除。
【说明】如果删除的表文件存在有与之相关的.fpt备注文件和(.cdx或.idx)索引文件,则同时删除这些文件。
删除一个表文件,应保证该表文件是处于关闭状态的。
要删除的表文件如果不是在默认的路径下,则文件名应指明路径。
表文件名不能包含通配符
表的删除
若不指定文件名或使用“ ”,系统会弹出“删除”对话框,选择要删除的表文件路径、文件类型及文件名后,单击“删除”按钮。
2.删除数据库表
先将数据库表从数据库中移去,然后再用删除自由表的方法进行删除。
移去数据库表的命令是:
【格式】REMOVE TABLE [表文件名|?][DELETE][RECYCLE]
【功能】从当前数据库中移去一个表。
【说明】表文件名:准备从数据库中移去的表文件名。
选择?将出现移去对话框,从中选择一个要从当前数据库中移去的表。
选择DELETE在移去数据库表的同时,从磁盘上删除。
选择RECYCLE在移去数据库表的同时,不会立即从磁盘上删除,而是放入回收站中。
3.在项目管理器中删除表
在项目管理器中选中需要删除的表,选择“移去”按钮或选择主菜单中【项目】|【移去文件】命令,出现一个选择对话框,若选择“移去”按钮,则将表文件移出项目文件,若选择“删除”按钮,则将表文件从磁盘上删除。
3.2.1 表结构的显示
在表的使用过程,要经常查看表的结构和记录,以随时了解表的变化情况。
【格式】LIST | DISPLAY STRUCTURE [TO PRINT [PROMPT] | TO [FILE] [<文件名>]]
【功能】显示或打印当前表文件的结构。
表字段的基本操作
在执行以上命令时,如果系统中没有已打开的表文件,系统提示输入文件名。用LIST命令,所有信息连续显示,信息较多时,屏幕停止在最后一屏;用DISPLAY命令,如果信息较多则分屏显示,敲任意键继续显示下一屏。
【例3-2】显示表STUD.DBF的结构。
USE STUD
LIST STRUCTURE
需要指出的是,最后一行显示出的记录字节数是所有字段宽度之和再加1。这额外的一个字节是用来存放记录的删除标记(*)的。
3.2.2 表结构的修改
表结构的改变有时会引起表记录的变化,所以在一般情况下不轻易进行修改。但在确实需要时也可以进行修改。无论进行何种修改,使用的命令都是一个。
表结构的修改
1.命令方式
【格式】MODIFY STRUCTURE
【功能】将当前已打开的表文件的表设计器打开进行修改。
【说明】要修改表结构必须要先打开需要修改结构的表文件。如果当前工作区中没有已打开的数据库,执行此命令时系统会弹出“打开”对话框,以便用户选择需要修改表结构的文件名及路径等信息,用户选择完成后,系统将弹出表设计器对话框。
主要有增加、修改、删除和移动几种操作。
(1)增加字段:将光标移至需插入位置上的字段上,选择“插入”按钮或按快捷键ALT+I,在该位置上出现一个新字段,原位置以下的各字段均下移一行。确定增加字段的字段名、字段类型、字段宽度等参数,选择“确定”按钮即可。
(2)修改字段:将光标定位在需要修改处,编辑修改,完成后选择“确定”按钮即可。
(3)删除字段:将光标移至需删除的字段上,选择“删除”按钮或按快捷键ALT+D,在该位置上的字段被删除,原位置以下各字段均上移一行。选择“确定”按钮即可。
(4)移动字段:将光标移至需移动位置的字段上,用鼠标拖动字段名前的“”按钮,出现一个虚框,当虚框出现在目标位置上时松开鼠标,移动完成,选择“确定”按钮即可。
无论是何种修改,选择“确定”按钮后,由于表结构的变化要影响表记录数据,所以都要出现对话框由用户确认修改是否有效。
使用MODIFY STRUCTURE命令要注意以下几点:
① 在MODIFY STRUCTURE命令的执行期间,如果强行退出,有可能丢失数据。
② 不能同时修改字段名和它的类型,否则系统将不能正确地送回原来的数据而造成数据的丢失。
③ 如果在修改字段名的同时插入或删除了字段,会引起字段位置发生变化,有可能造成数据丢失。但是,在插入或删除字段的同时却可以修改字段的宽度或字段的类型,MODIFY STRUCTURE将根据字段名正确地从备份文件中传送数据。
④ 如果修改表结构完成后出现了数据丢失现象,或者对其不满意,可利用备份文件将表恢复到修改前的状态,方法是先将新的表文件删除掉,再将备份文件的扩展名.BAK改为表文件扩展名.DBF,将备注备份文件扩展名.TBK改为备注文件的扩展名.FPT。
2.利用数据库设计器
在数据库设计器中选中需要修改的表文件,再选择主菜单中【数据库】|【修改】命令,具体的修改方法同命令方式。
3.利用项目管理器
在项目管理器中选中需要修改的表文件,再选择主菜单中【项目】|【修改】命令或单击项目管理器中的“修改”按钮。
3.3.1 表记录的显示
1.命令方式
【格式】LIST | DISPLAY [FIELDS <字段名表>][<范围>] [FOR<条件表达式>] [WHILE <条件表达式>][OFF][NOCONSOLE] [TO PRINTER [PROMPT] | TO FILE<文件名>]
【功能】将当前表文件的记录按照指定的选项进行显示。
表记录的基本操作
【说明】DISPLAY命令与LIST命令的功能相似,当表文件的数据记录较多时,用DISPLAY命令较为方便。
还有一点不同之处就是,如果同时缺省<范围>和 <条件>子句,DISPLAY命令只显示当前的一条记录,而LIST命令则是取默认值ALL而显示全部记录。
FIELDS <字段名表>:用来指定显示的字段。
<范围>:用来指定显示哪些记录。
“范围”有以下四种表示方法:
● ALL:所有记录。
● NEXT N:从当前记录开始,后面的N条记录(包括当前记录)
● RECORD N:第N条记录。
● REST:当前记录后的全部记录(包括当前记录)。
FOR<条件表达式>:指定对表文件中指定范围内满足条件的记录进行操作。
WHILE<条件表达式>:也是指定对表文件中指定范围内满足条件的记录进行操作,但是,当第一次遇到不满足条件的记录时,停止继续往后搜索。
WHILE<条件表达式>若与FOR<条件表达式>同时使用,则WHILE项优先;若两者都不选用,则显示<范围>中指定的全部记录。
OFF:表示不显示记录号;若不选此项,则在各记录前显示记录号。
【例3-3】显示表STUD.DBF的全部记录。
USE STUD
LIST
【例3-4】显示男生的记录。
USE STUD
DISPLAY FOR 性别=’男’ FIELDS 学号,姓名,性别,班级名,系别代号
【例3-5】显示表中所有记录的学号、姓名和性别。
USE STUD
LIST FIELDS 学号, 姓名, 性别
【例3-6】显示表中1985年出生的同学的学号、姓名、性别及出生日期。
USE STUD
LIST FIELDS 学号,姓名,性别,出生日期 FOR YEAR(出生日期)=1985
2.菜单方式
(1)打开表。
(2)选择【显示】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。这时还可以选择【显示】|【浏览】或【编辑】来改变显示方式。
3.利用项目管理器
在项目管理器中,选择需要显示的表文件,单击“浏览”按钮或选择主菜单中【项目】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。
3.3.2 记录指针的定位
记录号用于标识数据记录在表文件中的物理顺序。
记录指针是一个指示器,它始终指向当前表中正在操作处理的那条记录,此记录被称为当前记录。如果要对某条记录进行处理,必须移动记录指针,使其指向该记录。在任意时刻指针只能指向唯一的一条记录。
记录指针的定位
记录指针定位有绝对定位、相对定位和查询定位三种。在这里暂时只讲前二种,查询定位在讲到查询时再详细介绍。
4.绝对定位
【格式】[GO | GOTO] <[RECORD] <数值表达式1> [IN <数值表达式2> | IN <字符表达式>]
【功能】将记录指针绝对定位到<数值表达式1>指定的记录上。
<数值表达式1>:记录的物理记录号。
IN <数值表达式2> | IN <字符表达式>:指定操作表所在的工作区;若缺省,则对当前工作区表操作。工作区的概念在后面再详细介绍。
绝对定位与是否打开索引文件没有关系。
2.相对定位
【格式1】SKIP [<数值表达式1>] [IN <数值表达式2> | <字符表达式>]
【功能】记录指针从当前记录向前(或向后)移动若干个记录。
【说明】<数值表达式1>:表示移动的记录个数。若数值表达式的值为负值,表示向前移动记录;否则,表示向后移动记录。如果缺省此项,则表示向后移动1个记录。
如果记录指针已经移过文件的最后一个记录,则RECNO() 函数返回的值等于文件中的记录总数加 1,EOF()函数返回逻辑真(.T.)值。
【格式2】GO|GOTO <|TOP | BOTTOM>
【功能】将记录指针移动到表文件的首记录或尾记录
TOP:将记录指针移动到表文件的首记录。
BOTTOM:将记录指针动到表文件的最后一条记录。
相对定位与是否打开索引文件有关。如果打开有索引,记录指针按索引文件中顺序移动。否则按表文件中物理顺序移动。
【例3-8】绝对定位命令的用法。
USE STUD
GOTO 2
GO 3
【例3-9】相对定位的用法。
USE STUD
SKIP 4 && 系统主窗口显示为5
SKIP –3 && 系统主窗口显示为2
SKIP 8 && 超出了记录总数6
go top && 系统主窗口显示为1
3.3.3 删除记录
表记录的删除也是表维护的一项经常性的工作,因为删除意味着数据的消失,所以对记录的删除操作比较慎重,删除可分为逻辑删除和物理删除两种操作。逻辑删除还可以恢复,而物理删除则不可恢复。
1.逻辑删除记录
逻辑删除就是给指定的记录作删除标记“*”。
(1)命令方式
【格式】DELETE [<范围>] [FOR <条件>] [WHILE <条件>]
【功能】对当前表中指定范围内满足条件的记录作删除标记“*”。
【说明】DELETE命令仅仅是在要删除的记录前加上一个删除标记“*”,并不是真正地从表文件中将该记录删除掉。可以用LIST或DISP命令显示带删除标记的记录。
删除记录
<范围>,FOR<条件>、WHILE<条件>等各项选项意义同前;如果同时缺省<范围>和 <条件>子句,则仅仅删除当前的记录。
【例3-10】删除STUD.DBF中所有男同学的记录。
USE STUD
DELETE FOR 性别="男"
LIST FIELDS 学号,姓名,性别,班级名,系别代号,地址,出生日期,是否团员
(2)菜单方式
利用菜单方式逻辑删除记录的具体操作步骤如下:
① 首先打开表文件
② 选择【显示】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。主菜单上增加【表】菜单项。
③ 选择【表】|【删除记录】命令,出现图3-11所示的“删除”对话框。
④ 单击删除对话框中的For…按钮或While…按钮,系统弹出表达式生成器,用户可以在表达式框中输入一个逻辑表达式,如性别=”男”,单击【确定】按钮完成条件表达式的输入。
⑤ 在“作用范围”下拉列表框中选择范围,如ALL。
⑥ 单击“删除”对话框中的“删除”按钮,系统将完成对指定范例内满足指定条件的记录的逻辑删除。
2.隐藏逻辑删除记录
【格式】SET DELETED ON | OFF
【功能】将表文件中已逻辑删除的记录隐藏,仿佛真正删除一样。
【说明】表文件中被逻辑删除的记录只是在该记录上加一个删除标记,当SET DELETED设置为OFF时,对该表文件的各种操作,对被删除的记录同样有效。当SET DELETED ON时,可使对表文件中数据的各种操作,一般均不包括有删除标记的记录,但下列情况例外:命令的记录范围是当前记录或RECORD(n)时;INDEX或REINDEX命令不受SET DELETED的影响,始终处理带删除标记的记录。
SET DELETED的缺省状态是OFF。
【例3-12】隐藏上题中STUD.DBF的标记删除记录。
USE STUD
SET DELETED ON
3.恢复逻辑删除记录
恢复逻辑删除是将被逻辑删除的记录恢复为正常记录。即去掉“*”号。
(1)命令方式
【格式】RECALL [<范围>] [FOR <条件>] [WHILE <条件>][NOOPTIMIZE]
【功能】将当前表文件中指定范围内满足条件的已作删除标记“*”的记录恢复,即去掉这些删除记录的删除标记,使之成为正常记录。
【说明】RECALL命令与DELETE命令相对应,它可以去掉被逻辑删除记录的删除标记“*”。
<范围>,FOR<条件>、WHILE<条件>等各项选项意义同前;如果同时缺省<范围>和 <条件>子句,则仅仅恢复当前记录。
【例3-13】恢复STUD.DBF中删除的所有记录。
USE STUD
RECALL ALL
(2)菜单方式
① 首先打开表文件
② 选择【显示】|【浏览】命令。
③ 选择【表】|【恢复记录】命令,出现类似图3-11所示对话框。余下操作与“删除”对话框的操作相同。
4.物理删除记录
物理删除是将当前表文件中被逻辑删除的记录全部清除。
(1)命令方式
【格式】PACK [MEMO][DBF]
【功能】将当前表文件中所有带删除标记(*)的记录全部真正地删除掉。
【说明】若选用MEMO选项,PACK MEMO将压缩与表文件同名的备注文件中的无用空间,但并不删除表文件中作了删除标记的记录。
若选用DBF选项,而不用MEMO选项,则只删除表文件中作了删除标记的记录,而不压缩相应的备注文件。
若不带任何选项,PACK命令将删除数据库文件中作了删除标记的记录,同时压缩相应的备注文件。
注意:执行该命令后被删除的记录将不能被恢复,因此使用时应特别小心。
【例3-14】将STUD.DBF中的学号为“021405”的记录进行物理删除。
USE STUD
DELETE FOR 学号=”021405”
PACK
(2)菜单方式
利用菜单方式物理删除表记录的具体步骤如下:
① 首先打开表文件
② 选择【显示】|【浏览】命令,系统弹出记录浏览窗口,显示当前表中的记录。主菜单上增加【表】菜单。
③选择【表】|【彻底删除】命令,出现图3-12所示的“确认”对话框。
④单击“是”按钮,完成物理删除过程。
注意:用户也可以在EDIT、CHANGE、BROWSE窗口中,按Ctrl+T键对当前记录作(或取消)删除标记,也可以用鼠标单击记录最左边的删除标记栏作(或取消)删除标记。
5.删除全部记录
【格式】ZAP
【功能】将当前打开的表文件中的所有记录完全删除掉。
【说明】执行该命令之后,将只保留表文件的结构,而不再有任何数据存在。这种删除无法恢复,因此,为防止用户发生错误操作而删除有用的表文件记录,执行该命令时,系统会弹出如图3-13所示ZAP提示窗口,以确认是否删除全部记录,单击“是”按钮清除所有记录,单击“否”按钮放弃ZAP操作。
3.3.4 修改记录
在表的使用维护过程中,有大量的工作是对数据记录的修改、编辑与更新,通常可以采用编辑修改、浏览修改和替换修改三种方式。
1.编辑修改
【格式】EDIT / CHANGE [FIELDS <字段名表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>]
修改记录
【功能】按照给定条件编辑修改当前打开的表文件的记录。
【说明】[FIELDS <字段名表>]:若选择此选项,则只列出字段名表中的字段,且显示顺序同字段名表中的顺序;若未选择此选项,将显示表中的所有字段,显示顺序同表中的字段顺序。
[<范围>]:若未选择此选项,则EDIT/CHANGE命令的范围为全部记录。
[FOR <逻辑表达式1>]和[WHILE <逻辑表达式2>]:同前面其他命令所述,在此不再重复叙述。
【例3-15】修改STUD.DBF中计0121班学生的学号、姓名和性别等信息。
USE STUD
EDIT FIELDS 学号,姓名,性别 FOR 班级名=”计0121”
全部修改完毕,使用 Ctrl+End 或 Ctrl+W 键保存所有修改的结果。
2.浏览修改
(1)命令方式
【格式】BROWSE [FIELDS <字段名表>] [FOR <逻辑表达式1>]
【功能】显示当前表的记录内容,以供编辑修改。
【说明】编辑结束后,按Ctrl+W或Ctrl+End存盘退出BROWSE编辑窗口,或者按Ctrl+Q或Esc键放弃存盘退出BROWSE窗口。
(2)菜单方式
利用菜单方式进行浏览修改的操作步骤如下:
① 打开表。
② 选择【显示】|【浏览】命令,系统弹出记录浏览窗口。
③ 在编辑修改窗口中编辑修改数据内容,完成后按Ctrl+W键存盘退出Beowse窗口。
3.替换修改
(1)命令方式
【格式】REPLACE <字段名1> WITH <表达式1> [ADDITIVE][, <字段名2> WITH <表达式2> [ADDITIVE]] ... [<范围>][FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [NOOPTIMIZE]
【功能】用指定表达式的值替换当前表中满足条件记录的指定字段的值。
【说明】:该命令适合对当前库进行成批地、有规律地修改。
缺省范围、条件时,仅替换当前记录
该命令回车后,数据修改自动完成。适用于程序设计。
ADDITIVE 只对备注型字段修改有效。
选择:表示添加内容 不选择:表示替换内容
表达式的类型必须与字段类型一致
表达式的值不能超出字段宽度,否则,数据无效。
【例3-16】修改STUD.DBF中的“学号”字段数据,。
USE STUD
REPLACE 学号 WITH ”20”+学号 ALL
(2)菜单方式
① 打开表文件。选择【显示】|【浏览】命令。
② 选择【表】|【替换字段】命令,弹出图3-16所示的“替换字段”对话框。
③ 单击字段下拉按钮选择要进行替换操作的字段名,在“替换为”显示栏中输入替换表达式,再选择“替换条件”显示框中的范围、条件。
④ 单击“替换”按钮,系统将自动完成替换操作。
3.3.5 表的复制
1.表结构的复制
【格式】COPY STRUCTURE TO <文件名> [FIELDS <字段名表>][[WITH] CDX | [WITH] PRODUCTION]
【功能】复制当前表文件的结构作为新表文件的结构。
【说明】命令执行前,需复制的表文件必须是打开的。
执行后,生成的新表文件只有结构。
<字段名表>:确定新表结构的字段名,<字段名表>中的字段必须是原表文件中具有的字段名。若省略该选项,则原样复制当前表文件的结构。
【例3-17】用复制命令将STUD.DBF中的学号、姓名、性别、出生日期等四个字段,构成一个新表结构。
表的复制
USE STUD
COPY STRUCTURE TO STUD1 FIELDS 学号,姓名,性别,出生日期
2.表文件的复制
【格式】COPY TO <文件名>[FIELDS <字段名表>][<范围>] [FOR <逻辑表达式1>][WHILE <逻辑表达式2>][[WITH] CDX] | [[WITH] PRODUCTION]
【功能】将当前打开的表文件全部或部分复制到一个新生成的表文件中。
【说明】新生成表文件中的字段顺序由FIELDS选择项<字段名表>确定,缺省表示新表的结构与原表的结构完全相同,新表文件中的记录由<范围>选择项以及<条件>选择项确定。同时缺省<范围>、<条件>表示将原表的全部记录都复制到新表中。
若<范围>、<条件>和<字段名表>都缺省,则表示将原表进行备份。
<文件名> 指定新生成的表文件。若当前原表文件中有备注型字段,则相应的备注文件(.FPT文件)将同时被复制。新表文件名不能与被复制的原表文件同名,省略盘符和路径表示在当前盘当前目录下生成新表文件。
【例3-18】复制STUD.DBF中所有女同学的记录到STUD2.DBF中。
USE STUD
COPY TO STUD2 FOR 性别=“女”
3.表记录保存为文本文件
【格式】COPY TO <文件名>[FIELDS <字段名表>][<范围>] [FOR <逻辑表达式1>][WHILE <逻辑表达式2>]
| WITH BLANK | WITH TAB]>
【功能】将当前表的记录全部或部分保存到一个文本文件中。
【说明】 FIELDS<字段名表>:确定文本文件中的字段顺序,缺省表示将表中记录的全部字段值保存到文本文件中,。
<范围>以及<条件>选择项:确定哪些记录的字段值保存到文本文件中。同时缺省<范围>、<条件>表示将原表的全部记录的字段值都保存到文本文件中。
[TYPE]:当用户生成的新文件不是DBF格式文件时,可以用TYPE选项指定新文件的格式,系统会自动产生不同格式的新文件,并为新文件加上相应的扩展名。
TYPE文件类型包括下列几种:
● SDF:复制为SDF(System Data Format)格式的ASCII文本文件,默认扩展名为.TXT。
● DELIMITED [WITH <定界符> WITH BLANK | WITH TAB]:复制为带分隔符的ASCII文本文件,默认扩展名为.TXT。
SDF和DELIMITED格式的区别:
SDF是将表文件的每一条记录复制到SDF文本文件中,在每一行中,字段与字段间没有分隔符,每一行以回车换行结束。字段在SDF文件中的宽度是固定的,等于源表中该字段的定义宽度。在SDF文件中,表文件中的字符型字段和数值型字段原样存贮,即字符型左对齐存贮,不足部分在右边填以空格;数值型则以右对齐方式存贮,不足部分在左边填以空格。日期型数据以YYYYMMDD格式存贮。逻辑型数据以T或F存贮。SDF文本文件不接受备注型字段和通用型字段。
DELIMITED文件带定界符格式文本文件,也是将源表文件中的每一条记录作为一行存贮,每行以回车换行结尾。但记录的各字段间以分隔符隔开,各字段的宽度为字段值的实际宽度。
字段间的分隔符默认为“,”号,字符型字段的定界符为双引号。用户可以用WITH <定界符>WITH BLANK | WITH TAB指定分隔符,WITH <定界符>表示用指定的<定界符>为字符型字段的定界符;WITH BLANK | WITH TAB则指定空格或Tab键作为字段间的分隔符。若使用WITH BLANK,则字符型字段不再有定界符。
注意:该命令和表文件的复制命令实际上是同一个命令,是复制为表文件还是文本文件,看是否带TYPE子句。
【例3-19】复制STUD.DBF中的记录内容复制到SSTUD.TXT(SDF格式)、DSTUD.TXT(DELIMITED格式)和ESTUD.TXT(以空格为分隔符的DELIMITED格式)中。
USE STUD
COPY TO SSTUD SDF
COPY TO DSTUD DELIMITED
COPY TO ESTUD DELIMITED WITH BLANK
3.3.6 表记录的追加
维护数据库的一项经常性的操作就是根据需要随时向表文件中添加记录,添加记录包括追加记录、插入记录和利用其他文件追加。追加记录在前面已经介绍,在这里就介绍后面两种方法。
1.从另一个表文件中追加记录
【格式】APPEND FROM <文件名 | > [FIELDS <字段名表>][FOR <逻辑表达式>]
【功能】从指定的表文件中读入数据,并添加到当前表文件的末尾。
【说明】数据的追加是从命令中指定的表文件追加到当前表文件中,所以,应先将需要追加记录的表文件打开,设置为当前表,然后再使用该命令进行追加。
表记录的追加
追加原则是同名原则,即将数据来源表中的字段与当前表的字段进行比较,同名则将符合条件的记录的值追加过来。若数据来源表中缺少某些字段,则当前表中该字段值为空。
追加数据记录时,若两个表文件同名字段的宽度不相同,一般情况下,若当前表的字段宽度大于数据来源表的字段宽度,记录能正常追加,对字符型数据后面加空格,对数值型数据前面加“0”,但若当前表的字段宽度小于数据来源表的字段宽度,记录不能正常追加,数据失去原来的意义。对字符型数据截去后面多余字符,对数值型数据进行小数部分的四舍五入,仍不够根据当前表的宽度用“*”号填充,表示溢出。
2.从另一个文本文件中追加记录
(1)命令方式
【格式】APPEND FROM <文件名 | > [FIELDS <字段名表>][FOR <逻辑表达式>] [[TYPE] SDF |[DELIMITED [WITH TAB | WITH <定界符> | WITH BLANK]]
【功能】从指定类型的文本文件中读入数据,并添加到当前表文件的末尾。
【说明】<文件名>是指获取数据的文本文件名。文本文件中的每一行,追加为一条记录。可以在文本文件中输入文本,但要保证文本格式相同,再利用此命令追加为记录。
注意:数据文件若由COPY TO 命令生成的且定义了文本文件的分隔符,则追加记录时也应用相同的分隔符。因为系统以每个分隔符作为字段值的分隔符。这样才能保证数据能正确还原。
(2)菜单方式
① 打开表文件。
② 选择【显示】|【浏览】命令。
③ 选择【表】|【追加记录】命令,弹出图3-17所示的“追加来源”对话框。
④ 单击类型下拉按钮选择用来追加记录的数据文件的类型,在“来源于”显示栏中输入数据来源文件的路径和文件名,再选择“选项”显示框中的字段、条件。确定后返回追加来源窗口。
⑤ 单击“确定”按钮,系统将满足条件的记录完成追加操作。
3.插入记录
【格式】INSERT [BEFORE] [BLANK]
【功能】在当前表文件的指定位置插入新记录或空记录。
【说明】INSERT是在当前记录之后插入新记录,INSERT BEFORE是在当前记录之前插入新记录,INSERT BLANK是在当前记录之后插入空记录。
若表文件建立了索引,则插入的新记录按索引值进行排列。
【例3-20】在表STUD.DBF的第2号记录前插入一条新记录,在第4号记录后插入一条新记录。
USE STUD
GOTO 2
INSERT BEFORE && 在2号记录前插入一条新记录
GOTO 5 && 因已插入了一条新记录,原4号现为5号
INSERT && 在4号记录后插入一条新记录
3.3.7 文件管理命令
Visual FoxPro除了表文件之外,还有其他多种类型的文件,系统对各类文件提供了通用的管理手段,其功能类似于DOS的文件管理命令,但必须注意它们之间的区别。
1.显示文件目录
【格式】DIR | DIRECTORY [ON <盘符>][[LIKE] [<路径>] [<通配符>]][TO PRINTER [PROMPT] | TO FILE <文件名>]
或LIST | DISPLAY FILES [ON <盘符>] [LIKE <通配符>][TO PRINTER [PROMPT] | TO FILE <文件名>]
【功能】显示磁盘文件目录信息。
【说明】该命令类似于DOS操作系统的DIR命令。
ON<盘符>:指定所显示文件目录所在的驱动器符号,缺省此项为当前盘。
[LIKE] [<路径>] [<通配符>]:<路径>指定显示文件所在路径;
文件管理命令
2.文件改名
【格式】RENAME <文件名1> TO <文件名2>
【功能】将<文件名1>改为<文件名2>。
【说明】该命令类似于DOS操作系统的REN命令。
改名之前文件必须关闭,正在使用的文件不能改名。如果有备注文件,对表文件改名时,不要忘记为相应的.FPT文件改名,否则打不开改名后的表。
【例3-22】将STUD.DBF改为GL.DBF。
USE
RENAME STUD.DBF TO GL.DBF
RENAME STUD.FPT TO GL.FPT
3.文件删除
【格式】ERASE [<文件名> | ]
或 DELETE FILE [<文件名> | ]
【功能】从磁盘上删除指定的文件。
【说明】此命令类似于DOS操作系统的DEL命令。
如果选择参数 或缺省文件名选项,系统将弹出Open对话框,供用户选择所需删除的文件。
为防止误操作,该命令不默认扩展名,所以<文件名>必须用全称,<文件名>不能使用通配符,如果<文件名>不在目录下,则需指定路径。同时,此命令也不能删除已打开的文件。
【例3-23】删除当前目录下的.BAK文件。
ERASE ABC.BAK
ERASE STUD.BAK
DELETE FILE XSCJ.BAK
DIR *.BAK
4.文件复制
【格式】COPY FILE <文件名1> TO <文件名2>
【功能】对各类文件进行复制
【说明】此命令类似于DOS操作系统的COPY命令。
<文件名1>和<文件名2>必须给出全名,不能使用通配符;不能复制已打开的文件;当复制含有备注型字段或已建立索引的表文件时,必须复制相应的备注文件和索引文件。
【例3-24】将STUD.DBF改名为STUDBAK.DBF复制到A:盘上。
COPY FILE STUD.DBF TO A:STUDBAK.DBF
COPY FILE STUD.FPT TO A:STUDBAK.FPT && 复制.FPT备注文件
5.显示文本文件
【格式】TYPE <文件名1> [AUTO] [WRAP] [TO PRINTER [PROMPT] | TO FILE <文件名2>][NUMBER]
【功能】显示或同时打印文本文件
【说明】此命令类似于DOS操作系统的TYPE命令。
文本文件是指非结构式文件,即没有任何内部控制符的ASCII码文件。例如命令文件.PRG、屏幕格式文件.FMT和文本文件.TXT。
<文件名1>和<文件名2>:必须带扩展名,不能使用通配符,且不能是打开的文件。
6.调用外部命令
如果觉得Visual FoxPro的文件管理命令不方便,可以调用DOS的有关命令。
【格式】RUN | ! [/N [K]]
【功能】执行MSDOS的系统命令。
【说明】此命令直接完成外部程序的功能。使用本命令必须有足够的内存空间,否则会产生“内存不足”的错误。
3.4 排序与索引
为了高效方便地存取数据,往往要求表记录以某一定的顺序排放或显示,因此,Visual FoxPro提供了两种方法重新组织数据,即排序和索引。
排序是从物理上对表进行重新整理,按照指定的关键字段来重新排列表中数据记录的顺序,并产生一个新的表文件。由于新表的产生即费时间也浪费空间,实际中很少用。
排序与索引
索引是从逻辑上对表进行重新整理,按照指定的关键字段的建立索引文件。一个表文件可以建立多个索引文件,但对于打开的表文件,任何时侯只有一个索引文件起作用,此索引文件称为主控索引。
3.4.1 表的排序
【格式】SORT TO <新文件名> ON <字段1> [/A | /D] [/C] [, <字段2> [/A | /D] [/C] ...]
[ASCENDING | DESCENDING] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>]
[FIELDS <字段名表>]
【功能】对当前打开的表,按指定的字段进行排序,生成新的表文件。
表的排序
生成的排序文件也是一个数据库文件。
范围、条件的含义同COPY TO命令。
用作排序的字段的数据类型允许是N、C、D、L型。
/A 表示升序 /D 表示降序 /C 表示不区分大小写
当有多个关键字段时,先按字段1的值排列,其值相同的,再按字段2的值排列。
原库中的记录发生变化,排序文件不能自动完成同步修改。
该命令执行后,当前表不变,产生的新表不会自动打开。
占空间、废时间,很少用。
【例3-25】将STUD.DBF按性别进行降序排列
USE STUD
SORT TO STUD2 ON 性别/D
3.4.2 表的索引
1.索引及索引文件的概述
索引是以索引文件的形式存在的,它根据指定的索引关键字表达式建立的。索引文件可以看成索引关键字的值与记录号之间的对照表,关键字可以是一个字段,也可以是几个字段的组合。在建立索引文件时,把表所有记录的索引关键字表达式的值按指定顺序排序,并把每个索引关键字表达式值与该值在表中所对应的记录对应起来,保存在索引文件中。
索引文件必须与原表一起使用,查询时根据索引关键字表达式的值先在索引文件中找到某字段所在的记录号,然后再到表里直接定位。这样的查找方式使顺序查找和随机查找都有较高的效率。打开索引文件时,将改变表中记录的逻辑顺序,但并不改变表中记录的物理顺序。
表的索引
一个表文件可建立多个索引文件,也可同时打开多个索引文件,但在同一时间内只有一个索引起作用,这个索引称为主控索引。
Visual FoxPro系统中支持两种不同的索引文件类型,即单索引文件和复合索引文件。
单索引文件是根据一个索引关键字表达式(或关键字)建立的索引文件,文件扩展名为.IDX,它可用INDEX命令的各种形式建立。单索引文件分为标准和压缩两种类型。
复合索引文件是指索引文件中可以包含多个索引标识的扩展名为.CDX。每个索引标识与单索引文件类似,也可以根据一个索引关键字表达式(或关健字)建立。每一个索引标识均有一个特殊的标识名(TAG)。标识名由字母或下划线开头,由字母、数字或下划线组成,长度不超过10个字符。用户可以利用标识名来使用标识,向复合索引文件中追加标识。复合文件中标识的数目,仅受内存和磁盘空间的限制。
复合索引文件又有两种:一种是独立复合索引文件;另一种是结构复合索引文件。
结构复合索引文件是由Visual FoxPro自动命名的,与相应的表文件同名,扩展名为.CDX。当Visual FoxPro打开一个表时,便自动查找一个结构复合索引文件,如果找到便自动打开,该索引文件随表文件同时打开和同时关闭。
独立复合索引文件不与表文件同名,扩展名为.CDX。在打开表时不会自动打开此索引文件,由命令指定打开。
索引可分为下列四种类型:
(1)主索引
主索引是一个永远不允许在指定字段和表达式中出现重复值的索引。它也是在数据库表的永久关联中创建参照完整性时主表和被引用表使用的索引。每一个表只能建立一个主索引,只有数据库表才能建立主索引。
(2)侯选索引
侯选索引也是一个不允许在指定字段和表达式中出现重复值的索引。数据库表和自由表都可以建立侯选索引,一个表可以建立多个侯选索引。
主索引和侯选索引都存储在.CDX结构复合索引文件中,不能存储在独立复合索引文件和单索引文件中,因为主索引和侯选索引都必须与表文件同时打开和同时关闭。
(3)唯一索引
系统只在索引文件中保留第一次出现的索引关键字值。数据库表和自由表都可以建立唯一索引
(4)普通索引
是一个最简单的索引,允许关键字值的重复出现,适合用来进行表中记录的排序和查询,也适合于一对多永久关联中“多”的一边(子表)的索引。数据库表和自由表都可以建立普通索引。
普通索引和唯一索引可以存储在.CDX独立复合索引文件和.IDX单索引文件中。
2.索引文件的建立
(1)命令方式
【格式】INDEX ON <索引关键字表达式> TO <单索引文件> | TAG <标识名>
[OF <独立复合索引文件名>] [FOR <逻辑表达式>] [COMPACT]
[ASCENDING | DESCENDING][UNIQUE] [ADDITIVE]
【功能】对当前表文件按指定的关键字建立索引文件。
【说明】<索引关键字表达式>:指定建立索引文件的关键字表达式,可以是单一字段名,也可以是多个字段组成的字符型表达式,表达式中各字段的类型只能是数值型、字符型和日期型和逻辑型。
当表达式是单个字段名时,字段类型不用转换;应转换成同一类型的表达式。
TAG <标识名>:此选项只对建立复合索引文件时有效,指定建立或追加索引标识的标识名。
OF <独立复合索引文件>:指定独立复合索引文件名。若有此选项,表示在指定的独立复合索引文件中追加一个索引标识,若指定的独立复合索引文件不存在,系统将自动建立指定的文件。若没有此选项,表示在结构复合文件中追加一个索引标识,若结构复合索引文件不存在,系统将自动建立结构复合索引文件。
FOR <逻辑表达式>:表示只对满足条件的记录建立索引。
COMPACT:此选项只对单索引文件有效,表示建立压缩索引文件。
ASCENDING|DESCENDING: ASCENDING表示按升序建立索引,DESCENDING表示按降序建立索引。缺省时,按按升序建立索引。单索引文件不能选用DESCENDING选项。
UNIQUE:表示建立的是唯一索引。
ADDITIVE:表示保留以前打开的索引文件。否则,除结构复合索引文件外,以前打开的其他索引文件都将被关闭。
新建的索引文件自动打开,并开始起作用。
【例3-26】对STUD.DBF表文件建立出生日期单索引文件STUD.IDX。
USE STUD
INDEX ON 出生日期 TO STUD
【例3-27】对表文件STUD.DBF,建立一个基于出生日期字段的结构复合索引文件。
USE STUD
INDEX ON 出生日期 TAG 出生日期 DESCENDING
【例3-28】在表文件STUD.DBF的结构复合索引文件中,按学号和姓名各追加一个标识。
USE STUD
INDEX ON 学号 TAG 学号
【例3-29】在表文件STUD.DBF的结构复合索引文件中,先按性别再按学号追加一个标识。
USE STUD
INDEX ON 性别+学号 TAG 性别学号
【例3-30】在表文件STUD.DBF中,先按性别再按是否团员建立一个独立复合索引文件SXBTY.CDX。
USE STUD
INDEX ON 性别+IIF(是否团员,’团员’,’非团员’) TAG 性别团员 OF SXBTY
(2)菜单方式
① 打开表文件。
② 选择【显示】|【表设计器】命令,打开表设计器对话框,选择“索引”标签,如图3-18所示。
③ 在索引名中输入索引标识名,在类型的下拉列表框中确定一种索引类型,在表达式中输入索引关键字表达式,在筛选中输入确定参加索引的记录条件,在排序序列下默认的是升序按钮,单击可改变为降序按钮。
④ 确定好各项后,选择“确定”,关闭表设计器,同时索引建立完成。
⑤ 同样的方法也可以将以前建立的索引调出,利用表设计器上的“插入”或“删除”按钮进行插入或删除。
注意:用表设计器建立的索引都是结构复合索引文件。
3.索引文件的打开
【格式1】USE <文件名> [INDEX <索引文件名表|?>][ORDER <数值表达式2> | <单索引文件> | [TAG] <标识名> [OF <复合索引文件名>][ASCENDING | DESCENDING]]
【功能】打开指定的表文件及相关的索引文件
【说明】:INDEX <索引文件名表> | :表示打开的索引文件;如果选择“ ”,则系统将出现“打开”对话框,供用户选择索引文件名;如果<索引文件名表>中的第一个索引文件是单索引文件,则它是主索引文件,若第一个索引文件是复合索引文件,则表文件的记录将以物理顺序被访问。
<索引文件名表>:指定要打开的索引文件,索引文件中的文件扩展名可以省略,但如果存在同名的单索引文件和复合索引文件,必须带扩展名。
<索引文件名表>中的单索引文件和复合索引文件的标识有一个唯一的编号,编号最小值为1,编号规则为:先将单索引文件按它们在<索引文件名表>中的顺序编号,再将结构复合索引文件按标识产生的顺序连续编号,最后将独立复合索引文件中的标识先按它在<索引文件名表>中的顺序,再按标识产生的顺序连续编号。
[ORDER]子句:指定主索引。选择此选项时,主索引文件将不是<索引文件名表>中的第一个单索引文件,而是此选项指定的单索引文件或标识。[ORDER]子句中各选项的含义如下:
●<数值表达式2>指定主索引的编号,若<数值表达式2>的值为0,表示不设主索引。
●<单索引文件>指定的单索引文件设置为主索引。
● [TAG] <标识名> [OF <复合索引文件名>]:表示将<复合索引文件名>中的指定标识作为主索引。[OF <复合索引文件名>]缺省表示为结构复合索引文件。
● ASCENDING | DESCENDING:表示主索引被强制以升序或降序索引;缺省此选项,主索引按原有顺序打开。
【格式2】SET INDEX TO [<索引文件名表> ] [ORDER <数值表达式> | <单索引文件名> | [TAG] <标识名> [OF <复合索引文件名>] [ASCENDING | DESCENDING]][ADDITIVE]
【功能】在已打开表文件的前提下,打开相关索引文件。
【说明】ADDITIVE:表示保留以前打开的索引文件。否则,除结构复合索引文件外,以前打开的其他索引文件都将被关闭。
4.索引文件的关闭
【格式1】USE
【功能】关闭当前工作区中打开的表文件及所有索引文件。
【格式2】SET INDEX TO
【功能】关闭当前工作区中打开的所有单索引文件和独立复合索引文件。
【格式3】CLOSE INDEXS
【功能】关闭当前工作区中打开的所有单索引文件和独立复合索引文件。
注意:结构复合索引文件不能用以上命令关闭,它随表文件的打开而打开,随表文件的关闭而关闭。
5.改变主索引
【格式】SET ORDER TO [<数值表达式1> | <单索引文件名> | [TAG] <标识名> [OF <复合索引文件名>] [IN <数值表达式2> | <字符表达式>] [ASCENDING | DESCENDING]]
【功能】重新指定打开的索引文件中的主索引。
【说明】<数值表达式1>的值为指定主索引的编号。
如果<数值表达式1>的值为0或缺省,则恢复表文件的原始顺序,使所有打开的索引文件都无效。
【例3-31】打开STUD.DBF表文件及其相关索引文件,并指定结构复合索引文件中的姓名为主控索引。
USE STUD INDE STUD.IDX ORDER TAG 姓名
【例3-32】打开STUD.DBF表及其相关索引文件,改变主索引文件。
USE STUD INDEX STUD.IDX
SET ORDER TO 4
SET ORDER TO && 使所有索引均无效
6.索引文件的更新
当表中的记录被修改时,系统会自动地更新所打开的索引文件,及时反映数据的变化。对于没有打开的索引文件,索引不能自动更新。为避免使用旧的索引文件导致错误,应该使用重新索引命令更新已经建立的索引文件。
(1)命令方式
【格式】REINDEX [COMPACT]
【功能】重新建立已索引过的索引文件。
【说明】COMPACT:表示将标准的单索引文件变为压缩的单索引文件。
【例3-33】将表STUD.DBF的索引文件重新索引。
USE STUD
SET INDEX TO STUD.IDX
REINDEX
(2)菜单方式
① 打开表文件。
② 选择【显示】|【浏览】命令。
③ 选择【表】|【重新建立索引】命令,系统自动根据各索引表达式重新建立索引。
7.索引的删除
(1)标识的删除
【格式】DELETE TAG <标识名1> [OF <复合索引文件名1>][, <标识名2> [OF <复合索引文件名2>]] ...
或:DELETE TAG ALL [OF <复合索引文件名>]
【功能】从指定的复合文件中删除标识
【说明】OF <复合索引文件名>:指定复合索引文件名,若缺省,则为结构复合索引文件。
(2)单索引文件的删除
【格式】DELETE FILE <单索引文件名>
【功能】删除指定的单索引文件
【说明】关闭的索引文件才能被删除,文件名必须带扩展名。
【例3-34】删除表文件STUD.DBF的单索引文件STUD.IDX及结构复合索引文件中的所有标识。
DELETE FILE STUD.IDX
USE STUD
DELETE TAG ALL
8.索引文件的转换
(1)单索引文件复制到复合索引文件
【格式】COPY INDEXES <单索引文件名表> | ALL [TO <复合索引文件名>]
【功能】将当前表文件已打开的所有单索引文件或<单索引文件名表>中所列的单索引文件,复制到指定的复合索引文件中。
【说明】TO <复合索引文件名>:指定的复合索引文件名,缺省为结构复合索引文件。索引标识名为原单索引文件名。
ALL:表示将所有的单索引文件复制到指定的复合索引文件中
复制前必须打开指定的单索引文件。
3.5 查询
在数据资源的管理过程中,使用最频繁的操作莫过于查询满足一定条件的一系列数据,从而为日常决策提供足够的判断依据。对表记录的查询系统提供了两类查询命令:顺序查询和索引查询。
在前面介绍定位时,省略了条件定位,查询操作实际上就是起到了条件定位的作用。
查询
3.5.1 顺序查询
1.命令方式
【格式】LOCATE FOR<逻辑表达式1>[<范围>][WHILE <逻辑表达2>]
【功能】在表指定范围中查找满足条件的记录。
【说明】LOCATE 命令在表指定范围中查找满足条件的第一条记录。
<逻辑表达式1>:表示所需满足的条件。
<范围>:指定查找范围,缺省时为ALL,即在整个表文件中查找。
找到第一条满足条件的记录后,记录指针指向该记录,并将函数FOUND()(用于检测是否找到满足条件的记录)置为.T.;否则,记录指针指向<范围>的底部或文件结束标志,并且将函数FOUND()置为.F,并在状态栏给出提示信息“已到定位范围末尾”。
顺序查询
如果没有打开索引文件,查找按记录号顺序进行。若打开了索引,查找按索引顺序进行。
该命令的最大特点是可以在没有进行排序或索引的无序表中进行任意条件的查询,这是索引查询做不到的,但在大型表中查询速度和效率也是最低的。
CONTINUE命令:LOCATE找到第一条满足条件的记录后,可以用CONTINUE继续查找下一个满足条件的记录。
CONTINUE命令必须在LOCATE命令之后使用,否则出错。
在CONTINUE命令中实际隐含了前一个LOCATE命令中的条件。
【例3-37】在STUD.DBF中查找学号前四位为0111的同学记录。
USE STUD
LOCATE FOR 学号="0111"
2.菜单方式
① 首先打开表文件
② 选择【显示】|【浏览】命令。
③ 选择【表】|【转到记录】|【定位】命令,出现如图3-19所示的定位记录对话框。
④ 在“作用范围”下拉列表框中选择查询范围,在FOR或WHILE框中输入查询条件,选择定位按钮。系统将指针定位于符合条件的第一条记录上。
3.5.2 索引查询(FIND、SEEK)
LOCATE命令用于按条件进行顺序定位,无论索引文件是否打开都可使用。在打开索引文件后,还可以用FIND、SEEK命令进行快速检索。
索引查询(FIND、SEEK)
1.FIND命令
【格式】FIND <字符串>/<数值常量>
【功能】在表文件的主控索引中查找关键字值与<字符串>或<数值常量>相匹配的第一个记录。
【说明】必须打开相应的库文件、主索引文件。
查询字符串,字符串可以不用定界符括起来,但前后有空格的,则必须要括进来。
查询常数,必须使用索引关键字的完整值。
允许查询字符型内存变量,但必须使用宏替换函数。
由于索引文件中关键字表达式值相同的记录总是排在一起的,可用SKIP、DISP命令来逐个查询。
查询完满足条件的记录后,不能自然给出提示,常借助于EOF()函数来判断查询是否完成。
多关键字查询,建立索引时STR函数若没有指定小数位,则应补齐不足10位的空格。

如果用SET EXACT ON命令,则匹配必须是精确的。即FIND命令中的查询内容必须与记录的关键字段值完全相等。如果用SET EXACT OFF命令,则匹配可以是不精确的,即只要FIND命令中的查询内容与记录的关键字段值的左侧相等即可。
【例3-38】打开表文件STUD.DBF,查找姓“赵”的记录。
USE STUD
SET ORDER TO 姓名
FIND 赵
2.SEEK命令
【格式】SEEK <表达式>
【功能】在表文件的主索引中查找关键字值与<表达式>值相匹配的第一个记录。
【说明】SEEK命令可以查找字符型、数值型、日期型、逻辑型表达式的值。
SEEK命令中的表达式的类型必须与索引表达式的类型相同。
可以查找字符、数值、日期和逻辑型字段的值。
内存变量可以直接进行查询,不用进行宏替换。
表达式为字符串时,必须用定界符括起来。日期常量也必须用大括号括起来。
表达式可以为一复杂的表达式,计算机先计算表达式的值,然后用其值进行查询。
由于索引文件中关键字表达式值相同的记录总是排在一起的,可用SKIP、DISP命令来逐个查询。
如果用SET EXACT ON命令,则匹配必须是精确的。
【例3-40】用SEEK命令在STUD.DBF中查找记录。
USE STUD
INDEX ON 是否团员 TAG 是否团员
SET ORDER TO 姓名
SEEK "孙"
3.6.1 统计记录数
【格式】COUNT [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量>]
【功能】用于统计当前表中指定范围内满足条件的记录个数。
【说明】除非指定了<范围>或 FOR/WHILE <条件>,否则将计算所有记录个数,如选择了 TO <内存变量>,则可将计算结果保存在<内存变量>中,否则统计结果只在屏幕上显示。
若选择了SET TALK OFF将不显示统计结果。
若 SET DELETE OFF,则加删除标志的记录将被计算。
【例3-41】统计STUD.DBF中的男同学记录个数和表记录总数。
数据统计与计算
USE STUD
COUNT FOR 性别="男" TO A
COUNT TO B
3.6.2 求和
【格式】SUM [<表达式表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO <内存变量表> | TO ARRAY <数组>] [NOOPTIMIZE]
【功能】对指定范围内、满足条件的记录按指定的各个表达式分别求和。
【说明】缺省范围、条件表示全部记录。
缺省数值型表达式表,表示对库中所有数值型字段求和。
数值型表达式表中表达式的个数应与内存变量的个数一致。
【例3-42】有一表文件GZGL.DBF内容如下,
Record# 姓名 性别 车间 基本工资 岗位工资 奖金 工资总额
1 张小红 女 金工一 645 340 120 1105
2 李建军 男 金工一 690 370 130 1190
3 孙爱国 男 金工一 580 340 120 1040
4 吴晓英 女 金工一 540 360 110 1010
5 张 斌 男 金工二 670 400 140 1210
6 赵 娜 女 金工二 570 330 110 1010
7 赵明明 男 金工二 560 300 100 960
8 李 菲 女 机修 650 350 150 1150
9 苏汉胜 男 机修 600 340 100 1040
10 罗 丹 女 工具 600 350 130 1080
11 李会明 男 工具 670 350 120 1140
对GZGL.DBF中的基本工资、岗位工资、奖金和工资总额求和,并将结果存贮成数组A中。
USE GZGL
SUM TO ARRAY A
3.6.3 求平均值
【格式】AVERAGE [<表达式表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量表> | TO ARRAY <数组>] [NOOPTIMIZE]
【功能】对当前表文件中指定范围内满足条件的记录,按指定的数值型字段计算平均值。
【说明】缺省范围、条件表示全部记录。
缺省数值型表达式表,表示对当前库中所有数值型字段求平均值。
数值型表达式表中表达式的个数应与内存变量的个数一致。
【例3-43】分别计算GZGL.DBF中的男女各项收入的平均值。
USE GZGL
AVER FOR 性别=”男” TO ARRAY B
AVER FOR 性别=”女” TO ARRAY C
3.6.4 综合计算
【格式】CALCULATE <表达式表> [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量表> | TO ARRAY <数组>]
【功能】对当前表文件中指定范围内满足条件的记录进行指定的计算工作。
【说明】<表达式表>可以是表3-4中函数的任意组合。
【例3-44】计算GZGL.DBF中的人数、奖金收入的平均值和最大值、工资总额的最大值、平均值。
USE STUD
CALC CNT(),AVG(奖金),MAX(奖金),AVG(工资总额),MAX(工资总额) TO X1,X2,X3,X4,X5
3.6.5 分类汇总
【格式】TOTAL TO <汇总文件名> ON <关键字段> [FIELDS <字段名表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [NOOPTIMIZE]
【功能】按关键字段对当前表文件的数值型字段进行分类汇总,形成一个新的表文件。
【说明】当前表必须在关键字上排序或索引,否则仅将关键字段值相同的紧挨的记录值汇总。
汇总命令执行后,将生成一个新的数据库文件(并没有被打开)。
对非数值型字段,则把关键字相同的连续记录的第一条记录的字段内容送入新库。
缺省待汇总字段名表,则将所有数值型字段的值进行汇总。
若数值型字段的汇总值超过了原数据库该字段的宽度,系统会自动修改汇总库中该字段的宽度。
汇总文件的结构与当前表的结构完全相同,汇总记录个数由<关键字段>的值确定 。
【例3-45】对GZGL.DBF按“车间”分类汇总。
USE GZGL
INDEX ON 车间 TAG 车间
TOTAL ON 车间 TO GZCJ
TOTAL TO GZCJ ON车间
USE GZCJ
对GZGL.DBF按“性别”分类汇总。
USE GZGL
INDEX ON 性别 TAG 性别
TOTAL TO GZXB ON 性别
USE GZXB
3.7 多表的操作
迄今所讲述的对表的操作都是在一个工作区进行的,每个工作区最多只能打开一个表文件,用USE命令打开一个新的表,同时也就关闭了前面已打开的表。在实际应用中,用户常常需要同时打开多个表文件,以便对多个表文件的数据进行操作。为了解决这一问题,Visual FoxPro引入了工作区的概念。Visual FoxPro允许用户在表间建立临时关系和永久关系。
多表的操作
3.7.1 工作区与多个表
1.工作区和当前工作区
Visual FoxPro 能同时提供32767个工作区。系统默认值为1区。
在任意时刻,只有一个工作区是当前工作区,用户只能在当前工作区对打开的当前库进行操作。
每一个工作区都可以并且只能打开一个数据库文件。
同一个数据库文件不允许同时在多个工作区打开,但在其它工作区中被关闭之后,可以在任意一个工作区中被打开。
各工作区中打开的数据库彼此相互独立(指针不受影响)。
2.选择当前工作区
每一个工作区用工作区号或别名来标识
(1)工作区号
利用数字1~32767来标识32767个不同的工作区
(2)别名
前10工作区用A~J10个字母来标识。
采用该工作区中已打开的数据库的库名来作别名
用户自己定义
【命令格式】 :USE 〈数据库名〉[ALIAS〈别名〉]
【功能】 :打开数据库文件并为该数据库起一个别名。
【说明】给数据库起了别名后,数据库名就不是默认的别名了。
(3)工作区的选择
当系统启动时,1号工作区是当前工作区,若想改变当前工作区,则可使用SELECT命令来转换当前工作区。
【命令格式】:SELECT<工作区号>/<工作区别名>
【功能】:选择一个工作区作为当前工作区。
【说明】:<工作区号> | <工作区别名>:指定当前工作区。选择工作区时,可以直接指定区号,也可以通过别名指定工作区,二者是等效的。
别名可以是系统规定的别名,也可以是用户规定的别名,甚至可以用已打开的表名替代工作区别名。此命令允许选用“0”号工作区。如果指定“0”,则表示选用当前未使用过的编号最小的工作区作为当前工作区。
执行该命令后,对任何工作区中的表及记录指针均不发生影响,仅实现各个工作区之间切换。
【例3-46】在1号和2号工作区内分别打开STUD.DBF和COURSE.DBF表文件,并选择1号工作区为当前工作区。
SELECT 1 && 或 SELECT A
USE STUD
SELECT 2
USE COURS
SELECT 1
3.非当前工作区字段的引用
Visual FoxPro系统对当前工作区上的表可以进行任何操作,也可以对其他工作区中的表文件的数据进行访问。在主工作区可通过以下两种格式访问其他工作区表中的数据。
格式:<工作区别名>-> <字段名>
<工作区别名>. <字段名>
通过用工作区别名指定欲访问的工作区,所得到的字段值为指定工作区打开的表当前记录的字段值。
【例3-47】在1号和2号工作区打开STUD.DBF和SC.DBF,在1号工作区内查看当前记录的学号、姓名、性别、出生日期、课程号、成绩等字段内容。
SELECT A
USE STUD && 在一号工作区中打开STUD
SELECT B
USE SC && 在二号工作区中打开SC
SELECT A && 选择1号工作区为当前工作区
DISPLAY 学号,姓名,性别,出生日期,B->课程号,SC.成绩
3.7.2 表的关联
1.关联的概述
所谓表文件的关联是把当前工作区中打开的表与另一个工作区中打开的表进行逻辑连接,而不生成新的表。当前工作区的表和另一工作区中的打开表建立关联后,当前工作区是表的记录指针移动时,被关联工作区的表记录指针也将自动相应移动,以实现对多个表的同时操作。
在多个表中,必须有一个表为关联表,此表常称为父表,而其他的表则称为被关联表,常称为子表。在两个表之间建立关联,必须以某一个字段为标准,该字段称为关键字段。表文件的关联可分为一对一关联、一对多关联和多对多关联。
表的关联
2.表文件关联的建立
(1)一对一关联的建立
1)命令方式
【格式】SET RELATION TO [<关键字段表达式> | <数值表达式>] [INTO<别名> | <工作区号>] [ADDITIVE]
【功能】将当前工作区的表文件与<别名>(或工作区号)指定的工作区中的表文件按<关键字段表达式>或<数值表达式>建立关联。
【说明】当用<关键字段表达式>建立关联时,关键字必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定关键字段为主索引。
当父表文件的记录指针移动时,子表文件的记录指针根据主索引文件指向关键字段值与父表文件相同的记录。如果子表中没有与关键字段值相同的记录,记录指针指向文件尾,EOF()为.T.。
当按<数值表达式>建立关联时,别名表不需要打开索引文件,两个表文件按照记录号相联系,父表文件的记录指针移动时,子表文件的记录指针移至与数值表达式相等的记录上。若找不到此记录,记录指针指向文件尾,EOF()为.T.。
ADDITIVE:表示当前表与其他工作区表己有的关联仍有效,实现一个表和多个表之间的关联;否则取消当前表与其他工作区表已有的关联,当前表只能与一个表建立关联。
SET RELATION TO则表示取消当前工作区与其他工作区的关联。
【例3-48】 将表文件STUD.DBF和SC.DBF以学号为关键字段建立关联。
SELECT 2 && 选择工作区2
USE SC && 打开表文件SCORE.DBF
INDEX ON 学号 TAG 学号 && 建立学号标识
SET ORDER TO TAG 学号 && 指定学号为主索引
SELECT 1 && 选择工作区1
USE STUD && 打开表文件STUD.DBF
SET RELATION TO 学号 INTO 2 && 建立一对一关联
【例3-49】 将表文件STUD.DBF和SC.DBF按数值表达式建立关联。
SELECT 2 && 选择工作区2
USE SC && 打开表文件SC.DBF
SELECT 1 && 选择工作区1
USE STUD && 打开表文件STUR.DBF
SET RELATION TO RECNO() INTO 2
2)菜单方式
① 选择【窗口】|【数据工作期】,弹出数据工作期窗口。
② 选择【打开】,将需要用到的表在不同的工作区打开。
③ 在别名列表中选择主表,再单击“关系”按钮,再在别名列表中选择子表。
④ 如果子表文件未指定主索引,系统会打开如图3-21所示的“设置索引顺序”对话框,以指定子表文件的主索引。
⑤ 主索引建立后,系统弹出如图3-22所示的“表达式生成器”(Expression Builder)对话框,在字段列表框中选择关联关键字段,然后单击“确定”按钮,返回数据工作期窗口。
⑥ 此时在数据工作期窗口的右侧列表框中出现了子表,在父表和子表之间有一单线相连,说明在两表之间已建立了一对一关联,如图3-23所示。
(2)一对多关联的建立
1)命令方式
【格式】SET SKIP TO [<别名1>[, <别名2>] ...]
【功能】将当前表文件与其他工作区中的表文件建立一对多关联。
【说明】先要用SET RELATION命令建立了一对一的关联,然后才能将一对一的关联进一步定义成一对多的关联。
当前工作区表记录指针移动时,别名库文件的记录指针指向第一个与关键字表达式值相匹配的记录,若找不到相匹配的记录,则记录指针指向文件尾部,EOF()为.T.。
当父表中的一个记录与子库的多个记录匹配时,在父表中使用SKIP命令,并不使父表的指针移动,而子表的指针却向前移动,指向下一个与父表相匹配的记录;重复使用SKIP命令,直至在子表中没有与父表当前记录相匹配的记录后,父表的指针才真正向前发生移动。
无任何选择项的SET SKIP TO命令将取消一对多的关联(一对一的关联仍然存在)。
2)菜单方式
① 选择【窗口】|【数据工作期】,弹出的数据工作期窗口。
② 按前面所述的步骤,建立一对一关联。
③单击【一对多】按钮,系统弹出创建一对多关系对话框。
④ 在创建一对多关系对话框的子表别名列表框选择子表别名,单击“移动”按钮,子表别名将出现在选定别名列表框中,单击“确定”按钮,完成子表别名的指定,并返回到数据工作期窗口。
⑤ 如果子表文件未指定主索引,系统显示“指定索引顺序”对话框,以便用户指定主索引。
⑥ 完成上述工作后,在数据工作期窗口的右侧列表框中出现了子表文件名,在父表和子表之间有一双线相连,说明在两表之间已建立了一对多关联 。
(3)一个表对多个表关联的建立
1)命令方式
【格式】SET RELATION TO [<关联表达式1> INTO <别名1> | <工作区1>[, <关联表达式2> INTO <别名2> | <工作区2> ...][ADDITIVE]]
【功能】将主工作区中的表与多个其他工作区中的表建立关联。
【说明】<关联表达式1>表示与别名1表文件建立关联时的关键字段表达式,<关联表达式2>表示与别名2表文件建立关联时的关键字段表达式,建立关联时,关键字段必须是两个表文件共有字段,且别名表文件已按关键字段建立了索引文件,并已指定为主索引。
当父表文件的记录指针移动时,多个子表文件的记录指针根据各自的主索引文件指向关键字段值与父表文件相同的记录。
其他有关参数均同前述。
2)菜单方式
多次利用上节介绍的菜单步骤,只要每次选择的子表不同,就可以分别建立一个表文件同多个表文件的关联。
3.取消表的关联
(1)在建立关联的命令中,如果不选用ADDITIVE选项,则在建立新的关联的同时,取消了当前表原来建立的关联。
(2)命令SET RELATION TO,取消当前表与其他表之间的关联。
(3)命令SET RELATION OFF INTO <别名> | <工作区号>,取消当前表与指定别名表之间的关联。
(4)关闭表文件,关联都被取消,下次打开时,必须重新建立。
3.7.3 数据库的连接
在实际应用中,经常需要把不同数据结构的表文件按一定要求连接形成一个新的表文件,这就是表文件的连接,称为物理连接。
【格式】 JOIN WITH <工作区号> | WITH <别名> TO <新文件名> FOR <逻辑表达式> [FIELDS <字段名表>]
【功能】将当前表文件和另一工作区中打开的<别名>表文件按指定的条件连接,生成一个以<新文件名>为名的新表文件,实现物理上的连接。
【说明】WITH <工作区号> | WITH <别名>指定另一工作区打开的表文件,<新文件名>表示连接生成的新表文件,其扩展名可省略,系统默认为.DBF。
FOR <逻辑表达式>指定两个表文件的连接条件,它不同于其他命令中的FOR子句,其他命令的FOR子句都是选择项,这里的FOR子句不可缺省,否则,JOIN命令无法执行。
数据库的连接
【例3-51】将STUD.DBF和SC.DBF表按学号连接,生成一个新的表文件STUD_SC.DBF。
SELECT 2
USE SC
SELECT 1
USE STUD
JOIN WITH B TO STUD_SC FOR 学号=B->学号 FIELDS 学号,姓名,班级名,系别代号,B->课程号,B->成绩 && 连接生成新文件STUD_SC
3.7.4 表间的数据更新
【格式】UPDATE ON <关键字段> FROM <别名> | <工作区号> REPLACE <字段1> WITH <表达式1> [,<字段2> WITH <表达式2>…] [RANDOM]
【功能】用<别名>或<工作区号>指定的表的数据更新当前区表中的数据。
表间的数据更新
【说明】<关键字段>必须为两个表所共有的。
<别名> | <工作区号>:指定用来进行数据更新的表文件。
<字段1> WITH <表达式1>:用表达式1的值更新字段1的内容, 表达式中出现的别名库中的字段应以前缀“别名->”或“别名.”标识。
如果选用RANDOM选择项,别名区中文件不需索引或按关键字段升序排序;否则两个表文件都必须以关键字段索引或按关键字段升序排序。
若当前区表中有多个关键字值相同的记录,则只对第一个进行更新;若别名库中有多个关键字值相同的记录,则对当前表中相应的记录进行多次更新。
【例3-52】表文件ZFCJ.DBF内容如下,用SC.DBF中的各课成绩值计算ZFCJ.DBF中的总分成绩。
记录号 学号 姓名 总分
1 961101 李建国 90.0
2 961103 李 宁 92.0
3 961202 赵 娜 89.0
4 961204 孙 亮 75.0
5 971110 赵 琳 92.0
6 971405 罗宇波 90.0
SELECT 2
USE SC
SELECT 1
USE ZFCJ
SET ORDER TO TAG 学号 && 指定主索引标识
UPDATE ON 学号 FROM SC REPLACE 总分 WITH 总分+A->成绩 RANDOM
一、选择题
1.若当前驱动器号是C,当前目录是\FoxPro\,要在C盘的USER目录下创建一个名为TEACHER的表,下面不正确的命令是________。
A)CREAT C:\USER\TEACHER.DBF
B)CREAT C:\USER\TEACHER
C)CREAT TEACHER
D)CREAT \USER\TEACHER
2.用DISPLAY命令显示数据时,若未指定<范围>,则________。
A)不停地显示表中的全部记录
B)显示当前一条记录
C)显示下一条记录
D)分屏显示表全部记录
思考题
3.修改表结构的命令是________。
A)MODIFY STRUCTURE B)EDIT STRUCTURE
C)CHANGE STRUCTURE D)BROWSE STRUCTURE
4.若要在表中真正删除记录,先用DELETE命令,再用________。
A)RECALL B)PACK
C)按ESC键 D)不用其他命令
5.若对已有记录的表文件STUD.DBF使用命令
USE STUD
GO 1
BOF( )
则显示结果是________。
A)0 B)1 C).F. D).T.
1.设计一张二维表。
2.建立一个数据表。
3.对已有的表进行数据输入、记录显示和修改、追加记录等操作。
4.对已有的表进行逻辑删除记录和物理删除记录操作。
实验题(共38张PPT)
第10章
数据库应用系统开发
目 录
上一页
下一页
退 出
本 章 要 点
10.1数据库应用系统开发过程
10.2调试技术
10.3容错技术
10.4应用程序发布
10.1 数据库应用系统开发过程
10.1.1数据库应用系统的开发步骤
1.可行性分析
2.需求分析
3.数据设计
4.应用程序设计
5.测试
6.维护
10.1.2 构造应用程序框架
(1)设置应用程序起始点
在项目管理器中设置主文件的方法为:单击要设置为主文件的程序或表单或菜单文件,从【项目】菜单或快捷菜单中选择【设置主文件】选项。
(2)初始化环境
(3)显示初始的用界面
(4)控制事件循环
(5)恢复初始的开发环境
(6)组织主程序文件
【例10-2】为本书中的学生成绩管理系统设计一个主程序(MAIN.PRG),并设置为主文件
【例10-2】为本书中的学生成绩管理系统设计一个主程序(MAIN.PRG),并设置为主文件。
MAIN.PRG代码如下:
DO start.PRG && 调用程序建立环境设置(在公 有变量中保存值)
DO form MAINFORM && 将例9-3设计的带菜单的顶层表单作为初始的用户界面显示
READ EVENTS && 建立事件循环。
DO CLEANUP.PRG && 在退出之前,恢复环境设置
Start.PRG中代码如下:
Public cTalkVal && 定义全局变量
IF SET (‘TALK’)=”ON”
SET TALK OFF
cTalkVal=“ON” && 保存SET TALK设置
ELSE
cTalkVal=“ON”
Endif
Open database student && 打开数据库
Application.visible=.F. && 隐藏Visual FoxPro主窗口
CLEANUP.PRG中代码如下:
set talk &ctalkval && 恢复SET TALK设置
close database && 关闭数据库
clear all windods && 释放所有窗口
Application.visible=.T. && 显示Visual FoxPro主窗口
10.1.3 使用项目管理器组织与管理文件
1.创建一个项目
(1)在系统菜单中单击【文件】|【新建】,此时系统将弹出新建对话框。
(2)在“新建”对话框的“文件类型”中选择“项目”,单击“新建文件”按钮。
(3)在弹出的“创建”对话框中输入项目的名称,并选择保存项目的目录后单击“保存”按钮。这时就新建成了一个项目并打开了项目管理器。在项目管理器中创建各类文件的方法在前面各章节中均有介绍,在此不再细述,本节仅介绍项目管理器的文件管理功能。
2.添加和移去文件
① 从项目中选定要移去的文件或对象。
② 单击“移去”按钮;系统将弹出如图所示对话框。
③ 如果单击“移去”按钮,将从项目中移去该文件或对象;如果单击“删除”按钮,将从项目中移去该文件或对象,并将文件从磁盘上永久性地删除。
3.创建及修改文件
(1)选定要创建的文件类型。
(2)单击“新建”按钮或“修改”按钮,即可激活Visual FoxPro 相应的设计器或向导。例如,要修改一个表,只需选定该表的名称,用通过鼠标指针双击或单击“修改”按钮,即可进入“表设计器”显示该表结构。
4.为文件添加说明
通过设置出现在项目管理器中的文件说明信息,可更方便地跟踪文件。其方法是:
(1)在项目管理器中选定所需的文件。
(2)选择“项目”菜单中的“编辑说明”命令。
(3)在弹出的“说明”对话框中键入该文件的说明信息。
(4)单击“确定”按钮。
5.设置文件的包含或排除属性
6.编辑或查看项目信息
在系统菜单中选择【项目】|【项目信息】命令,打开如图所示对话框。
编辑项目信息:在项目信息对话框中,单击项目选项卡,可以查看或编辑作者有关信息
单击文件选项卡,可以一次性查看所有的项目文件
10.1.4 项目连编
1.测试项目
在项目管理器中,单击“连编”按钮。系统将弹出如图所示的连编选项对话框。
在“连编选项”对话框中,选择“重新连编项目”
3.连编一个应用程序
若要连编一个应用程序,可使用BUILD APP或BUILD EXE命令。或者进行如下操作。
(1)在项目管理器中,单击“连编”按钮。
(2)在“连编选项”对话框中,选择“连编应用程序”,生成.app文件;或者选择“连编可执行文件”以建立一个.exe文件。
(3)选择所需其他选项并单击“确定”按钮。
当为项目建立一个最终的应用程序文件之后,就可运行了
4.运行.app应用程序
要运行.app应用程序,可从“程序”菜单中选择“运行”命令,然后选择要执行的应用程序;或者在“命令”窗口中,键入DO和应用程序文件名。
例如,要运行应用程序“项目1”,可键入:
DO 项目1.app
5.运行.exe文件
如果从应用程序中建立一个.exe文件,可以使用如几种方法运行该文件:
(1)从Visual FoxPro中,从“程序”菜单中选择“运行”,然后选择一个应用程序文件;
(2)在Windows中,双击该.exe文件的图标
10.2 调试技术
10.2.1 建立测试环境
1.硬件和软件问题
为了获得最大的可移植性,应当在预期运行的最底层平台上开发应用程序。要保证应用程序能在满足最低要求的平台上正常工作,应该做到以下几点:
(1)使用最低层常用的视频方式开发应用程序。
(2)确定最低所需的RAM以及存储介质的空间大小,其中应包括必需的驱动程序以及同时运行的软件所占用的空间。
(3)对于应用程序的网络版,还应考虑内存、文件和记录锁定特殊要求。
2.系统路径和文件属性
为了在运行应用程序的每台机器上都能够快速访问所有必需程序文件,可能需要确定一个基本文件配置。在定义基本配置时,应考虑下列问题:
(1)应用程序是否需要公用系统路径。
(2)设置的文件存取属性是否合适。
(3)为每个用户设置的网络权限是否正确
3.目录结构和文件位置
如果源代码引用的是绝对路径或文件名,那么当应用程序安装到任何其他机器上时必须存在相同的路径和文件。若要避免这一情况,可采用以下方法:
(1)使用Visual FoxPro配置文件。
(2)另建一个目录或目录结构,将源文件和生成的应用程序文件分开。这样就可以对应用程序的相互引用关系进行测试,并且准确地知道在发布应用程序时应包含哪些文件。
(3)使用相对路径。
10.2.2 设置验证的内容
在代码中可以包含验证的内容,其作用是验证代码运行环境的假设情况。
若要设置验证的内容,使用ASSERT命令标明程序中的假设。
当ASSERT命令中所规定的条件为“假”(.F.)时,将显示一个提示信息对话框,同时在“调试输出”窗口中反映出来。
例如,可以编写一个函数,函数需要一个非0的参数值。如果参数为0时,下面的函数代码将提醒用户:
ASSERT nParm!=0 MESSAGE“接受的参数数值为0”。
可以使用SET ASSERTS命令指定是否显示提示信息,默认情况下,不显示提示信息。
10.2.3 在调试器中调试程序
1.打开调试器
选择【工具】|【调试器】命令。“调试器”窗口是一个独立运行的窗口,它有自己的菜单和工具栏,在“调试器”窗口中可有选择地打开5个子窗口:跟踪、监视、局部、调用堆栈和调试输出。如图所示
2.跟踪代码
在调试中,最有用的方法就是跟踪代码,以此观察每一行代码的运行,同时检查所有的变量、属性和环境设置值,如图所示
1、如果“跟踪”窗口没有打开,在调试窗口的菜单栏中选择【窗口】|【跟踪】命令
2、在调试窗口的菜单栏中选择【调试】|【运行】命令。打开要调试的程序
3、在调试窗口的菜单栏中选择【调试】|【单步】命令(或F6键),或选择【调试】|【单步跟踪】命令(F8键)
3.设置断点
(1)在特定代码行设置断点
在“跟踪”窗口中,找到需要设置断点的那一行,并将光标放置在该代码行上
按下F9键或者单击“调试器”工具栏上的“切换断点”按扭。
或者双击该行代码行左边的灰色区域,该代码行左边的灰色区域中会显示一个实心点,这表明在该行已经设置一个断点。
如果正在调试对象,那么,通过从对象列表中选择对象,从过程列表中选择所需方法程序或事件,就可以在“跟踪”窗口中找到特定的代码行
(2)在文件指定位置设置断点
在调试窗口中选择【工具】|【断点】命令,打开“断点”对话框
1、在“类型”列表框中选择“在定位处中断”
2、在“定位”和“文件”输入框中指定所需断点的位置和文件来设置断点
4.移去断点
在“断点”对话框中,单击断点列表框中某断点左侧的复选框可使该断点无效,单击“删除”按钮可删除选定的断点。
在“跟踪”窗口中,双击断点标记可以删除该断点。
5.查看存储元素的值
(1)在“局部”窗口中查看变量的值
“局部”窗口会显示调用堆栈上的任意程序、过程或方法程序里所有的变量、数组、对象和对象元素,如图所示。默认情况下,在“局部”窗口中所显示的是当前执行程序中的变量值
通过在“位置”列表中选择程序或过程,也可以查看其他程序或过程中的变量值
(2)在“监视”窗口中查看变量的值
在“监视”窗口的“监视”框中,键入任意一个有效的Visual FoxPro表达式,然后按下回车键。这时,该表达式的值和类型就会出现在“监视”窗口的列表中。如图所示
若要从“监视”窗口中移去某监视项,选择该项,然后按DEL键;或者从快捷菜单中,选择“删除监视”
(3)在“跟踪”窗口中查看变量值
在“跟踪”窗口中,将光标定位到任何一个变量、数组或属性上,就会出现提示条,并显示它的当前值
6.查看事件发生的序列
若要跟踪事件,可按如下操作:
在调试窗口的菜单中选择【工具】|【事件跟踪】命令。打开如图所示的跟踪对话框。
② 选择要跟踪的事件:系统默认的跟踪事件为Visual FoxPro系统定义的所有事件,用户可从“跟踪事件”列表中选择不跟踪的事件,并单击中部的左箭头按钮将其加入“可用事件”列表中
③ 启动事件跟踪:选中“开启事件跟踪”复选框,便可激活事件跟踪
④ 选择跟踪输出去向
10.3 容错技术
10.3.1 处理运行时刻错误
“运行时刻错误”是指在应用程序开始执行后由于环境的变化而引发的错误
函数或命令
说明
AERROR(数组)
创建一个数组,存储最近的错误信息。
ERROR N
产生指定的错误(错误号为N),以测试自己的错误处理程序
ERROR()
返回一个错误编号
MESSAGE([1])
返回一个错误信息字符串,或错误代码行
ON ERROR [命令]
当错误发生时,执行一个命令
PROGRAM()或SYS(16)
返回当前执行程序的名称
RETRY
重新执行前一个命令。
处理“运行时刻错误”有效的函数和命令
10.3.2 防止运行时刻错误的发生
要防止“运行时刻错误”的发生,首先需要预见错误可能会在何处发生,然后针对可能发生错误的代码进行修改
【例10-3】运行时打开STUD表,如果表不存在,显示出错信息。
不能容错的代码:
USE STUD
能容错的代码:
IF FILE(‘stud’)
USE stud
Else
MESSAGEBOX("打开表错误",0,"提示")
ENDIF
10.3.3 处理运行时错误
有时不能预见所有可能发生的错误,也许不想这样做。这时,我们就需要利用Visual FoxPro提供的错误捕获功能:
ON ERROR DO
一般情况下,可将有可能出现运行时错误的代码放在ON ERROR DO <错误处理过程>和ON ERROR之间
要中止ON ERROR DO 错误捕获功能,可执行不带任何参数的ON ERROR命令,将错误信息重置为Visual FoxPro的内置错误信息
如果在代码中用ON ERROR DO 命令启动了Visual FoxPro的错误捕获功能,在后续代码中发生任何运行时错误,系统都会执行中的代码,然后跳过错误代码行,接着执行错误代码行的下一语句。如果希望重新执行错误行代码,可使用RETRY命令
【例10-4】假若系别表(DEP)的代号字段被定义为主关键字,如果用SQL语句向系别表(DEP)插入一条新记录,可用命令:
DEPNO=’02’
INSERT INTO DEP VALUES(&DEPNO,’中文系’)
如果DEP表中已有代号为“02”的记录,这条命令在运行时就会发生错误。
为了处理这类错误,可将代码修改为:
DEPNO=’02’
ON ERROR DO ERRORPROC
INSERT INTO DEP VALUES(&DEPNO,’中文系’)
ON ERROR
ERRORPROC.PRG
nAnswer=MESSAGEBOX(‘关键字冲突,插入记录失败’,2+48+512,”错误”)
DO CASE
CASE nAnswer=3     && 退出
CANCEL
CASE nAnswer=4 && 重试
*修改DEPNO 
RETRY
OTHERWISE        && 忽略
RETURN
ENDCASE
10.3.4 处理类和对象中的错误
当方法程序代码中出错时,Visual FoxPro将检查和该对象的Error事件相关的错误处理代码。如果在该对象的Error事件上没有代码,则将从父类或高于该类的其他类中执行Error事件的代码。如果在该类的层次结构中,找不到Error事件代码,Visaul FoxPro将检查ON ERROR 例程。如果ON ERROR例程不存在,Visual FoxPro则显示默认的错误信息
10.4 应用程序发布
10.4.1 制作发布盘前的准备工作
1.创建发布盘的步骤
① 创建发布目录。
② 把应用程序文件从项目中复制到发布目录的适当位置。
③ 创建发布盘
2.创建发布目录
发布目录用来存放构成应用程序的所有项目文件的副本。发布目录树的结构也就是由“安装向导”创建的安装程序将在用户机器上创建的文件结构。如图所示
若要创建发布目录可按如下步骤进行:
① 创建目录,目录名为希望在用户机器上出现的名称。
② 把发布目录分成适合于应用程序的子目录。
③ 把应用程序项目中的文件复制到相应目录中。应用程序(.exe)必须放在该树的根目录下,如VFP。
3.创建发布盘
创建发布盘时,“安装向导”压缩发布目录树中的文件,并把这些压缩过的文件复制到磁盘映射目录,每个磁盘放置在一个独立的子目录中。用“安装向导”创建应用程序磁盘映射之后,就把每个磁盘映射目录的内容复制到一张独立的磁盘上。
在软件发布后,用户通过运行“磁盘1”上的Setup.exe程序,便可安装应用程序的所有文件
10.4.3 用安装向导创建发布盘
从系统菜单中选择【工具】|【向导】|【安装】命令
指定发布树
选择可选组件
指定磁盘映像
自定义安装对话框
指定默认文件的安装目的地
查看文件总结报告
完成安装向导过程(共29张PPT)
第8章
菜单设计与应用
目 录
上一页
下一页
退 出
本 章 要 点
9.1 菜单系统
9.2 创建应用系统菜单
9.3 快捷菜单设计
9.4 工具栏
9.1 菜单系统
9.1.1 菜单系统的结构
各个应用程序的菜单系统内容可能是不同的,但其基本结构是相同的。菜单系统均由四大部分组成:
菜单栏(Menu Bar) 、菜单标题(Menu Title) 、菜单(Menu):
菜单项(Menu Item) 。如图9-1所示。
9.1.2 菜单系统的设计
 要为一应用程序创建一套菜单系统,通常按照以下步骤进行:
 1.规划与设计菜单系统
 2. 创建菜单和子菜单
 
3. 菜单系统指定任务
4. 生成菜单程序
菜单与表单不同,它不能直接在设计器中生成程序代码。而必须专门生成菜单程序代码。在设计器中所做的一切将被保存在一个带.MNX扩展名的文件中,在这个文件中保存了有关菜单系统的所有信息,它实际上就是一个表文件。从“菜单”菜单上选择“生成”命令,生成的菜单程序,扩展名为MPR。
5.运行及测试菜单系统
9.2.1“菜单设计器”的使用
在Visual ForPro中,采用以下三种方式进入菜单设计器:
使用“项目管理器”。即从项目管理器中选择“其他”选项卡,然后选择“菜单”,并单击“新建”按钮。
使用“文件”菜单中的“新建”命令,选择“菜单”;然后再选择“新建文件”。
使用CREATE MENU命令。
系统弹出如图9-2所示的“新建菜单”对话框,该对话框中有两项选择:菜单、快捷菜单,现选择“菜单”,屏幕即进入“菜单设计器”的界面,如图9-3所示。
9.2 创建应用系统菜单
“菜单设计器”的界面由以下几部分构成:
(1)“菜单名称”框
在此栏里输入显示在菜单系统中的菜单的标题或菜单项的名称。如果用户想为菜单项加入访问鍵,即利用键盘访问菜单的方法,可以在欲设定为访问鍵的字母前面加上一反斜杠和小于号(\<)。例如,在“文件”菜单中设计访问键为“F”,只要在菜单名称“文件”的后面加上“(\(2)“结果”栏
此栏选定菜单项的功能类别。单击该栏将出现一个下拉框,有命令、子菜单、过程和填充名称或菜单项等四种选择。
(3)“选项”按钮
单击该按钮将打开一个“提示选项”对话框,如图9-4所示,可在其中为各菜单项设置各种属性。
(4) 菜单级
菜单系统是分级的,最高一级是菜单栏里的菜单,其次是每个菜单下的子菜单。从该下拉列表框中选择适当菜单级可以进行相应菜单的设计。
(5)“菜单项”命令按钮
提供设计菜单时的操作功能。在菜单项选项组中有三个命令按钮,即:插入、删除、插入栏。
(6)预览
显示所创建的菜单。一旦启动了菜单设计器,Visual FoxPro的系统菜单会多出一项 “菜单”,该菜单中集成了与菜单设计相关的菜单项,如图所示。
9.2.2 应用系统菜单设计
现以一个简单的学生管理系统的菜单(表9-1)为例说明使用菜单设计器的一般方法。
1.创建主菜单
例9.1 建立一个菜单文件,其名定义为“stu_menu”,其主菜单包含“系统管理”、“数据输入与维护”、“查询”、“报表”和“帮助”5个菜单选项。
操作步骤如下:
(1) 打开“文件”菜单,选择“新建”,进入“新建”窗口。
(2) 在“新建”窗口,单击“菜单”,再按“新建文件”按钮,进入“新菜单”窗口。如图9-2所示
(3) 在“新菜单”窗口,选择“菜单”,进入“菜单设计器”窗口
(4) 在“菜单设计器”窗口,定义主菜单中各菜单选项名。如图9-6所示。
(5) 保存菜单文件,文件名为“stu_menu.mnx”。
2. 创建子菜单
  创建子菜单,实际上是给主菜单定义子菜单选项。当菜单栏内的菜单添加完成后,可以针对每一个菜单单击“创建”按钮来录入下一级菜单。一旦进入下一级菜单的设置,在“菜单级”框中显示的就不是“菜单栏”了,而是该下级菜单所对应的名称。
例9.2 给“stu_menu.mnx”中各菜单选项创建子菜单。
操作步骤如下:
(1) 打开菜单,进入“菜单设计器”窗口。
(2) 在“菜单设计器”窗口,选择主菜单选项中的“系统管理”,再选择“创建”按钮,进入“菜单设计器”子菜单编辑窗口。
(3) 在“菜单设计器”子菜单编辑窗口,定义“系统管理”选项中各子菜单选项名,如图9-7所示。
(4) 在“菜单设计器”子菜单编辑窗口,定义“数据输入与维护”选项中各子菜单选项名。如图9-8所示。
(5) 将以上菜单用“stu_menu”为名保存在相应的文件夹中,结束创建子菜单的操作。
3. 为菜单或菜单项指定任务 
在创建菜单系统时,需要考虑系统访问的简便性,必须为菜单和菜单项指定所执行的任务,如指定访问键、添加键盘快捷鍵、显示表单、工具栏以及其他菜单系统。菜单选项的任务可以是子菜单、命令或过程。
注意:如果预计在若干个地方都会使用同样一组命令,则应编写一个过程。该过程必须在菜单清理代码或其他菜单、对象能引用的位置明确命名和编写。现以学生管理系统菜单为例对该菜单指定任务,有关菜单所指定的任务参见表9-2。
为菜单项“退出”定义过程代码。
单击菜单项的“创建”按钮,打开过程编辑器输入如下代码:
CLOSE DATABASE ALL
SET SYSMENU TO DEFAULT &&恢复系统菜单
CANCEL
4. 设置常规选项与菜单选项
(1)“常规选项”对话框
“常规选项”是针对整个菜单的,它的主要作用:
其一,为整个菜单指定一个过程。
其二,可以确定用户菜单与系统菜单之间的位置关系。
其三,为菜单增加一个初始化过程和清理过程。
选择“显示”菜单中的“常规选项”命令,屏幕会出现图9-10所示的“常规选项”对话框。
(2)“菜单选项”对话框
当选择“查看”菜单中的“菜单选项”,显示如图9-11所示的“菜单选项”对话框。该对话框中主要有两具功能:
一是为指定的菜单编写一个过程;
二是修改菜单项的名称。
5. 保存菜单
在菜单设计过程中,可以随时使用“预览”按钮预览所设计的菜单。菜单设计完成后,单击“文件”菜单中的“保存”按钮,结果保存在菜单定义文件stu_menu.mnx和备注文件stu _menu.mnt中。
6.生成菜单程序
用“菜单设计器”设计的菜单文件其扩展名为.MNX,通过生成器的转换,生成的菜单文件其扩展名为.MPR。
当.MNX类型文件转换成.MPR类型文件后,才可使用DO命令调用菜单文件。操作步骤如下:
(1) 打开菜单(扩展名为.MNX)进入“菜单设计器”窗口;
(2) 单击【菜单】|【生成】菜单项,打开“生成菜单”对话框,如图9-13所示;
(1) 输入菜单文件名(扩展名为.MPR),生成对应的菜单程序文件。
7.运行菜单
  三种方式:
(1)菜单方式:单击【程序】|【运行】菜单项,并选择需运行的菜单程序文件名;
(2)命令方式:在命令窗口直接输入DO <菜单文件名.MPR>命令;
(3)项目管理器方式:在“项目管理器”中选择相应菜单文件并单击“运行”按钮。
9.2.3 在顶层表单中添加菜单
若要在顶层表单中添加菜单,可以按以下步骤操作:
(1)在“常规选项”对话框中选择“顶层表单”复选框,创建顶层表单的菜单;
(2)将表单的ShowWindow属性设置为“2-作为顶层表单”;
(3)在表单的Init事件中,运行菜单程序并传递两个参数:
DO <文件名> WITH oForm , IAutoRename
【例9-3】在student.scx表单中建立一个如图9-14所示的菜单。
操作步骤如下:
(1)打开stu_menu.mnx菜单文件;
(2)单击【显示】|【常规选项】菜单项,在“常规选项”对话框中选择“顶层表单”复选框;
(3)单击“保存”按钮保存设计的菜单;
(4)单击【菜单】|【生成】菜单项,打开“生成菜单”对话框;
(5)在“生成菜单”对话框中确定菜单程序保存位置,单击“生成”按钮;
(6)打开表单文件student.scx,并将其表单的ShowWindow属性设置为“2-作为顶层表单”;
(7)在表单的Init事件代码中添加调用菜单程序的命令:
DO stu_menu.mpr WITH THIS,.t.
9.3 快捷菜单设计
创建快捷菜单与创建下拉菜单的方法类似,主要步骤如下:
(1)打开“快捷菜单设计器”窗口。单击【文件】|【新建】|【菜单】|【新建文件】|【快捷菜单】菜单项或按钮,打开“快捷菜单设计器”窗口,其界面及使用方法与“菜单设计器”窗口完全相同。如图9-15所示;
(2)添加菜单项;
(3)为每个菜单项指定任务;
(4)在快捷菜单的“清理”代码中添加清除菜单的命令,使得在选择、执行菜单命令后能及时清除菜单,释放其所占用的内存空间。命令格式如下:
 RELEASE POPUPS <快捷菜单名> [EXTENDED]
(5)保存菜单,并生成.MPR菜单文件;
(6)将快捷菜单指派给某个对象,只需为该对象的“RightClick”事件编写如下代码:DO <快捷菜单程序文件名>,其中文件的扩展名.MPR不能省略。
【例9-4】为编辑框控件创建快捷菜单。
操作步骤:
(1)打开“快捷菜单设计器”窗口,定义快捷菜单各选项的内容,如图9-16所示;
(2)单击【显示】|【常规选项】菜单项,打开“常规选项”对话框;
(3)选择“设置”复选框,打开“设置”代码编辑窗口,在窗口中输入接受当前表单对象引用的参数语句:PARAMETERS myform;
(4)选择“清理”复选框,打开“清理”代码编辑窗口,在窗口中输入清除快捷菜单的命令:
RELEASE POPUPS kjcd;
(5)保存菜单,并生成kjcd.mpr菜单文件;
(6)打开需要设置快捷菜单的表单,并将其“RightClick”事件代码设置成调用快捷菜单程序的命令。
9.4 工具栏
 在许多应用软件中都有自己的工具栏。设置工具栏的主要目的是为方便用户操作。
1.定制系统工具栏
定制系统工具栏的操作步骤:
(1)打开需定制设置的系统工具栏,如“报表设计器”工具栏;
(2)单击【显示】|【工具栏】菜单项,打开“工具栏”对话框;
(3)单击“定制”按钮,打开“定制工具栏”对话框,如图9-18所示。在“分类”列表框选择某类工具栏,“按钮”栏显示相关的所有按钮,选中某个按钮后,“说明”栏显示该按钮的相关说明文本;
(4)定制设置工具栏。
(5)工具栏定制完成,单击“关闭”按钮。
2. 创建新的工具栏
可以为Visual FoxPro创建新的系统工具栏,操作步骤如下:
(1) 单击图9-17中“新建”按钮,打开如图9-20所示“新工具栏”对话框;
(2) 输入新工具栏名称如“我的工具栏”,单击“确定”按钮;
(3) 屏幕出现新建的“我的工具栏”工具栏(没有一个按钮),同时打开“定制工具栏”对话框;
(4) 将相关按钮拖到该工具栏,创建、设置对应的功能按钮;
(5)完成后单击“关闭”按钮,新建的“我的工具栏”如图9-21所示。(共73张PPT)
第七章
表单设计与应用
本 章 要 点
面向对象的概念
建立表单
管理表单
运行表单
常用表单控件
面向对象的概念
1。对象(Object)
客观世界里的任何实体都可以被看作是对象。对象可以是具体的物,也可以指某些概念。
从编程的角度来看,对象是一种将数据和操作过程结合在一起的数据结构,或者是一种具有属性(数据)和方法(过程和函数)的集合体。事实上程序中的对象就是对客观世界中对象的一种抽象描述
(1)对象属性:属性用来表示对象的状态。
(2)对象方法:对象方法是描述对象行为的过程。
2.类
类是对一类相似对象的性质描述,这些对象具有相同种类的属性以及方法
3.子类与继承
在面向对象的方法里,继承是指在基于现有的类创建新类时,新类继承了现有类里的方法和属性。此外,可以为新类添加新的方法和属性。我们把新类称为现有类的子类,而把现有类称为新类的父类。 一个子类的成员一般包括:
(1)从其父类继承的属性和方法。
(2)由子类自己定义的属性和方法。
Visual FoxPro基类
Visual FoxPro基类是系统本身内含的,并不存放在某个类库中。用户可以基于基类生成所需要的对象,也可以扩展基类创建自己的子类
在程序设计中,可以使用CREATEOBJECT函数来直接生成基于某个类的对象。该函数的格式如下:
CREATEOBJECT(<类名>[,<参数1>,<参数2>,……])
函数基于指定的类生成一个对象,并返回对象的引用
Visual Foxpro基类 列表
类名
含义
类名
含义
ActiveDoc
活动文档
Label
标签
CheckBox
复选框
Line
线条
Column
(表格)列
Listbox
列表框
ComboBox
组合框
Olecontrol
OLE容器控件
CommandButton
命令按钮
Oleboundcontrol
OLE绑定控件
CommandGroup
命令按钮组
OptionButton
选项按钮
Container
容器
Optiongroup
选项按钮组
Contorl
控件
Page

Custom
定制
PageFrame
页框
EditBox
编辑框
ProjectHook
项目挂钩
Form
表单
Separator
分隔符
FormSet
表单集
Shape
图形
Grid
表格
Spinner
微调控件
Header
(列)标头
TextBox
文本框
HyperLink
超级链接
Timer
定时器
Image
图象
ToolBar
工具栏
对象属性访问以及对象方法调用的基本格式如下:
<对象引用>.<对象属性>
<对象引用>.<对象方法>[(参数列表)]
【例7-1】基于Visual FoxPro的FORM类生成一个对象,然后访问该对象的一些属性和方法。
Oform=CREATEOBJECT("Form") &生成一个空白表单
Oform.show &&显示表单
Oform.caption=”演示” &&修改表单的标题
?”这是一个生成对象的演示程序” &&在表单上输出字符串
Oform.release
7.2.2 容器与控件
Visual FoxPro 中的类一般可分为两种类型:容器类和控件类。相应地,可分别生成容器(对象)和控件(对象)。
容器可以被认为是一种特殊的控件,它能包容其他的控件或容器
控件是一个可以以图形化的方式显示出来,并能与用户进行交互的对象,控件类不能包含其它对象
(1)绝对引用:从最高容器开始逐层向下直到某个对象为止的引用称为绝对引用
(2)相对引用:从正在为编写事件代码的对象出发,通过逐层向高一层或低一层直到另一对象的引用称为相对引用
使用相对引用常用到表7-2所列属性或关键字
【例】如果Form1中有一个命令按钮组commandgroup1,该命令按钮组有两个命令按钮:command1 和command2,label1是表单form1上的一个标签控件。
如果要在命令按钮command1的事件(如单击事件)代码中修改该按钮的标题可用下列命令:
this.caption=”确定”
如果要在命令按钮command1的事件代码中修改命令按钮command2的标题可用下列命令:
mandgroup1.command2.caption="取消"
或者
this.mand2.caption="取消"
但不能写成下列命令:
mand2. caption="取消"
如果要在命令按钮command1的事件代码中修改表单的标题可用下列命令:
This.Parent.parent.Caption=”测试窗口”
或者
thisform.caption=”测试窗口”
表7-2
属性或关键字
引用
Parent
当前对象的直接容器对象
This
当前对象
ThisForm
当前对象所在的表单
ThisFormSet
当前对象所在的表单集
7.2.3 事件
事件是一种由系统预先定义而由用户或系统发出的动作。事件作用于对象,对象识别事件并作出相应反应
与方法集可以无限扩展不同,事件集是固定的,用户不能定义新的事件
Visual FoxPro中常用事件有:
Load:当表单或表单集被加载到内存中时发生的事件。
Unload:从内存中释放表单或表单集时发生的事件。
Init:创建对象时发生的事件。
Destroy:从内存中释放对象时发生的事件。
Click:鼠标左键单击对象时发生的事件。
Dbclick: 鼠标左键双击对象时发生的事件。
Rightclick:鼠标右键单击对象时发生的事件。
GotFocus:对象接收到焦点时发生的事件。
LostFocus:对象失去焦点时发生的事件。
KeyPress:当用户按下或释放键时发生的事件。
InteractiveChange:以交互方式改变对象的值时发生的事件。
ProgrammaticChange:以编程方式改变对象的值时发生的事件。
建立表单
表单(Form)是Visual FoxPro提供的用于建立应用程序界面的最主要的工具之一。表单相当于WINDOWS应用程序的窗口
表单可以属于某个项目,也可以游离于任何项目之外,它是一个特殊的磁盘文件,其扩展名为.scx。在项目管理器中创建的表单自动隶属于该项目。创建表单一般有两种途径:
使用表单向导创建简易的数据表单;
使用表单设计器创建或修改任何形式的表单。
要 点
7.3.1 使用表单向导
启动表单向导有以下四种途径:
(1)打开“项目管理器”,选择“文档”选项卡,从中选择“表单”。然后单击“新建”按钮。在弹出的“新建表单”对话框中单击“表单向导”按钮。
(2)在系统菜单中选择【文件】|【新建】命令,或者单击工具栏上的“新建”按钮,打开“新建”对话框,在文件类型栏中选择“表单”。然后单击“向导”按钮。
(3)在系统菜单中选择【工具】|【向导】|【表单】命令。
(4)直接单击常用工具栏上的“表单向导”图标按钮。
按步骤依照“表单向导”完成一对多表表单的设计
7.3.2 使用表单设计器
启动表单设计器有多种方法:
● 菜单方法:若是新建表单,在系统 菜单中选择【文件】|【新建】,在文件类型对话框中选择“表单”,单击“新建文件”按钮;若是修改表单,则单击【文件】|【打开】,在打开对话框中选择要修改的表单文件名,单击“打开”按钮。
● 命令方法:在COMMAND窗口输入如下命令:
CREATE FORM <文件名> &创建新的表单

MODIFY FORM <文件名> &打开一个已有的表单
● 在项目管理器中,先选择文档标签,然后选择表单,单击新建按钮。若是修改表单,选择要修改的表单,单击“修改”按钮。
表单设计器环境介绍
(1)设计器窗口
“表单设计器”窗口内包含正在设计的表单。用户可在表单窗口中可视化地添加和修改控件、改变控件布局,表单窗口只能在“表单设计器”窗口内移动。以新建方式启动表单设计器时,系统将默认为用户创建一个空白表单,如图左侧部分。
(2)属性窗口
设计表单的绝大多数工作都是在属性窗口中完成的,因此用户必须熟悉属性窗口的用法。如果在表单设计器中没有出现属性窗口,可在系统菜单中单击【显示】|【属性】,属性窗口如图所示。
页框选项卡
“对象”下拉列表框图
属性设置框
(3)表单控件工具栏
设计表单的主要任务就是利用“表单控件”设计交互式用户界面。“表单控件”工具栏是表单设计的主要工具。默认包含21个控件、4个辅助按钮,如图所示
(4)表单设计器工具栏
打开“表单设计器”时,主窗口中会自动出现“表单设计器”工具栏,如图7-10所示
7.3.3 数据环境
1.打开数据环境设计器
表单设计器环境下,单击“表单设计器”工具栏上的“数据环境”按钮,或选择【显示】|【数据环境】命令,即可打开“数据环境设计器”窗口,此时,系统菜单栏上将出现“数据环境”菜单。
2.数据环境的常用属性
常用的两个数据环境属性是AutoOpenTables和AutoCloseTables
3.向数据环境添加表或视图在数据环境设计器环境下,按下列方法向数据环境添加表或视图:
在系统菜单中选择【数据环境】|【添加】命令,或右键单击“数据环境设计器窗口”,然后在弹出的快捷菜单中选择【添加】命令,打开“添加表或视图”对话框,如图所示。如果数据环境原来是空的,那么在打开数据环境设计器时,该对话框就会自动出现。
选择所需表,单击“添加”
4.从数据环境中移去表或视图
在“数据环境设计器”窗口中,选择要移去的表或视图,在系统菜单中选择【数据环境】|【移去】命令。也可以用鼠标右键单击要移去的表或视图,然后在弹出的快捷菜单中选择【移去】命令。
5.在数据环境中设置关系
设置关系的方法为:将主表的某个字段(作为关联表达式)拖曳到子表的相匹配的索引标记上既可。如果子表上没有与主表字段相匹配的索引,也可以将主表字段拖动到子表的某个字段上,这时应根据系统提示确认创建索引
常用的关系属性有:
● RelationalExpr:用于指定基于主表的关联表达式。
● ParentAlias:用于指明主表的别名。
● ChildAlias:用于指明子表的别名。
● ChildOrder:用于指定与关联表达式相匹配的索引。
● OneToMany:用于指明关系是否为一对多关系,该属性默认为“.F.”,如果关系为“一对多关系”,该属性一定要设置为“.T.”。
7.3.4 快速表单
调用表单生成器的方法有以下三种:
(1)在系统菜单中选择【表单】|【快速表单】命令。
(2)单击“表单设计器”工具栏中的“表单生成器”按钮。
(3)右击表单窗口,然后在弹出的快捷菜单中选择“生成器”命令。
采用上面任意一种方法后,系统都会打开“表单生成器”对话框,如图所示。
选择所需字段,加到“选择字段列表中”
7.4 管理表单
1.表单常用属性
属性
描述
默认值
AlwaysOnTop
指定表单是否总是位于其它打开窗口之上
.F.
AutoCenter
居中显示
.F.
BackColor
指定表单窗口的背景颜色
255,255,255
BorderStyle
指定表单边框的风格。
3
Caption
显示于表单标题栏上的文本
Form1
Closable
决定表单的右上角的关闭按钮是否有效
.T.
DataSession
指定表单中的表是在全局能访问的工作区打开(设置值为1)还是在表单自己的工作区打开(设置值为2)
1
MaxButton
确定表单右上角是否有最大化按钮
.T.
MixButton
确定表单右上角是否有最小化按钮
.T.
Movable
确定表单是否能移动
.T.
Scrollbars
指定表单的滚动条类型。可取值为:0(无),1(水平)2(垂直)3(既水平又垂直)
0
WindowState
指定表单的状态:0(正常)1
(最小化),2(最大化)
0
WindowType
指定表单是模式表单(设置值为1)还是非模式表单(设置值为0)。在一个应用程序中,如果运行了一个模式表单,那么在关闭该表单之前不能访问应用程序中的其他表单
0
2.表单常用方法
(1)Relase方法:将表单从内存中释放。比如表单有一个命令按钮,如果希望单击该命令按钮时关闭表单,就可以在该命令按钮的Click事件中包含如下代码:
ThisForm.Release
表单运行时,用户单击表单右上角的关闭按钮,系统会自动执行Relase方法。
(2)Refresh方法:刷新表单。
(3)Show方法:显示表单。该方法将表单的Visible属性设置为.T.。
(4)Hide方法:隐藏表单。该方法将表单的Visible属性设置为.F.。与Relase方法不同,Hide只是把表单隐藏,但并不将表单从内存释放,之后可用Show方法重新显示表单。
3.表单常用事件
(1)Init事件:在表单创建时引发.
(2)Destroy事件:在表单对象释放时引发。
(3)RightClick事件:用鼠标右键单击表单时引发.
7.4.2 添加新的属性和方法
1.创建新属性
向表单添加新属性的步骤如下:
(2)在“名称”框中输入属性名称
(3)有选择地在“说明”框中输入新建属性的说明信息
(1)在系统菜单中选择【表单】|【新建属性】命令 ,打开“新建属性”对话框,如图7-13所示。
2.创建新方法
在表单中添加新方法的步骤如下:
(1)在系统菜单中选择【表单】|【新建方法程序】命令,打开如图 的“新建方法程序”对话框。
(2)在“名称”框中输入方法名。
(3)有选择地在“说明”框中输入新建方法的说明信息。
7.4.3 运行单表
1.在设计时运行表单
在设计时可采用以下方法运行表单文件:
(1)在项目管理器窗口中,选择要运行的表单,然后单击“运行”按钮。
(2)在表单设计器窗口中,在系统菜单中选择【表单】|【执行表单】命令,或单击常用工具栏上的“运行”按钮。
(3)在系统菜单中选择【程序】|【运行】命令,打开“运行”对话框,然后在运行对话框中选择要运行的表单文件,单击“运行”按钮。
(4)在命令窗口输入命令:DO FORM <表单文件名> 。
2.在程序中调用表单
在程序中调用表单可用下列命令:
DO FORM <表单文件名> [NAME 〈变量〉][LINKED] [WITH 〈实参1〉〈,实参2〉,…] [TO 〈变量〉] [NOSHOW]
● [NAME 〈变量〉]:如果包含NAME子句,系统将建立指定名字的变量,并使它指向表单对象。否则,系统将建立与表单文件名相同的变量,并使它指向表单对象。
● [LINKED]关键字:如果包含LINKED关键字,表单和表单对象变量将链接起来,这时,表单对象将随指向它的变量的清除而关闭(释放),否则,即使变量已经清除(如超出作用域,用RELEASE命令清除),表单对象依然存在。但不管有没有LINKED关键字,指向表单对象的变量并不会随表单的关闭而清除。
● [TO 〈变量〉]:用于从模式表单返回值。
● [WITH <参数列表>]:用于向表单传递参数。
● [NOSHOW]:如果包含NOSHOW关键字,表单运行时将不显示,直到将表单的Visible属性被设置为.T.,或者调用表单的Show方法。
7.4.4 表单与其它程序模块间的通信
1.将参数传递到表单
如果要将参数传递到表单,可按如下操作:
(1)在表单的INIT事件中,用PARAMETERS定义形参:
PARAMETERS param1,param2
(2)在表单的INIT事件中可以直接访问参数,如果在表单的其它方法或事件中需要使用该参数,必需在表单的INIT事件中将参数保存到表单的属性或变量中。
(3)运行表单时,使用带WITH子句的DO FORM命令,系统会将WITH子句的实参值传递到INIT事件代码的PARAMETERS子句中的各形参。
2.从表单返回值
只有模式表单可返回值。要从表单返回值可按如下操作:
(1)将表单的WINDOWTYPE属性设置为1,使表单成为模式表单,
(2)在表单的UNLOAD事件中代码中,包含一个带返回值的RETURN命令。
(3)运行表单时,在DO FORM命令中包含TO关键字。
3.直接访问表单对象
表单运行后,在其释放前可通过指向表单的变量访问表单对象及表单中所有控件对象。
7.4.5 使用表单集扩充表单
1.创始表单集
表单集是一个包含有一个或多个表单的容器。可在“表单设计器”中创建表单集,若要创建表单集,在系统菜单中选择【表单】|【创建表单集】命令。
2.添加和删除表单
添加:在系统菜单中选择【表单】|【添加新表单】命令。
删除:
(1)在“属性”窗口的对象列表框中,选择要删除的表单。
(2)在系统菜单中选择【表单】|【移除表单】命令。
如果表单集只有一个表单,可删除表单集而只剩下表单,方法:在系统菜单中选择【表单】|【移除表单集】命令。
7.5 常用表单控件
常用控件的公共属性
name:控件的名称,它是代码中访问控件的标识(表单或表单集除外)。
Fontname:字体名。
Fontbold:字体样式为粗体。
Fontsize:字体大小。
Fontitalic:字体样式为斜体。
Forecolor:前景色。
Height:控件的高度
Width:控件的宽度。控件的高度和控件的宽度,也可在设计时通过鼠标拖曳进行可视化调整。
Visible:控件是否显示。
Enable:控件运行时是否有效。如果为 .T.,则表示控件有效,否则运行时控件不可使用。
7.5.2 标签(Label)控件
1.标签控件的功能
标签主要用于显示固定的文本信息。
2.标签控件常用属性
caption: 指定标签的显示文本。可以在设计时设置,也可以在程序运时设置或修改。
forecolor:设置标题的字体颜色。
backstyle:设置标签的背景是否透明,0透明,1不透明,默认为不透明。
name :标签对象的名称,是程序中访问标签对象的标识。
Alignment:指定标题控件中显示的对齐方式。
7.5.4 命令按钮(CommandButton)控件
1.命令按钮控件功能
命令按钮典型地用来启动某个事件代码、完成特定功能,如关闭表单、移动记录指针、打印报表等。
2.命令按钮控件常用属性
Default:命令按钮的Default属性默认值为.F.,如果该属性设置为.T.,在该按钮所在的表单激活的情况下,按Enter,可以激活该按钮,并执行该按钮的Click事件代码。一个表单只能有一个按钮的Default属性为真。
Cancel:命令按钮的Cancel属性默认值为.F.,如果设置为.T.,在该按钮所在的表单激活的情况下,按Esc键可以激活该按钮,并执行该按钮的Click事件代码。一个表单只能有一个按钮的Cancel 属性为真。
Caption:设置按钮的标题。
Enable:确定按钮是否有效,如果按钮的属性Enable为.F.,单击该按钮不会引发该按钮的单击事件。
对命令按钮的使用最重要的是编写Click事件代码。
7.5.5 命令按钮组(CommandGroup)控件
1.命令按钮组功能
命令按钮组是包含一组命令按钮的容器控件,用户可以单个或作为一组来操作其中的按钮。
2.命令按钮组常用属性
Buttoncount:命令按钮组中命令按钮的数目。
Value:默认情况下,命令按钮组中的各个按钮被自动赋予了一个编号,如1,2,3,等,当运行表单时,一旦用户单击某个按钮,则Value将保存该按钮的编号,于是在程序中通过检测Value的值,就可以为相应的按钮编写特定的程序代码。如果在设计时,给Value赋予一个字符型数据,当运行表单时,一旦用户单击某个按钮,则Value将保存该按钮的Caption属性值。
Buttons:用于存取命令按钮组中每个命令按钮的数组,代码中可以通过该数组访问命令按钮组中的各个按钮.
7.5.3 文本框(TextBox)控件
1.文本框控件的功能:
(1)用于显示或接收单行文本信息(不设置ControlSource属性),默认输入类型为字符型,最大长度为256个字符。
(2)用于显示或编辑对应变量或字段的值(设置ControlSource属性为已有变量或字段名)。
2.文本框控件常用属性
ControlSource:设置文本框的数据来源。一般情况下,可以利用该属性为文本框指定一个字段或内存变量。
Value:保存文本框的当前内容,如果没有为ControlSource属性指定数据源,可以通过该属性访问文本框的内容。它的初值决定文本框中值的类型。如果为ControlSource属性指定了数据源,该属性值与ControlSource属性指定的变量或字段的值相同。
PassWordChar:设置输入口令时显示的字符。
Readonly:确定文本框是否为只读,为“.T.”时,文本框的值不可修改。
【例】创建一个如图7-14所示的登录窗口,并将表单保存为FORM2。
在确定按钮的单击事件中输入如下代码:
if thisform.text1.value="user1“ and thisform.text2.value="123456"
do form mainform
form2.release
else
messagebox("密码或用户名错误",0,"提示")
endif
在取消按钮的单击事件中输入如下代码:
nAnswer=messagebox("你决定退出系统吗?",4,"提示")
DO CASE
CASE nAnswer = 6
thisform.release
CASE nAnswer = 7
messagebox("请输入用户名和密码",0,"提示")
ENDCASE
7.5.6 编辑框(EditBox)控件
1.编辑框控件的功能
用于显示或编辑多行文本信息。编辑框实际上是一个完整的简单字处理器,在编辑框中能够选择、剪切、粘贴以及复制正文,可以实现自动换行,能够有自己的垂直滚动条。
2.编辑框常用属性
ControlSource:设置编辑框的数据源,一般为数据表的备注字段。
Value:保存编辑框中的内容,可以通过该属性来访问编辑框中的内容。
SelText:返回用户在编辑区内选定的文本,如果没有选定任何文本,则返回空串。
SelLength:返回用户在文本输入区中所选定字符的数目。
Readonly:确定用户是否能修改编辑框中的内容。
Scroolbars:指定编辑框是否具有滚动条,当属性值为0时,编辑框没有滚动条,当属性值为2(默认值)时,编辑框包含垂直滚动条。
7.5.7 复选框(CheckBox)控件
1.复选框的功能
用于标识一个两值状态,如真(.t.)或假(.f.)。当处于“真”状态时,复选框内显示一个对勾,当处于“假”状态时复选框内为空白。
2.复选框常用属性
Value:用来指明复选框的当前状态,如下表
ControlSource属性:用于指定复选框的数据源
属性值
说明
0或.F.
(默认值),未被选中
1或.T.
被选中
>=2或null
不确定,只在代码中有效
7.5.8 选项组(OptionGroup)控件
1.选项组控件的功能
选项组又称为选项按钮组,是包含选项按钮的一种容器。一个选项组中往往包含若干个选项按钮,但用户只能从中选择一个按钮。当用户单击某个选项按钮时,该按钮即成为被选中状态,而选项组中的其他选项按钮,不管原来是什么状态,都变为未选中状态,被选中的选项按钮中会显示一个圆点。
2.选项组常用属性
ButtonCount:指定选项组中选项按钮的数目。
Value:用于指定选项组中哪个选项按钮被选中。ControlSource:指定选项组数据源。
Buttons:用于存取选项组中每个选项的数组。
【例】命令按钮组、选项组、复选框、编辑框应用示例,按如图7-17设计一个表单,要求:用户单击确定按钮时,在编辑框中显示用户对选项组和复选框的选择。并将表单保存为FORM3
编写事件代码
选择命令按钮组,在属性窗口中双击“CLICK EVENT”属性,系统会打开代码编写器,在代码编写器窗口为“CLICK EVENT”事件输入如下代码:
if mandgroup1.value=2
thisform.release
else
cstr="你所在城市"+chr(13);
+thisform.optiongroup1.buttons[thisform.optiongroup1.value].caption+chr(13)
cstr=cstr+"你的爱好"+chr(13)
if thisform.check1.value=1
cstr=cstr+thisform.check1.caption
endif
if thisform.check2.value=1
cstr=cstr+thisform.check2.caption
endif
if thisform.check3.value=1
cstr=cstr+thisform.check3.caption
endif
thisform.edit1.value=cstr
endif
7.5.9 列表框(ListBox)控件
1.列表框的功能
列表框提供一组条目(数据项),用户可以从中选择一个或多个条目,一般情况下,列表框显示其中的若干条目,用户可以通过滚动条浏览其他条目。
2.选项组常用属性 :RowSourceType属性与RowSource属性:RowSourceType属性指明列表框数据源的类型,RowSource属性指定列表框的数据源 ,两者常用的搭配如表
RowSourceType属性值
RowSource属性
0-无
在程序运行时,通过AddItem方法添加列表框条目,通过RemoveItem方法移去列表框条目

1-值
列出在RowSource属性中指定所有数据项
可以是用逗号隔开的若干数据项的集合,例如,在设计时,在本属性框中输入:北京、上海、长沙、武汉
5-数组
列出数组的所有元素
使用一个已定义的数组名。
6-字段
列出一个字段的所有值
字段名
7-文件
列出指定目录的文件清单
磁盘驱动器或文件目录
8-结构
列出数据表的结构
表名
List属性:用以存取列表框中数据条目的字符串数组。例如,LIST[1]代表列表框中的第一行(第一个数据项)。
ListCount属性:列表框中数据条目的数目
ColumnCount属性:指定列表框的列数
Value属性:返回列表框中被选中的条目
ControlSource属性:该属性在列表框中的用法与在其他控件中的用法有所不同,在这里,用户可以通过该属性指定一个字段或变量用以保存用户从列表框中选择的结果
Selected属性:该属性是一个逻辑型数组,第N个数组元素代表第N个数据项是否为选定状态
MultiSelect属性:指定用户能否在列表框控件内进行多重选定
【例】列表框的应用:按下图设计一个表单。要求表单运行时,LIST1列表框显示STUD表的所有字段,单击左箭头按钮时,LIST1中选择的字段加入到LIST2中。
操作步骤:
① 按图7-19所示在表单中加入二个列表框、二个标签、二个命令按钮。
② 在表单的INIT事件中加入如下代码:
thisform.list1.value=0
thisform.list2.value=0
open database student
use stud
for i=1 to fcount()
thisform.list1.additem(fields(i))
next
close database
③ 在左箭头按钮(COMMAND1)的CLICK事件中加入如下代码:
thisform.list2.addlistitem(thisform.list1.listitem[thisform.list1.value])
thisform.list1.removeitem[thisform.list1.value]
右箭头按钮(COMMAND2)的CLICK事件代码请用户自己编写。
7.5.10 组合框(comboBox)控件
组合框与列表框类似,也是用于提供一组条目供用户从中选择,组合框和和列表框的主要区别在于:
(1)对于组合框来说,通常只有一个条目是可见的。用户可以单击组合框上的下拉箭头按钮打开条目列表,以便从中选择。
(2)组合框不提供多重选择的功能,没有MultiSelect属性。
(3)组合框有两种形式:下拉组合框(Style属性为0)和下拉列表框(Style属性为2)。对下拉组合框,用户既可以从列表中选择,也可以在编辑区输入。对下拉列表框,用户只可从列表中选择。
7.5.11 表格(Grid)控件
1.表格控件的功能:
表格控件用于浏览或编辑多行多列数据。
2.表格控件常用属性
RecordSourceType 和RecordSource属性:RecordSourceType指明表格数据源的类型, RecordSource属性指定数据的来源,它们取值及含义如表所示。
RecordSourceType属性值
RecordSource属性
0-表:数据来源由RecordSource属性指定的表,该表能被自动打开
表名
1-别名
数据来源于己打开的表
表的别名
2-提示
运行时,由用户根据提示选择表格数据源

3-查询
数据来源于查询
查询文件名
4-SQL语句
数据来源于SQL语句
SQL语句
ColumnCount:指定表格的列数
LinkMaster:用于指定表格控件中所显示的子表的父表名称
ChildOrader:指定子表的索引
RelationalExpr:确定基于主表字段的关联表达式
AllowAddNew:为真,运行时允许添加新记录,否则不能添加新记录
AllowRowSizing:为真,运行时用户可改变行高。
AllowHeaderSizing:为真,运行时用户可改变列宽。
3.常用的列属性
ControlSource:指定在列中显示的数据源.
CurrentControl:指定列对象中显示和接收数据的控件 .
Sparse:用于确定CurrentControl属性影响列中的所有单元格还是只影响活动单元格 .
注意:
设计时要设置列对象的属性,首先得选择列对象,选择列对象有两种方法:
①从属性窗口的对象列表中选择相应列,
②右击表格,在弹出的快捷菜单中选择【编辑】命令,这时表格进入编辑状态(表格的周围有一个粗框),用户可用鼠标单击选择列对象。
4.常用的标头(Header)属性
列标头也是一个对象,有它自己的属性、方法和事件,设计时要设置标头对象的属性,首先得选择标头对象,选择标头对象的方法与选择列对象的方法类似。
Caption属性:指定标头对象的标题文本,显示于列顶部。默认为对应字段的字段名。
Alignment属性:指定标题文本在对象中显示的对齐方式。
5.调整表格的行高和列宽
一旦指定了表格的列的具体数目,就可以有两种方法来调整表格的行高和列宽。
① 设置表格的HeaderHeight和RowHeight属性调整行高;设置列对象的Width属性调整列宽。
② 让表格处于编辑状态下,将鼠标指针置于表格两列的标头之间,这时,鼠标指针变为水平双箭头的形状,拖动鼠标,调整列至所需要的宽度;将鼠标置于表格左侧的第一个按钮和第二个按钮之间,这时,鼠标指针变成垂直双箭头的形状,拖动鼠标,调整行至所需要的高度。
6.使用表格生成器设计表格
用鼠标左键右击表格,在弹出的快捷菜单中选择【生成器】命令,打开“表格生成器”对话框,如图所示。
“表格项”选项卡:用于设置表格内显示字段
“样式”选项卡:指定表格的样式
“布局”选项卡:调整行高、列宽;设置列标题;选择控件类型
“关系”选项卡:设置一个一对多关系,指明父表中的关键字段与子表中的相关索引
页面控件
Pagecount:指定一个页框对象包含的页对象的数量。
Pages属性 存取页框中的某个页对象
Tabs:是否显示页面标签
Tabstretch:页面标题显示属性(0,1)
Activepage:返回页框中活动的页号(共38张PPT)
第4章
关系数据库标准语言SQL
目 录
上一页
下一页
退 出
本 章 要 点
4.1 SQL语言的基本概述
  4.2 数据定义
  4.3 数据操纵
  4.4 数据管理
 4.5 SQL中的数据查询语句
1.综合统一
SQL语言集数据定义(DDL)、数据操纵(DML)、数据管理(DCL)的功能于一体,语言风格统一,可以独立完成数据库的全部操作,包括定义关系模式、录入数据及建立数据库、查询、更新、维护数据、数据库的重新构造、数据库安全性等一系列操作的要求,为数据库应用系统开发者提供了良好的环境。
2.高度非过程化
3.面向集合的操作方式
4.以同一种语法结构提供两种使用方式
5.语言简洁,易学易用
4.1.1 SQL语言的特点
4.1.2 SQL语言的基本概念
  SQL语言支持关系型数据库的三级模式结构。其中外模式对应于视图(View)和部分基本表(Base Table),模式对应于基本表,内模式对应于存储文件。
  基本表是本身独立存在的表,在SQL语言中一个关系对应一个表。一些基本表对应一个存储文件,一个表可以带若干索引,索引存放在存储文件中。
  存储文件的逻辑结构组成了关系型数据库的内模式。而存储文件的物理文件结构是任意的。
  视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是说数据库只存放在视力的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。
  数据定义语言DDL用于执行数据定义的操作,如创建或删除表、索引和视图之类的对象。由CREATE、DROP、ALTER命令组成,完成数据库对象的建立(CREATE)、删除(DROP)和修改(ALTER)。
4.2.1 定义(创建)表
【格式】CREATE TABLE <表名> (<字段名1><数据类型>[(<宽度>[,<小数位数>])][完整性约束][NULL | NOT NULL][,<字段名2>…])
【功能】定义(也称创建)一个表。
4.2 数据定义
【例4-1】创建一个表STUD(学生信息表),它由以下字段组成:学号 (C,10);姓名(C,8);性别(C,2);班级名(C,10);系别代号(C,2);地址(C,50);出生日期 (D);是否团员 (L);备注 (M)。
CREATE TABLE STUD(学号C(10),姓名 C(10),性别 C(2),班级名 C(10),系别代号 C(2),地址 C(50),出生日期 D,是否团员 L,备注 M,照片 G)
LIST STRUCTURE
【例4-2】创建一个表SC(课程成绩表),它由以下字段组成:学号(C,10);课程号(C,2)。
CREATE TABLE SC(学号 C(10),课程号 C(2))
LIST STRUCTURE
【格式】ALTER TABLE <表名>[ADD <新字段名><数据类型>[(<宽度>[,<小数位数>])][完整性约束][NULL | NOT NULL]][DROP [完整性约束]][MODIFY <字段名><数据类型>]
【功能】修改表结构。
【说明】ADD子句用于增加指定表的字段变量名、数据类型、宽度和完整性约束条件;DROP子句用于删除指定的的完整性约束条件;MODIFY子句用于修改原有的字段变量的值。
【例4-3】在课程成绩表SC中,增加一个成绩字段变量(N,3)。
ALTER TABLE SC ADD 成绩 N(3)
LIST STRUCTURE
4.2.2 修改表
【格式】DROP DATABASE <数据库名>
【功能】删除指定数据库的结构和数据。
【说明】谨慎使用。
4.2.4 删除表
【格式】DROP TALBE <表名>
【功能】删除指定表的结构和内容(包括在此表上建立的索引)。
【说明】如果只是想删除一个表中的所有记录,则应使用DELETE语句。
4.2.3 删除数据库
数据操纵语言是完成数据操作的命令,一般分为两种类型的数据操纵,它们统称为DML:
● 数据检索(常称为查询):寻找所需的具体数据。
● 数据修改:添加、删除和改变数据。
数据操纵语言一般由INSERT(插入)、DELETE(删除)、UPDATE(更新),SELETE(检索,又称查询)等组成,由于SELETE比较特殊,所以一般又将它以查询(检索)语言单独出现。
4.3 数据操纵
【格式1】INSERT INTO <表名> [<字段名表>] VALUES (<表达式表>)
【格式2】INSERT INTO <表名> FROM ARRAY <数组名> | FROM MEMVAR
【功能】在指定的表文件末尾追加一条记录。格式1用表达式表中的各表达式值赋值给<字段名表>中的相应的各字段。格式2用数组或内存变量的值赋值给表文件中各字段。
【说明】如果某些字段名在INTO子句中没有出现,则新记录在这些字段名上将取空值(或默认值)。但必须注意的是,在表定义说明了NOT NULL的字段名不能取空值。
4.3.1 插入记录
<字段名表>:指定表文件中的字段,缺省时,按表文件字段的顺序依次赋值。
<表达式表>:指定要追加的记录各个字段的值。
【例4-4】在表文件STUD的末尾追加三条记录。
***用表达式方式追加第一条记录***
INSERT INTO STUD (学号,姓名,性别,班级名,系别代号,地址,出生日期,是否团员) ; VALUES ("011110","李建国","男","计0121","01","湖北武汉",{09/28/02},.T.)
DIMENSION DATA[8]
DATA(1)="011103"
DATA(2)="李宁"
DATA(3)="女"
DATA(4)="电0134"
DATA(5)="02"
DATA(6)="江西九江"
DATA(7)={05/06/85}
DATA(8)=.F.
INSERT INTO STUD FROM ARRAY DATA
***用数组方式追加第二条记录***
学号="011202"
姓名="赵娜"
性别="女"
班级名="英0112"
系别代号="03"
地址="广西南宁"
出生日期={02/21/84}
是否团员=.F.
INSERT INTO STUD FROM MEMVAR
LIST
***用内存变量方式追加第三条记录***
【格式】UPDATE <表文件名> SET <字段名1>=<表达式> [,<字段名2>=<表达式>…] [WHERE <条件>]
【功能】更新指定表文件中满足WHERE条件子句的数据。其中SET子句用于指定列和修改的值,WHERE用于指定更新的行,如果省略WHERE子句,则表示表中所有行。
【说明】更新操作又称为修改操作。
【例4-5】将成绩表(SC)中,所有课程号为02的成绩各加5分。
UPDATE SC SET 成绩=成绩+5 ;
WHERE 课程号="02"
4.3.2 更新记录命令
4.3.3 删除记录
【格式】DELETE FROM <表名> WHERE <表达式>
【功能】从指定的表中删除满足WHERE子句条件的所有记录。如果在DELETE语句中没有WHERE子句,则该表中的所有记录都将被删除。
【说明】这里的删除是逻辑删除,即在删除的记录前加上一个删除标记“*”。
【例4-7】删除STUD表中所有性别为男的记录。
DELETE FROM STUD ;
WHERE 性别=“男”
数据管理(也称数据控制)语言是用来管理(或控制)用户的访问权限的。由GRANT(授权)、REVOTE(回收)命令组成。而Visual FoxPro 6没有这种权限管理。
4.4 数据管理
4.5 SQL中的数据查询语句
数据库中的数据很多时侯是为了查询的,因此,数据查询是数据库的核心操作。而在SQL语言中,查询语言中有一条查询命令,即SELECT语句。
4.5.1 基本查询语句
【格式】SELECT [ALL | DISTINCT] <字段列表>
FROM <表>
【功能】无条件查询。
【说明】ALL: 表示显示全部查询记录,包括重复记录。
    DISTINCT: 表示显示无重复结果的记录。
   
【例4-8】显示STUD(学生信息数据表)中的所有记录。
SELECT * ;
FROM STUD
命令中的*表示输出显示所有的字段,数据来源是STUD表,表中的内容以浏览方式显示。
【例4-9】显示STUD(学生信息数据表)中的所有的学号及与之对应的姓名,同时能去除重名。
SELECT DISTINCT 学号,姓名 ;
FROM STUD
【例4-10】显示SC(课程成绩表)中的所有记录,并将成绩一项乘以0.7。
SELECT 学号,课程号,成绩*0.7 AS 成绩
FROM SC
4.5.2 带条件(WHERE)的查询语句
【格式】SELECT [ALL | DISTINCT] <字段列表>
FROM <表>
[WHERE <条件表达式> ]
【功能】从一个表中查询满足条件的数据。
【说明】<条件表达式>由一系列用AND 或 OR 连接的条件表达式组成,条件表达式的格式可以是以下几种:
(1)<字段名1><关系运算符><字段名2>。
(2)<字段名><关系运算符><表达式>。
(3)<字段名><关系运算符>ALL(<子查询>)
(4)<字段名><关系运算符> ANY | SOME (<子查询>)
(5)<字段名> [NOT] BETWEEN <起始值> AND <终止值>
(6)[NOT] EXISTS (<子查询>)
(7)<字段名> [NOT] IN <值表>
(8)<字段名> [NOT] IN (<子查询>)
(9)<字段名> [NOT] LINK <字符表达式>
SQL支持的关系运算符如下:
=、<>、!=、#、==、>、>=、<、<=。
【例4-11】显示STUD表中所有男生记录的学号,姓名和性别字段值。
SELECT 学号,姓名,性别 ;
FROM STUD WHERE 性别="男"
【例4-12】显示STUD表中出生日期在85年之间的学生的学号,姓名,出生日期。
SELECT 学号,姓名,出生日期 ;
FROM STUD ;
WHERE 出生日期 BETWEEN {01/01/85} AND {12/31/86}
【例4-13】显示STUD表中姓李的学生的学号,姓名,出生日期。
SELECT 学号,姓名,出生日期;
FROM STUD ;
WHERE 姓名 LIKE “李%”
4.5.3 SQL的复杂查询
1.连接查询
【说明】在一个数据库中的多个表之间一般都存在着某些联系,在一个查询语句中同时涉及到两个或两个以上的表时,这种查询称之为连接查询(也称为多表查询)。在多表之间查询必须处理表与表之间的连接关系。
SELECT [ALL | DISTINCT] <字段列表>
FROM <表1>[,表2…..]
WHERE <条件表达式>
【例4-14】查询并显示各个学生的学号,姓名,各科成绩及课程名。
SELECT a.学号,a.姓名,b.课程名,c.成绩 ;
FROM STUD a,COURSE b,SC c ;
WHERE a.学号=c.学号. AND .b.课程号=c.课程号
【例4-15】查询并显示各个学生所学课程的情况。
SELECT STUD.学号,STUD.姓名,COURSE.课程名 ;
FROM STUD,SC,COURSE ;
WHERE STUD.学号=SC.学号. AND .SC.课程号=COURSE.课程号
2.连接问题
在SQL语句中,在FROM子句中提供了一种称之为连接的子句,连接分为内连接和外连接,外连接又可分为左外连接、右外连接和全外连接。
(1)内连接
内连接是指包括符合条件的每个表的记录,也称之为全记录操作。而上面两个例子就是内连接。
【例4-16】查询并显示各个学生的学号,所学课程及课程成绩。
SELECT SC.学号,COURSE.课程名,SC.成绩 ;
FROM SC,COURSE ;
WHERE SC.课程号=COURSE.课程号
如果采用内连接方式,则命令如下:
SELECT a.学号,b.课程名,成绩 ;
FROM SC a INNER JOIN COURSE b ON a.课程号=b.课程号
将会得到完全相同的结果。
(2)外连接
外连接是指把两个表分为左右两个表。右外连接是指连接满足条件右侧表的全部记录。左外连接是指连接满足条件左侧表的全部记录。全外连接是指连接满足条件表的全部记录。
3.嵌套查询
在SQL语句中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询或子查询。
【例4-17】显示“李宁”所在班级的学生名单。
SELECT 学号,姓名,班级名 ;
FROM STUD ;
WHERE 班级名=(SELECT 班级名 FROM STUD WHERE 姓名="李宁")
4.分组与计算查询
【格式】SELECT [ALL | DISTINCT] <字段列表>
FROM <表>
[WHERE <条件>
[GROUP BY <分类字段列表>…]
[HAVING <过滤条件>]
[ORDER BY <排序项> [ASC | DESC]
【功能】包括有排序、函数运算和谓词演算
【例4-18】按出生日期降序显示STUD表中的学号,姓名,出生日期。
SELECT 学号,姓名,出生日期 ;
FROM STUD ;
ORDER BY 出生日期 DESC
【例4-19】按成绩升序显示SC表中的学号,课程号,成绩。
SELECT 学号,课程号,成绩 ;
FROM SC ;
ORDER BY 成绩
【例4-20】按班级分类显示学生的姓名,课程名,成绩,同一班级按分数排序。
SELECT a.姓名,a.班级名,c.课程名,b.成绩 ;
FROM STUD a,SC b,COURSE c ;
WHERE a.学号=b.学号 AND b.课程号=c.课程号;
ORDER BY a.班级名,b.成绩;
【例4-21】显示成绩在80至90之间的学号,姓名,课程名和成绩。
SELECT a.姓名,c.课程名,b.成绩
FROM STUD a,SC b,COURSE c
WHERE a.学号=b.学号 AND b.课程号=c.课程号 AND b.成绩 BETWEEN 80 AND 90
【例4-22】显示计算机系学生的成绩。
SELECT a.姓名,a.系别代号,c.课程名,b.成绩 ;
FROM STUD a,SC b,COURSE c ;
WHERE a.学号=b.学号 AND b.课程号=c.课程号 AND a.系别代号=“01”
【例4-23】显示各班总人数。
SELECT 班级名,COUNT(班级名) AS 总人数 ;
FROM STUD ;
GROUP BY 班级名
【例4-24】显示计算机系的学生及所有男学生。
SELECT 学号,姓名,系别代号,性别 ;
FROM STUD ;
WHERE 系别代号="01" UNION ;
SELECT 学号,姓名,系别代号,性别 ;
FROM STUD ;
WHERE 性别="男"
【例4-25】显示选修了英语或数学科目的学生学号。
SELECT 学号,课程号 FROM SC ;
WHERE 课程号=“01” UNION ;
SELECT 学号,课程号 ;
FROM SC ;
WHERE 课程号=“02”
【例4-26】显示计算机系男生的名单。
SELECT 学号,姓名,系别代号,性别 ;
FROM STUD ;
WHERE 系别代号=“01” AND 性别=“男”
【例4-27】显示既选修了01课程又选修了02课程学生的名单。
SELECT 学号 ;
FROM SC ;
WHERE 课程号=“01” AND 学号 IN ;
(SELECT 学号 FROM SC WHERE 课程号=“02”)
【例4-28】显示计算机系非男生的名单。
SELECT 学号,姓名,系别代号,性别 ;
FROM STUD ;
WHERE 系别代号=“01” AND 性别=“女”
【例4-29】显示选修了01课程而没有选修02课程学生的名单。
SELECT 学号 ;
FROM SC ;
WHERE 课程号=“01” AND 学号 NOT IN ;
(SELECT 学号 FROM SC WHERE 课程号=“02”)
5.查询去向
默认情况下,查询输出到一个浏览窗口,用户在“SELECT”语句中可使用[INTO<目标>|TO FILE<文件名>|TO SCREEN| TO PRINTER]子句选择查询去向:
INTO ARRAY 数组名:将查询结果保存到一个数组中。
CURSOR< 临时表名>:将查询结果保存到一个临时表中。
DBF | TABLE <表名>:将查询结果保存到一个永久表中。
TO FILE<文件名>[ADDITIVE]:将查询结果保存到文本文件中。如果带“ADDITIVE”关键字,查询结果以追加方式添加到<文件名>指定的文件,否则,以新建或覆盖方式添加到<文件名>指定的文件。
TO SCREEN:将查询结果保在屏幕上显示。
TO PRINTER:将查询结果送打印机打印。(共19张PPT)
第5章
数据查询与建立视图
目 录
上一页
下一页
退 出
本 章 要 点
5.1 数据查询
5.2 建立视图
5.1.1 查询的设计过程
在创建查询时,通常可以遵循以下六个步骤来创建查询。
(1)用“查询向导”或“查询设计器”创建查询。
(2)选择在查询结果中需要的字段。
(3)设置查询记录的条件。
(4)设置排序及分组条件来组织查询结果。
(5)选择查询输出类别,可以是报表、表文件、图表、浏览窗口和表文件等等。
(6)运行此查询。
5.1 数据查询
1.利用“查询向导”创建查询
利用“查询向导”创建查询的步骤如下:
(1)进入“查询向导”
进入“查询向导”可用下面3种方法:
① 选择【工具】|【向导】|【查询】命令。
② 选择【文件】|【新建】命令,进入“新建”对话框,选择“查询”单选按钮,单击“向导”按钮。
③ 在“项目管理器”窗口中,选择“数据”选项卡,选中“查询”,单击“新建”按钮,出现“新建查询”对话框,单击“查询向导”按钮。
(2)选择查询结果中需要的字段
5.1.2 查询的创建
(3)设置查询条件
(4)设置排序字段
(5)设置记录输出范围
(6)保存查询
2.查询设计器
进入“查询设计器”窗口有二种方法,
(1) 选择【文件】│【新建】命令,进入“新建”对话框,选择“查询”单选按钮,单击“新建”按钮;
(2) 在“项目管理器”窗口中,选择“数据”选项卡,选中“查询”文件类型,单击“新建”按钮,出现“新建查询”对话框,单击“新建查询”按钮。
3.查询设计器工具栏
“查询设计器工具栏”各按钮的功能如下:
按钮:添加数据库表。
按钮:移去数据库表。
按钮:添加数据库表间的联接。
按钮:显示SQL窗口。
按钮:最大化上部分窗口。
按钮:确定查询去向。
4.使用查询设计器创建查询
使用“查询设计器”创建前面“查询向导”创建查询例子,具体步骤如下:
(1)进入“查询设计器”窗口,添加stud表 ,如图所示。
(2)选择查询需要的字段
(3)设置查询条件
(4)保存查询
1.查询的运行
运行查询的方法有以下5种:
① 在“查询设计器”窗口中,选择【查询】|【运行查询】命令。
② 在“查询设计器”窗口中,右击“查询设计器”窗口,选择快捷菜单中的【运行查询】命令。
③ 选择【程序】|【运行】命令。弹出“运行”对话框,在对话框中,选择所要运行的查询文件,单击“运行”按钮。
④ 在“项目管理器”窗口中,选择要运行的查询文件,单击右边的“运行”按钮。
⑤ 在“命令”窗口中,键入 DO <查询文件名> 。例如,DO 查询1.qpr。
5.1.3 查询的运行与修改
2.查询的修改
修改可以用以下3种方法:
① 在“项目管理器”窗口中,选择要修改的查询文件,单击右边的“修改”按钮,进入“查询设计器”窗口中修改。
② 选择【文件】|【打开】命令,在“打开”对话框中,选择所要修改的查询文件,单击“确定”按钮,进入“查询设计器”窗口中修改。
③ 在命令窗口中,键入 MODIFY QUERY <查询文件名>。
3.查询去向的设置
单击“查询设计器”工具栏中的“查询去向”按钮或在系统菜单中单击【查询】|【查询去向】命令,弹出“查询去向”对话框,如图5-15 所示。其中共包含7个查询去向,各项的含义见表5-1。
1.多表查询的创建
2.交叉表查询的创建
交叉表是类似电子表格形式来表现二维分析数据的一种表。例如,在学生成绩总表中,是由学生“姓名”和本学期的各门“课程名称”构成了一个二维表,此表的交叉点为“成绩”的分值。
5.1.4 复杂查询的设计
5.2.1 视图简介
视图是一个定制的虚拟逻辑表,视图中只存放相应的数据逻辑关系,并不保存表的记录内容,但可以在视图中改变记录的值,然后将更新记录返回到源表。
视图与查询在功能上有许多相似之处,但又有各自特点,主要区别如下:
功能不同:视图可以更新字段内容并返回源表,而查询文件中的记录数据不能被修改。
从属不同:视图不是一个独立的文件而从属于某一个数据库。查询是一个独立的文件,它不从属于某一个数据库。
5.2 建立视图
访问范围不同:视图可以访问本地数据源和远程数据源,而查询只能访问本地数据源。
输出去向不同:视图只能输出到表中,而查询可以选择多种去向,如表、图表、报表、标签、窗口等形式。
使用方式不同:视图只有所属的数据库被打开时,才能使用。而查询文件可在命令窗口中执行。
5.2.2 本地视图的创建
1.使用本地视图向导创建本地视图
2.使用视图设计器创建本地视图
1.创建远程数据联接
远程视图是通过ODBC从远程数据源建立的视图。
所谓ODBC即Open DataBase Connectivity (开放式数据互连)的英语缩写,它是一个标准的数据库接口,以一个动态连接库(DLL)方式提供的。
创建ODBC数据源可以用二种方法建立。第一种方法是利用 “连接设计器”中“新的数据源”创建,第二种方法是利用在windows系统的“控制面板”中启动“ODBC数据源(32位)”应用程序。
5.2.3 创建远程视图
1.更新数据
在“视图设计器”中,“更新条件”选项卡控制对数据源的修改(如更改、删除、插入)应发送回数据源的方式,而且还可以控制对表中的特定字段定义是否为可修改字段,并能对用户的服务器设置合适的SQL更新方法。
2.修改视图
在“项目管理器”中,选择“数据”选项卡,选定要修改的“本地视图”或“远程视图”,单击右边的“修改”按钮,进入“视图设计器”进行修改。
5.2.4 使用视图的有关操作
3.删除视图
● 在“项目管理器”中,选择“数据”选项卡,选定要修改的“本地视图”或“远程视图”,单击右边的“移去”按钮,单击提示框中“移去”按钮即可删除。
4.浏览或运行视图
5.显示SQL语句
在“视图设计器”窗口。可用下面三种方法之一察看SQL语句:
● 单击“视图设计器”工具栏中“SQL”按钮。
● 右击“视图设计器”窗口,选择 “察看 SQL”命令。
● 在系统菜单中选择【查询】|【查看SQL】(共63张PPT)
Visual FoxPro
数据库与程序设计
中国计算机函授学院
第1章
数据库基本知识与Visual FoxPro概述
目 录
上一页
下一页
退 出
本 章 要 点
1.1 信息、数据与数据处理
1.2 计算机数据管理
1.3 关系数据库系统
1.4 Visual FoxPro 系统简介
1.5 Visual FoxPro 6.0系统的基本操作
思考题
1.1 信息、数据与数据处理
1.1.1 数据与信息和数据处理
数据是指存储在某一种媒体上能够被识别的物理符号。数据有数字、文字、图形、图象、声音等多种表现形式。
信息是一种已经被加工为特定形式的数据,信息是以某种数据形式表现的。
在计算机中,通过计算机软件来管理数据,通过应用程序来 对数据进行加工处理。用外存储器来存储数据。
数据处理是指将数据转换成信息的过程。数据处理的内容主要包括:数据的收集、整理、存储、加工、分类、维护、排序、检索和传输等一系列活动的总和。数据处理的目的是从大量的数据中,根据数据自身的规律和及其相互联系,通过分析、归纳、推理等科学方法,利用计算机技术、数据库技术等技术手段,提取有效的信息资源,为进一步分析、管理、决策提供依据。
数据处理也称信息处理
要 点
1.1.2 计算机数据管理
计算机对数据的管理是指对数据的组织、分类、编码、存储、检索和维护提供操作手段。
计算机数据管理经历了:人工管理、文件系统、数据库系统、分布式数据库系统和面向对象数据库系统等个阶段。
要 点
1.1.3 数据处理的发展
伴随着计算机技术的不断发展,数据处理及时地应用了这一先进的技术手段,使数据处理的效率和深度大大提高,也促使数据处理和数据管理的技术得到了很大的发展,其发展过程大致经历了人工管理、文件管理、数据库管理及分布式数据库管理等四个阶段。
要 点
1.人工管理阶段
早期的计算机主要用于科学计算,计算处理的数据量很小,基本上不存在数据管理的问题。从50年代初开始,开始将计算机应用于数据处理。当时的计算机没有专门管理数据的软件,也没有像磁盘这样可随机存取的外部存储设备,对数据的管理没有一定的格式,数据依附于处理它的应用程序,使数据和应用程序一一对应,互为依赖。
由于数据与应用程序的对应、依赖关系,应用程序中的数据无法被其他程序利用,程序与程序之间存在着大量重复数据,称为数据冗余;同时,由于数据是对应某一应用程序的,使得数据的独立性很差,如果数据的类型、结构、存取方式或输入输出方式发生变化,处理它的程序必须相应改变,数据结构性差,而且数据不能长期保存。
要 点
在人工管理阶段,应用程序与数据之间的关系如图1-1所示。
应用程序1
应用程序2
应用程序n
数据组1
数据组2
数据组n


2.文件管理阶段
从50年代后期开始至60年代末为文件管理阶段,应用程序通过专门管理数据的软件即文件系统管理来使用数据。由于计算机存储技术的发展和操作系统的出现,同时计算机硬件也已经具有可直接存取的磁盘、磁带及磁鼓等外部存储设备,软件则出现了高级语言和操作系统,而操作系统的一项主要功能是文件管理,因此,数据处理应用程序利用操作系统的文件管理功能,将相关数据按一定的规则构成文件,通过文件系统对文件中的数据进行存取、管理,实现数据的文件管理方式。
要 点
文件管理阶段中,文件系统为程序与数据之间提供了一个公共接口,使应用程序采用统一的存取方法来存取、操作数据,程序与数据之间不再是直接的对应关系,因而程序和数据有了一定的独立性。程序和数据分开存储,有了程序文件和数据文件的区别。数据文件可以长期保存在外存储器上被多次存取。
数据和程序相互依赖。同一数据项可能重复出现在同一个文件中,这就导致了数据冗余度大。造成数据的不一致性。
要 点
在文件管理阶段,应用程序与数据之间的关系如图1-2所示。
┆ ┆
操作系统
应用程序n
应用程序2
数据组2
数据组n
应用程序1
数据组1
┆ ┆
3.数据库系统
数据库管理阶段是20世纪60年代后期开始在文件管理基础上发展起来的。为了实现计算机对数据的统一管理,达到数据共享的目的,发展了数据库技术。
数据库技术的主要目的是有效地管理和存取大量的数据资源。
数据库管理系统(DataBase Management System,DBMS)数据库管理系统利用了操作系统提供的输入/输出控制和文件访问功能。Vf就是一种在操作系统上运行的数据库管理系统软件。 数据库技术使数据有了统一的结构,对所有的数据实行统一、集中、独立的管理,以实现数据的共享,保证数据的完整性和安全性,提高了数据管理效率。数据库也是以文件方式存储数据的,但它是数据的一种高级组织形式。在应用程序和数据库之间,由数据库管理软件DBMS把所有应用程序中使用的相关数据汇集起来,按统一的数据模型,以记录为单位存储在数据库中,为各个应用程序提供方便、快捷的查询、使用。
在数据库管理阶段,应用程序与数据之间的关系如图1-3所示。

数据库管理系统
数据库
应用程序2
应用程序1
应用程序n
分布式数据库系统
20世纪70年代后期,依靠网络技术的发展为数据库提供了分布式运行环境,既客户/服务器(client/server)系统结构。
分布式数据库系统分类:物理上分布、逻辑上集中的分布数据库结构和物理上分布、逻辑上分布的结构。
开放式数据库连接(ODBC,Open DataBase Connectivity)是用与数据库服务器的一种标准协议。使用ODBC,可以从vf中访问SQL Server数据源。
面向对象数据库系统
面向对象方法,面向对象的程序设计是20世纪80年代引入计算机领域的一种新的程序设计技术和范型。
面向对象的方法:
1.1.5 数据库新技术
数据库技术发展之快、应用之广是计算机科学其他领域技术无可比拟的。随着数据库应用领域的不断扩大和信息量的急剧增长,占主导地位的关系数据库系统已不能满足新的应用领域的需求,如CAD(计算机辅助设计)/CAM(计算机辅助制造)、CIMS(计算机集成制造系统)、CASE(计算机辅助软件工程)、OA(办公自动化)、GIS(地理信息系统)、MIS(管理信息系统)、KBS(知识库系统)等,都需要数据库新技术的支持。这些新应用领域的特点是:存储和处理的对象复杂,对象间的联系具有复杂的语义信息;需要复杂的数据类型支持,包括抽象数据类型、无结构的超长数据、时间和版本数据等;需要常驻内存的对象管理以及支持对大量对象的存取和计算;支持长事务和嵌套事务的处理。这些需求是传统关系数据库系统难以满足的。
1.分布式数据库
分布式数据库系统(Distributed DataBase System,DDBS)是在集中式数据库基础上发展起来的,是数据库技术与计算机网络技术、分布处理技术相结合的产物。分布式数据库系统是地理上分布在计算机网络不同结点,逻辑上属于同一系统的数据库系统,能支持全局应用,同时存取两个或两个以上结点的数据。
分布式数据库系统的主要特点是:
(1)数据是分布的。数据库中的数据分布在计算机网络的不同结点上,而不是集中在一个结点,区别于数据存放在服务器上由各用户共享的网络数据库系统。
(2)数据是逻辑相关的。分布在不同结点的数据,逻辑上属于同一个数据库系统,数据间存在相互关联,区别于由计算机网络连接的多个独立数据库系统。
(3)结点的自治性。每个结点都有自己的计算机软、硬件资源、数据库、数据库管理系统(即Local DataBase Management System,LDBMS局部数据库管理系统),因而能够独立地管理局部数据库。
2.面向对象数据库
面向对象数据库系统(Object-Oriented DataBase System,OODBS)是将面向对象的模型、方法和机制,与先进的数据库技术有机地结合而形成的新型数据库系统。它从关系模型中脱离出来,强调在数据库框架中发展类型、数据抽象、继承和持久性;它的基本设计思想是,一方面把面向对象语言向数据库方向扩展,使应用程序能够存取并处理对象,另一方面扩展数据库系统,使其具有面向对象的特征,提供一种综合的语义数据建模概念集,以便对现实世界中复杂应用的实体和联系建模。因此,面向对象数据库系统首先是一个数据库系统,具备数据库系统的基本功能,其次是一个面向对象的系统,针对面向对象的程序设计语言的永久性对象存储管理而设计的,充分支持完整的面向对象概念和机制。
1.2 数据库系统
1.2.1 数据库系统的组成
数据库应用系统简称为数据库系统(DataBase System,DBS),是一个计算机应用系统。它由计算机硬件、数据库管理系统、数据库、应用程序和用户等部分组成。
应用程序
硬件
语言编译 DBMS
OS
最终
用户
开发人员
数据库管
理人员
1.计算机硬件
计算机硬件(Hardware)是数据库系统赖以存在的物质基础,是存储数据库及运行数据库管理系统DBMS的硬件资源,主要包括主机、存储设备、I/O通道等。大型数据库系统一般都建立在计算机网络环境下。
为使数据库系统获得较满意的运行效果,应对计算机的CPU、内存、磁盘、I/O通道等技术性能指标,采用较高的配置。
2.数据库管理系统
数据库管理系统(DataBase Management System,DBMS)是指负责数据库存取、维护、管理的系统软件。DBMS提供对数据库中数据资源进行统一管理和控制的功能,将用户应用程序与数据库数据相互隔离。它是数据库系统的核心,其功能的强弱是衡量数据库系统性能优劣的主要指标。
DBMS必须运行在相应的系统平台上,在操作系统和相关的系统软件支持下,才能有效地运行。
3.数据库
数据库(DataBase,DB )是指存储在计算机存储设备上结构化的相关数据集合。它不仅包括描述事物的数据本身,而且还包括相关事物之间的联系。可以被多个用户共享的、与应用程序相互独立。数据库中的数据也是以文件的形式存储在存储介质上的,它是数据库系统操作的对象和结果。数据库中的数据具有集中性和共享性。所谓集中性是指把数据库看成性质不同的数据文件的集合,其中的数据冗余很小。所谓共享性是指多个不同用户使用不同语言,为了不同应用目的可同时存取数据库中的数据。
数据库中的数据由DBMS进行统一管理和控制,用户对数据库进行的各种数据操作都是通过DBMS实现的。
数据库系统
数据库系统是五部分组成:硬件系统、数据库集合、数据库管理系统及相关软件、数据库管理员和用户
1.2.4 数据库系统的特点
数据库系统的出现是计算机数据处理技术的重大进步,它具有以下特点。
1.实现数据共享,减少数据冗余
数据的最小单位是字段,即可以按字段的名称存取库中某一个或某一组字段,也可以存取一条记录或一组记录。
数据冗余就是数据重复
2.采用特定的数据模型
3.具有较高的数据独立性
所谓数据独立是指数据与应用程序之间的彼此独立,它们之间不存在相互依赖的关系。应用程序不必随数据存储结构的改变而变动,这是数据库一个最基本的优点。
在数据库系统中,数据库管理系统通过映像,实现了应用程序对数据的逻辑结构与物理存储结构之间较高的独立性。数据库的数据独立包括两个方面:
(1)物理数据独立:数据的存储格式和组织方法改变时,不影响数据库的逻辑结构,从而不影响应用程序。
(2)逻辑数据独立:数据库逻辑结构的变化(如数据定义的修改,数据间联系的变更等)不影响用户的应用程序。
数据独立提高了数据处理系统的稳定性,从而提高了程序维护的效益。
4.有统一的数据控制功能
数据的存取是并发的,既多个用户同时使用一个数据库。所以,数据库管理系统必须要提供必要的保护措施,(并发访问控制、数据安全控制和数据的完整性控制).
1.实体
客观事物在信息世界中称为实体(Entity),它是现实世界中任何可区分、识别的事物。实体可以是具体的人或物,也可以是抽象概念;
(1)属性
实体具有许多特性,实体所具有的特性称为属性(Attribute)。一个实体可用若干属性来刻画。每个属性都有特定的取值范围即值域(Domain),值域的类型可以是整数型、实数型、字符型等;;
(2)实体型和实体集
属性值的集合表示一个实体,而属性的集合表示一种实体的类型,称为实体型。同类型的试题的集合称为实体集。
性质相同的同类实体的集合称实体集。如一个班的学生。
(1)一对一联系(1:1)
若两个不同型实体集中,任一方的一个实体只与另一方的一个实体相对应,称这种联系为一对一联系。如班长与班级的联系,一个班级只有一个班长,一个班长对应一个班级。
(2)一对多联系(1:n)
若两个不同型实体集中,一方的一个实体对应另一方若干个实体,而另一方的一个实只对应本方一个实体,称这种联系为一对多联系。如班长与学生的联系,一个班长对应多个学生,而本班每个学生只对应一个班长。
(3)多对多联系(m:n)
若两个不同型实体集中,两实体集中任一实体均与另一实体集中若干个实体对应,称这种联系为多对多联系。如教师与学生的联系,一位教师为多个学生授课,每个学生也有多位任课教师。
3.实体联系
建立实体模型的一个主要任务就是要确定实体之间的联系。常见的实体联系有3种:一对一联系、一对多联系和多对多联系。如图1-6所示。
班长
班长-班级
班级
1
1
班长
班长-学生
学生
1
n
教师
教师-学生
学生
m
n
(a)
(b)
(c)
1.2.6 数据模型
数据模型是指数据库中数据与数据之间的关系。
数据模型是数据库系统中一个关键概念,数据模型不同,相应的数据库系统就完全不同,任何一个数据库管理系统都是基于某种数据模型的。数据库管理系统常用的数据模型有下列三种:
层次模型
网状模型
关系模型。
1.层次数据模型(Hierarchical Model)
层次模型是用树型结构来表示实体类型以及实体间联系的模型。他只能表示1:n的联系,不能表示恋歌以上的实体类型之间的复杂联系和实体类型之间的多对多的联系。
2.网状数据模型(Network Model)
网状模型是用网状结构来表示试题类型以及实体间联系的模型。网中的美意个结点表示一个实体类型。它能够表示实体间的多种复杂联系和实体类型之间的对对多的联系。
支持网状模型的DBMS称为网状数据库管理系统,在这种系统中建立的数据库是网状数据库。网络结构可以直接表示多对多联系,这也是网状模型的主要优点。
3.关系模型(Relational Model)
关系模型是用二维表格结构来表示实体以及实体联系间模型。关系是由若干个二维表组成的集合。每个二维表又称为关系。
Visual FoxPro是一种典型的关系型数据库管理系统。
表1-1 学生基本情况表
学号
姓名
性别
班级名
系别代号
地址
出生日期
是否团员
备注
011110
李建国

计0121
01
湖北武汉
1984-9-28


011103
李宁

电0134
02
江西九江
1985-5-6


011202
赵娜

英0112
03
广西南宁
1984-2-21


021204
孙亮

电0134
02
湖南长沙
1986-9-8


011111
赵琳

计0121
01
江苏南京
1985-11-18


021405
罗宇波

英0112
03
江苏南通
1985-12-12


1.3 关系数据库系统
1.3.1 关系的基本概念及其特点
1.关系的基本概念
(1)关系
一个关系就是一张二维表,每个关系有一个关系名。每个关系(数据库表)用一个文件来存储,扩展名为.DBF
表1-3 考生考试成绩表
准考证号
姓名
性别
出生日期
笔试成绩
上机成绩
总分
250199990001
赵 娜

12/01/70
85
92
177
250199990002
李 小军

04/15/73
73
80
153
250199990003
张晓云

05/05/69
64
75
139
250199990004
刘志学

11/06/70
95
90
185
250199990005
孙 亮

08/23/71
67
74
141
250299990006
李建国

09/28/72
53
57
110
(2)元组
二维表的每一行在关系中称为元组。
在Visual FoxPro中,一个元组对应表中一个记录。
(3)属性
二维表的每一列在关系中称为属性,每个属性都有一个属性名。每个属性都有属性名,数据类型,长度。
在Visual FoxPro中,一个属性对应表中一个字段,属性名对应字段名。
(4)域
属性的取值范围称为域。
(5)关键字
关系中能唯一区分、确定不同元组(记录)的属性或属性组合,称为该关系的一个关键字。单个属性组成的关键字称为单关键字,多个属性组合的关键字称为组和关键字。需要强调的是,关键字的属性值不能取“空值”,所谓空值就是“不知道”或“不确定”的值,因而无法唯一地区分、确定元组。
表1-2中“准考证号”及“身份证号”属性可以作为单关键字,因为准考证号和身份证号不允许相同。而“姓名”及“出生日期”则不能作为关键字,因为考生中可能出现重名或相同出生日期。如果所有同名考生的出生日期不同,则可将“姓名”和“出生日期”组合成为组合关键字。
(6)候选关键字
关系中能够成为关键字的属性或属性组合可能不是惟一的。凡在关系中能够唯一区分、确定不同元组的属性或属性组合,称为候选关键字。如表1-2中“准考证号”和“身份证号”属性都是候选关键字。
(7)主关键字
在候选关键字中选定一个作为关键字,称为该关系的主关键字。关系中主关键字是唯一的。
(8)外部关键字
关系中某个属性或属性组合并非关键字,但却是另一个关系的主关键字,称此属性或属性组合为本关系的外部关键字。关系之间的联系是通过外部关键字实现的。
(9)关系模式
关系模式
对关系结构的描述称为关系模式,一个关系模式对应一个关系的结构。关系模式的简化表示模式:在VF中使用:表名(字段名1,字段名2,……,字段名n)表示
对关系的描述称为关系模式,其格式为:
关系名(属性名1, 属性名2, …, 属性名n)
关系既可以用二维表格描述,也可以用数学形式的关系模式来描述。一个关系模式对应一个关系的数据结构,也就是表的数据结构。
如表1-2对应的关系,其关系模式可以表示为:
考生简况(准考证号,身份证号,姓名,性别,出生日期,工作单位,电话号码)
其中,“考生简况”为关系名,括号中各项为该关系所有的属性名。
2.关系的基本特点
在关系模型中,关系具有以下基本特点:
(1)关系必须规范化,属性不可再分割
规范化是指关系模型中每个关系模式都必须满足一定的要求,最基本的要求是关系必须是一张二维表,每个属性值必须是不可分割的最小数据单元,即表中不能再包含表。
(2)在同一关系中不允许出现相同的属性名(字段)
(3)关系中不允许有完全相同的元组(记录)
(4)在同一关系中元组及属性的顺序可以任意
(5)任意交换两个元组(或属性)的位置,不会改变关系模式。
以上是关系的基本性质,也是衡量一个二维表格是否构成关系的基本要素。在这些基本要素中,有一点是关键,即属性不可再分割,也即表中不能套表。
1.3.2 关系模型实例
关系运算:
1. 传统的集合运算(并、差、交等)
2.专门的关系运算(选择、投影、联接)
传统的集合运算
进行并、差、交集合运算的两个关系必须是具有相同的关系模式,既结构相同。
1.并
两个相同结构关系的并是有属于这两个关系的元组(记录)组成的集合。
2.差
关系R和关系S,是有属于R而不属于S的元组组成的集合,从R中去掉S中也有的元组。
3.交
关系R和关系S,既属于R又属于S的元组组成的集合。
1.3.3 专门的关系运算
在关系数据库中查询用户所需数据时,需要对关系进行一定的关系运算。关系运算主要有选择、投影和联接三种。
选择(Selection)运算是从关系中查找符合指定条件元组的操作。(对记录)
投影(Projection)运算是从关系中选取若干个属性的操作。 (对字段)
联接(Join)运算是将两个关系模式的若干属性拼接成一个新的关系模式的操作,对应的新关系中,包含满足联接条件的所有元组。(对字段)
例如,表1-2按照“性别 = ”女“”的条件进行选择运算,可得到如下结果。
表1-4 选择运算结果
准考证号
姓名
性别
出生日期
笔试成绩
上机成绩
总分
250199990001
赵 娜

12/01/70
85
92
177
250199990003
张晓云

05/05/69
64
75
139
例如,选取表1-3中姓名、笔试成绩、上机成绩三列的投影操作,可得到如表1-5所示结果。
表1-5 投影运算结果
姓名
笔试成绩
上机成绩
赵 娜
85
92
李 小军
73
80
张晓云
64
75
刘志学
95
90
孙 亮
67
74
李建国
53
57
例如,将表1-2和表1-3中若干列,以“准考证号”列为依据,联接生成一个新的表格,结果如图1-6所示。
图1-6 联接运算结果
准 考 证号
姓 名
性别
工 作 单 位
笔试成绩
上机成绩
总 分
250199990001
赵 娜

武汉水利电力大学
85
92
177
250199990002
李 小军

武汉电建一公司
73
80
153
250199990003
张晓云

武汉大学
64
75
139
250199990004
刘志学

华中理工大学
95
90
185
250199990005
孙 亮

湖北大学
67
74
141
250299990006
李建国

湖北工学院
53
57
110
1-7自然联接:
按照字段值对应相等为条件进行的联接操作称为等值联接。自然连接就是去掉重复属性(字段)的等值联接。
数据库设计基础
设计步骤:
1.设计原则:
a.关系数据库的设计应尊从概念单一化“一事一地”的原则。(一个表描述一个实体或实体间的一种联系)
b.避免在表之间出现重复字段
c.表的字段必须是原始数据和基本数据元素
d.用外部关键字保证有关联的表之间的联系
设计的步骤
1.需求分析
2.确定需要的表
3.确定所需字段
4.确定联系
5.设计求精
1.4 Visual FoxPro 系统简介
Visual FoxPro 6.0系统是一个关系型DBMS,是微软公司1998年推出的可视化语言集成包Visual Studio 6.0系统中的一个产品。
能运行于各种平台上的32位数据库开发系统。
1.4.1 Visual FoxPro 的特点
Visual FoxPro 具有界面友好、工具丰富、速度较快等优点,并在数据库操作与管理、可视化开发环境、面向对象程序设计等方面具有较强的功能。其特点主要体现在以下几方面:
(1)兼容性好
(2)应用程序的开发更简便
(3)改进了程序调试工具
(4)更简便的表设计和扩充内容的数据字典
(5)增强了查询和视图设计功能
(6)增强了表单设计功能
(7)更多更好的向导
(8)增强了OLE与ActiveX的集成
1.4.2 Visual FoxPro 6.0的安装
1.Visual FoxPro 6.0的安装环境要求
Visual FoxPro 6.0系统的正确安装、运行,必须具备相应的环境条件。其最低要求,一般应具备如下环境条件:
(1)配置50MHz主频486以上的PC机或兼容机;
(2)内存16 MB以上;
(3)典型安装需要85M,最大安装需要90M
(4)鼠标;
(5)VGA或更高分辨率的显示器;
(6)中文Windows 95 / 98或Windows NT以上操作系统;
(7)对于网络操作,需要一个与Windows兼容的网络和一个网络服务器。
1.4.4 Visual FoxPro 6.0的基本组成
1.Visual FoxPro 6.0的主窗口
Visual FoxPro 6.0启动后,打开主窗口,如图1-8所示。主窗口包括:标题栏、菜单栏、常用工具栏、状态栏、命令窗口和主窗口工作区几个组成部分。 8个下拉式菜单项
Alt+”热键”下拉菜单 ctrl+相应的“热键”
标题栏
菜单栏
常用工具栏
命令窗口
状态栏
工作区
1.5 Visual FoxPro 6.0系统基本操作
1.5.1 Visual FoxPro 6.0的操作方式
Visual FoxPro 6.0系统为用户提供了几种各具特点的操作方式,用户可根据情况以及应用的需要,选择合适的操作方式,实现数据库的操作、应用。
Visual FoxPro 6.0系统的操作方式主要有:
(1)命令操作方式
(2)菜单操作方式
(3)程序操作方式
1.命令操作方式
命令操作是在命令窗口中逐条输入命令,直接操作指定对象的操作方式。命令操作为用户提供了一个直接操作的手段,其优点是能够直接使用系统的各种命令和函数,有效操纵数据库,但要求熟练掌握各种命令和函数的格式、功能、用法等细节;
2.菜单操作方式
Visual FoxPro 6.0系统将许多命令做成菜单命令选项,用户通过选择菜单项来使用数据库的操作方式。在菜单方式中,很多操作是通过调用相关的向导、生成器、设计器工具,以直观、简便、可视化方式完成对系统的操作,用户不必熟悉命令的细节和相应的语法规则,通过对话来完成操作。有了这种方式,一般用户无需编程就可完成数据库的操作与管理;
3.程序操作方式
程序操作就是预先将实现某种操作处理的命令序列编成程序,通过运行程序来实现操作、管理数据库的操作方式。根据实际应用需要编写的应用程序,能够为用户提供界面更简洁直观、操作步骤更符合业务处理流程和规范要求的操作应用环境。但程序的编制,需要经过专门训练,只有具备一定设计能力的专业人员方能胜任,普通用户很难编写大型的、综合性较强的应用程序。
1.5.3 Visual FoxPro 6.0系统环境的设置
Visual FoxPro 6.0系统的环境设置决定了系统的操作运行环境和工作方式,设置是否合理、适当,直接影响系统的操作运行效率和操作的方便性。系统安装时按默认方式进行了相应的设置,用户通过设置系统环境,可添加或删除Visual FoxPro 6.0的相关组件,也可对系统当前环境重新调整设置。添加或删除Visual FoxPro 6.0组件的操作,要通过系统安装程序来实现,而当前环境的设置可通过相关命令和菜单操作方式来实现。下面简要介绍以菜单方式设置系统环境的操作方法。
环境设置包括主窗口标题、默认目录、项目、编辑器、调试器及表单工具选项、临时文件存储、拖放字段对应的控件和其他选项等内容。
“选项”对话框或SET命令进行附加的配置设定,还可以通过配置文件进行设置。
1.5.4 项目管理器的使用
在Visual FoxPro系统中,使用项目组织、集成数据库应用系统中所有相关的文件,形成一个完整的应用系统。所谓项目是Visual FoxPro中相关数据、文档和各类文件、对象的集合,也即项目是与一个应用有关的所有文件的集合。项目管理器是Visual FoxPro系统创建、管理项目的工具,用来创建、修改、组织项目中各种文件,对项目中程序进行编译和连编,形成一个可以运行的应用程序系统。
2.Visual FoxPro 6.0的向导
Visual FoxPro 6.0系统为用户提供了许多功能强大的向导(Wizards)。用户可以在向导程序的引导、帮助下,不用编程就能快速地建立良好的应用程序,完成许多数据库操作、管理功能,为非专业用户提供了一种较为简便的操作使用方式。
Visual FoxPro 6.0系统提供的向导及其功能,见表1-8。
表向导 报表向导 一对多报表向导 标签向导
分组/总计报表向导 表单向导 一对多表单向导 查询向导
交叉表向导 本地视图向导 远程视图向导 导入向导
文档向导 图表向导 应用程序向导 SQL升迁向导
数据透视表向导 安装向导
3.Visual FoxPro 6.0的生成器
Visual FoxPro 6.0系统提供了若干个生成器(Bkpkpkljljhujgjgggyfffyftuilders),用以简化创建、修改用户界面程序的设计过程,提高软件开发的质量和效率。每个生成器包含若干个选项卡,允许用户访问并设置所选择对象的相关属性。用户可将生成器生成的用户界面直接转换成程序编码,使用户从逐条编写程序代码、反复调试程序的手工作业中解放出来。
Visual FoxPro 6.0提供的生成器及功能,见表1-9。
自动格式化生成器 组合框生成器 命令组生成器 编辑框生成器
表达式生成器 表单生成器 网格生成器 列表框生成器
选项组生成器 文本框生成器 参照完整性生成器
4.Visual FoxPro 6.0的设计器
Visual FoxPro 6.0提供的一系列设计器(Designers),为用户提供了一个友好的图形界面操作环境,用以创建、定制、编辑数据库结构、表结构、报表格式、应用程序组件等。
Visual FoxPro 6.0提供的设计器及其功能,见表1-10。
表设计器 查询设计器 视图设计器
表单设计器 报表设计器 标签设计器
数据库设计器 数据库设计器 连接设计器
菜单设计器 数据环境设计器(共46张PPT)
第9章 报表与标签设计
本章要点
8.1.1 报表向导
8.1.2 打开报表设计器
8.1.3 报表生成器介绍
8.1.4 快速报表
8.1.5 修改用快速报表产生的报表
8.1.6 设计报表
8.1.7 报表输出
8.2 标签的设计与使用
8.1.1 报表向导
启动表单向导有以下四种途径:
(1)打开“项目管理器”,选择“文档”选项卡,从中选择“报表”。然后单击“新建”按钮。在弹出的“新建表单”对话框中单击“报表向导”按钮。
(2)在系统菜单中选择【文件】|【新建】命令,或者单击工具栏上的“新建”按钮,打开“新建”对话框,在文件类型栏中选择“报表”。然后单击“向导”按钮。
(3)在系统菜单中选择【工具】|【向导】|【报表】命令。
【例8-1】利用报表向导设计学生成绩报表,要求输出学生学号、姓名、课程代号、成绩并保存为“REPORT1”。
① 启动报表向导 :因为本例报表数据基于两个表(STUD和SC),所以在“向导选取”对话框中应选择“一对多报表向导”
② 选择父表字段:
在如图中选择数据表STUD,
从“可用字段”列表中选择“学号”,
单击左边的左箭头按钮,
或者直接双击“学号”字段,
该字段会自动出现在“选定
字段”列表中,同样方法
添加姓名、班级字段
③ 选择子表字段:在如图中选择SC表,并把课程代号和成绩字段加入到“选定字段”列中。单击“下一步”按钮
④ 为父__子表建立关系:在如图中,在STUD表中选择“学号”,在SC表中也选择“学号”,这样在STUD表和SC表之间便依学号字段建立了关系。单击“下一步”按钮,打开排序对话框
⑤ 排序:在如图排序对话框中选择“学号”,单击“添加”按钮,这样报表将学号进行排序。单击“下一步”按钮,出现 “选择样式”对话框
⑥ 选择样式:在如图“选择样式 ”对话框中选择需要的样式,如“账务式”,选择样式时,对话框左上角可预览样式效果。单击“下一步”,打开最后一个对话框
⑦ 在如图所示对话框中,设置报表标题为“学生成绩报表”,单击“预览”可以观察报表效果,如果满意,单击“完成”按钮,系统会打开另存为对话框,输入报表方件名(report1)后,单击“确定”保存报表。由报表向导产生的报表如果不满足要求,可以在报表设计器中作进一步修改。
8.1.2 打开报表设计器
启动报表设计器有多种方法:
● 菜单方法:若是新建报表,在系统菜单中选择【文件】|【新建】命令,在文件类型对话框选择“报表”,单击“新建”按钮;若是修改报表,则选择【文件】|【打开】命令,在“打开”对话框中选择要修改的报表文件名,单击“打开”按钮。
● 命令方法:在COMMAND窗口输入如下命令:
CREATE REPORT <文件名> &创建新的报表

MODIFY REPORT <文件名> &打开一个已有的报表
● 在项目管理器中,先选择文档标签,然后选择报表,单击“新建”按钮。若需修改报表,选择要修改的报表,单击“修改”按钮。
8.1.3 报表生成器介绍
报表设计器如图所示,默认包括3个带区:页标头(Page Header)、细节(Detail)和页脚(Page Footer),每个带区的底部显示分隔栏
(1)标题(Title):标题区的信息在报表的开始处打印一次。
(2)页标题(Page Header):页标题的内容在报表的每一页开头打印一次
(3)细节(Detail):内容区是报表的主体,用于输出数据库的记录,一般在该区放置数据库字段。打印报表时,细节区会包括数据库的所有记录
(4)页注脚(Page Footer)
页脚区的内容在每页的最底部打印,一般包含页码、每页的总结和说明信息等。
(5)总结(Summary)
总结只在报表的末尾打印一次,一般利用本区打印总计或平均值等信息。
(6)组标头和组注脚带区
用于分组报表,组标头在每个分组开始时打印一次,组注脚带区的内容在每个分组结束时打印一次
(7)列标头和列注脚带区
列标头和列注脚带区主要用于分栏报表,选择【文件】|【页面设置】命令,将打开“页面设置”对话框,将“列数”设置成>1的值,“间隔”稍作调整,单击“确定”,则列标头和列注脚会在报表设计器中出现
(8)调整报表带区高度
将鼠标指针指向某带区分隔条,出现上下双箭头时,按住左键上下拖动分隔条即可改变报表带区高度。
2.控件的名称和作用
“控件工具栏”中控件的名称与作用如图所示。
3.报表设计器工具栏
“报表设计器工具栏 ”中控件的名称与作用如图所示
8.1.4 快速报表
操作步骤:
选择主菜单中的【报表】|【快速报表】命令 ,打开“快速报表对话框 ”。
字段布局:用以选取字段排列方式
标题:选择此项,字段名将作为列标题出现
将表添加到数据环境中:选择此项,则把报表的数据源加到数据环境中
字段:单击该按钮,打开字段选择对话框,用户可以选择报表中将出现哪些字段,在缺省情况下,包括除“通用”字段外的全部字段。
8.1.5 修改用快速报表产生的报表
操作步骤如下:
(1)打开要修改的报表
(2)添加报表标题
① 在系统菜单中选择【报表】|【标题/总结】命令,报表窗口增加两个带区:标题和总结。
② 选择文本控件,然后在标题带区单击,输入“学生信息”。
③ 选择“标题”区的文本对象(用鼠标单击),在系统菜单中选择【格式】|【字体】命令,系统会打开一个标准的字体对话框,即可以设置文本的各种属性。
④ 删除不需要的字段:选择“备注”字段对象,按Delete键。
(3)修改列标题。
① 单击原来的列标题,可选择列标题对象,然后按Delete键删除之。
② 选择文本控件,单击页标题区,添加新的标题。
(4)添加表格线
① 选择线条控件,在页标头区的顶部和底部各画一条横线,每列画一条竖线。
② 选择线条控件,在细节区底部添加一条横线,每列添加一条竖线,注意与页标题区的竖线对直。
8.1.6 设计报表
1.设置报表数据环境
“数据环境设计器”窗口中的数据源将在每次运行报表时打开,而不必以手工方式打开所使用的数据源
数据环境通过下列方式管理报表的数据源:打开或运行报表时打开表或视图;基于相关表或视图收集报表所需数据集合;关闭或释放报表时关闭表或视图。下面通过实例的方式说明把数据源加入报表数据环境的方法。
【例8-2】为STUDENT数据库设计一个报表:要求打印出学生的学号、姓名、班级、课程名、成绩。本例为该报表设置数据环境。
分析:因为学号、姓名、班级来自STUD表,课程名来自COURSE表,成绩来自表,所以数据源应包括上述三个表:STUD、COURSE、SC
操作步骤:
(1)打开“报表设计器”生成一个空报表,在系统菜单中选择【显示】|【数据环境】系统打开“数据环境设计器”窗口,如图所示
(2)在“数据环境设计”窗口中右击鼠标,从快捷菜单中选择【添加】或在系统菜单中选择【数据环境】|【添加】命令
(3) 建立表之间的关系
选择STUD表的“学号”字段,按住鼠标左键拖曳到SC表的“学号”索引上后松开鼠标
同样的方法,建立SC表与COURSE表之间“课程号”之间的关系
选择表的关系(单击表之间的连线),右击鼠标,在快捷菜单中选择【属性】,打开属性窗口后,设置ONETOMANY属性为TRUE
(4)保存报表:单击设计器的关闭按钮,系统会打开“保存”对话框,在对话框中输入文件名:“REPORT3”,单击“保存”按钮
2.创建报表变量
(1)若已经建立了报表,则先可把报表打开,如果没有建立报表,则新建一个报表。
(2)选择系统菜单中的【报表】|【变量】命令,将弹出如图所示的“报表变量”对话框。
(3)在“变量”框中输入一个变量名。
(4)在“要存储的值”框中输入一个变量或其他的表达式,也可以单击后面的按钮,再在弹出的“表达式生成器”中创建一个表达式。
(5)还可以从其列出的七种计算方式中选择一种作为该表达式的计算选项。
(6)如果需要,也可以为所定义的报表变量设定一个初始值
3.添加报表控件
(1)标签控件 :用于显示静态文本
添加标签控件方法:在“报表控件”中选择“标签按钮”后,移动鼠标到窗口中的合适位置,单击鼠标左键,出现“∣”插入点后输入文本信息
(2)绘图控件
绘图控件包括线条、矩形和圆角矩形。在“报表控件”中选择相应的绘图控件,然后在报表的一个带区拖曳鼠标,将生成相应的图形。
(3)域控件
域控件的添加和布局是报表设计的核心,用于打印表或视图中的字段、变量和表达式的计算结果
① 添加域控件
最方便的做法是右击报表,从快捷菜单中选择 【数据环境】命令,打开报表的“数据环境设计器”窗口,选择要使用的表或视图,然后把相应的字段拖曳到报表指定的带区中即可
另一个方法是使用“报表控件”工具栏中的“域控件”按钮。单击该按钮,然后在报表带区的指定位置上单击鼠标,系统将显示一个“报表表达式”对话框
可以在“表达式”文本框中输入字段名、变量名或表达式,也可单击右侧“…”按钮,打开“表达式生成器对话框”
如果添加的是可计算字段,可在图8-18中单击“计算”按钮,打开“计算字段”对话框,如图所示。用户可以选择表达式的计算方法。例如表达式是STUD表的“学号”,在此选择“计数”,则报表时按学号统计记录数。
② 定义域控件的格式
双击域控件,可随时打开域控件的“报表表达式”对话框。在“报表表达式”对话框中,单击“格式”文本框后面的按钮,系统弹出“格式”对话框
选定所需的类型,然后选取“编辑选项”区域的有关选项
③ 设置打印条件
单击“报表表达式”对话框中“打印条件”按钮,将显示如图所示的“打印条件”对话框
“有条件打印”区域中包括三个复选框:
●“在新页/列的第一个完整信息带内打印”选中,表示在同一页或同一列中不打印重复值,换页或换列后遇到第一条新记录时打印重复值。该复选框只在“打印重复值”选择“否”时有效。
●“当此组改变时打印”选中,表示当右边的下拉列表中显示的分组发生变化时,打印重复值。该复选框只在“打印重复值”选择“否”并有分组时有效。
●“当细节区数据溢出到新页/列时打印”复选框选中,表示当细节带区的数据溢出到新页或新列时打印重复值
(4)添加图片对象
① 添加图片
在“报表控件”工具栏中单击“图片/ActiveX绑定控件”按钮,在报表的一个带区内单击并拖动鼠标拉出图文框,松开鼠标时将弹出“报表图片”对话框,如图所示。
●插入文件中的图片:在“图片来源”区域选中“文件”,并输入一个图形文件的位置和名称,或单击文本框右边的“…”按钮,打开“打开”对话框,选择一个图片文件
● 添加图形(通用型)字段:在“报表图片”对话框的“图片来源”区域选择“字段”,在“字段”框中输入字段名,或单击字段框右侧的“…“按钮来选取字段
② 调整图片
当图片与图文框的大小不一致时,需要在“报表图片”对话框中选择相应的选项来控制图片的显示行为
●“裁剪图片” :图片将以图文框的大小显示图片
●“缩放图片,保留形状” :图文框中放置一个完整、不变形的图片在这种情况下,可能无法填满整个图文框
●“缩放图片,填充图文框”:使图片填满整个图文框 ,在这种情况下,图片纵横比例可能会改变,从面引起图片的变形
4.报表控件操作与布局
(1)选择控件:用鼠标单击控件可以选定该控件,被选定的控件四周出现8个控点
(2)设置控件字体:选择要设置字体的控件,从系统菜单中选择【格式】|【字体】,将打开标准字体对话框
(3)调整控件的大小:选定控件,拖动控件四周的某个控点,改变控件的宽度和高度
(4)控件布局:利用“布局”工具栏中的按钮,可以方便地调整表单窗口中被选中控件的相对大小或位置
5.设计分组报表
一个报表可以设置一个或多个数据分组,组的分隔基于分组表达式
设置分组表达式:从系统菜单中选择【报表】|【数据分组】命令。
在“分组表达式”框内键入分组表达式,或者单击“…”按钮,在“表达式生成器”对话框中创建表达式
组属性主要用于指定如何分页,在“组属性”区域中有四个复选框,根据不同的报表类型,有的复选取框不可用
6.分栏报表
从系统菜单中选择【文件】|【页面设置】命令,弹出如图所示的“页面设置”对话框。
在“列”区域,把“列数“ 微调器的值调整为栏目数,例如列数为2,则将整个页面平均分成两部分,调整列之间的间隔值,如间隔为0.4
设置顺序:在“页面设置”对话框中,单击右面的“自左向右”打印顺序按钮即可
8.1.7 报表输出
1.页面设置
① 设置左边距
从系统菜单中选择【文件】|【页面设置】命令,打开“页面设置”对话框 ,在“左页边距”框中输入“左边距”数值,页面布局将按新的页边距显示
② 打印设置
在“页面设置”对话框中,单击“打印设置”按钮,打开“打印设置”对话框。可以从“大小”列表中选择纸张大小。默认的打印方向为纵向,若要改变纸张的方向,可从“方向”区选择横向,再单击“确定”按钮
2.设计时打印与预览报表
可以从系统菜单中选择【显示】|【预览】命令,
或在“报表设计器”中单击鼠标右键从弹出的快捷菜单中选择【预览】命令,
也可以直接单击“常用”工具栏中的“打印预览”按钮
3.程序中调用报表
预览
REPORT FORM <报表文件名> [ IN SCREEN]/ [WINDOW 表单名] [范围] [FOR 条件表达式]
打印输入报表
REPORT FORM <报表文件名> [范围] [FOR 条件表达式]
输出到指定的文件
REPORT FORM <报表文件名> [范围] [FOR 条件表达式]
8.2 标签的设计与使用
在实际应用中并不总是要求数据以表格形式输出,例如个人名片,邮件标签,借书卡片等,往往需要以标签卡片的形式输出某些数据
标签是采用多列报表布局,为匹配特定标签纸而对列作特定设置的报表。
8.2.1 标签向导
启动标签向导:进入项目管理器,在“文档”卡中选中“标签”,而后单击“新建”按钮
该对话框用于为标签指定数据源
选择标签类型 :
“列”是指沿纸张水平方向打印的标签个数
大小=高*宽
定义标签的布局
在“文本”输入框中可输入任何文字串,例如输入“学生信息卡”,按“添加”按钮可把文字串添加到“选定的字段”框中,成为每张标签上都出现的文字
在“可用字段”框中选中的任何字段,也可以添加到“选中的字段”框
如果想另起一行,可以单击中部的“回车”按钮
排序
如选择排序字段如“学号”。单击“添加”按钮
8.2.2 标签设计器
进入某项目管理器,选择“文档”卡的“标签”项目,单击“新建”按钮,在“新建标签”对话框中单击“新建标签”按钮
选择标签布局
“标签设计器”窗口
标签设计器的常规操作与报表设计器完全相同
8.2.3 标签输出
在设计时预览或打印标签的操作与报表相同
在程序或命令窗口中打印标签可用下列命令:
LABEL FORM <标签文件名>[范围][FOR 条件][WHILE 条件] [TO PRINTER]
在程序或命令窗口中预览标签可用下列命令:
LABEL FORM <标签文件名>[范围][FOR 条件][WHILE 条件][ PREVIEW]
同课章节目录