数据库应用基础教程
——Visual FoxPro 6.0篇聊城大学 ·教育传播技术学院洪智凤二 OO四年八月目 录
第 2章 Visual FoxPro 6.0基础
第 3章 项目管理器
第 4章 创建数据库和表
第 5章 表的基本操作
第 6章 索引和排序
第 7章 多表操作
第 8章 查询与视图
第 1章 VFP基础知识
第 9章 结构化查询语言 SQL
第 10章 报表、标签设计
第 11章 程序设计基础
第 12章 程序设计
第 13章 表单设计
第 14章 菜单设计
第 15章 应用程序的生成与发布目 录
第 16章 面向对象的程序设计第 1章 VFP基础知识教学目的,
1.掌握数据库、数据库系统、数据库管理系统的概念
2.掌握数据模型的概念、数据模型的分类及特点
3.掌握数据库系统的组成和特点,特别关系数据库的特点。
4.了解数据库系统的发展情况教学重点:
数据模型的特点,数据库系统的组成、关系数据库的特点及相关运算。
教学难点:
关系数据库的运算。
第 1章 VFP基础知识信息在现代社会和经济发展中所起的作用越来越大,信息资源的开发和利用水平已成为衡量一个国家综合国力的重要标志之一 。 在计算机的三大主要应用领域 ( 科学计算,数据处理和过程控制 ) 中,数据处理是计算机应用的主要方面 。 数据库技术就是作为数据处理中的一门技术而发展起来的 。
数据处理是指对各种形式的数据进行收集,存储,加工和传播的一系列活动的总和 。 其目之一是从大量的,原始的数据中抽取,推导出对人们有价值的信息以作为行动和决策的依据;目的之二是为了借助计算机科学地保存和管理复杂的,大量的数据,以便人们能够方便而充分地利用这些宝贵的信息资源 。
数据库技术所研究的问题就是如何科学地组织和存储数据,如何高效地获取和处理数据 。 数据库技术作为数据管理的主要技术目前已广泛应用于各个领域,数据库系统已成为计算机系统的重要组成部分 。
数据库技术? 数据模型? 关系数据库数据库技术产生于 20世纪 60年代末 70年代初,其主要目的是有效地管理和存取大量的数据资源 。 数据库技术主要研究如何存储,使用和管理数据,是计算机数据管理技术发展的新阶段 。
近年来,数据库技术和计算机网络技术的发展相互渗透,相互促进,已成为当今计算机领域发展迅速,应用广泛的两大领域 。 数据库技术不仅应用于事务处理,并且进一步应用到情报检索,人工智能,专家系统,计算机辅助设计等领域 。
1.1 数据库技术
数据库的基本概念
数据管理技术的发展
数据库系统的组成
数据库系统的特点数据库技术涉及到许多基本概念,主要包括:数据,信息,数据处理,
数据库,数据库管理系统 以及 数据库系统 等 。
1.数据,信息数据是指存储在某一种媒体上能够识别的物理符号 。 数据的概念包括两个方面:其一是描述事物特性的数据内容;其二是存储在某一种媒体上的数据形式 。 由于描述事物特性必须借助一定的符号,这些符号就是数据形式 。 数据形式可以是多种多样的,例如某人的出生日期是,1964年 2月 17
日,,当然也可以将该形式改写为,02/17/64‖,但其含义并没有改变 。
数据的概念在数据处理领域已经大大地拓宽了 。 数据不仅仅指数字,字母,文字和其他特殊字符组成的文本形式的数据,而且还包括图形,图像,
动画,影像,声音 ( 包括语音,音乐 ) 等多媒体数据 。
1.1.1 数据库的基本概念信息 是经过加工的有用数据 。 信息仍以数据的形式表现,数据是信息的载体 。
2.数据处理数据处理是指对各种形式的数据进行收集,存储,加工和传播的一系列活动的总和 。 其目的之一是从大量的,原始的数据中抽取,推导出对人们有价值的信息以作为行动和决策的依据;目的之二是为了借助计算机科学地保存和管理复杂的,大量的数据,以便人们能够方便而充分地利用这些宝贵的信息资源 。
3.数据库数据库可以直观地理解为存放数据的仓库 。 只不过这个仓库是在计算机的大容量存储器上,例如硬盘就是一种最常见的计算机大容量存储设备 。 而且数据必须按一定的格式存放,因为它不仅需要存放,而且还要便于查找 。
所以可以认为数据是被长期存放在计算机内,有组织的,可以表现为多种形式的可共享的数据集合 。 数据库技术使数据能按一定格式组织,描述和存储,且具有较小的冗余度,较高的数据独立性和易扩展性,并可为多个用户所共享 。
人们总是尽可能地收集各种各样的数据,然后对它们进行加工,目的是要从这些数据中得到有用的信息 。 在社会飞速发展的今天,人们接触的事物越来越多,反映这些事物的数据量也急剧增加 。 过去人们手工管理和处理数据,现在借助计算机来保存和管理复杂的大量数据,这样就可能方便而充分地利用这些宝贵的数据资源,数据库技术正是由于这一需求驱动而发展起来的一种计算机软件技术 。
4.数据库管理系统数据库管理系统 ( DataBase Management System,简称 DBMS) 是计算机系统软件,它的职能是有效地组织和存储数据,获取和管理数据,接受和完成用户提出的访问数据的各种请求 。
数据库管理系统主要功能包括以下几个方面:
( 1) 数据定义功能
DBMS提供了数据定义语言 DDL( Data Definition Language),用户通过它可以方便地对数据库中的相关内容进行定义 。 例如,对数据库,表,索引进行定义 。
( 2) 数据操纵功能
DBMS提供了数据操纵语言 DML( Data Manipulation Language),用户通过它可以实现对数据库的基本操作 。 例如,对表中数据的查询,插入,
删除和修改 。
( 3) 数据库运行控制功能这是 DBMS的核心部分,它包括并发控制 ( 即处理多个用户同时使用某些数据时可能产生的问题 ),安全性检查,完整性约束条件的检查和执行,
数据库的内部维护 ( 例如,索引的自动维护 ) 等 。 所有数据库的操作都要在这些控制程序的统一管理下进行,以保证数据的安全性,完整性以及多个用户对数据库的并发使用 。
( 4) 数据库的建立和维护功能数据库的建立和维护功能包括数据库初始数据的输入,转换功能,数据库的转储,恢复功能,数据库的重新组织功能和性能监视,分析功能等 。
这些功能通常是由一些实用程序完成的 。 它是数据库管理系统的一个重要组成部分 。
5.数据库系统数据库系统是指拥有数据库技术支持的计算机系统,它可以实现有组织地,动态地存储大量相关数据,提供数据处理和信息资源共享服务 。 数据库系统不仅包括数据本身,即实际存储在计算机中的数据,还包括相应的硬件,软件和各类人员 。
计算机对数据的管理是指对数据的组织,分类,编码,存储,检索和维护提供操作手段 。
与其他技术的发展一样,计算机数据管理也经历了由低级到高级的发展过程 。 计算机数据管理随着计算机硬件,软件技术和计算机应用范围的发展而不断发展,多年来大致经历了如下三个阶段:
l 人工管理阶段
l 文件系统阶段
l 数据库系统阶段
l 分布式数据库系统阶段
l 面向对象数据库系统阶段
1.1.2 数据管理技术的发展应用程序 A1
应用程序 A2
应用程序 An
数据集 S1
数据集 S2
数据集 Sn
… …
图 1-1 数据的人工管理
1.人工管理阶段
20世纪 50年代以前,计算机主要用于数值计算 。 从当时的硬件看,外存只有纸带,卡片,磁带,没有直接存取设备;从软件看 ( 实际上,当时还未形成软件的整体概念 ),没有操作系统及管理数据的软件;从数据看,
数据量小,数据无结构,由用户直接管理,且数据间缺乏逻辑组织,数据依赖于特定的应用程序,缺乏独立性 。
2.文件系统阶段
20世纪 50年代后期到 20世纪 60年代中期,出现了磁鼓,磁盘等直接存取数据的存储设备 。 1954年出现了第一台商业数据处理的电子计算机
UNIVACI,标志着计算机开始应用于以加工数据为主的事务处理 。 人们得益于计算机惊人的处理速度和大容量的存储能力,从而解脱了从大量传统纸张文件中寻找数据的困难,这种基于计算机的数据处理系统也就从此迅速发展起来 。
这种数据处理系统是把计算机中的数据组织成相互独立的数据文件,
系统可以按照文件的名称对其进行访问,对文件中的记录进行存取,并可以实现对文件的修改,插入和删除,这就是文件系统 。 文件系统实现了记录内的结构化,即给出了记录内各种数据间的关系 。 但是,文件从整体来看却是无结构的 。 其数据面向特定的应用程序,因此数据共享性,独立性差,且冗余度大,管理和维护的代价也很大 。
应用程序 A1
应用程序 A2
应用程序 An
数据集 S1
数据集 S2
数据集 Sn
文件系统
… …
图 1-2 数据的文件系统
3.数据库系统阶段
20世纪 60年代后期,计算机性能得到提高,更重要的是出现了大容量磁盘,存储容量大大增加且价格下降 。 在此基础上,有可能克服文件系统管理数据时的不足,而去满足和解决实际应用中多个用户,多个应用程序共享数据的要求,从而使数据能为尽可能多的应用程序服务,这就出现了数据库这样的数据管理技术 。 数据库的特点是数据不再只针对某一特定应用,
而是面向全组织,具有整体的结构性,共享性高,因此冗余度小,具有一定的程序与数据间的独立性,并且实现了对数据进行统一的控制 。
应用程序 A1
应用程序 A2
应用程序 An
数据库数据库管理系统

