Visual FoxPro 6.0
Download
1 / 404

Visual FoxPro 6.0 程序设计教程 - PowerPoint PPT Presentation


  • 373 Views
  • Uploaded on

Visual FoxPro 6.0 程序设计教程. 第 1 章至第 6 章. 高等教育出版社. 编辑:朱梦环 郝德全 王洪 吴震林 达县职业高级中学. 第 1 章 Visual FoxPro 基础知识. 目 录. 第 2 章 基本数据元素. 第 3 章 数据库的基本操作. 第 4 章 数据处理与 SQL. 第 5 章 程序设计基础. 第 6 章 查询与视图. 第 1 章 Visual FoxPro 6.0 概述. 学习要点 1 、数据库的基本术语和概念。 2 、 常用文件类型和数据类型 3 、 Visual FoxPro 的命令格式。

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Visual FoxPro 6.0 程序设计教程' - darrin


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

Visual FoxPro 6.0程序设计教程

第1章至第6章

高等教育出版社

编辑:朱梦环 郝德全 王洪 吴震林

达县职业高级中学


1章 Visual FoxPro 基础知识

目 录

第2章 基本数据元素

第3章 数据库的基本操作

第4章 数据处理与SQL

第5章 程序设计基础

第6章 查询与视图


1章 Visual FoxPro 6.0 概述

学习要点

1、数据库的基本术语和概念。

2、 常用文件类型和数据类型

3、Visual FoxPro的命令格式。

4、 Visual FoxPro文件的基本命名方法。

5、常用的文件类型和数据类型以及基本概念。


1章 Visual FoxPro 6.0 概述

1.1 Visual FoxPro 6.0发展概述

1.2 数 据 库 系 统 概 述

1.3 常用文件类型和数据类型

1.4 文件命名方法和命令构成

返 回

退 出


1.1 Visual FoxPro 6.0发展概述

1、1986年6月推出了FoxBASE+ 1.0版

2、1987年7月推出了FoxBASE+ 2.0版

3、1988年7月推出了FoxBASE+ 2.1版

4、1992年下半年推出了FoxPro 2.5版

5、1994年下半年推出了FoxPro 2.6版

6、1995年6月推出了Visual FoxPro 3.0

7、1996年8月推出了Visual FoxPro5.0

8、1998年9月推出了Visual FoxPro6.0

返回


1.2 数据库系统概述

1.2.1 数据库技术的术语

1.2.2 数据库系统结构

1.2.3 数据模型

1.2.4 关系数据库

返 回

退 出


数据库技术的术语

1、数据库:数据库(Database,简记为DB)是长期存储在计算机内、有组织的、统一管理的相关数据的集合。

2、数据库管理系统:数据库管理系统(Database Management System,简记为DBMS)是位于用户与操作系统(OS)之间的一层数据管理软件

3、数据库技术:数据库技术是研究数据库的结构、存储、设计、管理和使用的一门软件学科。

4、数据库系统:数据库系统(Database System,简记为DBS)是实现有组织地、动态地存储大量关联数据、方便多用户访问的计算机硬件、软件和数据资源组成的系统,即它是采用数据库技术的计算机系统。

DBS包含DBMS和DB。

返回


数据库系统结构

传统的数据库有3类:层次数据库、网状数据库和关系数据库。它们分别采用树、图和线性表3种不同数据结构。VFP6属于关系数据库

关系数据库系统结构:

如某学院有:机电工程系、计算机系、化学工程系……每个系通过系代码、系名、系地址、系电话、教研室设置等数据来描述。表示关系数据库要采用线性表形式组织数据。


每个系下设若干个教研室,如机电工程系下设应用电子、自动控制、机械制造、制图等教研室;计算机系下设软件工程、计算机应用等教研室;化学工程系下设无机化工、有机化工等教研室。每个教研室有室代码、室名、室电话等数据表现其属性。

教研室负责管理教师和学生

假设应用电子教研室有何、王、李等老师,有A1、B1、C1等学生;自动控制教研室有寸、黄、陈等老师,有A2、B2、C2、D2等学生,等等。教师用职工号、姓名、性别等描述,学生用学号、姓名、性别等描述。则有表3和表4


每一个表称为一个关系;表的每一行称为一条记录,代表一个实体;表的每一列称为字段或数据项,代表实体的一个属性。每一个表称为一个关系;表的每一行称为一条记录,代表一个实体;表的每一列称为字段或数据项,代表实体的一个属性。


学生到课程之间的关联关系,如图每一个表称为一个关系;表的每一行称为一条记录,代表一个实体;表的每一列称为字段或数据项,代表实体的一个属性。1-2所示。

课程到学生之间的关联关系,如图1-3所示。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表1-5所示。

再设计一个如表1-6所示成绩表将表1-4和表1-5联系起来。

返回


1.2.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据模型

1、数据模型的定义

设计数据库系统时,一般先用图或表的形式抽象地反映数据彼此之间的关系,这个过程称为建立数据模型,所建立的图或表及其关系称为数据模型。

常用的数据模型一般可分为两类,一是语义数据模型,如实体-联系模型(E-R模型),面向对象模型等;二是经典数据模型,如层次模型,网状模型,关系模型等。

2、数据之间的联系

一对一联系 ;一对多联系 ;多对多联系

3、实体-联系模型(Entity-Relationship Model)

该模型是P.PS.Chen于1976年提出的一种概念模型,用E-R图来描述一个系统中的数据及其之间关系。


联系的类型同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

联系

实体

系代码

系名

1

N

学生

管理

学号

领导

姓名

N

室代码

N

教研室

开课

1

性别

室名

N

M

1

成绩

课程

所属

分数

N

N

课程号

教师

教学

大纲

主选教材

职工号

姓名

性别

属性

一个学校的系、教研室、教师、学生、课程之间的E-R模型

在E-R图中,用长方形表示实体集,在长方形框内写上实体名。

用菱形表示实体间联系,菱形框内写上联系名。

用无向边把菱形和有关实体相连接,在无向边旁标上联系的类型,如1或M或N。

用椭圆形表示实体或联系的属性,如用椭圆形将它与一个相应实体间以无向边相连。


4同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、关系数据模型(Relational Model)

用二维表格数据(即集合论中的关系)来表示实体和实体间联系的模型叫关系数据模型。

5、面向对象模型(Object Relational Model)

用对象、属性、方法来表示实体和实体间联系的模型叫面向对象模型。

(1)对象

对象是现实世界中实体的模型化。每个对象都有一个惟一的标识符,把状态和行为封装在一起 。

(2)类

将属性集和方法集相同的所有对象组合在一起,构成了一个“类”。一个类可以从层次的直接或间接祖先那里继承所有的属性和方法。

返回


1.2.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表关系数据库

1、基本概念

(1) 关系数据库

按关系数据模型组织的数据库是关系数据库,其理论基础是集合代数。按集合代数理论,关系名及其属性序列称为关系模式。

例如,一个名为Student的关系,其属性有Student_ID,Name,Sex,Birthday,Classes,Dormitory,Phonenumber,则关系模式可简单写成 Student (Student_ID,Name,Sex,Birthday,Classes,Dormitory,Phonenumber)。它的一个属性或若干属性构成的属性组取值的集合称为域,或者说,域是值的集合。

关系是一个元素为k(k≥1)的元组集合,即这个关系中有若干个元组,每个元组有k个属性值。若把关系看成是一个集合,则集合中的元素是元组。

更直观地理解,可将关系看成是一张二维表格。如表1-8所示是一张Student表。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表关系(表)可以看成是由行和列交叉组成的二维表格。

② 表中一行称为一个元组,可用来表示实体集中的一个实体。

③ 表中的列称为属性。给每一列起一个名称即属性名,表中的属性名不能相同。

④ 列的取值范围称为域,同列具有相同的域。例如,Sex列的取值范围是{男,女}。Student_ID列和Phonenumber列都为字符域(都是数字型字符)。

⑤ 表中任意两行(元组)不能完全相同。能惟一标识表中不同行的属性(组)称为主属性(组)或主关键字。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表2)候选关键字与主属性

①候选关键字

如果一个属性(组)能惟一标识元组,且又不含有其余的属性,那么这个属性(组)称为关系的一个候选关键字。

②主属性

在一个关系中,如果一个属性是构成某一个候选关键字的属性集中的一个属性,则称它为主属性。

(3)关系模式

关系模式是对关系的描述,它包括模式名、组成该关系的诸属性名、值域名和模式的主关键字或主码。

(4)关系子模式

关系子模式是用户所需数据的结构的描述,其中包括这些数据来自哪些模式和应满足哪些条件。

(5)存储模式

存储模式描述了关系是如何在物理存储设备上存储的。

(6)实体完整性规则

实体完整性规则规定:关系中元组的主码值不能为空值。

实体完整性规则和参照完整性规则是关系模型必须满足的完整性约束条件,称为关系完整性规则。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表7)参照完整性规则

参照完整性规则的形式定义为:如果属性集K是关系模式R1的主码,也是关系模式R2的外码,那么在R2的关系中,K的取值只允许有两种可能,或者为空值,或者等于R1关系中某个主码值。

(8)域完整性规则

这是针对某一具体数据的约束条件,由应用环境决定的。它反映某一具体应用所涉及的数据必须满足的语义要求。

(9)关系模型的形式定义

关系模型有3个组成部分:数据结构,数据操作,完整性规则。

① 数据库中全部数据及其相互联系都被组织成关系(即二维表格)的形式。关系模型基本的数据结构是关系。

② 关系模型提供一组完备的高级关系运算,以支持对数据库的各种操作。关系运算分为关系代数和关系演算两类。

③ 关系模型有3类完整性规则。


2同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、关系代数的运算

(1)投影(Projection)

设有关系R,在关系R中求指定的由若干个属性组成新的关系的运算称为投影,其形式为:

PROJECT 关系名(属性名1,属性名2,…,属性名n)

记作ПA(R)。其中R为被运算关系名,A为要选取的属性系列。这是以“列”作为处理单位进行的运算。

【例1-1】 由表1-9所示的关系S1中找出学生宿舍分配情况,求关系运算式及结果。

其操作可表示为:PROJECT S1(学号,宿舍)

关系运算式为:П学号,宿舍(学生宿舍分配)

结果如表1-10所示。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表2)选择

设有关系R,在关系R中求由满足给定条件F的元组组成新的关系的运算称为选择(Select)。其形式为:

SELECT 关系名 WHERE 条件

记作σF(R)。这是以“记录”为处理单位进行的运算。

【例1-2】 由表1-9所示的关系S1中找出所有“男生”的数据,求关系代数式。

其操作可表示为:SELECT S1 WHERE 性别=“男”

关系代数式为:σ男生(学生情况)

结果如表1-11所示。


小于同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

关系R

关系S

连接结果

(3)连接

从两个关系R和S的广义笛卡儿积中选取满足给定条件F的元组组成新的关系的操作称为R和S的连接(Join),其形式为:

JOIN 关系名1 AND 关系名2 WHERE 条件

记作(F=AθB)。其中,条件(F)是由算术比较符(>,≥,<,≤,=,≠)和属性名或列号组成的条件表达式,A和B分别代表R的第A列和S的第B列属性。

【例】 关系R和关系S分别如表3.11和表3.12所示,求。

其操作可表示为:JOIN R AND S WHERE B<D

连接结果如下表所示。

返回


1.3 VFP6同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表系统的常用文件类型

1、项目文件 .PJT .PJX

2、数据库文件 .DBC .DCT

1.3.1 主要文件类型

3、表文件 .DBF .FPT

4、程序文件 .PRG .FXP

5、索引文件.IDX .CDX

6、内存变量文件 .MEM

7、屏幕格式文件 .FMT

8、报表格式文件 .FRX .FRT

9、标签文件 .LBX .LBT

10、文本文件 .TXT

11、菜单文件 .MNT .MNX .MPR .MPX

12、表单文件 .SCX .SCT


1.3.2 VFP6同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表系统的常用数据类型

1、字符型数据(Character,简写为C)

2、数值型数据(Numeric,简写为N)

3、逻辑型数据(Logic,简写为L)

4、日期型数据(Date,简写为D)

5、备注型数据(Memo,简写为M)

6、通用型数据(General,简写为G)

返回


1.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表文件命名方法和命令构成

1.4.1 命令构成的基本格式

1.4.2 有关规则

1.4.3 VFP6文件命名方法

命令书写的有关约定

返 回

退 出


1.4.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表命令构成的基本格式

示 例

USE Grade

COUNT ALL FOR 课程成绩<60

LIST ALL 姓名,课程成绩 FOR ; 课程成绩<60 TO PRINTER

USE

这四条命令的功能分别是

第1条命令:打开名为GRADE的表文件。

第2条命令:统计GRADE中分数在60分以下的人数。

第3条命令:在打印机上输出成绩为60分以下的学生的姓名和分数。

第4条命令:关闭表文件GRADE,将其保存在磁盘上。


Visual FoxPro 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表的一般语法式

<命令动词> ;

[<表达式表>];

[<范围>] ;

[FOR<条件>];

[WHILE<条件>];

[TO FILE <文件名>/TO PRINTER/TO ARRAY; <数组名>/TO <内存变量>];

[ALL [LIKE/EXCEPT <通配符>]];

[IN <别名>]

可以将命令分为八个部分,即每个顶头行为一个部分


各部分的意义同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

命令动词:它是VFP的命令名,用来指示计算机要完成的操作 。

表达式表:用来指示计算机执行该命令所操作的结果参数。

范围:指定命令可以操作的记录集。范围有下列四种选择:

ALL 当前表中的全部记录。

NEXT <n> 从当前记录开始的连续N条记录。

RECORD <n> 当前表中的第N号记录。

REST 从当前记录开始到最后一条记录为止的所有记录。

FOR <条件>:它规定只对满足条件的记录进行操作 。

WHILE <条件>:从当前记录开始,按记录顺序从上向下处理,一旦遇到不满足条件的记录,就停止搜索并结束该命令的执行。

TO子句:它控制操作结果的输出去向。

ALL [LIKE/EXCEPT <通配符>]:它指出包括或不包括与通配符相匹配的文件、字段或内存变量。

IN <别名/工作区>: 它允许在当前工作区操作指定工作区。

返回


1.4.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表有关规则

1、命令动词必须是命令行的第一个非空字符,各子句可以以任意顺序跟在动词后面,命令动词与子句、子句与子句之间用一个或多个空格隔开,

2、命令动词和VFP保留字均可用前4个或4个以上字母简写。

3、命令行的总长度不得超过2048个字符(包括空格在内),若命令较长,在显示器上显示不下时,可以分几行写,但除最后一行以外,每行的未尾以“;”结束。

4、命令、关键字、变量名和文件名中的字母既可以大写也可以小写,还可以大写、小写混合,三者等效。

返回


1.4.3 VFP6同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表文件命名方法

文件名由主文件名和扩展名两部分组成。

主文件名最长由10个字符组成,可以包括字母、数字、下划线、连字符,但不能使用“*”、“?”、“/”等。但加入到了数据库中的表和字段名均支持长文件名,最长为128个字符。扩展名由“.”加3个字母组成,表示文件类型。

文件名中可以大、小写字母子混合使用

ABC_DE-f1

.DBF

主文件名

分隔符

扩展名

返回


命令、函数符号的约定同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

[]:其中的内容是可选项,不选时系统自动取缺省值。

<>:其中的内容是用户的选择项,通常有多种可能供用户选择一种。

/:为二选一表示符。要求用户从本符号的左右两项中选择一项。

…:省略符。它表示在一个命令或函数表达式中,某一部分可以按同一方式重复。

返回


小结同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

本章的重点是要掌握VFP6的一些基本概念:数据库、表、视图、数据模型、数据库管理系统、类和对象、关系模型、关系模式、关系、元组、属性、域、主关键字和外部关键字、投影、选择、联接、实体完整性、参照完整性、域完整性、常量和变量等。另一个重点是掌握VFP6的数据类型和主要文件类型、命令的基本构成格式、基本规则和VFP6文件的命名方法。这是学习后面章节基础的基础。

返回


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表2章 基本数据元素

学习要点

1、了解各种设计器

2、掌握内存变量的基本操作方法

3、表达式的构造方法

4、掌握运算符及其优先级

5、了解常用函数,掌握使用频度最高的函数

2.1 工作方式

2.2 常量与变量

2.3 表达式与运算符

2.4 常用函数

返 回

退 出


鼠标指向此菜单项同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

鼠标指向此菜单项

单击此菜单项

双击桌面快捷方式

2.1 工作方式

1、VFP6的特点

实现数据共享,减少数据冗余;采用特定的数据模型;具有较高的数据独立性;有统一的数据控制功能;加强了数据安全性和完整性的维护;具有交互式(命令方式、可视化操作)和程序运行方式。

2、Visual FoxPro 6.0 系统启动

方法三


双击同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

双击

双击

双击

双击

返回


3同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、VFP6的退出

进入到VFP6对数据库或表进行操作后,为了保证数据的安全,必须正确退出VFP6。退出VFP6前,应将所有打开的表全部关闭。可采用下述方法中的任何一种方法退出VFP6。

■在VFP6的系统菜单中选择【文件】|【退出】。

■在VFP6的命令窗口中输入Quit并按Enter键。

■单击VFP6系统主窗口右上角的“×”按钮。

4、各种设计器和向导

(1)设计器

Visual FoxPro提供了报表、标签、表单、表、菜单及快捷菜单、查询和视图、类、连接、数据环境、数据库等十多种设计器,每种设计器用于设计相应的对象。

(2)向导

VFP6提供了丰富的向导,可以帮助初学者快速创建各种对象。向导使用安装目录下的Wizard.app文件。


2.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表常量与变量

2.2.1 常量

常量:一个不变的数值或字符串。常量表达式中包括常量和操作符,但不包含变量,而且计算结果总是常值。Visual FoxPro支持多种类型的常量,如:数值常量、字符常量、日期常量、逻辑常量、货币常量、日期时间常量等。

2.2.2 变量

变量:是值可改变的量,指代计算机内存中的某一位置,其中可存放数据。变量分为字段变量和内存变量。

内存变量:是独立于数据库文件的临时存储单元,可以用来存放表操作过程中或程序运行过程中所要临时保存的数据。

字段变量:表中的每一个字段就是一个字段变量,字段名就是字段变量的变量名。字段变量的当前值等于表中当前记录该字段所对应的内容。


2.2.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数组

1、 数组与下标变量

下标变量:一组具有相同的变量名,而下标不同的变量。

数组:存储在一个变量中由单个变量名引用的有序数据集合。数组中的每一个元素都可以通过一个数值下标被引用。在 Visual FoxPro 中,一个数组中的数据不必是同一种数据类型。

下标变量

S1

S(1)

数组

变量名

下标

数组名

数组元素序号

说明:由若干单下标变量组成的数组称为一维数组,由若干双下标变量组成的数组称为二维数组。在Visual FoxPro 中,只允许使用一维数组或二维数组。


格式一同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

格式二

2、 定义数组

在使用数组时一定要先定义 ,有两条命令可以定义数组。

DIMENSION <数组名1>(<行>[,<列>])[,<数组名2> (<行>[,<列>])……]

DECLARE <数组名1>(<行>[,<列>])[,<数组名2> (<行>[,<列>])……]

功能:定义一个或多个一维或二维的内存变量数组。

参数描述:DIMENSION和DECLARE为定义数组的命令动词。

<数组名1>:指定数组的名称,其规定与内存变量名相同。

(<行>[,<列>]):定义数组的维数和大小 。

说明:1、数组的下标的起始值为1。

2、同一数组中的数组元素可以有不同的数据类型 。

3、二维数组中各元素按行的顺序依次排列 。


4同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、每个数组占用一个内存变量 。

5、除了可以分别对数组元素赋值以外,也可对数组中的所有元素赋同一初值。

6、DIMENSION和DECLARE功能完全相同,常用DIMENSION。

定义数组命令使用示例

DIMENSION <数组名1>(<行>[,<列>])[,<数组名2> (<行>[,<列>])……]

DIMENSION A ( 2 , 3 ), BB ( 4 , 8 )

定义数组: DIMENSION A(2,3),BB(4,8)

也可以一次只定义一个数组: DIMENSION A(2,3)

也可以只定义一维数组: DIMENSION A(6)


3同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、 数组元素的赋值操作

格式一

STORE <表达式> TO <数组名/数组元素>

命令动词

去向子句

包含值的表达式

接收值的数组名或元素

STORE 0 TO A 将数值0赋给数组A的所有元素

STORE "李磊" TO A(2,1) 将字符串“李磊”赋给数组A的第2行第1列的元素。

格式二

<数组名/数组元素>=<表达式>

接收值的数组名或元素

包含值的表达式

赋值操作符

A=.T. 将逻辑真值赋给数组A的所有元素


2.1 VFP同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表内存变量的基本操作

1、 对内存变量的赋值操作

内存变量的赋值操作和其它高级语言一样,必须先定义后使用

格式一

STORE <表达式> TO <内存变量名表>

命令动词

去向子句

包含值的表达式

接收值的变量名表

STORE 0 TO AA,BB,CC 将数值0赋给变量AA,BB,CC

STORE "李磊" TO NAME 将字符串“李磊”赋给NAME

<内存变量名>=<表达式>

格式二

接收值的变量名

包含值的表达式

赋值操作符

A=.T. 将逻辑真值赋给变量A


格式一同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

2 、显示内存变量

LIST MEMORY [LIKE<内存变量名框架>] [TO PRINTER[PROMPT]/TO FILE<文件名>] [NOCONSOLE]

功能:

显示当前在内存中定义的自定义内存变量和系统内存变量,以及自定义菜单和自定义窗口的有关信息。

参数描述:

LIST:为命令动词,表示此命令用以显示。

MEMORY:为子句,与LIST一起构成复合命令,表示此命令用以显示内存变量。

LIKE<内存变量名框架>:可以通过它有选择地显示内存变量和数组信息。

TO PRINTER[PROMPT]:将显示结果在打印机上输出。

TO FILE<文件名>:将显示结果输出到指定的文件中,该文件为文本文件。

NOCONSOLE:不在屏幕上显示 。


功能:同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

显示当前在内存中定义的自定义内存变量和系统内存变量,以及自定义菜单和自定义窗口的有关信息。

格式二

DISPLAY MEMORY [LIKE <内存变量框架名>] [TO PRINTER[PROMPT]/TO FILE<文件名>] [NOCONSOLE]

参数描述:DISPLAY:命令动词,表示分屏显示。

其它参数与LIST相同。

LIST MEMORY与DISPLAY MEMORY的区别

LIST MEMORY显示内存变量时不暂停,在屏幕上只保留最后一屏内存变量。

DISPLAY MEMORY在显示内存变量时,若内存变量数超过一屏,则在每显示一屏后暂停,按任意键后继续显示。


LIST MEMORY同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表与DISPLAY MEMORY命令示例

在命令窗口中执行下条命令:

LIST MEMORY

屏幕显示:

因为LIST MEMORY命令在不带任何参数时将显示所有内存变量(包括系统内存变量),本例需要多屏显示,因而在屏幕上只保留最后一屏的内容。


LIST MEMORY同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表与DISPLAY MEMORY命令示例

在命令窗口中执行下条命令:

DISPLAY MEMORY

屏幕显示:

因为DISPLAY MEMORY命令在不带任何参数时将分屏显示所有内存变量(包括系统内存变量)。此例中需要多屏显示,因而在屏幕会一屏一屏的显示内存变量。

右图是第一屏的内容。


3同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、 保存内存变量

SAVE TO <内存变量文件名>/ <MEMO 备注字段名>[ALL LIKE/ EXCEPT <内存变量名框架>]

命令格式

功能:它将内存中的部分或全部内存变量以文件的形式存入磁盘,文件名由<内存变量文件名>指定,文件扩展名的缺省值为 .MEM。

参数描述:SAVE:命令动词,表示保存内存变量。

<内存变量文件名>:指定保存内存变量和数组的内存变量文件。

<MEMO备注字段名>:指定保存内存变量和数组的备注字段。

ALL LIKE<内存变量名框架>]:将符合<内存变量名框架>的那些变量存入指定的文件。

ALL EXCEPT <内存变量名框架>]:将不符合<内存变量名框架>的那些变量存入指定的文件。


SAVE同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表命令示例

SAVE TO VAR1 将除系统内存变量以外所有内存变量保存到VAR1.MEM文件中。即:AA、BB、CC、NAME、A 。

SAVE TO VAR2 ALL LIKE ?A* 将第一个字符是任意字符,第二个字符是A的所有内存变量保存到VAR2.MEM文件中。即AA、NAME 。

SAVE TO VAR3 ALL EXCEPT ?A*将自定义内存变量中第二个字符不是A的所有内存变量保存到VAR2.MEM文件中。即BB、CC、A。


格式一同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

格式二

格式三

4、 删除内存变量

RELEASE <内存变量名表>

功能:删除指定的内存变量。当<内存变量名表>为多个变量时,变量名之间用“,”隔开。

RELEASE ALL [LIKE/EXCEPT <内存变量名框架>]

功能:删除指定的内存变量。省略所有选择项时,则删除所有的内存变量。

CLEAR MEMORY

功能:删除当前内存中的所有内存变量。它和RELEASE ALL的效果完全相同。

说明:参数与前述相同。


删除内存变量示例同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

在命令窗口中执行下列命令

RELEASE BB,CC

LIST MEMORY LIKE *

屏幕显示

在命令窗口中继续执行下列命令

RELEASE ALL LIKE ?A*

LIST MEMORY LIKE *

屏幕显示

在命令窗口中继续执行下列命令

RELEASE ALL

LIST MEMORY LIKE *

屏幕显示 (空)

返 回


5同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、恢复内存变量

如果需要使用已保存的内存变量时,可用下述命令恢复 :

格式:RESTORE FROM <内存变量文件名> [ADDITIVE]

功能:它将<内存变量文件名>指定的内存变量文件中所保存的内存变量从磁盘读回内存重新使用。

参数描述:

RESTORE:命令动词,表示执行恢复操作。

FROM <内存变量文件名> :指定恢复内存变量的来源。

[ADDITIVE]:保留当前内存中的内存变量,将指定文件中的内存变量添加到当前内存变量之后。 若省略ADDITIVE选择项,则内存中已有的内存变量全部释放,将指定文件中的内存变量调入内存 。


恢复内存变量示例同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

在命令窗口中继续执行下列命令

RESTORE FROM VAR1

LIST MEMORY LIKE *

屏幕显示

在命令窗口中继续执行下列命令

RESTORE FROM VAR2

LIST MEMORY LIKE *

屏幕显示

在命令窗口中继续执行下列命令

RESTORE FROM VAR3 ADDITIVE

LIST MEMORY LIKE *

屏幕显示

返 回


2.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表表达式与运算符

2.3.1 表达式的概念

2.3.2 运算符

2.3.3 运算符的优先级

返 回

退 出


格式一同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

格式二

2.3.1 表达式的概念

表达式: 由运算符和括号将常量、变量和函数连接起来的有意义的式子。

单个的常量、变量和函数都可以看作是最简单的表达式。

表达式按照运算结果的类型可以分为 四类

■ 字符型表达式(C) ■ 数值型表达式(N)

■ 逻辑型表达式(L) ■ 日期型表达式(D)

表达式显示命令

?<表达式列表>

??<表达式列表>

功能:计算表达式的值,并将其显示到屏幕上。

区别:?换行显示,??不换行显示 。

返 回


2.3.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表运算符

运算符:是对数据对象(操作数)进行操作运算的符号。

运算符以其结果的类型分组有如下五类

■算术运算符 ■关系运算符 ■逻辑运算符

■字符串运算符 ■日期运算符。

1、算术运算符

(1) +加号(N×N→N) (2) -减号(N×N→N)

(3) * 乘号(N×N→N) (4) /除号(N×N→N)

(5) ** 乘方(N×N→N) (6) ^ 乘方(N×N→N)

(7) %余数(N×N→N)

第1操作数类型

运算符

第2操作数类型

运算结果类型

返 回


关系运算符同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

关系运算符有如下十种:

(1) <小于 (N×N→L)(C×C→L)(D×D→L)

(2) >大于 (N×N→L)(C×C→L)(D×D→L)

(3) =等于 (N×N→L)(C×C→L)(D×D→L)

(4) <=小于或等于 (N×N→L)(C×C→L)(D×D→L)

(5) >=大于或等于 (N×N→L)(C×C→L)(D×D→L)

(6) <>不等于 (N×N→L)(C×C→L)(D×D→L)

(7) #不等于 (N×N→L)(C×C→L)(D×D→L)

(8) !=不等于 (N×N→L)(C×C→L)(D×D→L)

(9) $ 属于 (C×C→L)  

(10) ==精确等于 (C×C→L)

关系运算符两边的数据类型必须相同,不同类型的数据无法进行有意义的比较。

关系运算产生逻辑结果。即只能是逻辑“真”或逻辑“假”中的一种。


逻辑运算同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

逻辑运算符有下列几个:

(1) .NOT. 逻辑非(单边运算符) (L→L)

(2) ! 逻辑非(单边运算符) (L→L)

(3) .AND. 逻辑与 (L×L→L)

(4) .OR. 逻辑或 (L×L→L)

字符运算符

(1) +字符串精确连接 (C×C→C)

(2) -字符串非精确连接 (C×C→C)

日期运算符

(1) +加(D×N→D)(N×D→D)

(2) -减(D×D→N)(D×N→D)

说明:日期加上数值得到将来的日期;数值加上日期得到将来的日期;日期减去数值得到过去的日期;两日期相减得到两个日期相差的天数。

返 回


2.3.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表运算符的优先级

算术运算符 字符串运算符

一元运算符 “+”和“-”(正负号)

+和-(精确连接和非精确连接)

最高级

**或^(乘方)

日期运算符

*、/、和%(乘、除和余数)

+和-(加和减)

+和-(加和减)

逻辑运算符

关系运算符

次高级

.NOT.或!(逻辑非)

<、>、=、<=、>=、<>、#、!=、$、==

最低级

.AND.(逻辑与)

各运算符优先级相同

.OR.(逻辑或)

返 回


2.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表常用函数

2.4.1 数值运算函数

学习函数时不仅要记住函数的名称和功能,而且还要记住函数自变量的数据类型和函数值的数据类型,这样才能正确使用每一个函数。

2.4.2 字符处理函数

2.4.3 日期时间函数

2.4.4 转换函数

2.4.5 测试函数

2.4.6 其它函数

返 回

退 出


2.4.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数值运算函数

数值运算函数除特别说明的以外,其操作数为数值型,返回值的数据类型也为数值型。

1. 求绝对值函数

格式:ABS(<nExpression>)

功能:求<nExpression>的绝对值。

参数描述:<nExpression>指定需由ABS( )返回绝对值的数值表达式。

2. 正负号函数

格式:SIGN(<nExpression>)

功能:根据表达式的值大于、等于或小于零,函数值分别为1、0、–1。

参数描述:<nExpression>指定SIGN( )函数进行求值的数值表达式。如果求出的值是正数,则SIGN( )函数返回1;如果求出的值是负数,则返回–1;如果求出的值是0,则返回0。


3. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表取整函数

格式:INT(<nExpression>)

功能:将数值型表达式的值只取整数部分,舍掉小数部分。

参数描述:<nExpression>指定INT( )函数计算的数值表达式。

4. 平方根函数

格式:SQRT(<nExpression>)

功能:求数值型表达式值的平方根。函数的小数位与系统的小数位相同,或与数值型表达式中的小数位相同。

参数描述:<nExpression>指定由SQRT( )函数计算的数值表达式,其值不能为负数。

5. 指数函数

格式:EXP(<nExpression>)

功能:求以e为底,数值型表达式的值为指数的值。

参数描述:<nExpression>指定指数表达式中ex的指数x。


6. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表自然对数函数

格式:LOG(<nExpression>)

功能:求数值型表达式值的自然对数。它是EXP函数的逆运算。

参数描述:<nExpression>指定数值表达式。LOG( )函数返回ex=<nExpression>中x的值,<nExpression>必须大于0。

7. 常用对数函数

格式:LOG10(<nExpression>)

功能:求以10为底的数值型表达式的值。数值型表达式必须为正数。

参数描述:<nExpression>指定数值表达式。LOG10( )函数返回10x=<nExpression>中x的值,<nExpression>必须大于0。

8. 最小整数函数

格式:CEILING(<nExpression>)

功能:求大于或等于指定表达式的最小整数。

参数描述:<nExpression>指定CEILING( )函数返回其后续整数的数值。


9. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表最大整数函数

格式:FLOOR(<nExpression>)

功能:求小于或等于指定表达式值的最大整数。

参数描述:<nExpression>指定数值表达式。FLOOR( )函数返回小于或等于此表达式值的最大整数。

10. 最大值函数

格式:MAX(<eExpression1>,<eExpression2>[,<eExpression3>…])

功能:先计算表达式的值,然后取其中最大的值作为函数值。

参数描述:<eExpression1>,<eExpression2>[,<eExpression3>…]指定若干个表达式。MAX( )返回其中具有最大值的表达式,所有表达式必须为同一数据类型。

返回值类型:表达式的数据类型。

11. 最小值函数

格式:MIN(<eExpression1>,<eExpression2>[,<eExpression3>…])

功能:先计算表达式的值,然后取其中最小的作为函数值。

参数描述:同上

返值类型:同上


12. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表舍入函数

格式:ROUND(<nExpression1>,<nExpression2>)

功能:四舍五入运算

参数描述:<nExpression1>要舍入的数值表达式。<nExpression2>指定舍入到的小数位数。如果<nExpression2>的值是一个负数,则ROUND( )返回的结果在小数点左端包含<nExpression2>个零。例如,它的值为–2,则函数值舍入成整百的数,即小数点左端的第一个和第二个数字(个位和十位)均为0。

13. 随机函数

格式:RAND([<nExpression>])

功能:产生一个在(0,1)范围内取值的随机数。

参数描述:<nExpression>为指定的种子数,它指定RAND( )函数返回的数值序列。

14. 求值函数

格式:PI()

功能:返回π的常数数值。


15. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表求模函数

格式:MOD(<nExpression1>,<nExpression2>)

功能:求<nExpression1>除以<nExpression2>的余数。

参数描述:<nExpression1>指定被除数,它的小数位决定了返回值中的小数位。<nExpression2>指定除数。

