首页 Visual_FoxPro数据库程序设计_讲议

Visual_FoxPro数据库程序设计_讲议

举报
开通vip

Visual_FoxPro数据库程序设计_讲议Visual_FoxPro数据库程序设计_讲议 Visual FoxPro数据库程序设计 讲议 第一章 Visual FoxPro 数据库基础 1.1 数据库基础知识 ?1.1.1 计算机数据管理的发展 1(数据与数据处理 数据是指存储在某一媒体上能够识别的物理符号。 数据处理是指将数据转换成信息的过程。而信息是一种被加工成特定形式的数据,这种数据形式对数据接收者来说是有意义的。 计算机是用外存储器存储数据;用软件来管理数据;用程序来处理数据。 2(计算机数据管理 数据处理的中心问题是数据管理。...

Visual_FoxPro数据库程序设计_讲议
Visual_FoxPro数据库程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 _讲议 Visual FoxPro数据库程序设计 讲议 第一章 Visual FoxPro 数据库基础 1.1 数据库基础知识 ?1.1.1 计算机数据管理的发展 1(数据与数据处理 数据是指存储在某一媒体上能够识别的物理符号。 数据处理是指将数据转换成信息的过程。而信息是一种被加工成特定形式的数据,这种数据形式对数据接收者来说是有意义的。 计算机是用外存储器存储数据;用软件来管理数据;用程序来处理数据。 2(计算机数据管理 数据处理的中心问题是数据管理。计算机对数据的管理是指对数据的组织、分类、编码、存储、检索和维护提供操作手段。 计算机管理数据经历了由低级到高级的以下几个发展阶段: ?人工管理(20世纪50年代中期以前) 其特点:数据与程序不具有独立性,一组数据对应一组程序。数据不长期保存,程序间存在大量数据冗余。 ?文件系统(20世纪50年代后期至60年代中后期) 这一时期出现了高级语言和操作系统,操作系统中的文件系统是专门管理外存储器中的数据管理系统,数据与程序有了一定的独立性,但数据和程序相互依赖,数据冗余度大。 ?数据库系统(从20世纪60年代后期开始) 为了实现计算机对数据的统一管理,达到数据共享的目的,发展了数据库技术。数据库技术的主要目的是有效地管理和存取大量的数据资源,包括:提高数据的共享性;减小数据的冗余度;提供数据与应用程序的独立性。为数据库的建立、使用和维护而配置的软件称为数据库管理系统DBMS(DataBase Management System)。数据库管理系统是在操作系统的支持下运行的。Visual FoxPro6.0就是一种在微机上运行的32位数据管理系统软件。 ?分布式数据库系统(20世纪70年代后期之后) 分布式数据库系统是数据技术和计算机网络技术紧密结合的产物。 数据库技术与网络技术的结合分为紧密结合与松散结合两大类。因此分布式DBMS分为物理上分布、逻辑上集中的分布式数据结构和物理上分布、逻辑上分布的分布式数据库结构两种。 Visual FoxPro可以实现分布式数据的管理。 ?面向对象数据库系统(20世纪80年代) 面向对象数据库是数据库技术与面向对象程序设计相结合的产物。Visual FoxPro不但仍然支持 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的过程化程序设计,而且在语言上还进行了扩展,提供了面向对象程序设计的强大功能和更大的灵活性。(面向对象的概念及相关知识我们将在第八章详细介绍) ?1.1.2 数据库系统 1(有关数据库的概念 ? 数据库(DataBase) 数据库是存储在计算机存储设备上,结构化的相关数据集合。它不仅包括描述事物的数据本身,而且还包括相关事物之间的联系。数据库中数据结构独立于使用数据的程序,对于数据增减及修改检索操作由系统软件进行统一的控制。 ? 数据库管理系统(DBMS) 数据库的管理系统DBMS是对数据库的建立、使用和维护进行管理软件系统。 ? 数据库应用系统 数据库应用系统是指系统开发人员利用数据库系统资源开发出来的,面向某一类实际应用的应用软件系统。即利用数据库来开发的数据处理实用软件。 ? 数据库管理员 数据库管理员(DBA)是负责全面管理和实施数据库控制和维护的技术人员。其职责包括: ?参与数据库的规划、设计和建立; ?负责数据库管理系统的安装和升级; ?规划和实施数据库备份和恢复; ?控制和监控用户对数据库的存取访问,规划和实施数据库的安全性和稳定性; ?监控数据库的运行,进行性能分析,实施优化; ?支持开发和应用数据库技术。 2(数据库系统的特点 数据库系统中,数据库管理系统(DBMS)是数据库系统的核心。数据库系统的主要特点如下: ? 实现数据共享、减少数据冗余; ? 采用特定的数据模型; ? 具有较高的数据独立性; ? 有统一的数据控制功能。 ?1.1.3 数据模型 1(实体的描述 ? 实体 客观存在并且可以相互区别的事物称为实体。它可以实际的事物,如:学生,图书等;也可能是抽象的事件,如:订货,比赛等。 ? 实体的属性 描述实体的特性称为属性。如:学生实体用(学号,姓名,性别,出生日期)等若干属性来描述。 ? 实体集和实体型 属性值的集合表示一个实体,而属性的集合表示一种实体的类型,称为实体型。同类型的实体集合,称为实体集。 例如:在学生档案实体集中,(1002,李丽,女,10/05/89)表示档案册中一个具体的人。 在Visual FoxPro中,用"表"来存放同一类实体,即实体集。如,档案表、成绩表等。Visual FoxPro中的一个"表"包含若干个字段,字段就是实体的属性。字段的集合组成表中的条记录,代表一个具体的实体,即每一条记录表示一个实体。 2(实体间联系及联系的种类 实体间的对应关系称为联系,它反映现实世界事物间的相互关联。 实体间联系的种类是指一个实体型中可能出现的每一个实体与另一个实体型中多少个具体实体存在联系。两个实体间的联系可以归结为三种类型: ?一对一联系 Visual FoxPro中,一对一的联系表现为主表中的每一条记录只与相关表中的一条记录相关联。 ?一对多联系 Visual FoxPro中,一对多的联系表现为主表中的每一条记录与相关表中的多条记录相关联。 ?多对多联系 Visual FoxPro中,多对多的联系表现为一个表中的多条记录在相关表中同样多条记录与其匹配。 3(数据模型简介 为了反映事物本身及事物之间的各种联系,数据库中的数据必须有一定的结构,这种结构用数据模型来表示。数据模型是数据库管理系统用来表示实体及实体间联系的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。一个具体的数据模型应当正确地反映出数据之间存在的整体逻辑关系。 任何一个数据库管理系统都是基于某种数据模型的。数据库管理系统所支持的数据模型分为三种:层次模型、网状模型、关系模型。因此,使用支持某种特定数据模型的数据库管理系统开发出来的应用系统相应地称为层次数据库系统、网状数据库系统、关系数据库系统。 关系模型是当今最流行的数据库模型。 ?层次数据模型 用树形结构表示实体及其之间联系的模型称为层次模型。此模型实际是由若干个代表实体之间一对多联系的基本层次联系组成的一棵树,它不能直接表示出多对多的联系。 ?网状模型 用网状结构表示实体及其之间联系的模型称为网状模型。网状模型的主要优点是表示多对多的联系具有很大的灵活性。 ?关系数据模型 用二维表结构来表示实体以及实体之间联系的模型称为关系模型。在关系模型中,操作的对象和结果都是二维表,这种二维表就是关系。 1.2 关系数据库 自20世纪80年代以来,新推出的数据库管理系统几乎都支持关系模型,Visual FoxPro就是一种关系数据库管理系统。 ?1.2.1 关系模型 用二维表的形式表示实体和实体间联系的数据模型称为关系数据模型。 1(关系术语 在Visual FoxPro中,一个"表"就是一个关系。 ? 关系:一个关系就是一张二维表,每个关系有一个关系名,在Visual FoxPro中,一个关系存储为一个文件,文件扩展名为.dbf,称为"表"。 对关系的描述称为关系模式,一个关系模式对应一个关系的结构。 ? 元组:在一个二维表中,水平方向的行称为元组,每一行是一个元组,即一条记录。 ? 属性:二维表中垂直方向的列称为属性,每一列有一个属性名。Visual FoxPro中也称为字段及字段名。 ? 域:属性的取值范围,即不同元组对同一个属性的取值所限定的范围。 ? 关键字:属性或属性的组合,其值能够惟一地标识一个元组。在Visual FoxPro中表示为字段或字段的组合。主关键字或候选关键字就起惟一标识一个元组的作用。 ? 外部关键字:如果表中的一个字段不是本表的主关键字或候选关键字,而是另一个表的主关键字或候选关键字,这个字段(属性)就称为外部关键字。 在Visual FoxPro中,把相互之间存在联系的表放到一个数据库中统一管理。数据库文件的类型为.dbc,用个数据库文件来统一管理有关系的表。 这 2(关系的特点 在数据模型中对关系有一定的要求,关系必须具有以下特点: ?关系必须 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 化。即每一个关系模式都必须满足一定的要求,表中不能再包含表。 ?在同一个关系中不能出现相同的属性名,即不允许同一个表中有相同的字段名。 ?关系中不允许有完全相同的元组,即冗余。 ?在一关系中元组的次序无关紧要。 ?在一个关系中列的次序无关紧要。 3(实际关系模型 一个具体的关系模型由若干个关系模式组成。在Visual FoxPro中,一个数据库中中包含相互之间存在联系的多个表。这个数据库文件就代表一个实际的关系模型,同一数据库中的表之间联系常通过不同表中的公共字段来体现。由此可见,关系模型中的各个关系模式不是孤立的。在Visual FoxPro中,一个数据库(.dbc文件)就是一个实际关系模型,它是管理一个或多个有关系的表(.dbf文件)或视图信息的容器。 ?1.2.2 关系运算 关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、联接),有些查询需要几个基本运算的组合。 (传统的集合运算 要求两个关必须有相同的关系模式,即相同结构。 1 ? 并 两个相同结构关系元组组成的集合。 ? 差 两表结构相同,从一个表(R)中去掉另一个表(S)中也有的元组(记录)。 ? 交 两个相同结构表中都有的元组集合。 在Visual FoxPro中没有直接提供传统的集合运算,可以通过其他操作或编写程序来实现。 2(专门的关系运算 ? 选择 从关系中找出满足给定条件的元组的操作称为选择。是从行的角度进行的运算。结果是原关系的一个子集。 ? 投影 从关系模式中指定若干个属性(字段)组成新的关系称为投影。是从列的角度进行的运算。 ? 联接 联接是关系的的横向结合。联结运算将两个关系模式拼接成一个更宽的关系模式,生成的新关系中包含满足联接条件的元组。联接过程是通过联接条件来控制的。 选择和投影运算的操作对象只是一个表,相当于对一个二维表进行切割。联接运算需要两个表作为操作对象。如果需要联接两个以上的表,就当两两进行联接。 ? 自然联接 在联接运算中,按照字段值对应相等为条件进行的联接操作称为等值联接。自然联接是去掉重复属性的等值联接。自然联接是最常用的联接运算。利用专门的关运算可以方便地分解或构造新的关系。 1.3 数据库设计基础 ?1.3.1 数据库设计步骤 1(设计原则 为了合理组织数据,应遵从以下基本设计原则: ? 关系数据库的设计应遵从概念单一化"一事一地"的原则;? 避免在表之间出现重复字段; ? 表中的字段必须是原始数据和基本数据元素;? 用外部关键字保证有关联的表之间的联系。 2(设计的步骤 ? 需求分析 确定建立数据库的目的 ? 确定需要的表 ? 确定所需字段 ? 确定联系 ? 设计求精 ?1.3.2 数据库设计过程 1.4 Visual FoxPro 系统概述 Visual FoxPro 6.0(中文版)是Microsoft公司发布的可视化编程语言Visual Stadio 6.0中的一员。是32位数据库开发系统。 ?1.4.1 Visual FoxPro 6.0 的安装与启动 有四种退出方法: ? 用鼠标左键单击VF标题栏最右面的关闭窗口按钮; ? 从"文件"下拉菜单中选择"退出"选项; ? 单击主窗口左上方的狐狸图标,从窗口下拉菜单中选择"关闭",或按Alt+F4键; ? 在命令窗口中键入QUIT命令,单击Enter键。 ?1.4.2 Visual FoxPro6.0 的主界面 Visual FoxPro 有三种工作方式:利用菜单系统或工具栏按钮执行命令;在命令窗口直接输入命令进行交互操作;利用各种生成器自动产生程序,或者编写FoxPro程序(命令文件),然后执行它。前两种属于交互式工作方式,执行命令文件为自动化工作方式。 (菜单操作 菜单系统是交互方式下实现人机对话的工具。 1 选择菜单项目可以采用三种方法之一: ? 鼠标操作; ? 键盘操作; ? 光标操作。 在Visual FoxPro 6.0 的菜单系统中,菜单栏里的各个选项不是一成不变的。„ „ 2(命令操作 有三种操作方法来显示与隐藏命令窗口: ? 单击命令窗口右上角的关闭按钮可关闭它,通过"窗口"菜单下的"命令窗口"选项可以重新打开; ? 单击"常用"工具栏上的"命令窗口"按钮。按下则显示,弹起则隐藏命令窗口; ? 按Ctrl+F4组合键隐藏命令窗口;按Ctrl+F2组合键显示命令窗口。 3(项目管理器窗口 项目管理器是Visual FoxPro中各种数据和对象的主要组织工具。项目文件以扩展名PJX及PJT保存。“项目管理器”窗口是VFP系统的各类文件“控制中心”。 1.4.3 工具栏的使用 ? 1(显示或隐藏工具栏 2(定制工具栏 3(修改现有工具栏 ?1.4.4 Visual FoxPro 的配置 "对话框或SET命令进行附加的配置设定,还可以通过配置文件进行设置。 Visual FoxPro 可以使用"选项 1(使用"选项"对话框 "工具"菜单下的"选项"打开"选项"对话框。可以在这里用交互方式来查看和设置系统环境。 单击 ?设置日期和时间的显示格式 ? 更改表单的默认大小 ? 设置默认目录 2(保存设置 ? 将设置保存为仅在本次系统运行期间有效; ? 保存为默认设置。 1.5 项目管理器 所谓的项目是指文件、数据、文档和Visual FoxPro 对象的集合。"项目管理器"是VFP中处理数据和对象的主要组织工具。一是它可以把有关的各类文件进行统一组织和管理,可以对VF文件方便创建、修改、删除等操作;二是可以用它方便地编译生成应用文件或可执行文件。 ?1.5.1 创建项目 项目管理器将一个应用程序的所有文件集合成一个有机的整体,形成一个扩展名为.PJX的项目文件。 1(创建项目 创建一个新项目有两种用途:一是用来分类管理其他文件;二是通过项目来生成应用程序(把相关的各类文件整合成一个应用软件)。 2(打开和关闭项目 三种方法: 3(各类文件选项卡(数据、文档、类、代码、其他) 数据选项卡:可以建立和管理——数据库、表、查询和视图。 文档选项卡:可以建立和管理——表单、报表、标签。 类选项卡:用来创建和修改面向对象的事件驱动程序。 代码选项卡:我们主要用其建立和管理程序文件。 其他选项卡:主要用来建立和管理菜单、文本文件及图文件等。 全部选项卡:各类文件集中显示的窗口。 ?1.5.2 使用项目管理器 1(创建文件 2(添加文件 3(修改文件 4(移去文件 5(其他按钮 ?1.5.3 定制项目管理器 1(移动、缩放和折叠 2(拆分项目管理器 3(停放项目管理器 1.6 Visual FoxPro 向导、设计器、生成器简介 ?1.6.1 Visual FoxPro的向导 1(启动向导 2(使用向导 3. 修改用向导创建的项 ?1.6.2 Visual FoxPro的设计器 1(各种设计器 表设计器、数据库设计器、报表设计器、查询设计器、视图设计器、表单设计器、菜单设计器、数据环境设计器、连接设计器。 2(打开设计器 一般四种方法:1 在项目管理器中打开 2 菜单方式打开 3 从显示菜单中打开 4 命令方式打开 ?1.6.3 Visual FoxPro的生成器 是带有选项卡的对话框,用于简化对表、复杂控件和参照完整性代码的创建和修改。 1(启动"表单生成器" 2(对表单中的控件使用相应的生成器 3. 使用自动格式生成器来设置控件格式 4. 使用参照完整性生成器 第二章 Visual FoxPro程序设计基础 在Visual FoxPro中,除了能够对数据表中的数据进行处理,也可以对诸如常量、内存变量等数据表之外的数据进行单独处理。简单的数据处理可以通过函数、表达式和单条命令完成,复杂的数据处理则可能需要编写程序来完成。 本章介绍VFP程序设计基础,包括常量、内存变量、表达式、常用函数、程序的基本结构以及多模块程序设计。 2.1 常量与变量 常量通常是指以文字串形式出现在代码中的数据,代表一个具体的、不变的值。变量用于存储数据,一个变量在不同的时该可以存放不同的数据。常量、变量类型包括数值型(N)、货币型(Y)、字符型(C)、日期型(D)、日期时间型(T)、逻辑型(L)六种。 2.1.1 常量 常量一个非常重要的特点是类型不同的常量书写格式不同。 ? 1(数据值型常量 就是常数,用来表示一个数量大小的具体值,由0 ~ 9、小数点和正负号构成。 也可以用科学记数法形式书写来表示很大或很小的数:如2.845×1012如:56 78 0.15 -56 用2.845E12表式, 5.8×10-12用5.8E-12表式。 2(货币型常量 表示货币值,和数值型常量类似,但要在前放一个美元符号($),如:$57 $68.25 -$78 此类型数据在存储及运算时采用4位小数,如有多余的小数将四舍五入。它没有科学记数法形式。 3(字符型常量 也称为字符串,通常用来表示人名、代码编号、地名、性别、民族、书名等类似代表特定意义的信息。其书写方法是用半角单引号、双引号或方括号(定界符)把字符串扩起来,规定常量的起始和终止。 如:”FDSGED” ”北京” ’海拉尔’ [中国] ”74568” ’我是一个”中国人” ’ 定界符必须成对,如果定界符本身也做字符串内容必须用另一定界符定界。 不包含认何字符的字符串(””)叫空串。与只含空格的字符串(” ”)不同。 [要注意单问号(?)命令与双问号(??)的功能] 4(日期型常量 有两种书写格式,即严格日期格式和传统日期格式,其定界符都是一对花括花。 花括号内年、月、日间用斜杠(/)、连字号(—)、句点(.)或空格做分隔符分隔。 ? 严格日期格式 书写格式固定:{^yyyy-mm-dd},定界符内第一个字付必须是脱字符"^",年份必须4位,书写不受任何环境设置命令影响,能表达一个确切的日期。如:{^2008-08-08} ? 传统日期格式 要根据系统设置来书写,受SET DATE TO和SET CENTURY TO等环境设置命令影响,书写时月、日各为2位,年份可以是2位也可以是4位。如:{01/25/98}、{01/25/1998} VFP默认下不可以使用,只能在 SET STRICTDATE TO 0 时才可以使用。 ?影响日期的格式的相关设置命令有: ? SET MARK TO [日期分隔符] ? SET DATE [TO] AMERICAN|ANSI|JAPAN|„ „ ? SET CENTURY ON | OFF | TO [世纪值] ROLLOVER [年份参照值] ? SET STRICTDATE TO [0|1|2] 5(日期时间型常量 与日期一样有传统及严格两种书写格式,主要在日期书写上有区别,与日期型一样,也受上面的设置命令控制。严格日期时间型是我们常用的书写方式,格式如下:{^yyyy-mm-dd [hh[:mm[:ss]] [a|p]]} 如:{^2008-08-08,11:36:58} 6(逻辑型常量 只有两个值:真(.T.)、假(.F.)。书写时大小写的 .T. 或 .Y. 表示真,大小写的 .F. 或 .N. 表示假。这里的“.”是定界符,必不可少。 ?2.1.2 变量 变量值是能够随时更改的。每个变量有一个变量名,代码通过变量名来访问变量的值。VF变量分为字段变量和内存变量两大类。表中的字段名就是变量,称为字段变量。 内存变量是内存中的一个存储区域,变量值就是存放在这个区域中的数据,变量类型取决于变量值的类型。随着存放数据的变化变量值在变化,类型也随之改变。与常量一样也有相应的6种类型。 1(简单的内存变量 变量都有名,通过变量名来使用变量中存放的数据(访问变量值)。 向简单内存变量赋值不用先定义,赋值时变量不存在将自动产生。有两种赋值格式: ? <内存变量名>=<表达式> ? STORE <表达式> TO <内存变量名表> ? 等号一次给一个变量赋值。STORE 命令可以同时给多个变量赋相同值,变量名间用逗号隔开。 ? 一个变量在使用前并不需要特别的定义或声明,当给变量赋值而变量不存在时系统会自动建立它。 ? 可以对内存变量重新赋值来改变其取值和类型。 ? 当出现内存变量与字段变量同名时,若直接用变量名来访问则系统默认为字段变量,要访问内存变量必须在变量名前加上前缀M.(或M->)。 2(数组 数组是内存中连续的一片存储区域,它由一系列元素组成,每个元素可通过数组名及相应的下标来访问。每个数组元素相当于一个简单变量,可以给元素分别赋不同类型的值。 数组在使用前一般要用DIMENSION或DECLARE命令创建,定义是一维还是二维数组。 格式: DIMENSION <数组名>(<下标上限1>[,<下标上限2>]) [, „ „] DECLARE <数组名>(<下标上限1>[,<下标上限2>]) [, „ „] 数组及数组元素要注意:? 可以使用简单变量的地方都可使用数组元素; ?赋值语句中使用数组名可以给其全部元素赋值;?同一环境中数组名不可与简单内存变量同名; ?赋值语句的表达式位置不能出现数组名; ? 可以用一维数组形式访问二维数组。 ?2.1.3 内存变量常用命令 1(内存变量的赋值 格式1: <内存变量名>=<表达式> 格式2: STORE <表达式> TO <内存变量名表> 2(表达式值的显示 格式1: ? 格式2: ?? 3(内存变量的显示 格式1: LIST MEMORY [LIKE<通配符>][TO PRINTER|TO FILE <文件名>] 格式2: DISPLAY MEMORY [LIKE<通配符>][TO PRINTER|TO FILE <文件名>] 4(内存变量的清除 格式1:CLEAR MEMORY 格式2:RELEASE <内存变量名表> 格式3:RELEASE ALL [EXTENDED] 格式4:RELEASE ALL [LIKE <通配符>|EXCEPT<通配符>] 格式5:CLEAR ALL 5(表与数组之间的数据传递 VFP提供相关命令,可以方便地完成表与数组间的数据交换。 ? 将表的当前记录复制到数组 格式1:SCATTER [FIELDS <字段名表>] [MEMO] TO <数组名> [BLANK] 格式2:SCATTER [FIELDS LIKE <通配符> | FIELDS EXCEPT <通配符>] [MEMO] TO <数组名> [BLANK] ? 将数组数据复制到表的当前记录 格式1:GATHER FROM <数组名> [FIELDS <字段名>] [MEMO] 格式2:GATHER FROM <数组名> [FIELDS LIKE <通配符> | FIELDS EXCEPT <通配符>] [MEMO] 2.2 表 达 式 表达式是由常量、变量和函数通过特定的运算符连接起来的式了。表达式的形式包括: ? 单一的运算对象(常量、变量或函数)。如:23 '中国' (78) ? 由运算符将运算对象连接起来形成的式了。如:45+50 {^2008-10-01}+80 表达式都有值。依据其运算对象及值分为数值表达式、字符表达式、日期时间表达式和逻辑表达式。 ?2.2.1 数值、字符与日期时间表达式 1(数值表达式 由算术运算符将数值型数据(数值类的常量、变量或函数)连接起来形成,结果仍为数值型。 其运算符按优先级别分别是:( )、**或^、*、,、%、,、, 2(字符表达式 由字符串运算符将字符型数据(字符类的常量、变量或函数)连起来形成,结果仍是字符型数据。 运算符只有两个分别是加(+)和减(-)。 3(日期时间表达式 运算符只有两个分别是加(+)和减(-)。书写时格式有一定限制,不能任意组合。 ?2.2.2 关系表达式 1. 关系表达式 也称简单的逻辑表达式,格式一般为:<表达式1><关系运算符><表达式2> 功能是比较两表达式的大小或前后。结果是逻辑型。 运算符:小于(<)、大于(>)、等于(=)、不等于(<> 或 # 或 !=)、小于等于(<=)、大于等于(>=)、字符串精确比较(= =)、子串包含测试($)。 2. 设置字符的排序次序 可以在选项设置对话框窗口中的数据页中设置,也可以用命令 SET COLLATE TO “MACHINE”/”PINYIN”/”STROKE”。 3. 字符串精确比较与EXACT设置 用单等号(=)比较两个字符串时,结果与SET EXACT ON|OFF的设置有关。 4. 赋值与相等比较的区别 <内存变量>=<表达式> (是一条命令语句) <表达式1>=<表达式2> (是一个比较是否相等的关系表达式) 2.2.3 逻辑表达式 由逻辑运算符将逻辑型数据连接起来而形成,其结果仍为逻辑型数据。 ? 运算符有三个按优先顺序依次是:.NOT. 或 ~(逻辑非)、.AND.(逻辑与)、.OR.(逻辑或)。 不同类型运算出现在同一表达式中,先执行算术运算符、字符串运算符和日期时间运算符,其次是关 系运算符,最后执行逻辑运算符。 2.3 常用函数 函数是用程序来实现的一种数据运算或转换。每个函数都有特定的运算或转换功能,都有一个结果,被称为函数值或返回值。函数通常用在表达式中,也可作为一条命令使用,但些时系统忽略它的返回值。 格式:函数名([自变量1[,自变量2[,自变量3[,„„]) 常用函数分五类:数值函数、字符处理函数、日期类函数、数据类型转换函数、测试函数。 ?2.3.1 数值函数 1(绝对值和符号函数 ABS(<数值表达式>) 、SIGN(<数值表达式>) 2(求平方根函数 SQRT (<值不为负的数值表达式>) 3(圆周率函数 PI( ) 4(求整数函数 INT (<数值表达式>) 返回指定数值表达式的整数部分。 CEILING (<数值表达式>) 返回大于或等于指定数值表达式的最小整数 FLOOR (<数值表达式>) 返回小于或等于指定数值表达式的最大整数 5(四舍五入函数 ROUND (<数值表达式1>,<数值表达式2>) 6(求余函数 MOD (<数值表达式1>,<数值表达式2>) 7(求最大值和最小值函数 MAX (<数值表达式1>,<数值表达式2>[,<„„]) MIN (<数值表达式1>,<数值表达式2>[,<„„]) ?2.3.2 字符函数 1(求字符串长度函数 LEN(<字符表达式>) 2(大小写转换函数 LOWER(<字符表达式>)、UPPER(<字符表达式>) 3(空格字符串生成函数 SPACE(<数值表达式>) 4(删除前后空格函数 TRIM (<字符表达式>)、LTRIM (<字符表达式>) ALLTRIM (<字符表达式>) 5(取子串函数 LEFT (<字符表达式>,<长度>)、RIGHT (<字符表达式>,<长度>) SUBSTR (<字符表达式>,<起始位置>[,<长度>]) 6(计算子串出现次数函数 OCCURS (<字符表达式1>,<字符表达式2>) 7(求子串位置函数 AT (<字符表达式1>,<字符表达式2>[,<数值表达式>]) ATC (<字符表达式1>,<字符表达式2>[,<数值表达式>]) 8(子串替换函数 STUFF (<字符表达式1>,<起始位置>,<长度>,<字符表达式2>) 9(字符替换函数 CHRTRAN (<字符表达式1>,<字符表达式2>,<字符表达式3>) 10(字符串匹配函数 LIKE (<字符表达式1>,<字符表达式2>) ?2.3.3 日期和时间函数 1(系统日期和时间函数 DATE( ) 、TIME( )、DATETIME( ) 2(求年份、月份和天数函数YEAR(<日期表达式>|<日期时间表达式>)、MONTH(<日期表达式>|<日期时间表达式>) DAY(<日期表达式>|<日期时间表达式>) 3(时、分和秒函数HOUR(<日期时间表达式>)、MINUTE(<日期时间表达式>)、SEC(<日期时间表达式>) ?3.3.4 数据类型转换函数 1(数值转换成字符串 STR (<数值表达式>[,<长度>[,<小数位数>]]) 2(字符串转换成数值 VAL(<字符表达式>) 3(字符串转换成日期或日期时间 CTOD(<字符表达式>) CTOT(<字符表达式>) 4(日期或日期时间转换成字符串 DTOC(<日期表达式>|<日期时间表达式>[,1]) TTOC(<日期时间表达式>[,1]) 5(宏替换函数 &<字符型变量>[.] 功能替换出字符型变量的内容,即&的值是变量中的字符串。 ?2.3.5 测试函数 1(值域测试函数 BETWEEN (<表达式T>,<表达式L>,<表达式H>) 2(空值(NULL值)测试函数 ISNULL(<表达式>) 3("空"值测试函数 EMPTY(<表达式>) 4(数据类型测试函数 VARTYPE(<表达式>[,<逻辑表达式>]) 5(表文件尾测试函数 EOF([<工作区号>|<表别名>]) 6(表文件首测试函数 BOF([<工作区号>|<表别名>]) 7(记录号测试函数 RECNO([<工作区号>|<表别名>]) 8(记录个数测试函数 RECCOUNT([<工作区号>|<表别名>]) 9(条件测试函数 IIF(<逻辑表达式>,<表达式1>,<表达式2>) 10(记录删除测试函数 DELETED([<工作区号>|<表别名>]) 11(记录查找测试函数 FOUND( ) 2.4 程序与程序文件 ?2.4.1 程序的概念 学习Visual FoxPro目的是要调用它提供的功能来组织和处理数据,完成一些具体任务。调用VFP功能的方式有两种:交互方式和程序方式。 程序是能够完成一定任务的命令的有序集合。这组命令被存放在称为程序文件或命令文件的文本文件中。当运行程序时,系统会自动按一定次序执行程序文件中的命令。较交互方式它有以下特点: ? 可利用编辑器方便地输入、修改和保存程序。 ? 建立后可多次运行,且一个程序中还可以调用另一个程序。 ? 程序中可以使用在命令窗口无法使用的命令和语句。 例:编写程序,计算圆的周长和面积。 Clear &&清除VFP主窗口显示的全部信息 r=3 &&设置圆的半径 * 依次计算周长和面积 p=2*pi()*r S=pi()*r^2 * 输出计算结果 ?”周长是:”,p ?”面积是:”,S return 程序中可以插入注释以提高程序的可读性。其为非执行代码,不影响程序功能。有两种注释方式: ? * <注释内容> 或 NOTE <注释内容> 整行注释,一般对下在的语句进行注释 ? && <注释内容> 在命令行后对当前命令功能进行注释 程序中的每条命令都以回车结尾,如果一行太长可以在行后用分号(;)回车转到下行,表示下行和上行是一条命令。另外在编程时通常可以程序开头或尾添加相关环境设置命令以便对程序整体进行设置或取消。常用的有:SET TALK ON/OFF、SET CENTURY ON/OFF、SET SAFE ON/OFF等。 ?2.4.2 程序文件的建立与执行 1(程序文件的建立与修改 程序文件的建立与修改一般是通过调用VFP系统内置的文本编辑器来进行的。 ? 建立程序文件的步骤操作: ? 从“文件”菜单中选择“新建”命令,在新建对话框中选择“程序”文件类型,来建立,或在项目管理器中的“代码”标签中选择“程序”后点击新建来建立程序文件。也可以在命令窗口输入:MODIFY COMMAND [文件名] 来建立程序文件。 ? 在文本编辑器窗口中输入程序内容。? 保存程序文件。给程序文件命名,程序文件的扩展名是.prg。 ? 修改程序文件操作: ? 文件菜单中选“打开”命令,调出打开对话框;? 在“文件类型”列表中选择“程序”; ? 在文件列表框中选定要打开的文件,并单击“确定”打开该程序文件;? 编辑修改后保存或放弃修改。 也可以在项目中打开要修改的程序文件或用命令:MODIFY COMMAND <文件名> 来打开要修改的程序文件。 2(执行程序文件 可以用多种方式、多次次执行程序。常用的两种方式: ? 从“程序”菜单选择“运行”命令并选要运行的程序文件来执行程序;或在项目中的代码页中选择要运行的程序执行它。 ? 命令方式,在命令窗口输入:DO <文件名> 来运行程序。 当然一个程序也可以在另一个程序文件中用DO <文件名>调用。 在程序文件运行时它中包含的命令将被依次执行,直到所有命令被执行或执行到以下命令: CANCEL 终止程序运行,清除所有的私有变量并返回到命令窗口; DO 转去执行另一个程序;RETURN 结束当前程序的执行,返回到调用它的上级程序,若无上级程序则返回命令窗口。QUIT 退出Visual FoxPro系统,返回到操作系统。 例:通过一个程序D1调用另一个程序T1 ----------------------------------------------------------- * D1程序内容 SET TALK OFF SET DATE TO YMD SET CENTURY ON CLEAR ?”今天的日期是:”,date() DO T1 SET CENTURY OFF SET DATE AMERICAN SET TALK ON ----------------------------------------------------------- *T1程序内容 ?”当前的时间是:” ?time() return ?2.4.3 简单的输入/输出命令 程序的功能一般包括数据输入、数据加工、信息输出三部分,在一些小程序中,传统的专用输入/输入命令仍然很有用。 1(INPUT 命令 命令格式:INUPT [<字符表达式>] TO <内存变量> 当程序执行到该命令时,暂停等待用户从键盘输入数据,回车后继续往下执行。 其中[<字符表达式>]主要用于在屏幕上显示的提示信息;输入的数据可以是常量、变量也可以是表达式,但不能不输入任何内容而直接按回车。 不管理输入的是什么数据必须符合相应的语法要求。如: INPUT “请输入您的姓名:” TO NA 此命令执行后在屏幕上会显示:请输入您的姓名: 并等待您输入信息,输入时不能输入:张三,这样会显示找不到变量的错误提示,因为我们知道这字符型常量在输入时要加定界符即:”张三” ,这样输入就可以了,当然其它的常量在输入时也要按照固定的格式书写。实际这个命令最方便的是接收数值型的 数据,因为数值型数据不需要加定界符。INPUT “请输入您成绩:” TO NA 这个更方便用户使用。 2(ACCEPT 命令 命令格式:ACCEPT [<字符表达式>] TO <(字符型)内存变量> 与上面的INPUT命令功能基本相同,关键是它固定接收字符型数据,在输入常量时不需要加定界符。更适合接收类似:INPUT “请输入您的姓名:” TO NA 的输入语句,在输入姓名时直接:张三 后回车就可以了,当然如果输入:2342 这样的数据它也按照字符型放入TO后的内存中。 3(WAIT 命令 命令格式:WAIT [<字符表达式>] [TO <内存变量>][WINDOWS [AT<行>,<列>]] 显示字符串表达式的值作为提示信息,暂停程序执行,直到用户按任意键或单击鼠标。 其TO后的变量只接收一个字符。 2.5 程序的基本结构 程序结构是指程序中命令或语句执行的流程结构。顺序结构、选择结构和循环结构是程序的三种基本结构。 ?2.5.1 选择结构 支持选择结构的语句包括条件语句(IF — ENDIF)和分支语句(DO CASE — ENDCASE)。 1(简单的条件语句 语句格式: IF <条件> <语句序列1> ENDIF 如果<条件>表达式的值是真(.T.)则执行<语句序列1>,然后执行ENDIF后的语句;否则跳过IF和ENDIF间的<语句序列1>,直接执行ENDIF后的语句。 例:判断一个数是否能被3整除,如果能则显示,这是一个可以被3整除的数~ CLEAR INPUT “请输入待判断的数:” TO X IF X/3=INT(X/3) ?X,”可以被3整除~” ENDIF RETURN 2(一般形式的条件语句 语句格式: IF <条件> <语句序列1> ELSE <语句序列2> ENDIF 如果<条件>表达式的值是真(.T.)则执行<语句序列1>,然后执行ENDIF后的语句;否则执行<语句序列2>,然后执行ENDIF后的语句。 IF 和 ENDIF必须成对出现,分别是入口和出口;条件语句可以嵌套但不能交叉。书写时最好按缩进格式。 例:判断一个数是否能被3整除,如果能则显示,这是一个可以被3整除的数~并示能或不能。 CLEAR INPUT “请输入待判断的数:” TO X IF X/3=INT(X/3) ? X,”能被3整除~” ELSE ? X,”不能被3整除~” ENDIF RETURN 例:判断并输出三个数中的最大数(不用函数条件语句编程实现)。 CLEAR INPUT “请输入第一个数:” TO N1 INPUT “请输入第二个数:” TO N2 INPUT “请输入第三个数:” TO N3 IF N1>=N2 AND N1>=N3 MAX=N1 ELSE IF N2>=N3 MAX=N2 ELSE MAX=N3 ENDIF ENDIF ?”这三个数中最大数是:”,MAX RETURN 3(多分支语句 语句格式: DO CASE CASE <条件1> <语句序列1> CASE <条件2> <语句序列2> …… CASE <条件n> <语句序列n> [OTHERWISE <语句序列>] ENDCASE 依次判断CASE后的条件是否成立。当发现某个CASE后的条件成立时,就执行该CASE和下一个CASE 间的命令序列,然后执行ENDCASE后面的命令。如所有的条件都不成立,则执行OTHERWISE与 ENDCASE之间的命令序列,然后转向ENDCASE后面的语句。 不管有几个CASE条件成立,只有最先成立的那个CASE条件的对应命令序列被执行;如都不成立且没有 OTHERWISE子句,则直接跳出本结构;DO CASE 与 ENDCASE必须成对出现。 例:根据输入的考试成绩,显示出相应的成绩等级。 CLEAR INPUT “输入考试成绩:” TO CJ DO CASE CASE CJ<60 DJ=”不合格” CASE CJ<90 DJ=”合格” OTHERWISE DJ=”优秀” ENDCASE ? “成绩等级:”+DJ RETURN ?2.5.2 循环结构 循环结构也称为重复结构,是指程序在执行过程中,其中的某段代码被重复执行若干 次。被重复执行的代码段通常称为循环体。VFP支持的循环结构语句包括:DO WHILE — ENDDO、FOR — ENDFOR和SCAN — ENDSCAN语句。 1(DO WHILE — ENDDO 语句 是一个功能全面使用频率较高的循环语句。 语句格式: DO WHILE <条件> <命令序列> [LOOP] [EXIT] ENDDO 执行该语句时,先判断<条件>是否为真,如果是真则执行DO WHILE与ENDDO间的循环体,当执行到 ENDDO时,再返回DO WHILE 重新判断循环条件是否为真,确定是否再次执行循环体。若条件为假则 结束循环语句执行ENDDO后的语句。 如果循环体中有LOOP命令,当遇到LOOP时就结束本次循环,不再执行它下面到ENDDO间的语句,提 前返回DO WHILE进行下一次的循环判断;如果循环体中有EXIT命令,当遇到它时就结束循环执行 ENDDO后的语句。 例:计算1+2+3+„„+100的值。 CLEAR I=1 S=0 DO WHILE I<=100 S=S+I I=I+1 ENDDO ?”1+2+3+……+100=”,S RETURN 2(FOR — ENDFOR 语句 该语句通常用于已知循环次数情况下的循环操作。 语句格式: FOR <循环变量>=<初值> TO <终值> [STEP <步长>] <循环体> [LOOP] [EXIT] ENDFOR|NEXT 先将初值赋给循环变量,然后判断循环条件是否成立,若成立,则执行循环体,然后循环变量增加一个步 长值,并在次判断循环条件确定下一次的循环操作。如果条件不成立则结束循环执行ENDFOR后的语句。 ? <步长>默认值是1; ? <初值>、<终值>、<步长>都可以是数值表达式,但只在循环开始被计算一次; ? 可在循体内改变循变量值但循环次数不变; ? LOOP与EXIT功能与DO WHILE循环一样。 例:计算1+2+3+„„+100的值。 CLEAR S=0 FOR I=1 TO 100 S=S+I ENDFOR ?”1+2+3+……+100=”,S RETURN 例:计算1+3+5+„„+99(1到100奇数的和)的值。 CLEAR S=0 FOR I=1 TO 100 STEP 2 S=S+I ENDFOR ?”1+3+5+……+99=”,S RETURN 例:从键盘输入十个数,然后找出其中的最大值和最小值。 CLEAR INPUT “请输入一个数:” TO A STORE A TO MA,MI FOR I=2 TO10 INPUT “请输入一个数:” TO A IF MAA MI=A ENDIF ENDFOR ?’最大值:’,MA ?’最小值:’,MI RETURN 3(SCAN — ENDSCAN 语句 该循环语句也称为扫描循环语句,功能相当于LOCATE、CONTINUE和DO WHILE — ENDDO语句功能的合并。一般只是用于处理表中记录,语句可指明需处理记录的范围及应满足的条件。 语句格式: SCAN [<范围>] [FOR <条件1>] [WHILE <条件2>] <循环体> [LOOP] [EXIT] ENDSCAN 执行该语句时,记录指针自动、依次地在当前表的指定范围内满足条件的记录上移动,对每一条记录执行循环体内的命令。 ? <范围>的默认值是ALL; ? LOOP与EXIT功能与DO WHILE循环一样。 2.6 多模块程序设计 模块是一个相对独立的程序段,它可以被其他模块所调用,也可以去调用其他的模块。通常把被其他模块调用的模块称为子程序,把调用其他模块而没有被其他模块调用的模块称为主程序。把一个应用程序划分成一个个功能相对单一的模块程序,不仅便于程序的开发,也利于程序的阅读和维护。 ?2.6.1 模块的定义和调用 1(模块及其定义 在Visual FoxPro中模块可以命令文件,也可以是过程。 命令文件如前面我们举例的:通过一个程序D1调用另一个程序T1 ----------------------------------------------------------- * D1程序内容 SET TALK OFF SET DATE TO YMD SET CENTURY ON CLEAR ?”今天的日期是:”,date() DO T1 SET CENTURY OFF SET DATE AMERICAN SET TALK ON ----------------------------------------------------------- *T1程序内容 ?”当前的时间是:”+time() return ----------------------------------------------------------- 这时的D1是主程序或称主模块,T1是被D1调用的称做子程序或子模块。 现在我们主要来学习过程的定义和使用: 一般情况下,过程保存在称为过程文件的单独文件里。一个过程文件包含的过程数量不限。过程序文件的建立与程序文件一样也可以用MODIFY COMMAND建立,文件扩展名也是.prg。只不过过程文件中保存的是一个个独立的能完成特定操作的程序段~每个程序段就是一个过程。它们都是以定义命令开始,以专门的结束命令结尾。 过程也可以保存在命令文件的正常代码的后面,这样一个命令文件中就可能包含许多模块。 PROCEDURE|FUNCTION <过程名> 定义过程的语法格式: <命令序列> [RETURN [<表达式>]] [ENDPROC|ENDFUNC] ? 过程的头 PROCEDURE|FUNCTION <过程名> 表示一个过程的开始。 ? 过程的尾 ENDPROC|ENDFUNC 表示一个过程的结束。 ? 过程返回 执行到RETURN时将转回调用程序,并返回表达式值。如缺省RETURN命令,则在过程结束处自动执行一条隐含的RETURN命令,若RETURN不带表达式,则返回逻辑真(.T.)。 2(模块的调用 模块的调用格式有两种: 格式1:使用DO命令 格式2:在名字后加一对小括号 DO <文件名>|<过程名> <文件名>|<过程名>( ) 要调用过程文件中的过程,首先要打开过程文件,打开过程文件的的命令是: SET PROCEDURE TO [<过程文件1>[,<过程文件2>,„]][ADDITIVE] 可以打开一个或多个过程文件。过程文件被打开后,所有过程都可以被调用。如用ADDITIVE,则在打开过程文件时并不关闭以前打开的过程文件。 在命令文件中的过程主要被本命令文件所调用,但也可以在打开时被其它程序调用,或执行SET PROCEDURE命令后其它程序调用其过程。过程文件中的过程不再调用时要及时关闭释放所占内存。关闭过程文件的命令如下: 格式1:SET PROCEDURE TO 功能是关闭所有打开的过程文件。 格式2:RELEASE PROCEDURE <过程文件1>[,<过程文件2>,„] 功能是关闭指定的过程文件。 ?2.6.2 参数传递 模块程序可以接收调用程序传递过来的参数,并能根据接收到的参数控制程序流程或对接收到的参数进行处理,从面提高程序设计的灵活性。 接收参数的命令: PARAMETERS <形参变量1>[ ,<形参变量2>, „] 是声明程序中建立的私有变量; LPARAMETERS <形参变量1>[ ,<形参变量2>, „] 是声明程序中建立的局部变量。 都必须是模块中的第一条可执行命令。 调用模块程序的格式为: 格式1:DO <文件名>|<过程名> WITH <实参1>[,<实参2>,„] 格式2: <文件名>|<过程名> (<实参1>[,<实参2>,„]) 实参可以是常量、变量或一般形式的表达式。调用模块时系统会自动把实参传递给形参。形参数目不能少于实参数目。如多则多余形参取初始值逻辑假(.F.)。 用格式1时,如实参是常量或一般表达式,会把实参值(结果)赋值给形参,称为按值传递。如实参是变量,则传递的不仅仅是变量值,而还有变量的地址,即实参与形参是一个变量(尽管名字可以不同),称为引用传递。 用格式2时,默认都是按值传递。如果是变量,则只有执行:SET UDFPARMS TO REFERENCE 后才是引用传递,当然可以用SET UDFPARMS TO VALUE改为默认的按值传递。 ?2.6.3 变量的作用域 变量除了类型和取值外还有一个重要的属性是它的作用域,指其在什么范围内有效。VF中可分为全局变量、私有变量和局部变量三类。 1(全局变量指在任何模块中都可以使用的变量,也称为公共变量。要先建立后使用,命令格式是: PUBLIC <内存变量表> 功能是建立全局变量同时为它们赋初值逻辑假(.F.) 例:PUBLIC X,Y,S(10) 建立三个全局变量(S是数组)同时把它们都赋值:.F. 建立后就一直有效除非执行CLEAR MEMORY、CLEAR ALL、RELEASE、QUIT命令后才被释放。 2(私有变量 在程序中直接使用(没有通过PUBLIC和LOCAL命令事先声明)而由系统自动隐含建立的变量都是私有变量。其作用范围是建立它的模块及其下属的各层模块。建立它的程序结束时会自动清除。 3(局部变量 只局限在建立它的模块中使用,不能在上层或下层模块中使用。建立它的程序结束时会自动清除。该变量用LOCAL命令建立,格式: LOCAL <内存变量表> 功能是建立局部变量同时为它们赋初值逻辑假(.F.) 隐藏上层模块中可能存在的变量,使得这些变量在子程序中暂时无效,从而在子程序中使用私有或局部变量而不影响上层程序中的同名变量值,当返回上层模块时原变量自动恢复有效,并取原值,可以用以下命令实现: PRIVATE <内存变量表> PRIVATE ALL [LIKE <通配符>|EXCEPT <通配符>] 实际LOCAL命令也具有隐藏在上层模块中建立的同名变量,但它只在定义模块内隐藏上层同名变量,一旦进入下层模块同名变量就会重新出新,所以与PRIVATE命令是不同的。 第三章 Visual FoxPro数据库及其操作 3.1 Visual FoxPro数据库及其建立 ?3.1.1 基本概念 在Visual FoxPro中,数据库是一个逻辑上的概念和手段,通过一组系统文件将相互联系的数据库表及其相关的数据库对象统一组织和管理。VF中把dbf文件称做数据库表,不同于以前版本中数据库的称呼。而在VF中数据库做为另外一类文件,主要用来管理相关表及视图的系统文件。 在建立Visual FoxPro数据库时,相应的数据库名称实际是扩展名为dbc的文件名,同时还会建立dct和dcx文件。即建立一个数据库会同时产生三个文件相同扩展名不同的三个文件。数据库文件不能直接输入数据,我们主要是用它来管理存储相关数据的表文件。 ?3.1.2 建立数据库 三种方法:? 在项目管理器中建立数据库;? 通过“新建”对话框建立数据库; ? 使用命令交互建立数据库。 CREATE|MODIFY DATABASE [DatabaseName|?] ?3.1.3 使用数据库 三种打开方法:? 在项目管理器中打开数据库; ? 通过“打开”对话框打开数据库;? 使用命令打开数据库。 OPEN DATABASE [FileName|?] [EXCLUSIVE|SHARED] [NOUPDATE] [VALIDATE] 关闭数据库的的方法:利用项目管理器关闭、用CLOSE DATABASE或CLOSE ALL关闭。 ?3.1.4 修改数据库 在Visual FoxPro中修改数据库实际是打开数据库设计器,用户可以在利用数据库设计器来管理数据库对象。 三种修改方法:? 在项目管理器中打开数据库设计器; ? 通过“打开”对话框打开数据库设计器;? 使用命令打开数据库设计器。 MODIFY DATABASE [DatabaseName|?] [NOWAIT] [NOEDIT] ?3.1.5 删除数据库 二种删除方法:? 在项目管理器中删除数据库;? 用命令删除数据库 DELETE DATABASE DatabaseName|? [DELETETABLE] [RECYCLE] 相关的环境设置命令:SET SAFETY ON/OFF 3.2 建立数据库表 数据库在含有表之前没有实际用途,本节学习建立数据库表及其相关操作。 ?3.2.1 在数据库中建立表 在关系数据库中将关系也称做表,在FoxBASE和早期的FoxPro中称做数据库文件。 ? 在数据库中建立表最简单和直接的方法就是使用数据库设计器。 建表在表设计器中涉及的一些基本内容: 1. 字段名 2. 字段类型和宽度 3. 空值 4. 字段有效性组框 5. 显示组框 6. 字段注释 ? 在数据库被当前打开的情况下,在命令窗口用CREATE [TatbleName] 也可以建立数据库表。 ? 数据库表建立后,打开及关闭表的方法: 打开:可以利用项目管理器打开、通过数据库设计器打开、通过打开对话框打开、用USE [TatbleName]命令打开; 关闭:利用项目管理器关闭、用命令:USE 、CLOSE DATABASE、CLOSE ALL、CLEAR ALL都可以关闭表文件。 ?3.2.2 修改表结构 有三种方法:1. 在项目管理器中修改;2. 在数据库设计器中修改;3. 用MODIFY STRUCTURE命令修改 修改内容主要包括:对字段名、类型和宽度及有效规则(增加、删除及修改),索引的相关操作。 3.3 表的基本操作 建立表的目的是为了用它来存放数据、管理数据,这就涉及对表中数据记录的添加、删除、修改、查看等操作。本学将学习这些相关操作。做这些操作前必须先打开表。 ?3.3.1 使用浏览器操作表 交互式工作方式下对表操作最简单、方便的方法就是使用BROWSE浏览器,打开浏览器的方法有多种,常用的方法: ? 在项目管理器中打开表浏览器; ? 在数据库设计器中打开表浏览器; ? 在命令方式下先打开表,然后用BROWSE命令打开表浏览器。 在浏览器操作窗口中可以向表中追加记录、修改记录、删除记录(逻辑和物理操作)。 ?3.3.2 增加记录的命令 1. APPEND命令 APPEND、APPEND BLANK 2. INSERT命令 INSERT、INSERT BLANK、INSERT BEFORE、INSERT BEFORE BLANK 注意:如果表上建立了主索引或候选索引则不能用以上命令插入记录。要用SQL语言中的INSERT命令插入。 ?3.3.3 删除记录的命令 ] 1. 置删除标记(逻辑删除)的命令 DELETE [ALL|REST|RECORD n|NEXT n] [FOR 条件2. 恢复记录(取消逻辑删除)的命令 RECALL [ALL|REST|RECORD n|NEXT n] [FOR 条件] 3. 物理删除有删除标记的记录命令 PACK 4. 物理删除表中的全部记录命令 ZAP (删除表中的全部记录不删除表) ?3.3.4 修改记录的命令 1. 用EDIT或CHANGE命令交互式修改 2. 用REPLACE命令直接修改 REPLACE [ALL|REST|RECORD n|NEXT n] 字段1 WITH 表达式1[,字段2 WITH 表达式2] „ „ [FOR 条件] 例:将表中所有学生年龄加1 REPLACE ALL 年龄 WITH 年龄+1 ?3.3.5 显示记录的命令 1. LIST [ALL|REST|RECORD n|NEXT n] [[FIELDS] 字段名表] [FOR 条件] [OFF] [TO PRINTER [PROMPT]|TO FILE 文件名] 2. DISPLAY [ALL|REST|RECORD n|NEXT n] [[FIELDS] 字段名表] [FOR 条件] [OFF] [TO PRINTER [PROMPT]|TO FILE 文件名] ?3.3.6 查询定位命令 1. 用GOTO或GO命令直接定位 GOTO/GO 记录号|TOP|BOTTOM 2. 用SKIP命令相对定位 SKIP [正整数或负整数] 3. 用LOCATE命令查找定位 LOCATE FOR 条件 可以用CONTINUE继续查找下一个满足条件的记录,用FOUND( )函数来判断是否找到。 3.4 索 引 按特定的顺序定位、查看或操作表中的记录,可以使用索引,方便按不同顺序处理记录。 ?3.4.1 基本概念 VF中索引是由指针构成的文件,这些指针逻辑上按照索引关键字值进行排序。索引文件和表的dbf 文件是分别存储的,并且不改变表中记录的物理顺序。VF中的索引分为主索引、候选索引、唯一索引和普通索引四种。 1( 主索引 ? 在指定字段或表达式中不允许出现重复值的索引(建立索引的字段值不允许重复),可以起到主关键字的作用; ? 如字段已有重复值了主索引建立会出错; ? 一个表只能有一个主索引; ? 只有数据库表才可建立主索引,自由表没有主索引。 2( 候选索引 ? 与主索引类似,建立字段或表达式不允许出现重复值,建立字段可以看作候选关键字; ? 如字段已有重复值了候选索引建立会出错; ? 一个表可以建立多个候选索引; ? 数据库表和自由表都可以建立候选索引。 3( 唯一索引 是指索引项的唯一,索引字段或表达式可以有重复值,担在索引生效时除了排序外重复的索引项值只显示一个。自由表和数据库表都可以建立。 4( 普通索引 允许字段或表达式中出现重复值,并且索引项中也允许出现重复值。在一个表中可以建立多个普通索引。自由表和数据库表都可以建立。 索引共同特征是都排序(逻辑排序)~ ?3.4.2 在表设计器中建立索引 1(单项索引 基于一个字段的索引。 2(复合字段索引 基于多个字段上的索引。 ?3.4.3 用命令建立索引 从组织方式来讲共有三类索引:结构复合索引、非结构复合索引、非结构单索引 1(用命令建立结构复合索引 INDEX ON 索引字段或索引表达式 TAG 索引名 [ASCENDING|DESCENDING] [UNIQUE|CANDIDATE] [ADDITIVE] 与表设计器中建立的索引是完全一样的,产生与表名相同扩展名为CDX的索引文件。 2(用命令建立非结构复合索引 INDEX ON 索引字段或索引表达式 TAG 索引名 OF 索引文件名 [ASCENDING|DESCENDING] [UNIQUE|CANDIDATE] [ADDITIVE] 建立的索引信息被放到指定的索引文件中。索引文件的扩展名仍是CDX。 3(用命令建立非结构单索引 INDEX ON 索引字段或索引表达式 TO 索引文件名 每建立一个索引会产生个扩展名为IDX的索引文件。 与表名同名的.CDX索引是一种结构复合压缩索引(在表设计器中直接建立的都是这类索引),是VF数据库中最普通也是最重要的一种索引文件,具有如下特性: 1( 打开表时自动打开; 2( 在同一索引文件中能包含多个索引 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,或索引关键字; 3( 在添加、更改或删除记录时自动维护索引。 非结构的两种索引多是为了与以前版本兼容,一般不再使用。 ?3.4.4 使用索引 1. 打开索引(主要是对非结构索引使用) SET INDEX TO 索引文件名表(同时打开多个索引文件时名间用逗号隔开) 2. 设置当前索引 SET ORDER TO [索引序号|[TAG]索引名] [ASCENDING|DESCENDING] 不管索引升降序,设置时可以重新用ASCENDING或DESCENDING指定排序。 ?3.4.5 使用索引快速定位 SEEK 索引项值 [ORDER 索序号|[TAG]索引名] [ASCENDING|DESCENDING] ?3.4.6 删除索引 DELETE TAG 索引名 DELETE TAG ALL 3.5 数据完整性 在数据库中数据完整性是指保证数据正确的特性,数据完整性一般包括实体完整性、域完整性和参照完整性等。 ?3.5.1 实体完整性与主关键字 实体完整性是保证表中记录惟一的特性,即在一个表中不允许有重复的记录。VF中利用主关键字或候选关键字来保证表中的记录惟一,即保证实体惟一性。 VF中主索引和候选索引有相同的作用。 ?3.5.2 域完整性与约束规则 域即区域范围,通过表设计器中的字段有效性规则来约束录入其中的数据在一定的范围,从而保证录入数据的最大可能正确。 3.5.3 参照完整性与表之间的关联 ? 同一个数据库中的表通常都是有关系的,当插入、删除或修改一个表中的数据时,通过参照引用相互关联的另一个表中的数据,来检查对表的数据操作是否正确。为建立参照完整性,必须首先建立表间的。 设置参照完整性可按以下步骤进行: 1( 建立表之间的联系(父表建立主索引或候选索引,子表对应字段建立普通索引后主索引拖至普通索引上); 2( 清理数据库(物理删除数据库各个表中所有带有删除标记的记录); 3( 设置参照完整性约束(包括更新规则、删除规则和插入规则)。 3.6 自 由 表 不属于任何数据库的表就是自由表。 ?3.6.1 数据库表与自由表 可以将自由表添加到数据库中,使之成为数据库表;也可以将数据库表从数据库中移出,使之成为自由表。 在没有打开数据库时建立的表就是自由表,建立方法有: ? 在项目管理器“数据”选项卡中选择“自由表”来建立; ? 确认当前没打开数据库,通过新建对话框建自由表; ? 确认当前没打开数据库,用CREATE命令建立自由表。 数据库表与自由表比较数据库表有如下特点: ? 数据库表可以使用长表名及长字段名(可以长达128个字符,而自由表不能超过10个字符); ? 数据库表可以指定字段的有效规则、默认值、指定标题及添加注释等(自由表不能); ? 数据库表的字段有默认的控件类; ? 可以为数据库表规定字段级规则和记录级规则; ? 数据库表支持主关键字、参照完整性和表间的联系; ? 数据库表支持INSERT、UPDATE和DELETE事件的触发器。 ?3.6.2 将自由表添加到数据库 在项目管理器或数据库设计器中都可以很方便地将自由表添加到数据库中。也可以使用命令添加: ADD TABLE 自由表名|? [NAME 添加至数据库中的长表名] ?3.6.3 从数据库中移出表 在项目管理器或数据库设计器中都可以很方便地将数据库表移出成为自由表。也可以用命令移出: REMOVE TABLE 数据库表名|?[DELETE] [RECYCLE] 3.7 多个表的同时使用 软件开发中通常要打开多个表操作,如何同时打开多个数据库表或自由表,是我们这节要学习的。 ?3.7.1 多工作区的概念 工作区可以理解为计算机内存中使用表的一个个区域,每个工作区只可以打开一个表,那么要打开多个表就必须使用同样多个工作区,在不同的工作区中打开不同的表。 系统默认总是在第1区中工作,所以我们如果: USE 学生 &&会在系统默认的第1区打开学生表 USE 成绩 &&在第1区打开成绩表,同时先打开的学生表被关闭,我们只能打开一个表文件 如果要同时打开多个表,必须在打开表前先指定工作区: SELECT 工作区号|工作区别名 (工作区号是0至32767间的数字) 最小的工作区号是1,最大的工作区号是32767,最多允许打开32767个表。0区表示工作区号最小的空休工作区(没有被表使用的最小号工作区)。 ?可以先转换工作区然后打开表 例: OPEN DATABASE 学生管理 &&打开学生管理数据库 SELECT 1 &&转到第1工作区 USE 档案 &&在第1工作区打开档案表 SELECT 4 &&转到第4工作区 USE 成绩 &&在第4工作区打开成绩表 SELECT 0 &&转到最小号空休工作区(第2工作区) USE 学生 &&在最小号空休工作区打开学生表 ?也可以在用USE打开表的同时指定在哪个工作区中打开 例: OPEN DATABASE 学生管理 &&打开学生管理数据库 USE 档案 IN 1 &&在第1工作区打开档案表 USE 成绩 IN 4 &&在第4工作区打开成绩表 USE 学生 IN 0 &&在最小号空休工作区(第2工作区)打开学生表 每个表打开后都有两个默认的别名,一个是表名自身,另一个是工作区所对应的别名。前10个工作区的默认别名是A到J,工作区11到32767别名是W11至W32767 这样,上例中我们转到第4工作区对成绩表操作可以有三种转换方式: SELECT 4、SELECT D或SELECT 成绩都可以。 另外也可以在USE打开表时指定别名: USE 学生 ALIAS student &&在当前工作区打开学生表并指定别名为student。 ?3.7.2 使用不同工作区的表 在一个工作区中可以直接利用表名或表的别名引用另一个表中的数据,具体方法是在别名后加上点号分隔符“.”或“->”操作符,然后再接字段名。如上面的例子中我们当前如果在第4区(成绩表所在的区),想在屏幕上显示第1区(学生表)中的姓名和性别字段信息,可以这样用: LIST 学生.姓名,学生->性别 如果 LIST姓名,性别 用它会从当前工作区打开的表中查这两个字段值。 ?3.7.3 表之间的关联 学习参照完整性时建立的永久性联系,不能控制打开在不同工作区有关系表的记录指针联动。而在实际软件开发中这也是需要的,这种联系称为关联,使用SET RELATION命令建立。 SET RELATION TO 索引名 INTO 指针被带动的表名 例:有两个表学生和成绩,当成绩表指针移动时学生表的也对应的移动 OPEN DATABASE 学生管理 USE 学生 IN 1 ORDER 学号 SELECT 0 USE 成绩 SET RELATION TO 学号 INTO 学生 这样,当成绩表中用 GO 4 让计录指针定位到第4条记录时,学生表中的记录也会定位到和成绩表第4条记录学号相同的记录上。 在成绩表所在工作区用 SET RELATION TO 命令可以取消关联。 3.8 排 序 索引实现的是逻辑排序,物理生成新表文件的排序也是经常用到的,我们将在第五章SQL 语言中重点学习,这里我们先了解xBASE数据库就一直使用的一种物理排序命令SORT: SORT TO 将生成的新表名 ON 排序字段1[/A|/D/C][, 排序字段1[/A|/D/C]][,„ „] [ASCENDING|DESCENDING] [FOR 条件] [FIELDS 字段名表] 第四章 关系数据库标准语言SQL SOL是结构化查询语言Structured Query Language的缩写。查询是SQL语言的核心,但不是全部,SQL还包含数据定义、数据操纵和数据控制功能等部分。SQL已经成为关系数据库的标准数据语言,所以现在所有的关系数据库管理系统都支持SQL。 述 SQL语言具有如下主要特点: 4.1 SQL 概 ? SQL是一种一体化的语言,它包括了数据定义、数据查询、数据操纵和数据控制等方面的功能,它可以完成数据库活动中的全部工作。 ? SQL语言是一种高度的非过程化的语言。 ? SQL语言非常简洁,但功能强大。接近英语自然语言,容易学习和掌握。 ? SQL语言可以直接以命令方式交互使用,也可以在程序设计语言中以程序方式使用。使用灵活。 SQL的命令动词: 数据查询:SELECT 数据操纵:INSERT、UPDATE、DELETE 数据定义:CREATE、DROP、ALTER 数据控制:GRANT、REVOKE 4.2 查 询 功 能 SQL的核心是查询。SQL的查询命令也称作SELECT命令,它的基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行。 以下表为以后的例子中使用表: 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) ?4.2.1 简单查询 由SELECT和FROM构成的无条件查询,或由SELECT、FROM和WHERE构成的条件查询。 一般格式: SELECT [DISTINCT] 字段名表 FROM [数据库名!]表名 SELECT [DISTINCT] 字段名表 FROM [数据库名!]表名 WHERE 条件 (※ DISTINCT短语功能是去掉重复值) 例1:检索(查询)档案关系(档案表)中的姓名。 SELECT 姓名 FROM 档案 例2:检索(查询)档案关系(档案表)中的不重复的姓名。 SELECT DISTINCT 姓名 FROM 档案 例3:检索(查询)档案关系(档案表)中的姓名和性别。 SELECT 姓名,性别 FROM 档案 例4:检索(查询)档案关系(档案表)中的所有列。 SELECT * FROM 档案 例5:查询档案表中的性别是男的学生信息。 SELECT * FROM 档案 WHERE 性别=”男” 例6:查询档案表中的性别是女并且毕业成绩大于450分的学生学号、姓名、毕业成绩。 SELECT 学号,姓名,毕业成绩 FROM 档案 WHERE 性别=”女” AND 毕业成绩>450 ?4.2.2 简单的联接查询 基于多个关系(表)的查询。 一般格式: SELECT [DISTINCT] 字段名表 FROM [数据库名!]表名1, [数据库名!]表名2[,[数据库名!]表名3„] WHERE 各表间的联接条件 [AND 其它查询条件] 例1:根据下面的表查询学生的学号、姓名、性别、总分和平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT 档案.学号,姓名,性别,总分,平均分 FROM 档案,成绩 WHERE 档案.学号=成绩.学号 例2:查询女同学生的学号、姓名、性别、总分和平均分。 SELECT 档案.学号,姓名,性别,总分,平均分 FROM 档案,成绩; WHERE 档案.学号=成绩.学号 WHERE 性别=”女” 例3:查询档案表中的所有列加上总分和平均分。 SELECT 档案.*,总分,平均分 FROM 档案,成绩 WHERE 档案.学号=成绩.学号 ?4.2.3 嵌套查询 查询结果出自一个表但条件却涉及另外的多个相关表。 一般格式: SELECT [DISTINCT] 字段名表 FROM [数据库名!]表名 WHERE 字段名 IN (SELECT 字段名 FROM 另一表名) 例1:根据下面的表查询考试学生的姓名(在成绩表中有学号的档案表学生姓名)。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT 姓名 FROM 档案 WHERE 学号 IN (SELECT 学号 FROM 成绩) 例2:查询学号是“10002”、“10005”的学生姓名。 SELECT 姓名 FROM 档案 WHERE 学号 IN (”10002”,”10005”) 等价 SELECT 姓名 FROM 档案 WHERE 学号=”10002” OR学号=”10005” 例3:查询没有参加考试学生的姓名(在成绩表中找不到学号的档案表学生姓名)。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT 姓名 FROM 档案 WHERE 学号 NOT IN (SELECT 学号 FROM 成绩) ?4.2.4 几个特殊运算符 1(查询的条件是在什么范围之内可以使用BETWEEN„AND„ 。 例1:根据下面的表查询毕业成绩在400至500间的学生信息。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) SELECT * FROM 档案 WHERE 毕业成绩 BETWEEN 400 AND 500 2(字符串匹配查询可以使用LIKE运算符。 例2:查询毕业去向是***师的学生信息。 SELECT * FROM 档案 WHERE 毕业去向 LIKE ”%师” ※ 通配符“%”表示0个或多个字符,另外还有一个通配符“_”表示一个字符或汉字。 3(SQL中“!=”及“NOT”的应用。 例3:查询毕业去向不是教师的学生信息。 SELECT * FROM 档案 WHERE 毕业去向!=”教师” 等价 SELECT * FROM 档案 WHERE NOT(毕业去向=”教师”) ?5.2.5 排序 将查询结果排序可以使用ORDER BY短语,格式如下: ORDER BY 字段名1[ASC|DESC][,字段名2[ASC|DESC]„„] 例1:根据下面的表查询学生的姓名、性别、毕业成绩,查询结果按毕业成绩降序。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) SELECT 姓名,性别,毕业成绩 FROM 档案 ORDER BY 毕业成绩 DESC 例2:查询档案表的学生信息,查询结果先按性别升序,性别相同再按毕业成绩降序。 SELECT * FROM 档案 ORDER BY 性别 ASC,毕业成绩 DESC ?4.2.6 简单的计算查询 SQL语言功能完备,它不仅具有一般的检索能力,而且还有计算方式的检索,用于计算机检索的函数有: ? COUNT—计数 ? SUM—求和 ? AVG—计算平均值 ? MAX—不最大值 ? MIN—求最小值 这些函数可以用在SELECT短语中对查询结果进行计算。 例1:查询档案表中学生数。 档案(学号,姓名,性别,民族,学费,毕业成绩,毕业去向) SELECT COUNT(*) AS 学生数 FROM 档案 例2:统计毕业去向个数(档案表中有几种去向)。 SELECT COUNT(DISTINCT 毕业去向) AS 毕业去向个数 FROM 档案 例3:查询档案表中学费总和。 档案(学号,姓名,性别,民族,学费,毕业成绩,毕业去向) SELECT SUM(学费) AS 学费总计 FROM 档案 例4:查询档案表中毕业成绩平均分。 档案(学号,姓名,性别,民族,学费,毕业成绩,毕业去向) SELECT AVG(毕业成绩) 平均分 FROM 档案 例5:查询档案表中毕业成绩的最高分和最低分。 档案(学号,姓名,性别,民族,学费,毕业成绩,毕业去向) SELECT MAX(毕业成绩) 最高分,MIN(毕业成绩) 最低分 FROM 档案 例6:查询档案表中男生的人数、毕业成绩的最高分和最低分。 档案(学号,姓名,性别,民族,学费,毕业成绩,毕业去向) SELECT COUNT(*) 人数,MAX(毕业成绩) 最高分,; MIN(毕业成绩) 最低分 FROM 档案 WHERE 性别=”男” ?4.2.7 分组与计算查询 在实际应用中,利用GROUP BY分组进行计算机查询使用的更广泛。其格式: GROUP BY 分组字段[,分给字段„„][HAVING 分组条件] 例1:查询档案表中各个毕业去向中的人数和毕业成绩平均分。 档案(学号,姓名,性别,民族,学费,毕业成绩,毕业去向) SELECT 毕业去向,COUNT(*) 人数,AVG(毕业成绩) 平均分; FROM 档案 GROUP BY 毕业去向 例2:查询档案表中各个毕业去向中人数多于3人的人数和毕业成绩平均分。 SELECT 毕业去向,COUNT(*) 人数,AVG(毕业成绩) 平均分; FROM 档案 GROUP BY 毕业去向 HAVING 人数>3 例3:查询档案表中男同学各个毕业去向中人数多于3人的人数和毕业成绩平均分。 SELECT 毕业去向,COUNT(*) 人数,AVG(毕业成绩) 平均分; FROM 档案 WHERE 性别=”男” GROUP BY 毕业去向 HAVING COUNT(*)>3 ?4.2.8 利用空值查询(IS NULL) 例1:查询档案表中各个毕业成绩是空的学生信息。 SELECT * FROM 档案 WHERE 毕业成绩 IS NULL 例2:查询档案表中各个毕业成绩不是空的学生信息。 SELECT * FROM 档案 WHERE 毕业成绩 IS NOT NULL ?4.2.9 别名与自联接查询 SQL中允许在FROM短语中为关系名定义别名。 方法举例1:根据下面的表查询考试学生的学号,姓名,总分,平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT 档案.学号,姓名,总分,平均分 FROM 档案,成绩 WHERE 档案.学号=成绩.学号 可以写成: SELECT A.学号,姓名,总分,平均分 FROM 档案 A,成绩 B WHEREA.学号=B.学号 以上的操作中别名不是必须的,但在关系的自联接操作中,别名是必不可少的。 SQL的自联接是将同一关系与其自身进行联接。这种联接是根据一个表中出自同一值域的两个不同字 段进行一对多联系。 实例说明:有这样一个名称为雇员的关系: 雇员号 姓名 经理 101 李楠 102 张杰 101 103 王维 101 104 徐丽 102 104 赵遥 103 雇员号与经理两字段出自同一值域,但是上、下级关系。 此表中李楠是张杰、王维的经理,而张杰又是徐丽的经理,王维又是赵遥的经理。 如果直观列出他们的领导关系可以有自联接完成: SELECT A.姓名,”领导”,B.姓名 FROM 雇员 A,雇员 B; WHERE A.雇员号=B.经理 结果会显示出: 李楠 领导 张杰 李楠 领导 王维 张杰 领导 徐丽 王维 领导 赵遥 ?4.2.10 内外层互相关嵌套查询 是一种内外层互相关的查询,这种查询内层查询的条件需要外层查询提供,而外层查询的条件需要内 层查询的结果。 以前的我们学的是外层查询需要内层查询提供条件值,而内部查询和外部查询无关。如: 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) 1.查询参加考试学生的姓名 FROM 档案 WHERE 学号 IN(SELECT 学号 FROM 成绩) SELECT 姓名 2.查询毕业成绩最高的学生姓名 SELECT 姓名 FROM 档案 WHERE 毕业成绩=; (SELECT MAX(毕业成绩) FROM 档案) 3.查询高于毕业成绩平均分的学生姓名 SELECT 姓名 FROM 档案 WHERE 毕业成绩>; (SELECT AVG(毕业成绩) FROM 档案) 而如果要查询各个毕业去向中毕业成绩最高的学生姓名就必须用内外层互相关嵌套查询了。 SELECT 毕业去向,姓名 FROM 档案 A WHERE 毕业成绩=; (SELECT MAX(毕业成绩) FROM 档案 WHERE 毕业去向=A.毕业去向) ?4.2.11 使用量词和谓词的查询 1. 量词查询格式: <表达式><比较运算符>[ANY|SOME|ALL](子查询) 实例说明: 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) ? 查询比毕业去向是教师中任何一个毕业成绩高或相等的学生信息。 SELECT * FROM 档案 WHERE 毕业成绩>=ANY(SELECT 毕业成绩 FROM; 档案 WHERE 毕业去向=”教师”) SELECT * FROM 档案 WHERE 毕业成绩>=SOME(SELECT 毕业成绩 FROM; 档案 WHERE 毕业去向=”教师”) SELECT * FROM 档案 WHERE 毕业成绩>= (SELECT MIN(毕业成绩) FROM; 档案 WHERE 毕业去向=”教师”) 以上三个SQL语句功能完全相同! ? 查询比毕业去向是教师中所有毕业成绩都高的学生信息。 SELECT * FROM 档案 WHERE 毕业成绩>ALL(SELECT 毕业成绩 FROM; 档案 WHERE 毕业去向=”教师”) SELECT * FROM 档案 WHERE 毕业成绩> (SELECT MAIN(毕业成绩) FROM; 档案 WHERE 毕业去向=”教师”) 以上两个SQL语句功能完全相同! 2. 谓词查询格式: [NOT] EXISTS(子查询) 实例说明: 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) ? 查询参加考试学生的姓名 SELECT 姓名 FROM 档案 WHERE EXISTS(SELECT * FROM 成绩; WHERE 成绩.学号=档案.学号) SELECT 姓名 FROM 档案 WHERE 学号 IN(SELECT 学号 FROM 成绩) 以上两个SQL语句功能完全相同! ? 查询没用参加考试学生的姓名 SELECT 姓名 FROM 档案 WHERE NOT EXISTS(SELECT * FROM 成绩; WHERE 成绩.学号=档案.学号) SELECT 姓名 FROM 档案 WHERE 学号 NOT IN(SELECT 学号 FROM 成绩) 以上两个SQL语句功能完全相同! 4.2.12 超联接查询 ? 前面我们学的联接只是查询出满足联接条件的信息,而超联接查询功能更加强大,可以根据需要查询出更多联接情况的信息,有四种联接情况的格式: 1(普通联接(内部联接) 基本格式:SELECT „„ FROM 左表 INNER JOIN 右表 ON 联接条件 [WHERE 其它条件] 例: 例1:根据下面的表查询学生的学号、姓名、性别、总分和平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT档案.学号,姓名,性别,总分,平均分 FROM 档案 INNER JOIN 成绩; ON 档案.学号=成绩.学号 其中INNER JOIN 也可以写成 JOIN,与下面的查询结果相同,内部联接只是查询出满足联接条件的: SELECT 档案.学号,姓名,性别,总分,平均分 FROM 档案,成绩; WHERE 档案.学号=成绩.学号 例2:根据下面的表查询男学生的学号、姓名、性别、总分和平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT档案.学号,姓名,性别,总分,平均分 FROM 档案 INNER JOIN 成绩; ON 档案.学号=成绩.学号 WHERE 性别=”男” 与下面的查询结果相同: SELECT 档案.学号,姓名,性别,总分,平均分 FROM 档案,成绩; WHERE 档案.学号=成绩.学号 AND 性别=”男” 2(左联接 基本格式:SELECT „„ FROM 左表 LEFT JOIN 右表 ON 联接条件 [WHERE 其它条件] 除满足联接条件的记录出现在查询结果中外,左表中不满足联接条件的记录也出现在查询中,而相关的右表查询字段值是NULL。 例:根据下面的表查询所有学生的学号、姓名、性别和在成绩表中相应的总分和平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT档案.学号,姓名,性别,总分,平均分 FROM 档案 LEFT JOIN 成绩; ON 档案.学号=成绩.学号 3(右联接 基本格式:SELECT „„ FROM 左表 RIGHT JOIN 右表 ON 联接条件 [WHERE 其它条件] 除满足联接条件的记录出现在查询结果中外,右表中不满足联接条件的记录也出现在查询中,而相关的左表查询字段值是NULL。 例:根据下面的表查询学生的学号、姓名、性别和成绩表中所有的总分和平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) 学号,姓名,性别,总分,平均分 FROM 档案 RIGHT JOIN 成绩; SELECT档案. ON 档案.学号=成绩.学号 4(全联接 基本格式:SELECT „„ FROM 左表 FULL JOIN 右表 ON 联接条件 [WHERE 其它条件] 查询的左右表各个字段的所用值全部显示,有满足联接条件的记录在同行输出,不满足联接条件的字段相应列将显示为NULL。 例:根据下面的表查询所有学生的学号、姓名、性别及成绩表中所有的总分和平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) SELECT档案.学号,姓名,性别,总分,平均分 FROM 档案 FULL JOIN 成绩; ON 档案.学号=成绩.学号 注意:超联接查询中多个表联接时,要注意FROM后中间表是连接前后表的纽带必是与前后表都有联接关系的,另外FROM后表名的顺序与条件ON的顺序是相反的。 例:根据下面的表查询借书学生的学号、姓名及借的书名。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 图书(编号,书名,出版社) 借阅(编号,借出日期,学号) SELECT档案.学号,姓名,书名 FROM 档案 INNER JOIN 借阅 INNER JOIN 图书; ON 借阅.编号=图书.编号 ON 档案.学号=借阅.学号 ?4.2.13 集合的并运算 SQL支持集合的并(UNION)运算,可以将具有相同查询字段个数且对应字段值域相同的SQL查询语句用UNION短语联接起来,合并成一个查询结果输出。 例:根据下面的表查询出两个表中的学号,姓名,毕业成绩。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 学生(学号,姓名,毕业成绩) SELECT 学号,姓名,毕业成绩 FROM 档案 UNION; SELECT 学号,姓名,毕业成绩 FROM 学生 ?4.2.14 Visual FoxPro中SQL SELECT的几个特殊选项 1(显示排序查询中的部分结果 基本格式: SELECT TOP 数字 [PERCENT] „„ FROM 表名 [WHERE„„] ORDER BY „„ TOP短语必须与ORDER BY短语同时使用才有效。 “数字”在没PERCENT时是1至32767间的数,有PERCENT时是0.01至99.99间的实数。 例1:根据下面的表查询出两毕业成绩最高的前3名学生信息。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) SELECT TOP 3 * FROM 档案 ORDER BY 毕业成绩 DESC 例2:根据下面的表查询出两毕业成绩最低的20%学生信息。 SELECT TOP 20 PERCENT * FROM 档案 ORDER BY 毕业成绩 ASC 2(将查询结果存放到数组中 在SQL查询语句的尾部添加INTO ARRAY <数组名>可以将查询的结果放入指定的数组中。此操作的主要目的通常是将一个表中的查询数据添到另一个已存在的表中。 例:根据下面的表将档案表男生的学号,姓名,毕业成绩添加到学生表中。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 学生(学号,姓名,毕业成绩) ? SELECT 学号,姓名,毕业成绩 FROM 档案; WHERE 性别=”男” INTO ARRAY LM &&查询的数据被临时存放至数组LM ? INSERT INTO 学号 FROM ARRAY LM &&将数组LM中的学生信息插入学生表尾部 3(将查询结果存放到临时表中 在SQL查询语句的尾部添加INTO CURSOR <临时表名>可以将查询的结果放入指定的临时表中。此操作的通常是将一个复杂的查询分解,临时表通常不是最终结果,可以接下来对临时表操作得到最终结果。生成的临时表是当前被打开的并且是只读的,关闭该文件时将自动删除。 例:根据下面的表将档案表男生的学号,姓名,毕业成绩查询到临时表AA中。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) SELECT 学号,姓名,毕业成绩 FROM 档案; WHERE 性别=”男” INTO CURSOR AA 4(将查询结果存放到永久表中 在SQL查询语句的尾部添加INTO DBF|TABLE <表名>可以将查询的结果放入新生成的指定表中。 例:根据下面的表将档案表男生的学号,姓名,毕业成绩按毕业成绩升序存入到BB表中。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 姓名,毕业成绩 FROM 档案; SELECT 学号, WHERE 性别=”男” ORDER BY 毕业成绩 INTO TABLE BB 5(将查询结果存放到文本文件中 在SQL查询语句的尾部添加TO FILE <文本文件名>可以将查询的结果放入新生成的指定.TXT文件中。 SELECT 学号,姓名,毕业成绩 FROM 档案; ORDER BY 毕业成绩 TO FILE CC WHERE 性别=”男” 6(将查询结果直接输出到打印机 在SQL查询语句的尾部添加TO PRINTER [PROMPT]可以将查询的结果直接输出到打印机。 SELECT 学号,姓名,毕业成绩 FROM 档案; WHERE 性别=”男” ORDER BY 毕业成绩 TO PRINTER 4.3 操 作 功 能 主要指向表中进行数据的插入、更新和删除。对表中数据的操作。 ?4.3.1 插入数据 Visual FoxPro中有标准格式和特殊格式两中。 1( 标准格式: INSERT INTO 表名[(字段名表)] VALUES(插入值表达式1,插入值表达式2,„„) 例:? 向下表中插入一条记录,10008,张析,男,汉,560,教师。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) INSERT INTO 档案 VALUES(”10008”,”张析”,”男”,”汉”,560,”教师”) ? 插入另一条:10009,李娜,女,610,医生。 INSERT INTO 档案(学号,姓名,性别,毕业成绩,毕业去向); VALUES(”10009”,”李娜”,”女”,610,”医生”) 2( 特殊格式: INSERT INTO 表名 FROM ARRAY 数组名 | FROM MEMVAR FROM ARRAY 数组名 说明从指定的数组中插入记录值 FROM MEMVAR 说明根据同名的内存变量来插入记录值,如果同名的变量不存 在,那么相应的字段为默认值或空值。 ?4.3.2 更新数据 格式:UPDATE 表名 SET 字段名1=表达式1 [,字段名2=表达式2„„] [WHERE 条件] 例:把下表中男生的毕业成绩增加50。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) UPDATE 档案 SET 毕业成绩=毕业成绩+50 WHERE 性别=”男” 把表中毕业成绩全部设置为0 UPDATE 档案 SET 毕业成绩=0 ?4.3.3 删除 格式:DELETE FROM 表名 [WHERE 条件] 是逻辑删除指定表中满足条件的记录,如果 要物理删除记录需要继续使用PACK命令。 第三章课后15题:在Visual FoxPro中,假设数据库sdb中数据库表s中有40条件记录,其中年龄age小于20岁的记录有15个,20岁的记录有1个,年龄大于30岁的记录有10个。执行下面的程序后,屏幕显示的结果是 SET DELETE ON OPEN DATABASE SDB DELETE FROM S WHERE AGE BETWEEN 20 TO 30 SELECT S ?RECCOUNT( ) 15 B)16 C)40 D)25 A) 4.4 定 义 功 能 ?4.4.1 表的定义 一般格式:CREATE TABLE|DBF 表名(字段1名 类型(宽度)[NULL|NOT NULL] [CHECK 规则][ERROR 提示信息][DEFAULT 默认值][PRIMARY KEY|UNIQUE] , 字段2名 类型(宽度),„„) 举例学习:建立学院数据库,建立数据库表外语系学生,并设置学号为主索引。 CREATE DATABASE 学院 CREATE TABLE 外语系学生(学号 C(5) PRIMARY KEY, 姓名 C(10), 性别 C(2); CHECK 性别=”男” OR 性别=”女” ERROR ”请输入男或女!” DEFAULT ”男”, ; 出生日期 D, 毕业成绩 N(6,2)) 建立一个名为外语系成绩的表并和刚建立的上表创建永久性联系。 CREATE TABLE 外语系学生(学号 C(5),英语 N(6,2),语文 N(6,2),总分 N(6,2),; FOREIGN KEY 学号 TAG 学号 REFERENCES 外语系学生) ?4.4.2 表的删除一般格式:DROP TABLE 表名 4.4.3 表结构的修改 ? 格式1:ALTER TABLE 表名 ADD|ALTER [COLUMN] 字段名1 类型[(宽度,小数位)] [NULL|NOT NULL][CHECK 规则表达式 [ERROR 提示信息]][DEFAULT 默认值] [PRIMARY KEY|UNIQUE] 格式2:ALTER TABLE 字段名1 ALTER [COLUMN] 字段名2 [NULL|NOT NULL] [SET DEFAULT 默认值][SET CHECK 规则 [ERROR 提示信息]] [DROP DEFAULT][DROP CHECK] 格式3:ALTER TABLE 表名1 [DROP [COLUMN] 字段名] [RENAME COLUMN 字段名1 TO 字段名2] [SET CHECK 规则 [ERROR 提示信息]] [DROP CHECK] [ADD PRIMARY KEY 字段表达式 TAG 索引名] [DROP PRIMARY KEY] [ADD UNIQUE 字段表达式 TAG 索引名] [DROP UNIQUE TAG 索引名] [ADD FOREIGN KEY 字段表达式 TAG 索引名] REFERENCES 表名2 [TAG 索引名] [DROP FOREIGN KEY TAG 索引名] ?4.4.4 视图的定义 在Visual FoxPro中视图是一个定制的虚拟表,可以本地的、远程的或带参数的。视图可以引用一个或多个表,或者引用其他视图。视图是可更新的,它可引用远程表。 在关系数据库中,视图也称作窗口,是操作表的窗口,可以看作是从表中派生出来的虚表。它依赖于表,不能独立存在。数据库表或自由表都可以建立视图,但建视图时必须先打开一个数据库,因为视图不是以独立文件形式保存的,而是在数据库设计器中存放的。 1(建立视图 视图是根据对表的查询定义的,命令格式是: CREATE VIEW 视图名 AS SELECT查询语句 例:根据下面学生管理数据库中的表建立视图NEW_VIEW,视图内容是两个表中的学号,姓名,性别,总分,平均分。 档案(学号,姓名,性别,民族,毕业成绩,毕业去向) 成绩(学号,数学,语文,外语,总分,平均分) MODIFY DATABASE 学生管理 CREATE VIEW NEW_NIEW AS; SELECT 档案.学号,姓名,性别,总分,平均分 FROM 档案 INNER JOIN 成绩; ON 档案.学号=成绩.学号 查询NEW_VIEW视图中女生的信息 SELECT * FROM NEW_VIEW WHERE 性别=”女” 视图可以派生出新的视图,当然信息都是来自他们的父表。 CREATE VIEW ABC AS; SELECT * FROM NEW_VIEW WHERE 性别=”女” 生成新的ABC视图。 2(删除视图 首先打开它的数据库,然后使用下面的命令可以删除视图: DROP VIEW <视图名> 删除上面的ABC视图: DROP VIEW ABC 在关系数据库中,视图始终不真正含有数据,它总是原来表的一个窗口。所以,虽然视图可以像表一样进行各种查询,但是插入、更新和删除操作在视图上却有一定限制。在一般情况下,当一个视图是由单个表导出时可以进行插入和更新操作,但不能进行删除操作;当视图是从多个表导出时,插入、更新手和删除操作都不允许进行。这种限制是很有必要的,它可以避免一些潜在问题的发生。 第五章 查询与视图 查询与视图有很多类似之处,它们有很多交叉的概念和作用,都是为快速、方便地使用数据库中的数据提供的一种方法。 5.1 查 询 ?5.1.1 查询的概念 建立查询文件实际也是利用SQL语句来完成对表或视图查询,只不过通过直观的选择操作来生成SQL语句从而达到查询的目的。查询文件的扩展名是QPR,此种文件是一个文本文件,它的主体是SQL SELECT语句。 ?5.1.2 查询设计器 可以利用“查询设计器”设计查询,但它的基础是SQL SELECT语句。建立查询文件的方法有多种: 1、 用CREATE QUERY命令打开查询设计器来建立; 2、 通过新建对话框选择查询类型来建立查询文件; 3、 在项目管理器的数据选项卡中选择“查询”来建立; 4、 也可以利用SQL SELECT语句直接编辑.QPR文件来建立。 ?5.1.3 建立查询 1、为单个表或视图建立无条件和有条件的、有排序的、输出部分信息的查询; 2、建立计算及分组计算查询; 3、多个表的联接查询 ?5.1.4 查询设计器的局限性 查询设计器只能做一些比较规则的查询,如嵌套查询它就无能为力了。所以它并不能完成所有的SQL SELECT查询功能。 ?5.1.5 使用查询 可以通过项目中的运行,或通过“程序”菜单中的“运行”项来执行,也可以通过以下命令: DO 查询文件名.QPR 扩展名QPR必须加 5.2 视 图 ?5.2.1 视图的概念 视图兼有“表”和“查询”的特点,与查询相类似的地方是,可以用来从一个或多个相关联的表中提取有用信息;与表相似的是可以用来更新其中的信息,并保存结果至表中。可以从本地表、其它视图、存储在服务器上的表或远程数据源中创建视图,所以又分为本地视图和远程视图。 视图是操作表的一种手段,通过视图可以查询表,通过视图可以更新表。视图基于表面又超越表。视图是数据库中的一个特有功能,只有在包含视图的数据库打开时才能使用视图。 ?5.2.2 建立视图 必须先打开数据库才可以建立视图。 1、用CREATE VIEW命令打开查询设计器来建立;2、通过新建对话框选择视图类型来建立; 3、在项目管理器的数据选项卡中选择相关数据库中的“本地视图”或“远程视图”来建立; 4、也可以利用SQL命令CREATE VIEW „„AS„„语句直接建立。 视图设计器与查询设计器的使用几乎完全一样,主要三点不同: 1、 查询设计器的结果是保存为扩展名为QPR的文件在磁盘上可以找到,而视图设计完保存在磁盘上找不到,结果是保存在数据库中; 2、 视图可以用于更新其父表,所以设计器中有“更新条件”选项,而查询设计器没有此项; 3、 视图设计器中没有查询去向,查询设计器中有此项。 ?5.2.3 远程视图与连接 为了建立远程视图,必须首先建立连接远程数据库的“连接”。 5.2.4 视图与数据更新 ? ?5.2.5 使用视图 视图的使用类似于表: 1、 使用USE命令打开或关闭视图(当然只能在数据库打开时); 、 在“浏览器”窗口中显示或修改视图中的记录; 2 3、 使用SQL语句操作视图; 、 在文本框、表格控件、表单或报表中使用视图作为数据源等。 4 适用于基本表的命令基本都可以用于视图。 第六章 表单设计与应用 表单(Form)是Visual FoxPro提供的用于建立应用程序界面的最主要的工具之一。 6.1 面向对象的概念 ?6.1.1 对象与类 对象与类是面向对象方法的两个最基本的概念。 1. 对象 客观世界里的任何实体都可以被看作是对象。可以具体的物,也可以指某些概念。 面向对象的方法解决问题首先是识别出相应的对象,然后抽象出解决问题所要的对象属性和对象方法。属性用来表示对象的状态(特征),方法用来描述对象的行为。方法是描述对象行为的过程,当某一对象接受某一操作或消息时所采取的一系列操作的描述。 2. 类 类与对象关系密切,但并不相同。类是对一类相似对象的性质描述,这些对象具有相同的性质:相同种类的属性及方法。类好比是一类对象的模板,有了类定义后,基于类就可生成这类对象中任何一个对象。这些对象虽然采用相同的属性来表示状态,但它们在属性上的取值完全可以不同。基于某个类生成的对象称为这个类的实例,任何一个对象都是某个类的一个实例。 ?6.1.2 子类与继承 继承表达了一种从一般到特殊的进化过程。在面向对象的方法里,继承是指在基于现有的类创建新类时,新类继承了现有类的方法和属性。之外,可以为新类添加新的方法和属性。把新类称为现有类的子类,而把现有类称为新类的父类。 一个子类的成员一般包括: 1、 从它的父类继承的成员,包括属性、方法; 2、 由子类自己定义的成员,包括属性、方法。 6.2 Visual FoxPro 基类简介 ?6.2.1 Visual FoxPro基类 Visual FoxPro基类是系统本身内含的、并不存放在某个类库中。可以基于基类生成所需的对象,也可以扩展基类创建自己的类。每个基类都有自已的一组属性、方法和事件。 ?6.2.2 容器与控件 Visual FoxPro中的类一般可分为两种类型:容器类和控件类。可分别生成容器对象和控件对象。控件是一个可以以图形化的方式显示出来并能与用户进行交互的对象,如一个命令按钮、一个文本框等。控件通常被放置在一个容器里。容器可以认为是一个特殊控件,能包含其他的控件或容器,如一个表单、页框、表格等。 在对象的嵌套层次关系中,引用其中某个对象,需指明对在嵌套层次中的位置。经常要用到几个属性或关键字:Parent(对象的一个属性,是对象的直接容器对象)、This、ThisForm、ThisFormSet(这三个是关键字,分别表示当前对象、当前表单和当前表单集)。 ?6.2.3 事件 事件是一种由系统预先定义而由用户或系统发出的动作。事件作用于对象,对象识别事件并作对相应反应。事件可以由系统引发,如init事件;也可以由用户引发如Click事件。事件集是固定的,不能由用户定义新的。所有基类都包含Init、Destroy、Error事件。每个对象识别并处理属于自己的事件,但命令按钮组和选项按钮组例外。 6.3 创建与运行表单 可以用CREATEOBJECT函数来生成表单对象,但更多的时候我们利用表单设计器或者表单向导来创建表单文件。 ?6.3.1 创建表单 两种途径:使用表单设计器创建、设计新的或修改已有表单; 使用表单向导创建表单。 1、 使用表单设计器创建表单 三种方法: ? 在项目中创建; ? 通过文件菜单中的新建选表单文件类型创建; ? 用CREATE FORM 或MODIFY FORM创建表单。 在表单设计器环境下,也可以调用表单生成器方便、快速地生成对表操作的表单。调用表单生成器方法有三种: ? 选择“表单”菜单中的“快速表单”命令; ? 单击“表单设计器”工具栏中的“表单生成器”按钮; ? 右键单击表单窗口,然后在弹出的快捷菜单中选择“生成器”命令。 通过上面三种操作中的一种都可以打开“表单生成器”对话框,选择添加相应的数据信息。 保存表单会在磁盘中产生扩展名为.scx的表单文件,还会生成一个扩展表是.sct的备注文件。 2、 使用表单向导创建表单 两种表单向导:“表单向导”适合于创建基于一个表的表单;“一对多表单向导”适合于创建基于两个具有一对多关系的表单。调用表单向导的方法是: ? 在“项目管理器”窗口中,选择“文档”选项卡,选择其中的表单单击“新建”后选“表单向导”建立; ? 通过文件菜单中的新建来选择表单文件,后按表单向导来建立。 3、 修改已有的表单 打开表单设计器进行编辑修改,打开表单文件器进入表单设计环境的方法: ? 在项目管理器中编辑; ? 通过文件菜单中的打开来选择打开文件; ? 通过命令MODIFY FORM打开表单设计器编辑修改。 ?6.3.2 运行表单 四种方法: ? 在项目管理器中运行; ? 在表单设计器环境下运行; ? 通过“程序”菜单中的“运行”命令; ? 命令 DO FORM <表单文件名> [NAME <变量名>] WITH <实参1>[,<实参2>,„ „][LINKED][NOSHOW] 6.4 表单设计器 ?6.4.1 表单设计器环境 表单设计器启动后,VF主窗口会出现表单设计器窗口、属性窗口、表单控件工具栏、表单设计器工具栏及表单菜单。 1. 表单设计器窗口 此窗口内含正在设计的表单,可以向其添加和修改控件。表单只可在此窗口中移动。 2. 属性窗口 此窗口包括对象框、属性设置框和属性、方法、事件列表框。 3. 表单控件工具栏 内含控件按钮,可以方便地向表单中添加控件。 4. 表单设计器工具栏 5. 表单菜单 主要用于创建、编辑表单或表单集及为表单增加新的属性或方法。 ?6.4.2 控件的操作与布局 1. 控件的基本操作 选定控件 ? 移动控件 ? 调整控件大小 ? 复制控件 ? 删除控件 ? 2. 控件布局 利用“布局”工具栏中的按钮,可以方便调整被选控件的相对大小或位置。 3. 设置Tab键次序 设置焦点在控件间的移动顺序。有两种方式来设置Tab键次序:交互方式和列表方式(打开工具菜单中的选项设置对话框,在表单页选择)。 ?6.4.3 数据环境 为表单建立数据环境可以方便设置控件与数据间的绑定关系。数据环境中能包含表单所需要的一些表、视图及表间的关联,通常它们会随关表单的打开而打开,随关表单的关闭而关闭。 1. 数据环境的常用属性 数据环境是一个对象,有自已的属性、方法和事件。常用的两个属性是AutoOpenTables(运行或打开表单时,是否打开数据环境中的表和视图)和AutoCloseTables(当释放或关闭表单时,是否关闭由数据环境指定的表和视图)。 2. 打开数据环境设计器 可以在表单设计器打开时点击“表单设计器”工具栏上的“数据环境”按钮;或“显示”菜单中的“数据环境”命令;也可以在表单上右击鼠标选“数据环境”命令。 3. 向数据环境添加表或视图 两种方法„ „ 4. 从数据环境中移去表或视图 两种方法„ „ 5. 在数据环境中设置和删除关联 „ … 6. 在数据环境中编辑关联 主要通过设置关联的属性完成。常用属性:RelationalExpr、ParentAlias、ChildAlias、ChidOrder、OneToMany 7. 向表单添加字段 两种方法„ „ 6.5 表单属性和方法 ?6.5.1 控件的操作与布局 表单属性大约有100个,多数很少用到。常用的有:AlwaysOnTop、AutoCenter、BackColor、BorderStyle、Caption、Closable、DataSession、MaxButton、MinButton、Movable、Scrollbars、WindowState、WindowType ?6.5.2 常用的事件与方法 1. 运行时事件 ? Load ? Init 2. 关闭时事件 ? Destroy ? Unload 3. 交互时事件 ? GotFocus ? Click ? DblClick ? RightClick ? InteractiveChange 4. 错误时事件 Error 5. 表单的显示、隐藏与关闭方法 ? Show ? Hide ? Release 6. 表单或控件的刷新方法 Refresh 7. 控件的焦点设置方法 SetFocus ?6.5.3 添加新的属性和方法 1. 创建新属性 通过“表单”菜单中的“新建属性”命令来创建。 2. 创建新方法 通过“表单”菜单中的“新建方法程序”命令来创建。 3. 编辑方法或事件代码 … … 6.6 基本型控件 控件分为基本控件和容器控件。基本控件指不能包含其他控件的控件;容器控件是指可包含其他控件的控件。 ?6.6.1 标签(Label) 标签控件用来显示文本,显示的文本在其Caption属性中指定。其标题文本数目最多是256个字符。 此控件可以设置焦点但不能获得焦点。它的常用属性:Caption、Alignment ?6.6.2 命令按钮(Command Button) 命令按钮一般用来完成某个特定功能,如关闭表单、移动记录指针等。实现功能的代码放置在其Click事件中。常用属性: 1、 Default 和Cancel Default值是.T.的按钮是“默认”按钮。一个表单中只能有一个。这个按钮如果焦点不在其上,按Enter键则执行该按钮的Click事件代码。其默认值是.F.。 Cancel值是.T.的按钮是“取消”按钮。一个表单中只能有一个。这个按钮如果焦点不在其上,按Esc键则执行该按钮的Click事件代码。其默认值是.F.。 2、 Enabled属性 指定表单或控件能否响应由用户引发的事件。默认值是.T.。 3、 Visible属性 指定对象是可见还是隐藏。默认值是.T.。 ?6.6.3 文件框(TextBox) 文本框是一种常用控件,可用于输入数据或编辑内存变量、数组元素和非备注型字段内的数据。 1、 ControlSource 属性 为文本框指定要绑定的数据源,数据源是一个字段或内存变量。 2、 Value 属性 如没有设置ControlSource属性,可通过设置该属性为文本框指定初始值。默认值是空串。如果ControlSource 属性指定了字段或内存变量,则Value和ControlSource具有相同的数据和类型。 3、 PasswordChar 属性 指定文本框内显示的是输入的字符还是占位符。 4、 InputMask 属性 指定一个文本框中如何输入和显示数据。 ?6.6.4 编辑框(EditBox) 与文本框一样,也用来输入、编辑数据,但有自己的特点:1、其处理的数据可包含回车符,可以有滚动 条;2、只能输入、编辑字符型数据,包括字符型内存变量、数组元素、字段及备注字段里的内容。 1、 HideSelection 属性 用于设置当编辑框失去焦点时,编辑框中选定的文本是否显示为选定状态。 、 ReadOnly 属性 2 指定用户能否编辑编辑框中的内容。 3、 ScrollBars 属性 指定编辑框是否具有滚动条。 4、 SelStart 属性 返回用户在编辑框中所选文本的起始点位置或插入点位置。 5、 SelLength 属性 返回用户在编辑框中所选文本的字符数。 6、 SelText 属性 返回用户编辑区内选定的文本,如没有选定任何文本则返回空串。 6.6.5 复选框(CheckBox) ? 用于标记一个两值状态.T.或.F.。 1、 Caption 属性 显示标题设置。 2、 ControlSource 属性 指定复选框要绑定的数据源。 3、 Value 属性 设置或返回复选框的状态。 ?6.6.6 列表框(ListBox) 设置条目选择的控件。 1、 RowSourceType 属性与 RowSource 属性 前者是指明列表框中条目的数据源类型,后者是指定列表框中条目的数据源。 2、 ColumnCount 属性 指定列表框的列数。 3、 ControlSource 属性 指定要绑定的数据源。 4、 Value 属性 返回列表框中被选中的条目。 5、 MultiSelect 属性 指定用户能否在列表框控件内进行多重选定。 6、 List 属性 用来存取列表框中数据条目的字符串数组。 7、 ListCount 属性 指明列表框中数据条目的数目。 8、 Selected 属性 指定列表框内的某个条目是否处于选定状态。 ?6.6.7 组合框(ComboBox) 与列表框类似,也是用于提供一组条目供用户从中选择。与列表框区别: ?只有一个条目可见;?不提供多重选择;?有两种形式下拉组合框和下拉列表框,通过Style属性设置。 6.7 容器型控件 ?6.7.1 命令组(CommandGroup) 是包含一组命令按钮的容器控件。命令组和组中的每个按钮对象都有 自己的属性、方法和事件。 1、ButtonCount 属性 指定命令组中命令按钮的数目。默认是两个。 2、Buttons 属性 用于存取命令组中各按钮的数组。 3、Value 属性 指定命令组当前的状态。 ?6.7.2 选项组(OptionGroup) 是包含选项按钮的一种容器。 1、ButtonCount 属性 指定选项组中选项按钮的数目。 2、Buttons 属性 用于存取选项组中每个按钮的数组。 3、ControlSource 属性 指定选项组要绑定的数据源。 4、Value 属性 初始化或返回选项组中被选中的选项按钮。 ?6.7.3 表格(Grid) 1、表格设计基本操作 2、常用的表格属性 ? RecordSourceType 属性与 RecordSource 属性 分别为指明表格数据源的类型和表格数据源。 ? ColumnCount 属性 指定表格的列数。 ? LinkMaster 属性 用于指定表格中所显示的子表的父表名称。 ? ChildOrder 属性 用于指定为建立一对多的关联关系,子表所要用至的索引。 ? RelationalExpr 属性 确定基于父表字段的关联表达式。 3、常用的列属性 ? ControlSource 属性 指定要在列中显示的数据源,常见的是表中的一个字段。 CurrentControl 属性 指定列对象中的一个控件,该控件用来显示和接收列中活动单元格的数据。 ? 4、常用的标头(Header)属性 Caption 属性 ? 指定标头对象的标题文本,显示于列顶部。 ? Alignment 属性 指定标题文本在对象中显示的对齐方式。 ?6.7.4 页框(PageFrame) 1、PageCount 属性 指定一个页框对象中包含的页对象数量。 2、Pages 属性 是一个数组,用于存取页框中的某个页对象。 3、Tabs 属性 指定页框中是否显示页面标签栏。 4、TabStretch 属性 指明页面标题显示的行为方式。 5、ActivePage 属性 指定活动页面,或返回页框中活动页面的页号。 6.8 自定义类 ?6.8.1 使用类设计器创建类 1、调用类设计器2、添加属性3、添加方法4、修改类定义 ?6.8.2 类库管理 1、创建类库2、复制类库3、删除类4、重命名类5、打开类库 ?6.8.3 在创建表单时使用自定义类 常见有两种菜单:下拉式菜单和快捷菜单。 7.1 Visual FoxPro 系统菜单 ?7.1.1 菜单结构 条形菜单与弹出式菜单„ „ ?7.1.2 系统菜单 Visual FoxPro 系统菜单„ „ 相关设置命令: SET SYSMENU ON|OFF|AUTOMATIC|TO [<弹出式菜单名表>]|TO [<条形菜单项名表>] |TO [DEFAULT]|SAVE|NOSAVE 一般常用到将系统菜单恢复成标准配置,可先执行SET SYSMENU NOSAVE,然后执行SET SYSMENU TO DEFAULT。 7.2 下拉式菜单设计 ?7.2.1 菜单设计的基本过程 下拉式菜单设计的基本过程是:调用菜单设计器?定义菜单(此时保存时生成菜单文件[.mnx,.mnt])?生成菜单程序(生成菜单程序文件[.mpr])?运行菜单程序。 ?7.2.2 定义菜单 1、“菜单设计器”窗口2、“显示”菜单 ?7.2.3 为顶层表单添加菜单 其方法和过程如下: ? 设计下拉式菜单; ? 在“常规选项”对话框中选选“顶层表单”复选框; ? 将表单的ShowWindow属性值设置为“2—作为顶层表单”; ? 在表单的Init事件代码中添加调用菜单程序的命令,格式:DO <文件名> WITH THIS [,”<菜单名>”] ; ? 在表单的Destroy事件代码中添加清除菜单命令,格式:RELEASE MENU <菜单名> [EXTENDED] 7.3 快捷菜单设计 建立方法及过程: ? 选择“文件”菜单中的“新建”命令; ? 在新建对话框中选择“菜单”后单点击“新建文件”按钮; ? 在新建菜单对话框中点击“快捷菜单”按钮; ? 设计快捷菜单各项,最后在快捷菜单的“清理”代码中添加清除菜单的命令。格式: RELEASE POPUPS <快捷菜单名> [EXTENDED] ? 在表单设计器环境下,选定需要添加快捷菜单的对象,在此对象的RightClick事件中添加调用快捷菜单 程序的命令: DO <快捷菜单程序文件名> WITH THIS 第七章 报表的设计与应用 最实用的打印文档,是应用程序开发的一个重要组成部分。报表类型文件的扩展名是.frx 。 8.1 创建报表 报表主要包括两部分内容:数据源和布局。VF提供了三种创建报表的方法: 1、 使用报表向导创建;2、 使用快速报表创建;3、 使用报表设计器创建定制的报表。 ?8.1.1 创建报表文件 、报表的布局 1 报表布局定义了报表的打印格式。设计报表就是根据报表的数据源和应用需要来设计报表的布局。 2、使用报表向导创建报表 应首先打开数据源,数据源可以是数据库表或自由表,也可以是视图或临时表。启动报表向导有四种途径: ? 在“项目管理器”中启动; ? 从“文件”采单的新建对话框中启动; ? 从“工具”菜单的“向导”子菜单中启动; ? 点击工具栏上的“报表”按钮启动。 3、使用报表设计器创建报表 可以直接设计或修改报表。有三种方法调用报表设计器: ? 在“项目管理器”中调用; ? 从“文件”采单的新建对话框中调用; ? 使用命令:CREATE REPORT [<报表文件名>] 或 MODIFY REPORT [<报表文件名>] 调用。 4、创建快速报表 是先建立一个简单报表,然后在此基础上做修改,达到快速构造满意报表的目的。 ?8.1.2 报表工具栏 与报表设计有关的工具栏主要两个:报表设计器工具栏、报表控件工具栏。 1、报表设计器工具栏2、报表控件工具栏 8.2 设计报表 ?8.2.1 报表的数据源和布局 1、设置报表数据源2、设计报表布局3、调整带区高度 ?8.2.2 在报表中使用控件 1、标签控件2、线条、矩形和圆角矩形3、域控件4、OLE对象 8.3 数据分组和多栏报表 ?8.3.1 设计分组报表 1、设置报表的记录顺序 为使数据源适合于分组处理记录,必须对数据源进行适当的索引或排序。 2、设计单级分组报表3、设计多级数据分组报表 ?8.3.2 设计多栏报表 1、设置“列标头”和“列注脚”带区2、添加控件3、设置页面 ?8.3.3 报表输出 1、设置报表的页面2、预览报表3、打印输出报表 输出命令:REPORT FORM <报表文件名> [PREVIEW] 第九章 应用程序的开发和生成 学习Visual FoxPro 的目的是为了开发出实用的数据库应用软件。前面我们按各个章节学习了VF建立的各类文件及相关知识,还没有开发一个完整的软件。其实这就好比我们要建一个大楼,所有的材料都有了,就差如何把这些材料有机的结合到一起构筑成楼房了,这一章我们就学习如何把前面学的东西有机的结合到一起生成数据库软件。 9.1 应用程序项目综合实践 ?9.1.1 系统开发基本步骤 一个数据库应用系统通常分为:输入密集型、输出密集型和处理密集型三种。一般都包括以下几个基本组成部分: ? 一个或多个数据库; ? 用户界面,如欢印屏、输入表单、显示表单、工具栏和菜单等; ? 事务处理,如查询、统计和计算等; ? 输出形式与界面,如浏览、排序、报表、标签等; ? 主程序:设置应用程序系统环境和起始点。 1、建立应用程序目录结构 2、用项目管理器组织应用系统 3、加入项目信息 9.1.2 连编应用程序 ? 1、设置文件的“排除”与“包含” 2、设置主程序 3、连编项目 4、连编应用程序 、连编的其他选项 6、运行应用程序 5 ?9.1.3 主程序设计 1、初始化环境 2、显示初始的用户界面 3、控制事件循环 4、组织主程序文件 9.2 使用应用程序生成器 ?9.2.1 使用应用程序向导 1、使用应用程序向导创建项目和应用程序框架 2、应用程序框架 3、应用程序生成器的功能 ?9.2.2 应用程序生成器 1、“常规”选项卡 2、“信息”选项卡 3、“数据”选项卡 4、“表单”选项卡 5、“报表”选项卡 6、“高级”选项卡 7、重新启动应用程序生成器 9.3 应用程序开发实例——『龙脉学籍管理系统』 „ …
本文档为【Visual_FoxPro数据库程序设计_讲议】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_769254
暂无简介~
格式:doc
大小:150KB
软件:Word
页数:79
分类:互联网
上传时间:2017-10-01
浏览量:12