图 1-3 数据的数据库系统从文件系统到数据库系统,标志着数据管理技术质的飞跃 。 20世纪 80
年代后不仅在大,中型机上实现并应用了数据库管理系统,即使在微型计算机上也配置了经过功能简化的数据库管理系统 ( 例如,Visual FoxPro
等 ),使数据库技术得到广泛的应用和普及 。
数据库系统由四部分组成,硬件系统,系统软件 ( 包括操作系统和数据库管理系统 ),数据库应用系统 和 各类人员 。
1.1.3 数据库系统的组成数据库应用系统图 1-4 数据的数据库系统数据库管理系统操作系统硬件
1.硬件系统由于一般数据库系统数据量很大,加之 DBMS丰富的强有力的功能使得自身的体积就很大,因此整个数据库系统对硬件资源提出了较高的要求,
这些要求是:
( 1) 有足够大的内存以存放操作系统,DBMS的核心模块,数据缓冲区和应用程序 。
( 2) 有足够大的直接存取设备存放数据 ( 例如,磁盘 ),有足够的其它存储设备来进行数据备份 。
( 3) 要求计算机有较高的数据传输能力,以提高数据传送率 。
2.系统软件系统软件主要包括操作系统,数据库管理系统,与数据库接口的高级语言及其编译系统和以 DBMS为核心的应用开发工具 。
操作系统是计算机系统必不可少的系统软件,也是支持 DBMS运行必不可少的系统软件 。
数据库管理系统是数据库系统不可或缺的系统软件,它提供数据库的建立,使用和维护功能 。
一般来讲,数据库管理系统的数据处理能力较弱,所以需要提供与数据库接口的高级语言及其编译系统,以便于开发应用程序 。
以 DBMS为核心的应用开发工具 。 应用开发工具是系统为应用开发人员和最终用户提供的高效率,多功能的应用生成器,第四代语言等各种软件工具 。 例如,报表设计器,表单设计器等 。 它们为数据库系统的开发和应用提供了有力的支持 。 当前开发工具已成为数据库软件的有机组成部分 。
3.数据库应用系统数据库应用系统是为特定应用开发的数据库应用软件 。 数据库管理系统为数据的定义,存储,查询和修改提供支持,而数据库应用系统是对数据库中的数据进行处理和加工的软件,它面向特定应用 。 例如,基于数据库的各种管理软件:管理信息系统,决策支持系统和办公自动化等都属于数据库应用系统 。
4.各类人员参与分析,设计,管理,维护和使用数据库的人员均是数据库系统的组成部分 。 他们在数据库系统的开发,维护和应用中起着重要的作用 。 分析,
设计,管理和使用数据库系统的人员主要是:数据库管理员,系统分析员,
应用程序员和最终用户 。
( 1) 数据库管理员 ( DataBase Adminitrator,简称 DBA)
数据库是整个企业或组织的数据资源,因此企业或组织设立了专门的数据资源管理机构来管理数据库,数据库管理员则是这个机构的一组人员,负责全面管理和控制数据库系统 。 具体的职责包括:
l 决定数据库的数据内容和结构,数据库中要存放哪些数据,是由系统需求来决定的 。 为了更好地对数据库系统进行有效的管理和维护,DBA应该参加或了解数据库设计的全过程,并与最终用户,应用程序员,系统分析员密切合作共同协商,
搞好数据库设计 。
l 决定数据库的存储结构和存取策略,DBA要综合最终用户的应用要求,和数据库设计人员共同决定数据库的存储策略以求获得较高的存取效率和存储空间利用率 。
l 定义数据的安全性要求和完整性约束条件,DBA的重要职责是保证数据库的安全性和完整性,即数据不被非法用户所获得,并且保证数据库中数据的正确性和数据间的相容性 。 因此 DBA负责确定各个最终用户对数据库的存取权限,数据的保密级别和完整性约束条件 。
l 监控数据库的使用和运行,DBA还有一个重要职责就是监视数据库系统的运行情况,及时处理运行过程中出现的问题 。 当系统发生某些故障时,数据库中的数据会因此遭到不同程度的破坏,DBA必须在最短时间内将数据库恢复到某种一致状态,并尽可能不影响或少影响计算机系统其它部分的正常运行 。 为此,DBA要定义和实施适当的后援和恢复策略 。 例如,
采用周期性的转储数据和维护日志文件等方法 。
l 数据库的改进和重组,DBA还负责在系统运行期间监视系统的存储空间利用率,处理效率等性能指标,对运行情况进行记录,统计分析,依靠工作实践并根据实际应用环境,不断改进数据库设计 。 不少数据库产品都提供了对数据库运行情况进行监视和分析的实用程序,DBA可以方便地使用这些实用程序来完成这些工作 。
l 另外,在数据库运行过程中,大量数据不断插入,删除,修改,随着运行时间的延长,在一定程度上会影响系统的性能 。 因此,DBA要定期对数据库进行重新组织,以提高系统的性能 。
l 当最终用户的需求增加和改变时,DBA还要对数据库进行较大的改造,包括修改部分设计,实现对数据库中数据的重新组织和加工 。
( 2) 系统分析员系统分析员是数据库系统建设期的主要参与人员,负责应用系统的需求分析和规范说明,要和最终用户相结合,确定系统的基本功能,数据库结构和应用程序的设计,以及软硬件的配置,并组织整个系统的开发 。 所以系统分析员是一类具有各领域业务和计算机知识的专家,在很大程度上影响数据库系统的质量和成败 。
( 3) 应用程序员应用程序员根据系统的功能需求负责设计和编写应用系统的程序模块,
并参与对程序模块的测试 。
( 4) 最终用户数据库系统的最终用户是有不同层次的,不同层次的用户其需求的信息以及获得信息的方式也是不同的 。 一般可将最终用户分为操作层,管理层和决策层 。 他们通过应用系统的用户接口使用数据库 。 常用的接口方式有菜单驱动,表格操作,图形显示,随机查询和对数据库中的数据进行统计,
分析时使用专用的软件和分析决策模型 。
实现数据共享,减少数据冗余:在数据库系统中,对数据的定义和描述已经从应用程序中分离开来,通过数据库管理系统来统一管理 。
采用特定的数据模型:整个数据的组织不是一盘散沙,必须表示出数据之间所存在的有关的关联,才能反映现实世界之间的联系 。
具有较高的数据独立性:在数据库系统中,DBMS提供映像的功能,以确保应用程序对数据结构和存取 方法有较高的独立性 。 数据的物理存储结构与用户看到的逻辑结构可以有很大差别 。 用户只需以简单的逻辑结构来操作数据,无需考虑数据在存储器上的物理位置与结构 。
有统一的数据控制功能:数据库作为多个用户和应用程序的共享资源,
对数据的存取往往是并发的,即多个用户同时使用同一个数据库 。 数据库管理系统必须提供并发控制功能,数据的安全性控制功能和数据的完整性控制功能 。
1.1.4 数据库系统的特点
管理信息系统:是面向机构内部业务和管理的数据库应用系统,如教学管理系统,财务管理系统等 。
开放式信息服务系统 。 这是面向外部,提供动态信息查询功能,以满足不同信息需求的数据库应用系统 。 如:大型综合科技情报系统,经济信息系统,证券实时行情 。
1.1.4 数据库应用系统人们经常以模型来刻画现实世界中的实际事物 。 地图,沙盘,航模都是具体的实物模型,它们会使人们联想到真实生活中的事物,人们也可以用抽象的模型来描述事物及事物运动的规律 。 这里讨论的数据模型就是这一类模型,它是以实际事物的数据特征的抽象来刻画事物的,描述的是事物数据的表征及其特性 。
数据库是某个企业或组织所涉及的数据的提取和综合,它不仅反映数据本身,
而且反映数据之间的联系,也是事物之间的联系的反映 。 如何在数据库系统的形式化结构中抽象表示和处理现实世界中的数据是非常重要的问题 。 在数据库中是用数据模型对现实世界进行抽象的,现有的数据库系统均是基于某种数据模型的 。
因此,了解数据模型的基本概念是学习数据库的基础 。
数据库中最常见的数据模型有三种,它们是:
1.2 数据模型
层次模型? 网状模型? 关系模型
E—R模型若用图来表示,层次模型是一棵倒立的树 。 在数据库中,满足以下两个条件的数据模型称为层次模型:
( 1) 有且仅有一个结点无父结点,这个结点称为根结点;
( 2) 其他结点有且仅有一个父结点 。
在层次模型中,结点层次从根开始定义,根为第一层,根的子结点为第二层,根为其子结点的父结点,同一父结点的子结点称为兄弟结点,
没有子结点的结点称为叶结点 。
在图 1-5所示的抽象层次模型中,R1为根结点; R2和 R3为兄弟结点,
并且是 R1的子结点; R4和 R5为兄弟结点,并且是 R2的子结点; R3、
R4和 R5为叶结点 。
1.2.1 层次模型层次模型对具有一对多层次关系的描述非常自然,直观,容易理解,
这是层次数据库的突出优点 。
R1
R2 R3
R4 R5
图 1-5 层次 模型若用图来表示,网状模型是一个网络 。 在数据库中,满足以下两个条件的数据模型称为网状模型 。
( 1) 允许一个以上的结点无父结点;
( 2) 一个结点可以有多于一个的父结点 。
1.2.2 网状模型
R1 R2
R4 R5
R3
L3
L4
L5
L2
L1
图 1-6 网状模型在图 1-6所示的抽象网状模型中,R1与 R4之间的联系被命名为 L1,R1
与 R3之间的联系被命名为 L2,R2与 R3之间的联系被命名为 L3,R3与 R5之间的联系被命名为 L4,R4与 R5之间的联系被命名为 L5。 R1为 R3和 R4的父结点,R2也是 R3的父结点 。 R1和 R2没有父结点 。
网状模型允许一个以上的结点无父结点或某一个结点有一个以上的父结点,从而构成了比层次结构复杂的网状结构 。
在关系模型中,数据的逻辑结构是一张二维表 。 在数据库中,满足下列条件的二维表称为关系模型:
( 1) 每一列中的分量是类型相同的数据;
( 2) 列的顺序可以是任意的;
( 3) 行的顺序可以是任意的;
( 4) 表中的分量是不可再分割的最小数据项,即表中不允许有子表:
( 5) 表中的任意两行不能完全相同 。
表 1-1给出的 Student( 学生基本情况 ) 表便是一个关系模型 。
1.2.3 关系模型
RecNo StudID Name Sex Birthday Entrancescore
1 981101 赵文化 男 2-28-80 500
2 981102 徐逸华 男 6-7-81 630
3 981103 郭茜茜 女 11-17-82 650
4 981201 钱 途 男 5-1-80 380
5 981202 高 涵 男 11-06-80 630
6 981203 李晓鸣 女 11-17-82 400
表 1-1 Student表关系数据库采用关系模型作为数据的组织方式 。
层次数据库是数据库系统的先驱,而网状数据库则为数据库在概念,方法,技术上的发展奠定了基础 。 它们是数据库技术研究最早的两种数据库,
而且也曾得到广泛的应用 。 但是,这两种数据库管理系统存在着结构比较复杂,用户不易掌握,数据存取操作必须按照模型结构中已定义好的存取路径进行,操作比较复杂等缺点,这就限制了这两种数据库管理系统的发展 。
关系数据库以其具有严格的数学理论,使用简单灵活,数据独立性强等特点,而被公认为是最有前途的一种数据库管理系统 。 它的发展十分迅速,
目前已成为占据主导地位的数据库管理系统 。 自 20世纪 80年代以来,作为商品推出的数据库管理系统几乎都是关系型的 。 例如,ORACLE,SYBASE、
INFORMIX,Visual Foxpro等 。
E-R数据模型 (Entity-Relationship data model)即实体联系数据模型,它属于概念数据模型 。
在 E-R模型中,如果实体之间的联系是对一个实体而言的,这种联系就称为一元联系 。
在二元联系中,实体之间的联系有 1,1,1,n、
m:n三种联系 。
1.2.3 E—R模型关系数据库采用了关系模型作为数据的组织方式,这就涉及到关系模型中的一些基本概念 。 另外,对关系数据库进行查询时,若要找到用户关心的数据,就需要对关系进行一定的关系运算 。
1.3 关系数据库
关系数据库的基本概念
关系运算在关系数据库中,经常会提到关系,属性等关系模型中的一些基本概念 。 为了进一步了解关系数据库,首先给出关系模型中的一些基本概念 。
关系:一个关系就是一张二维表,每个关系有一个关系名 。 在计算机中,一个关系可以存储为一个文件 。 在 Visual FoxPro中,一个关系就是一个表文件 。
属性:二维表中垂直方向的列称为属性,有时也叫做一个字段 。
域:一个属性的取值范围叫做一个域 。
元组:二维表中水平方向的行称为元组,有时也叫做一条记录 。
1.3.1 关系数据库的基本概念码:又称为关键字 。 二维表中的某个属性,若它的值唯一地标识了一个元组,则称该属性为侯选码 。 若一个关系有多个侯选码,则选定其中一个为主码,这个属性称为主属性 。
分量:元组中的一个属性值叫做元组的一个分量 。
关系模式:是对关系的描述,它包括关系名,组成该关系的属性名,属性到域的映像 。 通常简记为:
关系名 ( 属性名 1,属性名 2,…,属性名 n)
属性到域的映像通常直接说明为属性的类型,长度等 。
关系数据库:采用关系模式作为数据的组织方式的数据库叫做关系数据库 。 对关系数据库的描述,称为关系数据库的型,它包括若干域的定义以及在这些域上定义的若干关系模式 。 这些关系模式在某一时刻对应的关系的集合,称为关系数据库的值 。
表 1-1中的关系是一个学生基本情况表 。 表中的每一行是一条学生记录,
是关系的一个元组,Studid( 学号 ),Name( 姓名 ),Sex( 性别 ),
Birthday( 出生日期 ),Entrancescore( 入学成绩 ) 等均是属性 。 其中学号是唯一识别一条记录的属性,因此称为主码 。 对于学号这一属性,域是
,000001‖――― 999999‖,对于姓名属性,域是由 2―― 4个汉字组成的字符串,对于性别属性,域是,男,,,女,。
学生基本情况表的关系模式可记为:
Student( Studid,Name,Sex,Birthday,Entrancescore)
一个关系模式在某一时刻的内容 ( 称为相应模式的状态 ),是元组的集合,称为关系 。 在不至于引起混淆的情况下,往往将关系模式和关系统称为关系 。
对关系数据库进行查询时,若要找到用户关心的数据,就需要对关系进行一定的关系运算 。 关系运算有两种:一种是传统的集合运算 ( 并,
差,交,广义笛卡尔积等 ) ;另一种是专门的关系运算 ( 选择,投影,
连接 ) 。
传统的集合运算 ( 并,差,交,广义笛卡尔积 ) 不仅涉及关系的水平方向 ( 即二维表的行 ),而且涉及关系的垂直方向 ( 即二维表的列 ) 。
关系运算的操作对象是关系,运算的结果仍为关系 。
( 1) 选择选择运算即在关系中选择满足某些条件的元组 。 也就是说,选择运算是在二维表中选择满足指定条件的行 。 例如,在 Student( 学生基本情况 ) 表中,若要找出所有女学生的元组,就可以使用选择运算来实现,
条件是,Sex=―女,。
1.3.2 关系运算
( 2) 投影投影运算是在关系中选择某些属性列 。 例如,在 Student( 学生基本情况 ) 表中,若要仅显示所有学生的 Studid( 学号 ),Name( 姓名 )
和 Sex( 性别 ),那么可以使用投影运算来实现 。
( 3) 联接 ( 并,交,差 )
联接是两个关系的横向结合 。
连接运算是从两个关系的笛卡尔积中选取属性间满足一定条件的元组 。
假设现有两个关系:关系 R和关系 S,关系 R如表 1-2所示,关系 S如表 1-3所示 。 现在对关系 R和关系 S进行广义笛卡尔积运算,那么运算结果为表 1- 4所示的关系 T。
1.3.2 关系运算
StudID Name Sex
981102 徐逸华 男
981103 郭茜茜 女
981202 高 涵 男表 1-2 关系 R
StudID Subid Score
981102 1021 100
981103 1031 98
981101 1011 88
981202 1021 90
表 1-3 关系 S
表 1-4 关系 T
StudID Name Sex StudID Subid Score
981102 徐逸华 男 981102 1021 100
981102 徐逸华 男 981103 1031 98
981102 徐逸华 男 981101 1011 88
981102 徐逸华 男 981202 1021 90
981103 郭茜茜 女 981102 1021 100
981103 郭茜茜 女 981103 1031 98
981103 郭茜茜 女 981101 1011 88
981103 郭茜茜 女 981202 1021 90
981202 高 涵 男 981102 1021 100
981202 高 涵 男 981103 1031 98
981202 高 涵 男 981101 1011 88
981202 高 涵 男 981202 1021 90
如果进行条件为,R,StudID=S,StudID‖的连接运算,那么连接结果为关系 U,如表 1-5所示 。 从表 1-5可以看出关系 U是关系 T的一个子集 。
表 1-5 关系 U
StudID Name Sex StudID Subid Score
981102 徐逸华 男 981102 1021 100
981103 郭茜茜 女 981103 1031 98
981202 高 涵 男 981202 1021 90
联接条件中的属性称为联接属性,两个关系中的联接属性应该有相同的数据类型,以保证其是可比的 。 当联接条件中的关系运算符为,=,时,
表示等值联接 。 表 1-5的关系 U为关系 R和关系 S在条件,R,StudID=S.
StudID‖下的 等值联接 。 若在等值联接的关系 U中去掉重复的属性 ( 或属性组 ),则此联接称为 自然联接 。 表 1-6所示的关系 V是关系 R和关系 S在条件
,R,StudID=S,StudID‖下的自然联接 。
对关系数据库的实际操作,往往是以上几种操作的综合应用 。 例如:
对关系 V再进行投影运算,可以得到仅有属性 Studid( 学号 ),Name( 姓名 ),Subid( 课程编号 ) 和 Score( 成绩 ) 的关系 W,如表 1-7所示 。
表 1-6 关系 V
StudID Name Sex Subid Score
981102 徐逸华 男 1021 100
981103 郭茜茜 女 1031 98
981202 高 涵 男 1021 90
以上这些关系运算,在关系数据库管理系统中都有相应的操作命令 。
表 1-7 关系 W
StudID Name Subid Score
981102 徐逸华 1021 100
981103 郭茜茜 1031 98
981202 高 涵 1021 90
第 2章 Visual FoxPro 6.0基础教学目的,
1.掌握 VFP6.0安装及启动与退出方法
2.掌握 VFP6.0工作环境的设置
3.了解 VFP的文件类型和工作方式教学重点:
1.VFP6.0工作环境的设置
2,VFP的文件类型和工作方式教学难点:
VFP工作环境的设置第 2章 Visual FoxPro 6.0基础
启动和退出 Visual FoxPro 6.0
设置工作环境
Visual FoxPro 6.0的文件类型
Visual FoxPro 6.0的工作方式第 2章 Visual FoxPro 6.0基础
启动和退出 Visual FoxPro 6.0
设置工作环境
Visual FoxPro 6.0的文件类型
Visual FoxPro 6.0的工作方式
2.1 启动和退出 Visual FoxPro 6.0
启动 Visual FoxPro 6.0
Visual FoxPro 6.0工作环境
退出 Visual FoxPro 6.0
利用,开始,菜单启动 Visual FoxPro 6.0,具体操作步骤如下:
( 1) 单击,开始,按钮,系统弹出,开始,菜单 。
( 2) 从,开始,菜单的,程序,子菜单中选择,Microsoft Visual
FoxPro 6.0‖命令,系统即启动 Visual FoxPro 6.0。
2.1.1 启动 Visual FoxPro 6.0
Visual FoxPro 6.0的工作环境主要由菜单栏,工具栏,命令窗口,结果显示区以及状态栏构成 。
2.1.2 Visual FoxPro 6.0工作环境图 2-1 Visual FoxPro 6.0工作环境
1.菜单栏
Visual FoxPro 6.0的菜单栏为用户使用 Visual FoxPro 6.0命令提供了便捷的途径 。
当使用鼠标单击菜单栏的某个菜单时,Visual FoxPro 6.0将显示一个下拉菜单 。
2.工具栏工具栏是专为使用鼠标设置的,用于快速选择执行常用的命令 。 工具栏中的每一个按钮对应一条命令,若要执行某条命令,只需用鼠标单击相应的命令按钮即可 。
3.命令 窗口
l 在命令窗口中输入的每一条命令在按 【 Enter】 键以后将被立即执行 。
l 命令窗口可以保存已执行过的命令,并且这些命令可以再执行 。
l 可以随时调整命令窗口的大小 。
l 移动命令窗口 。
l 关闭命令窗口 。
l 若要重新显示命令窗口,应从,窗口,菜单中选择,命令窗口,命令 。
4.结果显示区结果显示区通常用于显示操作的结果 。
5.状态栏状态栏位于 Visual FoxPro 6.0工作窗口的最下方,用于显示当前的工作状态 。
退出 Visual FoxPro 6.0通常可以采用以下四种方式:
l 从,文件,菜单中选择,退出,命令 。
l 单击工作窗口右上角的,关闭,按钮 。
l 在命令窗口中键入,Quit‖命令 。
l 双击工作窗口左上角的控制菜单图标 。
2.1.3 退出 Visual FoxPro 6.0
Visual FoxPro 6.0在启动时通常使用默认值设置系统工作环境 。
设置 Visual FoxPro 6.0的工作环境可以采用两种方式:临时设置和永久设置 。
临时设置的工作环境只在当前工作期有效,也就是说临时设置的工作环境仅保存在内存中,在退出 Visual FoxPro 6.0时即被释放 。
永久设置的工作环境将保存在 Windows注册表中,下次启动 Visual
FoxPro 6.0时将作为默认值生效 。
Visual FoxPro 6.0通常使用以下几种方法设置系统工作环境:
2.2 设置工作环境
使用命令行开关
使用,选项,命令
使用 SET命令
使用配置文件使用,选项,命令可以临时设置或永久设置系统的工作环境 。 若要使用,选项,命令设置系统工作环境,应按下列步骤操作:
( 1) 从,工具,菜单中选择,选项,命令,系统弹出,选项,对话框 。
( 2) 在,选项,对话框中选择适当的选项卡 。
( 3) 在指定的选项卡中选择需要设置的选项 。
( 4) 若要永久设置系统的工作环境,应单击,设置为默认值,按钮 。
( 5) 最后单击,确定,按钮 。
2.2.1 使用,选项,命令在 Visual FoxPro 6.0中,可以使用 SET命令设置临时系统工作环境 。
SET命令通常在程序中使用,也可以在命令窗口中执行 。
2.2.2 使用 SET命令
SET命令 命令功能
SET STATUS BAR ON|OFF 是否显示状态栏
SET TALK ON|OFF 是否显示命令执行的结果
SET CLOCK ON|OFF 是否显示时钟
SET BELL ON|OFF 是否发出警告声音
SET ESCAPE ON|OFF 用户按 【 Esc】 键时是否取消程序运行
SET SAFETY ON|OFF 是否打开系统的安全性检查
SET EXCLUSIVE ON|OFF 数据库是否以独占方式打开表 2-1 常用的 SET命令
SET命令 命令功能
SET DELETED ON|OFF 是否忽略已作删除标记的记录
SET EXACT ON|OFF 是否精确地对 2个字符串进行比较
SET LOCK ON|OFF 是否自动对文件进行加锁
SET MULTILOCKS ON|OFF 是否一次可对多条记录加锁
SET DEFAULT TO [cPath] 设置默认的工作目录
SET PATH TO [cPath] 设置搜索路径
SET HELP TO [FileName] 设置帮助文件以替代系统帮助
SET DATE TO 设置日期格式
SET CENTURY ON|OFF 显示日期时,年号是否以 4位数显示
SET HOURS TO [12|24] 设置时间以 12或 24小时的格式显示
SET SECONDS ON|OFF 显示时间时,确定是否显示秒
SET MARK TO [cDelimiter] 设置日期分隔符
SET DECIMALS TO [nDecimalPlaces] 设置数值显示时的小数位数续表 2-1
可以使用配置文件设置系统工作环境 。 Visual FoxPro 6.0的配置文件是一个文本文件,可以在其中设置 SET命令,为系统变量赋值,执行指定的命令或调用函数 。
Visual FoxPro 6.0在启动时读取配置文件,设置系统工作环境以及执行配置文件中的命令 。 配置文件中的系统工作环境设置将使,选项,对话框 ( 存储在
Windows注册表 ) 中的默认设置无效 。
使用配置文件具有如下的优点:
( 1) 忽略,选项,对话框所做的默认设置;
( 2) 可以同时维护几个具有不同设置的配置文件 。 Visual FoxPro 6.0可以根据特定用户或项目加载不同的配置文件;
( 3) 与在程序初始化部分使用 SET命令设置系统工作环境相比配置文件更易于修改;
( 4) 在启动 Visual FoxPro 6.0时,配置文件可以自动执行指定的程序或调用函数 。
2.2.3 使用配置文件
1.创建配置文件默认配置文件名为 Config.fpw,也可以使用其他文件名 。 通常配置文件采用,fpw
作为扩展名 。
在配置文件中可以使用 SET命令设置系统工作环境,为系统变量赋值,执行指定的命令或调用函数 。
在配置文件中使用的 SET命令,不能带 SET关键字,而是使用等号 。
例如,要向状态栏添加时钟,命令格式为:
CLOCK= ON
在配置文件中为系统变量赋值的方法是:输入 COMMAND,等号 ( = ),系统变量名称,等号 ( = ) 以及该系统变量的值 。
例如,设置 Visual FoxPro 6.0工作窗口标题的命令格式为:
COMMAND= _SCREEN.Caption=―学籍管理系统,
在配置文件中执行指定的命令或调用函数的方法是:输入 COMMAND,等号
( = ) 以及要执行的命令或要调用的函数 。
例如,若要在 Visual FoxPro 6.0工作窗口的标题栏中显示 Visual FoxPro 6.0的版本号,那么命令格式为:
COMMAND= _SCREEN.Caption= ―Visual FoxPro‖+ SUBSTR( VERS( ),16,
3)
在配置文件中执行应用程序的方法是:输入 COMMAND,等号 ( = ),DO以及要执行的应用程序名称 。
例如,若要在启动 Visual FoxPro 6.0时系统能够自动执行应用程序 MYAPP.APP,
那么命令格式为:
COMMAND= DO MYAPP.APP
需要注意的是:在编辑配置文件时,每个命令应单独占用一行 。
2.使用配置文件当 Visual FoxPro 6.0启动时,可以指定一个配置文件,或忽略所有配置文件,而允许 Visual FoxPro 6.0使用它的默认设置 。 Visual FoxPro 6.0加载一个配置文件以后,
配置文件中的设置优先于,选项,对话框中所做的对应的默认设置 。
使用配置文件的方法是,在启动 Visual FoxPro 6.0的命令行中指定- C开关参数以及希望使用的配置文件名称 ( 必要时包含路径 ) 。 不要在开关参数和文件名称之间添加空格 。
如果不希望使用任何配置文件,包括默认的配置文件 Config.fpw,那么,应在
Visual FoxPro 6.0的命令行中添加- C开关参数,且其后不带任何参数 。
【 例 】 若要在 E:\MYVFP中建立配置文件 MYVFP.FPW,并在启动 Visual FoxPro
6.0时使用该配置文件,那么应如何设置? 要求该配置文件能够将 Visual FoxPro 6.0工作窗口的标题命名为,学籍管理系统,,默认路径为 E:\MYVFP,打开时钟显示 。
首先建立配置文件 MYVFP.FPW,其中的命令包括:
COMMAND= _SCREEN.Caption=―学籍管理系统,
DEFAULT= E:\MYVFP
CLOCK=ON
然后在 Visual FoxPro 6.0的命令行中指定该配置文件 。
D,\VFP98\VFP6.EXE- CE:\MYVFP\MYVFP.FPW
2.3 Visual FoxPro 6.0的文件类型
文档文件
程序文件
数据库文件在 Visual FoxPro 6.0中,文件大体上可以分为三大类:
数据库文件是用来存储数据库数据的文件 。 主要有数据库容器文件,
表文件,索引文件等 。
1.数据库容器文件数据库容器文件的扩展名为,DBC,.DCT和,DCX,其中,,DBC为数据库容器的主文件扩展名,,DCT为数据库容器的备注文件扩展名,,DCX为数据库容器的索引文件扩展名 。
2.表文件表是关系数据库中用来存储数据的主体,表文件的扩展名为,DBF
和,FPT。 其中,,DBF为表的主文件扩展名,主文件用于存储固定长度的数据;,FPT为表的备注文件扩展名,备注文件用于存放可变长度的数据 。
2.3.1 数据库文件
3.索引文件索引的主要作用是加快检索数据的速度 。 Visual FoxPro 6.0
中主要有两种与表有关的索引:复合索引和单一索引 。 复合索引文件的扩展名为,CDX;单一索引文件的扩展名为,IDX。
文档文件主要包括表单文件,报表文件,菜单文件以及项目文件等 。
1.表单文件表单是用于数据输入与输出的图形界面,一个表单对应一个窗口,可以采用
Visual FoxPro 6.0提供的表单设计器来创建 。 表单文件的扩展名为,SCX和,SCT,其中,,SCX为表单的主文件,,SCT为表单的备注文件 。
2.报表文件报表文件为用户打印数据库数据提供了方便灵活的途径,可以采用 Visual
FoxPro 6.0提供的报表设计器来创建 。 报表文件的扩展名为,FRX和,FRT。
3.菜单文件菜单文件用于保存用户使用 Visual FoxPro 6.0的菜单设计器创建菜单程序时所产生的设计数据 。 菜单文件的扩展名为,MNX和,MNT。
4.项目文件
.PJX为项目主文件,,PJT为项目备注文件 。
2.3.2 文档文件程序是由命令所构成的语句序列 。
1.源程序文件
Visual FoxPro 6.0中默认的源程序文件扩展名为,PRG,但 Visual
FoxPro 6.0为了使众多的程序文件相区别,又增加了以,MPR 和,QPR 为扩展名的源程序文件 。
.MPR是菜单程序的扩展名,菜单程序可由菜单设计器生成 。
.QPR是查询程序的扩展名,查询程序可由查询设计器生成 。
如果要使用以,MPR和,QPR为扩展名的程序文件,则在执行程序时必须加上扩展名,否则会出现找不到文件的错误 。
2.3.3 程序文件
2.编译后的程序文件
3.应用程序文件开发一个数据库管理系统可能将涉及到几十个甚至数百个数据文件,文档文件和程序文件 。 为了便于管理和发布,Visual FoxPro 6.0提供了项目管理器 。 利用项目管理器可以将数据文件,文档文件和程序文件打包到一个应用程序文件中,生成扩展名为,APP或,EXE的应用程序文件 。 如果生成的是,APP应用程序文件,则需要在 Visual
FoxPro 6.0环境下才能运行;如果生成的是,EXE应用程序文件,则可以在操作系统环境下直接运行 。
源程序文件扩展名 编译后的程序文件扩展名
.PRG,FXP
.MPR,MPX
.QPR,QPX
表 2-2 源程序文件与编译后的程序文件扩展名
2.4 Visual FoxPro 6.0的工作方式
Visual FoxPro 6.0提供了三种工作方式:
l 菜单方式
l 命令方式
l 程序方式
1.菜单方式在 Visual FoxPro 6.0中,使用菜单或工具栏中的按钮来完成任务对于数据库最终用户来说是最常用的一种工作方式 。 Visual FoxPro 6.0提供的菜单栏和工具栏允许用户通过直观的操作完成指定的任务 。
2.命令方式
Visual FoxPro 6.0提供命令方式主要有两种目的,一是对数据库的操作使用命令比使用菜单或工具栏要快捷而灵活;另一方面,熟悉命令操作是程序开发的基础 。
Visual FoxPro 6.0提供了命令窗口用于输入执行命令 。
Visual FoxPro 6.0中的命令采用近似于自然语言的结构 。
Visual FoxPro 6.0中的命令不区分大小写,即命令可以用大写字母也可以用小写字母书写 。 另外,对于较长的命令可以只输入命令的前四个字母 。
3.程序方式
Visual FoxPro 6.0提供了一个程序编辑器,可以使用 MODIFY
COMMAND 命令打开程序编辑器,或者从,文件,菜单中选择,新建,
命令,在弹出的,新建,对话框中选择,程序,单选项,最后单击,新建文件,按钮即可打开程序编辑器 。
第 3章 项目管理器教学目的,
掌握项目管理器窗口的组成及使用。
教学重点:
利用项目管理器创建项目、及项目管理器的定制。
教学难点:
创建项目的方法。
第 3章 项目管理器项目管理器是用来管理,组织数据和对象的可视化操作工具 。 在使用 Visual
FoxPro时会创建种类繁多的各种文件,因此就需要专门的可视化管理工具来管理以提高工作效率 。 项目管理器将文件根据其文件类型放置在不同的选项卡中,
并采用图示和树形结构的方式组织和显示这些文件,针对不同类型的文件提供不同的操作 。 在 Visual FoxPro中,可以根据需要创建项目,通过直观的操作使用项目管理器以及定制项目管理器 。
认识项目管理器
创建项目
打开和关闭项目
使用项目管理器
定制项目管理器在 Visual FoxPro中,一个应用程序包含有许多个文件,例如数据库文件,
查询文件,表单文件,报表文件和命令文件等等 。 这些文件彼此独立,可以存放在不同的文件夹中,即难于管理又不便于维护 。 为了解决这个问题,
Visual FoxPro提供了项目管理器 。 项目管理器可以将应用程序的所有文件集合成一个有机的整体,形成一个项目文件 。 项目文件的扩展名为,PJX。
项目管理器是组织数据和对象的可视化操作工具 。 项目管理器将文件根据其文件类型放置在不同的选项卡中,并采用图示和树形结构的方式组织和显示这些文件,针对不同类型的文件提供不同的操作 。 项目管理器提供便捷,
可视化的操作方式组织管理 Visual FoxPro的各类文件,数据,文档和对象 。
可以使用项目管理器通过直观的操作来建立数据库,表,查询,表单,报表等文件 。 利用项目管理器可以在项目中添加或移去文件,创建新文件或修改已有文件 。
3.1 认识项目管理器
Visual FoxPro提供了两种方式创建项目:
l 菜单方式
l 命令方式
1.菜单方式项目管理器包含有,全部,,,数据,,,文档,,,类,,,代码,
和,其他,六个选项卡 。 各选项卡的具体含义如下:
,全部,选项卡:用于显示和管理项目管理器能够显示和管理的所有类型的文件,其中包括数据,文档,类库,代码和其他 。
,数据,选项卡:用于显示和管理数据库,自由表和查询三种类型文件 。
,文档,选项卡:用于显示和管理表单,报表和标签三种类型文件 。
,类,选项卡:用于显示和管理所有的类库文件 。
3.2 创建项目
―代码,选项卡:用于显示和管理程序,API库和应用程序三种类型文件 。
,其他,选项卡:用于显示和管理菜单,文本文件和其他文件三种类型文件 。
在项目管理器的右侧排列有若干个按钮,这些按钮的具体功能是:
,新建,按钮:创建一个新文件或对象 。 新文件或对象的类型与当前所选中的选项的类型相同 。 新建的文件或对象将自动包含在项目中 。
,添加,按钮:添加一个已存在的文件到项目中 。
,修改,按钮:在对应的设计器中打开所选择的文件以进行修改 。 例如,在报表设计器中打开一个报表以进行修改 。
,浏览,按钮:在浏览窗口中打开指定的表 。 只有选中了一个表时才能使用该按钮 。
,关闭,按钮:关闭一个打开了的数据库 。 如果被选中的数据库已经关闭,则该按钮的标题改变为,打开,,只有选定的类型为数据库时该按钮才可用 。
,打开,按钮:打开一个数据库 。 如果被选中的数据库已经打开,则该按钮的标题改变为,关闭,。
,移去,按钮:从项目中移去指定的文件或对象 。 Visual FoxPro将会询问是仅从项目中移去文件还是在移去文件的同时从磁盘上删除该文件 。
,连编,按钮:连编一个项目文件或建立应用程序 。 在 Visual FoxPro专业版中,还可以建立可执行文件 。
―预览,按钮:在打印预览方式下显示选定的报表或标签 。 只有选中报表或标签时才能使用,预览,按钮 。
,运行,按钮:执行指定的查询,表单或程序 。 只有选定项目管理器中的一个查询,
表单或程序时才能使用,运行,按钮 。
需要注意的是:,关闭,,,打开,,,运行,和,预览,按钮实际上是共用一个按钮,根据所选择的文件类型的不同,按钮所显示的标题也不同 。
2.命令方式命令格式
CREATE PROJECT [FileName|?]
命令功能该命令用于创建一个新的项目 。
命令说明
( 1) FileName参数用于指定要创建的项目文件名称 。
( 2) 如果在命令中使用? 参数,那么当执行该命令时,系统将打开,创建,对话框,
要求用户输入项目文件名称以及选择保存该项目的文件夹 。
在 Visual FoxPro中可以随时打开一个已有的项目,也可以随时关闭一个打开的项目 。 打开一个已有的项目可以采用菜单方式或命令方式 。 若要关闭项目,只需单击项目管理器右上角的,关闭,按钮即可 。
1.菜单方式从,文件,菜单中选择,打开,命令,可以随时打开一个已有的项目,具体操作步骤如下:
( 1) 从,文件,菜单中选择,打开,命令或者单击,常用,工具栏上的,打开,
按钮,系统弹出,打开,对话框 。
( 2) 在,打开,对话框的,文件类型,组合框中选择,项目,选项,在,搜索,
组合框中选择要打开的项目所在的文件夹 。
( 3) 选择要打开的项目 。
( 4) 单击,确定,按钮,系统即打开选择的项目 。
3.3 打开和关闭项目
2.命令方式在命令窗口中输入 MODIFY PROJECT命令,可以随时打开一个已有的项目 。
命令格式
MODIFY PROJECT [FileName|?]
命令功能该命令用于打开一个已有的项目 。
命令说明
( 1) FileName参数用于指定要打开的项目文件名称 。
( 2) 如果在命令中使用? 参数,那么当执行该命令时,系统将弹出,打开,对话框,要求用户选择保存该项目的文件夹以及项目文件 。
项目文件打开后将显示项目管理器窗口,这时就可以使用项目管理器来组织和管理文件了 。
项目管理器提供了便捷,可视化的操作方式以组织和管理 Visual FoxPro的文件,数据,文档和对象 。 用户可以通过直观的操作在项目中创建,添加,修改,
移去和运行指定的文件,还可以进行其它的操作 。
1.创建文件
2.添加文件
3.修改文件
4.移去文件
5.设置主文件一般来说,每一个项目必须指定一个主文件 。 主文件是应用程序的执行起始点 。 菜单,表单,查询或源程序等文件均可设置为应用程序的主文件 。 每一个项目必须有一个主文件,也只能有一个主文件 。
3.4 使用项目管理器
6.运行程序
7.连编应用程序项目管理器的,连编,按钮主要有两个功能:一是把项目编译成应用程序文件 (,APP) 或可执行文件 (,EXE),二是检查项目的完整性 。
8.文件的包含与排除文件在项目管理器中以两种状态存在:包含和排除 。 所谓,包含,文件,
就是连编项目后,其文件不能再被用户修改 。 项目中所有设置为,包含,
的文件都以只读方式被编译进应用程序文件 (,APP) 或可执行文件 (,EXE)
中 。 所谓,排除,文件,就是连编项目后,其文件仍允许用户修改 。 与
,包含,文件不同的是,,排除,文件并不编译进应用程序中 。
定制项目管理器可以改变项目管理器窗口的外观 。 其主要包括以下几方面:
( 1) 改变项目管理器窗口的大小和位置 。
( 2) 折叠项目管理器窗口 。
( 3) 拆分项目管理器 。
( 4) 设置选项卡的顶层显示 。
3.5 定制项目管理器第 4章 创建数据库和表教学目的,
1.掌握数据库、表的创建方法
2.了解数据以系统的发展情况教学重点:
数据模型的特点,数据库系统的组成、关系数据库的特点及相关运算。
教学难点:
关系数据库的运算。
第 4章 创建数据库和表数据库是指与特定的主题或任务相关的数据的集合,是包含有多种对象的容器 。 数据库除了包含有存储数据的表以外,还包含有视图,连接和存储过程等数据库对象 。
数据库是一个独立的文件,其扩展名为,DBC。
表可以依附一个指定于的数据库,这种表称为数据库表;也可以不依附于任何数据库,这种表称为自由表 。
数据库表依附于所在的数据库,支持长表名,长字段名,可以在数据库表中设置规则,触发器等;自由表不具备数据库表的上述特点 。
数据库表和自由表均是一个独立的,DBF文件 。
创建数据库
建立自由表
打开和关闭数据库
建立数据库表
复制表结构
修改表结构
表与数据库
建立存储过程一,创建数据库的步骤设计数据库的一般步骤如下:
1,确定建立数据库的目的,分析数据需求,这有助于确定创建的数据库中需要保存哪些信息 。
2,确定需要的表,在明确了建立数据库的目的之后,就可以着手把信息分成各个独立的主题,每个主题都可以是数据库中的一个表 。
3,确定所需字段,确定在每个表中要保存哪些信息,在表中的每类信息称做一个字段,浏览时在表中显示为一列 。
4,确定关系,分析每个表,确定一个表中的数据和其他表中的数据有何关系 。 必要时,可在表中加入字段或创建一个新表来明确关系 。
5,设计优化,即修改并完善数据库的设计 。
4.1 创建数据库二,创建数据库的方法在 Visual FoxPro中,可以采用三种方式创建一个数据库 。
1.使用,项目管理器,创建数据库
2.使用,文件,菜单中的,新建,命令创建数据库
3.使用 CREATE DATABASE命令创建数据库命令格式
CREATE DATABASE [DatabaseName |?]
命令功能该命令用于在命令窗口或程序中直接创建一个数据库 。
命令说明
( 1) DatabaseName参数用于指定要创建的数据库名称 。
( 2)? 参数用于在执行该命令时打开,创建,对话框以输入要创建的数据库名称 。
对于一个已创建好的数据库,若要使用它,应首先将其打开 。 使用完毕以后,应将其关闭 。
1.打开数据库命令格式
OPEN DATABASE [FileName |?]
命令功能该命令用于在命令窗口或程序中直接打开指定的数据库 。
命令说明
( 1) FileName参数用于指定要打开的数据库名称 。
( 2)? 参数用于在执行该命令时弹出,打开,对话框以指定要打开的数据库名称 。
4.2 打开与关闭数据库
2.关闭数据库命令格式
CLOSE DATABASES [ALL]
命令功能该命令用于在命令窗口或程序中直接关闭打开的数据库 。
命令说明
ALL参数用于关闭所有打开的数据库及其数据库表,自由表和索引等 。
表是存储数据的基本对象 。 在 Visual FoxPro中,表以两种形态出现,
即数据库表和自由表 。 数据库表是数据库中的对象,它依附于一个指定的数据库 。 自由表不依附于任何数据库 。 无论是数据库表还是自由表均以独立的,DBF文件形式存在 。
在 Visual FoxPro中,可以采用三种方式创建一个自由表 。
4.3 建立自由表
使用,项目管理器,
使用,文件”菜单中的“新建”
命令
使用 CREATE命令
“表设计器,窗口包含有三个选项卡:,字段,,,索引,和,表,选项卡 。 在
,表设计器,窗口的,字段,选项卡中定义表的结构主要涉及字段名称以及字段的数据类型 。
1.字段的命名规则
l 自由表字段名 最长为 10个字符 。
l 数据库表字段名 最长为 128个字符 。
l 字段名必须以字母或汉字开头 。
l 字段名可以由字母,汉字,数字和下划线组成 。
l 字段名中不能包含空格 。
2.字段的数据类型
l 字符型当字段存储内容为由字母,数字,特殊符号以及标点组成的字符串时,可将字段设置为字符型 。 字符型字段存储的字符长度最多可达 254个字符,可以保存储如姓名,地址,籍贯以及无需计算的数字 ( 如邮政编码,电话号码 ) 等文本信息 。
4.3.1 使用,项目管理器,创建自由表
l 货币型用于保存货币类型的数值 。 它占用 8个字节,数值范围可以从- 922337203685477.5808和
922337203685477.5807。 它的小数位数固定为四位,整数位最大可达 15位 。
l 日期型日期型字段用于保存不带时间的日期值,包含年,月,日三项,取值范围从公元零年 1月
1日至公元 9999年 12月 31日 。
l 日期时间型与日期型字段不同的是,日期时间型字段除了包含年,月,日外,还包含了时,分,秒 。
日期时间值存储在两个四字节整数的 8个字节中,第一个四字节整数保存日期,剩下的四字节整数保存时间 。 时间的最小计时单位为百分之一秒 。 如果只填入时间值,而未填写日期值时,则日期值为 null,即空值;如果未指明时间值,则系统用午夜时间 00,00,00AM填入 。
l 逻辑型当字段内容只能选取两种值时,可以采用逻辑型,它只含有两个值:真 (,T.) 和假 (.F.)。
l 数值型数值型用于表示整数或小数,它的长度在表中最长可达 20位,它的表示范围并不确定 。
例如,当定义数值长度为 8,其中小数位为 4时,它所表示的最大值为 999.9999。 小数点要占一位 。
l 双精度型当所存储的数值精度要求很高或要求采用浮点数时,采用双精度型 。 它所表示的数值范围要比数值型的范围精确一些,最多可精确到小数点后 7位 。
l 浮动型浮动型在功能上等价于数值型,其长度在表中最长可达 20位 。
l 整型当对表的存储空间和性能要求严格时,可以使用整型字段保存整数信息 。
整型字段占用 4个字节的空间,并且在表中以二进制存储 。 因此比其他数据类型占用的内存更少,而且计算的速度也要快一些 。 它的数值范围从-
2147483648至 2147483647。
l 通用型通用型字段用于存储电子表格,文档,图片等 OLE信息,通用字段大小取决于 OLE对象的大小以及 OLE对象是以嵌入方式还是链接方式存入该字段 。 如果是嵌入方式,它所占用的空间要大一些 。 一般来说,通用型字段的实际存储空间只受磁盘空间的限制,可以很大 。 但通用型字段在表中仅占 4个字节 。
l 备注型备注型用于存储长度难于确定的数据块,它在表中占用 4个字节 。
备注型不同于其他数据类型,它所保存的数据信息是存储在单独的文件中 。 该文件以,DBT为扩展名,文件名与表名相同 。 该文件的大小取决于数据块的大小,如果磁盘容量允许,该文件最大可达 2G字节 。
l 字符型 ( 二进制 )
与字符型用法相同,它可以包括任意不经过代码页修改的字符数据 。 如某种二进制代码字符或其他语言代码等 。 代码页是供计算机正确解释并显示数据的字符集 。 通常不同的代码页对应不同的平台或语言 。
l 备注型 ( 二进制 )
与备注型用法相同,它可以包括任意不经过代码页修改的备注型字段数据 。
若要使用,新建,命令创建自由表,应按下列步骤操作:
( 1) 从,文件,菜单中选择,新建,命令,系统弹出,新建,对话框 。
( 2) 在,文件类型,区域中选择,表,单选项 。
( 3) 单击,新建文件,按钮,系统弹出,创建,对话框 。
( 4) 在,创建,对话框中输入要创建的自由表名称以及存储路径 。
( 5) 单击,保存,按钮,系统立即打开,表设计器,窗口 。
( 6) 在,表设计器,窗口中定义自由表的结构 。
( 7) 最后单击,确定,按钮,系统弹出提示对话框 。
( 8) 在该对话框中如果单击,是,按钮,系统将进入记录输入窗口,可以直接输入该表要保存的数据;如果单击,否,按钮,系统则仅保存该表的结构 。
4.3.2 使用,新建,命令创建自由表命令格式
CREATE [TableName |?]
命令功能该命令用于在命令窗口或程序中直接创建一个表 。
命令说明
( 1) TableName参数用于指定要创建的表名称 。
( 2)? 参数用于在执行该命令时打开,创建,对话框以输入表名称 。
( 3) 若要创建一个自由表,那么在执行该命令时不能打开任何数据库 。 否则,创建的是一个数据库表 。
4.3.3 使用 CREATE命令创建自由表在 Visual FoxPro中,也可以采用创建自由表的三种方式创建数据库表,并且操作方法也是基本相同的 。 但需要注意的是:无论采用哪一种方式创建数据库表,都要首先打开指定的数据库 。 否则,创建的仍只是一个自由表 。 另外,数据库表与自由表在结构上也存在着差异 。
4.4 建立数据库表
设置字段属性
设置索引
设置记录的有效性规则及触发器在数据库表的,表设计器,窗口的,字段,选项卡中,增加了,显示,,
,字段有效性,,,匹配字段类型到类,以及,字段注释,四组字段属性,每组字段属性中又拥有若干个字段属性 。
在,显示,字段属性组中,包含有三个字段属性,分别是:
,格式,,指定字段在浏览窗口,表单和报表中显示数据的格式,例如:是否将英文字母大写或小写,是否添加货币符号等等 。
4.4.1 设置字段属性格式控制符 说 明
A 只能输入字母
D 使用系统设定的日期格式
L 显示数字的前导零
T 禁止在字符串前后输入空格
! 将小写字母转换为大写表 4-1 格式控制符
―输入掩码,,指定字段输入数据的格式 。 例如,电话号码的格式为:
( 999) 9999-9999。 其中 9表示数字 。
输入掩码控制符 说 明
X 允许输入任何字符
9 允许输入数字和正负符号
# 允许输入数字、空格和正负符号
$ 显示当前货币符号。由 SET CURRENCY命令指定
$$ 显示的货币符号与数值连在一起
* 在数值的左侧填充,*”号
,小数点
,千位分隔符表 4-2 输入掩码控制符
―标题,,在浏览窗口,表单和报表中,利用,标题,字段属性值代替字段名的显示 。
在,字段有效性,字段属性组中,包含有三个字段属性,分别是:
―规则,,指定实施数据字段级有效性检查的规则 。 这是字段避免输入错误内容的一个重要措施 。 它可以是一个语句,也可以是一个过程,当字段输入完成以后,系统将调用这个过程进行检查,如果违反规则,系统将不接受刚才的输入 。 例如,在学生成绩中,单科成绩不能大于 100,我们就可以设置一个规则,该字段不得大于 100,大于 100的数字,系统将不予接受 。
,信息,,指定当输入违反字段级有效性规则时,显示的错误信息 。 如按上述规则,可以输入,学生单科成绩不能超过 100‖,一旦输入了大于 100的数,
系统将提示,学生单科成绩不能超过 100‖信息 。
,默认值,,是指字段在没有输入数据的情况下,系统给定的值 。 例如,
在保存成绩的字段中,可以设定默认值为 0,即当增加了一条新记录时,如果对没有保存成绩的字段输入数值,系统自动在该字段中填入 0。
Visual FoxPro是一个面向对象的数据库系统,对象是其基本特征,数据库,
表,表单,报表是对象,按钮,编辑框,标签,列表框等也是对象,类是对象的模板 。 匹配字段类型就是为字段指定默认的控件类 。 一旦指定了字段对应的控件类,就可以在界面设计时 ( 如在表单设计时 ) 自动设置相应的库和类 。
―显示库,,指定类库的路径和文件名,它是一个扩展名为,,VCX”的文件 。 如果不指定,系统使用默认的类库 。
,显示类,,指定字段的默认控件类 。 如果不指定,使用默认的控件 。
,字段注释,,提供对字段的注解,供用户做说明或备忘 。
主索引,是一种设定为主关键字的索引,其内容具有唯一性,不能在一个表中重复多次 。 一个表只能有一个主索引,只有数据库表才能建立主索引,自由表不能建立主索引 。
候选索引,类似主索引,其内容具有唯一性,不能在表中重复多次 。 一个表可以有多个候选索引 。 数据库表和自由表都可以建立候选索引 。
唯一索引,唯一索引指同一表中索引关键字的内容具有唯一性,没有内容相同的两个以上记录 。 一个表中可以有多个唯一索引 。 数据库表和自由表都可以建立唯一索引 。
普通索引,是一种常规的索引类型,主要用于逻辑排序,以便快速查询 。 索引关键字的内容不具有唯一性,可以重复 。 数据库表和自由表都可以建立普通索引 。
4.4.2 设置索引在表设计器的,表,选项卡中,包含了一些关于表的只读信息,例如,表名,数据库名,表文件,记录数,字段数以及表的长度等,同时对于数据库表,
可以在此设置记录级规则,有效性错误提示,编辑触发器和注释等 。
要实现记录验证功能,只要简单地在记录有效性的,规则,中输入验证的表达式即可 。 规则实际上是一个返回逻辑值的语句或过程 。 例如,在
Student.dbf表中,我们规定学号 ( studid字段 ) 必须与学生的姓名 ( name字段 )
相联系,有姓名的学生必须要有学号,而每一个学号必须对应一个学生的姓名 。
因此,在 Student.dbf表中,学号和姓名都必须输入,不能为空 。 为此可以设置一个记录有效性,规则,,
.NOT.EMPTY(studid).AND..NOT.EMPTY( name)
同时在,信息,文本框中输入验证出错时的消息:
,学号和姓名都必须输入 !‖
4.4.3 设置记录的有效性规则及触发器触发器是一个记录级的事件代码,在操作记录 ( 例如,对记录进行增,删,改操作 ) 时激活,调用要执行的语句或过程 。 在 Visual
FoxPro中,设置有三种类型的触发器,分别是:
插入触发器:指定一个规则,每次向表中插入或追加记录时,触发该规则 。
更新触发器:指定一个规则,每次更新表中记录时,触发该规则 。
删除触发器:指定一个规则,每次从表中删除记录时,触发该规则 。
在 Visual FoxPro中,用户可以随时修改已建立好的自由表以及数据库表的表结构 。 修改表结构通常采用以下两种方式 。
( 1) 使用,项目管理器,
( 2) 使用 MODIFY STRUCTURE命令命令格式
MODIFY STRUCTURE
命令功能该命令用于打开,表设计器,以修改当前表的表结构 。
命令说明该命令用于修改当前表的表结构 。 如果当前表是一个数据库表,那么系统将打开数据库表的,表设计器,窗口;如果当前表是一个自由表,那么系统将打开自由表的,表设计器,窗口 。
4.5 修改表结构命令格式
COPY STRUCTURE TO TableName
[FIELDS FieldList]
[DATABASE cDatabaseName [NAME cTableName]]
命令功能该命令用于把当前表的表结构复制成为另一个表的表结构 。
命令说明
( 1) TableName参数用于指定复制生成的新表表名 。
( 2) FIELDS FieldList 参数用于限定复制生成的新表所拥有的字段 。
FieldList是一个字段列表,字段之间要用逗号分隔 。
( 3) DATABASE cDatabaseName参数用于指明复制生成的新表是一个数据库表 。 cDatabaseName是指定的数据库名 。
4.6 复制表结构
( 4) NAME cTableName参数用于为复制生成的数据库表命名一个长表名 。 其中,cTableName参数用于指定新表的名称 。
( 5) 如果复制的是一个数据库表,那么数据库表中的字段属性,
索引以及记录的有效性规则是无法复制的 。
【 例 】 试使用 COPY STRUCTURE命令复制 Student数据库表的表结构以生成一个新的数据库表,其表名为 Studentbak。 该数据库表依附于 Students数据库 。
USE Student
COPY STRUCTURE TO Studentbak DATABASE Students
在 Visual FoxPro中,每一个数据库表均依附于一个指定的数据库,自由表则不依附于任何一个数据库 。 但是,用户可以随时将一个自由表添加到指定的数据库中去,使其转变为数据库表;
也可以随时将一个数据库表从数据库中移去,使其转变为自由表 。
1,将自由表添加到数据库中
2,从数据库中移去表
4.7 表与数据库存储过程是保存在数据库中的独立程序,属于数据库管理的对象 。 存储过程可供数据库中有关对象调用,从而实现对数据库的管理 。
4.8 建立存储过程第 5章 表的基本操作教学目的,
1.掌握表的浏览、编辑及表中记录定位、插入、删除、
更新方法。
2.掌握表的关闭方法教学重点:
表的编辑与记录的相关操作。
教学难点:
记录的命令操作。
第 5章 表的基本操作建立好数据库和表以后,接下来的工作就是对表的基本操作 。 表的基本操作包括:打开与关闭表;为指定的表添加记录;浏览与编辑表中的记录;定位记录,插入记录,显示记录,修改记录以及删除记录等 。
打开表
添加记录
关闭表
浏览记录
记录的定位
编辑记录
显示记录
更新记录
删除记录
1.使用,文件,菜单中的,打开,命令
2.使用 USE命令命令格式
USE [[DatabaseName!]TableName|?]
[IN nWorkArea ]
[AGAIN]
[ALIAS cTableAlias]
命令功能该命令用于在指定的工作区打开指定的表 。
命令说明
( 1) [DatabaseName!]参数用于指明要打开的表所在的数据库 。 如果该数据库是当前数据库,那么可以将其省略 。
( 2) TableName参数用于指定要打开的表名 。
5.1 打开表
( 3)? 参数用于在执行该命令时弹出,使用,对话框以选择要打开的表名 。
( 4) nWorkArea参数为自然数,用于指定要在哪一个工作区打开表 。 Visual FoxPro
6.0提供了 32767个工作区,每一个工作区可以打开一个表 。
( 5) 在任一时刻,用户只能选择一个工作区,该工作区被称为当前工作区 。 在启动
Visual FoxPro时,系统默认的当前工作区是第 1工作区 。 如果要在当前工作区打开表,那么
IN子句可以省略 。
( 6) 当前工作区中的表被称为当前表 。
( 7) 通常一个表不能在多个工作区同时打开,若要在其它工作区再次打开指定的表,
那么应使用 AGAIN参数 。
( 8) cTableAlias参数用于为打开的表指定别名 。
【 例 】 若要在第 3和第 5工作区分别打开 Student和 Score数据库表,那么应执行如下命令:
USE Student IN 3
USE Score IN 5
【 例 】 若要在第 3和第 6工作区两次打开 Student数据库表,并且第 3工作区为当前工作区,
那么应执行如下命令:
USE Student
USE Student IN 6 AGAIN
1.使用 USE命令命令格式
USE
命令功能该命令用于关闭当前工作区中的表 。
2.使用,数据工作期,窗口
5.2 关闭表
5.3 添加记录
利用键盘添加记录
利用已有的表文件添加记录命令格式
APPEND [BLANK]
[IN nWorkArea ]
命令功能该命令用于向指定的表添加记录 。
命令说明
( 1) 如果省略 BLANK参数,系统进入全屏幕编辑状态,如图 5-2所示 。 利用键盘一次可以添加多条记录 。 如果使用 BLANK参数,系统不进入全屏幕编辑状态,直接添加一条空白记录 。
( 2) 如果表中原有 n条记录,那么将从 n+1开始添加记录 。
( 3) nWorkArea参数用于指定要向哪一个工作区的表添加记录 。 如果要向当前工作区的表添加记录,那么 IN子句可以省略 。
5.3.1 利用键盘添加记录
【 例 】 若要为 Student数据库表添加一条空白记录,那么应执行如下命令:
USE Student
APPEND BLANK
命令格式
APPEND FROM FileName |?
[FIELDS FieldList]
[FOR lExpression]
命令功能该命令将满足条件的记录按指定的字段从源表文件添加到当前表中 。
命令说明
( 1) FileName参数用于指定源表文件名称 。
( 2)? 参数用于在执行该命令时弹出,追加来源,对话框以选择源表文件 。
( 3) FieldList参数用于指定要将源表中的哪些字段数据添加到当前表中 。
如果省略 FIELDS子句,系统将源表中所有字段数据添加到当前表对应的字段中去 。
5.3.2 利用已有的表文件添加记录
【 例 】 Excellent数据库表用于保存成绩优异的学生选课记录,若要将
Score数据库表中成绩大于等于 90的记录添加到 Excellent数据库表中去,那么应执行如下命令:
USE Excellent
APPEND FROM Score FOR score>=90
5.4 浏览记录
使用,项目管理器,浏览记录
定制浏览窗口在 Visual FoxPro中,如果要浏览表中的记录,通常采用以下两种方式:
l 使用,项目管理器,
l 使用 BROWSE命令本节主要内容包括:
使用浏览窗口
使用 BROWSE命令浏览记录若要使用,项目管理器,浏览表中的记录,应按下列步骤操作:
( 1) 首先打开,项目管理器,并选择,数据,选项卡 。
( 2) 在,数据,选项卡中选择要浏览的表 。
( 3) 单击,浏览,按钮,系统即打开该表的浏览窗口 。
在浏览窗口中,一行显示一条记录,一列显示一个字段的数据 。 字段名作为浏览窗口的列头显示在浏览窗口的最上方 。 缺省情况下,浏览窗口中的字段显示顺序由表结构中定义的字段顺序所决定 。
5.4.1 使用,项目管理器,浏览目录打开浏览窗口以后,使用鼠标可以方便地调整字段的显示宽度以及字段的显示顺序,还可以设置显示字体,调整浏览窗口的大小,拆分浏览窗口等等 。
1.调整列宽
2.调整字段的显示顺序
3.设置显示字体
4.调整和拆分浏览窗口
5.4.2 定制浏览窗口在浏览窗口中,可以随时添加记录,编辑记录,删除记录,也可以在众多的记录中快速找到指定的记录 。
1.添加记录
2.编辑记录
3.删除记录
4.定位记录
5.4.3 使用浏览窗口命令格式
BROWSE
[FIELDS FieldList]
[FONT cFontName [,nFontSize]]
[STYLE cFontStyle]
[FOR lExpression1 [REST]]
[FREEZE FieldName]
[KEY eExpression1 [,eExpression2]]
[LAST | NOINIT]
[LOCK nNumberOfFields]
[LPARTITION]
[NOAPPEND]
5.4.4 使用 BROWSE命令浏览记录
[NODELETE]
[NOEDIT | NOMODIFY]
[NOLGRID] [NORGRID]
[NOLINK]
[NOMENU]
[NOOPTIMIZE]
[NOWAIT]
[PARTITION nColumnNumber [LEDIT] [REDIT]]
[PREFERENCE PreferenceName]
[SAVE]
[TIMEOUT nSeconds]
[TITLE cTitleText]
命令功能该命令用于打开浏览窗口以浏览表中的记录 。
命令说明
( 1) FIELDS FieldList子句 用于指定在浏览窗口中显示哪些字段 。 FieldList
参数可以指定一个或多个字段名,字段名之间要用逗号分隔 。
在字段列表中,可以在每一个字段的后面添加若干个参数,这些参数用以对字段作更进一步的控制 。
l [,R] 参数该参数用于设置相关字段为只读,即限定相关字段只能浏览而不能编辑修改 。
l [,nColumnwidth] 参数该参数用于设置在浏览窗口中字段的显示宽度 。
【 例 】 在浏览窗口中,若要将 Student表的 studid字段和 name字段设置为只读,
并且把 studid字段的显示宽度限定为 6,name字段的显示宽度限定为 10,那么应执行如下命令:
USE Student
BROWSE FIELDS studid:R:6,name,R:10,sex,birthday
在上面的例子中,studid字段和 name字段中的数据只能浏览而不能编辑 。 并且把 studid字段的显示宽度限定为 6,name字段的显示宽度限定为 10。
l [,V=lExpressionl[,F] [,E=cMessageText]] 参数该参数用于检查相关字段数据输入的正确性 。 其中 IExpressionl是一个逻辑表达式 。 如果表达式计算结果为,真,(,T.),输入的数据值将被确认为有效,此时光标可以移动到其它字段上;如果表达式计算结果为
,假,,输入的数据值将被确认无效,此时光标不能离开该字段,屏幕将显示错误信息 。 lExpressionl可以是任意类型的表达式,也可以是一个自定义函数 。
缺省情况下,只有在修改字段数据时 lExpressionl才会被计算,如果希望强制进行检查,应使用 [,F] 参数 。 如果添加了 [,F] 参数,当离开字段时,不论字段中的数据是否被修改都要被检验是否正确 。 因此,添加 [,
F] 参数可以检验以前输入数据的正确性 。
当表达式 lExpressionl的计算结果为,假,时,系统将在屏幕底部的状态栏中显示错误信息,缺省情况下显示的错误信息是系统定义的 。 使用 [,
E=cMessageText] 参数可以自定义错误信息 。 信息的内容由 cMessageText
决定 。
【 例 】 在浏览窗口中,若要对 Student表的 entrancescore( 入学成绩 ) 字段的输入数据进行检查,要求输入的入学成绩不能小于 380,
如果入学成绩小于 380,系统显示,入学成绩应大于或等于 380!,
提示,那么应执行如下命令:
USE Student
BROWSE FIELDS studid:R,name:R;
,entrancescore:V=entrancescore>=380,F;
:E=―入学成绩应大于或等于 380!,
l [,B= eLowerBound,eUpperBound[,F]] 参数该参数用于设置相关字段数据的输入范围 。 其中,eLowerBound是输入值的下限,eUpperBound是输入值的上限 。 [,F] 参数表示强制检查字段中的数据,不论该字段中的数据是否已修改 。
【 例 】 在浏览窗口中,若要对 Student表的 entrancescore字段设置数据的输入范围,要求入学成绩应介于 380至 600之间,那么应执行如下命令:
USE Student
BROWSE FIELDS studid:R,name:R,entrancescore:B=380,600,F
l [,H=cHeadingText] 参数该参数用于定义字段的标题 。 缺省情况下,在浏览窗口中通常以字段名作为字段的标题 。 但用户可以使用 [,H=cHeadingText] 参数为字段自定义一个标题 。
【 例 】 在浏览窗口中,若要对 Student表的 studid字段和 name字段分别设置字段标题:,学号,和,姓名,,那么应执行如下命令:
USE Student
BROWSE FIELDS studid:H=―学号,,name:H=―姓名,
l [,W=lExpression2] 参数该参数用于设置数据输入条件 。 当 lExpression2逻辑表达式的结果为
,真,时,允许为相应字段输人数据,反之则不允许输入数据 。
【 例 】 在浏览窗口中,如果 Student表当前记录的 studid字段为空,就不允许为 name字段输入数据,那么应执行如下命令:
USE Student
BROWSE FIELDS studid,name:W=(!EMPTY(studid))
( 2) [FONT cFontName [,nFontSize]]
FONT子句用于定义在浏览窗口中的显示字体和字号 。 其中 cFontName
参数用于指定字体,nFontSize参数用于指定字号 。
在使用 FONT子句时若省略了字号,那么浏览窗口将缺省定义字号为 10
( 像素 ) 。 若省略 FONT子句,浏览窗口将把字体定义为,MS Sans Serif‖,
字号为 8。
【 例 】 在浏览窗口中,如果要采用宋体,12号字显示 Student表中的记录,那么应执行如下命令:
USE Student
BROWSE FONT "宋体 ",12
( 3) [ STYLE cFontStyle」
STYLE子句用于指定浏览窗口的字体样式 。 样式由 cFontStyle参数指定 。 该参数可以组合在一起使用 。 若省略了 STYLE子句,浏览窗口将缺省使用,规则,字体样式 。
表 5-1列出了字体样式控制符以及所代表的字体样式 。
字体样式控制符 字体样式
B Bold
I Italic
N Normal
O Outline
Q Opaque
S Shadow
- Strikeout
T Transparent
U Underline
表 5-1 字体样式
【 例 】 在浏览窗口中,如果要采用宋体,12号字显示 Student表中的记录,字体样式采用粗体以及下划线,那么应执行如下命令:
USE Student
BROWSE FONT "宋体 ",12 STYLE "BU―
( 4) [ FOR IExpressionl[ REST]]
FOR子句用于指定一个逻辑表达式 Iexpressionl,只有满足该逻辑表达式的记录才能显示在浏览窗口中 。
【 例 】 如果在浏览窗口中仅需要显示 Student表中入学成绩大于 500的记录,那么应执行如下命令:
USE Student
BROWSE FOR entrancescore>500
REST参数用于在打开浏览窗口时禁止将记录指针定位在满足给定条件的首条记录上 。
一般情况下,系统在打开浏览窗口时会将记录指针定位在满足条件的第一条记录上 。 若使用 REST参数,记录指针将不会移动到浏览窗口的首条记录上 。
( 5) [FREEZE FieldName]
FREEZE子句用于指定可编辑字段 。 在浏览窗口中,通常显示有多个字段,若只允许修改某一个字段中的数据,那么可以使用
FREEZE子句 。 允许修改的字段由 FieldName参数指定 。
【 例 】 在浏览窗口中,显示有 Student表的学号 ( studid),姓名
( name),性别 ( sex) 和入学成绩 ( entrancescore) 。 如果目前只允许修改入学成绩,那么应执行如下命令:
USE Student
BROWSE FIELDS studid,name,sex,entrancescore FREEZE
entrancescore
( 6) [ KEY eExpressionl[,eExpression2]]
KEY子句可以根据索引的关键字值限定在浏览窗口中显示的记录 。 只有关键字值介于 eExpressionl与 eExpression2之间的记录才能显示在浏览窗口中 。 需要注意的是:该子句所使用的索引必须事先建立好并作为当前索引生效 。
【 例 】 首先根据入学成绩 ( entrancescore) 字段建立索引,然后在打开的浏览窗口中显示入学成绩介于 380至 600的记录 。
USE Student
INDEX ON entrancescore to ENTR.IDX
BROWSE KEY 380,600
( 7) [ LAST| NOINIT]
LAST和 NOINIT这两个子句用于指定使用上一次 BROWSE命令所使用的参数打开浏览窗口 。
通常情况下,当浏览窗口被关闭时,窗口的各项配置 ( 例如,窗口的大小,位置,行宽以及字段列表等 ) 都会存储在资源文件 FOXUSER.DBF中 。
若 使 用 LAST 或 INIT 子句,浏 览 窗 口 将 按 上 一 次 存 储 在 资 源 文 件
FOXUSER.DBF的配置打开 ( SET RESOURCE必须设置为 ON),也就是说,只要使用 LAST或 NOINIT子句,就可无须每次都在 BROWSE命令中重新输入一长串子句,而直接使用上一次所使用的子句设置 。
若使用 Ctrl+ Q组合键退出浏览窗口,则浏览窗口的所有配置不会保存到资源文件 FOXUSER.DBF中 。
( 8) [ LOCK nNumberOfFields]
该子句用于指定在左窗格分区中显示的字段个数 。 浏览窗口可以折分为两个窗格分区 。 使用 LOCK子句可以指定在左窗格分区所显示的字段个数 。
字段个数由 nNumberOfFields决定 。 系统将根据字段的个数自动调整左窗格分区的宽度,使窗格分区能够显示指定的所有字段 。
【 例 】 如果希望在左窗格分区中显示 Student表头两个字段的数据,那么应执行如下命令:
USE Student
BROWSE LOCK 2
( 9) [LPARTITION]
该子句用于将光标放置在左窗格分区的第一个字段上 。 当使用带有
PARTITION子句的 BROWSE命令将浏览窗口拆分为两个窗格分区时,缺省情况下光标出现在右窗格分区的第一个字段上,利用 LPARTITION子句可以把光标放置在左窗格分区的第一个字段上 。
( 10) [ NOAPPEND]
该子句用于禁止在浏览窗口中添加新记录 。 缺省情况下,在浏览窗口中可以通过 Ctrl+ Y组合键或利用系统菜单添加新的记录 。 但使用 NOAPPEND子句后将不允许再在 浏览窗口中添加新的记录 。
( 11) [NODELETE」
该子句用于禁止在浏览窗口中删除记录 。 缺省情况下,在浏览窗口中按下
Ctrl+ T组合键可以对当前记录进行逻辑删除 。 但使用 NODELETE子句后将不再允许对当前记录进行逻辑删除 。
( 12) [NOEDIT | NOMODIFY]
该子句用于禁止在浏览窗口中对记录进行编辑修改 。 缺省情况下,系统允许在浏览窗口中编辑修改记录 。 若使用 NOEDIT或 NOMODIFY子句将不再允许编辑修改记录 。 但是,可以浏览,定位,添加或删除记录 。
( 13) [ NOLGRID] 和 [ NORGRID]
这两个子句用于取消左窗格或右窗格中的网格线 。 当浏览窗口被拆分为两个窗格分区时,窗格分区以编辑模式或浏览模式显示记录 。 在以浏览模式显示记录的窗格中设置有网格线 。 使用 NOLGRID子句可以取消左窗格分区的网格线,使用 NORGRID子句可以取消右窗格分区的网格线 。
( 14) [ NOLINK]
该子句用于取消两个窗格分区的记录链接 。 当浏览窗口被拆分为两个窗格分区时,两个窗格分区的记录处于链接状态 。 也就是说,当在一个窗格分区中定位记录时,另一个窗格分区也定位到同一条记录上 。 当使用
NOLINK子句时,将取消这两个窗格分区的链接状态 。
( 15) [ NOMENU]
该子句用于禁止在打开浏览窗口以后在系统菜单上增加,表,菜单 。 在缺省情况下,打开浏览窗口以后系统菜单将增加一个,表,菜单,允许通过该菜单对打开的表进行操作 。 但使用 NOMENU子句以后将不再在系统菜单上增加,表,菜单 。
( 16) [ NOOPTIMIZE」
该子句用于禁止优化 FOR子句 。 缺省情况下,若 BROWSE命令使用了可优化的 FOR子句,Visual FoxPro将使用 Rushmore技术优化 FOR子句中的表达式,使查询效率大大提高 。 若不希望使用 Rushmore技术,应使用
NOOPTIMIZE子句 。
( 17) [ NOWAIT]
该子句用于在打开一个浏览窗口以后继续执行程序中的其它命令 。 通常情况下,若在应用程序中打开了一个浏览窗口以后,程序会暂停执行,直至关闭浏览窗口 。 若使用 NOWAIT子句,程序在打开浏览窗口以后将继续执行后面的命令语句,而不等待关闭 浏览窗口 。
NOWAIT子句只在应用程序中有效,若在命令窗口中执行 BROWSE命令时使用 NOWAIT子句,该子句不会起任何作用 。
( 18) [ PARTITION nColumnNumber [ LEDIT] [ REDIT]]
该子句用于将浏览窗口拆分成两个窗格分区 。 其中,nColumnNumber参数用于设置左窗格分区的宽度 。 例如,当 nColumnNumber参数设置为 35时,浏览窗口中左窗格分区的宽度为 35。
LEDIT子句用于指定左窗格分区以编辑模式显示,REDIT子句用于指定右窗格分区以编辑模式显示 。
( 19) [ PREFERENCE PreferenceName]
在关闭浏览窗口时,PREFERENCE子句可把浏览窗口的配置保存在资源文件
FOXUSER,DBF中 。 与 LAST于句不同的是,PREFERENCE子句可在资源文件中保存每一次配置,因而系统可以恢复任意一次的配置 。 而 LAST子句只能恢复最近一次的配置 。
( 20) [ SAVE]
该子句用于在关闭浏览窗口以后仍能在屏幕上显示已打开的备注字段编辑窗口并使其仍处于活动状态 。 用户可以使用键盘或鼠标控制并返回浏览窗口 。 SAVE子句只在程序中有效 。
( 21) [ TIMEOUT nSeconds]
该子句用于指定浏览窗口等待多少时间让用户输入数据 。 时间的秒数由 nSeconds
参数指定 。 若在经过 nSeconds秒后仍未输入数据,浏览窗口将自动关闭 。 TIMEOUT
子句只在程序中有效 。
( 22) [ TITLE cTitleText]
该子句用于设置浏览窗口的标题 。 浏览窗口设置有一个窗口标题,缺省情况下标题名就是被打开的表名 。 但可以使用 TITLE子句为浏览窗口指定一个自定义的标题 。
标题名由 cTitleText参数指定 。
5.5 编辑记录在 Visual FoxPro中,如果要编辑表中的记录,通常采用以下两种方式 。
1.使用,项目管理器,编辑记录
2.使用 EDIT命令命令格式
EDIT
[FIELDS FieldList]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[FONT cFontName [,nFontSize]]
[STYLE cFontStyle]
[FREEZE FieldName]
[KEY eExpression1 [,eExpression2]]
[LAST | NOINIT]
[LPARTITION]
[NOAPPEND]
[NODELETE]
[NOEDIT | NOMODIFY]
[NOLINK]
[NOMENU]
[NOOPTIMIZE]
[NOWAIT]
[PARTITION nColumnNumber [LEDIT] [REDIT]]
[PREFERENCE PreferenceName]
[REST]
[SAVE]
[TIMEOUT nSeconds]
[TITLE cTitleText]
命令功能该命令用于打开编辑窗口以编辑表中的记录 。
命令说明该命令所提供的子句和参数与 BROWSE命令提供的子句和参数基本相同,这里不再赘述 。
5.6 记录的定位
GO命令
SKIP命令
Visual FoxPro提供了六个记录定位命令供用户选择使用,它们分别是:
GO,SKIP,LOCATE,CONTINUE,FIND和 SEEK命令 。 这里只介绍
GO,SKIP,LOCATE和 CONTINUE命令,FIND和 SEEK命令将在下一章介绍 。
LOCATE命令
CONTINUE命令命令格式
GO [RECORD] nRecordNumber [IN nWorkArea | IN cTableAlias]

GO TOP | BOTTOM [IN nWorkArea | IN cTableAlias]
命令功能该命令用于将记录指针定位到指定的记录上,使该记录成为当前记录 。
命令说明
( 1) [RECORD] nRecordNumber子句用于指定要定位的物理记录号,nRecordNumber参数为一正整数 。
5.6.1 GO命令
( 2) IN nWorkArea | IN cTableAlias子句用于指定要进行记录定位的表所在的工作区 。 如果要对当前工作区中的表进行记录定位,
那么可以省略该子句 。 nWorkArea参数为工作区号,cTableAlias参数为表的别名 。
( 3) GO TOP命令用于将记录指针定位到逻辑上的首条记录上 。
在没有索引生效的情况下,GO TOP命令等价于 GO 1命令 。 否则,
GO TOP命令将记录指针定位到索引所指定的首条记录上 。
( 4) GO BOTTOM命令用于将记录指针定位到逻辑上的最后一条记录上 。 在没有索引生效的情况下,GO BOTTOM命令将记录指针定位到物理上的最后一条记录上 。 否则,GO BOTTOM命令将记录指针定位到索引所指定的最后一条记录上 。
【 例 】 假设当前工作区中的表拥有 100条记录,那么,将记录指针定位到该表第 100条记录上的命令是:
GO 100
在当前工作区中的表没有索引生效的情况下,还可以使用:
GO BOTTOM
【 例 】 假设当前工作区是第 1工作区,那么,将第 3工作区的表的记录指针定位到第 1条记录上的命令是:
GO 1 IN 3
在第 3工作区中的表没有索引生效的情况下,还可以使用:
GO TOP IN 3
命令格式
SKIP [nRecords] [IN nWorkArea | IN cTableAlias]
命令功能该命令用于将记录指针相对于当前记录向前或向后移动 n条记录 。
命令说明
( 1) nRecords参数用于指定记录指针将要相对于当前记录向前或向后移动的记录数 。 nRecords参数可以是正整数,也可以为负整数 。 如果 nRecords参数是正整数,那么记录指针将相对于当前记录向后 ( 向表尾 ) 移动 nRecords条记录;如果 nRecords参数是负整数,那么记录指针将相对于当前记录向前 ( 向表头 ) 移动 nRecords条记录 。
5.6.2 SKIP命令
( 2) IN nWorkArea | IN cTableAlias子句用于指定要进行记录定位的表所在的工作区 。 如果要对当前工作区中的表进行记录定位,那么可以省略该子句 。 nWorkArea参数为工作区号,cTableAlias参数为表的别名 。
( 3) 如果对没有索引生效的表使用 SKIP命令,那么,系统将按照表的物理顺序向前或向后移动 n条记录 。 否则,系统将按照表的逻辑顺序向前或向后移动 n条记录 。
【 例 】 假设当前记录为 4,在没有索引生效的情况下,使用 SKIP命令将记录指针定位到第 5条记录上的命令是:
SKIP 1
可以将 SKIP 1命令简写为 SKIP。
【 例 】 假设当前记录为 4,在没有索引生效的情况下,使用 SKIP命令将记录指针定位到第 1条记录上的命令是:
SKIP –3
命令格式
LOCATE FOR lExpression1
[Scope]
[WHILE lExpression2]
[NOOPTIMIZE]
命令功能该命令可以在指定的记录范围内将记录指针定位到满足给定条件的首条记录上 。
命令说明
( 1) FOR lExpression1子句用于设置记录定位条件 。 LOCATE命令将按顺序查找满足 lExpression1逻辑表达式的首条记录 。
5.6.3 LOCATE命令
( 2) Scope子句用于设置记录的查找范围 。 在 Visual FoxPro中,
Scope子句的可选项为,All,Next n,Record n和 Rest。 All表示全部记录; Next n表示从当前记录开始向下 n条记录 ( n为自然数 ) ;
Record n表示第 n条记录 ( n为自然数 ) ; Rest表示从当前记录开始向下直到最后一条记录 。 LOCATE命令的默认记录范围是 All。
( 3) WHILE lExpression2子句用于设置 LOCATE命令的执行条件,只要逻辑表达式 lExpression2为,真,(,T.),就继续查找记录 。
( 4) NOOPTIMIZE子句用于禁止优化 FOR子句 。 缺省情况下,
若 LOCATE命令使用了可优化的 FOR子句,Visual FoxPro将使用
Rushmore技术优化 FOR子句中的表达式,使查询效率大大提高 。 若不希望使用 Rushmore技术,应使用 NOOPTIMIZE子句 。
【 例 】 若要在 Student表中查找一个入学成绩大于等于 590分的学生,那么可以使用如下命令:
USE Student
LOCATE FOR entrancescore>=590
DISPLAY?显示找到的第 1个学生命令格式
CONTINUE
命令功能该命令与 LOCATE命令搭配使用,以查找满足给定条件的下一条记录 。
命令说明在命令窗口或程序中若执行或使用了多个 LOCATE命令,那么,
CONTINUE命令将与最近的一个 LOCATE命令搭配使用 。
5.6.4 CONTINUE命令
【 例 】 若要在 Student表中查找两个入学成绩大于等于 590分的学生,那么可以使用如下命令:
USE Student
LOCATE FOR entrancescore>=590
DISPLAY?显示找到的第 1个学生
CONTINUE
DISPLAY?显示找到的第 2个学生
5.7 显示记录
LIST命令
DISPLAY命令在 Visual FoxPro中,系统提供了两个记录显示命令供用户选择使用,
它们分别是,LIST命令和 DISPLAY命令 。
命令格式
LIST
[FIELDS FieldList]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[OFF]
[NOCONSOLE]
[NOOPTIMIZE]
[TO PRINTER [PROMPT] | TO FILE FileName]
命令功能该命令用于显示表中的记录 。
5.7.1 LIST命令命令说明
( 1) FIELDS FieldList子句用于指定所要显示的字段 。 如果省略该子句,
那么将显示表中所有字段的数据 。 FieldList参数是字段列表,字段之间应用逗号分隔 。
( 2) Scope子句用于设置记录的显示范围,其默认值为 All。
( 3) FOR lExpression1和 WHILE lExpression2子句用于设置记录的显示条件 。
( 4) OFF子句用于禁止显示记录号 。 如果省略该子句,那么系统在显示记录时通常会在记录的最左边显示记录号 。
( 5) TO PRINTER [PROMPT] 子句用于将要显示的记录送到打印机上打印出来 。 PROMPT参数用于打开,打印,对话框以进一步设置打印机 。
( 6) TO FILE FileName子句用于将要显示的记录保存到指定的文件中 。
( 7) NOCONSOLE子句用于在将记录送到打印机上打印或保存到指定的文件中时,禁止在屏幕上显示 。
( 8) 没有任何子句的 LIST命令将显示表中的全部记录 。
【 例 】 若要显示 Student表中入学成绩大于等于 590分的学生学号,
姓名以及入学成绩,那么可以使用如下命令:
USE Student
LIST FIELDS studid,name,entrancescore FOR
entrancescore>=590
命令格式
DISPLAY
[[FIELDS] FieldList]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[OFF]
[NOCONSOLE]
[NOOPTIMIZE]
[TO PRINTER [PROMPT] | TO FILE FileName]
命令功能该命令用于显示表中的记录 。
5.7.2 DISPLAY命令命令说明该命令所提供的子句和参数与 LIST命令提供的子句和参数基本相同,这里不再赘述 。 但需要注意的是:没有任何子句的 DISPLAY
命令将显示表中的当前记录 。
【 例 】 若要将 Student表中入学成绩大于等于 590分的记录打印出来,那么可以使用如下命令:
USE Student
DISPLAY FOR entrancescore>=590 TO PRINTER
5.8 更新记录命令格式
REPLACE FieldName1 WITH eExpression1 [ADDITIVE]
[,FieldName2 WITH eExpression2 [ADDITIVE]],..
[Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]
命令功能该命令用于对指定的表进行数据更新 。
命令说明
( 1) FieldName1,FieldName2…… 为要更新的字段 。
( 2) eExpression1,eExpression2…… 为更新表达式 。 更新字段和更新表达式的数据类型应相同 。
( 3) ADDITIVE子句用于将更新表达式的数据添加到备注型字段中去 。
如果不使用该子句,那么备注型字段中的数据将被更新表达式的数据所替换 。 该子句仅适用于备注型字段 。
( 4) Scope子句用于确定记录的更新范围 。 如果省略该子句,那么记录的更新范围为当前记录 。
( 5) FOR lExpression1和 WHILE lExpression2子句用于确定记录的更新条件 。 需要注意的是,在使用 FOR或 WHILE子句时,如果省略 Scope子句,那么记录的更新范围是 ALL。
( 6) IN nWorkArea | cTableAlias子句用于指定要进行记录更新的表所在的工作区 。 如果要对当前工作区中的表进行记录更新,那么可以省略该子句 。 nWorkArea参数为工作区号,cTableAlias参数为表的别名 。
【 例 】 若要将 Student表 depid( 系编号 ) 字段的数据,D001‖全部更新为,D011‖,那么可以使用如下命令:
USE Student
REPLACE depid WITH―D011‖FORdepid=―D001‖
5.9 删除记录
DELETE命令
RECALL命令
Visual FoxPro提供了三种删除记录的命令,它们是,DELETE( 逻辑删除 ) 命令,PACK( 物理删除 ) 命令以及 ZAP( 全部删除 ) 命令 。
另外,Visual FoxPro还提供了对于已做了逻辑删除的记录进行恢复的
RECALL命令 。
PACK命令
ZAP命令
DELETE命令是逻辑删除命令 。 所谓逻辑删除仅是将指定的记录打上删除标记,*”,并不真正将其从表中删除 。
命令格式
DELETE
[Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]
命令功能该命令用于逻辑删除指定的记录,即将指定的记录打上删除标记
,*” 。
5.9.1 DELETE命令命令说明
( 1) Scope子句用于确定要进行逻辑删除操作的记录范围,默认值为当前记录 。
( 2) FOR lExpression1和 WHILE lExpression2子句用于确定逻辑删除记录的条件 。 需要注意的是,在使用 FOR或 WHILE子句时,
如果省略 Scope子句,那么逻辑删除记录的范围是 ALL。
( 3) IN nWorkArea | cTableAlias子句用于指定要进行逻辑删除的表所在的工作区 。 如果要对当前工作区中的表进行逻辑删除,那么可以省略该子句 。 nWorkArea参数为工作区号,cTableAlias参数为表的别名 。
【 例 】 若要逻辑删除 Student表中的第 3条记录,那么可以使用如下命令:
USE Student
GO 3
DELETE
【 例 】 若要逻辑删除 Student表中的第 3,4,5条记录,那么可以使用如下命令:
USE Student
GO 3
DELETE NEXT 3
RECALL命令用于对已做了逻辑删除的记录进行恢复操作,
即撤消记录上的删除标记,*” 。
命令格式
RECALL
[Scope] [FOR lExpression1] [WHILE lExpression2]
[NOOPTIMIZE]
命令功能该命令用于对已做了逻辑删除的记录进行恢复操作,即撤消记录上的删除标记,*” 。
5.9.2 RECALL命令命令说明
( 1) Scope子句用于确定要进行逻辑恢复操作的记录范围,默认值为当前记录 。
( 2) FOR lExpression1和 WHILE lExpression2子句用于确定恢复逻辑删除记录的条件 。 需要注意的是,在使用 FOR或 WHILE子句时,如果省略
Scope子句,那么恢复逻辑删除记录的范围是 ALL。
【 例 】 若要在 Student表的第 3,4,5条记录中恢复已做了逻辑删除并且入学成绩 ( entrancescore字段 ) 大于 580的记录,那么可以使用如下命令:
USE Student
GO 3
RECALL NEXT 3 FOR entrancescore>580
PACK命令用于对已做了逻辑删除的记录进行物理删除操作,即将把做了逻辑删除的记录从表中真正删除 。
命令格式
PACK [MEMO] [DBF]
命令功能该命令用于对已做了逻辑删除的记录进行物理删除操作,即将把做了逻辑删除的记录从表中真正删除 。
命令说明
( 1) MEMO子句仅用于释放备注型字段未用的磁盘空间 。
( 2) DBF子句用于对已做了逻辑删除的记录进行物理删除操作 。
5.9.3 PACK命令
【 例 】 若要释放 Student表中备注型字段未用的磁盘空间,但并不对已做了逻辑删除的记录进行物理删除操作,那么可以使用如下命令:
USE Student
PACK MEMO
【 例 】 若要对 Student表中已做了逻辑删除的记录进行物理删除操作,那么可以使用如下命令:
USE Student
PACK

USE Student
PACK DBF
ZAP命令用于删除表中的全部记录,仅保留表的结构 。
命令格式
ZAP
[IN nWorkArea | cTableAlias]
命令功能该命令用于删除表中的全部记录,仅保留表的结构 。
命令说明
( 1) IN nWorkArea | cTableAlias子句用于指定要删除记录的表所在的工作区 。 如果要对当前工作区中的表进行记录删除操作,那么可以省略该子句 。 nWorkArea参数为工作区号,cTableAlias参数为表的别名 。
( 2) ZAP命令将删除表中的全部记录,因此使用时应格外小心 。
【 例 】 假设当前工作区为第 1工作区,若要删除第 3工作区表中的全部记录,那么可以使用如下命令:
ZAP IN 3
5.9.4 ZAP命令第 6章 索引和排序教学目的,
1.掌握索引、排序的概念及索引的分类
2.掌握索引与排序建立的方法
3.了解利用索引快速查询的方法教学重点:
索引是排序的建立方法教学难点:
索引与排序的命令第 6章 索引和排序索引 ( INDEX) 可以对表中的记录进行逻辑排序,排序
( SORT) 可以对表中的记录进行物理排序 。
了解索引
打开和关闭索引文件
建立索引
设置当前索引文件
利用索引快速查询
建立排序索引可以按照一定的规则重新排列表中的记录,并将排序结果形成索引文件 。 索引文件是一个二维列表,其中仅有二列数据:关键字值和记录的物理位置 。 关键字值是包含有字段的排序规则表达式,记录的物理位置指向关键字值在表中所在的物理位置 。
例如,在表 6-1 所示的 Student表中,若要根据入学成绩
( entrancescore) 的高低重新排序显示表中的记录,用户可以根据
entrancescore字段来建立索引文件 。 建立好的索引文件如表 6-2所示 。
6.1 了解索引
RecNo studid name sex birthday entrancescore
1 981101 赵文化 男 2-28-80 500
2 981102 徐逸华 男 6-7-81 460
3 981103 郭茜茜 女 11-17-82 580
4 981201 钱 途 男 5-1-80 380
5 981202 高 涵 男 11-06-80 680
6 981203 李晓鸣 女 11-17-82 400
表 6-1 Student表中的记录单一索引文件的内部结构如图 6-1所示 。 单一索引文件的扩展名为,IDX。
关键字值 记录的物理位置
380 4
400 6
… …
580 3
680 5
图 6-1 单一索引文件结构复合索引文件的内部结构如图 6-2所示 。 从图中可以看到复合索引文件可以由多个关键字值和其对应的多个记录的物理位置构成 。
每一个关键字值和其对应的记录的物理位置构成了一个索引标识
( TagName) 。 在复合索引文件中,每一个索引标识等价于一个单一索引文件 。 换句话说,复合索引文件等价于多个单一索引文件 。
复合索引文件的扩展名为,CDX。
关键字值
1
物理位置
1
关键字值
2
物理位置
2
…… 关键字值
n
物理位置 n
680 5 11-17-82 3 981101 1
580 3 11-17-82 6 981102 2
… … … … … …
400 6 2-28-80 981203 6
图 6-2 复合索引文件结构
TagName 1 TagName 2 TagName n
复合索引文件又可以进一步细分为结构复合索引文件和非结构复合索引文件 。
结构复合索引文件的文件名称与相关的表同名,另外结构复合索引文件将随着相关表的打开而自动打开 。
非结构复合索引文件的文件名称与相关的表不同名,另外非结构复合索引文件不会随着相关表的打开而自动打开,要由用户自行打开 。
在 Visual FoxPro中,为表建立索引可以采用两种方法来完成:
l 在表设计器中通过直观的操作来建立索引
l 使用 INDEX命令来建立索引命令格式
INDEX ON < eExpression>
TO< IDXFileName> |TAG< TagName> [OF< CDXFileName> ]
[ FOR< lExpression> ]
[ COMPACT]
[ ASCENDING|DESCENDING]
[ UNIQUE|CANDIDATE]
[ ADDITIVE]
6.2 建立索引命令功能
INDEX命令用来为当前的表建立一个索引文件 。 该索引文件可以是单一索引文件,也可以是结构复合索引文件或非结构复合索引文件 。
命令说明
( 1) < eExpression>参数是索引关键字表达式 。 我们通常要根据该表达式来建立索引 。 索引关键字表达式可以由表中的字段,内存变量,数组来构成字符,数值,日期或逻辑表达式 。
( 2) TO < IDXFileName>参数用于建立单一索引文件 。 <
IDXFileName>是单一索引文件名 。
( 3) TAG < TagName> [OF< CDXFileName> ]参数用于建立复合索引文件 。 < TagName>是复合索引标识,< CDXFileName>
是复合索引文件名 。 若要建立结构复合索引文件,可以省略 [OF<
CDXFileName> ]。
( 4) FOR< lExpression>参数用于建立有条件筛选索引 。 也就是说只有符合 FOR< lExpression>条件的记录才会出现在索引文件的索引关键字值列表中 。
( 5) COMPACT参数仅在建立单一索引文件时使用 。 该参数用于为单一索引文件获得压缩处理快速存取索引文件技术的支持,从而大大提高单一索引文件的使用效率 。
( 6) ASCENDING|DESCENDING参数用于指定复合索引文件的某一索引标识是按照升序 ( ASCENDING) 还是降序 ( DESCENDING) 方式进行排序 。
( 7) UNIQUE参数用于建立唯一索引 。 也就是说对于拥有相同关键键值的若干条记录而言,只有第一条记录才会出现在该索引文件的关键字值列表中,
其他具有此关键键值的所有记录都将被排除在该索引文件之外 。
( 8) CANDIDATE参数用于建立候选索引 。
( 9) ADDITIVE参数用于禁止在建立新的索引文件时关闭已打开的其他索引文件 。
建立单一索引
建立非结构复合索引
建立结构复合索引
设置复合索引排序方式
建立惟一索引和候选索引
设置有条件的索引
使用 ADDITIVE参数
使用 COMPACT参数
建立组合索引解决排序冲突要 建 立 单 一 索 引 文 件,应在 INDEX 命 令 中 使 用 TO <
IDXFileName>参数 。
【 例 】 若要为 Student表根据 entrancescore字段建立单一索引文件
( 单一索引文件名为 Entr.IDX),那么应执行如下命令:
USE Student
INDEX ON entrancescore TO Entr.IDX
其中,entrancescore为索引关键字表达式,Entr.IDX为单一索引文件名 。
6.2.1 建立单一索引利用 INDEX命令建立好单一索引文件以后,该单一索引文件自动处于打开状态并作为当前索引生效 。 另外,对于单一索引而言,仅能建立升序单一索引文件,无法建立降序单一索引文件 。 但是我们可以利用 INDEX
命令的索引关键字表达式来建立一个逻辑上的降序单一索引文件 。
【 例 】 若要为 Student表根据 entrancescore字段建立逻辑上降序的单一索引文件 ( 单一索引文件名为 EntrDec.IDX),那么应执行如下命令:
USE Student
INDEX ON –1*entrancescore TO EntrDec.IDX
在建立好 EntrDec.IDX单一索引文件以后,可以使用 LIST命令显示
Student表中的记录 。 我们可以看到记录将按照入学成绩由大到小的降序方式显示 。 但是这并不意味着可以使用 INDEX命令建立真正意义上的降序单一索引文件,而只是利用索引关键字表达式建立了一个逻辑上降序的单一索引文件 。
要建立结构复合索引,应在 INDEX命令中使用 TAG<
TagName>参数 。
【 例 】 若要为 Student表根据 name字段建立结构复合索引文件
( 结构复合索引文件名与表同名,索引标识为 Name),那么应执行如下命令:
USE Student
INDEX ON name TAG Name
其中前一个 name是索引关键字表达式,后一个 Name是索引标识 。
利用 INDEX命令可以建立结构复合索引文件,并在该复合索引文件中创建一个索引标识 。 我们可以多次利用 INDEX命令为结构复合索引文件创建其他的索引标识 。
6.2.2 建立结构复合索引
【 例 】 若要为 Student表根据 depid字段建立结构复合索引文件(索引标识为 Dep),那么应执行如下命令:
USE Student
INDEX ON depid TAG Dep
至此,我们二次利用 INDEX命令创建了结构复合索引文件
( Student.CDX),并在其中建立了两个索引标识( Name和
Dep)。
要建立非结构复合索引,应在 INDEX命令中使用 TAG < TagName> [OF
< CDXFileName> ] 参数 。
【 例 】 若要为 Student表根据 entrancescore字段建立非结构复合索引文件
( 非结构复合索引文件名为 Entr.CDX,索引标识为 Entrscore),那么应执行如下命令:
USE Student
INDEX ON entrancescore TAG Entrscore OF Entr.CDX
其中 entrancescore 是 索 引 关 键 字 表 达 式,Entrscore 是 索 引 标 识,
Entr.CDX是非结构复合索引文件名 。
由于非结构复合索引与当前表不同名,所以必须使用 OF< CDXFileName
>参数指明非结构复合索引文件名 。 与结构复合索引相同,用户可以多次利用 INDEX命令为非结构复合索引文件创建其他的索引标识 。
6.2.3 建立非结构复合索引在建立复合索引文件时,可以使用 [ ASCENDING/ DESCENDING]
参 数 指 定 某 一 索 引 标 识 是 按 照 升 序 ( ASCENDING ) 还 是 降 序
( DESCENDING) 方式进行排序 。 但是需要注意,在建立单一索引文件时,
不能使用 「 ASCENDING/ DESCENDING」 参数 。 这是因为单一索引文件只能按照升序方式进行排序 。
【 例 】 若要为 Student表根据 entrancescore字段建立结构复合索引文件,
索引标识为 Entr,并且希望按降序方式排序,那么应执行如下命令:
USE Student
INDEX ON entrancescore TAG Entr DESCENDING
6.2.4 设置复合索引排序方式如果在 INDEX命令中使用 [ FOR< lExpression> ] 参数,那么相当于在现有的表上建立有条件筛选索引 。 也就是说只有符合 FOR<
lExpression>条件的记录才会出现在索引文件的索引关键字值列表中 。
【 例 】 若要为 Student表根据 entrancescore字段建立单一索引文件
( 单一索引文件名为 Entr.IDX),并且希望只有满足入学成绩大于 400
这一条件的记录才会出现在索引文件的索引关键字值列表中,那么应执行如下命令:
USE Student
INDEX ON entrancescore TO Entr.IDX FOR entrancescore> 400
这样一来,当使用 LIST命令显示记录时,仅仅会显示出入学成绩大于 400的记录并且是按照入学成绩的升序方式显示记录 。
6.2.5 设置有条件的索引如果用户在 INDEX命令中加入关键字 UNIQUE,则对于拥有相同键值的若干条记录而言,只有第一条记录才会出现在该索引文件的关键字值列表中 。 其他具有此键值的所有记录都将被排除在该索引文件之外 。
【 例 】 若要为 Student表根据 birthday字段建立单一索引文件 ( 单一索引文件名为 Birth.IDX),并且该单一索引文件是唯一索引,那么应执行如下命令:
USE Student
INDEX ON birthday TO Birth.IDX UNIQUE
这样一来,当使用 LIST命令显示记录时,Student表中出生日期相同的两条记录只能显示出其中的第一条记录,如图 6-3所示 。 Student表中共有 6条记录,
其中第 3和第 6条记录的出生日期相同,结果仅显示出其中的第 3条记录 。
如果用户在 INDEX命令中加入关键字 CANDIDATE,则相当于在表设计器中建立了候选索引 。
6.2.6 设置惟一索引和候选索引
【 例 】 若要为 Student表根据 studid字段建立结构复合索引文件
( 索引标识为 StuID),并且该索引标识为候选索引,那么应执行如下命令:
USE Student
INDEX ON studid TAG StuID CANDIDATE
对于单一索引文件来说,如果在使用 INDEX命令建立单一索引文件时未使用
COMPACT参数,那么该单一索引文件不能获得压缩处理快速存取索引文件技术的支持 。 如果用户希望在建立单一索引文件时能够获得压缩处理快速存取索引文件技术的支持,那么应在 INDEX命令中使用 COMPACT参数 。
【 例 】 若要为 Student表根据 entrancescore字段建立单一索引文件,并且希望该索引获得压缩处理快速存取索引文件技术的支持,那么应执行如下命令:
USE Student
INDEX ON entrancescore To Entr COMPACT
需要注意的是,COMPACT参数仅对单一索引文件有效 。 对于复合索引文件来说,Visual FoxPro自动为其应用压缩处理快速存取索引文件技术 。
6.2.7 使用 COMPACT参数当用户使用 INDEX命令建立索引文件时,Visual
FoxPro通常会首先关闭已打开的索引文件 ( 结构复合索引文件除外 ),然后再建立新的索引文件并将其置于打开状态 。 如果用户在建立新的索引文件时并不希望关闭先前已打开的索引文件,那么应在 INDEX命令中加入 ADDITIVE参数 。
6.2.8 使用 ADDITIVE参数在实际工作中,如果仅根据某一字段或某一字段表达式建立索引,势必会遇到排序冲突的问题 。 例如,如果仅根据 entrancescore字段建立索引,那么可能会遇到在表中有多条记录的入学成绩相同,那么入学成绩相同的记录如何排序就是我们要解决的排序冲突问题 。
为了解决排序冲突,可以利用 INDEX命令的索引关键字表达式 。 在该表达式中可以根据多个字段的组合来解决排序冲突 。
【 例 】 在 Student表中,如果希望首先根据 birthday字段按照升序的方式进行排序,如果遇到有多条记录的出生日期相同,那么再根据 entrancescore字段按照 t
升序的方式进行排序,那么应执行如下命令:
USE Student
INDEX ON birthday+str(entrancescore) To BirthEntr.IDX
6.2.9 建立组合索引解决排序冲突
6.3 打开和关闭索引文件
打开索引文件
关闭索引文件命令格式
SET INDEX TO[ < IndexFilelist> |?]
[ ORDER< nindexNumber> |< IDXIndexFileName> ]
|[ TAG] < TagName> [ OF< CDXFileName> ]
[ ASCENDING|DESCENDING]] [ ADDITIVE]
命令功能该命令用于打开一个或多个索引文件 。
6.3.1 打开索引文件命令说明
( 1) < IndexFileList>参数用于指定要打开的一个或多个索引文件 。
要打开的多个索引文件之间要用逗号分隔 。 在索引文件列表 (<
IndexFileList>参数 )中可以指定要打开的单一索引文件或非结构复合索引文件 。 另外,索引文件列表中指定的第一个索引文件自动作为当前索引生效 。 但需要注意的是,如果在索引文件列表中指定的第一个索引是非结构复合索引,那么若要其作为当前索引生效还需使用 ORDER参数或使用 SET ORDER TO命令 。
( 2)? 参数用于在执行 SET INDEX TO命令时弹出,打开,对话框以选择要打开的索引文件 。
( 3) ORDER< nindexNumber>参数用于指定在索引文件列表 (<
IndexFileList>参数 )中的第几个索引文件作为当前索引生效 。 <
nindexNumber>参数是一个自然数 。
【 例 】 若要利用 SET INDEX TO命令打开 Entr.IDX,Birth.IDX
和 Name.CDX索引文件并将其中的第二个单一索引文件作为当前索引生效,那么应执行如下命令:
SET INDEX TO Entr.IDX,Birth.IDX,Name.CDX
ORDER 2
( 4) ORDER< IDXIndexFileName
单一索引文件作为当前索引生效 。
【 例 】 以下命令将 Birth.IDX单一索引文件作为当前索引生效:
SET INDEX TO Entr.IDX,Birth.IDX,Name.CDX
ORDER Birth.IDX
( 5) ORDER[ TAG] < TagName> [ OF< CDXFileName> ] 参数用于指定在< IndexFileList>参数中的哪一个复合索引标识作为当前索引生效 。
【 例 】 以下命令将 Name.CDX非结构复合索引中的 Name索引标识作为当前索引生效:
SET INDEX TO Entr.IDX,Birth.IDX,Name.CDX
ORDER TAG Name OF Name.CDX
( 6) ASCENDING|DESCENDING参数用于指定复合索引文件的某一索引标识是按照升序 ( ASCENDING) 还是降序 ( DESCENDING) 方式显示记录 。
( 7) ADDITIVE参数用于禁止在打开索引文件时关闭已打开的其他索引文件 。
命令格式
SET INDEX TO
命令功能该命令用于关闭已打开的索引文件 。
6.3.2 关闭索引文件命令格式
SET ORDER TO
[ < nindexNumber> |< IDXIndexFileName> |[ TAG] <
TagName>
[ OF< CDXFileName> ]
[ IN< nWorkArea> |< cTableAlias> ]
[ ASCENDING|ESCENDING]]
命令功能该命令用于设置当前索引 。
6.4 设置当前索引文件命令说明
( 1) [ < nindexNumber> |< IDXIndexFileName> |[ TAG]
< TagName> [ OF< CDX FileName> ] 参数与 SET INDEX
TO命令中的相应 ORDER参数作用相同,这里不再赘述 。
( 2) [ IN < nWorkArea> |< cTableAlias> ] 参数用于指定要设置哪一个工作区的表为当前索引 。 如果要设置当前索引的表不在当前工作区中,那么应在 SET ORDER TO命令中指明该表所在的工作区 。 < nWorkArea>参数用于指定工作区号,<
cTableAlias>参数用于指定表的别名 。
【 例 】 假设当前工作区是第一工作区,现在若要将第三工作区已打开的第二个索引文件 (该索引文件为单一索引文件 )设置为当前索引,那么应执行如下命令:
SET ORDER TO 2 IN 3
假设第三工作区打开的表为 Student表,该表的别名为 Stu,那么上述命令也可以写为:
SET ORDER TO 2 IN Stu
6.5 利用索引快速查询
FIND命令建立和使用索引的目的有两个:一是可以对表中随机存储的记录根据任务的需要进行逻辑排序,二是可以提高记录的查询检索速度 。 如何提高记录的查询检索速度对于实际应用来说是非常重要的,是评价应用系统的一个重要指标 。 Visual FoxPro提供了两条基于索引的快速查询命令,即 FIND命令和 SEEK命令 。
SEEK命令命令格式
FIND <cExpression>
命令功能该命令用于在当前索引上快速查找索引关键字值与给定的字符串相匹配的首条记录 。 如果查找到相匹配的记录,Visual FoxPro将记录指针指向该记录,并且测试函数 FOUND( )返回逻辑真值,EOF( )
函数返回逻辑假值;否则记录指针将指向记录结束标识,并且测试函数 FOUND()返回逻辑假值,EOF()函数返回逻辑真值 。
命令说明
( 1) <cExpression>参数必须是字符型常量或变量 。
6.5.1 FIND命令
( 2) 字符型常量可以省略定界符 。 若字符型常量包含前置空格,
则必须使用定界符 。
( 3) 若 <cExpression>参数是字符型变量,那么在该字符型变量前要添加宏替换函数 &。
【 例 】 若要在 Student表中利用 FIND命令快速查找名叫,高 涵,
的学生,那么应执行如下命令:
USE Student
INDEX ON name TO Name.IDX
FIND 高 涵如果将要查找的学生姓名保存在一个变量中,那么上述命令应改写为:
USE Student
INDEX ON name TO Name.IDX
XM=―高 涵,
FIND &XM
Visual FoxPro提供了一个独特的宏替换函数 &,该函数用以替换出字符型变量的内容,即 &的值是变量中的字符串 。 上述命令中的,FIND&XM‖命令等价于,FIND高 涵,命令 。
命令格式
SEEK <eExpression>
命令功能该命令用于在当前索引上快速查找索引关键字值与给定的表达式相匹配的首条记录 。 如果查找到相匹配的记录,Visual FoxPro将记录指针指向该记录,并且测试函数 FOUND( )返回逻辑真值,EOF( )函数返回逻辑假值;
否则记录指针将指向记录结束标识,并且测试函数
FOUND( )返回逻辑假值,EOF( )函数返回逻辑真值 。
6.5.2 SEEK命令命令说明
( 1) <eExpression>参数是一个表达式,该表达式可以是字符型表达式,也可以是数值型或日期型表达式 。
( 2) 若 <eExpression>参数是一个字符型常量,那么该字符型常量必须使用定界符 。
( 3) 若 <eExpression>参数是一个变量,那么该变量前无需使用宏替换函数 &。
【 例 】 若要在 Student表中利用 SEEK命令快速查找入学成绩为 580的学生,那么应执行如下命令:
USE Student
INDEX ON entrancescore TO Entr.IDX
SEEK 580
FIND命令和 SEEK命令都是根据索引文件快速查找与给定数据相匹配的记录 。 FIND命令通常用于查找字符型数据,
SEEK命令通常用于查找数值型或日期型数据 。
在 Visual FoxPro中,如果说索引文件仅仅是对表进行逻辑上的排序的话,
那么排序 ( SORT) 命令则是对表进行物理上的排序 。 换句话说,排序命令可以对当前表根据指定的规则进行重新排序,并将重新排序的记录保存成一个新的有序表 。 需要注意的是,Visual FoxPro在使用排序命令时并不改变当前表中记录的位置,而是将排序的结果形成一个新的有序表 。
命令格式
SORT TO <TableName> ON <FieldNamel>[/A][/D][/C]
<FieldName2>[/A][/D][/C]
[ASCENDING|DESCENDING]
[SCOPE] [FOR < IExpressionl> ] [WHILE< IExpression> ]
[FIELDS< FieldNameList> ]
6.6 建立排序命令功能该命令首先将当前表按照指定的字段 (< FieldNamel>,<
FieldName2> … )进行排序,然后将排序好的记录置于名为<
TableName>的新表中 。
命令说明
( 1) < TableName>参数用于指定新生成的有序表名 。 Visual
FoxPro将排序好的记录置于该有序表中 。
( 2) < FieldNamel>,< FieldName2>,… 为指定的排序字段 。
( 3) [ / A」 参数指定排序按升序方式进行 。
( 4) [ / D] 参数指定排序按降序方式进行 。
( 5) [ / C] 参数指定排序时不区分字母的大小写 。
( 6) [ ASCENDING/ DESCENDING] 参数用于指明当根据多个字段进行排序时,如果这多个字段的排序方向一致,可以仅在
SORT命令中使用一次 [ ASCENDING/ DESCENDING] 参数即可 。
( 7) [ SCOPE] 参数用于限定 SORT命令的作用范围 。 用户可以在 SORT命令中使用记录范围参数 ( All,Next n,Record n,
Rest) 指明要对当前表中的哪些记录进行排序 。
( 8) [ FOR < IExpression> ] 和 [ WHILE < IExpression> ]
参数用于限定 SORT命令仅能对满足给定条件的记录进行排序 。
( 9) [ FIELDS < FieldNameList> ] 参数用于限定在新生成的有序表中应包含哪些字段 。
【 例 】 若要对 Student表根据 entrancescore字段进行排序,并将排序结果保存在 Studentsort表中 。 另外,Studentsort表中记录的入学成绩均应大于 480,那么应执行如下命令:
USE Student
SORT TO Studentsort ON entrancescore FOR entrancescore>480
第 7章 多表操作教学目标:
1.掌握工作区的概念及不同工作区内数据的互访的方法。
2.掌握表间关系的建立与删除
3.掌握参照完整性的设置方法教学重点:
1.工作区间数据的互访
2.表间关系的建立及数据库参照完整性的设置教学难点:
工作区间数据的互访。
第 7章 多表操作在实际工作中,数据库的应用往往涉及到多个表,如何同时打开这些表成为数据库应用的关键 。 为了解决这一问题,Visual FoxPro引入了工作区的概念 。 利用 Visual FoxPro提供的工作区,用户可以同时打开多个表 。 另外,如果一个数据库应用涉及到多个表,那么这些表相互之间往往具有某种关系 。 这些表相互之间也只有建立了关系,才能协同完成指定的任务 。 Visual FoxPro允许用户在表间建立临时关系或永久关系 。
选择工作区
了解表间关系
工作区互访
建立表间临时关系
建立表间永久关系
设置参照完整性工作区是 Visual FoxPro在内存开辟的一个独立区域,用于存放打开的表 。
在任一时刻,用户只能对其中的一个工作区进行操作 。 正在被用户操作的工作区称为当前工作区 。
Visual FoxPro 6.0为用户提供了 32767个工作区,即 Visual FoxPro
6.0最多可以同时打开 32767个表 。 工作区彼此之间是相互独立的,即在未建立表间关系的情况下,对当前工作区中表的任何操作,均不会影响其它工作区中打开的表 。
在启动 Visual FoxPro时,系统通常将第 1工作区作为当前工作区 。
如果要在其它工作区打开表,那么应首先选择该工作区 。
Visual FoxPro提供的 SELECT命令用以选择工作区 。
7.1 选择工作区命令格式
SELECT nWorkArea | cTableAlias
命令功能该命令用以选择某一工作区使之成为当前工作区 。
命令说明
( 1) nWorkArea参数用于指定要选择的工作区号 。 工作区号通常采用 1至 32767的正整数标注 。
( 2) cTableAlias是在指定的工作区打开的表的别名 。 表的别名是 Visual FoxPro 用来指定在一个工作区中打开的表的名称 。 打开一个表时,Visual FoxPro 自动使用表名作为默认的表的别名 。 另外,
在使用 USE命令打开一个表时,也可以使用 ALIAS cTableAlias子句自定义表的别名 。
在以下情况下,Visual FoxPro将自动为表指定别名:
l 如果使用包含 AGAIN子句的 USE命令,同时在多个工作区中打开同一个表,并且在每个工作区中打开该表时没有指定别名 。
l 如果别名发生冲突 。
Visual FoxPro自动为表指定的别名是:对于前 10 个工作区,自动指定的别名是字母 A 到 J,对于工作区 11 到 32767,自动指定的别名是
W11到 W32767。
【 例 】 假设执行如下命令已在不同的工作区打开了 Student,Score和
Subject表:
SELECT 1
USE Student
SELECT 2
USE Subject ALIAS Sub
SELECT 3
USE Score
SELECT 12
USE Score AGAIN
现在若要选择第 1工作区,可以执行如下命令:
SELECT Student?使用表名作为默认的表的别名现在若要选择第 2工作区,可以执行如下命令:
SELECT Sub?使用自定义的表的别名现在若要选择第 12工作区,可以执行如下命令:
SELECT W12?使用系统为表自动指定的别名
( 3) 如果 nWorkArea参数为 0,那么意味着 SELECT命令将选择当前未用的最小工作区 。
【 例 】 在执行了如下命令以后,当前工作区应为第 2
工作区 。
SELECT 1
USE Student
SELECT 3
USE Score
SELECT 5
USE Subject
SELECT 0
Visual FoxPro支持在当前工作区调用其它工作区打开的表所存储的数据的操作,我们称这种操作为工作区互访 。
在 Visual FoxPro中,若要使用当前工作区上表的某一个字段,可以直接引用该字段 。 但是,若要访问非当前工作区上表的某一个字段,则应遵循工作区互访格式 。 工作区互访格式为:
<cTableAlias>.<FieldName>
< cTableAlias >为要访问的非当前工作区表的别名,
<FieldName>为要访问的字段名 。 表的别名和字段名之间应使用英文句点连接 。
7.2 工作区互访
【 例 】 Student表存储了学生的基本情况,包括学号 ( STUDID),
姓名 ( NAME),系编号 ( DEPID) 等字段,但是没有包括系的名称
( DEPNAME ) 。 Department 表 存 储了 系的 信息,包 括系 编 号
( DEPID),系名称 ( DEPNAME) 等信息 。 现在若要显示,高涵,
所在的系名称,那么应进行工作区互访 。 具体命令如下:
SELECT 1
USE Student
SELECT 2
USE Department
SELECT 1
LOCATE FORNAME=―高涵,
SELECT 2
LOCATE FOR DEPID=STUDENT.DEPID
DISPLAY STUDENT.STUDID,STUDENT.NAME,
DEPID,DEPNAME
在 Visual FoxPro中,数据库是由众多的表构成的 。 这些表虽然都处在同一个数据库中,但彼此是独立存在的,相互间还没有建立起关系 。 关系数据库系统的特点是可以为表建立表间关系,
从而真实反映客观世界丰富多变的特点以及错综复杂的联系,减少数据的冗余 。 例如,学生基本情况数据库表 ( Student.DBF)
只反映了学生的基本情况,学生选课数据库表 ( Score.DBF) 只反映了学生的选课情况,而课程数据库表 ( Subject.DBF) 也只记录了学校开设的课程 。 对于单个数据库表来说,信息是有限的 。
但是如果一旦建立了表间关系,就可以在一个表中访问另外一个相关表中的数据,也就可以反映比较复杂的情况,例如学生的成绩与所获学分等信息 。
7.3 了解表间关系如果两个表建立了表间关系,那么这两个表中的记录将相互关联起来,也就是说,当在一个表中移动记录时,相关表中的记录也将随着移动并定位在与之相关联的记录上 。 在 Visual FoxPro中,表间关系分为临时表间关系和永久表间关系两种 。
临时表间关系是指在使用时建立的,使表间记录指针联动的关系 。
临时表间关系可以根据需要随时进行设置或更改,当系统退出时,临时表间关系也随之消失,下次使用时还需要重新建立 。
永久表间关系是为了维护数据库表之间的数据完整性而引入的 。
永久表间关系保存在数据库中,只要打开数据库,永久表间关系将立即生效 。
7.3 了解表间关系数据完整性是指数据库表之间不应该出现无法相关联的记录 。
例如,Department表存储了系的信息,只有系编号 ( DEPID) 为
,D001‖,,D002‖,,D003‖的三条记录,那么,在 Student( 学生基本情况 ) 表中,所有学生所在系的系编号 ( DEPID) 字段值也应该是这三个值中的一个 。 如果在 Student( 学生基本情况 ) 表中某条记录的系编号 ( DEPID) 为,D005‖,那么在以后的操作中将无法获取该学生所在系的系名称,说明数据库存在问题,这种问题被称为数据完整性问题 。 数据完整性问题在单个表中是很难发现的,只有将多表进行对比才能发现 。 如果在数据库表之间建立了数据完整性,那么将可避免出现数据完整性问题 。
两个表之间只有存在相关联的字段才能在二者之间建立关系 。
例如,Student( 学生基本情况 ) 表和 Department( 系基本情况 ) 表之间可以建立关系,因为二者都有相关联的 DEPID( 系编号 ) 字段,
但这两个字段所担当的角色并不一样 。 在 Department( 系基本情况 )
表中,DEPID字段的值必须唯一且要包含所有可能的取值,起着相当于函数定义域的作用 。 而在 Student( 学生基本情况 ) 表中,DEPID
字段的值可以重复但必须在 Department表中存在,显然是处于引用者的角色 。
在两个 相关 表中,起着定义相关字段取值范围作用的表称为 父表
( 例如,Department 表 ),而另一个引用父表中相关字段的表称为子表 ( 例如,Student表 ) 。
根据父表和子表中相关联字段的对应关系,永久表间关系可分为两种,一对一关系和一对多关系 。
一对一关系,在这种关系中,父表中的每一条记录最多只与子表中的一条记录相关联 。
在实际工作中,一对一关系使用得很少,因为存在一对一关系的两个表可以简单地合并为一个表 。
若要在两个表之间建立一对一关系,父表和子表都必须以相关联的字段建立主索引,候选索引或唯一索引 。
一对多关系,在这种关系中,父表中的每一条记录可以与子表中的多条记录相关联 。 例如,在 Student表和 Department表中,以 DEPID
( 系编号 ) 字段建立的永久关系即是一对多关系,即 Department表中的一条记录在 Student表中可以有多条系编号相同的记录与之相对应 。
一对多关系是 最常用 的一种表间关系 。
若要在两个表之间建立一对多关系,父表必须根据相关联的字段建立主索引或候选索引,子表必须根据相关联的字段建立普通索引 。
7.4 建立表间临时关系表间临时关系是在打开的表之间利用 SET RELATION命令建立的,这种关系可以根据需要随时建立或更改,但当系统退出时,表间临时关系也随之消失,下次使用时还需要重新建立 。 由于表间临时关系是指在使用时建立的,使表间记录指针联动的关系,因此,也称其为表间关联 。
在 Visual FoxPro中,不同工作区中的表其记录指针是互相独立的,但是,如果两个表之间具有某种关联,则当一个表中的记录指针移动时,与它关联的另一个表中的记录指针也将相应移动,指向对应的记录 。
7.4 建立表间临时关系在 Visual FoxPro中,可以为不同工作区中的两个表建立关联 。
建立关联的两个表其地位是不同的:执行 SET RELATION命令时,在当前工作区中打开的表,其记录指针的移动是主动的,因此我们称其为主表或父表;在另一个工作区中打开的表,其记录指针的移动受父表控制,因此我们称其为从表或子表 。 所谓关联就是当父表的记录指针移动时,子表的记录指针根据表间关系也发生相应的移动;若两个表没有建立关联,则子表记录指针是不会跟随父表移动的 。
取消表间关联? 建立表间关联命令格式
SET RELATION TO
[eExpression1 INTO nWorkArea1 | cTableAlias1
[,eExpression2 INTO nWorkArea2 | cTableAlias2,..]
[IN nWorkArea | cTableAlias]
[ADDITIVE]]
命令功能该命令用于在两个打开的表之间建立关联,从而当父表的记录指针移动时,子表的记录指针根据表间关系也会发生相应的移动 。
7.4.1 建立表间关联命令说明
( 1) eExpression1参数用于指定在父表和子表之间建立关系的关系表达式 。 关系表达式应采用子表当前索引的索引表达式 。 子表的索引可以是普通索引,也可以是复合索引 。 如果是复合索引,则应使用
SET ORDER命令指定当前索引标识 。
( 2) 在建立关联时,子表必须要根据 eExpression1索引表达式建立索引或打开根据 eExpression1索引表达式建立的索引,并使其作为当前索引生效 。
( 3) INTO nWorkArea1 | cTableAlias1子句用于指定子表的工作区号或子表的别名 。
7.4.1 建立表间关联
( 4),eExpression2 INTO nWorkArea2 | cTableAlias2,.,子句用于指定其他关系表达式和子表,以建立父表与其它子表的关联 。 使用
SET RELATION命令可以一次创建父表与多个子表之间的关联 。 但是,各关联之间要用逗号分隔 。 nWorkArea2参数用于指定子表的工作区号,cTableAlias2参数用于指定子表的别名 。
( 5) IN nWorkArea | cTableAlias子句用于指定父表的工作区号或别名 。 IN子句允许父表在非当前工作区打开 。 但是,如果 SET
RELATION命令省略了 IN子句,那么父表必须在当前工作区打开 。
( 6) ADDITIVE子句用于在建立新的表间关联时保留当前工作区中所有已存在的关联 。 如果省略了该子句,那么,在建立新的表间关联时,系统将首先断开所有已存在的关联 。
( 7) 在建立关联时,必须要首先打开父表和与之关联的子表 。
( 8) 在建立关联时,父表和子表的关联字段名可以是相同的,也可以是不同的 。 但是父表和子表关联字段的数据类型必须是相同的 。
【 例 】 Student表存储了学生的基本情况,Department表存储了系的信息 。 现在要根据 DEPID( 系编号 ) 字段建立关联,那么应执行如下命令:
SELECT 1
USE Student
INDEX ON depid TO DEP.IDX
SELECT 2
USE Department
SET RELATION TO depid INTO Student
BROWSE
SELECT 1
BROWSE
对于建立了关联的表,可以随时使用 SET RELATION命令取消关联 。
命令格式
SET RELATION TO
命令功能该命令用于取消当前工作区建立的表间关联 。
【 例 】 现在若要取消上例建立的表间关联,那么应执行如下命令:
SELECT 2
SET RELATION TO
7.4.2 取消表间关联在 Visual FoxPro中,可以为数据库表建立表间永久关系 。
表间永久关系是为了维护数据库表之间的数据完整性而引入的 。
表间永久关系保存在数据库中,只要打开数据库,表间永久关系将立即生效 。 如果两个表建立了表间关系,那么这两个表中的记录将相互关联起来,也就是说,当在一个表中移动记录时,相关表中的记录也将随着移动并定位在与之相关联的记录上 。 在
Visual FoxPro中,表间关系分为临时表间关系和永久表间关系两种 。
1.建立表间永久关系
2.删除表间关系
3.编辑表间关系
7.5 建立表间永久关系参照完整性是控制记录一致性,遵照不同表的主关键字和外部关键字之间的规则,使得插入,删除,更新记录时,能保持已定义的表间关系 。 它类似触发器,在建立关系的表间发生作用 。 参照完整性规则有三种选项:
级联:对父表中的主关键字段或候选关键字段的更改,会在相关的子表中反映出来 。 如果选择了这一选项,只要更改了父表中的关键字段,系统就会自动更改所有相关子表记录中的相应值 。
限制:禁止更改父表中的主关键字段或候选关键字段中的值,这样在子表中就不会出现孤立的记录 。
忽略:即使在子表中有相关的记录,仍允许更新父表中的记录 。
7.6 设置参照完整性第 8章 查询与视图教学目标:
1.了解查询与视图的概念
2.掌握查询与视图的建立方法
3.掌握查询与视图区别
4.掌握利用视图更新数据的方法教学重点:
查询与视图的建立方法、利用视图更新数据教学难点:
远程视图的建立、利用视图更新数据。
第 8章 查询与视图
Visual FoxPro提供了查询设计器和视图设计器 。 使用查询设计器创建的查询可以从指定的表或视图中筛选出满足给定条件的记录,并可以对筛选出来的记录进行排序和分类汇总 。 查询设计器可以将查询结果输出到不同的目的地,方便用户的使用 。 使用视图设计器创建的视图可以从指定的本地表,其它的视图,放在服务器上的表以及从其它关系数据库管理系统中筛选出满足给定条件的记录,并对记录进行排序和分类汇总 。 但视图与查询不同的是:
在视图中改变的记录值可以送回源表以更新源表中相对应的记录 。
创建查询
运行查询
查询的输出方向
SELECT-SQL命令
本地视图与远程视图
利用视图更新数据在 Visual FoxPro中,使用系统提供的查询设计器可以通过直观的操作建立查询,从指定的表中快速筛选出需要的记录,或为报表及表单组织信息,
或基于查询结果创建新的表和图形 。 Visual FoxPro的查询设计器可以根据用户的直观操作自动生成 SELECT- SQL语句,用户可以将查询设计器生成的
SELECT- SQL命令嵌入到相应的程序模块中去,也可以直接在命令窗口中执行 。
使用 Visual FoxPro的查询设计器,首先要选择想从中筛选记录的表或视图,然后通过直观的操作指定查询条件,最后确定查询结果的输出方向,例如将查询结果输出到浏览窗口,表,报表等等 。 Visual FoxPro以文件的方式保存创建的查询,查询文件的扩展名为,QPR。
8.1 创建查询
Visual FoxPro提供了两种创建查询的方法:
l 使用查询设计器
l 使用向导本节主要内容:
1.使用查询设计器
2.使用向导
3.设置要查询的字段
4.筛选记录
5.排序准则
6.建立分组汇总查询
8.2 查询的输出方向查询去向按钮 输出方向浏览 在“浏览”窗口中显示查询结果临时表 将查询结果存储在一个命名的临时只读表中表 将查询结果存储在一个命名的表中图形 将查询结果输送给 MS Graph程序以绘制图表,该查询结果中只能有一个字符型字段和若干个数值型字段屏幕 在 Visual FoxPro的主窗口或当前活动输出窗口中显示查询结果报表 将查询结果输送给一个报表文件(,FRX)
标签 将查询结果输送给一个标签文件(,LBX)
表 8-1 查询结果输出方向列表
l 从,查询,菜单中选择,运行查询,命令来直接运行
,查询设计器,中的查询 。
l 在,项目管理器,的,数据,选项卡中选择要运行的查询名称,然后单击,运行,按钮 。
l 将,查询设计器,生成的 SELECT- SQL语句嵌入到模块中或利用剪贴板将其粘贴命令窗口中 。
8.3 运行查询在创建查询的任何时候,都可查看查询所生成的 SQL语句 。 只要从,查询,菜单中选择,查看 SQL‖命令,或在,查询设计器,工具栏中单击,显示
SQL窗口,按钮,Visual FoxPro即显示有关 SELECT-SQL语句的一个只读窗口 。
Visual FoxPro允许利用剪贴板将 SELECT- SQL语句贴粘到程序模块或命令窗口中去 。 在程序模块或命令窗口中可对 SELECT- SQL语句做进一步的修改,但是 Visual FoxPro不允许在只读窗口中修改 SELECT- SQL语句 。
命令格式
SELECT *|<表达式 1>,<表达式 2>,<表达式 3>,…… ;
FROM <关系 1>,<关系 2>,<关系 3>,…… ;
WHERE <条件表达式 >
Order by <字段名 > desc|asc
8.4 SELECT-SQL命令命令功能该命令用于从指定的表中筛选出满足给定条件的记录,并可以对筛选出来的记录进行排序和分类汇总 。
命令说明
( 1) *代表表中的全部字段,<表达式 1>,<表达式 2>,<表达式 3>是用来选择表中字段
( 2) <关系 1>,<关系 2>,<关系 3>是用来选择表
( 3) <关系表达式 >是用来定义查询条件 。
( 4) SELECT子句和 FROM子句后面的,;,不能省略 。
Visual FoxPro提供的视图设计器允许用户通过直观的操作建立视图,以快速从指定的本地表,其它视图,放在服务器上的表以及其它关系数据库管理系统中筛选出满足给定条件的记录,并可以像查询一样对记录进行排序和分类汇总 。 但视图与查询不同的是:在视图中改变的记录可以送回到源表中以更新源表中相对应的记录 。 Visual FoxPro的视图设计器可以根据用户的直观操作自动生成 SQL( 结构化查询语言 ) 命令,用户可以将视图设计器生成的 SQL命令嵌入到适当的程序模块中去,也可以直接在命令窗口中执行 。
Visual FoxPro的视图分为本地视图和远程视图两种 。 本地视图所能更新的源表是 Visual FoxPro的数据库表或自由表,这些数据库表或自由表未被放在服务器上,我们称这些数据库表或自由表为本地表,远程视图所能更新的源表可以来自放在服务器上的 Visual FoxPro的数据库表或自由表,也可以来自远程数据源 。
8.5 本地视图与远程视图
使用向导创建本地视图
使用视图设计器创建本地视图
创建远程视图
CREATE SQL VIEW命令
Visual FoxPro提供了两种创建视图的方法:
若要使用视图向导创建本地视图,应按下列步骤操作:
( 1) 打开,项目管理器,,选择,数据,选项卡 。
( 2) 在,数据,选项卡中选择,本地视图,。
( 3) 单击,新建,按钮,系统弹出,新建本地视图,对话框 。
( 4) 在,新建本地视图,对话框中单击,视图向导,按钮,
系统弹出,本地视图向导,对话框 。
( 5) 按照,本地视图向导,对话框的提示进行操作 。
8.5.1 使用向导创建本地视图若要使用视图设计器创建本地视图,应按下列步骤操作:
( 1) 打开,项目管理器,,选择,数据,选项卡 。
( 2) 在,数据,选项卡中单击,数据库,选项旁边的加号 ( + ) 。
( 3) 在,数据库,选项下,选择,本地视图,选项 。
( 4) 单击,新建,按钮,系统弹出,新建本地视图,对话框 。
( 5) 在,新建本地视图,对话框中单击,新建视图,按钮,系统弹出
,添加表或视图,对话框 。
( 6) 在,添加表或视图,对话框中选择要使用的表或视图 。 如果要使用的表是一个自由表,应单击,其他,按钮,在弹出的,打开,对话框中选择要使用的自由表 。
( 7) 最后单击,关闭,按钮,将会显示,视图设计器,窗口 。
8.5.2 使用视图设计器创建本地视图使用远程视图,无需下载远程数据源的所有记录到本地计算机上即可提取其中的记录集 。 用户可以在本地操作这些选定的记录,系统会自动把更改或添加的数据回送到远程数据源中去 。 远程视图可以从放在服务器上的表以及从其它关系数据库管理系统中筛选出满足给定条件的记录 。
若要使用远程视图查询远程数据源,必须首先创建一个连接从而将
Visual FoxPro与远程数据源相连 。
设置好 Visual FoxPro与远程数据源的连接以后,即可创建新的远程视图 。
8.5.3 创建远程视图命令格式
CREATE VIEW[ ViewNam] [ REMOTE]
[ CONNECTION ConnectionName[ SHARE]
|CONNECTION DataSourceName]
[ AS SELECTStatement]
命令功能该命令用于创建一个本地视图或远程视图 。
命令说明
( 1) [ ViewNam] 参数用于指定要创建的视图名称,若未指定视图名称,系统将提示用户输入一个名称 。
( 2) 若创建的是远程视图,应使用 REMOTE子句 。 若省略该子句,
系统默认创建的是本地视图 。
8.5.4 CREATE SQL VIEW命令
( 3) CONNECTION ConnectionName参数用于指定连接名称,创建视图时建立并使用该指定连接 。 若添加 SHARE子句,Visual FoxPro将使用一个共享连接,这就意味着其它视图也可以使用这个连接 。 如果不能使用共享连接,Visual FoxPro将使用一个唯一的连接,该连接不能被其它视图使用 。
( 4) CONNECTION DatasourceName参数用于指定连接名称,创建视图时使用一个已存在的连接 。 在这种情况下,不必使用 REMOTE子句,
系统就会根据定义的连接建立远程视图 。
( 5) 使用 AS SELECTStatement子句可以为视图指定条件 。 AS子句后面必须紧跟着一个正确的 SELECT语句 。 SELECT语句不能使用引号括起来 。 对于本地视图来说,SELECT语句中的视图或表名前可带上所属的数据库名,例如:
CREATE VIEW mysqlview;
AS SELECT * FROM Students!Student
若要使源表可更新,应选择,发送 SQL更新,复选框 。
在创建新的视图时,,视图设计器,窗口的,更新条件,选项卡会显示源表中哪些字段被定义为关键字段 。 关键字段在,钥匙,图标列中标识 。
Visual FoxPro用关键字段来唯一标识已被修改的记录 。 Visual FoxPro允许用户重新设置关键字段,方法是:用鼠标单击要被设置为关键字段的字段名左边的,关键字段,列即可 。 如果已改变了关键字段,现在又想恢复到源表中的初始设置,可以单击,重置关键字,按钮 。
可以指定源表中的某些字段允许更新 。 需要注意的是:为了使源表中的字段可更新,必须在,更新条件,选项卡中有已定义的关键字 。 若要设置可更新的字段,应用鼠标单击字段名左边的可更新 ( 笔形图标所标注的 ) 列 。
若要使表中的所有字段可更新,应用鼠标单击,全部更新,按钮 。
8.6 利用视图更新数据如果是在一个多用户环境中工作,数据源中的记录也可以被别的用户访问,也许其它用户正在更新数据源中的记录 。 为了让 Visual
FoxPro检查视图操作的记录在更新之前是否被其它用户修改,Visual
FoxPro在,更新条件,选项卡中设置了,SQL WHERE子句包括,区域 。 该区域中的选项用以控制数据源中的记录被修改后,是否允许进行更新操作 。 若选择,关键字段,单选项,则 Visual FoxPro一旦判明源表中的关键字被其它用户修改过,即禁止当前用户更新视图;若选择
,关键字和可更新字段,单选项,则 Visual FoxPro一旦判明源表中的关键字或任一更新字段被其它用户修改过,即禁止当前用户更新视图;
若选择,关键字和已修改字段,单选项,则 Visual FoxPro一旦判明源表中的关键字或当前用户修改过的字段被其它用户修改过,即禁止当前用户更新视图;若选择,关键字和时间戳,单选项,则 Visual FoxPro
一旦判明源表中的关键字或时间戳被其它用户修改过,即禁止当前用户做视图更新操作 。
―使用更新,区域中的单选项用以控制视图的实际更新方式 。 若要将数据源中需要更新的记录采用先删除然后插入视图中新记录的方式时,应选择,SQL DELETE然后 INSERT‖单选项;若要将数据源中需要更新的记录采用 SQL UPDATE方式改变时,应选择,SQL
UPDATE‖单选项 。
在设计好视图以后,可以像运行查询一样运行视图 。 用户可以在运行的视图窗口中编辑修改记录,Visual FoxPro会将所做的修改返回到源表中去自动进行更新 。
第 9章 结构化查询语言 SQL
教学目标
1.掌握 SQL语言的特点、功能。
2.掌握与数据库、表、查询、视图相关的 SQL命令教学重点
SQL语言的功能及其常用的 SQL命令教学难点:
SQL语言常用命令。
第 9章 结构化查询语言 SQL
SQL是英文 Structure Query Language的缩写,作为关系数据库管理系统通用的结构化查询语言,几乎所有的关系型数据库系统都支持它 。 由于 SQL具有功能丰富,使用方式灵活,语言简洁易学等突出特点,深受广大用户欢迎 。
SQL概述
SQL的数据更新功能
SQL的数据定义功能
SQL的数据查询功能
SQL语言由三部分组成,包含了数据库生成,维护和安全性问题的所有内容 。 它们是:
l 数据定义语言 DDL( Data Definition Language)
l 数据操纵语言 DML( Data Manipulation Language)
l 数据控制语言 DCL( Data Control Language)
DDL提供完整定义数据库必需的所有内容,包括数据库生成后的结构修改,删除功能 。 DDL语言是 SQL中用来生成,修改,
删除数据库基本要素的部分 。 这些基本要素包括表,窗口,模式,
目录等等 。
9.1 SQL概述
DML是 SQL中运算数据库的部分,它是对数据库中的数据输入,
修改及提取的有力工具 。 DML语句读起来像普通的英语句子,非常容易理解 。 但是它也可以是非常复杂的,可以包含有复合表达式,
条件,判断,子查询等等 。
DCL提供的防护措施是数据库安全性所必需的 。 SQL通过限制可以改变数据库的操作来保护它,包括事件,特权等等 。
SQL语言具有许多的优点,概括地来讲主要有以下几点:
1.一体化特点
SQL提供了一系列完整的数据定义和操纵功能 。 使用 SQL可以实现数据库生命周期中的全部活动,包括定义关系模式,录入数据以建立数据库,查询,更新,维护,数据库重构,数据库安全性控制等一系列操作要求 。
2.高度非过程化
SQL和其它数据操纵语言不同的关键是 SQL为非过程语言,它允许用户依据做什么来说明操作,而不用说明怎样做,存取路径的选择和 SQL语句操作的过程由系统自动完成 。
3.语言简洁,易学易用
SQL的语法很简单,它是由一系列增加了复杂性和权能的,层,
组成的像英语一样的语言,初学者经过短期的学习就可以使用 SQL
进行数据库的存取等操作,易学易用是它的最大特点 。
4.统一的语法结构对待不同的工作方式无论是联机交互使用方式,还是嵌入到高级语言中使用,其语法结构是基本一致的,这就大大改善了最终用户和程序设计人员之间的交流 。
5.视图数据结构
SQL语言可以对两种基本数据结构进行操作,一种是,表,,另一种是,视图,。 视图由数据库中满足一定约束条件的数据所组成,
用户可以像对表操作一样对视图进行操作 。 当对视图操作时,由系统转换成对基本关系的操作 。 视图可以作为某个用户的专用数据部分,这样便于用户使用,提高了数据的独立性,有利于数据的安全和保密 。
SQL为许多任务提供了命令,包括:
l 数据查询
l 记录操作
l 数据对象操作
l 数据库一致性和完整性以前的数据库管理系统为上述各类操作提供单独的语言,而 SQL将全部任务集中在一个语言中 。
SQL是工业标准的查询语言,大多数的关系型数据库系统都直接支持 SQL语句或是扩充的 SQL应用 。 当数据库管理系统发生变化时,也许需要重新编写代码,但是 SQL语句却不需要重新编写,只要作很小的改动就可以移植到新的系统上,这为用户提供了很大的方便 。
Visual FoxPro为在程序中检索数据和操作数据提供了许多函数和命令,使用这些函数和命令可完成所有的工作,既然如此,那么在程序中内嵌 SQL有什么好处?
首先,内嵌 SQL语言比使用 Visual FoxPro函数和命令能够使应用程序在检索数据库时得到更好的性能 。
其次,SQL语言是结构化语言,它的语言形象易于理解 。 如果检索数据库出现问题的话也易于维护 。
遗憾的是,Visual FoxPro并不支持所有的 SQL语句,
它只支持其中的子集 。 但是,这些命令对于数据库查询和维 护 是 十 分 重 要 的 。 并 且 这 些 SQL 语 句 都 使 用 了
Rushmore技术优化性能 。
所谓数据定义就是创建数据库,那么对于关系数据库而言,
就是建立表,编辑表 。 SQL语言提供了以下几条数据定义语句:
9.2 SQL的数据定义功能
建立新表 CREATE TABLE
为表添加新字段 ALTER TABLE ADD
编辑表中已有字段 ALTER TABLE ALTER
删除表中指定字段 ALTER TABLE DROP
删除表 DROP TABLE
建立视图命令格式
CREATE TABLE | DBF TableName1 [NAME LongTableName]
[FREE]
(FieldName1 FieldType [(nFieldWidth [,nPrecision])]
[NULL | NOT NULL]
命令功能该命令用于建立一个新表,指明表的表名与结构,包括组成该表的每一个字段名,数据类型等 。
命令说明
( 1) TableName1参数用于指明新建表的表名 。
9.2.1 建立新表
( 2) NAME LongTableName参数用于为数据库表指定一个长表名 。
( 3) FREE参数用于指明要创建一个自由表 。
( 4) FieldName1参数用于指明新建表的字段名 。
( 5) FieldType参数用于指明字段的数据类型 。
( 6) nFieldWidth参数用于指明字段宽度 。
( 7) nPrecision参数用于指明数值型,浮动型,双精度型字段的小数位数 。
( 8) NULL | NOT NULL参数用于指明字段中是否允许保存空值 。
( 9) 命令中使用的 FieldType,nFieldWidth和 nPrecision参数与字段数据类型的对应关系如表 9-1所示 。 表中的 n和 d均为自然数 。
【 例 】 若要在 Students数据库中创建 subject数据库表,并且该表拥有三个字段,subjectid( 字符型,4),subjectname( 字符型,16),
credit( 整型 ),那么应执行如下命令:
open database Students
create table subject;
(subjectid c(4),subjectname c(16),credit i)
数据类型 FieldType参数
nFieldWidth参数
nPrecision参数字符型 C n 无货币型 Y 无 无日期型 D 无 无日期时间型 T 无 无逻辑型 L 无 无数值型 N N d
双精度型 B 无 d
浮动型 F N d
整型 I 无 无通用型 G 无 无备注型 M 无 无表 9-1 FieldType参数命令格式
ALTER TABLE TableName1
ADD [COLUMN] FieldName1
FieldType [(nFieldWidth [,nPrecision])]
[NULL | NOT NULL]
命令功能该命令用于为指定的表添加新的字段 。
命令说明
( 1) TableName1参数用于指明要添加新字段的表名 。
( 2) FieldName1参数用于指明要添加的新字段名称 。
9.2.2 为表添加新字段
( 3) FieldType [(nFieldWidth [,nPrecision])] 参数用于指明要添加的新字段的数据类型,字段宽度以及小数位数 。
( 4) NULL | NOT NULL参数用于指明字段中是否允许保存空值 。
【 例 】 若要在 Students数据库的 Student数据库表中添加一个新字段,photo( 通用型 ),用于存储学生的照片,那么应执行如下命令:
open database Students
alter table Student;
add photo g
命令格式
ALTER TABLE TableName1
ALTER [COLUMN] FieldName1
FieldType [(nFieldWidth [,nPrecision])]
[NULL | NOT NULL]
命令功能该命令用于编辑修改表中指定字段的数据类型,字段宽度等 。
命令说明
( 1) TableName1参数用于指明要编辑修改字段的表名 。
( 2) FieldName1参数用于指明要编辑修改的字段名称 。
9.2.3 编辑表中已有字段
( 3) FieldType [(nFieldWidth [,nPrecision])] 参数用于指明要编辑修改的字段的新数据类型,字段宽度以及小数位数 。
( 4) NULL | NOT NULL参数用于指明字段中是否允许保存空值 。
【 例 】 若要编辑修改 Students数据库的 subject数据库表中的
credit字段,使其数据类型改为数值型,字段宽度为 3,小数位数为 0,
那么应执行如下命令:
open database Students
alter table subject;
alter credit n(3,0)
命令格式
ALTER TABLE TableName1
[DROP [COLUMN] FieldName1]
命令功能该命令用于删除指定表中已不再需要使用的字段 。
命令说明
( 1) TableName1参数用于指明要删除字段的表名 。
( 2) FieldName1参数用于指明要删除的字段名称 。
9.2.4 删除表中指定字段
【 例 】 若要删除 Students数据库的 subject数据库表中的 credit字段,那么应执行如下命令:
open database Students
alter table subject;
drop credit
9.2.4 删除表中指定字段命令格式
DROP TABLE TableName |? [RECYCLE]
命令功能该命令用于删除指定的表 。
命令说明
( 1) TableName参数用于指定要删除的表名 。
( 2)? 参数用于在执行该命令时弹出,删除,对话框以指定要删除的表名 。
( 3) RECYCLE参数用于将删除的表放入回收站 。
【 例 】 若要删除 Students数据库的 Student数据库表,并将其放入回收站,
那么应执行如下命令:
drop table Student recycle
9.2.5 删除表命令格式
CREATE VIEW[ ViewNam] [ REMOTE]
[ CONNECTION ConnectionName[ SHARE]
|CONNECTION DataSourceName]
[ AS SELECTStatement]
命令功能该命令用于创建一个本地视图或远程视图 。
命令说明
( 1) [ ViewNam] 参数用于指定要创建的视图名称,若未指定视图名称,系统将提示用户输入一个名称 。
( 2) 若创建的是远程视图,应使用 REMOTE子句 。 若省略该子句,
系统默认创建的是本地视图 。
9.2.6 CREATE SQL VIEW命令
( 3) CONNECTION ConnectionName参数用于指定连接名称,创建视图时建立并使用该指定连接 。 若添加 SHARE子句,Visual FoxPro将使用一个共享连接,这就意味着其它视图也可以使用这个连接 。 如果不能使用共享连接,Visual FoxPro将使用一个唯一的连接,该连接不能被其它视图使用 。
( 4) CONNECTION DatasourceName参数用于指定连接名称,创建视图时使用一个已存在的连接 。 在这种情况下,不必使用 REMOTE子句,
系统就会根据定义的连接建立远程视图 。
( 5) 使用 AS SELECTStatement子句可以为视图指定条件 。 AS子句后面必须紧跟着一个正确的 SELECT语句 。 SELECT语句不能使用引号括起来 。 对于本地视图来说,SELECT语句中的视图或表名前可带上所属的数据库名,例如:
CREATE VIEW mysqlview;
AS SELECT * FROM Students!Student
所谓数据更新是指对已有的表进行添加记录,更新记录,删除记录的操作,SQL语言提供了以下三条数据更新语句:
9.3 SQL的数据更新功能(数据操纵)
插入记录 INSERT
更新记录 UPDATE
删除记录 DELETE
命令格式
INSERT INTO TableName [(FieldName1 [,FieldName 2,...])]
VALUES (eExpression1 [,eExpression2,...])
命令功能该命令用于向指定的表中插入记录 。
命令说明
( 1) TableName参数用于指定要插入记录的表名 。
( 2) FieldName1 [,FieldName 2,...] 参数用于指定插入记录操作所涉及到的字段 。
( 3) eExpression1 [,eExpression2,...] 参数用于设置要向对应字段插入的数据项 。
9.3.1 插入记录
( 4) INSERT命令将 VALUES子句后面的数据项插入到指定的表中 。 当需要为表中所有字段插入数据时,FieldName1 [,FieldName 2,...] 参数可以省略 。
【 例 】 若要向 Students数据库的 score数据库表插入记录,那么应执行如下命令:
INSERT INTO score(studid,subid,score);
VALUES("100001","1021",100)
9.3.1 插入记录命令格式
UPDATE [DatabaseName1!]TableName1
SET ColumnName1 = eExpression1
[,ColumnName2 = eExpression2,..]
[WHERE FilterCondition1 [AND | OR FilterCondition2,..]]
命令功能该命令用于在指定的表中为满足给定条件记录进行数据更新 。
命令说明
( 1) [DatabaseName1!]参数用于指定要进行更新操作的数据库名 。 如果该数据库是当前数据库,那么可以将其省略 。
9.3.2 更新记录
( 2) TableName1参数用于指定要进行更新操作的表名 。
( 3) ColumnName1,ColumnName2… 参数用于指定更新记录操作所涉及到的字段 。
( 4) eExpression1,eExpression2… 参数用于设置要为对应字段更新的数据项 。
( 5) FilterCondition1 [AND | OR FilterCondition2,..] 参数用于设置更新记录的条件 。 如果省略 WHERE子句,那么将更新表中的全部记录 。
【 例 】 若要将 Students数据库的 Student数据库表中学号为,981103‖
的学生入学成绩调整为 586,那么应执行如下命令:
update Student;
set entrancescore=586;
where studid="981103"
9.3.2 更新记录命令格式
DELETE FROM [DatabaseName!]TableName
[WHERE FilterCondition1 [AND | OR FilterCondition2,..]]
命令功能该命令用于在指定的表中对满足给定条件的记录进行逻辑删除操作 。
命令说明
( 1) [DatabaseName!] 参数用于指定要进行删除操作的数据库名 。 如果该数据库是当前数据库,那么可以将其省略 。
( 2) TableName参数用于指定要进行删除操作的表名 。
9.3.3 删除记录
( 3) FilterCondition1 [AND | OR FilterCondition2,..]
参数用于设置删除记录的条件 。 如果省略 WHERE子句,
那么将删除表中的全部记录 。
【 例 】 若要将 Students数据库的 Student数据库表中学号为,981101‖的学生删除,那么应执行如下命令:
delete from Student;
where studid="981101"
9.3.3 删除记录
结构化查询语言 SQL的格式
SQL的格式:在 SQL语言中查询操作是用 SELECT语句来完成的。它的基本格式如下:
Select [distinct] *|<列表名 > (*代表所有字段);
From <表名 >;
[Where <条件表达式 >; ]
[group by <分组属性名 >; ]
having <条件表达式 >;
[Order By <排序项目 >[ASC/DESC][,ASC/DESC]]
比较运算符,=; LIKE; <>,!=,#; >=; <; <=。
逻辑运算符,AND; OR; NOT; IN; NOTIN; EXISTS;
UNION; INTERSECT; MINUS;
9.4 SQL的数据查询功能
结构化查询语言 SQL命令举例
单表查询:
无条件查询如:查询显示,教工,数据库中,职工档案,
数据表中的所有信息,并按职称排序。
select * from 职工档案 order by 职称
条件查询。条件由 where子句指出,where子句的格式为:
Where 列名 比较运算符 常量(或者列名)
当表示多重条件时可以用逻辑运算符连接几个简单条件。
【 例 】 查询显示,职工档案,数据表中年龄大于 35的职工信息。
Select * from 职工档案 where 年龄 >35
【 例 】 例:查询显示,职工档案,数据表中职称是,讲师,
且性别为,女,的职工姓名。
Select 姓名 from 职工档案 where 职称 =―讲师,
and 性别 =―女,
LIKE模糊查询例,select * from 职工档案 where 姓名 like ―刘 %‖。
多表查询(联接查询)
【 例 】 查询显示所有职工的姓名、职称及实发工资。
Select 职工档案,姓名,职工档案,职称,
职工工资,实发工资
From 职工档案,职工工资
Where 职工档案,姓名 =职工工资,姓名。
嵌套查询嵌套查询是指在 SELECT-FROM-WHERE查询块内部再嵌入另一个查询模块,称为子查询,并允许多层嵌套。由于
ORDER子句是对最终查询结果的表示顺序提出要求,因此它不能出现在子查询中。
【 例 】 查询高数成绩超过 90的女生的学习成绩。
Select 基本情况,学号,高数,哲学,英语;
From 基本情况,学习成绩;
Where 基本情况,学号 =学习成绩,学号 ;
And 性别 =―女,;
And 高数 >90
由于 Where中的条件过于复杂时,容易丢掉一部分条件,此时可以用嵌套形式。
Select 学号,高数,哲学,英语;
From 学习成绩;
Where 高数 >90 and 学号 In;
(select 学号;
from 基本情况;
where 性别 =―女,)
【 例 】 查询基本情况表中年龄超过所有男生的女生。
Select *;
From 基本情况;
Where 性别 =―女,;
And 出生日期 <ALL
(select 出生日期;
from 基本情况;
where 性别 =―男,)
使用库函数查询
count(*),计数函数,计算记录的个数
sum( ):求和函数,对某一数值型字段进行求和
avg( ):求平均值函数,对某一数值型字段求平均值
max( ):求最大值函数,计算某一列的最大值
min( ):求最小值函数,计算某一列的最小值。
【 例 】 求基本情况表中学生人数。
Select ―学生人数,‖,count(*);
From 基本情况;
【 例 】 求 9901专业(学号为 9901XXXX)高数成绩的最高分、
最低分和平均分。
select ―最高分:,,max(高数 ),,最低分:,,
min(高数 ),,平均分:,,avg(高数);
from 学习成绩;
where 学号 like ―9901%‖
【 例 】 求女生英语成绩的总分、人数和平均分。
select ―总分,,sum(英语 ),―人数,,count(*),―平均分,‖,avg(英语 );
from 学习成绩 ;
where 学号 IN ;
( select 学号 ;
from 基本情况 ;
where 性别 =―女,)
【 例 】 找出,社会关系,表中每个学生的亲属人数。
Select 学号,,亲属人数:,,count(*);
From 社会关系;
Group by 学号
【 例 】 找出当前至少有 2位亲属的学生。
Select 学号,姓名;
From 基本情况;
Where 学号 in
(select 学号;
from 社会关系;
group by 学号 ;
having count(*) >=2)
【 例 】 找出有奖励记录的学生姓名及奖励记录数。
Select 姓名,,奖励次数:,,count(个人表现,学号 );
From 个人表现,基本情况;
Where 个人表现,学号 =基本情况,学号;
Group by 姓名;
Having 类别 =―奖,
【 例 】 找出没有奖惩记录的学生。
Select 学号,姓名;
From 基本情况;
Where not exists;
(select *;
from 个人表现;
where 个人表现,学号 =基本情况,学号)
集合运算求学号为,9901101‖和学号为,9901103‖的学生奖惩情况的并集。
Select *;
From 个人表现;
Where 学号 =―9901101‖;
Union;
Select *;
From 个人表现;
Where 学号 =―9901103‖;
第 10章 报表设计教学目标:
1.掌握报表的建立、布局与输出方法
2.掌握报表控件的使用
3.掌握报表数据源的设置及分组的使用教学重点:
报表建立、数据源的设置、分组的使用教学难点:
报表分组的使用和报表控件的使用第 10章 报表设计在 Visual FoxPro中,报表是数据输出的重要形式之一,报表设计是应用程序开发的一个重要组成部分 。 设计报表通常包括两部分内容:数据源和布局 。 数据源是报表的数据来源,它可以是数据库表或自由表,也可以是视图或临时表 。 布局定义了报表的打印格式 。 设计报表就是根据报表的数据源来设计报表的布局 。
创建报表
报表布局
设置报表数据源
报表中使用控件
报表输出
数据分组
Visual FoxPro提供了三种创建报表的方法:
l 使用报表向导创建报表 。
l 使用报表设计器创建自定义的报表 。
l 使用快速报表创建简单规范的报表 。
10.1 创建报表
使用报表向导创建报表
使用快速报表创建报表
使用报表设计器创建报表
―报表设计器,工具栏
―报表控件,工具栏若要使用报表向导创建报表,应按下列步骤操作:
( 1) 打开,项目管理器,,选择,文档,选项卡 。
( 2) 在,文档,选项卡中选择,报表,选项 。
( 3) 单击,新建,按钮,系统弹出,新建报表,对话框 。
( 4) 在,新建报表,对话框中单击,报表向导,按钮,系统弹出,向导选取,对话框 。
( 5) 在,向导选取,对话框中选择要创建的报表类型并单击
,确定,按钮,系统弹出,报表向导-步骤 1‖对话框 。
( 6) 在,报表向导 —步骤 1‖对话框中,选择报表数据源及报表所涉及到的字段 。
10.1.1 使用报表向导创建报表
( 7) 单击,下一步,按钮,系统弹出,报表向导 —步骤 2‖对话框 。
( 8) 选择用于报表分组的字段 。
( 9) 单击,下一步,按钮,系统弹出,报表向导 —步骤 3‖对话框 。
( 10) 选择报表式样 。
( 11) 单击,下一步,按钮,系统弹出,报表向导 —步骤 4‖对话框 。
( 12) 选择报表列数和布局 。
其中,,列数,是指输出的栏数,,字段布局,中的,列,与
,行,分别指定同一条记录的字段是各占一列还是各占一行 。 如果步骤 2中进行了分组,则这两项不可用 。
10.1.1 使用报表向导创建报表
( 13) 单击,下一步,按钮,系统弹出,报表向导 —步骤 5‖对话框 。
( 14) 选择报表中用于排序的字段和顺序 。
( 15) 单击,下一步,按钮,系统弹出,报表向导 —步骤 6‖对话框 。
( 16) 输入报表标题,选择报表保存方式 。 如果要在保存前预先查看报表的输出效果,可以单击,预览,按钮 。
( 17) 单击,完成,按钮,系统弹出,另存为,对话框 。
( 18) 选择存放报表的文件夹,输入保存的报表名称,最后单击
,保存,按钮 。
Visual FoxPro提供的报表设计器允许用户通过直观的操作设计报表,将表,视图或临时表中的数据按照指定的格式打印输出到纸面上 。 在,报表设计器,窗口中,除了页标头,细节和页注脚带区以外,还提供了标题,总结,组标头和组注脚带区 。
命令格式
MODIFY REPORT [FileName |?]
命令功能该命令用于打开指定报表的,报表设计器,窗口 。
10.1.2 使用报表设计器创建报表命令说明
FileName参数用于指定要创建的报表名称 。 如果在命令中使用? 参数,那么当执行命令时,系统将打开,创建,对话框,要求用户输入报表名称以及选择保存该项目的文件夹 。
10.1.2 使用报表设计器创建报表若要使用快速报表创建简单规范的报表,应按下列步骤操作:
( 1) 首先打开一个新的,报表设计器,窗口 。
( 2) 在,报表设计器,窗口的,报表,菜单中选择,快速报表,命令,
系统弹出,打开,对话框 。
( 3) 在,打开,对话框中指定用来构造报表的数据源 。 数据源可以是数据库表,也可以是自由表 。
( 4) 单击,确定,按钮,系统弹出,快速报表,对话框 。
( 5) 在,快速报表,对话框中,选择字段布局,标题和添加别名选项 。
( 6) 若要为报表指定字段,可以单击,字段,按钮进行选择 。
( 7) 最后单击,确定,按钮,系统将自动生成快速报表 。
10.1.3 使用快速报表创建报表
―数据分组,按钮:显示,数据分组,对话框,用于创建数据分组及指定其属性 。
,数据环境,按钮:显示报表的,数据环境设计器,窗口 。
,报表控件工具栏,按钮:显示或关闭,报表控件,工具栏 。
,调色板工具栏,按钮:显示或关闭,调色板,工具栏 。
,布局工具栏,按钮:显示或关闭,布局,工具栏 。
10.1.4,报表设计器,工具栏
―选定对象,按钮:移动或更改控件的大小 。 在创建一个控件后,系统将自动选定该按钮,除非选中,按钮锁定,按钮 。
,标签,按钮:在报表上创建一个标签控件,用于显示与记录无关的数据 。
,域控件,按钮:在报表上创建一个字段控件,用于显示字段,内存变量或其它表达式的内容 。
,线条,按钮:绘制线条 。
,矩形,按钮:绘制矩形 。
,圆角矩形,按钮:绘制圆角矩形 。
,图片/ ActiveX绑定控件,按钮:显示图片或通用型字段的内容 。
,按钮锁定,按钮:允许添加多个相同类型的控件而不需要多次选中该控件按钮 。
10.1.5,报表控件,工具栏一般情况下报表总是与一定的数据源相联系,因此在设计报表时,确定报表的数据源是一项首先要完成的任务 。
报表的数据源可以是数据库表,自由表或视图 。 在设计报表时,如果该报表总是使用相同的数据源,就可以把数据源添加到报表的数据环境中 。
10.2 设置报表数据源
设置报表的数据源
为数据环境中的表设置索引
―数据环境设计器,窗口中的数据源将在每一次运行报表时被打开,而不必以手工方式打开所使用的数据源 。 如果报表不是固定使用同一个数据源,例如,可能在每次运行报表时才能确定所要使用的数据源,那么在这种情况下一般不把数据源直接放在报表的,数据环境设计器,窗口中,而是在使用报表时由用户先做出选择 。 例如设计一个包含若干个按钮的对话框,在每一个按钮的 Click事件过程中设置打开表或视图的命令或其它产生所需数据源的命令 ( 如运行一个查询,使用 SELECT- SQL语句等 ) 。
10.2.1 设置报表的数据源为数据环境中的表设置索引,可以控制报表中记录的打印顺序,但前提是有关字段已做过索引 。
10.2.2 为数据环境中的表设置索引设计报表时一个最为关心的问题是如何把数据放在报表的恰当位置上 。 一个报表总是被划分为若干个带区 。 带区名标识在带区下的标识栏上,带区的作用主要是控制数据在页面上的打印位置 。 在打印或预览报表时,系统会以不同的方式处理各个带区的数据 。 例如,对于,页标头,带区,系统将在每一页上打印一次该带区所包含的内容;而对于,标题,带区,则只是在报表开始时打印一次该带区的内容 。 在每一个报表中都可以添加或删除若干个带区 。 表
10-1列出了报表的一些常用带区以及使用情况 。
10.3 报表布局在表 10-1列出的带区中,,页标头,,,细节,和,页注脚,这三个带区是报表默认的基本带区 。 如果要使用其它带区,则必须自己设置 。
设置好所需的带区以后,就可以在带区中添加需要的控件 。 但是,
有些新添加的带区的高度可能不能满足设计要求 。 对于各种类型的带区,在,报表设计器,中都可以调整它们的高度以放置需要的控件 。
10.3 报表布局带区 使用情况标题 每张报表使用一次页标头 每个页面使用一次列标头 每列使用一次组标头 每组使用一次细节 每条记录使用一次组注脚 每组使用一次列注脚 每列使用一次页注脚 每个页面使用一次总结 每张报表使用一次表 10-1 报表带区以及使用情况设计报表的一个最重要,也是最基本的功能就是打印数据 。
在,报表设计器,中,通过在报表中添加控件,可以安排所要打印的内容 。
1.域控件
2.标签控件
3.OLE对象
4.线条,矩形和圆角矩形
10.4 报表中使用控件有时,报表在打印之前需要首先将数据进行分组处理,从而将具有某种相同信息的数据打印在一起 。 例如,若要将
Student表中同一个系的学生信息打印在一起,就必须考虑数据分组 。
一个报表可以设置一个或多个数据分组 。 若报表已进行了数据分组,则报表会自动包含,组标头,和,组注脚,带区 。 一个数据分组对应于一组,组标头,和,组注脚,带区 。 数据分组将按照在,报表设计器,中创建的顺序在报表中编号,越小编号的数据分组离,细节,带区越近 。
10.5 数据分组设计报表的最终目的是要按照一定的格式输出符合要求的数据 。
在报表打印之前可以使用,预览,功能在屏幕上查看最终的页面设计是否符合设计要求 。 若已符合要求,即可在指定的打印机上打印报表 。
命令格式
REPORT FORM FileName1|?
[ SCOPE]
[ FOR lExpression1]
[ WHILE IExpression2]
[ NOOPTIMIZE]
[ PREVIEW]
[ TO PRINTER [ PROMPT] |TO FILE FileName2]
[ SUMMARY]
10.6 报表输出命令功能该命令用于打印或预览指定的报表 。
命令说明
( 1) FileName1参数用于指定要打印的报表文件名称 。 若不使用
FileNamel参数而使用,?,参数,系统在执行该命令时将弹出,打开,对话框,要求用户选择要打印的报表文件 。
( 2) SCOPE子句用于指定报表所要打印的记录范围 。
( 3) FOR子句用于设置筛选条件以将满足给定条件的记录打印出来 。
( 4) WHILE子句用于设置筛选条件以将满足给定条件的首条记录及其后的连续记录打印出来 。 即只有首条记录使得 IExpression2逻辑表达式为,真,(,T.) 时,开始打印记录,直至其后的某条记录使得 IExpression2逻辑表达式为,假,(,F.) 时,停止打印 。
( 5) NOOPTIMIZE子句用于禁止使用 Rushmore技术对 FOR子句进行优化 。
( 6) PREVIEW子句用于指定预览报表 。
( 7) TO PRINTER子句用于将打开的报表输出到打印机上 。 该子句若同时包含有 PROMPT子句,系统将在打印报表时首先显示
,打印,对话框,允许对打印选项做进一步的设置 。
( 8) TO FILE子句用于将报表输出到指定的文件中 。 FileName2
参数用于指定输出的文件名 。 TO PRINTER子句和 TO FILE子句不能同时使用 。
( 9) SUMMARY子句用于在打印汇总报表时只打印汇总值而不打印明细记录 。
第 11章 程序设计基础教学目标:
1.掌握程序的建立、编辑和运行方法
2.掌握常量与变量的类型和使用
3.掌握常用函数的使用
4.掌握运算符和表达式类型及各类运算符的优先级教学重点:
1.程序的建立、编辑和运行方法
2.常用函数和表达的使用教学难点:
常用函数的使用第 11章 程序设计基础在 Visual FoxPro中,除了可以通过菜单方式或命令方式完成指定的任务以外,Visual FoxPro还允许用户通过编写程序以完成较复杂的任务 。 程序设计是将一系列命令有机地结合在一起,实现仅靠命令方式难以完成的任务 。 例如:处理某些重复操作时,使用命令方式执行起来效率很低,而运行程序则可以大大提高工作效率 。 另外,程序可以很方便地进行修改与重新运行,而命令方式则较难实现这一功能 。
程序主要由命令或语句组成,同时还包括对数据进行存储和描述的元素,例如:常量,变量,数组,表达式,运算符以及函数等 。
程序的建立、编辑和运行
数组
常量和变量
表达式与运算符
函数程序的建立,编辑和运行可以采用以下三种方式:
11.1 程序的建立、编辑和运行
菜单方式
命令方式
使用项目管理器从,文件,菜单中选择,新建,命令,可以打开,程序,编辑窗口以建立和编辑程序,具体操作步骤如下:
( 1) 从,文件,菜单中选择,新建,命令,系统弹出,新建,对话框 。
( 2) 在,新建,对话框的文件类型区域中选择,程序,单选项 。
( 3) 单击,新建文件,按钮,系统弹出,程序,编辑窗口 。
( 4) 在,程序,编辑窗口中编辑程序 。
( 5) 完成以后,从,文件,菜单中选择,保存,命令,系统弹出
,另存为,对话框 。
( 6) 在,另存为,对话框的,保存文档为,编辑框中输入要保存的程序名,在,保存在,组合框中选择要保存的程序所在的文件夹 。
11.1.1 菜单方式
( 7) 单击,保存,按钮 。
从,程序,菜单中选择,运行,命令,可以运行指定的程序,
具体操作步骤如下:
( 1) 从,程序,菜单中选择,运行,命令,系统弹出,运行,
对话框 。
( 2) 在,运行,对话框中选择要运行的程序 。
( 3) 单击,运行,按钮,系统即运行选择的程序 。
11.1.1 菜单方式在项目管理器中可以新建,编辑和运行程序,具体操作步骤如下:
( 1) 从,文件,菜单中选择,打开,命令,系统弹出,打开,
对话框 。
( 2) 在,打开,对话框的,文件类型,列表框中选择,项目,,在,搜寻,组合框中选择要编辑的项目所在的文件夹 。
( 3) 选择要打开的项目 。
( 4) 单击,确定,按钮,系统弹出,项目管理器,窗口 。
( 5) 在打开的,项目管理器,窗口中选择,代码,选项卡 。
11.1.2 使用项目管理器
( 6) 在,代码,选项卡中选择,程序,选项,然后单击
,新建,按钮,系统弹出,程序,编辑窗口 。
( 7) 在,程序,编辑窗口中编辑程序 。
( 8) 完成以后,从,文件,菜单中选择,保存,命令,系统弹出,另存为,对话框 。
( 9) 在,另存为,对话框的,保存文件为,编辑框中输入要保存的程序名,在,保存在,组合框中选择要保存的程序所在的文件夹 。
11.1.2 使用项目管理器
( 10) 单击,保存,按钮,程序名出现在项目管理器中的,代码,
选项卡中 。
( 11) 关闭,程序,编辑窗口 。
( 12) 在,代码,选项卡中选择要运行的程序,单击,运行,按钮,运行程序 。
在项目管理器中可以新建,编辑和运行程序,具体操作步骤如下:
1.建立或编辑程序命令格式
MODIFY COMMAND [FileName]
命令功能该命令用于建立或编辑指定的程序 。
命令说明
FileName参数是要建立或编辑的程序名称 。
11.1.3 命令方式
2.运行程序命令格式
DO [FileName]
命令功能该命令用于运行指定的程序 。
命令说明
FileName参数是要运行的程序名称 。
常量是指在程序运行过程中始终保持不变的数据 。 变量是在程序运行的不同时刻,其值会发生改变的量 。
11.2 常量和变量
变量
常量常量包括备注型和通用型以外的所有数据类型,主要有:
1.数值型常量由数字,小数点,正负号组成,数据最大长度为 20位,其中小数点占 1位 。
2.字符型常量字符型常量是用定界符界定的一串字符 。 常用的定界符有单引号 ‘’,双引号,”,和方括号 [ ]等 。 如果定界符成为常量的组成部分,则应使用另外的定界符 。 字符型常量最大长度为 254
位 。
11.2.1 常量
3.日期型与日期时间型常量日期型与日期时间型常量是用 { }括起来的一个包括日期和时间的数据,其有效性取决于格式的设置 。 空的时间值可用 {/:}表示 。
4.逻辑型常量逻辑型常量只有真假两个值 。 用,T.或,t.,.Y.或,y.表示逻辑值为真,
用,F.或,f.,.N.或,n.表示逻辑值为假 。 字母两边的英文句点不能省略 。
5.货币型常量货币型常量用于表示货币值 。 使用时应加上货币符号 。
在 Visual FoxPro中,常用的变量类型有:内存变量,字段变量,数组变量和系统变量 。
内存变量是独立于数据库以外,存储在内存中的临时变量 。
它通常用于存放程序运行过程中所需要的原始数据,中间结果以及最终结果 。
内存变量的数据类型由它所保存的数据的类型决定 。 当用户退出 Visual FoxPro时,内存变量将自动消失 。
需要注意的是:当内存变量与字段同名时,若要使用内存变量,那么要在引用的内存变量名称之前添加,M.‖。
11.2.2 变量字段变量是用户在定义表结构时所定义的字段名,它是一种多值变量 。
数组变量是一种特殊的内存变量 。 它是指一组有序的数据的集合,
数组中的各元素称为数组元素 。
系统变量是 Visual FoxPro建立并维护的内存变量 。 这些变量的名称由系统定义,并且以下划线,_‖开头 。
变量的类型与常量类型相同 。 每一个变量的具体类型取决于其被赋予的值,因此在不同时刻,一个变量可以存放不同类型的数据 。
这里我们将主要讨论内存变量 。
1.使用 STORE命令为内存变量赋值命令格式
STORE eExpression TO VarNameList | ArrayNameList
命令功能该命令用于为内存变量或数组变量赋值 。
命令说明
( 1) eExpression参数是一个表达式 。 该表达式可以由常量,变量,函数和运算符组成 。 该命令将表达式的值赋予内存变量或数组变量 。
( 2) VarNameList参数是内存变量列表 。 内存变量列表中的内存变量应用逗号分隔 。 该命令可以同时为多个内存变量赋值 。
( 3) ArrayNameList参数是数组变量列表 。 数组变量列表中的数组变量应用逗号分隔 。
( 4) 该命令可以同时为多个内存变量或数组变量赋值 。
【 例 】 store 3*4 to a1,a2
2.直接为内存变量赋值使用,=‖可以直接为内存变量赋值 。
【 例 】 b1=3 将 b1赋值 3;
b2=b1+2 将 b1加 2后的值赋给 b2,此时 b2等于 5;
b2=b2+3 将 b2加 3后的值再赋给 b2,此时 b2等于 8。
说明:一个变量的值可以不断变化,最终结果是它最后一次的赋值 。
3.显示内存变量可以使用 DISPLAY MEMORY命令或 LIST MEMORY命令来查看已定义的变量 。
命令格式
DISPLAY MEMORY 或
LIST MEMORY
命令功能该命令用于显示已定义的变量 。
4.释放内存变量为了节省存储空间,变量使用完以后应及时释放,可以使用以下命令之一来释放存储空间:
l RELEASE ALL命令命令格式
RELEASE ALL
命令功能该命令用于释放全部变量 。
l RELEASE <MemVarList>命令命令格式
RELEASE <MemVarList>
命令功能该命令用于释放指定的内存变量 。
命令说明
MemVarList参数是内存变量列表 。
l RELEASE ALL LIKE [LIKE Skeleton | EXCEPT Skeleton]命令
l CLEAR MEMORY命令
l RELEASE ALL LIKE [LIKE Skeleton | EXCEPT Skeleton]命令命令格式
RELEASE ALL [LIKE Skeleton | EXCEPT Skeleton]
命令功能该命令用于释放与指定模式相匹配的变量 。
命令说明
( 1) LIKE Skeleton子句用于指定要释放与指定的模式相匹配的所有变量 。 Skeleton参数是含有通配符的模式 。 通配符,*” 可以匹配一个字符串;通配符,?‖可以匹配一个字符 。
( 2) EXCEPT Skeleton子句用于指定要释放除与指定的模式相匹配之外的所有变量 。 Skeleton参数是含有通配符的模式 。
l CLEAR MEMORY命令命令格式
CLEAR MEMORY
命令功能该命令用于释放全部变量 。
【 例 】 RELEASE a1,a2?释放变量 a1,a2
RELEASE ALL LIKE a*?释放以字母 a开头的变量数组是按一定顺序排列的一组内存变量的集合,数组中的变量称为数组元素 。 数组必须先定义后使用 。
命令格式
DIMENSION ArrayName1(nRows1 [,nColumns1])
[,ArrayName2(nRows2 [,nColumns2])],..

DECLARE ArrayName1 (nRows1 [,nColumns1])
[,ArrayName2 (nRows2 [,nColumns2])]...
命令功能该命令用于定义一维或二维数组 。
11.3 数组命令说明
( 1) DIMENSION命令和 DECLARE命令可以一次定义多个数组 。
( 2) 只设置 nRows参数时,定义一维数组;同时设置 nRows 和
nColumns参数时,定义二维数组 。
( 3) 系统规定 nRows和 nColumns参数的下界为 1。
( 4) 数组元素可以包含各种类型的数据,第一次定义时被赋值为,F.。
【 例 】 DIMENSION A(3),B(2,3)
表达式是指用运算符将常量,变量,字段或函数连接起来的有意义的式子 。 其类型由表达式最终计算结果的数据类型决定,
主要有:数值型,字符型,日期型,关系型,逻辑型 。 运算符包括:算术运算符,字符运算符,关系运算符,逻辑运算符 。 不同表达式使用的运算符不同,但运算符两边的数据类型必须相同,
否则将导致因数据类型不匹配而出错 。
11.4 表达式与运算符
数值表达式
日期表达式
字符表达式
关系表达式
逻辑表达式数值表达式是由算术运算符将常量,变量,字段或函数连接起来的式子,其结果仍为数值型数据 。
算术运算符有,+,-,*,/,**或 ^、
优先级为,**(^),*,/,+,-
同一优先级的按从左到右计算 。
【 例 】?(3*4+SQRT(25)/5)*4?结果为 52
11.4.1 数值表达式字符表达式是由字符运算符将常量,变量,字段或函数连接起来的式子,其结果仍为字符型数据 。 在字符运算符两边的数据必须是字符型数据 。
字符运算符有,+‖和,-‖两种 。
( 1) 直接连接 (+)
即用,+‖将两个或多个字符串首尾连接形成一个新的字符串 。
( 2) 去空连接 (-)
即用,-‖将两个或多个字符串相连接 。 如果前一个字符串尾部有空格,则将此空格移到后一个字符串的尾部 。
【 例 】? ―ABC ‖+―DEF‖=―ABC DEF‖
―ABC ‖-―DEF‖=―ABCDEF ‖
11.4.2 字符表达式日期表达式是由+,-运算符将日期连接起来的表达式,其结果仍为日期型数据 。
【 例 】? {^04/03/99}+20?结果为 {04/23/99}
{^04/03/99}- 20?结果为 {03/14/99}
{^04/03/99}- {^03/14/99}?结果为 20(两日期相距的天数 )
需要注意的是:两个日期值相加是无意义的 。
11.4.3 日期表达式关系表达式是由关系运算符将数值表达式,字符表达式,日期表达式连接起来的表达式,结果为逻辑真和逻辑假,分别用,T.和,F.表示 。
关系运算符有,>,<,>=,<=,< >( !=,#),=,= =,$
说明:
( 1) =与 ==不完全相同 。 前者称为普通比较,后者称为精确比较 。
当环境设定为 SET EXACT ON时,二者并无区别;当环境设定为 SET
EXACT OFF时,结果是不同的 。 比较时,使用右字符串去比较左字符串 。 当右字符串比较完,则比较结束 。 如果此时的比较结果相同,
则 =比较的值为,T.,而不管左字符串是否结束;相反,= =则要求左右必须完全一致,结果才为,T.。
11.4.4 关系表达式
【 例 】?―abcde‖= ―abc‖
当设置了 SET EXACT OFF时,上述关系表达式结果为,T.
当设置了 SET EXACT ON时,上述关系表达式结果为,F.
( 2) 比较大小时,日期早的日期型数据小于日期晚的日期型数据;
字符型数据从左到右依次按其 ASCII码值比较 。
( 3) 字符串包含运算符,$‖用于比较左字符串是否存在于右字符串中 。
如果存在,则为,T.,反之为,F.。
【 例 】?―王,$―王红,‘ 结果为,T.
逻辑表达式是由逻辑运算符将关系表达式连接起来的表达式,结果为逻辑真和逻辑假 。
逻辑运算符有,.NOT.,.AND.和,OR.。
优先级别依此是,.NOT.,.AND.,.OR.。
运算规则为:
使用,NOT.运算的表达式为假,则逻辑表达式的值为真 。
使用,AND.连接的两个表达式的值同时为真,逻辑表达式的值为真;
使用,OR.连接的两个表达式的值,只要有一个为真,则逻辑表达式的值为真 。
【 例 】 已知某 28岁女职工工资为 600元
NOT,( 性别 =―女,) 结果为,F.
性别 =―女,,AND.年龄 >=28 结果为,T.
性别 =―女,,OR.年龄 <28 结果为,T.
11.4.5 逻辑表达式
Visual FoxPro提供了大量的函数,按返回值的类型或功能主要分为以下几类 。
11.5 函数
数值型函数
日期函数
字符型函数
转换函数
测试函数
( 1) 绝对值函数格式,ABS (<数值表达式 >)
功能,求数值表达式的绝对值 。
【 例 】? ABS (-12.34)?结果为 12.34
( 2) 最大值函数格式,MAX (<数值表达式 1>,<数值表达式 2>)
功能,计算数值表达式的值,取较大者 。
【 例 】? MAX( 5*4,60/2) ‘ 结果为 30
( 3) 最小值函数格式,MIN (<数值表达式 1>,<数值表达式 2>)
功能,计算数值表达式的值,取较小者 。
11.5.1 数值型函数
( 4) 平方根函数格式,SQRT (<数值表达式 >)
功能,计算数值表达式的平方根 。
【 例 】? SQRT (25*4) 结果为 10
( 5) 指数函数格式,EXP (<数值表达式 >)
功能,计算以 e为底的指数幂 。
【 例 】? EXP (2*2)?结果为 54.60
( 6) 对数函数格式,LOG (<数值表达式 >)
功能,计算数值表达式的自然对数 。
【 例 】? LOG (54.60)?结果为 4.00
( 7) 取整函数格式,INT (<数值表达式 >)
功能,计算数值表达式的值,取整数部分 。
【 例 】? INT (-4.68)?结果为 -4
( 8) 四舍五入函数格式,ROUND (<数值表达式 >,<保留小数位数 >)
功能,计算数值表达式的值,根据保留位数进行四舍五入 。 如果保留小数位数为正数 n,则对小数点后 n +1位四舍五入,如果保留小数位数为负数 n,则对小数点前 n位四舍五入 。
【 例 】? ROUND (123.34567,3)?结果为 123.346
ROUND (123.34567,-2)?结果为 100
字符型函数主要对字符型数据进行运算 。
( 1) 查找子串函数格式,AT (<字符表达式 1>,<字符表达式 2>,[ <数值表达式 n>])
功能,查找字符表达式 1在字符表达式 2中的起始位置 。 如果有数值表达式 n,则确定字符型表达式 1在字符型表达式 2中的第 n次出现的起始位置;如果未指明数值表达式 n,则确定第一次出现的起始位置;如果字符表达式 1不在字符表达式 2中,则返回值为 0。
【 例 】? AT (―A‖,,BCDE‖)?结果为 0
AT (―A‖,,ABADE‖)?结果为 1
AT (―A‖,,ABCADE‖,2)?结果为 4
11.5.2 字符型函数
( 2) 截取子串函数格式,SUBSTR (<字符表达式 >,<起始位置 >,[ <长度 >])
功能,从指定的起始位置开始,在字符表达式中截取指定长度的字符串 。
说明,假设起始位置为 m,长度为 n。 若省略 n,则从 m开始截取以后的所有字符串; 若 n大于从 m开始的字符串长度,则从 m开始截取以后的所有字符串;若 m大于字符表达式的长度,则截取的字符串为空白字符串 。
【 例 】
SUBSTR (―HARDWORK‖,3,4)?结果为,RDWO‖
SUBSTR (―HARDWORK‖,2)? 结果为,ARDWORK‖
SUBSTR (―HARDWORK‖,3,9)?结果为,RDWORK‖
SUBSTR (―HARDWORK‖,9,5)?结果为,,
( 3) 左截取子串函数格式,LEFT (<字符表达式 >,<数值表达式 >)
功能,从字符表达式左边开始,截取 <数值表达式 >指定长度的字符串 。
【 例 】? LEFT(―HARDWORK‖,3)?结果为,HAR‖
( 4) 右截取子串函数格式,RIGHT (<字符表达式 >,<数值表达式 >)
功能,从字符表达式右边开始向左截取 <数值表达式 >指定长度的字符串 。
【 例 】? RIGHT(―HARDWORK‖,3)?结果为,ORK‖
( 5) 生成空字符串函数格式,SPACE (<数值表达式 >)
功能,生成指定空格数的空字符串 。
【 例 】? SPACE (3)?结果为,,
( 6) 重复字符串函数格式,REPLACE (<字符表达式 >,<数值表达式 >)
功能,将字符表达式重复指定的次数 。
【 例 】? REPLACE(―**‖,3)?结果为,******”
( 7) 字符串长度函数格式,LEN (<字符表达式 >)
功能,求字符串的长度 ( 包括空格 ) 。
【 例 】? LEN(―howare you‖)?结果为 11
( 8) 字符串替换函数格式,STUFF (<字符表达式 1>,<起始位置 >,<字符个数 >,<字符表达式 2>)
功能,从指定的起始位置开始,用字符表达式 2替换字符表达式 1
中指定个数的字符串 。
说明,若 <字符表达式 2>的长度大于起始位置以后的字符串个数,
则替换起始位置以后的所有字符串 。 替换与被替换的字符的长度无关 。
【 例 】?STUFF(―computer‖,3,4,―abc‖)?结果为,coabcer‖
STUFF (―computer‖,3,1,―abc‖)? 结果为
,coabcputer‖
STUFF(―computer‖,3,4,― ‖)?结果为,co er‖
( 1) 系统时间函数格式,TIME ([数值表达式 ] )
功能,输出系统当前时间 。 时间格式为 HH,MM,SS,如果含有数值参数,返回值精确到 1/100秒的时间 。
【 例 】? TIME ( )
( 2) 系统日期时间格式,DATE ( )
功能,输出系统当前日期 。 系统默认格式为 MDY,可以使用 SET
DATE命令自行设定日期输出格式 。
【 例 】 SET DATE TO YMD
DATE ( )?假设当前日期为 2001/2/17,那么结果为 01/02/17
( 3) 年函数格式,YEAR (<日期型表达式 >)
11.5.3 日期函数功能,输出日期型表达式的年份 。
【 例 】? YEAR (DATE( ))?假设当前日期为 2001/2/17,那么结果为 2001
( 4) 月函数格式,MONTH (<日期型表达式 >)
功能,输出日期型表达式的月份 。
【 例 】? MONTH (DATE( ))?假设当前日期为 2001/2/17,那么结果为 2
( 5) 日函数格式,DAY (<日期型表达式 >)
功能,输出日期型表达式的日 。
【 例 】? DAY (DATE( ))?假设当前日期为 2001/2/17,那么结果为 17
( 6) 星期函数格式,DOW (<日期型表达式 >)
CDOW (<日期型表达式 >)
功能,DOW( ) 返回用数字 1-7表示的星期值; 1表示星期天,2
表示星期一,…… 7表示星期六 。 CDOW() 返回星期的英文名称 。
【 例 】? DOW (DATE( ))
假设当前日期为 2001/2/17,那么结果为 7
CDOW (DATE ( ))
假设当前日期为 2001/2/17,那么结果为 Saturday
( 7) 求小时的函数格式,hour(<日期时间表达式 >)
功能,返回日期时间表达的 24小时制的小时 。
【 例 】? Hour(datetime())
数据的运算要求符合数据类型一致的原则,因此,若要对不同类型的数据进行运算,那么必须通过转换函数将其转换为一致的数据类型 。
( 1) 数值型转换为字符型函数格式,STR (<数值表达式 >[,<长度 >][,<小数位数 >])
功能,将数值表达式按设定的长度和小数位数转换成字符型数据 。
11.5.4 转换函数说明,<长度 >为转换后的字符串位数,若 <长度 >的设定值大于实际数值,
则转换后的字符串前补,空格,,若 <长度 >的设定值小于实际数值,则用 *
代替;若 <小数位数 >的设定值大于实际数值,则转换后的字符串后补 0,若
<小数位数 >的设定值小于实际数值,则对小数四舍五入 。 小数点和负号均占有 1位 。
【 例 】? STR (123.4567,6,2)?结果为 123.46
STR (123.4567,9,2)?结果为 123.46
STR (123.4567,6,3)?结果为 123.46
STR (123.4567,1,2)?结果为 *
( 2) 字符型转换为数值型函数格式,VAL (<字符型表达式 >)
功能,将数字字符串转换为数值 。
说明,转换时遇到非数字字符时停止;若第一个字符就不是数字,则值为 0.00
【 例 】 VAL(―123.45AB‖)?结果为 123.45
VAL (―A123.45AB‖)?结果为 0.00
( 3) 字符转换为 ASCII函数格式,ASC (<字符型表达式 >)
功能,返回字符表达式第一个字符的 ASCII码值 。
【 例 】 ASC(―abc‖)?结果为 97
( 4) ASCII码转换为字符函数格式,CHR (<数值型表达式 >)
功能,将 ASCII码转化为相应的字符 。
【 例 】 CHR (65)?结果为 A
( 5) 日期型转换为字符型函数格式,DTOC (<日期型表达式 > [,1] )
功能,将日期型表达式转换为字符串 。
说明,若使用选项 [,1],则转换为年月日的形式
【 例 】? DTOC (DATE( ))
假设当前日期为 2001/2/17,那么结果为 02/17/01
DTOC (DATE( ),1)
假设当前日期为 2001/2/17,那么结果为 20010217
( 6) 字符型转换为日期型函数格式,CTOD (<字符型表达式 >)
功能,将字符型表达式转换为日期值 。
【 例 】? CTOD (―02/17/64‖)?结果为 02/17/64
( 7) 大写字母转换为小写字母函数格式,LOWER (<字符型表达式 >)
功能,将字符型表达式中的大写字母转换为小写字母 。
【 例 】? LOWER(―AaBbCc‖)?结果为 aabbcc
( 8) 小写字母转换为大写字母函数格式,UPPER (<字符型表达式 >)
功能,将字符型表达式中的小写字母转换为大写字母 。
【 例 】? UPPER(―AaBbCc‖)?结果为 AABBCC
( 1) 文件开始测试函数格式,BOF ( )
功能,测试记录指针是否指向第一条记录之前 。
( 2) 文件结束测试函数格式,EOF ( )
功能,测试记录指针是否指向最后一条记录之后 。
【 例 】 USE GZ
BOF ( )?结果为,f..
SKIP–1
BOF ( )?结果为,t.
GO BOTTOM
EOF ( )?结果为,f.
11.5.5 测试函数
SKIP
EOF ( )?结果为,t.
( 3) 检索测试函数格式,FOUND ( )
功能,测试是否找到符合要求的记录 。
【 例 】 USE Student
LOCATE FOR Name=―高涵,
FOUND( )?如果结果为,t.,那么说明已找到姓名为,高涵,的学生
DISPLAY
( 4) 记录号测试函数格式,RECNO ( )
功能,返回当前记录的记录号 。
【 例 】 USE Student
GO 2
RECNO( )?结果为 2
( 5) 记录个数测试函数格式,RECCOUNT (<工作区 >)
功能,测试指定工作区中表的记录个数 。
说明,做过逻辑删除的记录也包括在内 。
( 6) 表名测试函数格式,DBF (<工作区 >)
功能,测试指定工作区表的文件名 。
( 7) 表的别名测试函数格式,ALIAS (<工作区 >)
功能,测试指定工作区表的别名 。
( 8) 工作区测试函数格式,SELECT ( )
功能,测试当前工作区的区号 。
【 例 】 SELECT 1
USE Student
SELECT 2
USE Score
SELECT( )?结果为 2
( 9) 数据类型测试函数格式,TYPE (<字符表达式 >)
功能,测试表达式的数据类型,用大写字母表示 。 表达式需用定界符界定 。 如果表达式不存在或有错误,则返回值为 U。
【 例 】? TYPE(―[abc]‖)?结果为 C
TYPE(―12.34‖)?结果为 N
TYPE(―abc‖)?结果为 U
此时将 abc做为变量处理,由于未给其赋值,所以做为错误或不存在处理 。
( 10) 条件函数格式,IIF(<逻辑表达式,表达式 1,表达式 2>)
功能,根据逻辑表达式的值,返回表达式 1或表达式 2的值 。 如果逻辑表达式的值为真,由返回表达式 1的值,否则返回表达 2的值 。
【 例 】? IIF (―abc‖>―123‖,―abc‖,―123‖) 结果为,abc‖
第 12章 程序设计教学目标:
1.掌握程序中常用的命令
2.掌握结构化程序设计的三种结构
3.掌握多模块结构中模块的调用方法
4.了解程序调试方法教学重点:
1.程序中常用命令
2.结构程序设计的方法教学难点:
多模块结构的使用。
第 12章 程序设计在 Visual FoxPro中,程序设计除了可以提高系统的工作效率以外,还可以解决较复杂的问题 。 程序设计是根据工作的需要,将一系列命令有机地结合在一起,
以文件的形式存放在磁盘中,这个文件被称为程序文件或命令文件,其扩展名为,PRG。 在程序文件中,除了可以使用前面介绍的在命令窗口中执行的命令以外,还大量使用了结构化程序设计语句 ( 例如,条件分支语句,循环语句等 ) 。
程序中常用的命令
顺序结构
结构化程序设计
选择结构
循环结构
多模块程序在建立程序的过程中,Visual FoxPro提供了一些需要经常使用的命令,其中包括:输入命令,输出命令,系统状态设置命令等 。
12.1 程序中常用的命令
输入命令
常用的系统状态设置命令
输出命令
其他命令
Visual FoxPro为程序提供了三种简单,常用的数据输入命令,
它们是:
l INPUT命令
l ACCEPT命令
l WAIT命令
1.INPUT命令命令格式
INPUT [cMessageText] [TO VarName]
12.1.1 输入命令命令功能在程序执行到该命令时,系统首先在屏幕上显示用户设置的提示信息,然后等待用户从键盘输入数据,并将其保存到指定的内存变量中 。
命令说明
( 1) cMessageText参数为用户设置的提示信息 。
( 2) VarName参数为内存变量 。
( 3) INPUT命令可以为内存变量输入数值,日期值,逻辑值和字符串 。 如果要输入日期值,那么输入的日期值应采用花括号,{ }‖
括起来;如果要输入逻辑值,那么输入的逻辑值应使用英文句点,,‖
括起来;如果要输入字符串,那么输入的字符串应使用定界符 。
( 4) INPUT命令通常用于输入数值,日期值和逻辑值 。
【 例 】 试编写一程序以显示所有入学成绩 ( Entrancescore字段 )
大于等于任一给定值的学生基本情况信息 。
SET TALK OFF
SELECT 1
USE STUDENT
INPUT "请输入入学成绩 " TO X
LIST FOR Entrancescore>=X
USE
RETURN
2.ACCEPT命令命令格式
ACCEPT [cMessageText] [TO VarName]
命令功能在程序执行到该命令时,系统首先在屏幕上显示用户设置的提示信息,然后等待用户从键盘输入数据,并将其保存到指定的内存变量中 。
命令说明
( 1) cMessageText参数为用户设置的提示信息 。
( 2) VarName参数为内存变量 。
( 3) ACCEPT命令可以为内存变量输入字符串,输入的字符串可以不使用定界符 。
【 例 】 试编写一程序以查找某一指定学生的基本情况信息 。
SET TALK OFF
SELECT 1
USE STUDENT
ACCEPT "请输入学生姓名 " TO XM
LOCATE FOR Name=XM
DISPLAY
USE
RETURN
3.WAIT命令命令格式
WAIT [cMessageText] [TO VarName]
[WINDOW [AT nRow,nColumn]]
[TIMEOUT nSeconds]
命令功能在程序执行到该命令时,系统首先在屏幕上显示用户设置的提示信息,然后等待用户从键盘输入一个字符,并将其保存到指定的内存变量中 。
命令说明
( 1) cMessageText参数为用户设置的提示信息 。
( 2) VarName参数为内存变量 。
( 3) WINDOW子句用于在屏幕上显示一个窗口以显示用户设置的提示信息 。
( 4) AT nRow,nColumn子句用于设置 WINDOW子句所显示的窗口在屏幕上的位置 。 nRow参数为行坐标,nColumn参数为列坐标 。
如果省略 AT nRow,nColumn子句,那么系统将在屏幕左上角显示
WINDOW窗口 。
( 5) TIMEOUT nSeconds子句用于设置等待用户从键盘输入字符的时间 。 nSeconds参数为等待的秒数 。 如果在指定的时间内用户未输入任何字符,那么系统将中止该命令的执行 。
( 6) WAIT命令在接受了用户输入的任意一个字符以后,自动执行其后的命令 。
【 例 】 有时,当程序执行完某一条命令以后需要暂时停止程序的执行,在用户按任意键以后再继续执行 。 若要这样做,可以在程序要暂时停止的位置添加如下命令:
WAIT―按任意键继续 !,WINDOW
Visual FoxPro为程序提供的? |命令是一种简单的数据输出命令 。
若要按照一定的格式进行数据输入与输出,应使用 Visual FoxPro提供的表单 。
命令格式
| Expression1[,Expression2...]
命令功能命令用于在新的一行输出表达式的值 。命令用于在当前行输出表达式的值 。
命令说明
( 1) Expression1[,Expression2...]参数是要输出的表达式 。 若要输出多个表达式的值,那么表达式之间应用逗号分隔 。
12.1.2 输出命令
( 2) Expression1[,Expression2...]参数也可以是内存变量或字段 。
【 例 】 试编写一程序以查找某一指定学生,并显示该学生的姓名和入学成绩 。
SET TALK OFF
SELECT 1
USE STUDENT
ACCEPT "请输入学生姓名 " TO XM
LOCATE FOR Name=XM
―姓名:,
Name
―入学成绩:,
Entrancescore
USE
RETURN
Visual FoxPro提供了一套完整的系统状态设置命令,这里仅介绍在程序中常用的系统状态设置命令 。
( 1) SET TALK ON|OFF
该命令用于控制是否在屏幕上显示命令执行的响应信息 。 默认状态为显示,即:
SET TALK ON
在程序中通常将其设置为 OFF,即:
SET TALK OFF
( 2) SET ECHO ON|OFF
该命令用于控制是否打开跟踪窗口,观察程序的运行 。 默认状态为关闭跟踪窗口,即:
12.1.3 常用的系统状态设置命令
SET ECHO OFF
在程序调试时可以将其设置为 ON,即:
SET ECHO ON
( 3) SET STEP ON|OFF
该命令用于控制是否打开跟踪窗口以单步执行命令的方式跟踪程序的执行 。 默认状态为以非单步执行命令的方式跟踪程序的执行,
即:
SET STEP OFF
在程序调试时可以将其设置为 ON,即:
SET STEP ON
( 4) SET ESCAPE ON|OFF
该命令用于控制是否允许用户按 【 Esc】 键取消程序的执行 。 默认状态为允许用户按 【 Esc】 键取消程序的执行,即:
SET ESCAPE ON
( 5) SET PATH TO [Path]
该命令用于设置文件的搜索路径 。
【 例 】 如果 Student表存储在非当前路径 ( 假设为 E:\Students)
下,那么若要在程序中打开该表,应在程序的开始处使用如下命令:
SET PATH TO E:\Students
( 6) SET DELETED ON|OFF
该命令用于控制是否允许使用做了逻辑删除的记录 。 默认状态为允许使用做了逻辑删除的记录,即:
SET DELETED OFF
在 Visual FoxPro的程序中,经常需要使用的命令还有:注释语句,
清除屏幕语句,中止语句,返回语句等 。
1.NOTE| * | &&命令命令格式
NOTE| * | && [Comments]
命令功能
NOTE命令和 *命令用于在程序中添加注释,该注释占用独立的一行 。 &&命令用于在程序中添加注释,该注释添加在某条语句的末尾 。
命令说明
Comments参数为要添加的注释 。
12.1.4 其他命令
【 例 】 在下面的程序中,分别添加了三条注释语句 。
NOTE查找指定学生的入学成绩
* 仅显示学生的姓名和入学成绩
SET TALK OFF
SELECT 1
USE STUDENT
ACCEPT ―请输入学生姓名,TO XM &&输入指定学生的姓名
LOCATE FOR Name=XM
―姓名:,
Name
―入学成绩:,
Entrancescore
USE
RETURN
2.CLEAR命令命令格式
CLEAR [ALL]
命令功能该命令用于清除屏幕 。
命令说明
ALL子句用于释放所有内存变量,数组以及用户定义的菜单和窗口,
关闭所有打开的表,索引等文件并选择第 1工作区为当前工作区 。
3.CANCEL命令命令格式
CANCEL
命令功能该命令用于中止程序的执行,返回到命令窗口 。
4.RETRY命令命令格式
RETRY
命令功能该命令用于将程序控制返回到调用程序,并重新执行调用命令 。
5.RETURN命令命令格式
RETURN [eExpression | TO MASTER | TO ProcedureName]
命令功能该命令用于结束所在程序的执行,如果该程序被另外一个程序调用,
那么系统将程序控制返回到调用程序,并执行调用处的下一条语句;如果该程序没有被另外一个程序调用,那么系统将程序控制返回到命令窗口 。
命令说明
( 1) eExpression参数是一个表达式,用于将表达式的值作为函数值返回到调用程序 。 eExpression参数适用于用户自定义函数 。
( 2) TO MASTER子句用于将程序控制直接返回到主程序 。 如果省略该子句,那么系统将逐层返回 。
( 3) TO ProcedureName子句用于将程序控制返回到指定的过程 。 ProcedureName参数为过程名 。
程序设计是根据给定的任务,设计,编写和调试出能够正确完成该任务的计算机程序的过程 。
结构化程序设计是一套进行程序设计的准则,其目的是使程序具有合理的结构 。 程序只有具备合理的结构,才会易于理解和维护,便于程序的设计和程序的正确性验证,减小软件成本,提高工作效率 。
结构化程序设计要求程序要按照一定的规则书写,结构化程序是由若干个基本结构顺序构成的 。 编写结构化程序时,要一个结构一个结构地顺序书写 。 执行程序时也是从上而下一个结构一个结构地顺序执行 。 按结构化程序设计方法编写的程序叫做结构化程序 。 这样的程序必然结构合理,清晰易读 。
12.2 结构化程序设计
结构化程序的基本结构
结构化程序设计方法结构化程序由三种基本结构组成:顺序结构,选择结构和循环结构 。
顺序结构:程序的执行顺序与程序的书写顺序相同,这种程序结构叫做顺序结构 。 这是程序结构中最简单,最基本的结构 。
选择结构:程序的执行顺序是根据条件是否成立来选择某一分支执行,这种程序结构叫做选择结构 。
循环结构:程序的执行顺序是在条件成立时,反复执行某一段程序,这种程序结构叫做循环结构 。
由上述三种基本结构构成的程序,可以处理任何复杂的问题 。 结构化程序是指可以分解为上述三种基本结构的程序 。
12.2.1 结构化程序的基本结构结构化程序具有以下特点:
l 每一个基本结构有唯一的入口;
l 每一个基本结构有唯一的出口;
l 没有永远执行不到的语句 ( 无死语句 ) ;
l 没有永远执行不完的循环 ( 无死循环 ) 。
结构化程序要求每一个基本结构具有单入口,单出口的特性是十分重要的 。 这样便于保证和验证程序的正确性 。 在修改程序时,可以将某一个结构独立出来进行修改,而不影响其他结构 。
结构化程序设计是目前大多数数据库应用系统所采用的程序设计方法,它的基本思想是采用自顶向下,逐步求精,模块化的程序设计方法,即将一个大的程序划分为若干个功能相对独立的程序模块,再把程序模块进一步划分为更小的,功能独立的子程序模块 。 每一个子程序模块完成一个特定的功能,并由程序模块控制和调用 。
在这种自上而下,层层划分的模块结构中,上层模块调用下层模块,逐层调用,而下层模块将自下而上的逐层返回 。 这样的系统,结构清晰,功能相对独立,易于程序的编写和扩充,便于程序的调试,修改和维护 。
12.2.2 结构化程序设计方法顺序结构是程序设计中最简单,最常用的基本结构 。 在顺序结构中,程序是按照语句排列的先后次序逐条执行的 。
【 例 】 试编写一程序,在 Score表中查找某一指定学生的选课情况 。
SET TALK OFF
SELECT 1
USE Score
ACCEPT "请输入学生的学号 " TO XH
LIST FOR Studid=XH
USE
RETURN
12.3 顺序结构程序在运行时,一般情况下是按照语句的排列顺序逐条执行的 。 但有的时候,也需要根据判断条件是否满足而决定程序的走向,这就需要在程序中使用选择结构语句 。 选择结构语句是根据用户给定条件成立与否来决定选择执行哪一个分支程序 。
Visual FoxPro提供了两种选择结构语句,它们是:
12.4 选择结构
IF… ELSE… ENDIF语句
DO CASE… ENDCASE语句命令格式
IF lExpression [THEN]
Commands1
[ELSE
Commands2]
ENDIF
命令功能该命令用于判断给定的条件 ( lExpression) 是否成立,如果成立,执行语句序列 1( Commands1),否则执行语句序列 2
( Commands2) 。
12.4.1 IF… ELSE… ENDIF语句命令说明
( 1) lExpression参数是一个关系表达式或逻辑表达式 。
( 2) ELSE子句是可选项 。 当 ELSE子句缺省时,如果条件
( lExpression) 不成立,那么该命令将不执行任何语句,直接执行
ENDIF后面的命令 。
( 3) IF和 ENDIF必须配对使用 。
( 4) IF… ELSE… ENDIF语句可以嵌套使用 。 也就是说,在 IF语句中又包含了另外的 IF语句 。
【 例 】 试编写一程序以查找某一指定学生的基本情况 。 如果未找到指定的学生,那么应显示信息:,查无此人 !,。
SET TALK OFF
SELECT 1
USE STUDENT
ACCEPT "请输入学生姓名 " TO XM
LOCATE FOR Name=XM
IF EOF( )
WAIT―查无此人 !,TIMEOUT 10
ELSE
DISPLAY
ENDIF
USE
RETURN
使用 IF语句的嵌套格式,可以完成较复杂的条件判断 。 IF语句的嵌套格式示意如下:
IF lExpression1 [THEN]
……
IF lExpression2 [THEN]
Commands1
ELSE
Commands2
ENDIF
……
ELSE
……
IF lExpression3 [THEN]
Commands3
ELSE
Commands4
ENDIF
……
ENDIF
需要注意的是:在使用嵌套 IF语句时,如果按照上述方式画线,那么不应该出现交叉线 。 否则,意味着 IF嵌套语句存在着结构性错误 。
【 例 】 试编写一程序以查找某一指定学生的基本情况 。 如果未找到指定的学生,那么应显示信息:,查无此人 !,。 如果找到了指定的学生,可以由用户确定是否进一步查找该学生的选课情况 。
SET TALK OFF
CLEAR
SELECT 1
USE STUDENT
SELECT 2
USE SCORE
SELECT 1
ACCEPT "请输入学生姓名 " TO XM
LOCATE FOR Name=XM
IF EOF()
WAIT"查无此人 ! " TIMEOUT 3
ELSE
DISPLAY
ACCEPT "是否进一步查找该学生的选课情况 ( 1:是 2:否 )?
" TO XZ
IF XZ="1―
SELECT 2
LIST FOR STUDID=STUDENT.STUDID
ENDIF
ENDIF
SELECT 1
USE
SELECT 2
USE
RETURN
命令格式
DO CASE
CASE lExpression1
Commands 1
[CASE lExpression2
Commands 2
……
CASE lExpressionN
Commands n]
[OTHERWISE
Commands n+1]
ENDCASE
12.4.2 DO CASE… ENDCASE语句命令功能该 命 令 用 于 依 次 判 断 给 定 的 条 件 ( lExpression1,
lExpression2,……,lExpression n ) 是否成立,如果条件 1
( lExpression1) 成立,那么执行语句序列 1( Commands1),然后执行 ENDCASE后面的其它语句;如果条件 1( lExpression1) 不成立,条件 2 ( lExpression2 ) 成立,那 么 执 行 语 句 序 列 2
( Commands2),然后执行 ENDCASE后面的其它语句;依此类推,
直到条件 n (lExpression n);如果条件 1至条件 n均不成立,并且存在
OTHERWISE子句,那么将无条件地执行语句序列 n+1( Commands
n+1) 。
命令说明
( 1) lExpression是一个关系表达式或逻辑表达式 。
( 2) DO CASE与第一个 CASE之间不能有任何语句 。
( 3) DO CASE和 ENDCASE必须配对使用 。
( 4) DO CASE… ENDCASE语句可以嵌套使用 。 也就是说,在
DO CASE语句中又包含了另外的 DOCASE语句 。
【 例 】 试利用 DO CASE语句编写一程序,完成例 【 12-9】 要求的任务 。
SET TALK OFF
CLEAR
SELECT 1
USE STUDENT
SELECT 2
USE SCORE
SELECT 1
ACCEPT "请输入学生姓名 " TO XM
ACCEPT "是否进一步查找该学生的选课情况 ( 1:是 2:否 )?
" TO XZ
LOCATE FOR Name=XM
DO CASE
CASE EOF()
WAIT"查无此人 ! " TIMEOUT 3
CASE XZ="1"
DISPLAY
SELECT 2
LIST FOR STUDID=STUDENT.STUDID
CASE XZ="2―
DISPLAY
ENDCASE
SELECT 1
USE
SELECT 2
USE
RETURN
在程序中,每一条顺序结构和选择结构的语句只能执行一次 。 然而在实际工作中,往往有许多任务,特别是数据处理工作需要重复执行相同的操作,这就要求在程序中能够反复执行某段程序 。 为了满足实际工作的需要,Visual FoxPro提供了循环结构语句 。
循环结构在程序设计中的应用是相当普遍的,也是应用程序必不可少的 。 循环结构通常由循环开始语句,循环体和循环结束语句构成 。
Visual FoxPro提供了三种循环结构语句,它们是:
l DO WHILE… ENDDO语句
l SCAN… ENDSCAN语句
l FOR… ENDFOR语句
12.5 循环结构
DO WHILE… ENDDO语句
SCAN… ENDSCAN语句
FOR… ENDFOR语句
多重循环命令格式
DO WHILE lExpression
Commands
[LOOP]
[EXIT]
ENDDO
命令功能在执行 DO WHILE 语 句时,系统 首先 判断 给定 的条 件
( lExpression) 是否成立 。 如果不成立,那么执行 ENDDO之后的语句,即结束循环;如果成立,那么执行循环体 ( Commands)
12.5.1 DO WHILE… ENDDO语句中的语句,当执行到 ENDDO( 循环结束语句 ) 时,系统将返回到 DO WHILE( 循环开始语句 ),重新判断给定的条件是否成立,
如果仍然成立,那么将再次执行循环体中的语句,依此往复,直到条件不成立时即结束循环,执行 ENDDO之后的语句 。
命令说明
( 1) lExpression参数是一个关系表达式或逻辑表达式 。
( 2) LOOP语句是循环体 ( Commands) 中的特殊语句 。 当执行到 LOOP语句时,系统将不再执行其后的其它循环体语句,而直接返回到 DOWHILE,重新判断给定的逻辑表达式 。
( 3) EXIT语句是循环体 ( Commands) 中的特殊语句 。 当执行到 EXIT语句时,系统将不再执行其后的其它循环体语句,而直接跳出循环,执行 ENDDO之后的语句,即结束循环 。
( 4) LOOP语句和 EXIT语句通常与循环结构语句搭配使用,即只有满足给定条件的情况下才能执行这两条语句 。
( 5) DO WHILE和 ENDDO必须配对使用 。
( 6) DO WHILE… ENDDO语句可以嵌套使用 。 也就是说,在
DO WHILE语句中又包含了另外的 DOWHILE语句,即多重循环 。
【 例 】 试编写一个程序,统计 Score表中考试成绩介于以下分数段的学生人次 。
( 1) 考试成绩小于 60分;
( 2) 考试成绩大于等于 60分小于 75分;
( 3) 考试成绩大于等于 75分小于 85分;
( 4) 考试成绩大于等于 85分小于 100分;
( 5) 考试成绩等于 100分 。
SET TALK OFF
CLEAR
SELECT 1
USE Score
S=0
S60=0
S75=0
S85=0
S100=0
DO WHILE NOT EOF()
DO CASE
CASE Score<60
S=S+1
CASE Score>=60 AND Score<75
S60=S60+1
CASE Score>=75 AND Score<85
S75=S75+1
CASE Score>=85 AND Score<100
S85=S85+1
OTHERWISE
S100=S100+1
ENDCASE
SKIP
ENDDO
―考试成绩小于 60分的有:,+STR(S)+―人次,
―考试成绩大于等于 60分小于 75分的有:,+STR(S60)+―人次,
―考试成绩大于等于 75分小于 85分的有:,+STR(S75)+―人次,
―考试成绩大于等于 85分小于 100分的有:,+STR(S85)+―人次,
―考试成绩等于 100分的有:,+STR(S100)+―人次,
USE
RETURN
命令格式
SCAN [NOOPTIMIZE]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[Commands]
[LOOP]
[EXIT]
ENDSCAN
命令功能在执行 SCAN语句时,系统首先将记录指针定位到指定范围内满足给定条件的首条记录上,然后判断 EOF( ) 函数是否为真 。 如果
12.5.2 SCAN… ENDSCAN语句为真,那么执行 ENDSCAN之后的语句,即结束循环;如果为假,
那么执行循环体 ( Commands) 中的语句,当执行到 ENDSCAN( 循环结束语句 ) 时,系统将记录指针自动定位到指定范围内满足给定条件的下一条记录上,并返回到 SCAN( 循环开始语句 ),重新判断 EOF( ) 函数是否为真,如果为假,那么将再次执行循环体中的语句,依此往复,直到 EOF( ) 函数为真时即结束循环,执行
ENDSCAN之后的语句 。
命令说明
( 1) Scope参数为指定的记录范围,默认值为 ALL。
( 2) FOR lExpression1子句为给定的条件 。
( 3) WHILE lExpression2子句为给定的条件 。 但是在指定的记录范围内,如果遇到不能满足给定条件的记录,那么系统将结束
SCAN循环,执行 ENDSCAN之后的语句 。
( 4) NOOPTIMIZE子句用于禁止优化 FOR子句和 WHILE子句 。
( 5) LOOP语句是循环体 ( Commands) 中的特殊语句 。 当执行到 LOOP语句时,系统将不再执行其后的其它循环体语句,而直接返回到 SCAN,重新判断 EOF( ) 函数是否为真 。
( 6) EXIT语句是循环体 ( Commands) 中的特殊语句 。 当执行到 EXIT语句时,系统将不再执行其后的其它循环体语句,而直接跳出循环,执行 ENDSCAN之后的语句,即结束循环 。
( 7) LOOP语句和 EXIT语句通常与选择结构语句搭配使用,即只有满足给定条件的情况下才能执行这两条语句 。
( 8) SCAN和 ENDSCAN必须配对使用 。
( 9) SCAN… ENDSCAN语句可以嵌套使用其它的循环结构语句 。
也就是说,在 SCAN语句中又包含了另外的循环结构语句,即多重循环 。
【 例 】 试利用 SCAN… ENDSCAN语句编写一个程序,统计入学成绩大于等于 500分的学生人数 。
SET TALK OFF
CLEAR
SELECT 1
USE Student
S=0
SCAN FOR Entrancescore>=500
S=S+1
ENDSCAN
―入学成绩大于等于 500分的学生共有,+STR(S)+―人,
USE
RETURN
命令格式
FOR Var = nInitialValue TO nFinalValue [STEP
nIncrement]
Commands
[EXIT]
[LOOP]
ENDFOR | NEXT
12.5.3 FOR… ENDFOR语句命令功能在执行 FOR语句时,系统首先将 初值 ( nInitialValue) 赋予循环控制变量 ( Var),并 保存终值 ( nFinalValue) 和步长值
( nIncrement),然后判断循环控制变量的值是否超过终值 。 如果超过终值,那么执行 ENDFOR | NEXT之后的语句,即结束循环;如果未超过终值,那么执行循环体 ( Commands) 中的语句,
当执行到 ENDFOR | NEXT( 循环结束语句 ) 时,系统将循环控制变量的值与步长值相加后再次存入循环控制变量,并返回到
FOR( 循环开始语句 ),重新判断循环控制变量的值是否超过终值,如果未超过终值,那么将再次执行循环体中的语句,依此往复,直到循环控制变量的值超过终值时即结束循环,执行
ENDFOR | NEXT之后的语句 。
12.5.3 FOR… ENDFOR语句命令说明
( 1) Var参数为循环控制变量 。
( 2) nInitialValue和 nFinalValue参数是数值表达式,分别作为初值和终值 。 初值和终值可以是正值,负值和零 。
( 3) STEP nIncrement子句用于设置循环的步长 。 nIncrement参数是数值表达式,作为步长值 。 步长值可以是正值和负值,但不应为零 ( 步长为零时,FOR循环将成为死循环 ) 。 如果步长值为 1,那么可以省略该子句 。
( 4) LOOP语句是循环体 ( Commands) 中的特殊语句 。 当执行到 LOOP语句时,系统将不再执行其后的其它循环体语句,而直接返回到 FOR,重新判断循环控制变量的值是否超过终值 。
( 5) EXIT语句是循环体 ( Commands) 中的特殊语句 。 当执行到 EXIT语句时,系统将不再执行其后的其它循环体语句,而直接跳出循环,执行 ENDFOR | NEXT之后的语句,即结束循环 。
( 6) LOOP语句和 EXIT语句通常与选择结构语句搭配使用,即只有满足给定条件的情况下才能执行这两条语句 。
( 7) FOR和 ENDFOR | NEXT必须配对使用 。 FOR可以和 ENDFOR配对使用,也可以和 NEXT配对使用 。
( 8) FOR… ENDFOR | NEXT语句可以嵌套使用 。 也就是说,在 FOR语句中又包含了另外的 FOR语句,即多重循环 。
【 例 】 试利用 FOR… ENDFOR语句编写一个程序,显示入学成绩最高的前十名学生的姓名和入学成绩 。
SET TALK OFF
CLEAR
SELECT 1
USE Student
INDEX ON -1*Entrancescore TO Es
FOR I=1 TO 10
DISPLAY FIELDS Name,Entrancescore
SKIP
IF EOF()
EXIT
ENDIF
ENDFOR
USE
RETURN
多重循环就是循环语句中又包含着另一个循环语句,也称为循环嵌套 。 嵌套有几层循环就称为几重循环 。 外层的循环语句称为外循环,被包含的循环语句称为内循环 。 前面介绍的三种循环语句可以相互嵌套,形成多重循环 。
下面以 DO WHILE语句的二重循环为例,说明二重循环的命令格式和执行过程 。
命令格式
DO WHILE lExpression1
Commands1
DO WHILE lExpression2
Commands2
ENDDO
Commands3
ENDDO
12.5.4 多重循环执行过程系统首先执行外循环语句,判断 lExpression1条件是否成立,如果成立,执行 Commands1语句系列,然后进入内循环 。 进入内循环以后,系统将判断 lExpression2条件是否成立,如果成立,反复执行
Commands2语句系列,直到 lExpression2条件不成立为止,退出内循环,接着执行 Commands3语句系列,然后返回到外循环的 DO
WHILE循环开始语句处 。 系统将再次判断 lExpression1条件是否成立,
如果成立,重复上述执行过程,直到 lExpression1条件不成立为止 。
需要注意的是:循环嵌套时,内循环必须完全包含在外循环中,
如图 12-1所示 。 不能出现交叉的情况,如图 12-2所示 。
图 12-1 正确的循环嵌套 图 12-2 错误的循环嵌套同样,循环语句与选择语句搭配使用时,也应该注意嵌套关系 。
不能出现循环语句与选择语句之间产生交叉的情况 。
【 例 】 试编写一个程序,显示所有学生考试的总成绩 。
SET TALK OFF
CLEAR
SELECT 1
USE Student
SELECT 2
USE Score
S=0
SELECT 1
SCAN
SELECT 2
LOCATE FOR Studid=Student.Studid
IF NOT EOF()
DO WHILE NOT EOF()
S=S+Score
CONTINUE
ENDDO
ENDIF
SELECT 1
"姓名,"+Name+"总分,"+STR(S)
S=0
ENDSCAN
SELECT 1
USE
SELECT 2
USE
RETURN
12.5.5 多模块结构子程序过程自定义函数作用调用方式参数传递在应用程序设计过程中,经常把某些具有特定功能或某延续 特定的代码单独组成一个模块,这个模块叫做,过程,或
,自定义函数,。
一、子程序和过程主程序,调用程序(文件)。
子程序,被调用的独立的程序文件,一个程序模块一个程序文件。
过程,被调用的程序模块,多个程序模块一个程序文件,这个程序文件又称为 过程文件 。
1.过程文件
PROCEDURE <procname1>
……
RETURN
PROCEDURE <procname2>
……
RETURN
……
FUNCTION <funcname1>
……
RETURN <expr>
……
过程文件过程过程函数
2.子程序和过程调用子程序调用:
DO <程序文件名 >
过程调用:
SET PROCEDURE TO <过程文件名 >
DO <过程名 >
或 DO <过程名 > IN <过程文件名 >
3.参数传递主程序 子程序 /过程 /函数发送参数:
DO <程序 > WITH <参数表 >
函数名 (<参数表 >)
接收参数:
子程序 /过程 /函数的第一个可执行语句为:
PARAMETER <参数表 >
参数传递
4.程序返回返回到调用处的下一个指令:
RETURN
RETURN TO MASTER | <程序名 >
返回到调用处:
RETRY
DO P2
DO P3
RETURN
DO P4
RETURN
TO MASTER
DO P5
RETURN
RETRY
P1 P2 P3 P4 P5
举例主程序 ( main.prg)
set procedure to f1
do p1
do p2
‖ 教育技术专业,
close procedure
cancel
过程文件( f1.prg)
procedure p1
‖聊城大学,
return
procedure p1
‖ 教育技术系,
return
主程序 ( main.prg)
do p1 in f1
do p2 in f1
‖ 教育技术专业,
close procedure
cancel
过程文件( f1.prg)
procedure p1
‖聊城大学,
return
procedure p1
‖ 教育技术系,
return
或二、自定义函数格式:
FUNCTION <函数名 >
……
RETURN <expr>
[ENDFUNC]
函数调用:
无参调用:函数名 ()
有参调用:函数名 (<参数表 >)
函数返回,某一类型的值举例
set talk off
r=0
@10,20 say ―请输入半径的值:,get r
read
―圆的面积为:,
area(r)
cancel
function area(r)
s=3.1415926*r*r
return(s)
endfunc
第 13章 表单设计教学目标:
1.掌握表单的创建方法
2.掌握常用表单控件的用法
3.掌握表单属性及表单数据环境的设置方法教学重点:
1.表单的创建
2.表单控件的使用教学难点:
表单控件的使用第 13章 表单设计表单为数据库信息的显示,输入和编辑提供了非常简便的方法,
表单的设计是可视化编程的基础 。 利用表单,可以让用户在熟悉的界面下查看数据或将数据输入数据库 。 但表单提供的远不止是一个界面,
它还提供丰富的对象集,这些对象能够响应用户 ( 或系统 ) 事件,这样就能使用户尽可能方便和直观地完成信息管理工作 。
表单的创建即可以使用表单向导,也可以使用表单设计器,Visual
FoxPro提供了一个功能强大的表单设计器,使得设计表单工作变得既快捷又容易 。
创建表单
表单的属性窗口
设置数据环境
基本表单设计
表单的保存与运行
常用控件
表单中的事件过程
面向对象设计思想表单可以属于某一个项目,也可以独立于任何项目之外,单独存在,它是一个特殊的磁盘文件,扩展名为,scx 。 在项目管理器中创建的表单隶属于该项目管理器 。
在 Visual FoxPro中,可以用以下任意一种方法创建表单:
l 使用表单向导
l 使用,表单设计器,
l 使用 CREATE FORM 命令
13.1 创建表单
表单向导? ―表单设计器,工具栏
表单设计器? ―表单控件,工具栏
1.使用表单向导创建单数据库表表单
( 1) 打开,MANAGER.PJX‖项目文件,在项目管理器中选择
,文档,选项卡 。
( 2) 在,文档,选项卡中,选择,表单,选项 。
( 3) 单击,新建,按钮,系统弹出,新建表单,对话框 。
( 4) 在,新建表单,对话框中单击,表单向导,按钮,系统弹出,向导选取,对话框 。
( 5) 在,向导选取,对话框中选择,表单向导,选项,然后单击,确定,按钮,进入,表单向导-步骤 1‖对话框 。
13.1.1 表单向导
( 6)在“表单向导-步骤 1‖对话框的“数据库和表”组合框中选取
,students.dbc‖数据库,并且选取,student.dbf‖表,将表中的全部可用字段添加到“选定字段”列表框,单击“下一步”按钮,进入“表单向导-步骤 2‖对话框。
( 7),表单向导-步骤 2‖对话框用于确定表单的外观效果 。 在,样式,列表框中,系统提供了 9种不同风格的显示记录字段的样式,每选择一种都可以在左上角看到其显示效果,本例中选择,浮雕式,显示效果 。
( 8 ) 选 择排 序依 据 。 最多 可以 选择 三个 排序 依据,选择
,entrancescore‖字段添加到,选定字段,列表框中并选择,降序,单选项,单击,下一步,按钮,进入,表单向导-步骤 4‖对话框 。
( 9) 在,表单向导-步骤 4‖对话框的,请键入表单标题,文本框中键入,学生入学成绩浏览,,选择,保存并运行表单,单选项 。 单击
,预览,按钮可以浏览所设计的表单的效果,如果不满意,可以回到上一步修改,直到满意为止 。
最后单击,完成,按钮,保存为,xsrxcj.scx‖文件 。 该表单将在保存后自动运行 。
2.使用表单向导创建双数据库表表单
( 1) 按照创建单数据库表表单的前四步操作以打开,向导选取,对话框 。 在该对话框中选择,一对多表单向导,选项,然后单击,确定,
按钮,系统弹出,一对多表单向导-步骤 1‖对话框 。
( 2) 从父表中选取字段 。 在,一对多表单向导-步骤 1‖对话框中,
选择,student.dbf‖为父表,在,选定字段,中添加 studid,name,sex、
birthday,depid字段,单击,下一步,按钮,进入,一对多表单向导
-步骤 2‖对话框 。
( 3) 从子表中选取字段 。 在,一对多表单向导-步骤 2‖对话框中,
选择,score.dbf‖为子表,在,选定字段,中添加其全部字段,然后单击,下一步,按钮,进入,一对多表单向导-步骤 3‖对话框 。
( 4) 建立父子表之间的关系 。 在,一对多表单向导-步骤 3‖对话框中,指定父表和子表之间的关系,左边为父表,右边为子表,本例中父子表的联结为默认的,student.studid= score.studid‖。
―表单设计器,是设计用户界面的基本工具 。 使用,表单设计器,既可以创建出与数据库表相关的表单,也可以创建出与数据库表无关的独立表单,如显示某些信息的表单或对话框等 。 熟练掌握,表单设计器,这一工具,可以随心所欲地设计出具有
Windows风格的各种用户界面 。
13.1.2 表单设计器
13.1.3,表单设计器,工具栏命令按钮 功 能 说 明设置 Tab 键次序在设计模式和 Tab 键次序方式之间切换,Tab 键次序方式设置对象的 Tab 键次序方式 。 当表单含有一个或多个对象时可用数据环境 显示,数据环境设计器,
属性窗口 显示一个反映当前对象设置值的窗口代码窗口 显示当前对象的,代码,窗口,以便查看和编辑代码
―表单控件,工具栏显示或隐藏,表单控件,工具栏
―调色板,工具栏 显示或隐藏,调色板,工具栏
―布局,工具栏 显示或隐藏,布局,工具栏表 13-1 ―表单设计器,工具栏命令按钮命令按钮 功 能 说 明表单生成器运行,表单生成器,,它为您提供一种简单,交互的方法把字段作为控件添加到表单上,并可以定义表单的样式和布局自动格式运行,自动格式生成器,,它为您提供一种简单,
交互的方法为选定控件应用格式化样式 。 要使用此按钮应先选定一个或多个控件续表 13-
1
表单控件工具栏上设置有 25个按钮,除个别按钮以外,每个按钮代表一个控件 。 使用,表单控件,工具栏可以在表单上创建控件 。 单击需要的控件按钮,将鼠标指针移动到表单上,然后单击表单放置控件或把控件拖至所需的大小,就把该控件添加到表单上 。 有关表单控件详细内容,将在第 6节详细讲解 。
13.1.4,表单控件,工具栏每一个表单都包括一个数据环境 。 数据环境是一个对象,它包含与表单相互作用的表或视图,以及表单所要求的各表之间的关系 。 可以在
,数据环境设计器,中直观地设置数据环境,并与表单一起保存 。
在表单运行时数据环境可自动打开,关闭表和视图,而且,通过设置,属性,窗口中 ControlSource 属性设置框 ( 在这个属性框中列出数据环境表或视图的所有字段 ),数据环境将帮助用户设置控件的
ControlSource 属性 。
13.2 设置数据环境
打开数据环境设计器? 向数据环境设计器添加、移去表或视图
常用数据环境属性? 数据环境设计器中关系的设置与编辑数据环境设计器需在表单设计状态下才能打开 。 首先进入表单设计器,从,显示,菜单中选择,数据环境,命令,即可进入数据环境设计器 。 如果设置上一节创建的学生成绩浏览表单的数据环境,首先在
,项目管理器,中选择该表单并单击,修改,按钮,进入表单设计器 。
然后从,显示,菜单中选择,数据环境,命令,即可进入数据环境设计器 。
13.2.1 打开数据环境设计器
13.2.2 常用数据环境属性属 性 说 明 默 认 设 置
AutoCloseTables 控制当释放表或表单集时,是否关闭表或视图,真,(.T.)
AutoOpenTables 控制当运行表单时,是否打开数据环境中的表或视图,真,(.T.)
InitialSelectedAli
as 当运行表单时选定的表或视图设计时刻为,” 。 如果没有指定,在 运 行时 首 先加 到
,数据环境,中的临时表最先被选定表 13-2 数据环境的主要属性设置
13.2.3 向数据环境设计器添加、移去表或视图向数据环境设计器添加表或视图时,可以看到属于表或视图的所有字段和索引 。
( 1) 在,数据环境设计器,中,从,数据环境,菜单中选择,添加,命令;
( 2) 在,添加表或视图,对话框中,从列表中选择表或视图 。
将表从数据环境中移去时,与这个表有关的所有关系也随之移去 。
( 1) 在,数据环境设计器,中选择要移去的表或视图;
( 2) 从,数据环境,菜单中选择,移去,命令 。
当,数据环境设计器,处于活动状态时,,属性,窗口会显示与数据环境相关联的对象及属性 。 在,属性,窗口的对象框中,数据环境的每个表格或视图,表格之间的每个关系以及数据环境本身均是各自独立的对象 。
13.2.4 数据环境设计器中关系的设置与编辑
1.数据环境设计器中关系的设置如果添加进数据环境设计器的表具有在数据库中设置的永久关系,
这些关系将自动地添加到数据环境中 。 如果表间没有永久的关系,可以在数据环境设计器中设置这些关系 。
2.数据环境设计器中关系的编辑若要编辑关系属性,应在,属性,窗口的对象列表框中选择要编辑的关系 。
设计表单的大多数工作是在属性窗口中完成的,因此用户必须熟悉属性窗口的各个组成部分及其功能和设置方法 。
13.3 表单的属性窗口在进行表单设计时,可以使用表单向导,也可以使用表单设计器 。
由于采用表单向导设计的表单样式比较单一,有时需要设计一些复杂的,
功能强大的表单,这时表单向导就不能胜任了,必须使用表单设计器来完成设计 。 使用表单设计器进行表单设计的一般过程如下:
( 1) 分析表单应实现的功能,与数据库中的哪些数据有关系,需要使用哪些控件来实现这些功能 。
( 2) 创建表单,设置外观 ( 包括表单的背景颜色,尺寸,标题等 ) 。
( 3) 根据需要设置数据环境 。
( 4) 在表单上添加所需要的对象 ( 包括表,视图或控件等 ),并调整其位置,大小和整体布局 。
13.4 基本表单设计
( 5) 利用属性窗口设置对象的初始属性 。
( 6) 为对象编写程序代码以完成预定的要求 。
【 例 】 创建一个表单,在表单下部创建两个命令按钮,其中一个用于退出表单的运行,另一个控制显示信息,当按钮上出现,显示,标题时,单击该按钮则显示信息,祝君生日快乐 !,,同时该按钮的标题变为,不显示,。 再单击则取消刚才的显示信息且该按钮的标题又变为,显示,。
【 例 】 建立一个表单,包括 student.dbf表和 department.dbf表中的部分字段,且设置成只能浏览不能修改 。 在表单的下部有三个命令按钮,分别是,上一记录,按钮,,下一记录,按钮和,退出,按钮 。
1.表单的保存当通过表单向导或表单设计器创建完成一个表单之后,就需要把创建的表单保存起来 。 首先要确定保存的位置,一般情况下,一个项目文件所涉及到的所有的文件如表文件,库文件,查询文件,视图文件,表单文件等都保存在一个目录下面,便于连编成为应用程序 。 其次要为文件命名,表单文件的扩展名为,,scx‖,在保存的同时,系统自动为表单文件创建一个与表单文件名同名的扩展名为,,sct‖的表单备注文件 。 如上一节 【 例 13-1】 中表单的文件名为,表单练习 1.scx‖,同时还有一个表单备注文件名为,表单练习
1.sct‖。
2.表单的运行表单的运行有两种方法:
l 在项目管理器中单击,运行,按钮
l 在命令窗口或者在程序中运行表单,命令格式如下:
DO FORM FormName
13.5 表单的保存与运行
1.标签 ( Label)
2.文本框 ( Text)
3.编辑框 ( Edit)
4.命令按钮 ( Command Button) 和命令按钮组 ( Command Button Group)
5.选项按钮组 ( Option Group)
6.复选框 ( Check Box)
7.列表框 ( ListBox) 和组合框 (ComboBox)
8.表格 ( Grid)
9.微调控件 ( Spinner)
10.其他 常 用控 件 ( 页框 ( PageFrame),图象 ( Image),计时 器
( Timer))
13.6 常用控件
13.7 表单中的事件过程
表单中常用对象
表单中的事件在 Visual FoxPro中,包含在应用程序中的表单及各种控件都是对象 。 对象是包含数据和代码的实体 。 在程序设计中,用属性,事件和方法来说明对象,属性就是对象的数据,方法则是对象中包含的代码 。
( 1) 属性 。 每个对象都具有属性,属性表明了对象的一些基本特征,如大小,颜色,所处的位置等 。
( 2) 事件 。 事件是一种预先定义好的特定动作,被用户或系统激活,每个对象都可以对事件的动作进行识别和响应 。 在多数情况下,事件是由用户的交互行为产生的,例如,对一部电话来说,当用户提起听筒时,便激发了一个事件,同样,当用户拨号打电话时也激发了若干事件 。 事件集合是固定的,用户不能进行扩充 。 表 13-5列出了命令按钮的典型事件 。
( 3) 方法 。 方法实际上就是对象的内部函数,每个类型的对象都有它自己的方法集 。 例如在命令按钮对象中,调用 Move方法可以移动按钮的位置 。
与事件不同的是,方法可以由用户进行扩展 。
13.7.1 表单中常用对象在 Visual FoxPro的表单中常用对象有以下几类:
( 1) 控件 ( Control) 。 放在一个表单上用以显示数据,执行操作或使表单更易阅读的一种图形对象,如文本框,矩形或命令按钮等 。 Visual FoxPro
控件包括复选框,编辑框,标签,线条,图象,形状等等 。 可以使用,表单设计器,的,表单控件,工具栏在表单上绘制控件 。
( 2) 容器 ( Container) 。 容器可以作为其他对象的父对象 。 例如,一个表单作为一个容器,是放在其中的复选框的父对象 。 在表单中常用的容器有命令按钮组,表单集,表单,表格,选项按钮组,页框等 。
( 3) 用户自定义类 ( user-defined class) 。 与 Visual FoxPro 6.0基类相似,
但由用户定义,并且可用来派生子类 。
( 4) OLE对象 。 在应用程序的表单或通用型字段中,可以包含从其他应用程序中得来的特殊的功能或数据称为 OLE对象,例如文本数据,声音数据,图片数据或视频数据 。 通过使用 OLE对象可以扩展 Visual FoxPro的功能 。
在 Visual FoxPro中,表单中的常用事件如表 13-3所示 。
13.7.2 表单中的事件事 件 事件被激发后的动作
Init 创建对象
Destroy 从内存中释放对象
Click 用户使用鼠标单击对象
DblClick 用户使用鼠标双击对象
RightClick 用户使用鼠标右键单击对象
GotFocus 对象接收焦点,由用户动作引起,如按 Tab键或单击,或者在代码中使用SetFocus方法
LostFocus 对象失去焦点,由用户动作引起,如按 Tab键或单击,或者在代码中使用SetFocus方法使焦点移到新的对象上表 13-3 表单的核心事件事 件 事件被激发后的动作
KeyPress 用户按下或释放键
MouseDown 当鼠标指针停在一个对象上时,用户按下鼠标
MouseMove 用户在对象上移动鼠标
MouseUp 当鼠标指针停在一个对象上时,用户释放鼠标续表 13-3
第 14章 菜单设计教学目标:
1.了解菜的组成,掌握菜单的创建方法
2.掌握菜单的逻辑分组方法、访问键和快捷键的定义
3.掌握菜单任务的指定方法教学重点:
1.菜单的创建
2.菜单任务的指定教学难点:
菜单任务的指定第 14章 菜单设计
Visual FoxPro提供的系统菜单是用户的好帮手,它为用户提供了直观,友好的操作环境 。 那么在 Visual FoxPro中,用户是否可以创建与 Visual FoxPro系统菜单类似的用户菜单?答案是肯定的 。 使用 Visual FoxPro提供的,菜单设计器,就可以方便,快捷地创建与 Visual FoxPro系统菜单类似的用户菜单 。
在应用程序中,用户最先接触到的就是菜单系统 。 如果把菜单设计好,那么只要根据菜单的组织形式和内容,用户就可以很好地理解应用程序 。 因此菜单系统设计的好坏不但反映了应用程序功能模块组织的水平,同时也反映了应用程序的用户界面是否友好 。 如果说应用程序的功能模块是内核,那么菜单就是把这些内核包装起来的,外衣,。 有了功能强大的内核和漂亮的,外衣,,
应用程序会更趋于完美 。
菜单的基本概念
建立菜单
为菜单指定任务
定义键盘访问键和快捷键
菜单项的逻辑分组在进行菜单设计之前,应首先了解有关菜单的基本概念 。
l 菜单 ( Menu)
菜单是由一系列命令或文件组成的列表清单 。
l 菜单栏 ( Menu Bar)
菜单栏位于应用程序窗口的最上方 。 当用户选择菜单栏中的某一个菜单时,系统将打开一个下拉菜单,供用户选择其中的命令 。
l 菜单项 ( Menu Item)
菜单项是下拉菜单中的一条命令,因此通常将菜单项称为命令 。
l 菜单标题 ( Menu Title)
菜单标题用以表示菜单或菜单项的名称,因此也称其为菜单名称 。
14.1 菜单的基本概念
l 菜单系统 ( MenuSystem)
菜单系统是菜单栏,菜单,菜单项和菜单标题的集合 。
l 键盘访问键 ( Access Keys)
键盘访问键通常是一个英文字母 。 在菜单栏或菜单中,每一个菜单标题的右面均设置有键盘访问键 。 同时按下 【 Alt】 键和键盘访问键,可以激活指定的菜单或菜单项 。
l 键盘快捷键 ( Shortcuts)
键盘快捷键是为快速访问菜单项而设置的组合键 。 一般由 【 Ctrl】 键或
【 Alt】 键与一个英文字母组成 。
在 Visual FoxPro中,可以采用以下三种方式创建菜单:
l 使用,项目管理器,
l 使用,文件,菜单中的,新建,命令
l 使用 CREATE MENU命令
14.2 建立菜单
使用,项目管理器,创建菜单
使用,新建,命令创建菜单
使用 CREATE MENU命令创建菜单
在,菜单设计器,窗口中创建菜单
创建快捷菜单
生成菜单程序若要使用,项目管理器,创建菜单,应按下列步骤操作:
( 1) 打开,项目管理器,,并选择,其他,选项卡 。
( 2) 在,其他,选项卡中选择,菜单,选项 。
( 3) 单击,新建,按钮,系统弹出,新建菜单,对话框 。
( 4) 在,新建菜单,对话框中单击,菜单,按钮,系统立即打开
,菜单设计器,窗口 。
( 5) 在,菜单设计器,窗口中,通过直观的操作即可创建用户菜单 。
14.2.1 使用,项目管理器,创建菜单若要使用,新建,命令创建菜单,应按下列步骤操作:
( 1) 从,文件,菜单中选择,新建,命令,系统弹出,新建,对话框 。
( 2) 在,文件类型,区域中选择,菜单,单选项 。
( 3) 单击,新建文件,按钮,系统弹出,新建菜单,对话框 。
( 4) 在,新建菜单,对话框中单击,菜单,按钮,系统立即打开
,菜单设计器,窗口 。
( 5) 在,菜单设计器,窗口中,通过直观的操作即可创建用户菜单 。
14.2.2 使用,新建,命令创建菜单命令格式
CREATE MENU [FileName |?]
命令功能该命令用于在命令窗口或程序中直接创建一个菜单 。
命令说明
( 1) FileName参数用于指定要创建的菜单名称 。
( 2)?参数用于在执行该命令时打开,创建,对话框以输入要创建的菜单名称 。
14.2.3 使用 CREATE MENU命令创建菜单在,菜单设计器,窗口中,应首先在,菜单名称,文本框中输入要创建的菜单或菜单项的名称,然后在,结果,组合框中选择适当的选项 。
,结果,组合框用于确定要创建的菜单或菜单项将完成何种功能 。,结果,组合框共有以下四个选项:
,命令,选项:用于在其后显示的文本框中输入一条命令 。 该命令与创建的菜单项一一对应 。
,填充名称,选项:用于在其后显示的文本框中为菜单项命名,该名称用来供其它程序调用 。 缺省情况下,系统将自动为每一个菜单项命名 。
,子菜单,选项:用于确定要创建一个子菜单 。 选择,子菜单,选项以后,单击其后的,创建,按钮,可以建立一个子菜单 。
14.2.4 在,菜单设计器,窗口中创建菜单
―过程,选项:用于为要创建的菜单项建立一个对应的过程程序 。 选择
,过程,选项以后,单击其后的,创建,按钮,可以建立一个过程程序 。
在,菜单设计器,窗口中,单击,插入,按钮可以在当前菜单或菜单项之前插入一个新的菜单或菜单项;单击,删除,按钮可以删除当前菜单或菜单项;单击,预览,按钮可以在运行菜单程序之前预览菜单的实际效果;
,菜单级,组合框用于确定当前设计的子菜单在菜单系统层次结构中的位置,若为,菜单栏,选项,则表示目前正在设计系统的主菜单 。,菜单级,
组合框提供了由较低一级的菜单返回上一级菜单的途径 。
在打开,菜单设计器,窗口以后,可以直接从,菜单,菜单中选择,快速菜单,命令,系统将打开 Visual FoxPro系统菜单的,菜单设计器,窗口 。
在系统菜单的,菜单设计器,窗口中,用户可以在系统菜单的基础上经过编辑修改生成用户菜单 。
在 Visual FoxPro中,用户可以创建自己的快捷菜单 。 当在适当的环境下单击鼠标右键时,系统将弹出该快捷菜单 。
可以像创建菜单哪样使用,项目管理器,,,新建,命令或
CREATE MENU命令创建快捷菜单 。
,快捷菜单设计器,窗口与,菜单设计器,窗口结构是相同的,操作方式和步骤几乎也是一样的 。 但是,在,快捷菜单设计器,窗口中,
,插入栏,按钮是可用的 。 单击,插入栏,按钮,系统将弹出,插入系统菜单栏,对话框 。
利用,插入系统菜单栏,对话框可以为快捷菜单添加系统菜单命令 。
14.2.5 创建快捷菜单在,菜单设计器,或,快捷菜单设计器,中设计完菜单或快捷菜单以后,若要使用该菜单或快捷菜单,那么必须要首先生成菜单程序 。
生成的菜单程序是一个独立的文件,其扩展名为,MPR。 若要调用菜单程序,可以在程序中或命令窗口中执行如下命令:
DO MenuFileName.MPR
其中 MenuFileName.MPR为要调用的菜单程序名 。
若要调用快捷菜单程序,可以在程序中或命令窗口中执行如下命令:
14.2.6 生成菜单程序
ON KEY LABEL RIGHTMOUSE DO MenuFileName.MPR
其中 MenuFileName.MPR为要调用的快捷菜单程序名 。
若要将快捷菜单程序与某一个控件对应,也就是说当在该控件上单击鼠标右键时,系统弹出该快捷菜单,那么应在该控件的
RightClick事件过程中添加如下命令:
DO MenuFileName.MPR
其中 MenuFileName.MPR为要调用的快捷菜单程序名 。
14.2.6 生成菜单程序每一个菜单或菜单项都将完成一项指定的任务 。 但是,完成任务的方式确不尽相同 。 对于一个菜单项,用户可以把一条 Visual FoxPro命令与该菜单项一一对应,当选择该菜单时,实际上是在执行一条 Visual
FoxPro命令;对于一个菜单项,用户也可以把一个过程程序与该菜单项一一对应,当选择该菜单时,实际上是在执行一个过程程序 。
14.3 为菜单指定任务
为菜单指定子菜单
为菜单指定命令
为菜单指定过程在,菜单设计器,窗口中,若要在菜单栏中创建一个菜单或在下拉菜单中创建一个子菜单,应在,结果,组合框中选择,子菜单,选项 。
【 例 】 若要在 Visual FoxPro的系统菜单栏中添加,报表 ( R),菜单,那么应做如下的操作:
( 1) 打开,项目管理器,,并选择,其他,选项卡 。
( 2) 在,其他,选项卡中选择,菜单,选项 。
( 3) 单击,新建,按钮,系统弹出,新建菜单,对话框 。
( 4) 在,新建菜单,对话框中单击,菜单,按钮,系统立即打开
,菜单设计器,窗口 。
( 5) 从,菜单,菜单中选择,快速菜单,命令,系统将打开 Visual
FoxPro系统菜单的,菜单设计器,窗口 。
14.3.1 为菜单指定子菜单
( 6) 若要将,报表 ( R),菜单添加到,窗口 ( W),菜单的前面,那么应首先在,菜单设计器,窗口中选择,窗口,子菜单行,然后单击,插入,按钮,系统即在,窗口,子菜单行前插入了一个空白行 。
( 7) 在空白行的,菜单名称,文本框中输入,报表 ( \<R),,在,结果,组合框中选择,子菜单,选项 。
( 8) 单击,保存,按钮保存设计的菜单,将其命名为,system‖。
( 9) 从,菜单,菜单中选择,生成,命令,系统弹出,生成菜单,对话框 。
( 10) 在,生成菜单,对话框中确定菜单程序的保存位置,然后单击
,生成,按钮 。
( 11) 在,项目管理器,中选择要执行的菜单 。
( 12) 单击,运行,按钮,系统即在 Visual FoxPro菜单中添加,报表
( R),菜单 。
在,菜单设计器,窗口中,若要在菜单中创建一个菜单项并将 Visual
FoxPro的一条命令分配给该菜单项,应在,结果,组合框中选择,命令,
选项 。
【 例 】 若要在 Visual FoxPro菜单栏的,报表 ( R),菜单中添加,学生基本情况报表 ( S),和,学生选课报表 ( O),菜单项并分别将相应的报表利用 REPORT FORM命令分配给这两个菜单项,那么应做如下的操作:
( 1) 打开,项目管理器,,并选择,其他,选项卡 。
( 2) 在,其他,选项卡中选择,system‖菜单 。
( 3) 单击,修改,按钮,系统打开,菜单设计器,窗口 。
( 4) 在,菜单设计器,窗口中选择,报表,子菜单行 。
( 5) 单击,编辑,按钮,系统即打开,报表,菜单的,菜单设计器,
窗口 。
14.3.2 为菜单指定命令
( 6) 在,报表,菜单的,菜单设计器,窗口中,分别创建,学生基本情况报表 ( \<S),和,学生选课报表 ( \<O),菜单项并分别将相应的报表利用 REPORT FORM命令分配给这两个菜单项 。
( 7) 在,菜单级,组合框中选择,菜单栏,选项返回主菜单的,菜单设计器,窗口 。
( 8) 单击,保存,按钮保存设计的菜单 。
( 9) 从,菜单,菜单中选择,生成,命令,系统弹出,生成菜单,
对话框 。
( 10) 在,生成菜单,对话框中确定菜单程序的保存位置,然后单击,生成,按钮 。
( 11) 在,项目管理器,中选择要执行的菜单 。
( 12) 单击,运行,按钮,系统即在,报表 ( R),菜单中添加
,学生基本情况报表 ( S),和,学生选课报表 ( O),菜单项 。
在,菜单设计器,窗口中,若要在菜单中创建一个菜单项并将 Visual FoxPro
的一个过程程序分配给该菜单项,应在,结果,组合框中选择,过程,选项 。
【 例 】 若要在 Visual FoxPro菜单栏的,显示 ( V),菜单中添加,浏览学生基本情况 ( S),菜单项并将一个过程程序分配给这个菜单项,那么应做如下的操作:
( 1) 打开,项目管理器,,并选择,其他,选项卡 。
( 2) 在,其他,选项卡中选择,system‖菜单 。
( 3) 单击,修改,按钮,系统打开,菜单设计器,窗口 。
( 4) 在,菜单设计器,窗口中选择,显示,子菜单行 。
( 5) 单击,编辑,按钮,系统即打开,显示,菜单的,菜单设计器,窗口 。
( 6) 在,显示,菜单的,菜单设计器,窗口的,菜单名称,文本框中创建
,浏览
14.3.3 为菜单指定过程学生基本情况 ( \<S),。
( 7) 在,结果,组合框中选择,过程,选项 。
( 8) 单击,编辑,按钮,系统打开程序编辑器窗口 。
( 9) 在程序编辑器窗口中输入相应的过程程序,然后保存关闭该程序编辑器窗口 。
( 10) 在,菜单级,组合框中选择,菜单栏,选项返回主菜单的,菜单设计器,窗口 。
( 11) 单击,保存,按钮保存设计的菜单 。
( 12) 从,菜单,菜单中选择,生成,命令,系统弹出,生成菜单,对话框 。
( 13) 在,生成菜单,对话框中确定菜单程序的保存位置,然后单击
,生成,按钮 。
( 14) 在,项目管理器,中选择要执行的菜单 。
( 15) 单击,运行,按钮,系统即在,显示 ( V),菜单中添加,浏览学生基本情况 ( S),菜单项 。
键盘访问键通常是一个英文字母 。 在菜单栏或菜单中,每一个菜单标题的右面均设置有键盘访问键 。 同时按下 【 Alt】 键和键盘访问键,可以激活指定的菜单,然后按相应的键盘访问键可以激活指定的菜单项 。 键盘快捷键是为快速访问菜单项而设置的组合键 。 一般由 【 Ctrl】 键或 【 Alt】 键与一个英文字母组成 。
用户可以为创建的每一个菜单或菜单项设置键盘访问键,也可以根据需要为创建的菜单项设置键盘快捷键 。
14.4 定义键盘访问键和快捷键
定义键盘访问键
定义键盘快捷键在,菜单设计器,窗口的,菜单名称,文本框中创建菜单标题时,可以通过在其后输入,( \<P),的方式为菜单或菜单项定义键盘访问键,其中 P为要设置的键盘访问键 。
14.4.1 定义键盘访问键若要为指定的菜单项定义键盘快捷键,应按下列步骤操作:
( 1) 打开指定的,菜单设计器,。
( 2) 在,菜单设计器,窗口中选择要定义键盘快捷键的菜单项 。
( 3) 单击该菜单项所在行最右边的,选项,按钮,系统弹出,提示选项,对话框 。
( 4) 在,提示选项,对话框中,选择,键标签,文本框 。
( 5) 按下键盘快捷键 ( 例如,【 Ctrl】 +【 S】 ) 。
( 6) 单击,确定,按钮,返回,菜单设计器,窗口 。
( 7) 单击,保存,按钮保存设计的菜单 。
( 8) 从,菜单,菜单中选择,生成,命令,系统弹出,生成菜单,对话框 。
( 9) 在,生成菜单,对话框中确定菜单程序的保存位置,然后单击,生成,按钮 。
( 10) 在,项目管理器,中选择要执行的菜单 。
( 11) 单击,运行,按钮,系统即为选择的菜单项定义了键盘快捷键 。
14.4.2 定义键盘快捷键通常一个菜单设置有多个菜单项,每一个菜单项完成一个特定的任务 。 但是,在同一个菜单中,有些菜单项完成的任务是相关的或近似的 。 为了方便用户在菜单中选择命令,通常是将相关或近似的菜单项放置在一起,并对其进行逻辑分组 。 所谓逻辑分组就是将相关或近似的菜单项用一条直线单独分隔开 。
若要为菜单项进行逻辑分组,应在,菜单设计器,窗口中选择一个独立的空白行,然后在,菜单名称,文本框中输入,\-‖。
这样,系统即以该行为界对菜单项进行逻辑分组 。
14.5 菜单项的逻辑分组第 15章 应用程序的生成与发布教学目标:
1.了解应用程序的类型,掌握其生成方法
2.掌握应用程序安装盘的制作方法教学重点:
应用程序的生成及安装盘的制作方法教学难点:
应用程序的生成过程及其相关的设置。
第 15章 应用程序的生成与发布在开发数据库应用系统时,一般是根据应用系统的需求,将应用系统划分为若干个子系统,每个子系统又进一步分解为若干个功能模块,每个模块实现一个具体的功能 。 这样,整个系统可能要产生几十个甚至成百上千的文件 。 如果将这些文件直接提供给用户,那么可能会带来不必要的麻烦 。 例如,
用户无意中删除了某个文件,从而导致系统不能正常运行 。 另外,出于系统运行效率和知识产权保护的原因,系统开发人员也不希望将数据库应用系统的源代码交给用户 。 为了解决上述问题,Visual FoxPro允许系统开发人员将数据库应用系统的程序,表单,报表等文件打包,生成可在操作系统环境下直接运行的可执行 ( EXE) 文件 。
为了方便用户安装数据库应用系统,Visual FoxPro允许系统开发人员将要发布给用户的文件制作成安装盘 。 这样,用户就可以像安装 Windows操作系统一样安装数据库应用系统 。
生成应用程序? 制作安装盘在 Visual FoxPro中,使用,项目管理器,可以方便地将数据库应用系统所涉及的文件打包,并生成可在操作系统环境下直接运行的可执行 ( EXE) 文件 。 若要这样做,应完成如下主要工作:
15.1 生成应用程序
将数据库应用系统所涉及的文件添加到项目中
设置主文件
连编在 Visual FoxPro中,使用,项目管理器,可以方便地将数据库应用系统所涉及的文件添加到项目中 。
15.1.1 将数据库应用系统所涉及的文件添加到项目中在 Visual FoxPro中,使用,项目管理器,可以方便地设置主文件 。 一般来说,每一个项目必须指定一个主文件 。 主文件是应用程序的执行起始点 。 菜单,表单,查询或源程序等文件均可设置为应用程序的主文件 。 每一个项目必须有一个主文件,也只能有一个主文件 。
在构造项目时,Visual FoxPro会缺省指定一个文件为主文件 。 如果指定的主文件不符合要求,那么可以手工设置主文件 。
15.1.2 设置主文件在 Visual FoxPro中,使用,项目管理器,可以方便地将数据库应用系统所涉及的文件打包,并生成可在操作系统环境下直接运行的可执行 ( EXE) 文件 。
15.1.3 连编为了方便用户安装数据库应用系统,Visual FoxPro允许系统开发人员将要发布给用户的文件制作成安装盘 。 这样,用户就可以像安装 Windows操作系统一样安装数据库应用系统 。
在 Visual FoxPro中,制作安装盘大体上要做如下主要工作:
l 创建一个发布树目录,将要发布给用户的文件复制到该目录下 。
l 创建一个磁盘映象目录,用于保存制作的安装盘 。
l 从,工具,菜单的,向导,子菜单中选择,安装,命令,系统将启动
,安装向导,。
l 根据,安装向导,的提示操作,即可制作好安装盘 。
l ―安装向导,将在磁盘映象目录中创建一个 Disk144子目录,并在该目录下创建 Disk1,Disk2,Disk3等目录 。 将这些目录下的文件分别复制到不同的软盘中 。
l 安装时只要运行 Disk1盘上的 Setup.exe即可 。
15.2 制作安装盘第十六章 面向对象的设计思想教学目标:
1.掌握对象、属性、类、事件与方法的概念
2.了解类的类型和特性
3.掌握面向对象的设置思路和可视化编程的步骤教学重点:
面向对象的设计思路和可视化编程的步骤教学难点:
面向对象的设计思路第十六章 面向对象的设计思想
面向对象技术的基本概念
对象与属性:在面向对象的程序设计中,程序由若干对象构成,每个对象都具有属性。对象的属性了对象的状态。
对象:是反映客观事物属性及行为特征的描述。每个对象都具有描述其特征的属性,及附属于它的行为。对象把事物的属性和行为封装在一起,是一个动态的概念。对象是面向对象编程的基本元素。
属性:是用来描述对象的的各种特征的,不同的对象有不同的属性,而每个对象又都由若干属性来描述。
类:是一组对象的属性和行为特征的抽象描述。或者说类是具有共同属性、共同操作性质的对象的集合。
基类:可以分成容器类和控件类。
类的特性
封装性:是指将对象的特性(属性)和行为(方法)
包装在一起,类的内部信息对用户是隐蔽的。
继承性:是指通过继承关系利用已有的类构造新类。
多态性:是指在运行期间相同的操作可以作用于多种类型的对象上,从而可以获得不同的结果。
事件和方法
事件:是一种预先定义的能够被对象识别的特定的动作,
由用户系统激活。
方法:是附属于对象的行为和动作,是为对象实现一定功能而编写的代码,方法和对象相连。
第十六章 面向对象的设计思想第十六章 面向对象的设计思想
可视化编程的步骤
建立应用程序的用户界面。
设置各种对象的属性。
编写方法及事件的过程代码。