说明:函数的值可以为正值也可以为负值,为了确保函数值的惟一性,函数值必须满足下列条件:

①函数值与<nExpression2>的值同为正数或同为负数;

②函数值的绝对值必须小于<nExpression2>的绝对值;

③取余函数MOD()和算子%返回同样的结果;

④ 当<nExpression1>与<nExpression2>异号时,可将<nExpression1>绝对值除以<nExpression2>绝对值后的余数再带上<nExpression1>的符号,然后与<nExpression2>求和即得其模。

示例:? MOD(132,11) 0

? MOD(132.45,11.56) 5.29

? MOD(-132.45,11.56) 6.27

? MOD(132.45,-11.56) -6.27

? MOD(-132.45,-11.56) -5.29


2.4.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字符处理函数

1. 宏代换函数

格式1:&<VarName>[.< cExpression>]

功能:以内存变量的值代替变量名。说明:

①使用&函数时,&与<VarName>间不能有空格;

②它是众多函数中惟一参数不带括号的函数;

③宏代换函数的作用范围是从符号&起,直到遇到一个“.”或空格字符为止。如果宏代换后的值要与其后面的字符串一起使用,则应在&<VarName>与其后的字符串之间插入一个圆点“.”。

示例:abcd=[Visual]

VisualFoxpro=[小型关系数据库]

Visual=123456789

?"&abcd.FoxPro" VisualFoxPro (C)

? &abcd.Foxpro 小型关系数据库 (C)

? Abcd 123456789 (N)


格式同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表2:(<VarName>)

功能:当要代换的内容是表名或是索引文件名时,可用( )函数代换&函数。

参数描述:<VarName>中所含的值为表名或为数据库文件名等名称。

示例:tableName=[Student]

use (tablename) &&将打开默认目录下的Student表

格式3:EVALUATE(<cExpression>)

功能:计算字符表达式的值并返回结果。

参数描述:<cExpression>指定要计算的字符表达

<cExpression>可以是原义字符串,也可以是引号括起的各种数据类型的有效VFP6表达式、内存变量、数组元素或字段。<cExpression>中的字符不能超过255个。只要可能,就应使用EVALUATE( )和名称表达式来代替&的宏代换,因为EVALUATE( )函数或名称表达式比宏代换的执行速度快。


2. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表子字符串检索函数

格式1:AT(<cSearchExpression>,<cExpressionSearched> [,<nOccurrence>])

功能:返回一个字符表达式或备注字段在另一个字符表达式或备注字段中第n次出现的位置,从最左边开始计数。

参数描述:<cSearchExpression>指定要搜索的字符或备注表达式,AT( )函数将在<cExpressionSearched>中搜索此字符表达式或备注字段值。<nOccurrence>指定搜索<cSearchExpression>在<cExpressionSearched>中第<nExpression>次出现。

说明:

①如果未指定<nOccurrence>,则返回第一次出现<cSearchExpression>的起始位置。

②如果<cExpressionSearched>不包含有<cSearchExpression>,或出现次数少于<nOccurrence>的值,则函数返回值为0。

③AT( )函数区分搜索字符的大小写,如果不区分搜索字符的大小写,应采用格式2的函数。

格式2:ATC(<cSearchExpression>,<cExpressionSearched> [,<nOccurrence>])


3. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表反向子串检索函数

格式:RAT(<cSearchExpression>,<cExpressionSearched> [,<nOccurrence>])

功能:与AT( )函数功能类似,它是从字符串最右边开始检索子字符串,返回<cSearchExpression>在<cExpressionSearched>内第<nOccurrence>次出现的位置,从最右边的位置算起。

说明:<nOccurrence>指定RAT( )在<cExpressionSearched>中从右向左搜索< cSearchExpression >的第<nOccurrence>次出现时的位置。默认<nExpression>=1。如果在<cExpressionSearched>中没有找到<cSearchExpression>,那么RAT( )函数返回0。

4. 反向子串检索函数

格式:RATC(<cSearchExpression>,<cExpressionSearched> [,<nOccurrence>])

功能:返回<cSearchExpression>在<cExpressionSearched>中从右边第<nOccurrence>次出现的位置,不区分字符的大小写。

说明:当<cExpressionSearched>中不包含<cSearchExpression>,或包含次数少于<nOccurrence>时,函数返回值为0。


5. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字符串截取函数

格式:SUBSTR(<cExpression>,<nStartPosition> [, <nCharactersReturned>])

功能:返回从<cExpression>中截取从第<nStartPosition>个字符开始的连续<nCharactersReturned>个字符所形成的一个新子字符串。

若省略<nCharactersReturned>,则截取的子字符串终止于字符串的最后一个字符。若<nCharactersReturned>大于起始位置到字符串的结束位置之间的字符个数时,则终止于字符串的最后一个字符。

6. 左子串截取函数

格式:LEFT(<cExpression>,<nExpression>)

功能:从<cExpression>中最左边第一个字符开始截取<nExpression>个字符,形成一个新的字符串。

参数描述:<cExpression>指定用于截取的字符表达式,LEFT( )函数从中返回一个字符串。<nExpression>指定从<cExpression>中返回的字符个数。如果<nExpression>的值大于或等于<cExpression>的长度,函数的值为整个字符串;如果<nExpression>的值小于或等于零,则函数的值为一个空串。LEFT()函数与起始位置为1的SUBSTR( )函数是等价的。


7. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表右子串截取函数

格式:RIGHT(<cExpression>,<nExpression>)

功能:从<cExpression>中最右边第一个字符开始截取<nExpression>个字符形成一个新的字符串。

参数描述:<cExpression>指定用于截取的字符表达式,LEFT( )从中返回一个字符串。<nExpression>指定从中<cExpression>返回的字符个数。如果<nExpression>的值大于或等于<cExpression>的长度,函数的值为整个字符串;如果<nExpression>的值小于或等于零,则函数的值为一个空串。

8. 删除字符串尾部空格函数

格式:TRIM(<cExpression>)

功能:返回删除全部后缀空格后的字符表达式。

参数描述:<cExpression>指定需要删除后缀空格的字符表达式。

说明:TRIM( )函数等同于RTRIM( )函数。

9. 删除字符串右边空格函数

格式:RTRIM(<cExpression>)

功能:删除字符串右边空格。RTRIM( )函数等同于TRIM( )函数。


10. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表删除字符串先导和尾部空格函数

格式:ALLTRIM(<cExpression>)

功能:删除<cExpression>值的先导和尾部空格。它等价于LTRIM (RTIMR(< cExpression>))。

说明:使用ALLTRIM( )函数能确保删除用户输入的数据首尾的空格字符。

11. 长度函数

格式:LEN(<cExpression>)

功能:求字符型表达式<cExpression>的长度,返回字符表达式中字符的数目。

12. 空格生成函数

格式:SPACE(<nExpression>)

功能:生成指定数目空格的字符串,其空格个数由<nExpression>的值确定。

13. 字符重复函数

格式:REPLICATE(<cExpression>,<nExpression>)

功能:它把<cExpression>的值重复<nExpression>次构成新的字符串。


14. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字符串替换函数

格式:STUFF(<cExpression>,<nStartReplacement>,<nCharacters-Replaced>, <cReplacement>)

功能:返回一个字符串,此字符串是通过用另一个表达式替换现有字符表达式中指定数目的字符得到的。

参数描述:<cExpression>指定要在其中替换的字符表达式。<nStartReplacement>在<cExpression>中开始替换的位置。<nCharactersReplaced>指定要替换的字符数目。如果数目是0,则替换字符串<cReplacement>插入到<cExpression>中。<cReplacement>指定用以替换的字符型表达式,如果该表达式是空串,则从<cExpression>中删除用<nCharactersReplaced>指定的字符数目。


2.4.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表日期、时间函数

1. 时间函数

格式:TIME([<nExpression>])

功能:以24小时制、8位字符串(时:分:秒)格式取得当前的系统时间。

参数描述:如果含有<nExpression>变量,则可以返回包括1/100 s的时间。<nExpression>可以是任何值,然而,实际的最大精度是1/18s。使用SECONDS( )函数可获得更高的精度。

2. 日期函数

格式:DATE( )

功能:返回由操作系统控制的当前系统日期。

3. 日月年函数

格式:DMY(<dExpression | tExpression>)

功能:返回一个“日.月.年”格式的字符表达式。其中日为2位,月为英文月份名称,年通常为2位。

参数描述:<dExpression>为日期型表达式。

<tExpression>为日期时间表达式。


4. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表月日年函数

格式:MDY(<dExpression | tExpression>)

功能:以“月.日.年”格式返回指定日期或日期时间表达式,其中月份名不缩写。如October 05 2000

5. 年函数

格式:YEAR(<dExpression>)

功能:从日期型表达式<dExpression>中求出年的数值。

说明:该函数总是返回带世纪的年份,CENTURY的设置对该函数没有影响。

6. 月份函数

格式:MONTH(<dExpression>)

功能:从日期型表达式<dExpression>中求出月的数值。

7. 日函数

格式:DAY(<dExpression>)

功能:以数值型返回给定的日期表达式<dExpression>是某月中的第几天。

说明:DAY( )函数返回1到31之间的一个数。


2.4.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表转换函数

1. 小写转换成大写函数

格式:UPPER(<cExpression>)

功能:用大写字母返回<cExpression>字符串表达式。

2. 大写转换成小写函数

格式:LOWER(<cExpression>)

功能:将<cExpression>中大写字母转换成小写字母。

3. 字的第一个字母转换成大写函数

格式:PROPER(<cExpression>)

功能:从<cExpression>中返回一个字符串,字符串的每个首字母大写,其它字母转换为小写字母。

4. 字符型转换为日期型函数

格式:CTOD(<cExpression>)

功能:将具有正确日期格式的字符型表达式<cExpression>转换成日期型表达式。


5. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表日期型转换为字符型函数

格式:DTOC(<dExpression | tExpression> [,1])

功能:由日期型表达式数据转换成字符型日期数据。

参数描述:<dExpression | tExpression>参数指定要转换成字符型日期数据的日期。[,1]:以适合作为索引的格式返回日期。

6. 数值型转换成字符型函数

格式:STR(<nExpression>[,<nLength>[,<nDecimalPlaces>]])

功能:返回与数值型表达式相对应的字符型串。

参数描述:<nExpression>指定用于转换数值表达式。

<nLength>指定要返回的字符串的长度,包括小数点和小数位在内。如果指定长度大于小数点左边数字位数与<nDecimalPlaces>之和,则该函数用前导空格填充返回的字符串;如果指定的长度小于小数点左边的数字位数,则该函数返回一串星号(*),“*”的长度等于给出的长度,表示数据溢出。<nDecimalPlaces>指定该函数返回的字符串中的小数位,若要指定小数位,则必须同时包含<nLength>。如果指定的小数位数小于<nExpression>中的小数位数,则返回四舍五入值。


7. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字符型转换成数值型函数

格式:VAL(<cExpression>)

功能:将数字组成的字符型表达式<cExpression>转换成为数值型值。

8. 字符转换成ASCII码值函数

格式:ASC(<cExpression>)

功能:求出<cExpression>最左边一个字符的ASCⅡ码的十进制码值。

9. ASCII码值转换成字符串函数

格式:CHR(<nExpression>)

功能:将<nExpression>的值转换成一个ASCⅡ码。数值型表达式的值必须是一个1~255之间的整数。

通常,可以借助数值7来响铃以引起注意。如输入下列命令:

? CHR(7)+"小心" &&输出时先响铃,然后在屏幕上显示“小心”


2.4.5 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表测试函数

1. 数据库函数

格式:DBC( )

功能:返回当前数据库的名称和路径。

2. 表文件函数

格式:DBF([<cTableAlias | nWorkArea>])

功能:求出指定工作区中打开的表文件名。

参数描述:<cTableAlias>参数指定表的别名。<nWorkArea>参数指定工作区的编号。

3. 表文件修改测试函数

格式:LUPDATE([<cTableAlias> | <nWorkArea>])

功能:返回指定工作区中表文件的最后修改日期。

参数描述:同上

4. 文件修改测试函数

格式:FDATE(<cFileName> [, <nType>])

功能:返回文件最近一次被修改的日期。

参数描述:<cFileName>指定要检测的文件名。<nType>的值为0或1,如果选择0或省略则返回日期型;否则返回日期时间型。


5. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字段数测试函数

格式:FCOUNT([<nWorkArea>|<cTableAlias>])

功能:返回指定工作区中表的字段数目。

参数描述:可选项指定要测试的表所在的工作区或表的别名。

说明:如果指定的工作区中没有打开的表,则该函数返回0;如果指定的别名不存在,则VFP6将产生错误信息。若省略选择项,则约定为当前工作区,该函数将返回当前工作区中表的字段数目。

6. 字段名函数

格式:FIELD(<nExpression>[,<nWorkArea>|<cTableAlias>])

功能:根据字段编号,返回指定表或指定工作区中表的字段名。

参数描述:<nExpression>指定字段的编号。编号按建立表结构的顺序编号。如果该参数大于字段的数目则返回空字符串。返回的字段名为大写字母。

<nWorkArea>|<cTableAlias>指定表所在的工作区或表的别名。

说明:如果指定的工作区中没打开的表,则该函数将返回一个空串;如果指定的别名不存在,则VFP6将产生错误信息。若省略选择项,则约定为当前工作区。


7. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字段宽度函数

格式:FSIZE(<cFieldName>[,<nWorkArea>|<cTableAlias>])

功能:以字节为单位返回指定工作区中指定字段的宽度。

参数描述:<cFieldName>参数指定要求其宽度的字段名。<nWorkArea>|<cTableAlias>表打开时所在的工作区或所取的别名。

8. 记录数测试函数

格式:RECCOUNT([<nWorkArea>|<cTableAlias>])

功能:返回当前或指定工作区中表的记录数。

参数描述:<nWorkArea>|<cTableAlias>指定要测试记录的表打开时所在的工作区或所取的别名。如果指定的工作区中没有打开的表,则该函数返回值为0;如果指定的别名不存在,VFP6将返回错误信息。

9. 记录长度测试函数

格式:RECSIZE([<nWorkArea>|<cTableAlias>])

功能:求指定工作区中表的记录长度。

参数描述:<nWorkArea>|<cTableAlias>指定要测试记录长度的表所在的工作区。


10. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表当前记录号测试函数

格式:RECNO([<nWorkArea>|<cTableAlias>])

功能:返回当前表或指定工作区中表的当前记录的记录号。

参数描述:<nWorkArea>|<cTableAlias>指定要测试的表打开时所在的工作区。

11. 文件起始测试函数

格式:BOF([<nWorkArea>|<cTableAlias>])

功能:测试指定工作区中的表的当前记录指针是否指向文件的起始位置(表头)。

参数描述:<nWorkArea>|<cTableAlias>指定在非当前工作区中打开的表的工作区号或指定非当前工作区中打开的表的别名。

12. 文件结束测试函数

格式:EOF([<nWorkArea>|<cTableAlias>])

功能:测试指定工作区中的表的记录指针是否指向文件的结束位置(表尾)。

参数描述:<nWorkArea>|<cTableAlias>指定在非当前工作区中打开的表的工作区号或指定非当前工作区中打开的表的别名。


13. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表记录删除测试函数

格式:DELETED([<nWorkArea>|<cTableAlias>])

功能:检测指定工作区中当前记录是否带有删除标记。若有,则函数值为.T.,否则为.F.。

参数描述:<nWorkArea>|<cTableAlias>参数指定工作区或别名。如果指定的工作区中没有打开的表,则DELETED( )函数返回.F.。

14. 查找测试函数

格式:FOUND([<nWorkArea>|<cTableAlias>])

功能:检测指定工作区中最后一个LOCATE、CONTINUE、FIND、SEEK命令是否查找成功。若成功,则函数值为.T.,否则,为.F.。

参数描述:<nWorkArea>|<cTableAlias>指定表所在的工作区或别名。

15. 别名测试函数

格式:ALIAS([<nWorkArea>|<cTableAlias>])

功能:求指定工作区中打开的表的别名。

参数描述:<nWorkArea>|<cTableAlias>指定非当前工作区的区号或指定非当前工作区中打开的表的别名。


16. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表工作区测试函数

格式:SELECT([0/1])

功能:返回当前工作区的编号或未使用的工作区的最大编号。

参数描述:0:指定该函数返回指定工作区的编号;1:指定该函数返回未使用的工作区的最大编号。

17. 数据类型测试函数

格式1:TYPE(<cExpression>)

功能:检测一个表达式的类型及有效性,并产生一个大写字母C(字符型)、N(数字型、浮点型、双精度型、整型)、L(逻辑型)、D(日期型)、M(明细型)、Y(货币型)、T(日期时间型)、O(对象型)、G(通用型)、S(屏幕型)、U(未定义型)。

格式2:VARTYPE(eExpression [, lNullDataType])

功能:返回一个表达式的数据类型。大写字母C(字符型或备注)、N、L、D、Y、T、O、G、X(Null型)、U。

TYPE()和VARTYPE()区别:TYPE()函数在检测一个表达式的数据类型时表达式必须作为字符串传递。VARTYPE()类似于TYPE()函数,但是VARTYPE()函数更快,而且其参数可以是任意类型的表达式,即表达式的外面不需要引号。


18. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表空串测试函数

格式:EMPTY(<eExpression>)

功能:确定表达式是否为空。

参数描述:<eExpression>指定用于测试的表达式。可以包含字符、数值、日期或逻辑表达式,也可以是已打开表的字段名称。如果表达式取值为空,则该函数返回.T.;否则,该函数返回.F.。

19. 空值测试函数

格式:ISNULL(<eExpression>)

功能:如果一个表达式的计算结果为Null值,则返回逻辑.T.;否则,为.F.。

参数描述:<eExpression>参数指定要计算的表达式。

20. 表达式空值测试函数

格式:ISBLANK(<eExpression>)

功能:判断表达式是否为空值。

参数描述:<eExpression>指定该函数要判断的表达式。该函数可以是一个字段、内存变量、数组元素,也可以是一个表达式。


21. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表字符串包含次数函数

格式:OCCURS(<cSearchExpression>,<cExpressionSearched >)

功能:返回字符表达式<cSearchExpression>在另一个字符表达式<cExpressionSearched >中出现的次数。

说明:如果在<cExpressionSearched>中没有找到<cSearchExpression>,则该函数返回0。

22. 文件测试函数

格式:FILE(<cFileName>)

功能:检测指定的文件是否存在。若存在,则函数值为.T.,否则为.F.。

参数描述:<cFileName>参数指定要查找的文件的名称,必须包含文件的扩展名。

说明:文件名必须用定界符括起来。若此文件名不在约定的驱动器或目录上,还需要附加此文件所在的驱动器或目录路径。

23. 字母测试函数

格式:ISALPHA(<cExpression>)

功能:检测字符型表达式<cExpression>的值是否以字母开头,若是,则函数值为.T.,否则,为.F.。


24. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表小写字母测试函数

格式:ISLOWER(<cExpression>)

功能:检测<cExpression>的值是否以小写字母开头,若是,则函数值为.T.,否则,为.F.。

25. 大写字母测试函数

格式:ISUPPER(<cExpression>)

功能:检测<cExpression>的值是否以大写字母开头,若是,则函数值为.T.,否则,为.F.。

26. 数字测试函数

格式:ISDIGIT(<cExpression>)

功能:如果<cExpression>的值是以数字(0~9)开头,则函数值为.T.,否则,为.F.。

27. 条件函数

格式:IIF(<lExpression>,<eExpression1>,<eExpression2>)

功能:根据<lExpression>的值,返回两个值中的某一个。

说明:如果<lExpression>为.T.,则函数值为<eExpression1>的值,否则,函数值为<eExpression2>的值。


28. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表值测试函数

格式:BETWEEN(<eTestValue>,<eLowValue>,<eHighValue>)

功能:判断表达式的值是否介于相同数据类型的两个表达式值之间。

说明:当<eTestValue>的值大于或等于<eLowValue>而小于或等于<eHighValue>时,该函数返回逻辑.T.,否则,返回逻辑.F.。如果<eLowValue>或<eHighValue>为Null值,则返回Null值。

2.4.6 其它函数

1. 判断指定工作区是否有表打开函数

格式:USED(<nWorkArea>|<cTableAlias>)

功能:确定是否在使用一个别名,或者是否在指定的工作区中打开了一个表。

参数描述:<nWorkArea>/<cTableAlias>指定表的工作区,如果不选择参数,则检查当前选定的工作区中是否有一个打开的表。如果包含一个表,那么当该别名指定的表已在一个工作区中打开时该函数返回.T.。


2. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表创建对象函数

格式:CREATEOBJECT(<ClassName>[,<eParameter1>,<ePara-meter2>…])

功能:从类定义或可用OLE应用程序中创建对象。

参数描述:<ClassName>指定用于创建新对象的类或OLE对象。

3. 执行父类的同名事件或方法程序函数

格式:DODEFAULT(<eParameter1>[,<eParameter2>]…)

功能:在子类中执行父类的同名事件或方法程序。

参数描述:<eParameter1>[,<eParameter2>]…传递给父类方法程序或事件的参数。

4. 错误消息函数

格式:MESSAGE([1])

功能:以字符串形式返回当前错误的消息,或者返回导致这个错误的程序行内容。


5. 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表对话框函数

格式:MESSAGEBOX(<cMessageText>[,<nDialogBoxType> [,<cTitle-BarText > ]])

功能:显示一个用户自定义对话框并返回用户选择结果。

例:执行命令mm=messagebox(“MESSAGEBOX()”+CHR(13)+“功能:显示一个用户自定义对话框。",3+64+256,"MessageBox()函数示例")后屏幕将显示一个对话框如下:

函数根据所按下的按钮返回一个数值:

确定-1、取消-2、放弃-3、重试-4、忽略-5、是-6、否-7


小 结同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

1、常量与变量。介绍了对内存变量的定义、赋值、显示、保存和恢复等基本操作;介绍了字段变量与数组元素之间的相互转换操作。内存变量是在VFP6中应用十分广泛的一种变量,应当牢牢掌握。

2、表达式与运算符,它们是VFP6中的基本构成元素。在这一节中学会构造表达式,同时要掌握各种运算符的使用方法,掌握运算符的优先级。它们是本章的重点。

2、函数是VFP6的一个重要组成部分,对于这些函数要掌握其使用方法。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表3章数据库的基本操作

学习要点

1、建立项目管理器、认识项目管理器;

2、建立数据库和表的基本方法;

3、表结构的基本处理方法;

4、记录的基本处理方法。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表3章数据库的基本操作

3.1 建立项目管理器

3.2 数据库设计方法

3.3 数据库的建立与维护

3.4 建立数据表

3.5 记录基本处理方法

3.6 数组与表的字段之间的相互数据传递

小结

返 回

退 出


3.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表建立项目管理器

3.1.1 项目管理器

3.1.2 用项目管理器构造可执行文件

3.1.3 添加文件到一个项目

3.1.4 生成应用程序

返 回

退 出


3.1.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表项目管理器

项目管理器是VFP应用程序开发过程中所有对象与数据的“控制中心(Control Center)”

项目管理器的创建方法 :

1、利用VFP系统菜单上的【文件】中的【新建】菜单项进行创建,并且可以使用创建项目管理器的向导。

2、在VFP的命令窗口中通过输入命令来创建项目管理器。

方法一:利用菜单创建项目Gxglxt。

方法二:利用命令创建项目管理器 :

格式一: CREATE PROJECT <项目文件名|?>

参数描述:<项目文件名>:指定项目的文件名。如果没有为文件指定扩展名,则VFP自动指定.PJX为扩展名。

<?> :打开“创建”对话框,提示为正在创建的项目文件命名。


项目管理器同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

【新建…】:创建新文件命令按钮。

折叠或展开项目管理器。

【添加…】:添加已存在的文件到项目管理器。

【移去…】:将所选择的文件移出项目文件或从磁盘上删除。

【修改…】:修改项目管理器中存在的文件。

【连编…】:建立应用程序(.APP)或可执行(.EXE)程序。

【运行…】或【打开】或【关闭】或【浏览】:运行“文档”、“代码”和“其它”选项卡中文件,打开、关闭数据选项卡中的数据库、表等,关闭(或称为折叠)项目文件中某一展开的选项卡显示。


单击折叠或展开按钮将项目管理器折叠 。同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

全部选项卡

从项目管理器中拖下后的“全部”选项卡。

从项目管理器中拖下后的“数据”选项卡。

从项目管理器中拖下后的“文档”选项卡。

从项目管理器中拖下后的“类”选项卡。

从项目管理器中拖下后的“其它”选项卡。

从项目管理器中拖下后的“代码”选项卡。

项目管理器

返 回


3.1.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表用项目管理器构造可执行文件

构造一个应用程序应注意以下问题:

1、首先应设置起始点

应用程序都应该有一个主文件作为其执行的起始点,它可以是包含在一个项目中的任何程序、表单或查询文件,然后从【项目】菜单中选择【设置主文件】来建立应用程序的起始点。在项目中,只有一个文件能设置成为主文件

建立一个主程序的一般步骤如下:

■安装应用程序的环境

■确定初始用户界面

■建立事件循环(Event loop)

■当应用程序退出时恢复环境。

【例3-1】主程序示例:

DO Setup &&安装环境

DO MainMenu.mpr &&调用主菜单显示初始用户界面

READ EVENTS &&建立事件循环

DO cleanup &&恢复环境

注意:在MainMenu.mpr中应加一个退出菜单项,以便发出CLEAR EVENTS命令防止死循环。


2同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、安装应用程序环境

在安装应用程序环境时应注意,在安装源程序中,应先将初始环境存贮起来,然后启动一个应用程序特定的环境,它包括初始化变量、建立默认路径、引用外部库(External library)和过程(procedure)文件等。

3 、显示初始界面

初始用户界面可以是一个开始屏幕、菜单栏、表单或者任何其它组件。可以在主程序中通过使用DO命令去运行一个菜单,或者通过DO FORM去运行一个表单,或者通过设置一个表单为主程序来初始化用户界面。

4、控制事件循环

一旦环境安装并且已经显示初始界面后,应该准备建立一个事件循环去等待用户交互。控制事件循环的方法是:发出READ EVENTS命令启动处理事件;发出CLEAR EVENTS命令去停止处理事件。

5、恢复原始环境

为了恢复存贮变量的原始值,可用宏替换它们进原始SET命令。例如,如果已在安装应用程序环境时已存贮SET TALK设置的内容进入了CtalkVal变量:

CtalkVal=SET (“Talk”)

如果在使用中改变了“TALK”的设置,当要恢复其初始设置时,则在恢复原始环境时可以用下一条命令去恢复:

SET TALK &CtalkVal

返 回


连编选项对话框同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

3.1.3 添加文件到一个项目

一旦建立了应用程序的框架后,便可以准备将其它文件添加到项目中 。添加文件到项目中一个好的方法是去连编此项目。

为添加一个文件到项目管理器中,也可以先在项目管理器中选择要添加的文件类别,在单击项目管理器中的【添加…】按钮。

若要连编 项目,可在项目管理器中设置主文件后再选择【连编】。

当向项目中添加组件时,应该重复项目的连编和运行。如果没有在“连编选项”对话框中的“操作”选项组中选择“重新编译所有文件”,那么,在连编时只编译自上次连编以后修改过的文件。

返 回


3.1.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表生成应用程序

要从项目管理器创建一个最终的文件,需要把它连编为一个应用程序文件或可执行文件。

连编应用程序步骤:

第1步:设置主文件;

第2步:在“项目管理器”中选择【连编】按钮;

第3步:在弹出的“连编选项”对话框中的“操作”选项组中选中“连编应用程序”单选项;

第4步:单击【确定】。

连编可执行文件步骤:

第1步:设置主文件;

第2步:在“项目管理器”中选择【连编】按钮;

第3步:在弹出的“连编选项”对话框中的“操作”选项组中选中 “连编可执行程序”单选框;

第4步:单击【确定】。

返 回


3.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据库设计方法

3.2.1 数据库设计步骤

3.2.2 数据需求分析

3.2.3 数据库表确定

3.2.4 数据库表字段确定

3.2.5 数据库表间关系设定

3.2.6 设计求精

返 回

退 出


3.2.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据库设计步骤

数据库设计步骤:

第1步:确定建立数据库的目的,这有助于确定需要VFP保存哪些信息;

第2步:确定需要的表;

在明确了建立数据库的目的之后,就可以着手把信息分成独立的主题,例如“Student”(学生情况)或“Grade”(学生成绩)等。每个主题都可以是数据库中的一个表。

第3步:确定所需字段;

确定在每个表中保存哪些信息。在表中,每类信息称为一个字段,浏览表时在表中显示为一列。例如,在Student表中,可以有这样的字段:“学号”、“姓名”、“性别”等。

第4步:确定关系;

分析每个表,确定一个表中的数据和其它表中的数据有何关系。必要时,可以在表中加入字段或创建一个新表来明确关系。

第5步:设计求精。对设计进一步分析,查找其中的错误。创建表时,在表中加入几个示例记录,看能否从表中得到所想要的结果。

返 回


3.2.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据需求分析

这一步是建立数据库的关键,也就是说必须清楚地了解最终的需求是什么?有一些什么样的信息要保存?以后需要如何对数据进行处理?等等

建立Gxglxt数据库需求分析

■首先列出需数据库回答的问题清单。如:本学期每个人每门课的期末考试成绩是多少?有哪些人的哪些课程不及格?哪些学生的学业成绩达到了获奖学金的标准?哪些学生在考试中哪门课程舞弊了?等等。

■其次收集所有的表单和报表。这些表单和报表包含了应该由数据库提供的各种信息。如期末考试成绩需要录入哪些信息等。

■最后,期末考试成绩册如何打印等等。

返 回


3.2.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据库表确定

确定数据库表是数据库设计过程中技巧性最强的一步。

应注意以下几个方面的问题:

■一个表只保存一个主题的内容;

■同一信息只保存一次,这将减少出错的可能性;

■防止删除有用信息。

以建立Gxglxt数据库中的表为例:

在学习成绩表中,每位学生所学的课程不属于一位学生,因而需要有一个学习课程表。同样,一个班级不只一名学生,要有一个班级主题的表等。

Student表和Grade表都与学生有关,但关于学生个人情况的信息保存在Student表中,Grade表中只保存与成绩有关的信息。

当一个班的学生毕业后,可能要删除这个班级,但不能删除这个专业,最好的方法是建立一个“专业(Specialty)”表。

返 回


3.2.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据库表字段确定

确定表字段的几点技巧:

■每个字段直接和表的主题相关 ;

■不要包含可推导得到或通过计算可以得到的字段 ;

■收集所需的全部信息 ;

■以最小的逻辑单位存储信息。

使用主关键字段

■ VFP不允许在主关键字中有重复值或null值。因此,不能选择包含有这类值的字段作为主关键字。

■因为要用主关键字的值来查找记录,所以它不能太长,以方便记忆和键入。主关键字可由一定长度的字母和数字组成,或是某一范围内的值。

■主关键字的长度直接影响数据库的操作速度,因此,在创建主关键字时,该字段值最好使用能满足存储要求的最小长度。

返 回


3.2.5 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据库表间关系设定

VFP是一个关系型数据库管理系统。在每个不同的表中存储的数据之间有一定的关系。通过在这些表之间定义关系后,可以利用这些关系来查找数据库中有关的信息。

表之间有三种关系:即一对一关系、一对多关系和多对多关系

■在一对一关系中 ①如果两个表有相同的主题,可在两个表中使用同样的主关键字字段,并以此建立一对一关系。②如果两个表有不同的主题及不同的主关键字,选择一个表(任意哪个表)把它的主关键字放到另一个表中作为外部关键字。

■在一对多关系中要建立这样的关系,就要把关系中“一方”的主关键字字段添加到“多方”的表中。在关系中,“一方”用主关键字或候选索引关键字,而“多方”使用普通索引关键字。

■在多对多关系中向VFP正确指定关系之前,需要改变数据库的设计,即创建第三个表,把多对多关系分解为二个一对多关系。这第三个表称作“纽带表”,纽带表可能只包含这两个表的主关键字,也可能包含其它信息。

返 回


3.2.6 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表设计求精

对所设计的表分析,查找是否存在如下问题:

■表中是否带有大量的并不属于这个主题的字段?

■表中是否有些字段由于对很多记录不适用而始终保持空白?

■是否有大量的表包含了同样的字段?

■是否遗忘了字段?是否有需要的信息没包括进去?如果有,它们是否属于已创建的表?如果不包含在已创建的表中,那就需要另外创建一个表。

■是否为每个表选择了合适的主关键字?在使用这个主关键字查找具体记录时,它是否很容易记忆和键入?

■是否有字段很多、记录却很少的表,而且许多记录中的字段值为空?

查找到存在的问题后,就要修改表的结构,以改进设计方案。

返 回


3.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据库的建立与维护

3.3.1 数据字典的作用

3.3.2 将表加入到数据库

返 回

退 出


3.3.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表数据字典的作用

■主关键字和候选索引关键字。

■数据库中表间的永久关系。

■长表名和长字段名。

■各字段的标题,日后它们作为标题头显示在“浏览”窗口和表格中。

■字段的默认值。

■表单中使用的默认控件类。

■字段的输入掩码和显示格式。

■字段级规则和记录级规则。

■触发器。

■存储过程。

■与远程数据源的连接。

■本地视图与远程视图。

■对每个字段、表和数据库的注释。

返 回


3.3.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表将表加入到数据库

1、创建数据库

2、将表加入到数据库

要将一个或多个表加入到数据库中时,可以在“项目管理器”中选择“数据”选项卡,再从列表中选择“数据库”项下的“表”,最后选择【添加】按钮。

要添加的表必须具备下列条件:

■该表是一个有效的.DBF文件;

■除非为表指定一个唯一的长文件名,否则表不允许与打开的数据库中已有的表同名。

■表不能同时放在另一个数据库中。

要加入表的数据库必须具备下列条件:

■必须以独占方式打开。要想独占地打开一个数据库,在使用OPEN DATABASE命令时加入EXCLUSIVE子句;

■不包含在事务中。

返 回


3.4 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表建立数据表

3.4.1 建立表前的准备

3.4.2 建立表基本结构

3.4.3表结构的基本处理方法

返 回

退 出


3.4.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表建立表前的准备

在建立表结构以前,首先应该根据用户的需求,明确所要创建的表中应该包含哪些字段,每个字段的名称、类型和宽度。

创建Gxglxt中的Student(学生情况)表

基本情况应包括:学号、姓名、性别、出生日期、班级、电话等内容 。结构如下:

返 回


3.4.2 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表建立表基本结构

使用命令建立表结构:

格式: CREATE <表文件名>

功能:建立一个表文件。说明:输入命令后,按Enter键,屏幕上会出现“表设计器”对话框,利用该对话框即可建立表的结构。

参数描述:<表文件名>指定要创建的表的名称。

说明:输入命令后,按Enter键,屏幕上会出现“表设计器”对话框,利用该对话框即可建立表的结构。

■建立表结构是指原来磁盘上没有这个表文件,通过CREATE命令的执行,在磁盘上建立起一个新的表文件,若定义了备注型字段,则同时建立了一个.FPT为扩展名的表备注文件。

■若在文件名前指定了驱动器标识符,则文件建立在指定的驱动器上,否则建立在当前驱动器上。

■不指定文件扩展名时,缺省扩展名为.DBF。


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表若磁盘上存在这个文件或文件重名,系统显示一个警告对话框,提示是否要改写表。如果需要改写,则选择【是】,否则选择【否】。

■不要用A-J单个字母作为表文件名,因为他们是专门用于工作区别名的。

使用命令创建Student.dbf示例:

使用菜单创建表

在VFP的系统菜单上单击【文件】|【新建】菜单项便可打开“新建”对话框(也可以利用键盘操作:先按Alt+F组合键,再按Ctrl+ N键,也可以直接按Ctrl+N键)。在“新建”对话框中,选择“表”单选项,然后再单击【新建文件】按钮进入到的“打开”对话框。在这个对话框中首先是(关键也是)选择一个表,或为表新取一个文件名,然后按【保存】按钮, VFP会进入“表设计器”。

进入表设计器后的操作与上相同。

使用菜单创建表示例


使用项目管理器创建表结构同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

在项目管理器的“数据”选项卡中选择“表”,然后单击【新建】|【新建表】按钮。在出现的“创建”对话框中输入所要创建的表的文件名,并选择存储路径,然后选择【保存】,将打开表设计器。

使用项目管理器创建表结构示例

显示格式:指定字段值显示时的格式。

显示输入掩码:指定字段值在输入时的格式。

显示标题:指定字段名在显示时所用的字符串。

字段有效规则:指定字段在进行结构修改时应该满足的条件。

字段有效性信息:指定字段在结构修改时提示字段级规则的信息。

字段有效性默认值:为字段指定默认值。

记录有效性规则:指定在输入记录时所输入的数据应满足的条件。

记录有效性信息:当输入的数据不满足条件而又试图将数据保存时所出现的提示信息。

返 回


3.4.3 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表表结构的基本处理方法

1、显示表结构

格式一:LIST STRUCTURE [TO PRINTER[PROMPT] /TO FILE<文本文件名>]

格式二:DISPLAY STRUCTURE [TO PRINTER[PROMPT] /TO FILE<文本文件名>]

功能:显示当前表结构的有关信息。包括表文件名、记录个数、最后一次修改日期、各字段的字段号、字段名、类型、宽度和小数位,一条记录的字节总数。

参数说明:

[TO PRINTER]子句表示将操作结果送到打印机。后面可以接[PROMPT]参数,这一参数的在执行打印命令之前,先打开“打印设置”对话框,用以对打印机有关参数(如纸张大小、打印范围等)进行设置。[PROMPT]参数只能紧接TO PRINTER命令。

[TO FILE]子句表示将操作结果输出到指定的磁盘文件中。


LIST STRUCTURE同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表和DISPLAY STRUCTURE命令的区别

DISPLAY STRUCTURE在每显示一屏信息后暂停,等待用户按任意一键后继续显示;

LIST STRUCTURE显示信息时没有周期性暂停,而是连续向下显示,直到显示完毕。

显示Student表的结构

USE Student

LIST STRUCTURE

执行上面的命令后,屏幕显示如下:


2同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、 修改表文件的结构

格式:MODIFY STRUCTURE

功能:显示表设计器,修改当前表文件的结构。

说明:如果没有在当前选定工件区打开表,则显示“打开”对话框,允许用户从中选择一个要修改的表。

对表结构的更改包括:添加和删除字段;修改字段名称、大小和数据类型;添加、删除或修改索引标识,以及指定是否支持NULL值等。

(1)、删除字段

第一步:将光标移到要删字段的任一位置或单击该字段的任意位置;

第二步:按Ctrl+D删除该字段或单击【删除】命令按钮;

第三步:按Ctrl+W或单击【确定】按钮存盘,返回命令窗口。

说明:若删除了某些字段,对应字段的内容也丢失。


(2)同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、插入新字段

第一步:将光标移到要插入字段的下一行的任一位置或单击要插入字段的下一字段;

第二步:按Ctrl+I或单击【插入】按钮,便可插入一个新的空字段,在空字段的位置上可以填入新字段名称、类型、宽度及小数位。

第三步:按Ctrl+W或单击【确定】按钮存盘,返回命令窗口。

(3)、修改字段名、宽度、类型和小数位

将光标移到要修改处直接进行修改。

①一个字段有四个结构参数项,每次只能修改其中的一项。如果需要修改其中的多项,为了不丢失数据,应分为多次进行修改,每次修改存盘后继续修改,直到结束。

②修改字段类型时,可能造成数据丢失。

③无论进行何种修改,退出MODIFY STRUCTURE命令的方法与退出CREATE命令环境的方法相同。


3同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表、复制表结构

格式:COPY STRUCTURE TO <表文件名> [FIELDS <字段名表>]

功能:将当前打开的表文件结构的部分或全部复制为<表文件名>所指定的一个表的结构。

参数描述:

<表文件名>:指定生成新表结构的表文件名。

FIELDS <字段名表>:指定在新表中包含的字段及顺序。

说明:复制生成的表文件中的结构部分包含哪些字段,以及字段先后顺序都由FIELDS <字段名表>所规定。若省略该子句,则按字段原来的顺序复制全部字段。

4、建立表结构的其它方法

(1)生成表结构文件

格式:COPY STRUCTURE TO <表结构文件名> EXTENDED


功能:同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表它将当前表的结构复制生成一个特殊的表文件,即表结构伸展文件。

将Student的结构复制生成一个表结构文件studstr,然后用显示其结构

USE Student

COPY STRUCTURE TO studstr EXTENDED

USE studstr

LIST STRUCTURE


同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表2)将表结构文件还原成表结构

