VFP

来源:百度文库 编辑:神马文学网 时间:2024/04/19 02:14:42
Visual Foxpro 6.0程序设计教程
第一章  绪论
数据库技术产生于60年代末、70年代初,它的出现使计算机应用进入了一个新的时期——社会的每一个领域都与计算机应用发生了联系。数据库是计算机的最重要的技术之一,是计算机软件的一个独立分支,数据库是建立管理信息系统的核心技术,当数据库与网络通信技术、多媒体技术结合在一起时,计算机应用将无所不在,无所不能。
作为本课程学习的开始,我们首先要了解的是:什么是数据库?什么是数据库管理系统?什么是Visual Foxpro?
一、数据库的基本概念
1.什么是数据库
数据库这个词有多种解释,简单的定义是这样的:数据库(DataBase)是结构化数据的集合。
David M.Kroenke关于数据库的定义是:数据库是指自描述的完整记录的集合。它表达了三层含义:
a.数据库是自描述的。
数据库除了包含用户的源数据以外,还包含关于它本身结构的描述,这个描述称作数据词典(或数据目录、元数据)。从这个意义上讲,数据库与作为一个自描述的书的集合的图书馆相似:除了书籍以外,图书馆还包含一个描述它们的卡片目录。
b.数据库是集成记录的集合。
数据的标准结构如下:位 —> 字节 —> 域 —> 记录 —> 文件, 按这种模式说,文件组合成数据库是非常诱人的,但却无法深入,数据库将包含四种数据:用户数据文件、元数据、索引、应用元数据。
用户数据大多表示为表格,称之为数据表,它存放了用户的各种有用资料和数据。
例如:
学生姓名指导老师老师电话
刘小景钱志国5666043
李  娟杨一如5666120
古介新吴  萌4108219
屈  达钱志国5666043
王成义吴  萌4108219
元数据是关于用户数据的结构的描述,称之为系统表。
例如:
表名字段数主关键字
Student7学号
Adviser4姓名
Guideplan3学生姓名
索引数据改进了数据库的性能和可访问性,称之为概括数据。
例如:
学生姓名指导老师
古介新吴  萌
李  娟杨一如
刘小景钱志国
屈  达钱志国
王成义吴  萌
指导老师老师电话
钱志国5666043
吴  萌4108219
杨一如5666120
应用元数据用来存储用户表格、报表、查询、媒体数据和其它形式的应用组件。并非所有的DBMS都支持应用组件,支持应用组件的DBMS也不一定把全部组件的结构作为应用元数据存储在数据库中。
c.数据库是模型的模型。
数据库是用户关于现实世界的模型的模型。具体解释是:非计算机操作数据的情况下,人们所建立的一套文件、表格、数字等的处理内容和规则是人们关于现实世界的模型,在计算机操作数据的情况下,数据库设计者将在人们关于现实世界的模型的基础上再次建模,从而建立一个适用于计算机处理的数据库模型。
三个世界的划分:
现实世界(客观世界) :实体、实体集、属性、实体标识符
信息世界(观念世界) :记录、文  件、字段、关键字
数据世界(计算机世界):位、字节、字、块、卷
2.从文件管理到数据库管理
前面提到从文件组合成数据库是非常诱人的,但却无法深入。实际上,在数据库处理之前,确实采用的文件管理方式,即用数据文件来存放数据,并通过高级语言完成对数据文件的操作。一个数据文件包含若干个“记录(Record)”,一个记录又包含若干个“数据项(Data Item)”,用户通过对文件的访问实现对记录的存取。通常称支持这种数据管理方式的软件为“文件管理系统”,它一直是操作系统的重要组成部分。
随着计算机处理的数据量不断增加,文件管理系统采用的一次最多存取一个记录的访问方式,以及在不同文件之间缺乏相互联系的结构,不能适应管理大量数据的需要,于是数据库管理系统应运而生,并在上世纪60年代末诞生了第一个商业化的数据库系统——IBM的IMS(Information Management System)。
3.数据库系统的特点
与文件系统比较,数据库系统有下列特点:
a.数据的结构化。文件系统中单个文件的数据一般是有结构的,但从整个系统来看,数据在整体上没有结构,数据库系统则不同,在同一数据库中的数据文件是有联系的,且在整体上服从一定的结构形式。
b.数据共享。在文件系统中,数据一般是由特定的用户专用,数据库系统中的数据可以有为不同部门、不同单位甚至不同用户所共享。
c.数据独立性。在文件系统中,数据结构和应用程序相互依赖,一方的改变总是要影响到另一方的改变。数据库系统中的数据文件与应用程序之间的这种依赖关系已大大减小。
d.可控冗余度。数据专用时,每个用户拥有使用自己的数据,难免会出现数据相互重复,这就是数据冗余。实现数据共享后,不必要的数据重复将全部消除,有时为了提高查询效率,也保留少量的重复数据,其冗余度可以由设计者控制。
4.数据库系统的分代
数据库系统可分为三代。
a.非关系型数据库系统。是对第一代数据库系统的总称,包括层次型数据库系统和网状型数据库系统。其主要特点是:采用“记录”作为基本数据结构,在不同“记录型”之间,允许存在相互联系,一次查询只能访问数据库中的一个记录。
b.关系型数据库系统(RDBS)。1970年,E.F.Codd在一篇名为“A Relational Model of Data For Large Shared Databanks(大型共享数据库数据的关系模型)”文章提出了“关系模型”的概念。70年代中期,商业化的RDBS问世,数据库系统进入第二代,目前PC机上使用的数据库系统主要是第二代数据库系统。其主要特点是:采用“表格”作为基本数据结构,在不同的表之间,允许存在相互联系,一次查询可以访问整个表格中的数据。
c.对象—关系模型数据系统(ORDBS)。将数据库技术与面向对象技术相结合,以实现对多媒体数据和其它复杂对象数据的处理,这就产生了第三代数据库系统。其主要特点是:包含第二代数据库系统的功能,支持正文、图形图像、声音等新的数据类型,支持类、继承、方法等对象机制,提供高度集成的、可支持客户/服务器应用的用户接口。
5.数据库系统的分类
1987年J.D.Ullman在一篇题为“数据库理论的过去和未来”的论文中,把数据库理论概括为4个分支:关系数据库、分布式数据库、演绎数据库、面向对象数据库。
具体分类可以参考如下内容:
a.单用户数据库和多用户数据库。VFP是一种多用户数据库系统。
b.集中式数据库和分布式数据库。集中和分布是对数据存放地点而言的,分布式数据库把数据分散存储在网络的多个节点上,彼此用网络线路连接,如银行数据。分布式数据库和多用户数据库都是在网络上使用的,但多用户数据库并非一定是分布存储的,如机票数据。
c.传统数据库和智能数据库。传统数据库存储的数据代表已知的事实,智能数据库则除了存储事实外还能存储用于逻辑推理的规则,所以又称之为“基于规则的数据库(rule-based database)”。
二、数据库管理系统和数据库应用系统
1.数据库管理系统
实际上,数据库是存于某种存储介质上的相关数据有组织的集合,为了在计算机中对数据库进行定义、描述、建立、管理和维护,应通过特定的数据库语言进行,这就需要一套支持该数据库语言的系统软件,称作数据库管理系统(DBMS)。一般说,数据库管理系统具有下列功能:
a.数据定义功能。DBMS向用户提供“数据定义语言(DDL)”,用于描述数据库的结构,在关系数据库中其标准语言是SQL(Structured Query Language),它提供了DDL语句。
b.数据操作功能。对数据库进行检索和查询,是数据库的主要应用。为此DBMS向用户提供“数据操纵语言(DML)”,用于对数据库中的数据进行查询,同样SQL也提供了DML语句。
c.控制和管理功能。除了DDL和DML两类语句外,DBMS还具有必要的控制和管理功能。
在讨论可视化的数据库管理系统(如VFP、Access)时,一般而言,从组成结构上看,DBMS的特点和功能可以分为三个子系统:设计工具子系统、运行子系统和DBMS引擎。
设计工具子系统提供设计工具,包括表生成、窗体生成、查询生成、报表生成和过程语言编译器等工具,设计工具子系统与开发人员相关联。运行子系统提供对设计时产生的程序的执行,它与用户接口。DBMS引擎介于设计工具及运行子系统与数据本身之间。实际上,它将根据以上组件的请求,将其翻译成对操作系统的命令,以实现对物理介质上的数据的读写。除此之外,DBMS引擎还涉及事务管理、锁定、备份和恢复等工作。
2.数据库应用系统
数据库应用系统(DataBase Application System、DBAS)专指基于数据库的应用系统。一个DBAS通常由数据库和应用程序两部分组成,它们都需要在DBMS支持下开发。
开发一个信息系统,一是要设计数据库,二是要开发应用程序。在开发的方法上有两种重要的方法:信息工程、4GT范型。
三、微机XBase关系数据库系统
1.XBase数据库的演变
上世纪70年代末,Ashton-Tate公司研制dBASE Ⅱ。1984年和1985年,分别推出dBASE Ⅲ 和dBASE Ⅲ + 。1987年,美国FOX软件公司公布了与dBASE兼容的FoxBASE+。
1989年,FOX软件公司开发了FoxBASE+的后继产品——FoxPro。1992年,美国Microsoft公司收购了FOX公司,第二年推出了FoxPro for Windows(2.5),以后又推出FoxPro for Windows 2.6版。
1995年,微软首次将可视化程序设计引入FoxPro,并将其更名为Visual Foxpro 3.0。简称为VFP 3.0。以后推出过VFP 5.0版,今天我们学习的是VFP 6.0版。
2.VFP的主要特点
a.强大的查询和管理功能。
b.引入了数据库表的新概念。
c.扩大了对SQL语言的支持。
d.大量使用可视化界面操作工具。
e.支持面向对象的程序设计。
f.通过OLE实现应用集成。
g.支持网络应用。
四、VFP的界面组成与操作
1.VFP的界面的组成
a.窗口。包括程序窗(它是开发或运行VFP程序的场所)、命令窗(它位于程序窗之内,它用来显示命令)、工具窗。
b.图标。图标是用来表示不同程序和文件的小图像。
c.采单。VFP主要使用两类菜单:下拉式菜单(一般是系统菜单)和弹出式菜单(它平时不在屏幕上,仅当使用时弹出)。
d.对话框。对话框是以人机对话为主要目的的一类窗口,包括文本框、选择框、列表框等等。
2.VFP的界面操作
a.鼠标的操作。鼠标的基本操作有:单击(click)、双击(double click)、拖动(drsp)等。
b.窗口的操作。窗口操作主要有:关闭、移动、改变大小、最大化、最小化等。
c.菜单的操作。菜单是当前可用的命令的集合。VFP的主菜单拥有近70条命令。可以通过鼠标,也可以通过快捷键盘进行操作。
d.对话框的操作。对于按钮的操作主要是单击,但它可能展开另一个对话框。对于文本框的操作,主要是编辑文本。对于选择框的操作主要是单选或复选。对于列表框的操作主要是选中内容。对于组合框的操作主要是通过下拉选中内容。
五、VFP的工作方式
1.VFP命令的格式与特点
a.命令格式。一般说,VFP的命令总是由一个命令字的动词开头,后随一个宾语和若干子句(命令子句),用来说明命令的操作对象、操作结果与操作条件。如:
use SB
list
list for 价格<10000
copy to ZSB for 主要设备
sort to JGPX on 价格 fields 名称,价格
b.命令特点。命令的特点有三:一是采用英文祈使句的形式;二是操作对象、结果和条件均可以用命令子句的形式来表示;命令只讲对操作的要求,不描述具体的操作过程。
c.命令分类。VFP拥有近500条命令,大致可分为以下7类:一是建立和维护数据库命令;二是数据查询命令;三是程序设计命令;四界面设计命令;五是文件和程序管理命令;六是面向对象设计命令;七是其它命令。
2.两类工作方式
a.交互操作方式。交互操作方式有命令执行方式和图形界面操作方式两种情况。
b.程序执行方式。建立程序,执行程序。
六、VFP的辅助设计工具和项目管理器
1.VFP的辅助设计工具
a.向导。向导是一种快捷的设计工具,它通过一组对话框依次与用户对话,引导用户分步完成VFP的某项任务。
向导名称功能
表向导查询向导本地视图向导远程视图向导交叉表向导文档向导图表向导报表向导分组/总计报表向导一对多报表向导标签向导表单向导一对多表单向导数据透视表向导邮件合并向导安装向导升迁向导SQL升迁向导导入向导应用程序向导WWW搜索页向导创建一个表创建查询创建一个视图创建远程视图创建一个交叉表查询格式化代码并生成文本文件创建一个图表创建报表创建具有分组和总计功能的报表创建一个一对多报表创建标签创建一个表单创建一个一对多表单创建数据透视表创建一个邮件合并文件从发布树中的文件创建发布磁盘创建一个Oracle数据库创建一个SQL Server数据库导入或追加数据创建一个VFP应用程序创建可以访问该数据库的Web页面
b.设计器。设计器一般比向导具有更强的功能,可用来创建或者修改VFP应用程序所需要的构件。
向导名称功能
表设计器查询设计器视图设计器表单设计器报表设计器标签设计器数据库设计器连接设计器菜单设计器创建表并建立其索引运行本地表查询运行远程数据源查询;创建查询创建表单创建报表创建标签设置数据库为远程视图创建连接创建菜单
c.生成器。生成器也叫构造器,来源英文builder。它的主要功能是在VFP应用程序的构件中生成并加入某类控件。
向导名称功能
组合框生成器命令组生成器编辑框生成器表单生成器表格生成器列表框生成器选项组生成器文本框生成器自动格式生成器参照完整性生成器生成组合框生成命令组生成编辑框生成表单生成表格生成列表框生成选项组生成文本框格式化控件组数据库表间创建参照完整性
2.VFP的项目管理器
a.项目管理器的功能。
b.项目管理器的蜀面操作。
第二章  表的基本操作
下面介绍以界面操作方式建立与修改表的方法,随后集中阐明VFP表达式的概念,最后讨论有关的命令。需要注意的是,VFP将表分为数据库表和自由表两种。
一、表的建立与修改
1.表结构的建立
表结构的建立要完成两个工作,一是设计表的结构,二是建立表的结构。
⑴ 设计表结构
设计表的结构就是定义各字段的属性,基本的字段属性或包括字段名、字段类型、字段宽度和小数位数等。
a.字段名。字段名用业标识字段,它是一个以字母或汉字开始,长度不超过10的字母、汉字、数字、下划线序列。
b.字段类型。字段类型有:
字 符 型(C)、存放从键盘输入的可显示或打印的汉字或字符。宽度最多为254字节。空格也算
数 值 型(N)、存放由符号、数字、小数点所组成的数值。最多20位。
货 币 型(Y)、与数值型不同的是数值保留4位小数。宽度为8字节。
日 期 型(D)、默认:存放格式如mm/dd/yy或mm、dd、yy的日期数据。宽度为8字节. 其它格式需设置。
日期时间型(T)、存放格式如mm/dd/yy hh:mm:ss AM的日期时间数据。宽度为8。
逻 辑 型(L)、存放逻辑值为T或F。宽度为1字节。
浮 动 型(F)、同数值型,为与其它软件兼容而设置。
整    型(I)、存放不带小数的整数。宽度为4。
双精度型(B)、存放精度要求较高的数值,或真正的浮点型。宽度为8字节。
备 注 型(M)、能接受所有字符数据,并保存在.FPT文件中。宽度为4字节。
通 用 型(G)、能存放图形、表格、声音等数据,保存在.FPT文件中。宽度为4字节。
c.字段宽度。字段宽度用以表明允许字段存储的最大字节数。
d.小数位数。只有数值型、浮点型及双精度型字段才有小数位数。
⑵ 建立表结构
建立表结构有两种方法,一是通过菜单方式打开对话框及表设计器来建立,二是通过命令方式打开对话框及表设计器来建立。
a.菜单方式。选定“文件”菜单→选定“新建”命令→选定对话框中的“表”→选定“新建文件”按钮→出现创建对话框→选定“保存在”中的在输入表中输入SB→选定“保存” →出现表设计器,等等。
b.命令方式。执行CREATE命令。
⑶ 表设计器的字段选项卡
通过表设计器可以设计合适的二维表。
2.表数据的输入
建立表结构后若要立即输入数据,就会出现SB记录编辑窗口,此时窗口中的字段的排列次序及字段名右侧文本区宽度都与表结构定义相符;其中日期型字段的两个/间隔符已出现在相应的位置上;备注型与通用型字段中已分别显示memo和gen标志,意味着这两种字段用其它方法来输入或修改数据。
应注意编辑窗口的打开和关闭方法。
窗口开关操作记录编辑窗口备注型或通用型字段编辑窗口
打开打开表,选定显示菜单的浏览命令双击memo或gen区,或光标在该区时按Ctrl+PgDn
关闭数据存盘单击窗口右上角的关闭按钮(自动存盘),或按Ctrl+W键
放弃存盘按Esc或Ctrl+Q键
对于表的打开和关闭,可能有多种方法。最常用的命令是USE命令,其格式是:
USE[<文件名>]
其次还有通过菜单打开命令来打开表。通过窗口菜单的数据工作期命令来打开表等。
关闭表还有如下命令方法:
CLEAR ALL
CLOSE ALL
CLOSE DATABASE [ALL]
CLOSE TABLES [ALL]
也可以通过窗口菜单的数据工作期命令来关闭表。还有就是通过退出VFP来关闭,如选定“文件”菜单中的“退出”命令,或是在命令窗口中输入命令QUIT。
3.表结构的修改
修改表结构的一般命令是:当表处于打开状态下,可用MODIFY STRUCTURE命令,它将打开表设计器以便修改表结构。当然也可通过菜单打开表设计器。另外,可用通过表向导来修改表结构。
4.表数据的修改
VFP允许表数据在窗口中显示、查看和修改,并为此提供了BROWSE、CHANGE、EDIT等多种命令。另外追加记录、删除记录的命令有APPEND、DELETE、PACK等。
二、表达式
表达式是由常量、变量、函数以及运算符组合在一起的具有计算、判断或其它意义的式子。
1.常量
常量是固定不变的数据,它具有数值型、字符型、日期型、日期时间型、逻辑型、和货币型等多种类型。
a.数值型常量。整数、小数或用科学计数法表达的数都是数值型常量,例如:10,-100,2.888,0.123456E-3,0.87654E2等。
b.字符型常量。字符型常量是用双引号、单引号或方括号括起来的字符或字符串。例如:“微机”,‘PC机’,[计算机],“3.1415926”等。VFP字符串的量大长度为254字符。注意:若字符串中含有某种定界符,则须用另一种定界符括起来,例如:“I’m a student”。
c.日期型和日期时间型常量。日期型常量必须用花括号括起来,例如:{08/17/1999},{08/17/99},空白日期可以表示为{ }或{/}。时期时间型常量的写法如:{08/17/99 8:45},空白的时期时间可表示为{/:}。
还有一种严格的格式:^yyyy-mm-dd[,][hh[:mm[:[ss][a|p]。注意,在执行命令时VFP默认使用严格的格式,如果要使用通常的格式,必须先设置:SET STRICTDATE TO 0或SET STRICTDATE TO 1。
d.逻辑型常量。逻辑型常量只有真和假两种值,.T.,.t.,.Y.,.y.都可能表示真,.F.,.f.,.N.,.n.则表示假。
e.货币型常量。货币型常量以$符号开始,并四舍五入到小数4位。例如:$100.12345,计算结果为:$100.1235。
2.变量
在命令操作和程序运行过程中其值允许变化的量称之为变量。变量包括内存变量、字段变量和系统内存变量等3种。
⑴ 内存变量
内存变量可用来存储数据,定义内存变量时需为它取名并赋初值,内存变量建立后存储于内存中。
a.内存变量命令规则。
内存变量与字段、文件的命名规则有所不同,在VFP中除字段和文件外,所有的用户命名,例如内存变量、函数的取名,均遵守以下规则:以字母或下划线开始,由字母、数字、下划线组成,至多128字符,不可与系统保留字同名。
b.内存变量赋值命令。
内存变量赋值有两种命令格式:
<内存变量名>=<表达式>
STORE  <表达式> TO <内存变量名表>
例如:
S=‘VFP’
STORE 2*4 TO n1,n2,n3
c.表达式值显示命令。
命令格式:
? <表达式表>        &&提行显示
?? <表达式表>      &&紧接显示
例如有如下三个命令:
?S
?n1
??‘数据库应用’
则显示结果如下:
VFP
8 数据库应用
d.内存变量数组。
数组是按一定顺序排列的一组内存变量,数组中的各个变量称为数组元素。数组必先定义后使用。
数组的定义格式如下:
DIMENSION|DECLARE  <数组名>  ( <下标1> [,<下标2>] )  [,...]
例如:DIMENSION  a1(3),a2(2,3)
注意:VFP数组的下界为1,上界为定义的下标数值。如上述定义中,数组a1的元素为a1(1)、a1(2)、a1(3)。理论上VFP最多可定义60000多个数组,每个数组最多可包含60000多个元素,实际上最大数将受具体计算机内存空间的制约。
数组的赋值方法如下:
在VFP中,同一数组元素的类型可以不一致,这是其它一般高级程序设计语言不允许的。用赋值命令可为数组元素单个赋值,也可为整个数组的各个元素赋以相同的值,如“a2=8”可以为上面定义的二维数组的6个元素赋以同样的初值8。
二维数组各元素在内存中按行的顺序存储,也可按一维数组来表示数组元素。
⑵ 字段变量
表的每一个字段都是一个字段变量。显然,对于某一字段而言,它的值因记录的不同可能不同。字段变量在建立表结构是定义,修改表结构时可重新定义,或增删字段变量,但应注意,这将改变了表的结构,也将影响表的记录内容。
内存变量简称变量,字段变量简称字段。
⑶ 系统内存变量
VFP提供了一批系统内存变量,它们都以下划线开头,分别用于控制外部设备、屏幕输出格式、或处理有关计算器、日历、剪帖板等方面的信息。
如:_DIARYDATE存储当前日期。
_CLIPTEXT接受文本并送入剪帖板。如执行命令_CLIPTEXT=“VFP”后,剪帖板中就存储了文本VFP
⑷ 内存变量的显示
命令格式:
LIST/DISPLAY MEMORY [LIKE<通配符>] [TO PRINTER [PROMPT] / TO FILE<文件名>]
说明:LIKE子名表示将选出与通配符相匹配的内存变量。TO PRINTER[PROMPT]将显示结果送打印机输出,并提示打印窗口。TO FILE 将显示结果存入文件中。
⑸ 内存变量的清除
命令格式:
RELEASE [ <内存变量表> ] [ ALL [ LIKE / EXCEPT <通配符> ] ]
3.运算与运算符
⑴ 算术、关系、逻辑运算
说明:
a.算术运算的操作数必须是数值,运算的结果也是数值。
b.关系运算两操作数类型须一致,比较的结构是逻辑值。
c.逻辑运算的操作数须是能得出逻辑值的表达式,运算结果也是逻辑值。
d.表达式计算按优先级从高到低执行。
e.表达式值的类型决定了表达式的类型。
运算符表:
运算类型运算符及其优先级
算术运算括号()、 乘方^或**、 乘*、 除/、 求余%、 加+、 减-
关系运算小于<、小于等于<=、大于>、大于等于>=、不等于<>#!=、包含$
逻辑运算非NOT或!、 与AND、 或OR
⑵ 字符、日期、日期时间运算
a.字符运算
+ 运算符:用于连接两个字符串。
- 运算符:用于连接两个字符串,并将前一字符串尾部的空格移到结果字符串尾部。
b.日期与日期时间运算
对日期型数据进行运算是指日期的加减、或日期与天数的加减。例如:
SET STRICTDATE TO 0&& 使用通常的日期格式
{06/30/98}-61&& 结果为04/30/98
{12/31/99}-{12/31/98}&& 结果为365
SET CENTURY ON&& 年份前冠以世纪
{12/31/99}+1&& 结果为01/01/2000
对日期时间型数据进行运算是指日期时间的加减、或日期时间与秒数的加减。例如:
?{09/01/1998 12:00am}+60&& 结果为09/01/1998 12:01:00am
4.函数
函数实质上是具有特定功能的程序,在执行这段程序时只要我们给出函数名和相应的参数即可,VFP提供了200多个函数,具有强大的功能。
⑴ 函数的要素
函数有函数名、参数和函数值三个要素。如:
?SQRT(4)&& 结果为2.00
上例中,函数名为SQRT,参数为4,函数值为2.00。
⑵ 函数类型
所谓函数类型就是函数值的类型。分别有数值型函数、字符型函数、日期型函数、逻辑型函数及其它类型等。
使用TYPE函数能返回表达式的类型,也能测出函数的类型。例如:
?TYPE(“DATE()”)&& 结果为D,表明函数是日期型。
⑶ 常用函数
VFP的函数有很多,下面我们通过列表的形式,按函数的类型进行分类,列出了包括数值型函数、字符处理函数、日期处理函数、逻辑型函数和其它函数在内的三十多个常用函数。
a.数值型函数。
函数名功能例子结果
ABS求绝对值 ABS(-4)4
SQRT求平方根 SQRT(4)2.00
EXP求e的n次方 EXP(2)7.39
INT取整数部分 INT(7.5)7
MAX求较大数 MAX(4,7)7
MOD取模 MOD(8.7,3)2.7
ROUND舍入 ROUND(3.1415,3)3.142
RAND取0~1随机数 RAND()0.85
b.字符处理函数。
函数名功能例子结果
SUBSTR取子串 SUBSTR(“ABCD”,2,2)“BC”
LEFT取左串 LEFT(“ABCD”,2)“AB”
RIGHT取右串 RIGHT(“ABCD”,2)“CD”
LEN求长度 LEN(“ABCD”)4
AT求子串位置 AT(“BC”,“ABCD”,1)2
ALLTRIM删除前、后空格 ALLTRIM(“ ABCD   ”)“ABCD”
SPACE取空格串 SPACE(4)“    ”
UPPER转大写 UPPER(“aBcD”)“ABCD”
LOWER转小写 LOWER(“aBcD”)“abcd”
VAL字符串转数值 VAL(“3.14”)3.14
STR数值转字符串 STR(3.14,5,1)“ 3.1 ”
CHR求ASCII码字符 CHR(65)“A”
ASC求字符ASCII码 ASC(“A”) 65
c.日期处理函数。
函数名功能例子结果
CTOD字符串转换为日期 CTOD(“10/1/99”)10/01/99
DTOC日期转换为字符串 DTOC({10/1/99})“10/01/99”
DTOS日期格式转换 DTOS({10/1/99})“19991001”
TIME返回系统当前时间 TIME()“14:56:12”
DATE返回系统当前日期 DATE()02/01/99
YEAR返回年份 YEAR(DATE())1999
d.逻辑型及其它函数。
函数名功能函数名功能
BOF指针是否在首记录之前DBF返回工作区中打开的表名
EOF指针是否在末记录之后RECNO返回表中的当前记录号
FOUND是否查找到记录TYPE返回表达式的类型
FILE文件是否存在
MDOWN鼠标是否左击
5.VFP命令常用子句
下面以记录显示命令讨论下VFP命令中常用的子句。显示命令格式如下:
LIST / DISPLAY [FIELDS]<表达式表>]  [<范围>]  [FOR<条件>]
[WHILE<条件>]  [OFF]  [TO PRINT [PROMPT] / TO FILE <文件>]
⑴ 命令动词
命令动词是VFP的命令的名字,用来表示命令的操作,如“LIST”,“DISPLAY”等。
⑵ 范围子句
用来确定命令所操作的记录的范围,这样的子句有如下四种:
ALL表示所有记录
NEXT(N)从当前记录起的N个记录
RECORD(N)第N个记录
REST从当前记录起到最后一条记录
注意:一般情况下,缺省范围子句时默认为ALL,如LIST;但也有例外,DISPLAY命令缺省范围子句为当前记录。
⑶ FOR子句
FOR子句的<条件>为逻辑表达式,它指定选择记录的条件。若命令中还含有范围子句,则在指定范围内筛选符合条件的记录。
⑷ WHILE子句
该子句也用于指明操作条件,但它仅在当前记录符合条件时开始依次筛选记录,一旦遇到不满足条件的记录时就停止操作。应当注意,在FOR与WHILE同时出现的命令中,则优先处理WHILE。
⑸ FIELDS子句
FIELDS指出操作的字段。
⑹ OFF子句
为使用户能了解记录的位置,LIST命令自动显示记录号,若要求记录号不显示,只须在命令中使用OFF选项。
⑺ TO PRINT [PROMPT] 子句
结果送打印机,PROMPT将给出提示。
⑻ TO FILE子句
结果送文本文件。
三、表的维护命令
1.表与表结构的复制
a.复制任何文件
命令格式:COPY FILE <文件名1> TO <文件名2>
b.从表复制出表或其它类型的文件
命令格式:COPY TO <文件名> [<范围>] [FOR<条件>] [WHILE<条件>]
[FIELDS <字段名表> / FIELDS LIKE/EXCEPT <字段名通配符>]
[TYPE] [SDF/XLS/DELIMITED [WITH <定界符> / WITH BLANK/WITH TAB] ] ]
c.复制表的结构
命令格式:COPY STRUCTURE TO <文件名> [FIELDS<字段名表>]
2.记录指针的移动
GO[TO] TOP
GO[TO] BOTTOM
GO[TO] <数值表达式>
SKIP
SKIP <数值表达式>
3.记录的插入与追加
INSERT命令用来来插入表记录:
命令格式:INSERT [BLANK] [BEFORE]
INSERT命令可以在表的任意位置插入新记录,但若要在表尾追加新记录则须先将记录指针移到末记录,下面的命令可直接在表尾追加记录。
格式1:INSERT INTO 表名[(字段名1[,字段名2,...])] valueS(表达式1[,表达式,...])
如:INSERT INTO sb(编号,名称,启用日期,价格,主要设备,备注);
valueS(“110-1”,“打印机”,{08/15/97},5000.00,.F.,“调拨”)
格式2:APPEND [BLANK]
格式3:APPEND FROM <文件名> [FIELDS<字段名表>] [FOR<条件>]
[TYPE] [DELIMITED [WITH <定界符> / WITH BLANK/WITH TAB] /SDF/XLS ] ]
4.表记录的删除和恢复
DELETE [<范围>] [FOR<条件>] [WHILE<条件>]
PACK
RECALL [<范围>] [FOR<条件>] [WHILE<条件>]
ZAP
5.表数据的替换
⑴ 成批修改数据
在浏览窗口中修改数据必须由用户键入修改值,而用REPLACE命令能直接将字段用指定的表达式值来替换,因此在程序设计中常使用该命令。
命令格式:
REPLACE <字段名1> WITH <表达式1> [ADDITIVE]  [,<字段名2>   WITH
<表达式2> [ADDITIVE]...[<范围>][FOR<条件>] [WHILE<条件>]
命令功能:在当前表的指定记录中,将有关字段的值用相应的表达式值来替换。若“范围”、“条件”等选项都缺省,则只对当前记录的有关字段进行替换。
例如:
USE SB
REPLACE 价格 WITH 价格-1000,部门 WITH “11” FOR 主要设备
APPEND BLANK
REPLACE 编号 WITH “301-1”,名称 WITH “扫描仪”
REPALCE 备注 WITH “,”+编号+名称 ADDITIVE
⑵ 单个记录与数组间的数据传送
在VFP中,数组元素值或内存变量值能传送到表内以替代记录中的数据,反之亦然。
a.将记录传送到数组或内存变量
命令格式:
SCATTER [ FIELDS<字段名表> / FIELDS  LIKE/EXCEPT <通配字段名> ]
[MEMO] TO <数组名> [BLANK] / MEMVAR [BLANK]
b.将数组或内存变量的数据传送到记录
命令格式:
GATHER  FROM <数组名>/MEMVAR
[ FIELDS<字段名表> / FIELDS  LIKE/EXCEPT <通配字段名> ]
⑶ 成批记录与数组间的数据传送
SCATTER与GATHER命令只能在表的单个记录与数组或内存变量之间进行数据传送,使用COPY和APPEND可能实现成批记录与数组和内存变量之间进行数据传送。
a.将表的一批记录复制到数组
命令格式:
COPY TO ARRAY <数组名>[FIELDS<字段名表>][<范围>][FOR<条件>][WHILE<条件>]
命令功能:
将当前表选定的数据复制到数组中,但不复制复制备注型字段。
b.从数组向表中追加记录
命令格式:
APPEND FROM ARRAY <数组名> [FOR<条件>][WHILE<条件>]
命令功能:
将满足条件的数组行数据按记录依次追加到当前表中,但忽略备注型字段。
6.逻辑表的设置
在表中选择数据是常见的操作,BROWSE、LIST等命令都可包括FOR和FIELDS子句,用来选择记录和字段。但是,使用命令子句来实现数据选择仅在执行该命令时生效一次,使用过滤和字段表等逻辑表的方法,可以一旦为一个表设置逻辑表后,则对该表执行任何操作时一直有效,直到撤消逻辑表为止。
⑴ 过滤器
命令格式:SET FILTER TO [<条件>]
命令功能:从当前表过滤出符合条件的记录,不符合条件的记录将被“遮蔽”,随后对该表的操作仅限于满足过滤条件的记录。
⑵ 字段表
命令格式:SET FIELDS TO [ [<字段名1>[,<字段名2>...]
/ALL[LIKE/EXCEPT<通配字段名>]
SET FIELDS ON/OFF
7.建立与修改表的结构的命令
⑴ 表结构的建立
命令格式:
CREATE TABLE <表名>
(<字段名1> <字段类型>[(<字段宽度>[,<小数位数>])][,<字段名2>...])
命令功能:建立一个由表名表示的表,表中含有指定的字段。
⑵ 表结构的修改
命令格式:
ALTER TABLE <表名>
ADD/ALTER[COLUMN]<字段名><字段类型>[(<字段宽度>[,<小数位数>])]
ALTER TABLE <表名>DROP[COLUMN]<字段名1>/RENAME COLUMN<字段名2>TO<字段名3>
命令功能:修改表结构
第三章  查询与统计
在数据库系统中,数据查询与统计是最常见的两种应用。下面讨论顺序查询和索引查询两种传统查询方法,并对数据工作期、查询设计器和视图设计器3种界面操作查询工具进行介绍,还介绍统计命令与函数,最后将讨论的范围从自由表扩大到数据库表。
一、排序与索引
1.排序
排序就是根据表的某些字段重排记录,排序后产生一个新表,其记录按新的顺序排序,但原文件不变。
命令格式:
SORT TO <新文件名> ON <字段名1> [/A/D/C] [,<字段名2> [/A/D/C]...]
[<范围>] [FOR<条件>] [WHILE<条件>]
[FIELDS<字段名表> / FIELDS LIKE/EXCEPT <通配字段名>]
功能说明:
a./C表示不区分字段值中字母大小写,字段不能选用备注型或通用型。
b.可在ON子句中使用多个字段名实现多重排序。
c.缺省范围、条件等子句表示对所有记录排序。否则只能指定范围内符合条件的记录进行排序,从而生成新表。
d.FIELDS子句指定新表应包括的字段。
2.索引
⑴ 索引的概念
a.记录的物理顺序与逻辑顺序。
文件中的记录一般按其磁盘存储顺序输出,这种顺序称为物理顺序。执行排序后,在新文件中形成了新的物理顺序。
索引则不同,它不改变文件中记录的物理顺序,而是按某个索引关键字(或表达式)来建立记录的逻辑顺序。在索引文件中,所有关键字值按升序或降序排列,每个值对应原文件中相应的记录的记录号,这样便确定了记录的逻辑顺序。今后的某些对文件记录的操作可以依据这个索引建立的逻辑顺序来操作。
请看下面,第一张表是原表文件内容,第二张表是依据“学生姓名”建立的一个排序文件,第三张表是依据“学生姓名”建立的一个索引文件。
Record#学生姓名指导老师老师电话
1刘小景钱志国5666043
2李  娟杨一如5666120
3古介新吴  萌4108219
4屈  达钱志国5666043
5王成义吴  萌4108219
Record#学生姓名指导老师老师电话
1Lij李  娟杨一如5666120
2Liu刘小景钱志国5666043
3Guj古介新吴  萌4108219
4Qud屈  达钱志国5666043
5Wan王成义吴  萌4108219
Record#学生姓名
2Lij李  娟
1Liu刘小景
3Guj古介新
4Qud屈  达
5Wan王成义
b.索引的种类
按扩展名来分类,VFP支持复合索引和单索引两类索引文件,前者扩展名为CDX,后者扩展名为IDX。
复合索引文件允许包含多个索引,每个索引都有一个索引标识,代表一种记录逻辑顺序。这种索引文件总以压缩方式存储,以便占用较少的空间。复合索引文件又有结构的和非结构的两种,若定义复合索引文件时用户为它取了新的名字,则其为非结构的,否则为结构的。打开非结构复合索引文件需使用SET INDEX命令或USE命令中的INDEX子句。结构复合索引文件的主名与表的主名相同,不需在建立索引用进定义,结构复合索引文件随表的打开而打开,在添加、修改或删除记录时还会自动更新维护。
单索引文件只包含一个索引,这种类型是为了与FoxBASE+开发的应用程序兼容而保留的。但若将它定义为压缩的,将不能被FoxBASE+使用。
按功能来分类,索引又分为普通索引、唯一索引、候选索引和主索引四种,其功能如下:
索引类型关键字重复值说 明创建修改命令索引个数
普通索引允许作为一对多永久关系中的“多方”INDEX允许多个
唯一索引允许、但输出无重复值为与以前版本兼容而设置
候选索引不允许、禁输入重复值可用作主关键字,可用于在永久关系中建立参照完整性INDEXCREATE TABLEALTER TABLE
主索引仅适用数据库表,可用于在永久关系中建立参照完整性CREATE TABLEALTER TABLE仅可一个
概念:
主关键字是能唯一标识记录的索引关键字,它应能排除关键字重复值。例如将姓名字段作为索引关键字,若出现同名同姓人员,也即出了关键字重复值,这样的关键字就不是主关键字。
唯一索引型索引文件,对于关键字值相同的记录,索引中只列入其中的第一个记录。
⑵ 索引的建立
索引建立的命令格式:
INDEX ON <索引关键字> TO<单索引文件名>/TAG<索引标识名>[OF<复合索引文件名>]
[FOR<条件>] [COMPACT] [ASCENDING/DESCENDING] [UNIQUE/CANDIDATE] [ADDITIVE]
命令功能:建立索引文件或增加索引标识。
功能说明:
a.索引关键字可用表达式表示。
b.TO子句适用于建立单索引文件,其主名指定;TAG子句用于建立复合索引文件及索引标识,或增加索引标识,索引标识由该子句的<索引标识名>指出。
c.该命令默认建立普通索引型索引文件;UNIQUE表示建立唯一索引型索引文件;CANDIDATE表示索引文件是候选索引型,但需与TAG子句同时使用。
d.COMPACT选项用来指定单索引文件为压缩。
e.OF选项的<复合索引文件名>用于指定非结构复合索引文件的名字,缺省为结构复合索引议论。
f.ADDITIVE表示建立本索引文件时并不关闭先前打开的索引文件。
例:建立单索引文件示例。
USE SB
INDEX ON 名称 TO mcidx   &&建立名称升序排列的普通索引型单索引文件MCIDX.IDX
LIST
INDEX ON -价格 TO jgidx UNIQUE &&建立价格降序排列的唯一索引型单索引文件JGIDX.IDX
LIST
例:为SB.DBF建立一个结构复合索引文件,其中包括3个索引:
一是记录以价格降序排列,索引标识为普通索引型。
二是记录以部门升序排列,部门相同时则按价格升序排列,索引标识为普通索引型。
三是记录以部门升序排列,部门相同时则按价格降序排列,索引标识为候选索引型。
USE SB
INDEX ON 价格 TAG JG DESCENDING
LIST
INDEX ON 部门+STR(价格,9.2)TAG BMJG
LIST
INDEX ON VAL(部门)-价格/1000000 TAG BMJG1 CANDIDATE
LIST
⑶ 索引的使用
要利用索引查询,必须同时打开表与索引文件。一个表可能打开多个索引文件,同一个复合索引文件中也可能包含多个索引标识,但任何时候只有一个索引文件或一个索引标识起作用。当前起作用的索引文件称为主控索引文件,当前起作用的索引标识称为主控索引。
也就是说,实现索引查询必须满足以下条件:打开表、打开索引文件、确定主控索引文件或主控索引。
a.打开和关闭索引文件。
若当前仅有一个索引文件被打开,它就成为了主控索引文件。索引刚建立时,索引文件呈打开状态且成为主控索引文件。若当前已打开了多个索引文件,可通过SET INDEX命令来确定主控索引文件。
除结构复合索引能随着表的打开而打开外,其它索引文件必须用命令显式打开。
表关闭时索引文件就随之关闭。
命令格式: SET INDEX TO [<索引文件表>] [ADDITIVE]
命令功能: 打开当前表的一个或多个索引文件并确定主控索引文件。
命令说明:
<索引文件表>中的第一个索引文件为主控索引文件。
如缺省所有选项,将关闭当前工作区中除结构复合索引文件外的所有索引文件,同时取消主控索引。
若缺省ADDITIVE,则在用本命令打开索引文件时,除结构复合索引文件以外的索引文件均被关闭。
命令USE<文件名>INDEX<索引文件表>也可在打开表的同时打开索引文件,并确定主控索引文件。
b.确定主控索引
复合索引文件中当前建立的索引标识自动生成主控索引,但须注意,表重新打开时尽管复合索引文件已自动打开,还须确定主控索引。
命令格式:
SET ORDER TO [ <数值表达式> / <单索引文件名> / [TAG] <索引标识> [ASCENDING
/DESCENDING ] ]
c.删除索引
命令格式:
DELETE TAG ALL/<索引标识1>[,<索引标识2> ]...
⑷ 索引的更新
a.自动更新
当表中的数据发生变化时,所有当时已打开的索引文件会随数据的改变自动改变记录的逻辑顺序,实现索引文件的自动更新。
b.重新索引
若未确定主控索引文件或主控索引,修改表的记录时索引文件就不会自动更新。如果仍要维持记录的逻辑顺序,可用REINDEX命令重建索引,其命令格式为:
REINDEX [COMPACT]
当然也可用INDEX ON命令再次建立索引。
二、查询命令
所谓查询即按照指定条件在表中查找所需的记录。下面介绍两种传统的查询:顺序查询和索引查询。VFP还支持在VFP环境中直接使用SQL查询命令。
1.顺序查询命令
顺序查询命令包括LOCATE和CONTINUE两条件命令。
命令格式:LOCATE FOR <条件> [<范围>] [WHILE<条件>]
CONTINUE
命令功能:搜索满足条件的第一条记录,若找到,记录指针就指向该记录;若表中无此记录,记录指针将指向文件结束处。
例:
USE SB
LOCATE FOR 价格<15000 AND NOT 主要设备
DISPLAY
CONTINUE
RECNO(),名称,价格,主要设备
CONTINUE
2.索引查询命令
索引查询依赖二分法算法来实现,在210个记录中寻找一个满足条件的记录,不超过10次比较就能进行完毕。即设有N个记录,查找次数为log2(N+1)-1。
SEEK和FIND两条命令均可用来进行索引查询。FIND是为了与旧版本兼容而保留的,但SEEK的用法更灵活,下面介绍SEEK。
命令格式:SEEK <表达式>
命令功能:在已确定主控索引的表中按索引关键字搜索满足表达式值的第一个记录。若找到,记录指针将指向该记录,若没有找到,则提示没有找到的信息。
例:
USE SB
INDEX ON 编号 TAG BH
SEEK “038-1”
?RECNO()
INDEX ON 启用日期 TAG QYRQ
SEEK {3/5/90}
?FOUND()
INDEX ON 价格 TAG JG
SEEK 1000.00
?RECNO(),FOUND()
注意:在使用查找命令时,若找到,FOUND函数就返回.T. ,否则返回.F.。
对于字符表达式,系统允许模糊查询,即只要字符表达式值与索引关键字值左子串相同即算符合条件。命令SET EXACT ON / OFF用于打开和关闭完全匹配,系统默认为OFF。
三、数据工作期
数据工作期是一个用来设置数据工作环境的交互操作窗口。所设置的环境可以包括打开的表及其索引,多个表之间的关联等状态。
利用数据工作期来建立环境还有以下优点:
一是直接发命令来建立环境需要有一定的经验,而数据工作期窗口对操作有向导作用,显得比较方便。
二是在数据工作期设置的环境可能作为视图文件保存起来,需要时将视图文件打开就能恢复它所保存的环境。若用户建立了多个视图文件,需要某个环境时只要打开相应的视图文件即可。
1.多工作区的查询
⑴ 设备管理使用的4个表
实际应用中常需要同进查询多个表的数据,下面以设备管理为例设计了四个表,
设备表:SB.DBF
Record#  编号    名称    启用日期      价格    部门   主要设备    备注    商标
1  016-1   车床    03/05/90    62044.61   21     .T.         Memo   gen
2  016-2   车床    01/15/92    27132.73   21     .T.         Memo   gen
3  037-2   磨床    07/21/90   241292.12   22     .T.         Memo   gen
4  038-1   钻床    10/12/89     5275.00   23     .F.         Memo   gen
5  100-1   微机    08/12/97     8810.00   12     .T.         Memo   gen
6  101-1   复印机  06/01/92    10305.00   12     .F.         Memo   gen
7  210-1   轿车    05/08/95   151000.00   11     .F.         Memo   gen
设备大修表:DX.DBF
Record#  编号    年月        费用
1  016-1   8911      2763.5
2  016-1   9112      3520.0
3  037-2   9206      6204.0
4  038-1   8911      2850.0
部门代码表:BMDM.DBF
Record#  代码   名称
1  11     办公室
2  12     设备科
3  21     一车间
4  22     二车间
5  23     三车间
增值表:ZZ.DBF
Record#  编号            增值
1  016-1        2510.00
2  016-1        1000.00
3  038-1        1200.00
⑵ 工作区
a.关于工作区号。表打开后才能进行操作,实际上打开表就是把它从磁盘调入内存的某一个工作区,VFP可能提供32767个工作区,编号从1到32767。
每个工作区只允许同时打开一个表,在同一工作区打开另一个表时,就会自动关闭以前打开的表。反之,一个表只能在一个工作区打开,在其不关闭时若试图在其它工作区打开它,系统会提示出错信息:“文件正在使用”。
b.关于别名。一般来说,前十个工作区是经常使用的,所以前十个工作区除使用1-10进行编号外,还可能依次分别用A、B、...、J十个字母来表示,后者称为工作区别名。
其实表也有别名,并可用命令“USE <文件名> ALIAS <别名> ”来指定。若未指定别名,则表文件的主名将被默认为别名。
c.选择工作区
命令格式:SELECT <工作区号>/<别名>
用SELECT选定的工作区称为当前工作区,VFP默认的当前工作区为1号工作区。函数SELECT()可能返回当前工作区的区号。引用非当前工作区表的记录字段值时,必须冠以别名。请看下面的例子:
CLOSE ALL
?SELECT()
USE BMDM
GO 3
?名称
SELECT 2
USE SB
GO 4
?名称,BMDM.名称
命令“SELECT 0”表示选定当前尚未使用的最小号工作区,该命令使用户不必记忆工作区号,以后要切换到某工作区,只要在SELECT命令中使用表的别名便可。请看下面的例子:
CLOSE ALL
SELECT 0
USE SB
GO 3
SELECT 0
USE BMDM
INDEX ON 代码 TAG DM
SEEK SB.部门
?SB.编号,a.名称,名称
SELECT SB
?编号,名称,BMDM.名称
命令“USE <表名> IN <工作区号>/<别名>”能在指定的工作区打开表,但不改变当前工作区。
2.数据工作期窗口
数据工作期窗口用菜单操作方式或命令工作方式打开和关闭,具体方法见下表:
功能菜单操作方式命令工作方式其它方法
打开数据工作期选定Window菜单的Data Session命令SET或SET VIEW ON
关闭数据工作期选定File菜单的关闭命令SET VIEW OFF双击该窗口的控制菜单框
3.视图文件
数据工作期设置的环境可以作为视图文件保存,以便在需要时恢复它所保存的环境。
⑴ 建立视图文件
一是当数据工作期窗口未关闭前,通过文件菜单的另存为来建立扩展名为.VUE的视图文件。
二是使用命令建立,格式如下:
CREATE VIEW <视图文件名>
例如下数据工作期窗口打开时,在命令窗口键入命令CREATE VIEW SB,便可建立视图文件SB.VUE。
⑵ 打开视图文件
打开视图文件意味着恢复环境,相当于重新执行一系列先前设置的命令。通过文件菜单的“打开命令→文件类型‘视图’ →选定文件SB.VUE→确定”可能打开视图文件。
也可以用命令方式打开:SET VIEW TO SB
4.表的关联
在要查询多个表中的数据时,常采用关联和联接两种方法,下面介绍关联。
⑴ 关联的概念
所谓关联,就是令不同工作区中表的记录指针建立一种临时的联动关系,使一个表的记录指针的移动时另一个表的记录指针也能随之移动。
a.关联条件。建立关联的两个表,一个是父表,另一个为子表。在执行涉及这两个表的数据的命令时,父表的记录指针的移动,会使子表记录指针自动移到满足关联条件的记录上。
关联条件通常要求比较不同表的两个字段表达式值是否相等,所以除要在关联命令中指明这两个字段表达式外,还必须为子表的字段表达式建立索引。
b.多一关系。按照通过不同表的两个字段表达式值相等来实现关联的原则,若出现父表有多条记录对应子表中一条记录的情况,则称这种关联为多一关系。
c.一多关系。按照通过不同表的两个字段表达式值相等来实现关联的原则,若出现父表有一条记录对应子表中多条记录的情况,则称这种关联为一多关系。
⑵ 在数据工作期建立关联
在数据工作期窗口可能建立关联,其一般步骤为:
a.打开需建立关联的表
b.为子表按关联的关键字建立索引或确定主控索引。
c.选定父表工作区为当前工作区,并与一个或多个子表建立关联。
d.说明建立的关联为何种关系,缺省时为多一关系。
⑶ 用命令来建立关联
a.建立关联命令
命令格式:
SET RELATION TO [<表达式1>INTO <别名1>,...,<表达式N>INTO<别名N>][ADDITIVE]
命令功能:以当前表为父表与其它一个或多个子表建立关联。
功能说明:ADDITIVE保证在建立关联时不取消以前建立的关联。
例:
SELECT 2
USE BMDM
INDEX ON 代码 TAG 代码 ADDITIVE
SELECT 1
USE SB
SET RELATION TO SB.部门 INTO BMDM ADDITIVE
&& 指定在部门字段对子表设置多一关系。
b.说明一多关系
上述命令默认建立的是多一关系,如果要说明为一多关系,则有如下命令:
SET SKIP TO [<表别名1> [,<表别名2>] ...]
该命令用在SET RELATION 命令之后,说明已建关联的性质为一多关系。
请看下面的例子:
例题:列出所有设备的价格、增值和部门名,写出命令序列。
分析:本题涉及SB、ZZ、BMDM三个表,从数据上看,SB与BMDM为多一关系,SB与ZZ为一多关系。(实际中,可能是多多关系,则需要转换,这里从数据本身来举例说明)
设备表:SB.DBF
Record#  编号    名称    启用日期      价格    部门   主要设备    备注    商标
1  016-1   车床    03/05/90    62044.61   21     .T.         Memo   gen
2  016-2   车床    01/15/92    27132.73   21     .T.         Memo   gen
3  037-2   磨床    07/21/90   241292.12   22     .T.         Memo   gen
4  038-1   钻床    10/12/89     5275.00   23     .F.         Memo   gen
5  100-1   微机    08/12/97     8810.00   12     .T.         Memo   gen
6  101-1   复印机  06/01/92    10305.00   12     .F.         Memo   gen
7  210-1   轿车    05/08/95   151000.00   11     .F.         Memo   gen
部门代码表:BMDM.DBF
Record#  代码   名称
1  11     办公室
2  12     设备科
3  21     一车间
4  22     二车间
5  23     三车间
增值表:ZZ.DBF
Record#  编号            增值
1  016-1        2510.00
2  016-1        1000.00
3  038-1        1200.00
命令序列如下:
CLOSE ALL
SELECT 2
USE BMDM
INDEX ON 代码 TO DM
SET ORDER TO TAG DM
SELECT 3
USE ZZ
INDEX ON 编号 TAG BH
SELECT 1
USE SB
SET RELATION TO SB.部门 INTO BMDM
SET RELATION TO SB.编号 INTO ZZ ADDITIVE
SET SKIP TO ZZ
BROWSE FIELDS 编号,价格,ZZ.增值,BMDM.名称:H=‘部门名’
下图是BROWSE 的结果:
若一多关系已建立,要清除父表与某个子表之间的关联,可使用命令“SET RELATION OFF INTO <别名>”,父表在当前工作区,别名指子表别名或其所在工作区的别名。
四、统计命令
1.计数命令 COUNT
命令格式:COUNT [<范围>] [FOR<条件1>] [WHILE<条件2>] [TO<内存变量>]
命令功能:计算指定范围内符合条件的记录条数,并可将结果存放于内存变量中。
例:统计设备科拥有的设备台数。
CLOSE ALL
&&(SET VIEW TO SBBM )
SELECT 2
USE BMDM
INDEX ON 代码 TO DM
SET ORDER TO TAG DM
SELECT 1
USE SB
SET RELATION TO SB.部门 INTO BMDM
SELECT 2
LOCATE FOR BMDM.名称='设备科'
DDM=BMDM.代码
SELECT 1
COUNT FOR SB.部门=DDM TO TS
TS
其结果为2
2.求和命令SUM
命令格式:SUM [<数值表达式表>] [<范围>] [FOR<条件1>] [WHILE<条件2>]
[TO <内存变量表> / ARRAY<数组>]
命令功能:在打开的表中,对符合条件的记录中的数值型字段按<数值表达式表>所指定的的各个表达式分别求和,其结果可以存入内存变量表或数组中。
例题:试根据SB与ZZ求各设备的价格和与增值和。
CLOSE ALL
USE SB IN 0
SUM 价格 TO MJG
SELECT 0
USE ZZ
SUM ZZ.增值 TO MZZ
?‘价格和,增值和:’,MJG,MZZ
3.求平均值命AVERAGE
命令格式:AVERAGE [<数值表达式表>] [<范围>] [FOR<条件1>] [WHILE<条件2>]
[TO <内存变量表> / ARRAY<数组>]
命令功能:在打开的表中,对符合条件的记录中的数值型字段按<数值表达式表>所指定的的各个表达式分别求平均值,其结果可以存入内存变量表或数组中。
4.计算命令CALCULATE
CALCULATE 命令用于对表中的字段进行财经统计,其计算工作主要由函数来完成。
命令格式:CALCULATE <表达式表> [<范围>] [FOR<条件1>] [WHILE<条件2>]
[TO <内存变量表> / ARRAY<数组>]
命令功能:在打开的表中,分别计算<表达式表>的表达式的值,结果可以存入变量表或数组之中。
注意,在表达式中至少须包含系统规定的8个函数之一。其中常用的函数有如下五个:
函数功能
COUNT()求表中的记录数
AVG()对数值字段求平均值
SUM()对数值字段求和
MIN()用于得到最小值
MAX()用于得到最大值
请看下面的例子:求所有设备价格与增值的总和。
CLOSE ALL
USE SB IN 0
CALCULATE SUM(价格)TO JGH
SELECT 0
USE ZZ
CALCULATE SUM(增值)TO ZZH
?JGH+ZZH
5.汇总命令TOTAL
汇总命令可对数据进行分类合计,例如设备管理系统中可能要部门汇总设备价值。
命令格式:TOTAL TO <文件名> ON <关键字>[FIELDS<数值型字段表>]
[<范围>] [FOR<条件1>] [WHILE<条件2>]
命令功能:在当前表中,分别对<关键字>值相同的记录的数值型字段值求和,并将结果存入一个新表。一组关键字值相同的记录在新表中产生一个记录,对于非数值型字段,只将关键字相同的第一个记录的字段值放入该记录。
例如:在SB表中,对价格按设备名称分类汇总。
CLOSE ALL
USE SB
INDEX ON 名称 TO MC
TOTAL TO TSB ON 名称 FIELDS 价格
USE TSB
LIST
通过汇总,我们发现产生了一个新的表TSB,它包括了SB的所有字段,但记录中的名称没有重复的值了,原来名称相同的记录的价格相加了,当然如果这个价格是一个金额,则更符合实际情况。五、结构化查询语言
结构化查询语言(即SQL语言)是最重要的关系数据库操作语言,在过去的几年中,SQL语言已经发展成为标准的计算机数据库语言。
1986年美国国家标准协会ANSI(American National Standards Institute)和国际标准化组织ISO(International Standards Organization)颁布了SQL正式标准,同是时确认SQL语言为数据库操作的标准语言,现在已有100多种遍布在从微机到大型机上的数据库产品SQL产品。SQL语言基本上独立于数据库本身及其使用的机器、网络、操作系统,基于SQL的DBMS开发商所提供的产品一般都具有良好的可移植性。
SQL语言最初由IBM的研究人员在70年代提出,最初的名称为SEQUEL(结果),从80年代开始改名为SQL,看似是SEQUEL的缩写,但一般又理解为结构化查询语言Structure Query Language。
下面讨论1991年ANSI制定的SQL语言的核心。VFP的SELECT-SQL可以据此理解之。
1.对单个表进行查询
下面考虑SQL对单个表进行简单的查询。为了进行实例分析,下面我们先建立三个表:
学生信息表ST:
学号 *  姓名  主修  年龄
100  JONES  HISTORY  21
150  PARKS  ACCOUNTING 19
200  BAKER  MATH  50
250  GLASS  HISTORY 50
300  BAKER  ACCOUNTING 41
350 RUSSELL MATH 20
400 RYE ACCOUNTING 18
450 JONES HISTORY 24
学生注册表EN:
学号 * 班名 注册号
100  A100   1
150  B200   1
200  A100   2
200  C200   1
300  C100   1
400  B200   2
400  B100   1
400  C200   2
450  B200  3
面授安排表CL:
班名 *  时间  教室
B200  MTH8  R001
A100  MWF3  R002
B100  MWF8  R002
C100  MWT3  R003
C200  MWF8  R004
⑴ 使用SQL进行投影
投影是指取表的某些列的字段值。下面是使用SQL语句进行投影的例子,从ST表中列出需要的学号、姓名和主修:
SELECT 学号,姓名,主修 FROM ST
学号   姓名       主修
100   JONES      HISTORY
150   PARKS     ACCOUNTING
200  BAKER        MATH
250    GLASS        HISTORY
300    BAKER        ACCOUNTING
350    RUSSELL      MATH
400    RYE          ACCOUNTING
450    JONES        HISTORY
SELECT 主修 FROM ST
主修
HISTORY
ACCOUNTING
MATH
HISTORY
ACCOUNTING
MATH
ACCOUNTING
HISTORY
SELECT DISTINCT 主修 FROM ST
主修
ACCOUNTING
HISTORY
MATH
⑵ 使用SQL进行选择
选择是指到表的某些行的记录值。请看下面的例子:
SELECT 学号,姓名,主修,年龄 FROM ST WHERE 主修=‘MATH’
SELECT * FROM ST WHERE 主修=‘MATH’
学号  姓名         主修             年龄
200   BAKER        MATH              50
350   RUSSELL      MATH              20
上述两条件命令的结果是一样的。我们可以将投影和选择进行合并如下:
SELECT 姓名,主修,年龄 FROM ST WHERE 主修=‘MATH’
姓名        主修            年龄
BAKER        MATH              50
RUSSELL      MATH              20
SELECT 姓名,主修,年龄 FROM ST WHERE 主修=‘MATH’AND 年龄>21
姓名         主修             年龄
BAKER        MATH              50
SELECT 姓名,主修,年龄 FROM ST WHERE 主修 IN(‘MATH’,‘ACCOUNTING’)
姓名         主修             年龄
PARKS        ACCOUNTING         19
BAKER        MATH               50
BAKER        ACCOUNTING         41
RUSSELL      MATH               20
RYE          ACCOUNTING         18
SELECT 姓名,主修,年龄 FROM ST WHERE 主修 NOT IN(‘MATH’,‘ACCOUNTING’)
姓名         主修             年龄
JONES        HISTORY            21
GLASS        HISTORY            50
JONES        HISTORY            24
⑶ SQL排序
SELECT 姓名,主修,年龄 FROM ST WHERE 主修=‘ACCOUNTING’ ORDER BY 姓名
姓名         主修             年龄
BAKER        ACCOUNTING         41
PARKS        ACCOUNTING         19
RYE          ACCOUNTING         18
SELECT 姓名,主修,年龄 FROM ST WHERE 主修 IN(‘MATH’,‘ACCOUNTING’)  ORDER BY 姓名 DESC,年龄 ASC
姓名        主修            年龄
RYE          ACCOUNTING         18
RUSSELL      MATH               20
PARKS        ACCOUNTING         19
BAKER        ACCOUNTING         41
BAKER        MATH               50
⑷ SQL内置函数
SQL主要提供了前面我们提到的五个内置函数:COUNT、SUM、AVG、MAX、MIN。
SELECT COUNT(*) FROM ST
CNT
8
上述语句计算表ST中的行数,并用一行一列表示出来。
注意:除非和GROUP BY相连,在查询的项中SELECT后内置函数一般不和字段名一起使用。如下面的查询语句虽然不是非法的,但结果的含义不清:
SELECT 姓名,COUNT(*)
姓名        CNT
JONES        8
请思考下面的两个查询语句的结果:
SELECT COUNT(主修) FROM ST
Cnt_主修
8
SELECT COUNT(DISTINCT 主修) FROM ST
DCnt_主修
3
⑸ SQL内置函数和分组
为了增强统计内置函数的功能,内置函数可以和分组函数合用,将源表中的数据分组,再对每一分组生成一个汇总行。例如:学生可以按照主修专业进行分组,这意味着每一个专业将形成一个分组,然后可以对每一组进行一定的统计。
SELECT 主修,COUNT(*) FROM ST GROUP BY 主修
主修              Cnt
ACCOUNTING         3
HISTORY            3
MATH               2
有时,我们不需要得到每一个分组的值,例如,我们对学生按照专业进行分组,然后只需要具有两个以上的行数的分组,在这种情况下,我们需要用到SQL中的HAVING关键字对不符合条件的分组进行过滤。
下面的SQL语句可以统计出具有两个以上学生的专业,并统计该专业的学生数。
SELECT 主修,COUNT(*) FROM ST GROUP BY 主修 HAVING COUNT(*)>2
主修              Cnt
ACCOUNTING         3
HISTORY            3
在上面的查询中,还可以对查询的学生进行条件选择,使用关键字WHERE进行查询,但是这样会产生一定的模糊性,请看下例的结果,分析之:
SELECT 主修,AVG(年龄) FROM ST WHERE 姓名=‘JONES’
GROUP BY 主修 HAVING COUNT(*)>1
主修              Avg_年龄
HISTORY            22.5
SELECT 主修,AVG(年龄) FROM ST  GROUP BY 主修 HAVING COUNT(*)>2
主修              Avg_年龄
ACCOUNTING         26.00
HISTORY            31.67
SELECT 姓名,主修,AVG(年龄) FROM ST WHERE 姓名 IN('JONES','BAKER')
GROUP BY 主修 HAVING COUNT(*)>0
姓名      主修              Avg_年龄
JONES    HISTORY            22.50
SELECT 姓名,主修,AVG(年龄) FROM ST WHERE 姓名 IN('JONES','BAKER')
GROUP BY 主修 HAVING COUNT(*)>1
姓名      主修              Avg_年龄
BAKER    ACCOUNTING         41.00
JONES    HISTORY            22.50
BAKER    MATH               50.00
从上述结果来看,首先选择适合条件的学生,对选择出来的学生进行分组,去除不适合HAVING条件的分组,显示得到结果。
2.对多个表进行查询
下面我们将讨论基于两个或更多的表的SQL查询语句。下面的例子基本上针对ST、CL和EN三个表而言。
学生信息表ST:
学号 *姓名主修年龄
100  JONES  HISTORY 21
150  PARKS  ACCOUNTING 19
200  BAKER  MATH  50
250  GLASS  HISTORY 50
300  BAKER  ACCOUNTING 41
350  RUSSELL MATH 20
400  RYE  ACCOUNTING 18
450  JONE SHISTORY 24
学生注册表EN:
学号 *班名注册号
100  A100  1
150  B200  1
200  A100  2
200  C200  1
300  C100  1
400  B200  2
400  B100  1
400  C200  2
450  B200  3
面授安排表CL:
班名 * 时间  教室
B200  MTH8  R001
A100  MWF3  R002
B100  MWF8  R002
C100  MWT3  R003
C200  MWF8  R004
⑴ 带有子查询的SQL查询语句
假设我们需要知道入学到A100班的学生的名字,则来通过两个步骤:首先通过条件班名为‘A100’在EN表中找到学生的学号,然后通过上面找到的学号‘100’和‘200’在ST表中找出这些学生的姓名。
如下面的两个查询语句:
SELECT 学号 FROM EN WHERE 班名=‘A100’
学号
100200
SELECT 姓名 FROM ST WHERE 学号 IN(‘100’,‘200’)
姓名
JONESBAKER
我们可以将上述两条语句进行结合就可能直接得到我们需要的结果:
SELECT 姓名 FROM ST WHERE 学号 IN(SELECT 学号 FROM EN WHERE 班名=‘A100’)
姓名
JONESBAKER
我们将第二个查询语句称为子查询(SUBQUERY),它嵌套在主查询的条件中。这种查询方式是很有用的,但要注意子查询的结果与主查询的条件的类型匹配问题。
对于一般的SQL查询语句而言,子查询可以嵌套二层以上甚至更多,但VFP对子查询的深度进行了限制。请看下面的语句:
SELECT CL.班名 FROM CL WHERE 时间=‘MWF8’
班名
B100C200
SELECT EN.学号 FROM EN WHERE EN.班名 IN(SELECT CL.班名 FROM CL WHERE 时间=‘MWF8’)
学号
200400400
SELECT ST.姓名 FROM ST WHERE ST.学号 IN(SELECT EN.学号 FROM EN WHERE EN.班名 IN(SELECT CL.班名 FROM CL WHERE 时间=‘MWF8’))
结果将提示:SQL:Subquery nesting is too deep
按正常的理解,其结果应是:
姓名
BAKERRYE
也就是下面的语句的结果:
SELECT ST.姓名 FROM ST WHERE ST.学号 IN(‘200’,‘400’,‘400’)
同时通过上述查询,我们得到一个重要的结论,RYE的报名有问题,或要将面授时间作调整,大家可以思考为什么?
⑵ SQL联接查询
子查询的结果总是来自一个表,如果同时提供来自不同的表的数据(如每一个学生的学号、姓名、所在班名等),则必须将多个表(ST、EN)相联接。
请看下面的语句:
SELECT ST.学号,ST.姓名,EN.班名,EN.注册号 FROM ST,EN WHERE ST.学号=EN.学号
学号   姓名         班名        注册号
100    JONES        A100         1150    PARKS        B200         1200    BAKER        A100         2200    BAKER        C200         1300    BAKER        C100         1400    RYE          B200         2400    RYE          B100         1400    RYE          C200         2450    JONES        B200         3
当然,在WHERE条件中,可以加上其它的查询结果的限定:
SELECT ST.学号,ST.姓名,EN.班名,EN.注册号 FROM ST,EN WHERE ST.学号=EN.学号 AND ST.姓名=‘RYE’ AND EN.注册号=‘2’
学号   姓名         班名        注册号
400    RYE          B200         2400    RYE          C200         2
如果结果来自于两个以上的表,我们可以使用相仿的方法,如下例:
SELECT ST.学号,CL.班名,CL.时间,EN.注册号 FROM ST,EN,CL WHERE ST.学号=EN.学号 AND EN.班名=CL.班名 AND ST.姓名=‘BAKER’
学号   班名         时间        注册号
200    A100         MWF3         2200    C200         MWF8         1300    C100         MWT3         1
3.关于JOIN命令
JOIN命令可用于实现两个表的联接,该命令的功能已包含在SQL命令中,但为了与早期的XBase类数据库语言兼容,保留了它。
4.用查询设计器建立查询
不熟悉SQL的用户可以通过VFP提供的查询设计器来进行数据查询,查询设计器产生的查询除可当场浏览外,还有多种输出方式,查询设置也可以保存在文件中,供以后打开查询设计器使用或修改。
5.查询结果的图形处理
VFP允许将查询结果以图形的形式输出,利用VFP的图形向导工具可能输出图形,包括在查询中输出统计图和对通用型字段中的图形的处理等。
六、数据库与视图
在VFP中,表(.DBF文件)可以区分为数据库表与自由表两类。上面我们介绍的都是自由表,下面引入数据库表的概念,并介绍数据库表的建立与基本操作方法。
视图(View)是在数据库表(非自由表)的基础上创建的一种虚拟表,虽然它仅是实际并不存在的虚拟表,在查询中却有着广泛的应用。
1.数据库
⑴ 数据库的概念的再讨论
在简单的情况下,如要保存一个通讯录,建立一个自由表即可解决问题,自由表通常单独使用,与其它表的数据没有多大联系。但如果为公司开发一个人事管理系统,一个表则不够用,需要建立多个表,且这些表之间可能存在种种的联系。我们可以把它们集中到一起来,即集中到数据库之中,并且在各表之间建立若干关系,管理与使用就会较为方便,这类从属于数据库的表统称为数据库表。
⑵ 用数据库设计器设计数据库
a.数据库设计器。数据库设计器是VFP提供的一种辅助设计窗口,它能显示当前数据库全部的表、视图和关系,并让用户操作这些对象。
b.数据库的创建。数据库创建将保存一个扩展名为.DBC的数据库文件中。在创建数据库及其表的时候可以使用菜单方式,也可以用如下例的命令方式:
CREATE DATABASE SBSJ
CREATE TABLE DX( 编号 C(5),年月 C(4),费用 N(6,1))
c.数据库的关闭和删除。
数据库关闭命令:CLOSE DATABASE ALL;关闭所有的数据库。
数据库删除命令:DELETE DATABASE <数据库名> [DELETETABLES];删除数据库及其中的表,如果没有DELETETABLES选项,则只删除数据库,将其中的表转换为自由表。
数据库表移去命令:REMOVE TABLES
d.数据库文件。前已谈到,数据库创建后将保存在数据库文件中。该文件本身也是一个表,其中记载了它的所有表的参数,及索引、关联等有关参数。
数据库文件可以打开浏览,例如:
CLOSE DATABASE ALL
USE SBSJ.DBC
BROWSE
数据库文件也可以编辑,但一旦修改出错,数据库就会被破坏,故通常以打开数据设计器来操作为宜。
⑶ 用项目管理器管理数据
项目管理器用于组织和管理项目中的文件,即建立、修改、查看这些文件,可作为应用系统开发维护的控制中心。项目是文件、数据、文档以及VFP对象的集合,项目文件以.PJX扩展名保存。由于项目管理器既可直接操作,又能逐步增入应用系统全部组件,适合开发人员从头至尾使用。
2.数据词典
数据字典用于保存对数据库中各种数据的定义或设置信息,包括表的属性、字段属性、记录规则、表间关系,以及参照完整性。这些属性或信息均可通过数据库设计器来设置、显示或修改,并且由系统保存在数据词典中,直到相关的表从数据库中移去为止。
⑴ 长名(表名/字段名)与注释
为了方便书写,表和字段通常使用较短的名称(VFP规定字段名不超过10个字符),有时难免不能表示名称的含义,为了使用户更易表达字段的内容,VFP允许在数据词典中为表/字段设置不超过128个字符的长名,以及对表/字段增加适当的注释。长表名/长字段名一般能在浏览窗口或各种设计器(如数据库设计器、查询设计器、视图设计器)的标题栏内显示;而注释则通常出现在项目管理器中,例如当用户打开项目管理器,从中选定了一个表或从表的字段列表框中选定一个字段后,在项目管理器的底部就会出现事先已在数据词典中设置的注释。
⑵ 设置字段属性
首先利用项目管理器来打开数据库表,如:打开SBGL项目管理器→选定SB数据库表→选定修改按钮,即出现SB表设计器。在这个设计器中,它有如下一些选项卡。
a.格式。显示区的格式文本框用于键入格式表达式,确定字段在浏览窗口、表单或报表中显示时采用的大小写和样式。例如键入一个!号,能使窗口输入输出时将字母都转为大写,若键入字母A表示仅允许输入字母。
b.输入掩码。显示区的输入掩码码文本框用于键入输入掩码,借以指定字段的输入格式,限制输入数据的范围,控制输入的正确性。输入的掩码可以是以下字符:X、9、#、$、*、.、,等等。
c.标题。显示区的标题文本框用于为浏览窗口、表单或报表中的字段标签键入表达式。在浏览窗口中,字段的列标题将显示为指定的内容。
d.字段验证。字段验证区包含3个文本框,各文本框均可直接键入数据,也可通过其右边的列标题钮显示出表达式生成器对话框,在其中进行设置。
规则文本框:用于输入对字段数据有效性进行检查的规则,它是一个条件。
信息文本框:用于指定出错提示信息,当该字段输入的数据违反条件时出错信息将照此显示。
默认值文本框:用于指定字段的默认值。
⑶ 设置记录规则
在数据库表设计器的表选项卡中,含有设置记录验证规则、有效性出错信息等功能,还可在其中指定记录插入、更新、删除的规则等。
a.记录验证。记录级有效性检查规则用来检查同一记录中不同字段之间的逻辑关系。
规则文本框:用于指定记录有效性规则,光标离开当前记录时进行校验。
信息文本框:用于指定记录提示信息。在校验记录级有效性规则时,发现输入与规则不符时该信息将会显示出来。
b.触发器。在表设计器的选项卡中,有3个触发器,分别用于指定记录插入、更新、删除的规则。
插入触发器:用于指定一个规则,每次向表中插入或追加记录时该规则被触发,据此检查插入记录是否满足规则。
更新触发器:用于指定一个规则,每次更新记录时该规则被触发。
删除触发器:用于指定一个规则,每次删除记录时该规则被触发。
⑷ 主索引与永久关系
a.主索引。主索引的作用有两个:一是主索引不允许出现重复值,发现重复值会禁止存盘,故可以作为主关键字。二是主索引可用于建立永久关系,从而建立参照完整性。
b.永久关系。永久关系是数据库表之间的关系,在数据库设计器中表现为表索引之间的连线。连线的一端为一根,另一端为三根,分别代表一多关系的两端。永久关系建立后存储在数据库文件中,只要不作删除或变更就一直保留。
永久关系在查询和视图中能自动成为联接条件,能作为表单和报表的默认关系,并显示在数据环境设计器中,允许建立参照完整性。
与永久关系相区别,以前建立的关系可称为临时关系,临时关系仅用于关联,即控制关联表的记录指针有序移动,永久关系在查询和视图中则起联接作用。
利用数据库设计器来建立永久关系,只要在数据库表间进行连线,而删除永久关系也只需去掉连线。
⑸ 参照完整性
上面已多次提到参照完整性,就如我们介绍过数据库表的字段级和记录级验证规则一样,参照完整性则属于表间规则。对于永久关系的相关表,在更新、插入或删除记录时,可能会影响整个数据库表的数据的完整性。
为保持参照完整性,可用手工调整,或执行一段自编的程序来调整。但VFP提供了参照完整性规则,用户可以利用参照完整性生成器来选择是否要保持参照完整性,并可控制在相关表中更新、插入或删除记录。
3.视图
VFP视图是从SQL语言移植而来的,所以又称为SQL视图。前已指出,视图是一个虚拟表,即视图的数据并不是在物理上存在于一起的表,它是从已有的数据库表或其它视图中抽配而来的;实际上,视图的记录集仅在数据词典中定义。但视图一经定义,就成为了数据库的组成部分,可以像数据库表一样接受用户的操作和查询。
如果在某个视图中会有取自远程数据源的数据,则该视图被称为远程视图,否则称为本地视图。
在VFP中,创建视图有命令方式和界面操作方式两种。前者使用CREATE SQL VIEW,后者可以通过项目管理器中的视图设计器来完成。