格式:CREATE <表文件名> FROM <表结构文件>

功能:将表结构文件还原成为普通表文件。新建的表文件是一个只有结构部分而没有记录的表结构框架。

将上例中的studstr表结构文件还原生成一个新的表文件Student1

CREATE Student1 FROM studstr

USE Student1

LIST STRUCTURE

返 回


3.5 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表记录基本处理方法

3.5.1 表的打开与关闭

3.5.2 录入记录

3.5.3 记录指针定位

3.5.4 在表中插入记录

3.5.5 显示表中的记录

3.5.6 修改表中的记录

3.5.7 删除记录

返 回

退 出


3.5.1 同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表表的打开与关闭

使用任何一个表以前,都必须首先打开表。

格式:USE [<表文件名>] [EXCLUSIVE] [SHARED]

功能:打开指定的表文件。

参数描述:

<表文件名>:指定要打开的表的名称。

[EXCLUSIVE]:在网络上以独占的方式打开表。

[SHARED]:在网络上以共享的方式打开表。

■打开表时若表含有备注型字段,则FPT文件也同时被打开。

■每个表被打开时均赋于一个别名。若省略ALIAS<别名>,则其别名与主文件名相同。

■若不选择任何参数,表示关闭当前工作区中已打开的表。

■在任一时刻,每个工作区最多允许打开一个表。如果指定工作区已有表打开,在打开新的表时,系统总是先自动关闭原来打


打开的表。同时涉及两个方向关系时可采用线性表结构。例如,作如下设计:在前面所举各表基础上增加课程表包括课程号、课程名、开课单位等,结构如表

■打开表时,记录指针指向第一条记录。

返 回

3.5.2 录入记录

表的数据录入有多种方法:第一种方法是在表结构建立时录入数据;第二种方法是在表结构建成并存盘关闭了“表设计器”之后,利用命令向表中追加记录。

格式:APPEND [BLANK]

参数描述:

[BLANK]:在当前表的末尾添加一条空记录。

功能:在表的末尾添加一个或多个新记录。

说明:

■可以在只有表结构而没有记录的空表中添加记录,也可以在已经录入数据的表中的尾部追加记录;

■它可以向当前表的尾部追加一条或多条新记录。省略可选项,


则在当前表的尾部追加任意新记录,追加记录的方法及操作与用则在当前表的尾部追加任意新记录,追加记录的方法及操作与用CREATE命令建立表时输入数据的方法相同;

■当发出APPEND或APPEND BLANK命令,并且在选定工作区中没有打开的表时,将显示一个“打开”对话框,我们可以在对话框中选择一个要添加记录的表。APPEND命令打开一个编辑窗口,我们可以在其中输入一个或多个新记录。增加新记录后,VFP将自动修改打开的所有索引。

打开浏览窗口后通过追加方式添加记录

方法:在项目管理器中选定一个要添加记录的表,然后单击【浏览】,然后在系统菜单中选择【显示】|【追加方式】。

添加记录的数据

返 回


3.5.3 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用记录指针定位

记录定位就是将记录指针移到指定的记录上,记录指针指向的记录称为当前记录。VFP提供了下列绝对定位和相对定位两类命令。

1、记录指针的绝对定位

格式一:GOTO [RECORD <数值表达式> ] /TOP/BOTTOM

格式二:GO [RECORD <数值表达式> ] /TOP/BOTTOM

格式三:<数值表达式>

功能:将记录指针直接定位到指定的记录上。

参数描述:

<数值表达式>:指定一个物理记录号,记录指针移至该记录上。

TOP:将记录指针定位在表的第一个记录上。

[BOTTOM]:将记录指针定位在表的最后一个记录上。

说明:RECORD可省略。<数值表达式>的值必须大于0,且不大于当前表文件的记录个数。


2则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、记录指针的相对定位

相对定位与当前记录有关,它是把记录指针从当前位置作相对移动。

格式:SKIP [<数值表达式>]

功能:将记录指针向前或向后作相对若干条记录的移动。

参数描述:

<数值表达式>:指定记录指针作相对移动的记录数据。

说明:

1、移动的记录数等于<数值表达式>的值,其值为正数时,记录指针向下移动,当<数值表达式>是负数时,记录指针向上移动。

2、省略选择项<数值表达式>,约定为向下移动一条记录,即SKIP 等价于SKIP 1。

返 回


3.5.4 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用在表中插入记录

1、INSRET命令

格式:INSERT [BLANK] [BEFORE]

功能:在当前记录之前或之后插入一条或多条新记录。

参数描述:

选择[BEFORE]子句,新记录插在当前记录之前,当前记录和其后的记录向后顺序移动;否则插在当前记录之后,当前记录之后的记录顺序向后移动。

选择[BLANK]子句,则插入一条空记录。

说明:

1、省略所有可选项,则在当前记录之后插入新记录。

2、在VFP中,如果数据库具有表缓冲或行缓冲功能,则INSERT命令不能用于该数据库的表;对于具有参照完整性规则的表也不能使用INSERT命令 。


2则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、INSERT——SQL命令

格式一:INSERT INTO <表文件名>[(<字段名1> [,<字段名2>…])] VALUES (<表达式1>[,<表达式2>…])

格式二:INSERT INTO <表文件名> FROM ARRAY <数组名>/ FROM MEMVAR

功能:在表尾追加一个包含指定字段值的记录。

参数描述:

<表文件名>:指定要追加记录的表文件名。<表文件名>中可以包含路径,也可以是一个名称表达式。

[(<字段名1> [,<字段名2>…])]:指定要插入值的字段名。

[VALUES (<表达式1>[,<表达式2>…])]:新插入记录的字段值。

[FROM ARRAY <数组名>]:指定一个数组,数组中的数据将被插入到新记录中。

FROM MEMVAR:把内存变量的内容插入到与它同名的字段中。

说明:


1则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、如果<表文件名>指定的表没有打开,则VFP先在一个新工作区中以独占方式打开该表,然后再把新记录追加到表中,此时并未选定该工作区,选定的仍然是当前的工作区。

2、如果省略了VALUES子句后的字段名,那么,必须按照定义表结构时的顺序来指定字段值。

3、使用FROM ARRAY <数组名>子句时,从<数组名>指定数组的第一个数组元素开始,数组中的每一个元素的内容依次插入到新记录的对应字段中。第一个数组元素的内容插入到新记录的第一个字段,第二个元素的内容插入到新记录的第二个字段,依此类推。

4、当使用FROM MEMVAR子句时,如果某一字段不存在同名的内存变量,则该字段为空。

使用INSERT­——SQL命令向Student表中追加一条新记录


INSERT INTO Student(则在当前表的尾部追加任意新记录,追加记录的方法及操作与用学号,姓名,性别,出生日期,班级,宿舍,;

电话) VALUES("99045002","张中强","男",{^1980/03/22},;

"99电子","3-311","2356306")

3、从另一个表中成批追加记录

格式:APPEND FROM <表文件名>/? [FIELDS <字段列表>] [FOR <条件>]

功能:从一个表中读入记录,追加到当前表的尾部。

参数描述:

<表文件名>:指定要向当前表中追加记录的数据源。

[<?>]:显示“打开”对话框,从中选择从哪个表中读入数据。

[FIELDS <字段列表> ]:指定添加哪些字段数据。

[FOR <条件>]:为当前选定表中每一条<条件>为“真”的记录追加新记录,直至达到当前选定表的末尾。如果省略FOR子句,则整个源文件记录都追加到当前表中。

返 回


3.5.5 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用显示表中的记录

格式一:LIST [OFF] [FIELDS <字段名列表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO PRINTER [PROMPT] / TO FILE <文本文件名>]

格式二:DISPLAY [OFF] [FIELDS <字段名列表>] [<范围>] [FOR <条件>] [WHILE <条件>] [TO PRINTER [PROMPT] / TO FILE <文本文件名>]

功能:显示当前表中的全部或部分记录和数据。

参数描述:

[OFF]:使用OFF时,不显示记录号,否则显示记录号。

[<范围>]:范围为可选项,选择时为ALL、RECORD(N)、 [ NEXT(N)、REST中的一个参数,表示记录显示的范围。

FIELDS <字段名列表>:若省略<字段名表列>,则显示当前表中的所有字段,否则显示指定的字段。如果备注字段名出现在<字段名表列>中,则它的内容按50个字符列宽显示,


[FOR<则在当前表的尾部追加任意新记录,追加记录的方法及操作与用条件>/WHILE<条件>]:该子句用于有选择地显示某些记录,省略时则显示<范围>限定的全部记录。

[TO PRINTER [PROMPT] / TO FILE <文本文件名>]:指定记录列表的输出方向。TO PRINTER [PROMPT]指定输出到打印机。[PROMPT]参数的使用方法同前。TO FILE <文本文件名>指定输出到所指定的文本文件中。

LIST和DISPLAY的区别:

(1)DISPLAY每显示一屏记录时暂停一次,按任意键后继续显示剩余的记录,而LIST没有周期性暂停,连续向下显示,直到记录显示完毕为止。

(2)若省略所有可选项,则DISPLAY命令显示当前记录,即范围为NEXT 1,而LIST命令显示全部记录,即范围为ALL。

返 回


第一步:在项目管理器中选择则在当前表的尾部追加任意新记录,追加记录的方法及操作与用【数据】选项卡

第三步:单击项目管理器中的【浏览】按钮

第二步:在数据库中选择一个表

3.5.6 修改表中的记录

1、全屏幕编辑命令

(1)利用菜单浏览和修改表中的数据


VFP则在当前表的尾部追加任意新记录,追加记录的方法及操作与用系统打开全屏幕浏览窗口

关闭按钮

记录标志位

当前记录标志

删除标志位

第四步:在浏览窗口中修改数据

第五步:修改结束后单击关闭按钮关闭浏览窗口

在浏览窗口中可以去除、恢复垂直分隔线,也可以改变字段的显示宽度。


则在当前表的尾部追加任意新记录,追加记录的方法及操作与用2)利用命令浏览和修改表中的数据

格式:BROWSE [FIELDS <字段名表>] [LOCK <数据型表达式>] [LAST] [FOR <逻辑型表达式>]

功能:在屏幕上打开一个浏览窗口,在窗口中显示表的记录。

参数描述:

[Fields<字段名表>]: 指定在浏览窗口中显示的表的字段。

LOCK <数据型表达式>:将浏览窗口一分为二,指定在左窗口中显示的字段数。

LAST:按最后一次关闭浏览窗口的方式打开浏览窗口。

FOR <逻辑型表达式>:指定在浏览窗口中显示的记录所要求满足的条件。

说明:

1、BROWSE命令可以带有很多任选项,命令格式中只介绍了BROWSE命令的最基本的任选项。


当执行上述命令后屏幕显示结果则在当前表的尾部追加任意新记录,追加记录的方法及操作与用

2、在<字段名表>中,除了可以使用表所定义的字段以外,还可以使用计算字段。

计算字段:就是由表中的字段组合成的合法的VFP的表达式。

注意:计算字段的名称不能与当前表中的字段名同名,长度不能超过10个字符。计算字段是只读的,它的值随着组成计算字段的表中的字段值的变化而变化。

计算字段的格式为:<计算字段名>=<表达式>

BROWSE FIELDS NAME_BIRTH=姓名+":"+性别+":"+DTOC(出生日期)+"出生"


在计算字段后面使用则在当前表的尾部追加任意新记录,追加记录的方法及操作与用:H参数,窗口中显示中文字段名

BROWSE FIELDS NAME_BIRTH=姓名+":"+性别+":"+ ; DTOC(出生日期)+"出生":H="姓名和出生日期" ,宿舍,电话

指定中文字段名

执行上述命令后,屏幕显示结果

计算字段指定的中文名

计算字段的值


2则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、记录值替换命令

格式:REPLACE <字段名1> [ADDITIVE] [,<字段名2> WITH <表达式2> [ADDITIVE]…] [<范围>] [FOR <条件>] [WHILE <条件>]

功能:不进入全屏幕编辑方式,根据命令中指定的条件和范围,用表达式的值去更新指定字段的内容。

参数描述:

<字段名1>: 指定要替换值的字段。

WITH <表达式1> :指定用来进行替换的表达式或值。

<范围>:指定进行替换时的记录范围。

FOR <条件> :指定要进行替换字段值的记录应满足的条件。

WHILE <条件>:当记录的条件不满足时结束替换。用以按条件中的字段建立了索引的表。

说明:

WITH后面的表达式的类型必须与WITH前面的字段类型一致 。

返 回


3.5.7 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用删除记录

在VFP中删除记录是分为两步来进行的,第一步是将要删除的记录做上删除标记,第二步才是将记录真正从表是彻底删除。

1、逻辑删除(为记录做上删除标记)

格式:DELETE [<范围>] [FOR <条件>] [WHILE <条件>]

功能:对当前表文件中指定的记录做删除标记。

GO 7

DELETE

GO 4

DELETE NEXT 3

LIST

执行上述命令后屏幕显示结果:


2则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、物理删除(清除带有删除标记的记录)

格式:PACK [DBF] [MEMO]

功能:省略选择项,该命令将从当前表中删除所有带删除标记的记录。选择DBF,表示仅清除逻辑删除的记录而不压缩备注文件,选择MEMO表示仅压缩备注文件中无用的空间而不清除被逻辑删除的记录。不带任何选择项时,PACK命令既清除逻辑删除的记录,又压缩备注文件。

说明:用PACK命令删除的记录是不可被恢复的。所以在使用PACK命令前一定要检查删除标记是否加的正确。

执行上述命令后屏幕显示的结果:

例:

PACK

LIST

注意:在进行这一步操作前先备份数据


3则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、 恢复带删除标记的记录

格式:RECALL [<范围>] [FOR <条件>] [WHILE <条件>]

功能:恢复当前表中带删除标记的记录,即去掉删除标记“*”号。当省略所有的选项时,仅恢复当前记录。

(先从备份的数据中恢复Student表中的数据)

RECALL ALL

BROW

执行上述命令后屏幕显示的结果

4、 清除所有记录

格式:ZAP

功能:从当前表中清除全部记录,仅保留表的结构。

ZAP命令与DELETE ALL 和PACK两条命令执行的结果相同,区别在于ZAP执行的速度更快,当表中的记录很多时尤为明显。

返 回


3.6 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用数组与表的字段之间的相互数据传递

1、单条记录数据赋值给数组元素

格式:SCATTER [FIELDS <字段名表>/FIELDS LIKE <框架>/FIELDS EXCEPT <框架>] [MEMO] TO <数组名>/ TO <数组名> BLANK/MEMVAR/NAME <对象名>

功能:将字段名表中的第一个字段值赋值给第一个数组元素,第二个字段值赋值给第二个数组元素,其余类推。或将字段名表中的内容复制到内存变量中。

示例:scatter fields student_id,name,sex,classes to abc

list memory like *


2则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、数组元素的值替代单条记录字段值

格式:GATHER FROM [<数组名>/<MEMVAR>]/[<NAME 对象名>] [FIELDS <字段名表>/ FIELDS LIKE <框架>/FIELDS EXCEPT <框架>]

功能:将数组各元素的值一一替换字段名表中对应的字段值。

从数组的第一个元素起,各个元素的内容依次替换记录中相应字段的内容。第一个数组元素的内容替换记录第一个字段的内容,第二个数组元素的内容替换记录第二个字段的内容,依次类推。

例:dime aa(7)

aa(1)="1999045003"

aa(2)="田心怡"

aa(3)=“99电子”

append blank

Gather from aa fields Student_id,name,classes

注意:本命令是修改当前记录


3则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、多条记录数据复制到数组中

格式:COPY TO ARRAY <数组> [FIELDS <字段表>] [<范围>] [FOR <条件>] [WHILE <条件>][NOOPTIMIZE]

功能:此命令在当前工作区打开的表中顺序查找满足指定条件的记录,如果查找到,则将该记录的第一个字段的数据存放到数组的第一行第一列中,第二个字段的数据存放到数组的第一行第二列中,依此类推;接着继续查找下一条满足条件的记录,如果查找到,则将该记录的第一个字段的数据存放到数组的第二行第一列中,第二个字段的数据存放到数组的第二行第二列中……,重复上述过程,直到再没有满足条件的记录或没有更多的数组元素为止。

功能和SCATTER相似,只不过本命令可以一次将多条记录的数据复制到数组中去。


4则在当前表的尾部追加任意新记录,追加记录的方法及操作与用、数组数据作为多条记录追加到表中

格式:APPEND FROM ARRAY <数组> [FOR <条件>] FIELDS <字段名表>

功能:此命令将指定数组的每一行元素变为一条新的记录,追加到当前表中。第1列追加到第一个字段中,第二列追加到第二个字字段中,依此类推。

说明:

■此命令将忽略M型字段。

■如果未指定FIELDS <字段表>,则按字段的物理顺序追加数组元素中的数据,否则按<字段名表>中指定的顺序追加数组元素中的数据,并且未在<字段名表>中指定的字段赋值给“空值”。

■执行此命令时,如果数组的列数多于表文件中的字段数,则超出的数组元素将被忽略;如果数组的列数少于表文件中的字段数,则超出的字段赋值给“空值”,在这些字段上EMPTY()函数返回逻辑(.T.)值。

■执行此命令时,如果出现数组元素与它相应字段的数据类型不一致时,系统尽量进行转换;当不能转换时,系统赋值给字段为“空值”。


小结 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用

1、可以用菜单方式和命令方式CREATE PROJECT创建项目管理器。

2、在项目管理器中通过【连编】,可以创建应用程序和可执行文件。

3、加入项目管理器的表可以享受“数据字典”的功能。

4、创建一个数据库可以分为五步:确定建立数据库的目的;确定需要的表;确定每个表所需字段;确定表间的关系关系;设计求精。

5、建立表前要做好准备,将每个表的字段名、类型、宽度、小数位、等以表格的形式进入充分的描述。

6、可以通过项目管理器和使用CREATE命令建立表,也可以通过COPY STRUCTURE命令从其它表中复制表结构,还可以使用CREATE带FROM子句从一个表结构文件中得到表结构。

7、一个表由表结构和数据构成,没有数据的表是没有意义的。表结构可以通过项目管理器和MODIFY STRUCTURE命令打开表设计器进行修改。

8、表在使用前要先打开,表中的记录可以用APPEND、INSERT INTO等命令进行追加,也可以使用DELETE命令进行删除,还可以使用BROWSE命令打开全屏幕编辑窗口进行修改和浏览,可以用REPLACE命令替换数据。

9、从表中提取数据时,要对表中的记录进行定位。

返 回


则在当前表的尾部追加任意新记录,追加记录的方法及操作与用4章数据处理与SQL

学习要点

1、数据的分类和索引;

2、记录的查找定位;

3、数据的统计和计算;

4、多工作区操作。

5、SQL语句


则在当前表的尾部追加任意新记录,追加记录的方法及操作与用4章 数据处理与SQL

4.1 数据分类排序

4.2 数据的索引

4.3 数据的查询

4.4 数据的统计

4.5 多工作区操作

4.6 关系型数据库标准语言SQL

小 结

返回

退出


4.1 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用数据分类排序

分类:将关键字段值相同的记录按顺序存放在一起,生成一个新的表文件。

格式:SORT TO <表文件名> ON <字段名1> [/A | /D] [/C] [,<字段名2> [/A | /D] [/C] ...] [ASCENDING|DESCENDING] [<范围>] [FOR <逻辑表达式>] [WHILE <逻辑表达式>] [FIELDS <字段名列表> | FIELDS LIKE <框架> | FIELDS EXCEPT <框架>]

功能:对当前选定的表排序,并将排序后的记录输出到新表中。参数描述:

<表文件名>:指定经过排序后所生成的新表的表文件名。

ON <字段名1>:在当前选定的、要排序的表中指定关键字段,字段的内容和数据类型决定了记录在新表中的顺序。

[/A | /D] [/C]:指定排序顺序(升序或降序)。/A指定为按升序排序,/D指定按降序排序。如果在字符型字段名后面包含/C,则忽略大小写。可以把/C选项与/A或/D选项组合起来。

返 回


[ASCENDING]则在当前表的尾部追加任意新记录,追加记录的方法及操作与用:将所有不带/D的字段指定为升序排列。

[DESCENDING]:将所有不带/A的字段指定为降序排列。如果省略ASCENDING 和DESCENDING参数,则排序默认为升序。

[<范围>]:指定需要排序记录的范围。默认范围为ALL。

[FOR <逻辑表达式>] :在当前表中指定排序中只包含逻辑条件为“真”的记录。

[WHILE <逻辑表达式>]:指定一个条件,在当前表中只要<逻辑表达式>的计算值为“真”,则依据此条件,排序中包含这条记录。

[FIELDS <字段名列表>]:指定用SORT命令排序时所创建的新表中要包含的原表中的字段。如果省略FIELDS子句,新表中将包含原表中的所有字段。

[FIELDS LIKE <框架>]:在新表中包含那些与字段梗概框架相匹配的原表字段。

[FIELDS EXCEPT <框架>]:在新表中包含那些不与字段梗概框架相匹配的原表字段。


4.2 则在当前表的尾部追加任意新记录,追加记录的方法及操作与用数据的索引

索引文件有二种,单索引文件和复合索引文件,而复合索引文件又可分为结构复合索引文件和非结构复合索引文件两种。

VFP对结构复合索引文件提供了四种类型:主索引、候选索引、唯一索引和普通索引 。

主索引是指关键字段或索引表达式中不允许出现重复值的索引,主要用于主表或被引用的表,用来在一个永久关系中建立参照完整性。一个表而言,只能创建一个主索引。

候选索引是可以作主关键字的索引,因为它不包含Null值或重复值。在数据表和自由表中均可以为每个表建立多个候选索引。

唯一索引不允许两个索引具有相同的索引值,这种要求与主索引相同。为了保持与早期版本的兼容性,可以建立一个唯一索引,以指定字段的首次出现值为基础,选定一组记录,并对记录进行排序。

普通索引可以用来对记录排序和搜索记录,它不强迫记录中的数据具有唯一性。在一个表中可以有多个普通索引。


选择合适的索引类型可以以下列准则作为依据:选择合适的索引类型可以以下列准则作为依据:

1、如果需要排序记录,以便显示、查询或打印,可以使用普通索引、候选索引或主索引。

2、如果要在字段中控制重复值的输入并对记录排序,则对数据表可以使用主索引或候选索引,对自由表可以使用候选索引。

3、如果准备设置关系,则可以依据表在关系中所起的作用来分别使用普通索引、主索引或候选索引。

4.2.1 建立索引

1、单索引文件的建立

格式:INDEX ON <索引关键表达式> TO <索引文件名> [UNIQUE] FOR <条件>[ADDITIVE]

功能:对当前表中满足条件的记录,按<索引表达式>的值建立一个索引文件,并打开此索引文件,其缺省的文件扩展名为.IDX。

参数描述:

<索引关键表达式>: 用以指定记录重新排序的字段或表达式。


<选择合适的索引类型可以以下列准则作为依据:索引关键表达式>可以是字段名,也可以是含有当前表中字段的合法表达式。表达式值的数据类型可以是字符型、数值型、日期型、逻辑型。若在表达式中包含有几种类型的字段名,常常需要使用类型转换函数将其转换为相同类型的数据。

[UNIQUE]:指定UNIPUE子句时,若有多条记录的<索引关键表达式>的值相同时,则只把第一次遇到的记录进行排序加入到索引文件中;省略该子句时,则把所有遇到的记录值都加入到索引文件中。

[ADDITIVE]:若省略ADDITIVE子句,当为一个表建立新的索引文件时,除结构复合索引文件外,所有其它打开的索引文件都将会被关闭;若选择此选择项,则已打开的索引文件仍然保持打开状态。

FOR <条件>:指定一个条件,只显示和访问满足这个条件的表达式<条件>的记录,索引文件只为那些满足条件的表达式的记录创建索引关键字。


当执行上述命令后屏幕显示结果选择合适的索引类型可以以下列准则作为依据:

按学号排序

分类与索引的区别

1、分类要生成一个新的表文件,记录的物理顺序发生了改变;

2、分类生成的表可以单独使用。

3、索引它并不生成新的表文件,仅仅是表中记录的逻辑顺序发生了变化,但索引也要生成一个新的文件,即索引文件。

4、索引文件不能单独使用,它必须同表一起配合使用。

单索引文件总是按升序的顺序排列。对于一个表文件,允许建立多个索引文件。

USE STUDENT

INDEX ON 学号 TO XHSY

LIST


2选择合适的索引类型可以以下列准则作为依据:、复合索引文件的建立

复合索引文件是由索引标记组成的,每个复合索引文件可包含多个索引标记,每个索引标记都有标记名,一个索引标记相当于一个单索引文件。

格式:INDEX ON <索引关键表达式> TAG <标记名> [OF <复合索引文件名>][FOR <条件>] [ASCENDING | DESCENDING] [UNIQUE] [ADDITIVE]

功能:建立和修改复合索引文件,并打开此索引文件,其缺省的文件扩展名为.CDX。

参数描述:

<索引关键表达式>、[FOR <条件>]、[ADDITIVE]:与上相同。

TAG <标记名> [OF <复合索引文件名>]:创建一个复合索引文件。在TAG <标记名>参数中不包含可选的[OF <复合索引文件名>]子句时,便可以创建结构复合索引文件。


如果在选择合适的索引类型可以以下列准则作为依据:TAG <标记名>参数后包含可选项[OF <复合索引文件名>]子句,则可以创建非结构复合索引文件。

[ASCENDING | DESCENDING]:ASCENDING 指定复合索引文件为升序,这是默认值。DESCENDING 指定复合索引文件为降序。

[UNIQUE]:对于一个索引关键值,只有第一个满足该值的记录包含在.IDX文件或.CDX标识中。利用UNIQUE子句可以避免显示或访问记录的重复值。

说明:

⑴执行上述命令时,系统先检查指定的复合索引文件是否存在,若存在,在此文件中增加一个索引标记,若不存在,则建立此索引文件。

⑵标记名的命名规则与变量名的命名规则相同。

⑶单索引文件只能按升序排列,而复合索引文件既可以按升序排列也可以按降序排列,选择DESCENDING为降序,选择ASCENDING为升序,缺省时约定为升序。


选择合适的索引类型可以以下列准则作为依据:表的显示和访问顺序只由一个索引文件(主控索引文件)和标识(主控标识)控制。有一些命令使用主控索引文件和标识搜索记录,但是在修改表时,所有已打开的索引文件都将被更新。

3、在项目管理器中建立索引

(1)利用表设计器的字段选项卡建立索引文件

第一步:选择【数据】选项卡

第二步:选择要建立索引的表

第三步:单击【修改】按钮

系统打开表设计器


第四步:选择要建立索引的关键字段选择合适的索引类型可以以下列准则作为依据:

第五步:在“索引”下拉列表框中选择“无”、“升序”、“降序”,建立索引

索引选项卡

第六步:单击【确定】按钮


选择合适的索引类型可以以下列准则作为依据:2)利用表设计器的索引选项卡建立索引文件

索引选项卡

移动按钮

表达式生成按钮

排序按钮

在此列表框中选择索引类型

在此输入条件表达式

在此框中输入索引标记

在此文本框中输入索引表达式

返 回


4.2.2 选择合适的索引类型可以以下列准则作为依据:使用索引

1、打开索引文件

(1)在打开表时打开索引文件

复合索引文件在打开表时将自动被打开。

格式:USE <表文件名> INDEX <索引文件名表> [ORDER <数值表达式>/ <单索引文件名>/[TAG] <索引标记名> [OF <复合索引文件名>]] [ASCENDING/ DESCENDING]

功能:打开指定的表,并且打开由<索引文件名表>指定的所有索引文件。

说明:虽然可以同时打开多个索引文件,但同一时间只能有一个单索引文件或是复合索引文件中的一个索引标识作为主控索引,记录的操作和显示由主控索引来控制。如果<索引文件名表>中排在第一位的是单索引文件,则该单索引就是主控索引,如果排在第一位的是复合索引文件,则还需要用ORDER子句规定主控索引,如果不使用ORDER子句,记录将仍然按记录号的顺序显


示。选择合适的索引类型可以以下列准则作为依据:

2)在ORDER子句中也可以使用单索引文件名、索引标记或数值表达式来规定主控索引。如:使用ORDER <单索引文件名> 则规定一个单索引文件作为主控索引。

3)使用ORDER [TAG] <索引标记> [OF <复合索引文件名>]规定一个子索引文件作为主控索引,ORDER子句中的索引可以是结构复合索引文件中的索引标记,也可以是已经打开的非结构复合索引文件中的索引标记。

4)使用ORDER <数值表达式>规定主控索引,以<数值表达式>的值作为索引文件的序号,根据序号来确定主控索引文件。系统给打开的单索引文件和复合索引文件的索引标记编号的方法是:首先按照打开索引文件时的单索引文件名的排列顺序编号,再按照结构复合索引文件中索引标记建立的顺序编号,最后按照非结构复合索引文件中的索引标记建立的顺序编号。


(2) 选择合适的索引类型可以以下列准则作为依据:在打开表后打开索引文件

格式:SET INDEX TO [<索引文件名表>/?] [ORDER <索引号>/<复合索引文件名>/[TAG] <索引标记> [OF <复合索引文件名>]] [ASCENDING/DESCENDING] [ADDITIVE]

功能:打开指定的索引文件或关闭索引文件。省略所有选项为关闭当前工作区中除结构复合索引文件外的所有索引文件。

参数描述:

<索引文件名表>:指定要打开的一个或多个索引文件。索引文件列表中可以包含多个单索引和复合索引文件。索引文件列表中,第一个索引文件成为主控索引,它控制记录的显示和访问。

?:显示打开对话框,从这个对话框中,可以选择和打开一个单索引文件。

[ORDER <数值表达式>]:指定一个索引文件或标识为主控索引文件,数值表达式指定在索引文件列表中出现的索引文件。


首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为0,表中记录以物理顺序显示和访问,而索引文件保持打开状态。

[ORDER <单索引文件名>]:指定一个单索引文件为主控索引。

[ORDER [TAG] <索引标记名> [OF <复合索引文件名>]]:指定复合索引文件中的一个标识作为主控标识。标识名来自结构化复合索引文件或独立的复合索引文件。在打开的独立复合索引文件中,如果存在相同名称的标识,则要使用[OF <复合索引文件名>]指定标识所在的复合索引文件。

[ASCENDING/ DESCENDING]:指定显示和访问表记录时,是以升序还是以降序进行。[ASCENDING/ DESCENDING]子句要跟在ORDER子句的后面。

[ADDITIVE]:指定以前打开的索引文件(除结构化复合索引文件外),在发出SET INDEX命令打开另一个索引文件时,是否仍打开。如果没有该子句,将会关闭所有前面打开的文件。


说明:首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为

在有索引文件的表中,记录的显示顺序和访问顺序可以由某个索引文件来决定。使用SET INDEX命令可以打开单索引文件和复合索引文件。如果一个表有结构化复合索引文件,打开表时该文件自动打开。

执行不带参数的SET INDEX TO 命令,会关闭当前工作区中所有打开的索引文件(结构化复合索引文件除外)。

2、设置主控索引

如果在打开索引文件时未指定主控索引,打开索引文件之后需要指定主控索引,或者希望改变主控索引,可使用下面的命令。

格式:SET ORDER TO [<数值表达式>/<单索引文件名>/[TAG] <索引标记> [OF <复合索引文件名>] [ASCENDING/DESCEN-DING]

功能:在打开的索引文件中指定主控索引。

参数描述:


<首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为数值表达式>:指定主控索引或标识的编号。数值表达式指定的是在USE或SET INDEX中列出的索引文件或标识的序号。

<单索引文件名>:指定作为主控索引文件的单索引文件名。

[TAG] <索引标记> [OF <复合索引文件名>]:指定复合索引文件中的一个索引标识为主控索引标识名来自结构复合索引文件或任何打开的独立复合索引文件。如果在各打开的独立复合索引文件中存在相同的标识名,应使用[OF <复合索引文件名>]来指定包含此标记的复合索引文件。

[ASCENDING/DESCENDING]:该参数用法同前。

说明:

⑴如果命令中不使用任选项,只写SET ORDER TO,那么不会指定主索引,记录仍按照记录号的顺序显示,但并未关闭索引文件。

⑵VFP允许在SET ORDER命令中使用ASCENDING和DESCENDING暂时转换主控索引的顺序,但它不同于SORT ON 命令中的ASCENDING和DESCENDING。


首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为当数值表达式的值为0时,或省略所有可选项,则恢复表文件的自然顺序,但不关闭索引文件。

⑷在打开的索引文件中,只有主控索引文件是有效。

3、索引文件的重建或更新

当表中的记录当生变化时,如果未打开索引文件,索引文件(结构复合索引文件除外)不会自动更新,要更新这些索引文件,可用下列命令:

格式:REINDEX

功能:重建当前打开的所有索引文件。

说明:

使用REINDEX命令之前,必须首先打开需要重建索引的全部索引文件。对使用包含UNIQUE关键字的INDEX命令或SET UNIQUE ON命令创建的索引文件,在重建索引时,仍保持UNIQUE状态。

返 回


4.3 首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为数据的查询

4.3.1 直接查询命令

4.3.2 快速查询命令

4.3.3 对话查询

返 回

退 出


4.3.1 首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为直接查询命令

直接查询也叫顺序查询,是按照记录的物理顺序逐个比较,逐个查询。

1、LOCATE命令

格式:LOCATE [<范围>] [FOR <条件>] [WHILE <条件>]

功能:按顺序搜索表,从而找到满足指定逻辑表达式的第一个记录。

参数描述:

[<范围>]:指定要定位的记录范围。只有在范围内的记录才被定位。LOCATE命令的默认范围是ALL。

[FOR <条件>]:LOCATE命令按顺序搜索当前表以找到满足逻辑表达式的第一个记录。若逻辑表达式是可优化的表达式,则Rushmore优化由LOCATE FOR 创建的查询。为了获得最佳执行效果,可在FOR子句中使用可优化的表达式。


[WHILE <首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为条件>]:指定一个条件,只要逻辑表达式计算值为真,就继续查找记录。

说明:

(1)被搜索的表不必有索引。

(2)若LOCATE发现一个满足条件的记录,就将记录指针定位在该记录上。可以使用RECNO()返回该记录的记录号,同时FOUND()函数返回“真”,EOF()函数返回“假”。如果没有找到,则将记录指针指向范围的最后一个记录,同时将FOUND()函数值置为“假”,屏幕上显示“已到定位范围末尾”。

(3)如果执行SET EXACT OFF命令后,再用LOCATE命令查找字符型数据时,不要求字符型数据精确匹配。

(4)该命令只能查找第一条满足条件的记录。

若表中有多条满足条件的记录,当已经找到一条满足条件的记录后,还想继续查找后面满足条件的记录时,可以使用 CONTINUE 命令继续向后查找满足条件的记录。


2首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为、CONTINUE命令

格式:CONTINUE

功能:它使LOCATE命令从当前记录开始继续查找下一条满足条件的记录。

说明:CONTINUE是用在LOCATE之后继续查找满足同一条件的记录的命令,它继续LOCATE的操作。CONTINUE命令移动记录指针到下一个与<条件>逻辑表达式相匹配的记录上。CONTINUE命令能被重复执行直到记录指针到表的结尾或到指定范围的尾部。

如果CONTINUE命令成功地查找到了一条记录,RECNO()函数将返回该记录的记录号,并且 FOUND()函数返回逻辑“真”值和EOF()返回逻辑“假”值。

如果CONTINUE命令没有查找到满足条件的记录,RECNO()函数返回在table plus one中的记录数, FOUND()函数返回逻辑“假”值,并且EOF()函数返回逻辑“真”值。

返 回


4.3.2 首先,按索引文件列表中出现的顺序给单索引文件编号;然后,按照创建标识的先后顺序,对复合索引文件中的标识编号;最后,按照创建文件的顺序对独立的复合索引文件中的标识进行编号。如果数值表达式为快速查询命令

用LOCATE命令查询的优点是不论表中的记录是否有序都能进行查找,而其主要的缺点是查找速度慢。当表中的记录较多,并且要查询的记录又在表的底部时,问题尤为突出。为了解决这一问题,VFP提供了二条快速查询命令:FIND和SEEK。

1、FIND命令:

格式:FIND <字符型常量>/<数值型常量>

功能:它在已经建立索引并且表文件和索引文件均已打开的表中查找索引关键值与指定的字符串或数值型常量相匹配的第一条记录。如果找到,则把记录指针指向该记录,并且将FOUND()函数的值置为“真”;如果没有找到与其相符的记录,则将记录指针指向表的末尾,且将FOUND()函数的值置为“假”,将EOF()函数的值置为“真”。

说明:

⑴FIND命令是在索引文件中查询,找到后根据记录号从表文


件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用FIND命令来查找记录时,只能查找主控索引字段的值。

⑵查询的值可以是字符串,也可以是数值。通常字符串可以不用定界符括起来,但是当字符是以空格开始时,则必须用定界符括起来;如果要查找的字符串是以定界符开头时,就必须用不同的定界符将其括起来。

⑶查询的值如果是字符串,它可以是索引关键表达式值的全部或前几个字符,但不能是中间的或是后面的字符。

⑷查找字符串时,只要索引表达式(建立索引文件时使用的索引表达式)是字符型的,就可以使用FIND命令查找,并要求组成索引表达式的字段必须是字符型的。

⑸执行SET EXACT命令后,再用FIND命令查找字符串时,字符串可以是索引表达式值的全部或是从首字符开始的一个子串。如果执行了SET EXACT ON命令后再用FIND命令来查找字符串,则字符串只能和索引表达式的值精确匹配,即只能是


索引表达式的值的全部。件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用

⑹建立索引文件时,索引表达式可以是多个字段组成的表达式,若字段之间用“+”连接,用FIND命令查询时,查询内容应当是包含空格符在内的索引表达式值的全部或是从首字符开始的一个子串,究竞是用哪一种,这取决于SET EXACT命令的设置;若字段之间用“-”号连接,用FIND查找时,查询内容应当不包含空格符在内的索引表达式值的全部或是从首字符开始的一个子串。

⑺FIND命令只能使记录指针定位于第一条符合条件的记录,而CONTINUE命令又不能和FIND命令一起配合使用,当符合条件的记录不止一条时,可用FIND先查到满足条件的第一条记录,因为记录是根据索引关键表达式排序了的,因此符合条件的记录是在一起的,因此可用SKIP命令配合DISP命令查找,直到发现某条记录不满足条件时为止,此记录以后的记录肯定不符合条件。


2件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用、SEEK命令:

格式:SEEK <表达式> [ORDER <索引号>/<单索引文件名>/ [TAG] <索引标记> [OF <复合索引文件名>] [ASCENDING/ DESCENDING]]

功能:在打开的索引文件中快速查找与<表达式>相匹配的第1 条记录。

参数描述:

<表达式>:指定SEEK搜索的关键字。<表达式>可以是空字符串。

ORDER <索引号>/<单索引文件名>/[TAG] <索引标记> [OF <复合索引文件名>] [ASCENDING/DESCENDING]:指定<表达式>是以哪一个索引或索引标记为主控索引。其使用方法同设置主控索引。

说明:

当省略所有的可选项时,SEEK命令与FIND命令的功能基本


相同,但件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用SEEK命令的功能更强,SEEK命令不仅可以查找字符串和常数,它还可以查找字符型、数值型、日期型或逻辑型表达式的值。用SEEK命令查找字符串常量时,字符串常量必须放在定界符中。

SEEK命令中的表达式必须和索引表达式的类型相同。

3、顺序查询和快速查询比较

返 回


4.3.3 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用对话查询

格式:GETEXPR [<字符表达式1>] TO <内存变量名> [TYPE <字符表达式2>[;<字符型错误信息文本>]] [DEFAULT <字符表达式3>]

功能:通过命令GETEXPR启动表达式生成器对话框,从中可以创建表达式,并把表达式存入内存变量或数组元素中,然后通过LOCATE命令宏代换进行查询,此命令常用于程序中。

参数描述:

[<字符表达式1>]:指定在“表达式生成器”中显示的标题,该标题可提示生成何种类型的表达式。

TO <内存变量名>:指定存储表达式的内存变量或数组元素。如果此内存变量不存在,VFP将创建该变量。该命令不创建数组元素。如果按Esc键或选择【取消】按钮退出“表达式生成器”,将在内存变量或数组元素中存储空字符串。如果已经用DEFAULT子句创建了某个默认的表达式,在按Esc键或选择


件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用取消】按钮退出“表达式生成器”时,将把这个默认表达式存储在内存变量中。

[TYPE <字符表达式2>[;<字符型错误信息文本>]]:<字符表达式2>指定表达式类型:C-字符型、N-数值型、D-日期型、L-逻辑型、T-日期时间型、F-浮点型、I-整型、B-双精度型、Y-Currency(货币型)。

<字符型错误信息文本>:定义错误提示信息文本,如果<字符表达式2>是非法的,可以用<字符型错误信息文本>指定要显示的错误信息,<字符表达式2>和<字符型错误信息文本>必须用分号分隔。<字符表达式2>、分号、<字符型错误信息文本>的结合体必须用一对单引号或双引号定界起来。

[DEFAULT <字符表达式3>]:指定在“表达式生成器”中显示初始的默认表达式。GETEXPR命令可以按受这个默认的表达式,该默认表达式也可用<字符表达式3>指定的表达式改写。如果调用GETEXPR命令而没有输入表达式,则该默认的表达式将作为输入的表达式存储到内存变量中。


例:通过件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用GETEXPR获取LOCATE命令中查询条件,以实现任意条件的查询。

GETEXPR "输入查询条件" TO CXTJ TYPE "L;输入条件错误" DEFAULT "性别=’男’ "

启动表达式生成器

指定表达式框中的表达式为逻辑型,且当表达式不为逻辑型时提示“输入条件错误”。

指定保存表达式的内存变量

返 回


4.4 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用数据的统计

4.4.1 求记录个数的命令

4.4.2 求和命令

4.4.3 求平均值命令

返 回

退 出


4.4.1 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用求记录个数的命令

格式:COUNT [<范围>] [FOR <条件>] [WHILE <条件>] [TO <内存变量>]

功能:统计当前表中指定范围内满足条件的记录个数,并存于<内存变量>中。

参数描述:

<范围>、<条件>子句的用法和前面所有命令的用法是一样的。若使用<范围>、<条件>子句,可统计出指定<范围>内满足<条件>的记录个数,否则统计表中的记录的总数。对COUNT命令,默认的范围是ALL。

若使用任选项TO <内存变量>可选项,可将统计的结果送到内存变量中保存,否则将统计结果显示在屏幕上(SET TALK ON)。

例:USE STUDENT

SET EXACT OFF

COUNT FOR 姓名="李".OR.姓名="王" TO RS

返 回


4.4.2 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用求和命令

格式:SUM [<数值型表达式表>] [<范围>] [FOR <条件>] [WHILE <条件>] TO <内存变量名表>/TO ARRAY <数组名>

功能:对当前表中指定范围内满足条件的数值型字段或是由字段组成的数值型表达式累加求和,并把结果存放在对应的<内存变量名表>标识的变量中。

若使用任选项<数值型表达式表>,则只对<数值型表达式表>中的各表达式累加求和,否则将对当前表中的所有数值型字段累加求和,数值型字段之间或表达式之间用逗号分隔开。

若使用 TO <内存变量名表>,可将求出的各表达式的值依次赋给各内存变量,但要注意:表达式表中的表达式的个数应该与内存变量表中的变量个数相等,若省略<数值型表达式表>,内存变量的个数应该与数值型字段的个数相等。也可将求出的各表达式的值存放于指定的数组中,一个数组元素等同于一个内存变量。

返 回


4.4.3 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用求平均值命令

格式:AVERAGE [<数值型表达式表>] [<范围>] [FOR <逻辑表达式1>] [WHILE <逻辑表达式2>] [TO <内存变量列表>| TO ARRAY <数组名>]

功能:对当前表中指定范围内满足条件的记录的数值型字段求算术平均值,并把结果存入<内存变量名表>中或存入<数组名>指定的数组中。

说明:AVERAGE和SUM命令的不同之处仅仅在于前者是求数值型字段或数值型表达式的平均值,而后者是求和。

若省略<范围>,约定为ALL,若省略<数值型表达式表>,约定为当前表中的所有的数值型和浮点型字段。若省略<内存变量名表>和<数组名>,则不保留结果,若系统设置为SET TALK ON则只显示,否则不显示。

返 回


4.5 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用多工作区操作

4.5.1 工作区与多个表

4.5.2 表的关联

4.5.3 表的连接

返 回

退 出


4.5.1 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用工作区与多个表

1、工作区号与别名

VFP6提供了多达32767个工作区,每个工作区都有一个工作区号,分别用1~32767表示,其工作区1~10还分别对应有别名A~J。系统规定,用工作区号作为各个工作区的标识符,即数字1-32767;同时还规定,可以用工作区的别名作为工作区的标识符,A-J这10个字母是工作区的标识符,因此,单个字母A-J是不能用来作为表的文件名的,它是系统的保留字。

每个打开的表也都有一个别名,当用命令USE <表文件名>打开表时,系统默认的表的别名就是该表的主文件名。如果在打开表时,在USE命令后面使用了ALIAS参数指定了表的别名,则可为表另外起一个别名,这时的表文件名就不再是表的别名。

打开表亲为表指定一个别名

命令:USE <表文件名> [ALIAS <别名>] [IN <工作区号/工作区别名/表别名>] [AGAIN]


功能:件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用在指定的工作区打开指定的表文件,并为该表文件起一个别名。若省略可选项时,系统将取表的主文件名作为该表文件的别名,并且是在当前工作区中打开表文件。

参数描述:

[IN <工作区号>/<工作区别名>/<表别名>]:指定要选择的工作区。其中:工件区号、工作区别名都是直接指定的工作区,但<表别名>不是直接指定的工作区,而是通过在已打开表文件,且别名为<表别名>的工作区中先将该表文件关闭,然后再打开指定的表文件。如果省略该选择项,则为当前工作区。

[ALIAS <别名>]:为要打开的表指定一个别名。

[AGAIN]:若要在多个工作区中打开一个表,可以按以下方法操作:

(1)选择另一个工作区,并执行带有表名和AGAIN子句的USE命令。

(2)执行带有表名和AGAIN子句的USE命令,并且用IN子句指定一个不同的工作区。


2件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用、工作区的选择与多表文件的打开与关闭

若想改变当前工作区,则可使用SELECT命令来转换当前工作区。

格式:SELECT <工作区号>/<别名>/0

功能:选择一个工作区作为当前工作区。

说明:选择一个工作区作为当前工作区,使该工作区打开的表成为当前表,要选择的工作区,可使用工作区号作为标识符,也可以用工作区的别名来作为工作区的标识符。若选择0,则系统自动选取当前未使用的最小工作区号作为当前的工作区。

例如,输入下列命令:

SELECT 3

USE STUDENT ALIAS XS

SELECT 1

USE SCORE

USE SCORE ALIAS CJ IN XS AGAIN


使用件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用CLOSE命令关闭打开的表文件

格式1:CLOSE DATABASE

功能:关闭当前打开的数据库和所有打开的表文件,并使1号工作区成为当前工作区。

格式2:CLOSE TABLE

功能:关闭当前打开的所有表,不改变当前工作区。

格式3:CLOSE ALL

功能:关闭所在所有工作区中打开了的表、表单和单索引文件并且选择1号工作区为当前工作区。CLOSE ALL同时也关闭任何用 FCREATE()(该函数用于创建并且打开一个低级文件)和FOPEN()打开的低级文件函数。但CLOSE ALL不关闭用SET PRINT命令打开的文件。


使用件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用USE命令关闭打开的表文件

格式:USE IN <工作区号>/<别名>

功能:关闭指定工作区中的表文件。

其中:别名可以是工作区的别名,也可以是表的别名。

在单工作区操作时,用户只能操作当前工作区中的表,而在多工作区操作时,用户除了可以操作当前工作区中的记录外,还可以操作其它工作区中的表,实现多个表文件之间的数据处理。在当前工作区调用其它工作区的数据时,非当前工作区中的表文件的字段名前要加上该表文件的<别名>和“->”符号,或者是<别名>和符号”.”。格式如下。

<别名> -><字段名> 或<别名>.<字段名>

SELECT 2

USE SCORE ALIAS CJ

SELECT 1

USE STUDENT

DISPLAY 学号,姓名,班级,CJ.高等数学,CJ.普通物理

返 回


4.5.2 件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用表的关联

如果在多个工作区同时打开多个表文件,在当前工作区中移动表的记录指针时,其它表的记录指针是不会随之移动 。如果要想其它表的记录指针也随之移动,则要建立表间的关联。

关联就在二个或二个以上的表之间建立某种联接,使其表的记录指针同步移动。用来建立关联的表称为父表,被关联的表称为子表。

1、建立关联

格式:SET RELATION TO [<关联表达式1>] INTO <工作区>/<别名> [,<关联表达式2> INTO <工作区>/<别名>…]] [IN <工作区>/<别名>][ADDITIVE]

功能:在两个表之间建立关联。

参数描述:

<关联表达式1>:指定用来在子表和父表之间建立关联的关联表达式。关联表达式经常是子表主控索引的索引表达式。


<件中读出相应的记录。因为一个表在同一时刻只能有一个索引文件或一个索引标记为主控索引,因此,利用关联表达式>可以是下列三种参数之一:

1、<关联表达式>是记录号函数RECNO()。此时,两个或多个关联表之间的联系是根据记录号来进行关联的,关联表与被关联表之间当前记录号保持相等。如果关联表记录的记录号大于被关联表的记录总数,则被关联表的当前记录指针指向最后一条记录的下一条记录,EOF()函数值为.T.。

SELECT 2

USE SCORE ALIAS CJ

SELECT 1

USE STUDENT

SET RELATION TO RECNO() INTO CJ

2、<关联表达式>是数值型表达式。此时,在表达式中通常含有RECNO()函数,每当关联表的记录指针重新定位时,被关联表的记录指针将重新定位于<关联表达式>的值所对应的记录之上。如果<关联表达式>的值大于被关联表文件的记录总数,则被关联表


文件的当前记录指针指向最后一条记录的下一条记录,文件的当前记录指针指向最后一条记录的下一条记录,EOF()函数值为.T.。

SELECT 2

USE SCORE ALIAS CJ

SELECT 1

USE STUDENT

SET RELATION TO 3*RECNO()-2 INTO CJ

3、<关联表达式>选择二个表的公共字段建立关联,使用这种方法时,要求被关联的表文件必须是按指定的公共关联字段建立并打开了索引文件。

SELECT 2

USE SCORE ALIAS CJ

INDEX ON 学号 TO XHSY

SELECT 1

USE STUDENT

SET RELATION TO 学号 INTO CJ


INTO <文件的当前记录指针指向最后一条记录的下一条记录,工作区>/<别名>:指定被关联表的工作区或别名,也可以是被关联表的别名。

ADDITIVE:建立关联时,如果命令中不使用ADDITIVE子句,则父表以前建立的关联将自动解除;若使用了ADDITIVE子句,则父表以前建立的关联仍然保留。

说明:在建立关联之前,必须打开一个表(父表),而且还必须在另一个工作区内打开其它表(子表)。相关的各表通常有一个相同的字段。父表可以同时与多个子表建立关系,称为“一父多子”的关系。<关联表达式>可以是字符型、数值型、日期型表达式。如果建立父子关联之前,子表已经按照关联条件建立了索引,并将该索引文件指定为主控索引,那么,每当当前工作区父表的记录指针重新定位时,就检索子表,将子表的记录指针定位于<关联表达式>值与<索引表达式>值相同的第一条记录之上。

除了可以在一个工作区中与多个表建立关联以外,还允许在多个工作区中建立多个表之间的关联,但关联不能构成循环。


这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到SET SKIP TO 命令

格式:SET SKIP TO <工作区号>/<别名> [,<工作区号>/<别名>…]

功能:在父表的每条记录与子表中所有对应记录之间建立“一对多”的关联。

说明:如果已经建立了一父多子的关联,并且父表与每个子表都要建立“一对多”的关联,那么只要在SET SKIP TO命令中分别写出子表所在的<工作区号>或者<别名>即可。

2、解除关联

用SET RELATION命令建立关联之后,当移动关联表的记录指针时,被关联表的记录指针也相应要移动,并且将要引起读/写磁盘操作,这样会降低系统的性能,因此,当某些关联不再使用,或暂时不再使用时,应及时解除关联,以提高系统的运行速度。


格式这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到1:SET RELATION TO

功能:删除当前工作区表与其它工作区表建立的关联。

格式2:SET RELSTION OFF INTO <工作区号>/<别名>

功能:删除当前工作区与由<工作区号>/<别名>指定的工作区中表建立的关联。该命令必须在父表所在的工作区执行。例如:要关闭当前工作区与C工作区建立的关联。可以作下述命令进行:

SET RELATION OFF INTO C

当用USE关闭某些表时,系统将自动删除掉与它建立的关联。如果关闭的是父表文件,则它与子表的关联将全被删除。

当关闭父表时,将自动关闭与父表建立的所有关联。

返 回


4.5.3 这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到表的连接

表的连接是正好与COPY命令相反的过程

格式:JOIN WITH <别名>/<工作区> TO <表文件名> FOR <条件> [FIELDS <字段名表>]

功能:连接当前工作区中打开的表和<工作区>/<别名>指定的表,生成<表文件名>规定的新的表文件。

参数描述:

<别名>/<工作区>:指定第二个表的别名或所在的工作号。

FOR <条件>:指定一个筛选条件。若<条件>的值为真,则向新表中写入一个新记录。

[FIELDS <字段名表>]:指定新表中包含的字段的列表。两个表中指定的字段都可以包含在<字段名表>中。

说明:

JOIN命令也可以连接两个以上的表,这时可先连接其中的两个,生成一个新的表文件后再利用JOIN命令连接另外的表。

返 回


4.6 这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到关系型数据库标准语言SQL

4.6.1 SQL的数据定义功能

4.6.2 SQL的数据修改功能

4.6.3 SQL的数据操作功能

返 回

退 出


4.6.1 SQL这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到的数据定义功能

1、定义表结构语句

格式:CREATE TABLE|DBF TableName1 [NAME LongTableName] [FREE] (FieldName1FieldType [(nFieldWidth [,nPrecision])] [NULL | NOT NULL]

[CHECK lExpression1 [ERROR cMessageText1]]

[DEFAULT eExpression1][PRIMARY KEY|UNIQUE]

[REFERENCES TableName2 [TAG TagName1]] [NOCPTRANS]

[,FieldName2 ...][,PRIMARY KEY eExpression2 TAG TagName2

|,UNIQUE eExpression3 TAG TagName3]

[,FOREIGN KEY eExpression4 TAG TagName4 [NODUP]

REFERENCES TableName3 [TAG TagName5]]

[,CHECK lExpression2 [ERROR cMessageText2]])

|FROM ARRAY ArrayName

功能:创建一个含有指定字段的表。


参数描述:这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到

TableNamel:为表名,指定要创建的表。其中关键字TABLE和DBF作用相同,可以任选其一。

NAMELongTableName:指定新表在数据库中的长名。长名最多可以包含128个字符。长名只对数据表有效。若不指定长名,则在数据库中使用表的文件名作为表名。

FREE:指定所创建的表为自由表,不添加到数据库中。

FieldNamel:指定所创建表的字段名。一个表最多可以包含255个字段。如果有一个以上的字段允许Null值,此限制将减至254个字段。

FieldType[(nFieldWidth[,nPrecision])]:指定字段类型、字段宽度和字段精度(小数点后的位数)。参数FieldType为表示字段数据类型的单个大写字符。有些字段类型还需要参数nFieldWidth或nPrecision,或者两者皆有。


以下列出了参数这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到FiledType的值及其对应参数nFiledWidth和nPression的取舍情况

字段类型

FiledType

字段宽度

nFiledWidth

精度

nPrecision

说明

n表示字段宽度,如果后面有精度d,它还包括精度和小数点。

d表示精度,即小数点的宽度。

-表示不需要给定数据,VFP给定宽度。

对于D、T、I、Y、L、M、G和P型数据,省略参数nFieldWidth和nPrecision。如果对N、F或B型数据没有给出参数nPrecision的值,则其默认值为0。

n

-

-

n

n

-

-

-

-

-

-

-

-

-

-

d

d

-

d

-

-

-

-

C(字符型)

D(日期型)

T(日期时间型)

N(数值型)

F(浮点型)

I(整型)

B(双精度型)

Y(货币型)

L(逻辑型)

M(备注型)

G(通用型)

P(图片型)


NULL这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到:在字段中允许null值。如果有一个以上的字段允许null值,表可以包含的最多字段数将减少一个,从255减至254。

NOT NULL:在字段中不允许null值。如果省略NULL或NOT NULL,则以SET NULL的当前设置决定在字段中是否允许null值。但是,如果省略NULL和NOT NULL而包含PRIMARY KEY或UNIQUE子句,则SET NULL的当前设置无效。字段默认为NOT NULL。

CHECK lExpression1:指定字段有效性规则表达式lExpression1,其中可以包含自定义函数。

ERROR cMessageText1:指定当字段规则产生错误时,VFP6显示的错误信息。

DEFAULT eExpression1:指定字段的默认值表达式eExpression1,其数据类型必须和字段的数据类型相同。

PRIMARY KEY:将此字段作为主索引。

UNIQUE:将此字段作为一个候选索引。

注意,此处的候选索引和用INDEX命令的UNIQUE选项创建的索引不同。此处的候选索引不允许重复索引关键字。在主索引或候选索引字段中不允许null值和重复记录。


REFERENCES 这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到TableName2 [TAG TagName1]指定与本表建立永久关系的父表。如果省略TAG TagNamel,则使用父表的主索引关键字建立关系。可以包含TAG TagNamel来与父表建立一个基于现有索引标识的关系。父表不能是自由表。

NOCPTRANS:防止转换字符字段和备注字段到另一个代码页。

PRIMARY KEY eExpression2 TAG TagName2:指定要创建的主索引。eExpression2指定表中的任一个字段或字段组合。TAG TagName2指定要创建的主索引标识的名称。因为表只能有一个主索引如已经创建了一个主索引字段,则命令中不能包含本子句。

UNIQUE eExpression3 TAG TagName3:创建侯选索引。eExpression3指定表中的任一字段或字段组合。但是,如果已经用一个PRIMARY KEY选项创建了一个主索引,则不能包含指定为主索引的字段。TAG TagName3:为候选索引标识指定标识名。

FOREIGN KEY eExpression4 TAG TagName4 [NODUP]:创建一个外部索引(非主索引),并建立和父表的关系。eExpression4指定外部索引关键字表达式,而TagName4为要创建的外部索引关键字标识指定名称。包含NODUP来创建一个候选外部索引。


FROM ARRAY 这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到ArrayName:指定一个已存在的数组名称,数组中包含表的每个字段的名称、类型、精度以及宽度。

使用说明:新表在最低的未使用的工作区中打开;并可以通过其别名来访问;不管SET EXCLUSIVE的当前设置如何,新表都以独占方式打开。如果打开了数据库,并且没有包含FREE子句,则新表自动添加到数据库中。需要注意的是CREATE TABLE命令的语法使用逗号分隔一定的CREATE TABLE选 项。同时NULL、NOT NULL、CHECK、DEFAULT、PRIMARY KEY和UNIQUE子句必须将其放在包含字段定义的括号中。

【例4-15】使用CREATE TABLE—命令建立一个Grade表,并将其加入到xsglxt数据库,其表结构如表4-2所示,考试类别的值,默认值为“正考”,出错是信息是:考试类别只能是“正考”、“补考”或“重修”


先打开这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到xsglxt数据库,然后执行命令如下:

CREATE TABLE Grade(Student_ID C(10) NOT Null,;

Course_ID C(4) NOT Null,;

TestType C(4) NOT Null CHECK TestType=[正考] OR TestType; =[补考] OR TestType=[重修] ;

ERROR [考试类别只能是“正考”、“补考”或“重修”];

DEFAULT “正考”,;

PRIMARY KEY Student_ID + Course_ID + TestType TAG SCT,;

TestDate D NOT Null,;

TestGrade N(5,1) NOT Null)

执行后建立基本表结构Grade,包括5个字段。从Grade表结构的定义中可以看出CREATE TABLE命令的特点:

①属性的描述信息必须用括号括起来;

②属性的描述项之间用逗号分隔;

③如果不是对第一个字段定义主索引或候选索引,其子句前要加逗号分隔。


2这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到、创建临时表

格式:CREATE CURSOR alias_name(fieldname1type

[(precision [,scale])[NULL|NOT NULL]

[CHECK lExpression [ERROR cMessageText]]

[DEFAULT eExpression][UNIQUE][NOCPTRANS]][, fname2 ...])

| FROM ARRAY ArrayName

功能:创建一个临时表。该命令可以创建一个在被关闭之前一直存在的临时表。临时表始终以独占方式打开。

参数描述:与CREATE TABLE命令的格式相仿,参数的含义相同,但参数比CREATE TABLE命令简单的多。该命令不能创建主索引。

【例4-16】对前述的Student表的结构,现用CREATE CURSOR命令创建临时表,取临时表的别名为CUR_Student,对Student_ID字段和Name字段创建候选索引,对Sex字段设置字段级规则和默认值。可以使用如下命令:

CREATE CURSOR CUR_Student(Student_ID C(10) NOT NULL UNIQUE,;

Name C(8) NOT NULL UNIQUE,;

Sex C(2) CHECK Sex=[男] OR Sex=[女] ERROR [性别只能为“男”或“女”] DEFAULT [男],;

Birthday D,;

Classes C(10),;

Dormitory C(5),;

PhoneNumber C(8))


3这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到、修改表结构语句

修改表结构有3种格式。

第一种格式:添加新字段、修改已有字段。

格式:ALTER TABLE TableName1 ADD | ALTER [COLUMN] FieldName1

FieldType [(nFieldWidth [,nPrecision])][NULL | NOT NULL]

[CHECK lExpression1 [ERROR cMessageText1]]

[DEFAULT eExpression1][PRIMARY KEY | UNIQUE]

[REFERENCES TableName2 [TAG TagName1]][NOCPTRANS]

[NOVALIDATE]

注意:该格式不能用来修改字段名,不能用来删除字段,也不能用来删除已定义的规则。

参数描述:

TableName1:为表名,指定要修改结构的表。

ADD [COLUMN] FieldName1:指定要添加的字段名。

ALTER [COLUMN] FieldName1:指定要修改的字段名(字段已存在)。

FieldType[(nFieldWidth[,nPrecision])]:指定新字段或待修改字段的字段类型、字段宽度和字段精度(小数点后的位数)。


NULL | NOT NULL这样建立的关联,只能显示一对一的关系,当要父表中的一条记录同时对应子表中的多条记录时,还要先用到:允许(或不允许)字段为null值。

CHECK lExpression1:指定字段的有效性规则。1Expressionl为逻辑表达式值,可以是用户定义的函数或内部存储过程表达式。

ERROR cMessageText1:指定字段有效性检查出现错误时显示的错误信息。

DEFAULT eExpression1:指定字段默认值。

PRIMARY KEY:创建主索引标识索引标识与主索引字段同名。

UNIQUE:创建与字段同名的候选索引标识。

REFERENCES TableName2 TAG TagNamel:指定与之建立永久关系的父表。参数TAG TagNamel指定父表索引标识,关系建立在此父表索引标识基础上。

NOCPTRANS:防止对字符串或备注字段转换代码页。如果需要将表转换到另一代码页,那么指定了NOCPTRANS的字段不转换。只能对字符字段和备注字段指定NOCPTRANS。

【例4-17】向Grade数据表中添加一个是否考试课(IsTest,逻辑型,默认为.T.)字段。

打开xsglxt数据库后,执行下面的命令:

ALTER TABLE Grade ADD IsTest L DEFAULT .T.


第二种格式:定义、修改和删除有效性规则和默认值定义。第二种格式:定义、修改和删除有效性规则和默认值定义。

格式:ALTER TABLE TableName1 ALTER [COLUMN] FieldName2 [NULL | NOT NULL] [SET DEFAULT eExpression2]

[SET CHECK lExpression2 [ERROR cMessageText2]]

[DROP DEFAULT][DROP CHECK][NOVALIDATE]

参数描述:

ALTER [COLUMN] FieldName2:指定要修改的已有的字段名。注意在单独的ALTER TABLE命令中更改字段一个以上的属性时,需要多个ALTER [COLUMN] FieldName2子句。

SET DEFAULT eExpresslon2:指定已有字段的新默认值。

SET CHECK lExpression2:为已有字段指定新的有效性规则。

DROP DEFAULT:删除已有字段的默认值。

DROP CHECK:删除已有字段的有效性规则。

【例4-18】修改数据表Grade中的TestGrade字段,将宽度改为3,无小数位。

打开xsglxt数据库后,执行下面的命令:

ALTER TABLE Grade ALTER TestGrade N(3)


第三种格式:删除、修改字段名和定义、修改、删除记录有效性。第三种格式:删除、修改字段名和定义、修改、删除记录有效性。

格式:ALTER TABLETableName1 [DROP [COLUMN] FieldName3]

[SET CHECK lExpression3 [ERROR cMessageText3]]

[DROP CHECK]

[ADD PRIMARY KEY eExpression3 TAG TagName2 [FOR lExpression4]]

[DROP PRIMARY KEY]

[ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5]]]

[DROP UNIQUE TAG TagName4]

[ADD FOREIGN KEY [eExpression5] TAG TagName4 [FOR lExpression6]

REFERENCES TableName2 [TAG TagName5]]

[DROP FOREIGN KEY TAG TagName6 [SAVE]]

[RENAME COLUMN FieldName4 TO FieldName5]

参数描述:

DROP [COLUMN] FieldName3:从表中删除一个由FieldName3指定的字段。删除一个字段的同时也删除了字段的默认值和字段有效性规则。字段被删除后,索引关键字或引用此字段的触发器表达式将变为无效。在这种情况下,删除字段并不产生错误,但是在运行时刻,无效的索引关键字或触发器表达式将导致错误。


ADD PRIMARY KEY 第三种格式:删除、修改字段名和定义、修改、删除记录有效性。eExpression3 TAG TagName2 [FOR lExpression4]:往表中添加主索引,eExpression3指定主索引关键字表达式,TagName2指定主索引标识名。如果省略TAG TagName2而eExpression3是一个字段,则主关键索引标识与指定的eExpression3同名。包含FOR lExpression4子句,可以指定只有满足筛选表达式lExpression4的记录才可以显示和访问;主索引关键字在所有文件中只为符合这个筛选表达式的记录创建的。注意,应该避免使用FOR子句创建一个主索引。

DROP PRIMARY KEY:删除主索引及其标识。

ADD UNIQUE eExpression4 [TAG TagName3 [FOR 1Expression5]]:往表中添加候选索引。含义与ADD PRIMARY KEY eExpression3 TAG TagName2 [FOR lExpression4]相同。

DROP UNIQUE TAG TagName4:删除候选索引及其标识。

RENAME COLUMN FieldName4 TO FieldName5:允许改变表中字段的字段名。FieldName4指定待更改的宇段名,FieldName5指定新的字段名。

其它参数的做含义同前。


第三种格式:删除、修改字段名和定义、修改、删除记录有效性。例4-19】修改数据表Grade中的TestType是字段,将字段规则改为可以是“正考”、“补考”、“重修”或“其它”,同时修改错误信息,并将默认值改为“其它”,同时删除IsTest字段的默认值。

打开xsglxt数据库后,执行下面的命令:

ALTER TABLE Grade ALTER TestType SET DEFAULT [其它];

ALTER TestType SET CHECK testtype="正考".OR.testtype=;

"补考".OR.testtype="重修".OR.testtype="其它";

ERROR [考试类型只能是“正考”、“补考”、“重修”或“其它”];

ALTER IsTest DROP DEFAULT

【例4-20】修改数据表Grade中IsTest字段的字段名为NoTest,并设置默认值为.F.

打开xsglxt数据库后,执行下面的命令:

ALTER TABLE Grade RENAME COLUMN IsTest TO NoTest ALTER NoTest; SET DEFAULT .F.

或者:

ALTER TABLE Grade ALTER IsTest SET DEFAULT .F. RENAME COLUMN; IsTest TO NoTest

【例4-21】删除数据表Grade

DRPO TABLE Grade


[TOP 第三种格式:删除、修改字段名和定义、修改、删除记录有效性。nExpr [PERCENT]]:在符合查询条件的所有记录中,选取指定数量或百分比的记录。TOP子句必须与ORDER BY子句同时使用。ORDER BY子句指定按哪个字段排序,TOP子句根据此排序选定开始的nExp个或nExp %的记录。可以指定选取1~32767条记录。

[Alias.Select_Item]:限定匹配项的名称。Select_Item指定的每一项在查询结果中都生成一列,如果多个项具有相同的名称,则应在这些项前加上表的别名和一个句点号,以防止出现重复的列。Select_Item可以是:

①FROM子句中所包含的表中的字段名称;

②一个常量,查询结果中的每一行都出现这个常量值;

③一个表达式,可以是用户自定义函数名。

[AS Column_Name]:指定查询结果中的列标题。当Select_Item是一个表达式或一个字段函数时,如果要给此列取一个有意义的名称可用这个子句。它可以是一个表达式。

FROM:列出所有从中检索数据的表。如果没有打开表,VFP6会显示“打开”对话框以便指定文件位置,表打开以后直到查询结束才关闭。


[FORCE]第三种格式:删除、修改字段名和定义、修改、删除记录有效性。:如果包含了此子句,VFP6在建立查询时会严格按照在FROM子句中申明的顺序建立联接,否则会试图对查询进行优化。避免优化过程,可能会加快查询执行的速度。

[DatabaseName!]:当包含表的数据库不是当前的数据库时,此子句指定数据库的名称。如果数据库不是当前数据库,就必须指定包含表的数据库名称,注意其后应加上“!”号。

Table [[AS] Local_Alias]:为表指定一个临时名称。如果指定了本地别名,那么在整个Select语句中都必须用这个别名代替表名。

INNER JOIN:只有在其它表中包含对应记录(一个或多个)的记录才出现在查询结果中。这是内联接。

LEFT [OUTER] JOIN:在查询结果中包含JOIN左侧表中的所有记录,以及右侧表中匹配的记录。这是左联接。

RIGHT [OUTER] JOIN:在查询结果中包含JOIN右侧表中的所有记录,以及左侧表中匹配的记录。这是右联接。

FULL [OUTER] JOIN:在查询结果中包含JOIN两侧表中的所有记录,这是完全联接。

[DatabaseName!]Table [[AS] Local_Alias]:指定和当前表建立联接的表所在的数据库及表名或本地表别名。


ON 第三种格式:删除、修改字段名和定义、修改、删除记录有效性。JoinCondition:指定联接条件。

[INTO Destination]:指定在何处保存查询结果。如果在同一个查询中同时包含了INTO子句和TO子句,则TO子句不起作用。如果没有包含INTO子句,查询结果显示在“浏览”窗口中。

Destination可以是下列子句之一:

①ARRAY ArrayName:将查询结果保存到数组中。如果查询结果中不包含任何记录,则不创建这个数组。

②CURSOR CursorName:将查询结果保存到临时表中。如果指定了一个已打开表的名称,则VFP6产生错误信息。执行完SELECT语句后,临时表仍然保持打开、活动,但只读。

③DBF TableName|TABLE TableName:将查询结果保存到一个表中,如果指定的表已经打开,并且SET SAFETY设置为OFF,则VFP6在不给出任何警告信息的情况下改写该表。执行完SELECT语句后,表仍然保持打开、活动状态。

[TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]:如果命令中包含了TO子句,但没有包括INTO子句,则查询结果定向输出到名为FileName的ASCII码文件、打印机或主窗口。包含ADDITIVE子句使查询结果追加到所指定的文本文件的后面。


[PREFERENCE 第三种格式:删除、修改字段名和定义、修改、删除记录有效性。PreferenceName]:如果查询结果送往浏览窗口,就可以使用该子句保存浏览窗口的属性和选项以备后用。

[NOCONSOLE]:不显示送到打印机、文件、或VFP6主窗口的查询结果。

[PLAIN]:防止列标题出现在显示的查询结果中。

[NOWAIT]:打开浏览窗口并将结果输出到这个窗口后继续程序的执行。

WHERE JoinCondition:指定查询条件。指定一个字段,该字段联接FROM子句中的表。如果查询中包括不止一个表就应该为第一个表后的每一个表指定联接条件。联接多个查询条件必须使用.AND.。每个联接都是这样的形式:FieldName1ComparisonFieldName2

其中:FieldName1是一个表的字段名,FieldName2是另一个表的字段名。Comparison是下列的某一操作符:

=、==、LIKE、<>,!=,#、>、>=、<、<=

FilterCondition:指定包含在查询结果中的记录必须满足的筛选条件。


[GROUP BY 第三种格式:删除、修改字段名和定义、修改、删除记录有效性。GroupColumn]:按列的值对查询结果进行分组。GroupColumn可以是常规的表字段名,也可以是一个包含SQL字段函数的字段名,还可以是一个数值表达式指定查询结果表中的列位置。

[HAVING FilterCondition]:指定包含在查询结果中的组必须满足的条件。它应和GROUP BY GroupColumn一起使用。

[UNION [ALL] SELECTCommand]:把一个SELECT语句的最后查询结果同另一个SELECT语句最后的查询结果组合起来。ALL防止UNION删除组合结果中的重复行。

[ORDER BY Order_Item ]:根据列的数据对查询结果进行排序。每个Order_Item都必须对应查询结果中的一列

1、简单查询。

【例4-22】从Student表中查询1981年及以后出生的学生的学号、姓名、性别。

SELECT Student_ID AS 学号,Name AS 姓名,Sex AS 性别;

FROM xsglxt!Student;

WHERE Year(Birthday)>=1981


2第三种格式:删除、修改字段名和定义、修改、删除记录有效性。、联接查询:基于多个关系的查询。

【例4-23】查询Student表中所有学生的姓名、性别和Score表中的高等数学、普通物理的成绩。

SELECT Student.Name AS 姓名,Sex AS 性别,;

Score.高等数学,Score.普通物理;

FROM xsglxt!Student INNER JOIN xsglxt!Score;

ON Student.Student_ID=Score.Student_ID

3、嵌套查询:要求的结果出自于一个表,但相关的关系却涉及多个关系。

【例4-24】查询有课程号为“0001”的考试成绩的学生学号、姓名、班级。

SELECT Student_ID ,Name,Classes FROM Student ;

WHERE Student_ID IN (SELECT Student_ID FROM Grade ;

WHERE Course_ID ='0001')


4第三种格式:删除、修改字段名和定义、修改、删除记录有效性。、计算查询:可以使用COUNT()、SUM()、AVG()、MAX()、MIN()等函数。

【例4-25】求Score表中高等数学的总分、平均分、最高分和最低分以及总人数。

SELECT SUM(高等数学) AS 高数总分,AVG(高等数学) AS 高数均分,;

MAX(高等数学) AS 高数最高分,MIN(高等数学) AS 高数最低分,;

COUNT(RECNO()) AS 总人数 FROM Score

5、分组查询:用GROUP BY进行分组。

【例4-26】求各班高等数学的最高分、最低分、总分和平均分。

分析:由于数据分组只能按表中的字段进行,因此,本题应分为二步完成:

SELECT Score.高等数学, Student.student_id, Student.classes;

FROM xsglxt!score INNER JOIN xsglxt!student ;

ON Score.student_id = Student.student_id;

INTO CURSOR CursorTab

SELECT MAX(高等数学),MIN(高等数学),SUM(高等数学),;

AVG(高等数学),Classes AS 班级;

FROM CursorTab ;

GROUP BY CLASSES


6第三种格式:删除、修改字段名和定义、修改、删除记录有效性。、集合的并运算。

【例4-27】求出全部女生和高等数学成绩在90分以上的全部学生的学号和姓名。

SELECT Student_id AS 学号,Name AS 姓名;

FROM Student ;

WHERE Sex=[女] ;

UNION ;

SELECT Student_id AS 学号,Name AS 姓名;

FROM Score ;

WHERE 高等数学>90

SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可以进行集合运算。集合运算主要包括并运算(union)、交运算(intersect)和差运算(minus)。

本例的查询结果实际上是求女生和高等数学在90以上的并集。使用union将二个查询结果合并起来时,系统会自动去掉重复元组。


4.6.3 SQL第三种格式:删除、修改字段名和定义、修改、删除记录有效性。的操作功能

1、插入记录

格式:INSERT INTO Tablename [(Fieldname1 [,Fieldname2, ...])]

VALUES (eExpression1 [, eExpression2, ...])

或者:

INSERT INTO Tablename FROM ARRAY ArrayName | FROM MEMVAR

功能:以编程的方式向表中插入记录到表的尾部。

参数描数:

INSERT INTO Tablename:指定要插入记录的表名。Tablename中可以包含路径,也可以是一个名称表达式。如果指定的表没有打开,则VFP6先在一个新工作区中以独占方式打开该表,然后再追加记录到表中。此命令不改变当前工作区。

[(Fieldname1 [,Fieldname2, ...])]:指定新记录的字段名。INSERT-SQL命令将向这些字段中插值。


VALUES (第三种格式:删除、修改字段名和定义、修改、删除记录有效性。eExpression1 [, eExpression2, ...]):指定插入记录的字段值,如果省略了字段名Fieldname1 [,Fieldname2, ...],那么这些值将按照表结构字段定义的顺序来指定字段值。如果SET NULL的值为ON,INSERT-SQL会试图将null值插入在VALUES子句中没有指定的任意字段。

FROM ARRAY ArrayName:指定一个数组,数组中的数据将被插入到新记录中。从第一个数组元素开始,数组中每一个元素的内容依次插入到记录的对应字段中。当包含FROM ARRAY子句时,将忽略字段的任何默认值。

FROM MEMVAR:插入与字段同名的变量的值到对应字段中。如果没有与某一字段同名的变量,则该字段为空。

说明:该命令执行后,记录指针指向该记录。

【例4-28】使用INSERT­——SQL命令向Student表中追加一条新记录,数据如下表:


可以使用下列命令:第三种格式:删除、修改字段名和定义、修改、删除记录有效性。

INSERT INTO Student (Student_ID, Name, Sex, Birthday, Classes,;

Dormitory, Phonenumber,Age);

VALUES(“1999041002”,“张中强”,“男”,{^1980/03/22},;

"99电子","3-311","2356306",20)

或:

INSERT INTO Student VALUES(“1999041002”,“张中强”,;

"男",{^1980/03/22},"99电子","3-311","2356306",20)

2、更新

格式:UPDATE [DatabaseName1!]TableName1

SET Column_Name1 = eExpression1[, Column_Name2 = eExpression2 ...]

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]

功能:其功能是修改指定表中满足WHERE子句中条件表达式的元组。其中SET子句给出的eExpression1的值用于取代Column_Name1的属性值。如果省略WHERE子句,则表示要修改表中的所有元组的该属性值。


第三种格式:删除、修改字段名和定义、修改、删除记录有效性。例4-29】将99机械班全体学生的哲学成绩更新为0

UPDATE Score SET 哲学=0 ;

WHERE Student_ID IN (SELECT Student_ID FROM Student ;

WHERE Student.Classes=[99机械])

3、删除

格式:DELETE FROM [<cDatabaseName !>] <cTablename>

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]

功能:从指定表中逻辑删除满足where子句条件的所有元组。如果省略where子句,表示删除表中的全部元组。

【例4-30】带子查询的删除语句。设有二个表:库存表goods(商品编号gid,库存数量num,…),订货表order_form(商品编号gid,订货数量num,…),从订货表中删除库存数量小于订货数量的记录。

DELETE FROM Order_form ;

WHERE Order_form.num>(SELECT Goods.num FROM Goods ;

WHERE Order_form.gid=Goods.gid)

注意:如果某些信息涉及多个表,执行删除操作可能会引起数据库的不一致,这时要考虑到相关联的表也应做相应的删除,以保证数据库的一致性。


小 结第三种格式:删除、修改字段名和定义、修改、删除记录有效性。

1、分类将要生成一个新的表文件,可以使用SORT命令。

2、索引不生成新的表,但产生索引文件。索引可分为单索引和复合索引,复合索引又可分为结构复合索引和非结构复合索引,提供了主索引、候选索引、唯一索引和普通索引四种。

3、建立索引可以使用INDEX命令。

4、数据查询可分为直接查询和快速查询,直接查询使用LOCATE命令,快速查询可以使用FIND和SEEK命令,在程序中对于不定的查询要使用GETEXPR命令。

5、数据统计这里介绍了求记录数COUNT、求和SUM、求平均值AVERAGE命令。

6、在USE命令中可以用IN了句指定工作区,用ALIAS子句指定别名。

7、可以使用SELECT命令选择一个工作区。

8、可以在多表间使用SET RELATION命令建立关联,且使用SET SKIP 命令建立一对多关联。

9、可以使用JOIN命令建立表间连接。

10、SQL语言包括定义、查询、操纵、控制4方面功能。

11、定义表结构语句使用CREATE TABLE 、CREATE CURSOR 、ALTER TABLE语句。

12、SQL的数据修改功能使用SELECT语句,SELECT-SQL命令的核心是查询。

13、SQL的操纵功能使用INSERT INTO、UPDATE、DELETE FROM 语句。

返 回


第三种格式:删除、修改字段名和定义、修改、删除记录有效性。5章 VFP6程序设计基础

学习要点

1、过程化程序设计和面向对象程序设计的基本概念及设计方法;

2、过程化程序设计的语言基础,程序设计基本结构;

3、可视化程序设计的基本方法、类。


第三种格式:删除、修改字段名和定义、修改、删除记录有效性。5章 VFP6程序设计基础

5.1 VFP6程序设计概念

5.2 VFP6的程序设计语言基础

5.3 VFP6程序设计步骤

5.4 面向对象的程序设计技术

小 结

返回

退出


5.1.1 VFP6第三种格式:删除、修改字段名和定义、修改、删除记录有效性。程序设计基本概念

VFP6支持过程化程序设计和面向对象程序设计两种程序设计与开发的类型。

下面是一个完整的VFP过程化程序,可以引出几个基本概念。

*功能说明:求圆形的面积。

*文件名:L501.PRG

CLEAR

CTALK=SET("TALK")

SET TALK OFF

INPUT "请输入圆的半径,半径=" TO R

S=PI()*R*R

? "半径为"+ALLTRIM(STR(R))+"的圆,面积=",S

SET TALK &CTALK

RETURN


1第三种格式:删除、修改字段名和定义、修改、删除记录有效性。、从形式上看,VFP的程序是由若干有序的命令行组成,且满足下列规则:

(1)一个命令行内只能写一条命令,命令行的长度不得超过2048个字符,命令行以回车键结束。

(2)、一个命令行可以由若干个物理行组成,即一条命令在一个物理行内写不下时,可以分成几行。换行的方法有两种:一种是在物理行的末尾加符号“;”,表示下一行输入的内容是本行的继续;另一种是系统自动换行,即输入程序时,只管逐条命令输入,无需考虑本条语句是否超过屏幕行宽的最大限度,当输入的语句超过屏幕的最大行宽时,系统自动换行。输入时只需在一行结束时按回车键,通知系统本命令行输入完毕。

(3)为便于阅读,可以按一定的格式输入程序,即一般程序结构左对齐,而控制结构内的语句序列比控制结构的语句缩进若干格。

2、从功能上看,程序可以分为三个部分:

第一部分是程序的说明部分,在本例程序中是前面的二行,一


般用于说明程序的功能、文件名等需要说明的有关信息。般用于说明程序的功能、文件名等需要说明的有关信息。

第二部分是进行数据处理的部分,在本例程序中是从第3行开始的7行。通常这部分程序常包括下列三个部分,依次为:环境设置、数据处理、环境恢复。

第三部分是程序的控制返回部分,在本例中就是最后一条命令。它控制程序返回到调用该程序的调用处。

本例是结合过程化程序设计来分析的,由于VFP6能够结合过程化程序设计和面向对象的程序设计,因而有必要弄清它们的概念:

过程化程序设计与面向对象程序设计

过程化程序设计:它是采用结构化编程语句来编写的程序。这类方法的特点是容易把一个复杂的程序分解为若干个较小的过程,每个过程都可进行独立的调试。这类设计方法发展的总思想是从程序员角度考虑使程序设计更简单,而较少从使用角度去考虑。使用这类方法设计的程序流程完全由程序员控制,使用者只能做由程序员预先安排好的事情。


面向对象程序设计:般用于说明程序的功能、文件名等需要说明的有关信息。这类程序设计思想是面向对象,即设计的重要任务在于描述对象。程序是由事件驱动的,因而,在执行过程中,持续等待的是一个发生在对象上的事件。而发生什么事件则要看使用者的操作,如单击、双击鼠标等。至于下一步的程序流向,则要看驱动的是什么事件。这类程序设计的主要目的是从任何方便与简化使用入手,由使用者控制程序流向,这在一定程序上增加了编程的难度。

5.1.2 VFP6程序设计基本操作

1、使用“命令”窗口

可以在“命令”窗口中键入VFP6命令并按Enter键执行。若要重新执行该命令,还可以将光标移到此命令所在行的任意位置并按Enter键。甚至可以在“命令”窗口中像独立程序一样执行多行代码。要在“命令”窗口中运行多行代码,可以按下述方法执行:

(1)选取代码行。

(2)按Enter键或右击并在快捷菜单中选择“运行所选区域”。


因为“命令”窗口是一个编辑窗口,所以在编辑命令时可以使用因为“命令”窗口是一个编辑窗口,所以在编辑命令时可以使用VFP6提供的编辑工具。在“命令”窗口中可以修改、插入、删除、剪切、复制和粘贴正文。

在“命令”窗口中执行命令的优点是:能够立即执行被键入的命令,不需要将其保存为文件并用程序方式执行。此外,在菜单或对话框中所作的选择可以马上转换成“命令”窗口中的命令。用户可以将这些命令复制并粘贴到VFP6程序中,然后重复执行这些程序。这样做可以很容易地重复执行成百上千条的命令。

2、过程化程序设计基本操作

(1)建立过程化程序。在VFP6中,过程化程序文件是ASCII文本文件,因而可用各类编辑工具来建立。在VFP6中有下面二种简易方法来建立:

■在【文件】菜单下的【新建】菜单项中,选择“程序”项,再单击【新建文件】;

■在命令窗口中输入命令:MODIFY COMMAND <程序文件名>

格式:MODIFY COMMAND [<文件名>/?]

功能:打开文本编辑窗口,编写程序代码。


因为“命令”窗口是一个编辑窗口,所以在编辑命令时可以使用例5-2】用户通过VFP6的命令窗口建立上例程序文件。

在VFP6的命令窗口中输入下条命令后按回车键。

MODIFY COMMAND L501

打开程序编辑窗口

在程序编辑窗口中输入程序代码

用Ctrl+W存盘退出编辑窗口,或单击程序编辑窗口上的【关闭】按钮,在弹出的对话窗口中确定存盘,生成L501.prg文件。


因为“命令”窗口是一个编辑窗口,所以在编辑命令时可以使用2)运行程序 下面的任一方法均可运行程序:

■选择【程序】菜单下的“运行”菜单,利用“运行”对话框选择要运行的程序;

■在命令窗口中输入如下命令:

DO <程序文件名>

系统就会运行这个程序。如果文件不加扩展名,系统会假定它具有.PRG的扩展名,如果想运行一个具有其它扩展名的命令文件时,在输入命令时必须给出这个命令文件的全名。

如:要运行上例中编辑的程序,可以在命令窗口中输入:

DO L501

然后按回车键执行。

(3)保存程序

创建程序后,一定要注意保存程序。若要保存程序,可以从【文件】菜单中选择【保存】命令。或者按Ctrl+W组合键保存,若不想保存对新建程序或已有程序所做的修改,也可以使用Ctrl+Q组合键,不存盘而退出编辑窗口。


若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开“另存为…”对话框,提示用户可以在其中为程序指定程序名。程序保存后,可以运行或修改它。

(4)修改程序

程序保存后可以修改。首先,按以下四种方法之一打开想要修改的程序文件:

■若程序包含在一个项目中,则在项目管理器中选定它并选择修改命令。

■在【文件】菜单中选择【打开】命令,这时弹出一个包含文件列表的对话框,在“文件类型”列表框中选择“程序”,然后在文件列表中选定要修改的程序,单击【确定】按钮。

■在“命令”窗口中按如下方式键入要修改的程序名:

MODIFY COMMAND <程序文件名>

■在“命令”窗口中输入:

MODIFY COMMAND ?

然后从文件列表中选择要修改的程序,单击【打开】按钮。打开文件之后便可进行修改,修改完成后就可以保存。


3若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开、事件驱动程序设计基本操作

VFP6提供了真正的无模式操作,使用户不仅能够轻松地进行多个表单的自动协调,而且可以很容易地同时运行一个表单的多个实例。VFP6还提供了事件处理机制,可以给用户提供一个更为丰富的交互环境。

事件驱动程序设计基本操作,关键是确定事件以及对事件发生时应作出的反应。一个事件发生时,VFP6系统应作出的反应,仍可通过一个过程来实现,即用过程化程序设计的方法来处理某一事件发生时系统应作出的响应。

通常,VFP6程序设计时应考虑的事件有:

(1)核心事件 表5-1是VFP6中核心事件列表,这些事件适用于大多数的控件。

(2)容器事件和对象事件 。

为控件编写事件代码时,请注意以下两条规则:

■容器不处理与所包含的控件相关联的事件;

■若没有与某控件相关联的事件代码,则VFP在该控件所在类层次结构中逐层向上检查是否有与该事件相关联的代码。


若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开5-1 VFP6核心事件

返 回


当用户以任意一种方式(使用若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开Tab键、单击鼠标等)与对象交互时,对象事件被触发。每个对象独立接受自己的事件。

例如,在图5-2中,尽管命令按钮位于表单上,当用户单击命令按钮时,不会触发表单的Click事件,只触发命令按钮的Click事件。若没有与命令按钮相关联的Click事件代码,尽管有与表单相关联的Click事件代码,当用户单击按钮时,也不会执行与表单相关联的Click事件代码。

这些规则也适用于表格控件。表格事件包含列,列又包含标头和控件。事件发生时,只有与事件相关联的最底层对象识别该事件,更高层的容器不识别这个事件。图5-3演示了当用户在表格上移动鼠标时,哪个对象处理这个MouseMove事件。

图5-2容器、控件事件代码相对独立


若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开5-3 表格的MouseMove事件

例如:在一个命令按钮上,按下鼠标左键并拖动鼠标指针离开命令按钮,尽管鼠标指针可能已经在表单上,但这个命令按钮的MouseMove事件还在不断产生。当在表单上而不是在命令按钮上释放鼠标时,发生的MouseUp事件是与命令按钮相关联的,而不是与表单的MouseUp事件相关联。


若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开3)VFP6中类和控件事件

若表单上的控件基于一个用户自定义的类,当一个事件发生时,VFP首先在该控件中查看是否有与此事件相关联的代码,若找到,则执行它;否则,VFP将在类层次中向上一层检查。无论VFP在类层次的哪个地方找到该事件的代码,都执行它,如图5-4所示。

图5-4 若没有与对象相关联的事件代码,则VFP将检查父类


若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开4)使用VFP6设计工具编写代码

借助表单设计器、类设计器和菜单设计器,用户可以很容易地把程序代码与用户界面连接起来,这样应用程序便可响应用户的操作并执行相应的代码。同样,报表设计器将程序代码与报表文件联系起来,以定制结构复杂并且符合用户要求的报表。如果想充分发挥VFP6的强大功能,应充分使用刚才提到的设计工具。

事件驱动的程序设计的重要任务是规划界面和设计对事件响应的方法程序。界面规划在后续章节具体介绍。对事件响应的方法程序仍是使用结构化程序设计的方法完成对相应事件响应的操作。


5.2 VFP6若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开的程序设计语言基础

5.2.1 VFP的交互式输入输出命令

5.2.2 结构化程序设计

5.2.3 过程与过程调用

5.2.4 自定义函数

返 回

退 出


5.2.1 VFP若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开的交互式输入输出命令

设计程序,就是用一系列命令存储数据并操作这些数据。程序设计的原材料是数据和数据的存储容器,而处理这些原材料的工具是命令、函数的操作符。

1、交互式输入命令

(1)字符接收语句

格式:ACCEPT [<提示信息>] TO <内存变量名>

功能:将从键盘上接收的字符串数据存入指定的内存变量中。提供此命令是为了向后兼容,在VFP中可以用文本框控制命令代替。

参数描述:

[<提示信息>]:指定提示信息字符串。

[<内存变量名>]:指定存储字符数据的内存变量或数组元素。如果没有定义此内存变量,ACCEPT将自动创建。如果没有输入数据就按Enter键,内存变量或数组元素则为空字符串。


说明:若要关闭一个没有保存的程序,则会弹出相应对话框,提示用户是否保存已作的修改。若保存了一个由项目管理器创建的程序,则该程序被加入到项目中。若保存一个尚未命名的程序,则会打开

在VFP6的可视编程中可用文本框代替ACCEPT命令。该命令允许直接向内存变量或数组元素输入字符数据,输入时不需要用字符串的定界符。

执行此语句时,先在屏幕上显示<提示信息>,光标紧随其后,然后暂停程序运行,等待用户从键盘上输入信息。输入的信息可以是任何可显示的ASCII码字符串,并以回车键结束。系统将此字符串信息存入指定的内存变量中,然后,继续运行暂停的程序。

【例5-3】试编程完成下述功能:从键盘随机输入某个表的文件名,要求打开并显示此表的内容。

在命令窗口输入下列命令:

MODIFY COMMAND L503

(文件名中的扩展名.PRG可省略,以后不再说明)


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用Ctrl+ W存盘,返回命令窗口。

CLEAR

SET TALK OFF

ACCEPT "请输入表文件名" TO FileName

USE (FileName)

LIST

USE

RETURN

说明:程序中第四句使用了宏代换函数,这是由于FileName本身不是文件名,而其内容才是文件名。

(2)通用数据接收命令

ACCEPT语句只能给字符型内存变量提供数据。如果用户想给其它类型的内存变量提供数据,可以使用下列命令:

格式:INPUT[<提示信息>] TO <内存变量名>


功能屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用:用于接收从键盘上输入的表达式,并将计算结果存入指定的内存变量或数组元素中。包含此命令也是为了提供向后的兼容性。在VFP中,该命令也可以用文本框控制代替。

参数描述:

[<提示信息>]:提示信息,提示用户输入数据。

[<内存变量名>]:指定一个内存变量或数组元素,存储从键盘输入的数据。如果指定的内存变量或数组元素不存在,VFP将自动创建该内存变量或数组。

说明:

INPUT语句与ACCEPT语句的执行过程相同,功能相似。

<内存变量名>的数据类型取决于输入数据的类型。可以为数字型、字符型、日期型和逻辑型。

INPUT语句与ACCEPT语句的区别是:ACCEPT命令只能接收字符串,而INPUT语句可以接收任意类型的VFP表达式;如果输入的是字符串,ACCEPT语句不要使用字符型定界符,而INPUT语句必须用定界符括起来。


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用例5-4】试编程完成下列功能。从键盘上随机输入一个正数,以此数为半径,求圆面积和球体积,并输出结果。

程序如下:

程序中的第一行为注释行,说明此程序文件名;第四行的功能是不显示命令处理信息,第十行的功能是恢复显示命令处理信息。

*L504.PRG

CLEAR

CTALK=SET("TALK")

SET TALK OFF

INPUT "半径=" TO R

S=PI()*R*R

V=4/3*PI()*R**3

? "圆面积=",S

? "球体积=",V

SET TALK &CTALK

RETURN

在命令窗口中执行:

DO L504

屏幕显示

输入10后按Enter键

半径=

10

显示结果

圆面积= 314.16

球体积= 4188.790205


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用3)输入一个字符语句

格式:WAIT[<提示信息>][TO <内存变量名>]

功能:暂停正在运行的程序,直到输入一个字符为止。

此语句与ACCEPT语句的功能部分相似。若选择TO <内存变量名>子句,则将输入的单个字符存入指定的内存变量。若直接输入回车键,则内存变量中存入空字符串。内存变量的类型为字符型。若选择<提示信息>子句,执行此命令时,屏幕上将显示提示信息,否则,屏幕上将显示“按任意键继续…”

WAIT语句主要用于下列两种情况。

■暂停程序的运行,以便观察程序的运行情况,检查程序运行的中间结果。

■根据实际情况输入某个字符,以控制程序的执行流程。比如,在某应用程序的“Y/N”选择中,常用此命令暂停程序的执行,等待用户回答“Y”或“N”,由于这时只需输入单个字符,也不用按回车键,操作简便,响应迅速。


2屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用、格式化输出命令

前面的章节中在屏幕上显示信息时,使用的是非格式化输出命令:“?”或“??”,为了能按一定的要求来设计屏幕格式,使之美观、方便,下面介绍一个屏幕显示格式控制命令。

格式:@ <行号, 列号> SAY <表达式>

功能:从指定的行、列号开始输出表达式的值。

说明:①<表达式>可以是常数、字段变量及由它们组成的表达式。②定位输出时,一次只能输出一个表达式。

3、程序设计辅助命令

(1)、中止程序运行

■在程序运行过程中,按Esc键可以中止程序的运行,系统会显示警告对话框让用户选择:

【取消】 中止程序运行,这是缺省选择;

【挂起】 暂停程序运行,返回命令窗口。当选择【程序】菜单下的【继续执行】选项或在命令窗口中输入“Resume”命令,系统


则从中止的地方继续程序的执行;屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用

【忽略】 忽略所给的Esc,继续程序的执行。

通常在程序的开始时加有命令:

SET ESCAPE OFF

执行该命令后,Esc键处于关闭状态,在程序运行过程中,用户不能通过Esc键来中止程序的运行,因为在应用程序中,不希望中止它;而在程序调试阶段,通常不关闭这个键,让程序在运行过程中,随时都可以中断执行,以检查程序中间的运行状况。

格式 一:CANCEL

功能:结束程序的运行,返回命令窗口,同时关闭所有打开的文件。

格式二:SUSPEND

功能:暂时中止程序运行,返回命令窗口。当在菜单中选择【程序】|【继续执行】时,或在命令窗口中输入RESUME命令时,系统再次从中止的地方继续执行程序。


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用2)、注释命令

格式一:NOTE/ * <注释字符串>

格式二:&& <注释字符串>

说明:上述命令不作任何操作,只是注释标记,用于说明程序或命令的功能等。注释内容不需要用定界符定界,执行时也不显示。注释信息如果在一行内没有写完,换行时也必须再写注释命令。NOTE或*是用于整行注释的,因此,它必须写在每一个注释行的开头;而&&命令是用于注释一行的部分内容的,因此,它可以写在行中(命令的尾部、注释信息的头部),这是程序中唯一可以在一个逻辑行写二个语句的命令。

USE STUDENT &&打开STUDENT表

(3)文本显示命令

功能:将<文本字符串>原样输出。

这条命令通常是用于程序中对用户说明某些问题。

格式:TEXT

<文本字符串>

ENDTEXT

返 回


5.2.2 VFP6屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用程序设计的条件与循环

VFP的程序结构可以分为三种:顺序结构、分支结构、循环结构。

下面将以一个程序演示条件分支结构和循环结构,并对这些概念详细说明。

【例5-5】假设某单位有很多员工,并且要给月工资高于或等于1000元的员工增加5%的工资,给月工资低于1000元的员工增加10%的工资。

下面的示例程序将完成这一任务。此示例程序假定已在当前工作区打开了员工工资表,表中有一个名为“月工资”的数值型字段。

*L505

CTALK=SET("TALK")

SET TALK OFF

SCAN

IF 月工资>=1000

REPLACE 月工资 WITH 月工资*1.05

ELSE

REPLACE 月工资 WITH 月工资*1.1

ENDIF

ENDSCAN

SET TALK &CTALK

RETURN

在这一示例程序中用到了顺序结构、循环结构和条件分支结构。


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用

条件判断

1、顺序结构程序设计

顺序结构程序设计是结构化程序设计的基础,即是按完成任务所需步骤的先后顺序逐条命令的编写。

2、分支结构程序设计

分支结构就是根据条件的计算结果执行不同的操作。条件分支结构逻辑流程图如图5-6所示,VFP6中有两条命令实现条件分支:

(1)单条件分支

入口

VFP中有两条命令实现条件分支:

单条件选择命令

格式:IF <条件表达式>

<语句序列1>

[ELSE

<语句序列2>]

ENDIF

语句序列1

语句序列2

出口

图5-6 程序条件分支结构逻辑流程


参数描述:屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用

<条件表达式>:指定要计算的逻辑表达式。如果<条件表达式>的值为“真”,则执行IF语句之后的<语句序列1>;如果<条件表达式>的值为“假”,而且包含ELSE语句和<语句序列2>,则执行<语句序列2>;如果<条件表达式>的值为“假”,而且不包含ELSE语句和<语句序列2>,则程序忽略IF语句和ENDIF语句之间的所有语句,程序从ENDIF语句后的第一条命令开始继续往下执行其它程序。

说明:一个IF…ENDIF语句块中可以嵌套另一个IF…ENDIF语句块。

从【例5-5】所示的程序中可以看到:当当前记录中“月工资”字段的值大于等于1000元时,将使“月工资>=1000”这个条件表达式的值为“真”,此时,程序控制执行<语句序列1>“REPLACE 月工资 WITH 月工资*1.05”,即将月工资高于或等于1000元的工资上调5%。否则,即当当前记录中“月工资”字段的值低于1000


元时,将使“月工资屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用>=1000”这个条件表达式的值为“假”,此时,程序控制执行<语句序列2>“REPLACE 月工资 WITH 月工资*1.1”,即将月工资低于1000元的工资上调10%。

(2)多条件选择语句

参数描述:

CASE <条件表达式1> <语句序列1> … :VFP在执行这条多条件选择命令时,按命令行中写出的条件表达式的顺序逐条检查<条件表达式>,当遇到第一个结果为“真”的<条件表达式>时,就执行它后面的语句序列。语句序列中的命令逐条被执行,直到遇到下一个CASE或OTHER-WISE或ENDCASE,然后,

格式:DO CASE

CASE <条件表达式1>

<语句序列1>

[CASE <条件表达式2>

<语句序列2>

CASE <条件表达式N>

<语句序列N>]

[OTHERWISE

<语句序列N+1>]

ENDCASE


再从屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用ENDCASE语句后的第一条命令开始继续执行其它命令。

如果一个CASE <条件表达式>的<条件表达式>为“假”,就忽略它后面的语句序列。

【例5-6】运行一个程序,随机输出一条信息:

CLEAR

AA=INT(RAND()*10) &&随机产生一个10以内的整数

DO CASE

CASE AA=0

? “这次产生的随机数是:0”

CASE AA=1

? “这次产生的随机数是:1”

CASE AA=2

? “这次产生的随机数是:2”

CASE AA=3

? “这次产生的随机数是:3”

OTHERWISE

? “这次产生的随机数是:大于3!”

ENDCASE


2屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用、循环语句

程序设计中的循环,是指在程序中从某处开始,有规律地反复执行某一个程序块的现象。VFP的循环命令有三类:基于条件的循环、基于计数的循环和基于表的循环。

(1)基于条件的循环:DO WHILE命令

格式:DO WHILE <条件表达式>

[<语句序列>]

[EXIT]

[LOOP]

ENDDO

参数描述:

<条件表达式>:指定一个逻辑表达式,它的值决定是否执行DO WHILE和ENDDO之间的命令集合。如果<条件表达式>的值为“真”,就执行命令集。

[<语句序列>]:指定当<条件表达式>计算为“真”时要执行的


VFP屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用命令集。

[LOOP]:直接将程序控制返回到DO WHILE语句,并重新计算条件值。LOOP可以放在DO WHILE和ENDDO之间的任何位置。

[EXIT]:将程序控制从DO WHILE和ENDDO循环的内部转到ENDDO后的第一条命令。EXIT可以放在DO WHILE和ENDDO之间的任何位置。

ENDDO:表明DO WHILE语句的结束。

【例5-7】计算连续自然数之和,并且显示和刚大于1000的最后一个自然数。

STORE 0 TO AA,BB

DO WHILE AA<=1000

BB=BB+1

AA=AA+BB

ENDDO

? BB

结果显示为45。


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用例5-8】求连续N个不是7的倍数的自然数之和,当和是101的倍数时显示最后的自然数和它们的和。

STORE 0 TO AA,BB &&定义二个变量,用以保存累加值和累加数

DO WHILE .T.

BB=BB+1

IF MOD(BB,7)=0 &&判断BB是否为7的倍数

LOOP &&如果BB是7的倍数则返回去将BB再加1

ENDIF

AA=AA+BB &&将BB不是7的倍数的连续自然数累加求和

IF MOD(AA,101)=0 &&判断AA是否是101的倍数

EXIT &&如果AA是101的倍数,则结束程序的循环

ENDIF

ENDDO

? BB,AA

屏幕显示结果为207和18483。


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用2)基于计数的循环:FOR命令

格式:FOR <内存变量>=<初始值> TO <终值> [STEP <步长>]

<语句序列>

[EXIT]

[LOOP]

ENDFOR/NEXT

参数描述:

<内存变量>:指定作为计数器的内存变量或数组元素。在执行FOR…ENDFOR语句之前,此内存变量或数组元素不一定存在。

<初始值> TO <终值>:<初始值>是计数器的初始值,而<终值>是计数器的终止值。

[STEP <步长>]:是计数器递增或递减的步长。如果<步长>是负值,则计数器递减;如果省略STEP子句,计数器每次递增1。

<语句序列>:指定要执行的VFP命令,它可以包含任意数量的命令。


[EXIT]屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用:将控制权交给紧接在ENDFOR后面的命令。可以在FOR与ENDFOR之间的任何地方放置EXIT。

[LOOP]:将控制权直接交给FOR子句,不再执行LOOP与ENDFOR之间的语句。计数器正常递增或递减,就像执行到ENDFOR子句一样。可以在FOR与ENDFOR之间的任何地方放置LOOP。

说明:

可以用内存变量或数组元素作为计数器,指定FOR…ENDFOR循环中VFP命令的执行次数。在遇到ENDFOR或NEXT之前,始终执行FOR后面的VFP命令。执行过程中,每循环一次,计数器都会产生一次计数,计数增量由<步长>值控制,然后把计数器的值与<终值>进行比较,决定是否进行下一次循环。

【例5-9】求1到100中偶数的和

AA=0

FOR II=2 TO 100 STEP 2

AA=AA+II

ENDFOR

? AA

屏幕显示为:2550


屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用3)基于表的循环命令

格式:SCAN [<范围>] [FOR <条件>] [WHILE <条件>]

[<语句序列>]

[LOOP]

[EXIT]

ENDSCAN

参数描述:

[<范围>]:指定对当前表中记录扫描的范围。只有在范围之内的记录才有可能扫描到。SCAN命令的默认范围为ALL。

[FOR <条件>]:只有条件表达式的计算结果为“真”的记录,才能对其执行命令。包含FOR子句可以筛选出不想扫描的记录。

[WHILE <条件>]:指定一个逻辑表达式作为执行命令的条件,只要逻辑表达式计算为“真”,就对记录执行命令,直到遇到使表达式不为“真”的记录为止。

[<语句序列>]:指定要执行的VFP命令集。


[LOOP]屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用:把控制权直接交给SCAN子句。LOOP子句可以放在SCAN和ENDSCAN之间的任何地方。

[EXIT]:把控制权力从SCAN…ENDSCAN循环语句交给ENDSCAN下面的命令。EXIT子句可以放在SCAN和ENDSCAN之间的任何地方。

ENDSCAN:标志SCAN过程的结束。

说明:SCAN命令自动将记录指针移到下一条满足条件的记录,并执行相应的命令块。

【例5-10】逐条显示STUDENT表中男生的情况。

USE STUDENT

SCAN FOR 性别=”男”

DISP

WAIT

ENDSCAN

USE

或者使用下列代码:

USE STUDENT

SCAN

IF 性别#”男”

LOOP

ENDIF

DISP

WAIT

ENDSCAN

USE

返 回


5.2.3 屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用过程与过程调用

(1)子程序和过程的调用

子程序或过程的编写和修改方式与一般的程序一样,不同的是过程的最后一个语句必须是返回语句(RETURN),调用过程的程序是主程序,过程可以嵌套,即一个子程序可以再调用其它子程序,但不能形成循环嵌套。

子程序或过程的调用也是用DO命令:

格式:DO <过程名> [IN <程序文件名>][WITH <参数表>]

功能:执行过程名所指定的子程序。WITH用于主程序和子程序间参数的传递。

参数描述:

<过程名> :指定要执行的过程名称。VFP首先在当前执行的程序中查找此过程,如果在该程序中找不到此过程,VFP就在用SET PROCEDURE命令打开的过程文件中查找此过程,如果还未找到,则以反向调 用顺序在当前打开的其它程序文件中查找此内


内部过程;若仍未找到,则在磁盘上检索以屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用.FXP为扩展名的外部过程;若还未找到,最后检索以.PRG扩展名的外部过程,并把它编译为.FXP文件。

在执行一个可执行文件或应用程序中,多个过程可以有相同的过程名。当使用DO去启动一个可执行文件或一个应用程序的过程时,VFP只在可执行文件或应用程序的主程序中搜索指定的过程。

IN <程序文件名> :执行<程序文件名> 指定的程序文件中的一个过程。当找到该文件时就执行该过程。如果找不到该程序文件,就会显示“文件不存在”的信息。如果找到了程序文件,但指定的过程不存在,就会显示“找不到过程”的信息。

[WITH <参数表>]:指定要传递给程序或过程的参数。列在<参数表>中的可以是表达式、内存变量、字母和数字、字段或用户自定义函数。默认情况下,参数按引用传递给程序和过程,也可以将参数放在括号中按值传递。传递给程序或过程的参数的最大数目为27。


调用过程并向过程传递参数屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用

该过程接收参数并计算

*MYSUB.PRG

PROCEDURE MYSUB

PARAMETERS R,S

S=PI()*R^2

RETURN

【例5-11】计算圆面积的主程序为MYMAIN.PRG,子程序为MYSUB.PRG

*MYMAIN.PRG

CTALK=SET("TALK")

SET TALK OFF

CLEAR

STORE 0 TO RR, AREA

DO WHILE .T.

INPUT " 请输入圆的半径:" TO RR

DO MYSUB WITH RR, AREA

? "半径为"+ALLTRIM(STR(RR))+"的圆的面积是:", AREA

WAIT "还要继续计算吗(Y/N)?" TO ANSWER

IF UPPER(ANSWER)="Y"

LOOP

ELSE

EXIT

ENDIF

ENDDO

SET TALK &CTALK

接收参数

语句


2屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用、过程与过程文件

在实际的程序设计中,需要调用的过程不是一个或二个,而是几个、十几个甚至上百个,这就有可能使打开的文件数超过系统允许打开的文件数,而且将导致磁盘目录过于庞大,使系统调用文件的速度降低,程序执行速度也随之下降,因而有必要将若干个过程按一定的规定放在一个大文件中,这个文件称为过程文件。

(1)过程文件的建立

命令格式与建立程序文件一样:

格式:MODIFY COMMAND <过程文件名>

过程文件的格式要求每个过程文件的开头必须用下列语句:

格式:PROCEDURE <过程名>

功能:标明是一个过程。

参数描述:

<过程名>:指定过程名称。命名方法与文件名的命名方法相同。


过程文件的格式如下:屏幕显示编辑窗口。在编辑窗口输入如下程序代码后用

PROCEDURE <过程名1>

<语句序列1>

RETURN

PROCEDURE <过程名2>

<语句序列2>

RETURN

PROCEDURE <过程名N>

<语句序列N>

RETURN

说明:在一个过程文件中可以包含多个过程,在同一个过程文件中不允许出现相同的过程名,如果有相同的过程名,则只有第一次出现的过程才有被调用的可能。一个过程文件中最多允许包含128个过程。

(2)过程文件的调用

过程文件和表文件一样,都是在先打开后才能使用。

1)过程文件的打开命令

格式:SET PROCEDURE TO <过程文件名>

在主程序中应先打开过程文件,将过程文件中的所有过程都调入


内存(打开一个过程文件只算打开了一个文件)内存(打开一个过程文件只算打开了一个文件)才能根据不同的情况任意调用过程。过程的调用方法与子程序的调用方法相同。

子程序和过程的搜索顺序是:VFP6首先在当前执行的程序中查找此子程序或过程,如果在该程序中找不到此子程序或过程,VFP6就在用SET PROCEDURE命令打开的过程文件中查找此过程,如果还未找到,则以反向调用顺序在当前打开的其它程序文件中查找此内部过程;若仍未找到,则在磁盘上检索以.FXP为扩展名的外部过程;若还未找到,最后检索以.PRG扩展名的外部过程,并把它编译为.FXP文件。

2)过程文件的关闭命令

格式:CLOSE PROCEDURE

当过程文件不再用时应将其关闭,以节省内存空间。系统允许打开一个过程文件,当打开另一个过程文件时,先已打开的过程文件系统会自动将其关闭。

3)过程的返回语句

格式:RETURN [<表达式>/TO MASTER/TO <过程名>]

功能:将程序控制权返回给调用程序。


参数描述:内存(打开一个过程文件只算打开了一个文件)

[<表达式>]:指定返回给调用程序的表达式。如果省略RETURN命令或省略返回表达式,则自动将“真”返回给调用程序。

[TO MASTER]:将控制权返回给最高层的调用程序。

[TO <过程名>]:将控制权返回给指定的过程。

说明:

RETURN终止程序、过程或函数的运行,并将控制权返回给调用程序、最高次调用程序、另一个程序或窗口。子程序或过程调用及返回示意图如图5-7:

及返回示意图

子程序或过程调用


打开过程文件内存(打开一个过程文件只算打开了一个文件)MYPROCED

【例5-12】程序中常用到计算圆面积、长方形面积、阶乘等,现将它们编为三个过程,放在一个过程文件(MYPROCED.PRG)中,被主程序MYMAIN.PRG调用。

*MYMAIN

CLEAR

TEXT

这是一个计算圆面积、长方形面积、阶乘等的程序,先输入功能

选择:1--计算圆面积;2--计算长方形面积;3--计算阶乘;4—

退出,再输入参数:所有数据之间用逗号“,”分隔,如计算长方

形面积则在下面的提示信息后面输入2,10,15。

ENDTEXT

CTALK=SET("TALK")

SET TALK OFF

SET PROCEDURE TO MYPROCED

DO WHILE .T.

ACCEPT "请输入您的功能选择及参数:" TO SELECT

PROGNAME="PROGRAM"+SUBSTR(SELECT,1,1)

IF (SUBSTR(SELECT,1,1)="1".OR. SUBSTR(SELECT,1,1)="3").AND.;

OCCURS(",",SELECT)#1.OR.SUBSTR(SELECT,1,1)="2".AND.;

OCCURS(",",SELECT)#2.OR.SUBSTR(SELECT,1,1)>"4";

.OR.SUBSTR(SELECT,1,1)<"1"


WAIT WINDOW AT 15,20 "内存(打开一个过程文件只算打开了一个文件)输入的参数错误请重新输入! " NOWAIT

LOOP

ELSE

IF SUBSTR(SELECT,1,1)="4"

EXIT

ENDIF

ENDIF

IF OCCURS(",",SELECT)=1

POSITION=ATC(",",SELECT,1)

AA=VAL(SUBSTR(SELECT,POSITION+1,LEN(SELECT)-POSITION))

DO (PROGNAME) WITH AA

ELSE

POSITION1=ATC(",",SELECT,1)

POSITION2=ATC(",",SELECT,2)

AA=VAL(SUBS(SELECT,POSITION1+1, LEN(SELECT)-POSITION1))

BB= VAL(SUBS(SELECT,POSITION2+1,LEN(SELECT)-POSITION2))

DO (PROGNAME) WITH AA,BB

ENDIF

ENDDO

CLOSE PROCEDURE

SET TALK &CTALK

RETURN

调用过程并向

其传递参数

关闭过程文件


过程文件内存(打开一个过程文件只算打开了一个文件)MYPROCED

*MYPROCED

PROCEDURE PROGRAM1

PARAMETERS R

S=PI()*R^2

? "半径为"+ALLTRIM(STR(R))+"的圆的面积为:",S

RETURN

PROCEDURE PROGRAM2

PARAMETERS LONG,WIDTH

S=LONG*WIDTH

? "长为"+ALLTRIM(STR(LONG))+"宽为"+ALLTRIM(STR(WIDTH))+;

"的长方形的面积为:",S

RETURN

PROCEDURE PROGRAM3

PARAMETERS R

N=1

T=1

DO WHILE N<=R

T=T*N

N=N+1

ENDDO

? "值为"+ALLTRIM(STR(R))+"的阶乘为:",T

RETURN

每一个蓝色框中是一个过程


调用过程并传递参数内存(打开一个过程文件只算打开了一个文件)

3)递归调用

在过程中不但可以调用另外一个过程,而且还可以调用自己,这就叫递归调用。

【例5-13】求一个30以内的自然数的阶乘。

*MYMAIN.PRG

CTALK=SET("TALK")

SET TALK OFF

SET PROCEDURE TO MYSUB

INPUT “请输入一个30以内的正整数:” TO NUMBER

II=1

DO MYSUB WITH NUMBER,II

CLOSE PROCEDURE

SET TALK &CTALK

RETURN

*MYSUB.PRG

PROCEDURE MYSUB

PARAMETERS MM,NN

IF MM>1

DO MYSUB WITH MM-1,NN &&递归调用。请注意同下一句的次序

NN=NN*MM &&计算乘积。

ENDIF

? STR(MM,2)+”!=”+STR(NN,10)

RETURN

返 回


5.2.4 内存(打开一个过程文件只算打开了一个文件)自定义函数

用户自定义函数是除系统提供的函数外,用户自己定义的某些有特殊功能的函数,它能增强用户编程的灵活性和通用性。

1、自定义函数的结构

FUNCTION <函数名>

PARAMETERS <形式参数表>

<语句序列>

RETURN <表达式>

说明:<形式参数表>接受调用自定义函数时由<实际参数表>传来的数据。函数体的最后一条语句是RETURN <表达式>,由<表达式>返回一个值给调用自定义函数的程序。用户自定义函数建立和修改方法与子程序的建立和修改方法相同。用户自定义函数是一个独立的文件,也称为函数过程。


内存(打开一个过程文件只算打开了一个文件)例5-14】定义一个求连续多个自然数的乘积的函数PRODUCT()

*PRODUCT.PRG

FUNCTION PRODUCT

PARAMETERS MM,NN

IF TYPE("MM")="L".OR.TYPE("NN")="L"

=MESSAGEBOX("缺少操作数!",64,"自定义函数PRODUCT()")

RETURN .F.

ELSE

IF MM>NN

=MESSAGEBOX(“参数输入错误!第1个参数为起始值,”+;

CHR(13)+"第2个参数为终止值!",64,"自定义函数PRODUCT()")

RETURN .F.

ENDIF

ENDIF

TT=1

DO WHILE NN>=MM

TT=TT*MM

MM=MM+1

ENDDO

RETURN TT


2内存(打开一个过程文件只算打开了一个文件)、自定义函数的调用

格式:<函数名>(<实际参数表>)

说明:自定义函数的调用方法与系统内部函数的调用方法相同。PARAMETERS <形式参数表>接收来自<实际参数表>的数据,其实参和形参的个数和及其数据类型必须相等和一致。

自定义函数也可以放在过程文件中,其函数名就是过程名,把它作为一个过程调用,但返回的值没有意义。

返 回


5.3 VFP6内存(打开一个过程文件只算打开了一个文件)程序设计步骤

5.3.1 对任务进行说明

5.3.2 分解问题

5.3.3 编制模块

5.3.4 测试模块

5.3.5 组装全部模块

5.3.6 整体测试

5.3.7 提高程序的可靠性

5.3.8 将程序定义为过程或函数

返 回

退 出


5.3.1 内存(打开一个过程文件只算打开了一个文件)对任务进行说明

开始解决问题之前,需要将其说明清楚。有时调整问题的说明方式会有助于问题的解决。假设从不同的数据源获得一批数据,其中大部分是数值型数据,但有些数据中,除包含数字字符外,还夹杂着一些虚线和空格。现在需要从字段中清除这些虚线和空格,并将所得到的数字型数据加以保存。可以按如下方式说明需要这个程序达到的目的,而不是简单地立即着手从原始数据中除去空格和虚线。

目标——用新值替换字段中的原值,新值包含原值中除空格和虚线以外的所有内容。这种说明方式的优点在于避免在处理长字符串时遇到的困难。

5.3.2 分解问题

因为最终是以操作、命令和函数的方式将具体的指令提供给VFP6,所以需要将问题分解为多个独立的步骤。在本问题中,最容易分离出来的方法是在字符串中逐个扫描字符,只有将单个字符分离出来才能解决是否应该保存它。

返 回


在扫描字符的时候,将检查它是否为虚线和空格。到了这一步也许想要更详细地说明这个问题,括号之后的数据应该如何提取,货币符号、逗号和句号该如何消除等一系列问题将出现在大脑中。代码越通用,为将来节省的时间就越多,问题在于如何做到事半而功倍。下面给出一个比从前适用范围更广的问题说明方式。在扫描字符的时候,将检查它是否为虚线和空格。到了这一步也许想要更详细地说明这个问题,括号之后的数据应该如何提取,货币符号、逗号和句号该如何消除等一系列问题将出现在大脑中。代码越通用,为将来节省的时间就越多,问题在于如何做到事半而功倍。下面给出一个比从前适用范围更广的问题说明方式。

精炼的目标——用原始数据中的数值型字符更新字段值。

这便是在字符的层次上重新说明问题。如果字符是数值则保留,否则将指针移向下一个字符。当用原始字符串中的数值重新构成一个只包含有数值元素的新串时,用这个新串替换掉原来的字符串。如此循环,直到将所有记录中的数据全部更新。

概括起来,全部问题可以分解成以下一些模块:

■逐个检查字符;

■判断该字符是否为数值;

■若是数值,则将其复制到新串中;

■检查完字符串的全部后,用只含数字的新串替换原串;

■重复上述步骤,直到表中的全部记录都被更新。

返 回


5.3.3 在扫描字符的时候,将检查它是否为虚线和空格。到了这一步也许想要更详细地说明这个问题,括号之后的数据应该如何提取,货币符号、逗号和句号该如何消除等一系列问题将出现在大脑中。代码越通用,为将来节省的时间就越多,问题在于如何做到事半而功倍。下面给出一个比从前适用范围更广的问题说明方式。编制模块

清楚了要达到的目标以后,便可以开始用VFP6的命令、函数和操作符构造各模块。

因为命令和函数是用来处理数据的,所以需要一些数据来测试其功能。这些用于测试的数据应与实际数据尽量相近。

例如,在命令窗口中输入如下命令,将一个测试字符串赋值给变量:

cTest=”123_456_7 8 9_0”

1、逐个检查字符

首先,用SUBSTR()函数(子字符串截取函数)在字符串中逐个字符截取检查。

? Substr(cTest,1,1)

? Substr(cTest,4,1)

? Substr(cTest,10,1)

? Substr(cTest,11,1)

输出结果:

1

-

(空格)

8


也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(15),即使在表的记录中这个字段的长度不是定长,也能够使用FOR循环命令。因为FOR循环的计数器每执行一遍增1,因此,可以在SUBSTR()函数中使用该计数器。所以可以编写一个示例程序:

FOR II=1 TO 15

?? SUBSTR(cTest,II,1)

ENDFOR

将此程序保存为L508.PRG后运行

运行结果

123_456_7 8 9_0

2、判断字符是否为数字

从字符串中分离出单个字符之后便可以判断它是否为数字。在命令窗口中输入如下命令:

运行结果

? ISDIGIT(“2”)

.T.

? ISDIGIT(“_”)

.F.

? ISDIGIT(SUBSTR(cTest,10,1))

.F.


3也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(、若字符为数值,将它复制到新串中

既然可以逐一检查字符是否为数值,下面可以使用内存变量来保存该数字。为了创建一个变量,需要给它赋一个初值——一个零长度的字符串。

cNumbVar=””

因为FOR循环扫描整个字符串,所以最好用一个变量暂存每次分离出来的字符以便处理。

cCharacter=SUBSTR(cTest,II,1)

提示:在计算、求值以及在函数中得到的结果,最好保存在内存变量中,这样便于直接处理这些变量而不必重新计算或求值。

可以使用以下代码将每个被确认为数字的字符添加到新串中:

cNumbVar=cNumbVar+ cCharacter

cNumbVar=””

FOR II=1 TO 15

cCharacter=SUBSTR(cTest,II,1)

IF ISDIGIT(cCharacter)

cNumbVar=cNumbVar+ ccharacter

ENDIF

ENDFOR

完整的程序

返 回


程序运行结果也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(

程序运行结果

5.3.4 测试模块

如果将两行用于输出字符串的命令加到程序末尾并运行程序,就可以看出程序如何对测试字符进行操作。

cNumbVar=””

FOR II=1 TO 15

cCharacter=SUBSTR(cTest,II,1)

IF ISDIGIT(cCharacter)

cNumbVar=cNumbVar+ ccharacter

ENDIF

ENDFOR

? cTest

? cNumbVar

123_456_7 8 9_0

1234567890

输出似乎是正确的,但在测试模块过程中改变被测试字符串将出现问题。如在命令窗口中执行下一条命令后再运行这部分代码将出现问题:

cTest=”123_456_7 8 9ab0”

123_456_7 8 9ab0

123456789

因为FOR循环只执行15次,而被测试字符串的长度有16个字符。


程序运行结果也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(

程序运行结果

对于可变长字符串需要用另外的办法。能否有一种方法,让FOR循环知道被测试字符串的长度?循环次数由被测试字符串的长度来决定?事实上VFP提供了一个函数LEN()可以检测字符串的长度。如果将它放在FOR循环命令中,那么程序在上述两种情况下都能很好地运行。

cNumbVar=””

FOR II=1 TO LEN(cTest)

cCharacter=SUBSTR(cTest,II,1)

IF ISDIGIT(cCharacter)

cNumbVar=cNumbVar+ ccharacter

ENDIF

ENDFOR

? cTest

? cNumbVar

123_456_7 8 9ab0

1234567890

在命令窗口中执行下一条命令后再运行这部分代码

cTest="123_456_7 8 9ab0cd1e2 3"

123_456_7 8 9ab0cd1e2 3

1234567890123

返 回


也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(5-9 测试用数据

5.3.5 组装全部模块

若要完善此程序,则要从表中读取数据。在对表进行操作时,需要逐条扫描记录,针对表中记录的字段而不是变量进行操作。为了说明此步骤,先将STUDENT表中的“学号”字段的值进行修改后作为一个测试用表,修改后的STUDENT表中数据如图5-9所示 :

在对字段中的字符串进行处理后,目的并不是要将结果保存在内存变量中,而是要将处理后的值用来替换原来字段中的值。要对字段的值进行替换,前面已经讲过可以用REPLACE命令:


REPLACE 也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(学号 WITH cNumbVar

在将此条语句加入到程序中后,因为这个程序的功能目前还只是对当前一条记录的“学号”字段进行处理,而不是对表中所有记录同时进行处理,这离要求还差一步。通过前面讲到的要对表中的记录进行全部或部分记录进行处理时,可以使用基于表的循环命令SCAN…ENDSCAN命令。将这些进行组装时要注意,因为前面的程序是基于内存变量编写的,现在是要将这些代码用于对表中记录进行处理,为此要将原字符串变量名cTest改为表中的字段名“学号”,最后的程序如下:

SCAN

cNumbVar=””

FOR II=1 TO LEN(学号)

cCharacter=SUBSTR(学号,II,1)

IF ISDIGIT(cCharacter)

cNumbVar=cNumbVar+ ccharacter

ENDIF

ENDFOR

REPLACE 学号 WITH cNumbVar

ENDSCAN

返 回


也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(5-10 运行程序测试后STUDENT表中的部分数据

5.3.6 整体测试

完成全部代码之后,在处理实际数据之前,必须用示例数据进行测试。运行此程序时,如果当前工作区中没有表打开,此程序将要求先打开一个表,如果先将STUDENT表打开后再运行此程序,则此程序可正常运行。

程序运行后屏幕显示的结果如图5-9所示:

到此,程序设计基本完成,但为了使程序更可靠,需要进行下面的改进工作。

返 回


5.3.7 也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(提高程序的可靠性

所谓可靠的程序是指一个程序不仅能够完成设计的功能,还可以预料到可能发生的错误并进行排错处理。上面的程序包含有二个假设,只有满足了这两个条件,程序才能正常运行。这两个假设是:在当前目录中有STUDENT表,或者有一个打开的表;同时,STUDENT表中有“学号”字段,或者当前工作区中打开的表中有“学号”字段。如果事先指定打开表,就会限制程序的使用范围,最好的办法是在运行程序时,由用户根据情况决定打开哪个表。

下面是改进后的程序,它具备了预料并排除错误的功能:

ACCEPT “请输入要处理的表文件名” TO TABNAMESR

LtableOK=.F. &&此变量确定程序正常运行的条件之一是否成立。

&&初始值为.F.,假设条件不成立。

LfieldOK=.F. &&此变量确定程序正常运行的另一条件是否成立。

TABNAME=”” &&定义一个变量用于保存表文件名

IF AT(“.”,TABNAMESR)=0

TABNAME=TABNAMESR+”.DBF” &&使输入的文件名带有扩展名


ENDIF也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(

DO WHILE .T.

IF FILE(TABNAME) &&判断所输入的文件名是否存在。

USE (TABNAME) &&打开所输入的表文件

LtableOK=.T. &&将表的标志置为“.T.”

EXIT &&跳出循环体

ELSE

=MESSAGEBOX(“当前目录中没有所输入的表文件!”,64,”表名错误!”)

USE ? &&显示“打开”对话框,重新选择表

IF USED() &&判断是否将一个表打开

EXIT &&若有表打开也跳出循环体

ENDIF

ENDIF

ENDDO

*这部分代码检查当前表的每一个字段,直到发现有一个名为“学号”的字段,

*发现该字段存在后,设置LfieldOK为.T.,同时执行EXIT命令跳出循环体,

*否则LfieldOK变量仍为.F.。

FOR II=1 TO FCOUNT()

IF FIELD(II)=”学号”.AND.TYPE(“学号”)=”C”

LfieldOK=.T.

EXIT


ENDIF也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(

ENDFOR

IF LtableOK.AND. LfieldOK

SCAN

cNumbVar=””

FOR II=1 TO LEN(学号)

cCharacter=SUBSTR(学号,II,1)

IF ISDIGIT(cCharacter)

cNumbVar=cNumbVar+ ccharacter

ENDIF

ENDFOR

REPLACE 学号 WITH cNumbVar

ENDSCAN

ENDIF

该程序最大的局限在于只能处理一个字段。若需要对一个字段名不是“学号”的字段进行同样的操作,就不得不从头开始检查程序,把全部的“学号”改为所要处理的字段名。

返 回


5.3.8 也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(将程序定义为过程或函数

可以将删除字符串中非数字字符的程序代码转换成为函数,使其运行更可靠。所建立的函数返回字符串中的所有数字字符。

【例5-15】删除字符串中非数字字符示例过程:

FUNCTION NUMBERONLY(CMIXEDVAL)

cNumbVar=””

FOR II=1 TO LEN(CMIXEDVAL)

cCharacter=SUBSTR(CMIXEDVAL,II,1)

IF ISDIGIT(cCharacter)

cNumbVar=cNumbVar+ ccharacter

ENDIF

ENDFOR

RETURN cNumbVar

ENDFUNC

除了可以使用户在许多条件下使用这些代码之外,函数还提高了程序的可读性。如果要对一个已打开表的某个字段使用该功能,可以运行下列代码:

SCAN

REPLACE FIELDNAME WITH NUMBERONLY(FIELDNAME)

ENDSCAN

或者,可以更简单地写为:

REPLACE ALL FIELDNAME WITH NUMBERONLY(FIELDNAME)

返 回


5.4 也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(面向对象的程序设计技术

VFP6不但仍然支持标准的过程化程序设计,而且在语言上还进行了扩展,提供了面向对象程序设计的强大功能和更大的灵活性。

面向对象的程序设计方法与编程技术不同于标准的过程化程序设计。程序设计人员在进行面向对象的程序设计时,不再是单纯地从代码的第一行一直编到最后一行,而是考虑如何创建对象,利用对象来简化程序设计,提供代码的可重用性。面向对象编程技术的使用,使得用户能更加容易地编制自己的应用程序。

5.4.1 类的概念

5.4.2 对象和方法

5.4.3 类的操作方法

返 回

退 出


5.4.1 也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(类的概念

VFP6的类是描述一个特定对象类型必备特征的模型。类是一种对象类型,而对象是类中的一个实例。例如,在VFP6中表单中的命令按钮是一个对象。命令按钮类中指定了表单上命令按钮的属性,包括按钮的视觉效果属性(如形状是矩形还是正方形、颜色是红色还是白色、是透明的还是不透明的)、按钮所响应的事件(如单击或双击时各执行什么样的操作)等,这样决定的一个命令按钮对象是命令按钮类中的一个实例。

类可以基类和派生类,也可分为父类和子类。父类和子类的概念是相对的,子类是以对应父类为起点建立的扩展类,它将继承父类的所有特征。

1、VFP6的基类

从基类中可以派生出子类或创建对象。VFP6的基类是VFP6系统定义的最基本的类。


所有的基类都有如表也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(5-2所示的最小事件集:

表5-2、VFP基类的最小事件集

所有的VFP基类都有如表5-3所示的最小属性集:

表5-3、VFP基类的最小属性集

注意:如果对象从基类中派生而得,那么,基类对象的ParentClass属性值为空。


2也可以使用循环结构多次重复执行相同的操作。因为用以测试的字符串有固定的字符数(、容器类和控件类

VFP的类有两大主要类型,因此VFP对象也分为两大类型,它们便是容器类和控件类。VFP6中的对象可以分为容器和控件两种。层次结构如右图

(1)容器类:容器类是单一对象的集合。它可以包含其它对象,并且允许访问这些对象。当创建一个对象容器后,无论是在设计时还是在运行时,都可以对其中任何一个对象进行操作。在VFP6中有很多种容器,例如命令按钮组、容器、控件、表单集、表单、表格列、


表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。

(2)控件类:控件类是指单一的文本框、标签、命令框、列表框等。

多个控件对象可以当作一个整体类处理,但是组成控件对象的组件不能单独被修改和操作。

3、类具有封装、继承和多态性

封装意味着对象的信息(属性)和对象执行的处理(方法)都包含在对象的定义(类)中。比如举现实世界中对象的一个实例——自行车。可以用属性来描述自行车,如黑色的男式26车,每个特征:颜色、式样、大小,都可以算是自行车的属性。至于方法,是自行车响应事件时所做的事情,例如,当按动自行车的车闸时自行车响应一个减速事件。

继承意味着一个对象可以基于另一个对象的描述。

多态性意味着许多对象具有相同的方法,对象调用方法时会采取正确的动作。

返 回


5.4.2 表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。对象和方法

在VFP6中,表单以及控件是应用程序中的对象。用户通过对象的属性、事件和方法程序来处理对象。在结构化程序设计中,数据和操作是分离的。但是为了更好地模拟对象特征,在面向对象的程序设计中,数据和操作是统一的整体。由于对象中包括了数据和对数据的操作,所以具有很强的独立性,容易理解并维护。

对象具有以下一些特点:

■每个对象都具有对象标识符,用标识符来表示对象的唯一性。

■对象必须属于一个对象类。

方法是被定义类的合法函数也是操作类的仅有的函数。类通过执行该函数所定义的操作来完成一定的功能,方法程序是指附着于一个对象的程序代码。

对象的属性值是由对象所基于的类决定的。对象值的设置可以在设计时通过属性窗口设置,也可以直接编进程序代码在运行的过程中设置。


表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。Windows的操作中,用户通常用下面的动作来运行应用程序:单击鼠标、双击鼠标、拖动鼠标等,这些可以为系统所接受的动作称为事件。事件是一个对象可识别的动作,在VFP6中,可以编写相应的代码对此动作进行响应。除了用户动作可以产生事件外,程序代码或系统(如计时器)也可以产生事件。

在VFP6中,每个对象的动作都可以对一个事件的动作进行识别和响应,并由用户或者系统激活该事件。表5-4列出了一些VFP6的常用事件及其使用说明。

在VFP6中,方法程序是与对象相关联的过程,它是对象能够执行的一个操作。与一般的VFP6过程是不同的。方法程序既可以与相应的事件相关联,也可以独立于事件而单独存在,如果是后一种情况则必须在程序代码中被显示地调用。

有的方法程序不需要添加任何参数而直接调用,例如:Release方法用于退出表单或者表单集,其使用方法为:

Object.Release

面向对象程序设计基本上是一种包装代码,代码可以重用而且维护起来很容易。其中最主要的包装概念就是类。

返 回


表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。5-4、VFP6的常用事件及其使用说明


5.4.3 表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。自定义类的操作方法

1、创建新类

在类设计器中,可以设计并修改类。例如希望创建工具条:

可按下述方法进行:

第1步、执行【文件】|【新建】命令,在打开的对话框中选择“类”,并单击【新建文件】按钮;或在项目管理器中选择“类”选项卡,然后单击【新建】。

第2步、在弹出的对话框中,输入新建类的名称和基类如图。


在“类名”框中输入表格、选项按钮组、页框、页面、工具栏等。在这些容器中都可以包含多种对象。NewToolBar,在“派生于”框中选择ToolBar,然后在“存储于”框中输入“c:\gxglxt\libs\gxglxt_app.vcx”。

第3步、单击【确定】按钮进入“类设计器”窗口 。

在“表单控件”工具栏上单击“组合框”按钮和“命令锁定”按钮。


再在“类设计器”中的自定义工具栏上单击,添加组合框控件,按顺序单击三次,添加三个组合框控件。再在“类设计器”中的自定义工具栏上单击,添加组合框控件,按顺序单击三次,添加三个组合框控件。

再在“表单控件”工具栏上单击“命令按钮”按钮。


再在“类设计器”中的自定义工具栏上单击,添加组合命令按钮控件,按顺序单击三次,添加三个命令按钮控件。再在“类设计器”中的自定义工具栏上单击,添加组合命令按钮控件,按顺序单击三次,添加三个命令按钮控件。

再在“表单控件”工具栏上单击“分隔符”按钮。

再在“类设计器”中的自定义工具栏上单击,添加分隔符控件,按顺序单击五次,添加五个分隔符控件。


再在“类设计器”中的自定义工具栏上单击,添加组合命令按钮控件,按顺序单击三次,添加三个命令按钮控件。5-15 对象属性设置对话框

第4步、对NewToolBar类进行属性设置。对象属性设置在图5-15所示的属性设置对话框进行。

单击图5-15中的对象选择下拉列表框,选择“NewToolBar”对象,然后选择属性名“Caption”(单击),在属性输入文本框中输入显示时该对象的名称。现在输入“格式”。


按上述方法,设置三个按钮的基本属性:对第一个按钮,在对象选择下拉列表框中,选择“按上述方法,设置三个按钮的基本属性:对第一个按钮,在对象选择下拉列表框中,选择“Command1”对象,然后选择属性名“Caption”,在属性输入文本框中输入“B”,再选择“FontBold”属性,将显示字体设置为粗体(将属性值设置.T.—真);对第二个按钮,在对象选择下拉列表框中,选择“Command2”对象,然后选择属性名“Caption”,在属性输入文本框中输入“I”,再选择“FontBold”属性,将属性值设置“.T.—真”,再选择“FontItalic”属性,将属性值设置为“.T.—真”(将显示时的格式设置为粗体、斜体);对第三个按钮,在对象选择下拉列表框中,选择“Command3”对象,然后选择属性名“Caption”,在属性输入文本框中输入“U”,再选择“FontBold”属性,将属性值设置“.T.—真”,再选择“FontUnderLine”属性,将属性值设置为“.T.—真”(将显示时的格式设置为粗体、下划线)。

最后对列表框的属性设置:选择对象Combo1右击选择【属性】|【数据】选项卡,再选择RowSourceType,在属性值输入文本框中选择“1—值”;再选择RowSource属性,单击按钮,在弹出的表


达式生成器对话框中的表达式文本框中输入将要用到的几种文本格式,如正文、标题达式生成器对话框中的表达式文本框中输入将要用到的几种文本格式,如正文、标题1、标题2、表格等,每种格式中间用逗号分隔;再选择Value属性,设置其值为“正文”;再选择ControlSource属性,将值设置为Value。其它两个列表框也可采用同样方式进行属性设置。

第5步、为添加的控件添加事件及方法程序,并设计表单的初始化代码。在类设计器中用双击控件,也可以进入该控件的代码编辑窗口。

1、在属性窗口中选择“方法程序”选项卡,在“对象选择列表”框中选择Combo2,然后再在“属性名”窗口中双击Click Event。

方法程序编辑窗口


在方法程序编辑窗口中输入下列代码:达式生成器对话框中的表达式文本框中输入将要用到的几种文本格式,如正文、标题

THISFORMSET.ActiveForm.ActiveControl.FontName=THIS.VALUE

2、设置Combo3的Click Event代码:

THISFORMSET.ActiveForm.ActiveControl.FontSize=;

VAL(ALLTRIM(THIS.VALUE))

3、设置Command1的Click Event代码:

THISFORMSET.ActiveForm.ActiveControl.FontBold=;

!THISFORMSET.ActiveForm.ActiveControl.FontBold

THIS.FontBold=THISFORMSET.ActiveForm.ActiveControl.FontBold

4、设置Command2的Click Event代码:

THISFORMSET.ActiveForm.ActiveControl.FontItalic=;

!THISFORMSET.ActiveForm.ActiveControl.FontItalic

THIS.FontItalic=THISFORMSET.ActiveForm.ActiveControl.FontItalic

5、设置Command3的Click Event代码:

THISFORMSET.ActiveForm.ActiveControl.FontUnderline=;

!THISFORMSET.ActiveForm.ActiveControl.FontUnderline

THIS.FontUnderline=THISFORMSET.ActiveForm.ActiveControl.FontUnderline

6、Combo1的Click Event代码没写,因为在VFP中没有排版格式。


2达式生成器对话框中的表达式文本框中输入将要用到的几种文本格式,如正文、标题、使用类浏览器

当建立新类后,如果希望查看该类的结果并对其进行修改,可以在类浏览器中打开该类。使用【工具】|【类浏览器】,弹出类浏览器对话框。

“查看类代码”按钮

“新类”按钮

“重命名”按钮

单击“打开”按钮并选择创建的新类名称,打开该类 。

“重定义”按钮


在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

使用“重命名”按钮可以更改类的名称、属性或方法程序。但必须注意,如果重命名一个类,有可能会使浏览器窗口中当前没有显示的表单或类失效。可以使用“重定义”按钮更改类的父类。

返 回


小 结在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

1、VFP6程序设计分为过程化程序设计和面向对象的程序设计二种,面向对象的程序设计是可视的。面向对象的程序设计中也包含过程化程序设计。

2、过程化程序设计使用Modify Command命令创建命令集,用以完成程序员指定的任务;面向对象的程序设计,是设计事件的方法程序。

3、可以在命令窗口中执行一个代码块,也可以通过Do命令调用一个程序文件,可通过操作触发一个事件,执行某一程序块。

4、在过程化程序设计可面向对象程序设计中,都要用到条件选择和循环命令。这些命令包括If…Endif、Docase…Endcase、Do While…Enddo、Scan… Endscan、For…Endfor。

5、程序设计通常要用到7~8步,即:对任务进行说明 、分解问题 、编制模块 、测试模块 、组装全部模块 、整体测试 、提高程序的可靠性 ,将程序定义为过程或函数并不是所有程序都需要做的。

6、面向对象的程序设计是可视化的,产生事件的控件都可由相应的工具栏提供的可视类库中得到。面向对象程序设计的主要任务是设置必要的控件和为设置的控件编写事件的方法程序。

7、类是一种对象类型,而对象是类中的一个实例。

返 回


在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。6章 查询与视图

学习要点

1、查询向导和查询设计器的使用方法;

2、单表查询和交叉表查询;

3、查询设计器中各选项卡的功能和使用方法;

4、本地视图和远程视图;

5、视图向导和视图设计器的使用方法;

6、使用视图。


在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。6章 查询与视图

6.1 用查询向导设计查询

6.2 用查询设计器设计查询

6.3 创建视图

6.4数据库视图的操作

6.5 利用视图处理自由数据

小 结

返回

退出


6.1 在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。用查询向导设计查询

6.1.1 设计单表查询

6.1.2 建立交叉表

返 回

退 出


6.1.1 在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。设计单表查询

查询向导可以引导用户快速设计一个查询。下面将示例使用查询向导设计一个简单的单表查询:从GXGLXT数据库的Student表中查询系部代号为“04”且是99级的所有学生的信息。

操作过程如下:首先从“项目管理器”开始,选择【数据】卡片中的“查询”,然后单击【新建】按钮,则出现设计查询的方式选择对话框。

单击


查询向导在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。——字段选取

选择GXGLXT数据库中的Student表,并将该表中的所有字段添加到“选定字段”列表框中。

单击


从中选择在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。Student.系部代号

查询向导——筛选记录

在此输入值

取默认值

0

4

从中选择“包含”

9

8

在此输入值

单击

单击【预览】按钮可以显示查询结果。根据要求,设置条件如上图。其中,虽然表中没有年级字段,但可通过“学号”得到年级(学号的前二位为年级)。


查询向导在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。——记录排序

调整排序顺序

移动按钮

选择排序字段

选择排序方式

单击

单击【添加】


查询向导在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。——限制记录

说明:查询结果中所包含的记录数限制共有四种方式:

1、“部分类型”中选择“所占记录百分比”,“数量”中选择“所有记录”,查询结果集中包含全部记录。

2、“部分类型”中选择“所占记录百分比”,“数量”中选择“部分值”,再在“微调框”中设置数值,查询结果集中包含指定数值百分数的记录。

限制查询结果中所包含的记录数

取默认值,查询结果集中包含全部记录

单击

3、“部分类型”中选择“记录号”,“数量”中选择“所有记录”,查询结果集中包含全部记录。

4、 “部分类型”中选择“记录号”,“数量”中选择“部分值”,再在“微调框”中设置数值,查询结果集中包含指定数值的记录数。


查询向导在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。——完成

将查询以文件的形式(.QPR)保存到一个指定的目录中。

将查询保存到一个指定的目录中并运行该文件。

利用查询向导设计的查询功能有限,可以使用查询设计器修改它。

单击,可以查看查询结果集中的全部数据

结束向导,完成查询设计。

打开帮助文件

取消所建立的查询

返回到向导的上一步

单击


保存设计的查询在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

目录选择下拉列表框

在“文件名输入文本框”中输入“Stud_query”后,单击【保存】按钮,结束查询设计过程。

文件名输入文本框

文件类型选择下位列表框

在项目管理器中的“数据”选项中的查询项下产生了一个查询文件

返回


6.1.2 在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。建立交叉表

如果在上文所述的建立查询的第一步选择“交叉表向导”,则可以建立交叉表。下面通过示例来介绍如何建立交叉表。用Grade表中的数据建立一个交叉表,以显示每个学生所有课程的总成绩。 Grade表中的部分数据如:

前面的设计过程同以上内容,但是在第二步需要确定交叉表的行和列 。


单击在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

交叉表设计向导——字段选取

说明:在这一步先在“数据库和表”一选择一个数据库,再选择用以建立交叉表的数据表,然后再从可用字段列表框中选择要用的字段,交叉表只用三个字段,这一步可多选 字段。

单个字段选定按钮

选择数据库和表

选定字段

单击

全部字段选定按钮

单个字段撤消按钮

全部字段撤消按钮


单击在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

交叉表向导——定义布局

说明:

(1)行,将要加入到交叉表中的第一个字段名,本示例中选择字段“学号”;

(2)列,将要加入到交叉表中的从第二个字段开始的若干个字段的字段名,注意这些从源表中选择的数据不能超过254个。本示例中选择字段“课程代号”;

(3)数据,对应行和列的运算结果,本示例中选择“课程成绩”。

按提示操作:从可用字段列表框中将“学号”字段拖入“行”框,将“课程代号”拖入“列”框,将“课程成绩”拖入“数据”框。


单击在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

交叉表查询向导——加入总结信息

说明:这一步的操作,决定在生成的交叉表中要加入的一个字段的内容。

(1)求和:求出对应行和列的数据字段的和;

(2)计数:求出对应行和列的数据字段的数目;

(3)平均值:求出对应行和列的数据字段的平均值;

(4)最大值:求出对应行和列的数据字段的最大值;

(5)最小值:求出对应行和列的数据字段的最小值。

本示例中选择“求和”运算。如果不想加入总结信息,可以在“分类汇总”中选择“无”。


选择“保存并运行交叉表查询”后单击在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

交叉表向导——完成

将交叉表查询以文件的形式(.QPR)保存到一个指定的目录中。

将交叉表查询保存到一个指定的目录中并运行该文件。

将交叉表查询保存到一个指定的目录中并打开“查询设计器”修改它。

对于值为空的记录是否以.NULL.填充

说明:系统默认值是“保存交叉表查询”和“显示NULL值”。


交叉表保存及运行结果在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。

按上一步的操作完成后,进行到“另存为…”对话框中,将该查询取名为Grad_Query,然后保存在默认的目录中。

保存后,系统进入到数据查询过程,稍候系统将查询结果显示出来。如:

从中可以看到,凡是没有数据的栏,就被.NULL.值填充,且有许多数据丢失。

交叉表可以用数据过滤处理,在下一节中介绍。

返回


6.2 在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。用查询设计器设计查询

6.2.1 确定各表间的联接关系

6.2.2 选定查询字段

6.2.3 筛选记录

6.2.4查询结果排序

6.2.5 建立分组查询

6.2.6 杂项的设置

6.2.7 定向输出查询结果

6.2.8 运行查询

返 回

退 出


6.2 在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。用查询设计器设计查询

前面学习了如何使用VFP6中文版提供的查询向导快速的设计一个查询。但是在实际应用中,查询向导设计的查询往往不能满足需求。这时还可以采用查询设计器方便灵活的设计各种查询,也可以先用查询向导设计一个简单的查询,再在查询向导中打开并修改它。

将上一节建立的Grad_Query交叉表查询,用“查询设计器”进行修改,使用之包含尽可能少的空栏。

可以通过以下所提供的多种方法之一来打开查询设计器:

■从“项目管理器”启动查询设计器

1、在“项目管理器”中选择“数据”选项卡,再选取“查询”项,再单击【新建】,进入查询设计方式选择对话框后单击【新建查询】,则启动“查询设计器”。

2、在“项目管理器”中选择“数据”选项卡,从“查询”项中选择一个已存在的查询文件,再单击【修改】,也启动“查询设计器”。


在类浏览器中,单击“查看类代码”按钮可以查看并编辑该类的事件及方法程序代码。单击“新类”按钮可以打开“新建类”对话框,以建立一个新类。从【文件】菜单启动查询设计器

选择系统菜单中的【文件】|【新建】命令,在“新建”对话框中选中“文件类型”下的“查询”单选项,再单击右边的【新建文件】按钮,也可启动“查询设计器”;

■使用CREATE QUERY命令也可启动“查询设计器”

现采用新建方式启动“查询设计器”


查询设计器下部分的窗口中有几个选项卡,其含义简介如下:查询设计器下部分的窗口中有几个选项卡,其含义简介如下:

(1)“字段”:用来选定包含在查询结果中的字段;

(2)“排序依据”:用来决定查询结果输出中记录或行的排列顺序;

(3)“联接”:用来确定各数据表或视图之间的联接关系;

(4)“筛选”:相当于命令SET FILTER TO,利用过滤的方法查找一个特定的数据子集;

(5)“分组依据”:所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可以完成基于一组的计算。

要设计一个查询文件,首先必须明确查询的目的是什么,即想要得到哪些数据,并以什么方式存在;或者想要得到满足某些条件的特定记录,或者想要知道某些记录的字段值组合成的表达式按某一方式输出。明确了输出的数据后,就可以开始设计查询了,一般要通过以下几个步骤进行:

(1)启动查询设计器;

(2)选择出现在查询结果中的字段;

(3)设置选择条件来查找可给出所需结果的记录;

(4)设置排序或分组选项来组织查询结果;

(5)选择查询结果的输出类型:表、报表、浏览等;

(6)运行查询。

返回


6.2.1 查询设计器下部分的窗口中有几个选项卡,其含义简介如下:确定各表间的联接关系

下面将通过一个示例来介绍创建一个含有多个表中信息的查询。例如在GXGLXT数据库中有三个表:Student、Grade、Courses,现在想知道学号前四位是9904和9804的所有学生考试的成绩。

当在多个表或视图间进行查询时,需要指出这些表或视图间的联接关系。如前面所述,启动查询设计器,在“添加表和视图”对话框中从“数据库”中选择GXGLXT库,在“数据库中的表”中选择Student表,单击【添加】按钮,再选择Grade表,再单击【添

加】,此时系统自动弹出一个“联接条件”,询问是否根据两表中都有的“学号”字段建立内部联接,单击“确定”,两表间就有了一条连线,代表它们之间的联接。然后再添加Courses表,最后关闭对话框。


在“查询设计器”中选择“联接”选项卡,如图:在“查询设计器”中选择“联接”选项卡,如图:

在VFP6中表间的联接有四种类型,分别是:


在“查询设计器”中选择“联接”选项卡,如图:1)Inner Join:内部联接,指定只有满足联接条件的记录包含在结果中,此类型是默认的,也是最常用的;

(2)Right Outer Join:右联接,指定满足联接条件的记录,以及满足联接条件右侧的表中记录(即使不匹配联接条件)都包含在结果中;

(3)Left Outer Join:左联接,指定满足联接条件的记录,以及满足联接条件左侧的表中记录(即使不匹配联接条件)都包含在结果中;

(4)Full Join:完全联接,指定所有满足和不满足联接条件的记录都包含在结果中。

如果想修改各表间的联接,双击查询设计器上部窗口表之间的连线,系统将弹出“连接条件”对话框;或者通过打开查询设计器下部的“联接”选项卡进行。一般不应随便更改连接条件,不然会与实际数据间的关系不符。

“条件”列表中包含如下几项:

(1)=:指字段值与实例相等;


在“查询设计器”中选择“联接”选项卡,如图:2)LIKE:表示“字段名”栏中给出的字段值与“实例”栏中给出的文本值之间执行不完全匹配,它主要针对字符类型。例如,如设置查询条件为“Student.学号 LIKE 9904”,那么诸如“学号”字段前四位为9904的记录都满足该条件;

(3)==:表示在“字段名”栏中给出的字段值与“实例”栏中给出的文本值之间执行完全匹配检查,它也主要是针对字符类型的。

(4)>:即为“字段名”栏中给出的字段的值应大于“实例”栏中给出的值;

(5)>=:即为“字段名”栏中给出的字段的值应大于或等于“实例”栏中给出的值;

(6)<:即为“字段名”栏中给出的字段的值应小于“实例”栏中给出的值;

(7)<=:即为“字段名”栏中给出的字段的值应小于或等于“实例”栏中给出的值;

(8)Is Null:指定字段必须包含Null值;

(9)Between:即为输出字段的值应大于或等于“实例”栏中的


最小值,而小于或等于“实例”栏中的最大值;最小值,而小于或等于“实例”栏中的最大值;

(10)IN(在…之中):即为输出字段的值必须是“实例”栏中所给出值中的一个,在“实例”栏中给出的各值之间以逗号分隔。

此外,“联接”选项卡中的“否”列用于指定.NOT.条件,“逻辑”列用于设置各联接条件和筛选条件之间的逻辑关系(无、.AND.和.OR.),“大小写”列用于指定是否区分大小写。下方的“插入”和“移去”按钮分别用于增加或移去查询条件。

最后,在设置筛选条件时,我们应注意如下几点:

(1)备注字段和通用字段不能用于设置查询条件;

(2)逻辑值的前后必须使用句点号,如.T.;

(3)只有当字符串与查询的表中字段名相同时,要用引号将字符串括起来,否则不需要用引号将字符串括起来;

(4)日期不必用花括号括起来。

返回


6.2.2 最小值,而小于或等于“实例”栏中的最大值;选定查询字段

根据建立查询的目的,选择查询结果中应包含的字段。操作方法与用向导设计查询的方法相同。在本示例中先在“查询设计器”中选择“字段”选项卡,然后从可用字段列表框中选择:Student.学号、Student.姓名、Courses.课程名称、Grade.课程成绩,如图。

单击【添加】

选定的字段列表

选择一个字段

重复操作添加Student.姓名、Courses.课程名称、Grade.课程成绩

返回


设置筛选条件最小值,而小于或等于“实例”栏中的最大值;

输入筛选实例

设置条件逻辑

是否区分大小写

选择筛选字段

6.2.3 筛选记录

选择表中符合条件的一部分记录而不是全部记录是查询的重要任务。此例要求从所有学生的成绩信息中选出“学号”前四位为“9904”和“9804”的所有学生的成绩,可以利用查询设计器中的“筛选”选项卡。“筛选”选项卡可确定用于选择记录的字段和比较准则,以及输入与该字段进行比较的示例值。

在字段名下的下拉选择框中选择“Grade.开课学期”,在“条件”下的下拉选择框中选择“=”,在“实例”下的文本框中输入“第1学期”,

返回


在“逻辑”下的下拉选择框中选择“最小值,而小于或等于“实例”栏中的最大值;AND”,然后再在字段名下的下拉选择框中选择“Student.学号”,在“条件”下的下拉选择框中选择“In”,在“实例”下的文本框中输入“9904,9804”(请注意中间的“,”是En状态下输入的)。

6.2.4查询结果排序

返回

排序决定了查询输出结果中记录或行的先后顺序,我们可以通过“排序依据”选项卡设置查询的排序次序,方法同在用查询向导设计查询介绍的一样,首先从“选定字段”框中选定要使用的字段,


并把它们移到“排序条件”框中,然后利用“排序选项”(从中选择升序或降序)来设置排序条件。本例中设置并把它们移到“排序条件”框中,然后利用“排序选项”(从中选择升序或降序)来设置排序条件。本例中设置Student.学号,升序为排序依据。

单击【添加】

选定的字段列表

选择一个字段

如果还需要添加用于排序的字段,可以重复以上的操作步骤。

返回


6.2.5 并把它们移到“排序条件”框中,然后利用“排序选项”(从中选择升序或降序)来设置排序条件。本例中设置建立分组查询

所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可完成基于一组记录的计算。分组在与某些累计功能联合使用时效果最好,例如SUM(),COUNT(),AVG()等。

如果不想压缩结果记录,则不必设置它。在此例中不设分组查询。如果想求各门课程的平均成绩,可以用“课程名称”进行分类查询。

单击【添加】

选定的字段列表

选择一个字段


运行查询后的结果并把它们移到“排序条件”框中,然后利用“排序选项”(从中选择升序或降序)来设置排序条件。本例中设置

操作步骤如下:

(1)在查询设计器的“字段”选项卡中,单击“函数和表达式”右边的按钮,出现“表达式”生成器;

(2)在“数学”下拉式列表框中双击AVG(expN),在“来源于表”下拉框中选择Grade表,在“字段”列表框中双击“课程成绩”,单击【确定】。即在“函数和表达式”框中自动生成了“AVG(Grade.课程成绩)”这个表达式,用以计算Grade表中课程成绩的平均值。

(3)单击“添加”按钮,该表达式被添加到“选定字段”列表框中。将来查询结果中就会有一列数据求平均值;

(4)单击“分组依据”选项卡,进入“分组依据”窗口,在“可用字段”中选择Grade.课程名称,再单击【添加】按钮,该字段即成为分组字段。

返回


6.2.6 并把它们移到“排序条件”框中,然后利用“排序选项”(从中选择升序或降序)来设置排序条件。本例中设置杂项的设置

经过以上五个步骤,基本上已生成了一个比较全面的查询。接下来还可以通过查询设计器中的“杂项”选项卡做最后处理。

单击“杂项”选项卡,可以看到其间包括“无重复记录”、“交叉数据表”、“全部”、“百分比”这四个复选框和一个微调按钮。

选中“无重复记录”复选框表示对于查询结果如果存在重复记录,则只取相同记录中的一个。选中此项,在查询生成器的SQL语句中会自动加上限定词Distinct,表示去掉重复记录。


当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示X轴、Y轴和图形的单元值。

如,在本示例中,将前面已加入到“选定字段”中的Student.学号字段移去,并按Student.姓名、Courses.课程名称和Grade.课程成绩的顺序调整字段在“选定字段”列表框中的顺序,然后在“杂项”选项卡中选中“交叉数据表”,同时将“分组依据”中的“Grade.课程代号”取消,其它设置不变。

设置

从图中可以看到“交叉数据表”成为了可选。现选中“交叉数据表”项,如图:

返回


6.2.7 当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示定向输出查询结果

查询检索的信息,可以输出到不同的目的地,以用作不同的用途。如果没有选定输出的目的地,查询结果将显示在浏览窗口中。查询输出目的可以是浏览窗口、临时表、表、图形、屏幕、报表、标签等。选择结果的去向方法如下:

单击“查询设计器工具”中的【查询去向】按钮,或者从【查询】菜单中选择【查询去向】,可看到如图所示的“查询去向”对话框。

对话框中的按钮含义如下:


当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示浏览】:在浏览窗口中显示查询结果,这是查询缺省设置;

【临时表】:将查询结果存储在一个临时只读表中。多次查询的结果可放在不同的表内。该表可用于浏览数据,制作报表等,直到用户关闭它们;

【表】:将查询的结果保存在一个命名的表(.DBF )中,此时查询的结果是真正的存放到磁盘上的,多次查询的结果可放在不同的表内;

【图形】:使查询结果可用于Microsoft Graph(包含在VFP6中的一个独立的应用程序)中制作图表;

【屏幕】:在VFP6主窗口或当前活动输出窗口中显示查询结果;

【报表】:将输出送到一个报表文件(.FRX)中;

【标签】:将输出送到一个标签文件(.LBX)中。

选定一个去向,按一定的步骤设置一些属性,然后单击【确定】按钮,系统就将按意图放置查询结果。

假设本例将查询结果保存到临时表中,取临时表名为“查询1”。

返回


6.2.8 当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示运行查询

在完成了查询的设计工作并指定了结果输出去向后,可通过以下五种方式之一运行查询:

■在查询设计器区域内单击右键,在弹出菜单中选择“运行查询”;

■在“项目管理器”中选定查询的名称,然后选定“运行”按钮;

■在“查询”菜单中选择“运行查询”:

■在命令窗口中键入DO 查询名.qpr。

■单击系统常用菜单上的“运行”按钮。

本例中按前述步骤设置后,单击系统菜单上的“运行”按钮运行交叉表查询,并将查询结果保存到临时表“查询1”中,然后再在浏览窗口中单击【显示】|【浏览“查询1”】,结果如右表。

返回


6.3 当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示创建视图

6.3.1 创建本地视图

6.3.2 创建远程视图

返回

退出


6.3.1 当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示创建本地视图

视图可以通过向导和设计器两种方法来创建。

1、 利用向导创建本地视图

用本地视图向导创建本地视图,可采取以下方式:

方式一:

(1)在主窗口下打开【工具】菜单,选择【向导】菜单命令。

(2)再选择【全部】菜单,出现【向导选取】对话框,如图

选择“本地视图向导”

单击滑动按钮

进入到“本地视图向导‘步骤1——字段选取’”

单击【确定】


方式二当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示:

(1)在主窗口下打开【文件】菜单,选择【新建】菜单命令。

(2)选择“视图”,再单击【向导】,将弹出【本地视图向导】对话框。

(3)然后按照向导屏幕上的指示操作。

方式三:

(1)在项目管理器中选定数据库。

(2)选定本地视图,单击【新建】按钮。

(3)单击【视图向导】按钮

(4)然后按照向导屏幕上的指示操作。

方式四:

(1)打开数据库设计器,打开【数据库】菜单。

(2)选择【新建本地视图】,再单击【视图向导】按钮。

(3)然后按照向导屏幕上的指示操作。


本地视图向导:步骤当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示1——字段选取

说明:按照上述几种方式,可以快速建立本地视图,但要强调的是,在项目管理器中创建或使用视图时,项目管理器会自动打开数据库。如果要使用项目以外的表或视图,则必须先打开数据库或事先确认数据库在作用范围内。

本地视图向导对话框如图,可以看到,创建视图大体要经过以下步骤:

(1)字段选取。选择数据库,数据库中的表和表中的字段。如果当前已经打开了一个数据库,则第一步的对话框中显示的


是创建当前数据库的视图,也可以选择其它的数据库。是创建当前数据库的视图,也可以选择其它的数据库。

(2)关联表。建立数据库中表与表之间的关系。

(3)包含记录。指定包含表中的全部记录还是仅匹配的记录。

(4)筛选记录。选定符合条件的记录。

(5)排序记录。为选定的记录按照某一字段进行排序。

(6)限定记录。定制显示一定数量的记录。

(7)完成视图。选择保存视图后浏览还是修改。

例:创建包含Grade表和Courses表的本地视图“视图1”。

单击全部添加按钮

单击单个添加按钮,添加课程名、学时数、学分数

选择表Grade

选择Courses表

字段选择完成后,单击【下一步】,步骤2——为表建立关系。


本地视图向导:步骤是创建当前数据库的视图,也可以选择其它的数据库。2——为表建立关系

说明:在这一步要建立用来建立本地视图的表间的关系。

1、先在父表字段选择下拉选择框中选择要用来建立关系的主关键字;

2、再在子表字段选择下拉选择框中选择用来建立关系的子表关键字;

3、单击【添加】,将设定关系添加到关系列表框中。

上面的字段符合要求,单击【添加】

父表字段选择下拉选择框

子表字段选择下拉选择框

关系设置完成后单击【下一步】进入到步骤2a——字段选取对话框。


本地视图向导:步骤是创建当前数据库的视图,也可以选择其它的数据库。2a——字段选取

生成的本地视图中只包含表中关系相匹配的记录,对应于关系中的内联接的设置结果。

生成的本地视图中包含Grade表中的全部记录和子表中关键字段相匹配的记录,对应于关系中的左联接的设置结果。

生成的本地视图中包含Courses表中全部记录和父表中关键字段相匹配的记录,对应于关系中的右联接的设置结果。

生成的本地视图中包含表中所有的记录,对应于关系中的完全联接的设置结果。

本例中选用默认值:仅包含匹配的行。然后单击【下一步】,进入步骤3——筛选记录。


本地视图向导:步骤是创建当前数据库的视图,也可以选择其它的数据库。3——筛选记录

说明:本地视图向导的筛选记录与查询向导的筛选记录的方式类似。

在本例中不筛选记录。

单击【下一步】,进入到本地视图向导的步骤4——排序记录。


本地视图向导:步骤是创建当前数据库的视图,也可以选择其它的数据库。4——排序记录

说明:在这一步中设置在本地视图的记录顺序。

本例中可先按“学号”排序,学号相同的再按“课程代号”排序。

操作方法与建立查询的记录排序方法相同。先在“可用字段”列表框中选择

“学号”,然后单击【添加】,再选择“课程代号”,再单击【添加】如上图。

排序字段及顺序设置后单击【下一步】,进入本地视图向导:步骤4a——限制记录。


本地视图向导:步骤是创建当前数据库的视图,也可以选择其它的数据库。4a——限制记录

限制记录的方法与建立查询的限制记录的方法完全相同。在本例中仍保持在本地视图中包含所有的记录,因而取默认值,直接单击【下一步】,进入本地视图向导:步骤5——完成。

在第5步中的操作方法也与建立查询的方法相同,现选择“保存本地视图并浏览”,然后单击【完成】。弹出“视图名”对话框。

在“视图名”文本框中输入“视图1”。

输入视图名后单击【确认】按钮,系统显示所建立的本地视图的结果。本地视图向导结束。


2是创建当前数据库的视图,也可以选择其它的数据库。、利用视图设计器创建本地视图

通过本地视图向导建立数据库视图虽然方便,快捷,但这仅对入门者如此,何况用视图向导建立数据库视图最终还要依赖视图设计器。因此,倾向独立进行开发的程序员来说,仅仅学会使用向导是远远不够的,还应学会使用视

图设计器的强大功能来创建视图。

(1)进入视图设计器

进入视图设计器的方法与进入查询设计器的方法基本相同,下面以新建视图的方式进入视图设计器。


启动视图设计器方法是创建当前数据库的视图,也可以选择其它的数据库。

新建一个视图可按以下步骤进入视图设计器:

■选择【文件】|【新建】命令,单击“视图”单选框,再单击【新建文件】按钮。

■在数据库设计器中,选择【数据库】|【新建本地视图】或单击数据库设计器的快捷菜单中的【新建本地视图】|【新视图】按钮。

■在项目管理器中,单击“数据”选项卡,在列表框中选定“本地视图”,再单击【新建】按钮,单击【新建视图】按钮。

修改一个视图可按以下步骤进入视图设计器:

■在数据库设计器窗口中,单击选定需要修改的视图,选择【数据库】|【修改】命令。

■在数据库设计器窗口中,右击需要修改的视图,在出现的快捷菜单中选择【修改】命令。

■在项目管理器中,单击【数据】选项卡,在列表框中选定需要修改的视图,单击【修改】按钮。


最大化上部窗格是创建当前数据库的视图,也可以选择其它的数据库。

添加表

移去表

添加联接

显示SQL窗口

“视图设计器”工具栏说明

添加表:显示“添加表或视图”对话框,从而可以向设计器窗口添加一个表或视图

移去表:从设计器窗口的上窗格中移去选定的表。

添加联接:在视图中的两个表之间创建联接条件

显示/隐藏SQL窗口:显示或隐藏建立当前视图的SQL语句

最大化/最小化上部窗口:放大或缩小视图设计器的上窗格


是创建当前数据库的视图,也可以选择其它的数据库。2)从表中选择所需字段

在进行本地视图设计器之前,先建立Classzc表和Department表,表结构和数据如下:


通过上述方式之一打开视图设计器,在进入设计器之前,需要选定数据库和表,现选定通过上述方式之一打开视图设计器,在进入设计器之前,需要选定数据库和表,现选定GXGLXT数据库 ,如右图:

从中选定表Classzc并单击【添加】按钮,然后单击【关闭】按钮,启动视图设计器。


视图设计器通过上述方式之一打开视图设计器,在进入设计器之前,需要选定数据库和表,现选定

进入视图设计器后,第一步先需要选定字段,选定字段可直接通过字段选项卡进行。其操作方法与查询设计器中选择字段的方法相同。


从“可用字段”列表框里选定通过上述方式之一打开视图设计器,在进入设计器之前,需要选定数据库和表,现选定Classzc.班级简称字段,单击【添加】按钮或双击该字段,则Classzc. 班级简称字段将会出现在右边的“选定字段”列表框中。本次建立的视图里,还需要选定Classzc.学习性质、Classzc.学制二个字段。它们选定的方法与选定Classzc. 班级简称字段一样。如果需选定字段是“可用字段”列表框中的所有字段,可以单击【全部添加】按钮,这样就把所有字段添加到了“选定字段”列表框中去了,可以通过【移去】按钮将其移出来。如果需要全部移出,可以利用【全部移去】按钮快速移出。

要将表中的字段添加到“选定字段”列表框中,除了上述方法外,还可以将鼠标指向视图设计器上部窗口中的表窗口中的字段上,按住鼠标左键或右键拖动一个字段到“选定字段”列表框,该字段就被加入到了“选定字段”列表框中。还可以通过双击字段名将其加入到“选定字段”列表框。表窗口中的*代表表中的全部字段,它也是可以拖动或双击的。若要从“选定字段”列表框中移去字段,也可以使用鼠标拖动或双击。


通过上述方式之一打开视图设计器,在进入设计器之前,需要选定数据库和表,现选定字段”选项卡还有一个【属性】按钮和一个“函数和表达式”文本框。只要“选定字段”列表框中有一个值,【属性】命令按钮就成为可选的了。选择【属性】后,出现图:


属性设置可分为五种类型:字段有效性、显示、匹配字段到类、数据匹配和注释。其中字段有效性、显示、匹配字段到类和注释在第属性设置可分为五种类型:字段有效性、显示、匹配字段到类、数据匹配和注释。其中字段有效性、显示、匹配字段到类和注释在第3章中介绍数据表设计时已经作过说明,视图设计和数据表设计在字段属性上基本类似。

“函数和表达式”文本框及其按钮:

“函数和表达式” 文本框用于输入一个函数和表达式,具体操作只需单击“函数和表达式”文本框后的对话按钮,在随后出现的表达式生成器中书写函数或表达式。此选项的功能是为了生成一个虚拟的字段。

后面的创建步骤与本章前述的用查询设计器设计查询相似,在此不一一阐述。

(3)建立多表关联

前面主要是针对单一的本地表建立视图,虽然很容易,但它的实际功能不大。因为在实际开发中,系统的数据库很复杂,表的关联性很强,用户关心的往往是一些复杂的数据,因此需要建立多表视图。


从定义上讲,多表视图指的是:视图中的字段来源于两个或两个以上的表。但是,在视图中表间的关系既不像数据库中的关系是永久的,也不像表中的关系是暂时的,它不靠索引字段进行联接,而是通过定义一个联接表达式来进行联接,表间的关系是松散的。从定义上讲,多表视图指的是:视图中的字段来源于两个或两个以上的表。但是,在视图中表间的关系既不像数据库中的关系是永久的,也不像表中的关系是暂时的,它不靠索引字段进行联接,而是通过定义一个联接表达式来进行联接,表间的关系是松散的。

可以按如下办法建立表间的联接:

■在视图设计器中单击“联接”选项卡即可设置多表间的关联。

■在“添加表或视图”对话框中,选定表后,单击【添加】按钮,当视图设计器中的表在两个及以上时,视图设计器就会为选定的表建立关联。

说明:用以上的方法建立多表关联,必须有多个表添加到了视图设计器中。后续的操作方法与设计多表查询相似,除不同点外,相同的部分这里不再讲述。

下面我们来建立表Department、Classzc、Student、Courses和Grade五表之间的关联的视图,起名为视图3。


从定义上讲,多表视图指的是:视图中的字段来源于两个或两个以上的表。但是,在视图中表间的关系既不像数据库中的关系是永久的,也不像表中的关系是暂时的,它不靠索引字段进行联接,而是通过定义一个联接表达式来进行联接,表间的关系是松散的。4)与设计多表查询不相同的部分——更新条件

视图的最大特点在于能用视图更新数据,这也是建立视图与建立查询的主要区别,也是视图的重点所在。视图设计器中的“更新条件”选项卡可以用来设置允许视图更新表字段的条件。


从定义上讲,多表视图指的是:视图中的字段来源于两个或两个以上的表。但是,在视图中表间的关系既不像数据库中的关系是永久的,也不像表中的关系是暂时的,它不靠索引字段进行联接,而是通过定义一个联接表达式来进行联接,表间的关系是松散的。更新条件”选项卡选项包括如下内容:

■“表”:指定视图所使用的哪些表可以修改。选择这个下拉列表框中的选项,可以确定哪些表中的字段可以在“字段名”列表框中,以便设置更新条件。此列表中所显示的表都包含了“字段”选项卡“选定字段”列表中的字段。

■【重置关键字】:这个按钮作用是从每个表中选择主关键字字段作为视图的关键字字段。每个主关键字字段是在“字段名”列表中的、在钥匙符号下面打一个对钩的字段,关键字字段可


可用来使视图中的修改与表中的原始记录相匹配。可用来使视图中的修改与表中的原始记录相匹配。

■【全部更新】:可以从字段名文本框中看到一些字段前的铅笔符号下打了一个对钩,这表明这些字段可以更新。在这个按钮中可以选择除了关键字字段以外的所有字段来进行更新,并在“字段名”列表的铅笔符号下打一个对钩。

■“发送SQL更新”:指定是否将视图记录中的修改传送给原始表。如果选择了这个复选框,将把在视图中对记录字段的修改返回到源表中。

■“字段名”列表框:显示了从“表”列表框中所选的表中的字段、并用来输出这些字段,不过这些字段都是可以更新的。在字段文本框中共有下列3种方式字段:

●关键字段(使用钥匙符号作标记),指定该字段是否为关键字段。

●可更新字段(使用铅笔符号作标记),指定该字段是否为可更新字段。

●字段名,显示可标志为关键字字段或可更新字段的输出字段名。


■“SQL WHERE 可用来使视图中的修改与表中的原始记录相匹配。子句包括”:

●“关键字段”:如果在原始表中有一个关键字字段被改变,设置WHERE子句来检测冲突,对于由另一用户对表中原始记录的其他字段所做修改不进行比较。

●“关键字和可更新字段”:设置WHERE子句来检测由某一用户修改了任何可更新的字段的冲突。

●“关键字和已修改字段”:如果从视图首次检索(默认)以后,关键字字段或原始表记录的已修改字段中,某个字段做过修改,设置WHERE子句来检测冲突。

●“关键字段和时间戳”:如果自原始表记录的时间戳首次检索以后,它被修改过,设置WHERE子句来检测冲突。只有当远程表有时间戳列时,此选项才有效。

■“使用更新”:此单选按钮组用于指定字段如何在后端服务器上进行更新。

●“SQL DELETE然后INSERT”:指定先删除原始表记录后,再创建一个新的在视图中被修改的记录。

●“SQL UPDATE”:指定用视图字段中的内容来修改原始表中的字段。

具体说明如何设置更新条件详见6.5在视图中更新数据。

返回


6.3.2 可用来使视图中的修改与表中的原始记录相匹配。创建远程视图

1、 用视图向导创建远程视图

创建使用远程数据(ODBC)的视图,必须存在一个数据库来保存视图,同时还需要存在数据源或命名连接。如果没有打开数据库,系统将提示打开数据库或创建数据库。

在运行“远程视图向导”之前,可以在“选项”对话框的“远程数据”选项卡上设置远程视图和连接的默认选项。也可以在“连接设计器”中创建连接。

如果要利用远程视图向导创建远程视图,则选择【文件】|【新建】命令,在弹出的新建对话框中选中远程视图,然后单击【向导】按钮。就会进入远程视图向导对话框中。或者在数据库设计器工具栏中单击【新建远程视图】按钮,选择使用向导。


创建远程视图主要有以下步骤:可用来使视图中的修改与表中的原始记录相匹配。

1、数据源选取

2、字段选取

3、为表建立关系

4、包含记录

5、排序记录

6、筛选记录

7、完成

在第一步数据源选取中,可以在可用的数据源列表框中选择一种ODBC数据源或者一个已经建立的连接。如果选择的是一种未连接任何数据源的ODBC数据源,系统将显示一个“确认连接”对话框,从中选择一个数据源。当选择的VFP Tables或VFP


Databases可用来使视图中的修改与表中的原始记录相匹配。时,会打开建立数据源对话框。在此对话框中为数据库选择一种类型,同时在Path中输入远程数据源的文件名或者使用【Browse】按钮选择一个文件作为远程数据源。

选择数据源以后,向导就会进入下一步,以后的步骤与本地视图及创建查询没有太大的差别,在此不再赘述。


2可用来使视图中的修改与表中的原始记录相匹配。、利用视图设计器创建远程视图

创建新的远程视图首先必须要有同数据源的连接。

在数据库设计器中单击鼠标右键选择【新建远程视图】或者在【文件】下的【新建】命令,在新建对话框中选择远程视图,并单击【新建文件】按钮。此时会显示选择连接或数据源对话框,在此对话框中选择连接或者可用的数据源。如图。


如果已经存在定义的连接,该对话框中就显示所定义的连接。如果要定义新的连接,可单击如果已经存在定义的连接,该对话框中就显示所定义的连接。如果要定义新的连接,可单击【新建】按钮,出现图示的“连接设计器”。


在数据源下面的下拉选项框中选择如果已经存在定义的连接,该对话框中就显示所定义的连接。如果要定义新的连接,可单击Visual FoxPro Database项,其它项均采用系统默认设置,然后选择【验证连接】按钮。如果为这个连接指定了一个数据库,则会出现“连接成功”的提示信息,否则,将出现如图所示的连接配置(Configure Connection)对话框。

在该对话框中选择【Browse】后将出现图示的“选择数据库”(Select Database)对话框。


在此对话框中可以选择本地存在的数据库或网上邻居中设置为共享的数据库。然后选择在此对话框中可以选择本地存在的数据库或网上邻居中设置为共享的数据库。然后选择【打开】,就会在“连接配置Configure Connection”对话框中“Path”后的文本框中加入所添加的数据库文件名及其所在的路径,如“\\092\FOXPRO上机操作\Visualfp.dbc”。然后按【OK】,系统会告诉“连接成功”。

然后再在“连接设计器”中单击【确定】,接着弹出“保存对话框”,默认的连接名为“连接1”,可以采用默认的连接名,也可以重命名连接名,再单击【确定】。


在保存连接后,“远程视图设计器”进入“打开”对话框。

在视图设计器中对加入的表创建远程视图的操作与建立本地视图的操作一样,此处不再赘述。


3 、控制如何检查更新冲突

如果在一个多用户环境中工作,服务器上的数据也可以被别的用户访问,也许别的用户也在试图更新远程服务器上的记录,为了让VFP检查用视图操作的数据在更新之前是否被别的用户修改过,可使用更新条件选项卡上的选项。

在更新条件选项卡中,SQL WHERE子句包括框中的选项可以帮助管理遇到多用户访问同一数据时应如何更新记录。 在允许更新之前,VFP先检查远程数据源表中的指定字段,看看它们在记录被提取到视图中后有没有改变,如果数据源中的这些记录被修改,就不允许更新操作。

在“更新条件”选项卡中可以设置SQL WHERE子句。

这些选项决定哪些字段包含在UPDATE或DELETE语句的WHERE子句中,VFP正是利用这些语句将在视图中修改或删除的记录发送到远程数据源或源表中,WHERE子句就是用来检查自从提取记录用于视图中后,服务器上的数据是否已改变。


关键字段:当源表中的关键字段被改变时,使更新失败。关键字段:当源表中的关键字段被改变时,使更新失败。

关键字和可更新字段:当远程表中任何标记为可更新的字段被改变时,使更新失败。

关键字和已修改字段:当在本地改变的任一字段在源表中已被改变时,使更新失败。

关键字和时间戳:当远程表上记录的时间戳在首次检索之后被改变时,使更新失败(仅当远程表有时间戳列时有效)。

4、定制视图

同本地视图一样,可以在远程视图中包含表达式,设置提示输入值,也可以设置高级选项来协调与服务器交换数据的方式

(1)控制更新方法

若要控制关键字段的信息实际上在服务器上更新的方式,可使用视图设计器中更新条件选项卡中“使用更新”中的选项。如图


当记录中的关键字更新时,这些选项决定发送到服务器或源表中的更新语句使用什么当记录中的关键字更新时,这些选项决定发送到服务器或源表中的更新语句使用什么SQL命令。

可指定先删除记录,然后使用在视图中输入的新值取代原值(SQL DELETE然后INSERT),也可指定使用服务器支持的SQL UPDATE函数来改变服务器的记录。

(2)在远程视图中添加表达式

若要在视图中添加表达式,可在“筛选”选项卡中,从“字段名”框中选择“表达式”。

当视图基于远程数据源时,在“表达式设计器”中显示的函数反映了服务器所支持的函数。可以查看服务器文档中列出的该服务器所支持的函数列表,VFP不对构造的表达式作语法分析,而是将它们发送到远程服务器上。


5当记录中的关键字更新时,这些选项决定发送到服务器或源表中的更新语句使用什么、建立连接

使用远程视图,无需将所有记录下载到本地计算机上即可提取远程ODBC服务器上的数据子集。可以在本地机上操作这些选定的记录,然后把更改或添加的值返回到远程数据源中。

有两种连接远程数据源的方法,可以直接访问在机器上注册的ODBC数据源,也可以用连接设计器设计自定义连接。

在安装VFP时,选择VFP的“完全”或“自定义”安装选项,就可以把ODBC安装在系统中。

如果想为服务器创建定制的连接,可以使用连接设计器,创建的连接将作为数据库的一部分保存起来,并含有如何访问特定数据源的信息。

使用连接设计器能够创建并修改命名连接。因为连接是作为数据库的一部分存储的,所以仅在有打开的数据库时才能使用连接设计器。

连接设计器对话框中有如下选项:

(1)指定的数据源


当记录中的关键字更新时,这些选项决定发送到服务器或源表中的更新语句使用什么数据源、用户标识、密码指定VFP显示以下三个框:

●数据源:允许从已安装的ODBC数据源列表中选择一个数据源。

●用户标识:如果数据源需要用户名称或标识,允许键入。

●密码:如果数据源需要密码,允许键入密码。

●数据库:可以选择一个数据库,作为所选数据源连接的目标。

■连接串:指定VFP显示连接串文本框,可在其中键入连接串。选择对话按钮,显示选择连接或数据源对话框,如图所示。

可以选择现有文件或机器数据源。

■【验证连接】:可以对那些刚输入了内容的连接进行检查。如果连接成功,则显示对话框提示此消息;如果连接失败,则出现错误信息。如果没有对话指定内容,则显示选择


数据库对话框,从中选择数据源。前文已作介绍。数据库对话框,从中选择数据源。前文已作介绍。

■【新建数据源】:显示“Data Sources”对话框,可以在其中添加、删除或配置数据源。前文已作介绍。

(2)显示ODBC登录提示

●未指定登录信息时显示:如果在命名连接定义中未存储用户标识和密码,则VFP用“ODBC数据源注册”对话框提示用户。

●总显示:指定VFP 总是使用“ODBC数据源注册”对话框提示用户,该框允许用户使用与存储在命名连接中不同的注册ID和密码。

●从不显示:指定VFP从不提示用户。此选项确保更高的安全性。

(3)数据处理

此选项与用户用DBSETPROP( )函数设置的连接属性相对应。

■异步执行:指定异步连接。此选项与Asynchronous连接属性相对应。

■显示警告信息:指定显示不可捕获警告。此选项与Disp


warning数据库对话框,从中选择数据源。前文已作介绍。连接属性相对应。

■批处理:指定以批处理方式进行连接操作。此选项与BatchMode连接属性相对应。

■自动事务处理:指定自动执行事务处理。此选项与Transactions连接属性相对应。

■包大小:当和远程数据位置之间传送信息时,可以指定传送信息网络包的大小(以字节为单位)。在下拉列表中选择或键入一个值。

(4)超时间隔

这些选项设置连接属性的值,也可用DBSETPROP( )函数设置。

■连接(秒):以秒为单位指定连接超时时间间隔。此选项与ConnectTimeout连接属性相对应。

■查询(秒):以秒为单位指定查询超时时间间隔。此选取项与QueryTimeout连接属性相对应。

■空闲(分钟):以分钟为单位指定空闲超时时间间隔。在指定的时间间隔后,活动连接变为不活动。此选项与IdleTimeout连接属性相对应。

■等待时间(毫秒):以毫秒为单位指定在VFP确定SQL语句是否执行完毕之前经过的时间。此选项与WaitTime连接属性相对应。

返回


6.4数据库对话框,从中选择数据源。前文已作介绍。数据库视图的操作

6.4.1 使用视图

6.4.2、显示视图结构

6.4.3、重新命名视图

6.4.4 删除视图

6.4.5 创建视图索引

6.4.6 创建参数化视图

6.4.7 利用视图更新数据

返 回

退 出


6.4.1 数据库对话框,从中选择数据源。前文已作介绍。使用视图

建立视图后,不但可以用它来显示和更新数据,而且还可以通过调整它的属性来提高性能。处理视图类似处理表,可以:

■使用USE命令并指定视图名来打开一个视图。

■使用USE命令关闭视图。

■在【浏览】窗口中显示视图。

■在【查看】窗口中显示已打开的视图的别名。

■将视图作为数据源,供表单或表格控件使用。

若要使用一个视图,可采取如下方法:

■在项目管理器中先选择一个数据库,再选择视图名,然后单击【浏览】按钮,在【浏览】窗口中显示视图。

■使用编程的方式访问视图。

下面的代码在【浏览】窗口中显示存放在c:\gxglxt目录下gxglxt数据库中的视图1:

open database c:\gxglxt\gxglxt

use 视图1


browse数据库对话框,从中选择数据源。前文已作介绍。

在使用一个视图时,视图将作为临时表在自己的工作区打开。如果此视图基于本地表,则VFP6会在另一个工作区同时打开基表。如果没有打开任何表,或先执行Close All命令后再执行以上命令,则视图1在工作区1打开,而其基表则在工作区2打开。要查看基表,可以通过选择系统菜单上的【窗口】|【数据工作期】打开“数据工作期”窗口。但有一个例外,如果视图是基于远程表,则基表将不在工作区中打开。而只在【查看】窗口中显示远程视图的名称。

返回


6.4.2数据库对话框,从中选择数据源。前文已作介绍。、显示视图结构

有时用户只想了解视图的结构,而不关心视图中的数据。这样可以使用带NODATA子句的USE命令来快速显示视图的结构。例如:

open database c:\gxglxt\gxglxt

use 视图1 nodata in 0

Select 视图1

browse

通过运行上面的命令语句,将在【浏览】窗口中看到没有记录的视图1。因为使用NODATA子句时,VFP6为视图1创建一个永远返回.F. 值的WHERE子句,而数据源上没有记录匹配WHERE子句的条件,所以没有记录被选择。

返回


6.4.3数据库对话框,从中选择数据源。前文已作介绍。、重新命名视图

建立一个视图以后,还可以为其重新命名视图,进行视图的重新命名,可以使用项目管理器或用RENAME VIEW命令。

■在项目管理器中先选择一数据库,再右击要重新命名的视图。单击【重命名】按钮,出现一对话框后即可为视图输入新的名称。

■使用RENAME VIEW命令。

例如,下面的代码将视图2重新命名为视图1:

rename view 视图1to  视图2

说明:在重新命名视图之前,必须打开包含要命名视图的数据库。

返回

6.4.4 删除视图

视图同表一样也是可以删除的,删除视图可以使用项目管理器或使用DELETE VIEW命令。

■在项目管理器中选择一个数据库,再选择要删除的视图,然后用鼠标右击,单击【移去】按钮,即可删除所选的视图。


数据库对话框,从中选择数据源。前文已作介绍。使用DELETE VIEW命令。

例如,如果要删除数据库xsglxt中的视图2,可以键入以下的命令语句:

delete view视图2

说明:在删除视图之前,必须打开包含要删除视图的数据库并设置其为当前数据库。

6.4.5 创建视图索引

同为表建立索引一样,也可以为视图建立索引。但与表不同的是,在视图上创建的本地索引不能永久保存,它们随着视图的关闭而消失。为视图建立本地索引,可以使用INDEX ON命令。关于该命令的参数,在创建表的索引时已有介绍。另有一点需要注意的是,在决定是否在视图上建立索引时,要考虑视图结果集合的大小。对于一个大的结果集合来说,索引要花费很长的时间,并可能降低视图的性能。因此,要根据实际情况处理。

返回


6.4.6 数据库对话框,从中选择数据源。前文已作介绍。创建参数化视图

VFP 可以创建具有提示输入值来查询信息的视图,称为参数化视图,这样的视图具有更大的灵活性和更强的适应性。可避免每取一部分记录值就要建立视图的情况。

可用以下方法创建参数化视图:

(1)打开视图设计器,从【查询】菜单中选择【视图参数】命令,此时系统弹出视图参数对话框,如图


数据库对话框,从中选择数据源。前文已作介绍。2)在视图参数对话框中输入参数名及其数据类型。此例中建立一个名为“系部代号”的视图参数,此视图参数可以任意取,但数据类型要和所要查询的记录类型一致。参数名可以是字母字符、数字和单引号的任意组合。

(3)按下确定按钮,就为此视图建立了一个视图参数了。

下面设计一个带参数的视图(视图4):

(1)打开“视图设计器”,选定表Classzc、Student、Course和Grade四个表,并选取. Classzc.系部代号、Classzc.班级名称、Student.学号、Student.姓名、Course.课程名、Grade.开课学期、Grade.课程成绩这7个字段名作为输出字段。

(2) 在“筛选”选项卡中的“字段名”下拉列表框中选择Classzc.系部代号,在“条件”列表框中选定“=”,在“实例”文本框中输入“?系部代号”。这个问号表示引用一个表达式所需要的参数。问号后的文字标识了这个参数的名称。同时还可以设定如“Grade.开课学期=‘?开课学期’”。

(3)选择【查询】|【视图参数】,进入“视图参数”对话框,


在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击【确定】按钮。

(4)通过选择【查询】|【运行查询】命令,或通过单击鼠标右键再选择【运行查询】命令,系统弹出如图所示的视图参数对话框。

在此对话框中可以输入将要查询的参数的某一具体数值,在此输入“05”;在后面弹出的“输入一个字符型值,供‘开课学期’使用”对话框中输入"第1学期"。

单击确定按钮,查询的结果即显示在屏幕上。

返回


6.4.7 在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击利用视图更新数据

在项目管理器中选择“视图3”,单击【修改】,在视图设计器中选择“字段”选项卡,如图。

返回


在上图中,请注意在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击Grade表中的字段。

选择“更新条件”选项卡,进行如图设置:

■设定关键字段和可修改字段。

注意:因为表Grade中每个字段的值都不唯一,所以要用组合关键字(学号+课程代号+开课学期)

■存档并显示结果。 选【文件】|【保存】或从工具栏中单击保存按钮保存此视图。选取菜单【查询】|【运行查询】查看结果,为视图参数输入“04”(带定界符)、“第1学期”后的运行结果如图 :


在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击修改视图数据。既然我们已经为视图3视图文件设定关键字段与可更新字段,也就是设定了视图文件中哪些字段可以经过修改而自动更正原始数据文件内容,现在就来验证这些设定是否生效。

将视图中最后一条记录的“课程成绩”由62改为99。


从结果可以看出:在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击Grade表中的学号和课程成绩已随着视图文件的更改而自动修正了。表示我们设定的可更新字段生效。

99

99

在视图中更改此处数据

更改完毕后操作光标离开这条记录,观察Grade表中相关记录变化的情形。

返回


6.5 在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击利用视图处理自由数据

我们经常需要将一些数据从主数据库中分离出来进行操作,比如在下面的一些情况中:

(1)数据大量的存放在一个地方(大型数据库主要由MIS服务器维护),而我们却只对其中某方面的数据感兴趣,比如我们只想了解990520班的学生,就可以构造一个包含相关信息的视图,然后将数据从主数据库中分离出来,使之成为游离数据,允许对其数据进行更新,最后把变动过的数据提交给来源数据库;

(2)用于地理位置较远的情况,若条件不允许与数据库相连,则可事先将有用的数据子集装在便携机上,独立于主数据库操作这些数据,以后再用这些调整后的数据更新主数据库。

在这样的情况下,我们可以使用Visual FoxPro提供的处理游离数据的功能,用与主数据库相连的视图建立数据的子集,这样就脱离了主数据库对游离数据进行操作,可以直接访问视图,也可以通过应用程序访问。最后,还可以将数据上载回主数据库。

下面我们就介绍如何创建游离视图。


6.6.1 在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击创建游离视图

经过需求分析确定了脱机使用的数据子集之后,就可以使用已有的视图或是创建新视图。如果已有视图返回的记录正是脱机操作时想要的,可直接使用它,否则需要以编程的方式创建视图。游离视图中包含的数据存储在本地机数据库中的一个.DBF文件中。

如果要在游离视图中修改数据,则要在使之游离前确认视图可更新。由于视图是游离的,只能以设置它的更新属性,不能在“视图设计器”中修改游离视图。

可使用CREATE SQL VIEW命令,跟之以CREATEOFFLINE()命令来创建游离视图。例如,以下代码创建一个游离视图,用于显示来自联机数据库中“student”和“grade”表中的数据。由于没有指定更新条件,因此视图是只读的。

CREATE SQL VIEW test1

CONNECTION 连接1

AS SELECT * FROM student INNER JOIN grade;

ON student.学号=grade.学号;

CREATEOFFLINE(“test1”)


6.6.2 在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击显示和修改游离视图

为游离数据创建了视图后,就可以在应用程序中像使用其他视图一样使用这些视图:添加、修改、删除记录。多个用户可以以共享模式同时访问同一数据库中的游离数据。

1、使用游离数据

使用游离数据视图,可以像使用联机视图那样使用表单、报表或应用程序来显示和更新数据。例如以下代码用于打开test1视图:

USE test1

2、管理游离数据

在一些情况下,尤其在多用户环境下,很多人同时操作相同的数据。在把游离数据更新到源数据库之前,可能希望检查一下那些被改动过的数据。使用带有ADMIN字句的USE命令可以查看对游离数据的所有修改,还可以有选择的放弃一些还没有与数据源相连的那些修改。例如,以下代码在管理员模式下打开test1视图:

USE test2 ADMIN


小 结在“参数名”文本框中输入参数名称“系部代号”,在“类型”下拉列表框中选定参数的类型为“字符型”,同样还输入“开课学期”、“字符型”,然后单击

1、查询和视图是VFP6的重要组成部分,是非常相似的一种查询数据库中数据的方法。

2、查询是以磁盘文件形式存放的程序,其扩展名为.QPR,它通过DO命令来执行。

3、视图是一种定制的虚拟表,是依附于基表上的寄生表。

4、建立查询分为单表查询、多表查询和交叉表查询三种。

5、可以通过菜单、命令、项目管理器建立查询,通过菜单还可以使用查询向导,但查询向导的功能有限。

6、视图分为本地视图和远程视图二种。

7、建立本地视图的方法与建立查询的方法相似。

8、建立远程视图需要有远程连接。

9、可以通过视图更新源表中的数据,这是视图与查询的本质区别。

10、查询和视图都可以通过SQL-SELECT语句实现,查询和视图的SQL语句可以通过显示SQL窗口按钮查看。

返回


ad