Page 1

Visual FoxPro 数据库管理系统教程 主

副主编

杨晓红


当今世界已进入信息时代,以计算机技术为代表的高新技术飞速发展,计算机的应用正向 人类生产、生活的各个领域迅速渗透。是否掌握一定的计算机应用能力已成为衡量新世纪高技 术人才的重要标准之一。 信息管理是计算机应用最广泛的领域之一。数据库技术是当前计算机信息管理采用的主要 技术手段。为了适应数据库技术的新发展,满足高等院校非计算机专业计算机应用技术教育的 需要,我们组织编写了这本《Visual FoxPro 数据库管理系统教程》。 Visual FoxPro 是小型数据库管理系统的代表。它以强大的功能,完整而又丰富的工具, 较高的处理速度和友好的界面等特点,受到广大用户的欢迎。Visual FoxPro 提供了一个集成 化的系统开发环境,它使数据的组织与操作变得简单方便。它不仅支持传统的结构化程序设计, 而且支持面向对象的程序设计。利用它提供的功能强大的可视化程序设计工具和向导等,用户 可以快速地创建数据库、表,创建表单、菜单、查询,打印输出报表等。与其它数据库管理系 统比较,Visual FoxPro 的最大特点是自带编程工具,将数据库管理系统和程序设计语言有机 地结合在一起,很适合初学者学习。特别是各类非计算机专业,学习计算机课程的学时有限, 为满足他们对计算机应用能力培养的要求,采用 Visual FoxPro 作为数据库管理系统和程序设 计语言的教学软件成为一个较好的选择。 本教程以教育部提出的非计算机专业计算机基础教学的三个层次为依据,根据高等学校计 算机应用技术基础层次的教学基本要求,结合我们多年从事计算机应用技术基础教学的经验, 并参考国内外大量文献资料后编写完成。全书共分九章和八个附录,以目前广泛使用的 Visual FoxPro 8.0 中文版为主,系统地介绍了数据库基础知识、关系型数据库管理系统的基本原理、 数据库设计的基本方法、数据库的基本操作、关系型数据库标准查询语言 SQL、结构化程序 设计、面向对象的可视化编程方法以及数据库应用系统的开发等。附录 I~附录 VIII 提供了 Visual FoxPro 的命令、函数、文件类型与扩展名、基类和控件对象的名称、属性、事件、方 法等,方便读者查阅。 本教程可以作为高等学校非计算机专业本、专科学生的教材。带有“*”号的章节为选学 内容。教学过程中,教师可根据学制、专业、教学时数、教学要求等实际情况对讲授内容进行 取舍。 本书的编写也考虑到计算机等级考试的基本要求,覆盖了“全国计算机等级考试二级 Visual FoxPro”考试大纲的主要内容,因此也可以作为培训教材或者计算机等级考试参考书。 对于计算机应用人员本书也是一本较好的参考书。 为了方便教学和读者进行上机操作练习,作者还同步编写了《Visual FoxPro 数据库管理 系统教程学习与实验指导》一书,作为与本教程配套使用的实验教材。其中的学习指导、习题 及参考答案等,为读者自学提供了方便。另外还有配套的教学课件可以提供使用。 本书由程玮教授、陆晶副教授任主编,杨晓红教授、李静老师任副主编。其中程玮编写了 第一章,孙延民编写了第二章,陆晶编写了第三章和第四章,杨晓红编写了第五章和第六章, 李静编写了第七章,姚贵敏编写了第八章,王福滨编写了第九章,陈丽萍编写了附录 I~附录 1


VIII。全书最后由程玮总纂统稿,陆晶校对。 在本书的编写过程中,始终得到山东财政学院,学院教务处、教材科等各级领导的关心与 支持。计算机信息工程系各教研室,系办公室,学院实验中心的老师也给予了大力支持和帮助。 南京大学徐洁磐教授详细审阅了本教材的编写大纲和全部书稿,提出了许多宝贵的意见和建 议。机械工业出版社华章分社的姚蕾编辑也为本书的顺利出版做了许多工作,在此向他们表示 衷心的感谢。 本书的编写力求做到概念清晰、结构合理、层次分明,深入浅出、通俗易懂,删繁就简、 详略得当。但因编写时间的仓促和编者学识水平所限,书中难免有疏漏和错误之处,敬请广大 读者不吝赐教,批评指正。 有需要教学课件的,请与编者联系。Email:chengwei@sdfi.edu.cn

编 者 2007 年 9 月 28 日

2


第一章 数据库基础知识............................................................................................................................ 1 1.1 数据库和数据库系统 ....................................................................................................................... 1 1.1.1 数据、信息和数据处理............................................................................................................ 1 1.1.2 数据库和数据库系统................................................................................................................ 6 1.2 关系型数据库 ................................................................................................................................... 8 1.2.1 数据模型概述 ........................................................................................................................... 8 1.2.2 关系型数据库 .......................................................................................................................... 12 1.3 数据库设计基础 ............................................................................................................................. 25 1.3.1 数据库设计的基本原则.......................................................................................................... 26 1.3.2 数据库设计的过程.................................................................................................................. 27 1.4 VISUAL FOXPRO 系统概述 ............................................................................................................ 29 1.4.1 Visual FoxPro 简介................................................................................................................ 29 1.4.2 Visual FoxPro 的用户界面.................................................................................................... 33 1.4.3 Visual FoxPro 命令简介........................................................................................................ 42 1.4.4 Visual FoxPro 项目管理器.................................................................................................... 44 1.4.5 Visual FoxPro 向导、设计器和生成器................................................................................ 50 第二章 VISUAL FOXPRO 语言基础 .................................................................................................... 53 2.1 数据类型......................................................................................................................................... 53 2.2 常量、变量与函数 ......................................................................................................................... 55 2.2.1 常量 ......................................................................................................................................... 55 2.2.2 变量 ......................................................................................................................................... 57 2.2.3 函数 ......................................................................................................................................... 63 2.3 运算符与表达式 ............................................................................................................................. 63 2.3.1 算术运算符和数值表达式...................................................................................................... 64 2.3.2 字符串运算符及其表达式...................................................................................................... 64 2.3.3 日期时间运算符及其表达式.................................................................................................. 65 2.3.4 关系运算符及其表达式.......................................................................................................... 65 2.3.5 逻辑运算符及其表达式.......................................................................................................... 68 2.4 常用函数......................................................................................................................................... 69 2.4.1 数值运算函数 ......................................................................................................................... 70

I


2.4.2 字符串操作函数 ..................................................................................................................... 72 2.4.3 日期时间函数 ......................................................................................................................... 74 2.4.4 数据类型转换函数.................................................................................................................. 75 2.4.5 测试函数 ................................................................................................................................. 76 *2.5 常用 VISUAL FOXPRO 系统设置命令 .......................................................................................... 79 第三章

数据库与数据表的基本操作.................................................................................................... 82

3.1 数据库的基本操作 ....................................................................................................................... 82 3.1.1 创建数据库 ............................................................................................................................. 82 3.1.2 打开、关闭和设置数据库...................................................................................................... 84 3.1.3 修改、删除数据库.................................................................................................................. 86 3.2 数据库表的基本操作.................................................................................................................... 88 3.2.1 数据库表结构的设计.............................................................................................................. 88 3.2.2 创建数据库表 ......................................................................................................................... 89 3.2.3 打开与关闭数据库表.............................................................................................................. 92 3.2.4 修改数据库表结构和属性...................................................................................................... 94 3.3 数据库表记录的基本操作............................................................................................................ 97 3.3.1 使用浏览窗口 ......................................................................................................................... 97 3.3.2 添加记录 ................................................................................................................................. 99 3.3.3 显示记录 ............................................................................................................................... 100 3.3.4 修改记录 ............................................................................................................................... 102 3.3.5 删除和恢复记录 ................................................................................................................... 104 3.3.6 定位记录指针 ....................................................................................................................... 106 3.3.7 其他操作 ............................................................................................................................... 108 3.4 索引............................................................................................................................................... 109 3.4.1 基本概念 ............................................................................................................................... 109 3.4.2 创建索引 ............................................................................................................................... 110 3.4.3 使用索引 ............................................................................................................................... 114 3.4.4 索引定位命令 ........................................................................................................................ 115 3.4.5 删除索引命令 ....................................................................................................................... 116 3.5 自由表的操作 ............................................................................................................................... 116 3.5.1 自由表与数据库表................................................................................................................ 116 3.5.2 自由表和数据库表的转换.................................................................................................... 117 3.6 多数据表操作 ............................................................................................................................... 118 3.6.1 工作区的概念 ....................................................................................................................... 118

II


3.6.2 不同工作区的互访................................................................................................................ 119 3.6.3 数据表之间的关联................................................................................................................ 119 3.6.4 永久关系与参照完整性设置................................................................................................ 122 第四章

数据查询与视图...................................................................................................................... 125

4.1 查询 ............................................................................................................................................. 125 4.1.1 创建查询 ............................................................................................................................... 125 4.1.2

使用查询 ............................................................................................................................. 131

4.2 视图 ............................................................................................................................................. 132 4.2.1 视图的概念 ........................................................................................................................... 132 4.2.2 创建视图 ............................................................................................................................... 132 4.2.3 连接与远程视图 ................................................................................................................... 134 4.2.4 参数化视图 ........................................................................................................................... 136 4.2.5 视图与数据更新 .................................................................................................................... 138 4.2.6 使用视图 ............................................................................................................................... 139 第五章 关系数据库结构化查询语言 SQL........................................................................................... 141 5.1 SQL 语言概述 .............................................................................................................................. 141 5.2 SQL 数据定义功能..................................................................................................................... 142 5.2.1 创建数据库和表 ................................................................................................................... 142 5.2.2 表的修改 ............................................................................................................................... 144 5.2.3 表的删除 ............................................................................................................................... 145 5.3 SQL 数据查询功能..................................................................................................................... 146 5.3.1 基本查询 ............................................................................................................................... 147 5.3.2 条件查询 ............................................................................................................................... 148 5.3.3 连接查询 ............................................................................................................................... 149 5.3.4 嵌套查询 ............................................................................................................................... 153 5.3.5 数据统计查询 ....................................................................................................................... 156 5.3.6 查询结果排序 ....................................................................................................................... 160 5.3.7 查询结果处理 ....................................................................................................................... 161 5.3.8

视图语句 ............................................................................................................................. 162

5.4 SQL 数据修改功能..................................................................................................................... 163 5.4.1 插入数据 ............................................................................................................................... 163 5.4.2 更新数据 ............................................................................................................................... 164 5.4.3 删除数据 ............................................................................................................................... 165

III


第六章 程序设计基础............................................................................................................................ 166 6.1 结构化程序设计概述 ................................................................................................................... 166 6.1.1 程序的概念 ........................................................................................................................... 166 6.1.2 程序设计和算法 ................................................................................................................... 166 6.2 程序文件的建立、编辑与执行 ................................................................................................... 169 6.2.1 程序文件的建立与编辑........................................................................................................ 169 6.2.2 程序文件的调用执行............................................................................................................ 171 6.3 程序设计辅助命令 ....................................................................................................................... 171 6.3.1 常用输入输出命令................................................................................................................ 171 6.3.2 其它常用程序命令................................................................................................................ 175 6.4 程序的基本控制结构 ................................................................................................................... 176 6.4.1 顺序结构 ............................................................................................................................... 177 6.4.2 分支结构 ............................................................................................................................... 177 6.4.3 循环结构 ................................................................................................................................ 181 6.5 子程序、过程文件与自定义函数................................................................................................ 187 6.5.1 子程序 ................................................................................................................................... 187 6.5.2 过程与过程文件 ................................................................................................................... 188 6.5.3 自定义函数 ........................................................................................................................... 191 6.5.4 变量的作用域 ....................................................................................................................... 192 6.6 程序调试 ..................................................................................................................................... 196 6.6.1 程序调试的一般方法............................................................................................................ 196 6.6.2 Visual FoxPro 调试器的使用................................................................................................. 197 第七章 面向对象的程序设计基础........................................................................................................ 204 7.1 面向对象的概念 ........................................................................................................................... 204 7.1.1 对象与类 ............................................................................................................................... 204 7.1.2 属性、方法和事件................................................................................................................ 205 7.1.3 Visual FoxPro 中的基类......................................................................................................... 206 7.2 表单的基本操作 ........................................................................................................................... 207 7.2.1 创建表单 ............................................................................................................................... 207 7.2.2 操作表单 ............................................................................................................................... 213 7.2.3 表单属性、事件和方法........................................................................................................ 216 7.2.4 表单数据环境的设置............................................................................................................ 219 7.3 表单常用控件 ............................................................................................................................... 221 7.3.1 控件的基本操作 ................................................................................................................... 221 IV


7.3.2 标签控件 ............................................................................................................................... 222 7.3.3 按钮类控件 ........................................................................................................................... 223 7.3.4 文本框和编辑框控件............................................................................................................ 225 7.3.5 选项组和复选框控件............................................................................................................ 229 7.3.6 列表框和组合框控件............................................................................................................ 231 7.3.7 表格控件 ............................................................................................................................... 236 7.3.8 页框控件 ............................................................................................................................... 240 7.3.9 计时器控件 ........................................................................................................................... 243 7.3.10 微调控件 ............................................................................................................................. 243 7.3.11 图像控件.............................................................................................................................. 244 7.3.12 容器控件 ............................................................................................................................. 244 7.4 VISUAL FOXPRO 中类的建立 ..................................................................................................... 245 第八章 菜单、报表与标签设计............................................................................................................ 250 8.1 菜单设计 ..................................................................................................................................... 250 8.1.1 创建下拉式菜单 ................................................................................................................... 250 8.1.2 菜单设计器 ........................................................................................................................... 252 8.1.3 “快速菜单”命令..................................................................................................................... 256 8.1.4 创建快捷菜单 ....................................................................................................................... 257 8.2 报表设计 ..................................................................................................................................... 258 8.2.1 创建报表 ............................................................................................................................... 259 8.2.2 设计报表 ............................................................................................................................... 262 8.2.3 报表控件 ............................................................................................................................... 265 8.2.4 报表输出 ............................................................................................................................... 268 8.3 标签设计 ..................................................................................................................................... 270 8.3.1 使用标签向导 ....................................................................................................................... 270 8.3.2 使用标签设计器 ................................................................................................................... 275 8.3.3 标签输出 ............................................................................................................................... 275 第九章 应用系统开发简介.................................................................................................................... 277 9.1 应用系统开发的基本步骤 ........................................................................................................... 277 9.2 “教师管理信息系统”的开发简介 ........................................................................................... 278 9.2.1 系统需求分析 ....................................................................................................................... 278 9.2.2 系统总体规划设计................................................................................................................ 279 9.2.3 数据库、表设计 ................................................................................................................... 279

V


9.2.4 应用系统功能模块设计........................................................................................................ 281 9.2.5 应用系统主控程序................................................................................................................ 282 9.3 “教师管理信息系统”应用程序简介 ....................................................................................... 285 9.4 应用系统的连编 ........................................................................................................................... 294 附

录.................................................................................................................................................. 303 附录 I VISUAL FOXPRO 8.0 命令索引表.......................................................................................... 303 附录 II VISUAL FOXPRO 8.0 常用函数索引表................................................................................. 315 附录 III VISUAL FOXPRO 8.0 常用文件类型及其扩展名 ............................................................... 318 附录 IV VISUAL FOXPRO 8.0 的基类 .............................................................................................. 319 附录 V VISUAL FOXPRO 8.0 的对象................................................................................................ 319 附录 VI VISUAL FOXPRO 8.0 的对象属性 ...................................................................................... 320 附录 VII VISUAL FOXPRO 8.0 的对象事件 ..................................................................................... 329 附录 VIII VISUAL FOXPRO 8.0 的对象方法.................................................................................... 331

参 考 文 献............................................................................................................................................ 334

VI


第一章 数据库基础知识 自从二十世纪四十年代中期诞生了具有巨大存储能力,可以高速、准确、自动地进行数值 运算和逻辑运算的数字电子计算机以来,在短短的六十余年里,计算机技术日新月异地迅猛发 展,计算机的应用领域不断扩展,几乎已渗透到整个人类经济活动和社会生活的各个方面。在 计算机的众多应用中,最广泛、最直接、最普及、最重要的应用领域就是数据处理。 计算机技术的应用从单纯的科学计算发展到数据处理是一个划时代的转折。它使计算机从 科学殿堂的神坛上走下来,成为广大的科技工作者和管理人员工作中不可缺少的得力助手,成 为普通人工作、生活、娱乐的有用工具。计算机技术在数据处理中的应用和发展为人类社会进 入信息时代打下了坚实的基础,提供了最有力的工具,并形成了一个计算机科学与技术的重要 分支——数据库技术。 本章首先从数据库的基本概念出发,介绍一些最常用的数据库基础知识和术语。然后简 要介绍 Visual FoxPro 数据库管理系统的一般概况。

1.1 数据库和数据库系统 在数据处理中,人们首先遇到的基本概念是数据和信息,它们是两个不同的术语,但又有 着密不可分的联系。

1.1.1 数据、信息和数据处理 一、数据 数据(Data)指的是人们用于表达、描述、记录客观世界事物与现象属性的某种物理符号。 数据不仅具有描述事物特性的具体数据内容,而且具有能够记录和存储的某种具体表现形式。 例如可以用:王丽,女,1981 年 11 月 20 日,1.68m,55kg,助教,1200 元,照片(图像) 等数据分别表示姓名,性别,出生年月日,身高,体重,职称,基本工资和相貌等,则上述数 据就描述出某个具体人的一些基本特征。如“女”是用汉字符记录、描述的性别特征; “1.68m, 55kg”则是用十进制数字符号和国际标准单位记录、描述的身高,体重特征;照片则是用图像 的形式记录、描述的相貌特征。 数据不仅包括数字、文字、字母和各种特殊符号等文字数据,还包括图形、图像、动画、

1


影像、声音等各种多媒体数据。但使用最多、最基本的仍然是文字数据。 计算机能够接收、识别、存储、处理的数据是二进制数,因此,必须将各种形式的数据转 换成二进制数据后才能用计算机对其进行加工处理。 二、信息 信息(Information)是客观世界事物与现象属性的反映,是经过加工处理,并对人类的客 观行为产生影响的具有知识性的有用数据。 数据与信息在很多场合被认为是同义的,但实际上它们之间是有区别的。数据是信息的载 体,是记录信息的符号,任何客观事物与现象的属性都可以用数据来表示。信息依靠数据来表 达,是对数据具体含义的解释。数据经过加工处理具有了知识性,并能对人类的活动产生决策 作用,从而形成有用的数据——信息。 例如,某个人的“出生日期”是其不可改变的基本特征之一,称为原始数据。通过用某个 具体的年月与出生日期进行相减这样的简单计算,可以得到其“年龄”信息。再根据年龄、性 别、职称以及离退休年龄的有关规定,即可确定此人何时应当办理离退休手续。 三、数据处理 由于“数据”和“信息”这两个术语之间的密切联系,人们在使用中往往对这两个词不加 区别,所以“数据处理”也称为“信息处理”。所谓数据处理,其真正的含义是为了产生信息 而对原始数据进行的加工处理。数据处理通常包括数据的采集、接收、传递、转换、存储、整 理、分类、排序、索引、统计、计算、检索等一系列的活动过程。 数据处理的目的是从大量的原始数据中获得人们所需的有用数据,为做出正确的决策提供 依据。而数据处理的核心是数据管理。 计算机技术的发展和应用,使数据管理发生了划时代的变革。 而数据库技术的出现与发展, 又使数据管理跨入了一个崭新的阶段。随着计算机硬件、软件技术和应用范围的不断发展,计 算机数据管理技术的发展也经历了人工管理、文件管理、数据库系统管理等几个阶段。 1.人工管理阶段 人工管理阶段指计算机技术应用于数据处理的初期。在 20 世纪 50 年代中期以前,外存储 器只有卡片、纸带、磁带等非直接存取数据的存储设备,也没有专门管理数据的软件系统,用 户只能直接在计算机裸机上进行操作,数据处理方式是批处理。在此阶段数据管理的主要特点 是: ⑴ 人工实施数据管理 因为没有管理数据的软件系统,程序设计人员不仅需要设计数据的逻辑结构,还要负责设 计数据的物理结构,包括确定数据在计算机中的存储结构、存取方法和输入输出方式等,工作 负担极重。 ⑵ 数据不能共享

2


因数据与程序密切结合,不可分割,一组数据对应一个程序,数据不能在各程序之间互相 传递。多个应用程序使用相同的数据时,只能各自定义,无法共享,使程序之间存在着大量的 冗余数据。 ⑶ 数据不能保存 因为数据由对其进行处理的程序自行携带,只是在进行数据处理时才将数据输入,一旦处 理完毕,程序运行结束,数据即丢失而不能保存。 ⑷ 数据未结构化 当数据的逻辑结构或物理结构发生变化时,必须对应用程序做相应的修改以适应其改变, 反之亦然,数据与程序的独立性差。 在人工管理阶段,应用程序与数据之间的关系如图 1.1 所示。 应用程序 1

应用程序 2

… …

应用程序 n

数据集合 1

数据集合 2

… …

数据集合 n

图 1.1 人工管理阶段应用程序与数据间的对应关系 2.文件管理阶段 20 世纪 50 年代中后期至 60 年代中后期,可以随机访问、直接存取数据的磁盘成为计算 机的主要外存储器,软件出现了高级程序设计语言和操作系统。在操作系统中包含了专门对外 存储器中的数据进行管理的文件管理系统。在此阶段,数据管理的主要特点是: ⑴ 数据管理由软件实现 数据由专门的软件(文件管理系统)进行管理。文件管理系统将数据组织成相互独立的数 据文件,数据的结构、存取方法等均由文件管理系统负责,程序设计人员的负担大大减轻。 ⑵ 数据可以保存 数据以文件的形式组织起来,有了一定的独立性。数据和程序可以分开,能够长期保存。 ⑶ 数据共享性较差 在文件管理系统中,基本上是一个数据文件对应一个应用程序。当不同的应用程序使用的 数据有相同部分时,也只能建立各自的数据文件,而不能实现相同数据的共享,造成数据的冗 余度大。这不仅浪费了大量的存储空间,而且对数据进行修改和维护比较困难,容易造成数据 的不一致性。 ⑷ 数据的结构化差 3


在文件内部,数据实现了在记录范围内的结构化,但各数据文件之间彼此独立,互不相关, 在整体上并未实现结构化,因此数据文件的逻辑结构仅适用于与其对应的应用程序,而其它的 应用程序则难以使用。若要扩充系统的应用,则必须修改数据文件的结构和与之对应的应用程 序。所以数据文件与应用程序之间仍然缺乏独立性。 在文件管理系统阶段,应用程序与数据之间的关系如图 1.2 所示。 3.数据库系统管理阶段 20 世纪 60 年代以后,需要计算机管理的数据量急剧增加,对数据共享的要求日益增强, 文件管理系统的数据管理方法已无法满足应用系统的需求。为了实现计算机对数据的统一管 理,达到数据共享的目的,出现了数据库系统。 应用程序 1

应用程序 2

… …

应用程序 n

文件管理系统

数据文件 1

数据文件 2

… …

数据文件 n

图 1.2 文件管理系统阶段应用程序与数据间的对应关系 数据库系统对数据的管理方式与文件管理系统不同,它面向整个系统,用整体的观点统一 规划、组织、管理数据,形成一个数据管理中心,构建一个保存所有数据的数据库。数据库中 的数据由专门的系统软件——数据库管理系统进行管理,并能满足所有用户的各种不同要求, 供不同的用户共享。在数据库系统中,应用程序不再与一个孤立的数据文件相对应,而是通过 数据库管理系统从数据库库中取用自己所需的数据。 在数据库系统管理阶段,应用程序与数据之间的关系如图 1.3 所示。 应用程序 1 数据库

应用程序 2

管理系统

数据库

DBMS

Database

应用程序 n 图 1.3 数据库系统阶段应用程序与数据间的对应关系 在近四十年的发展史中,数据库技术也经历了三个发展阶段。 ⑴ 第一代数据库系统 4


第一代数据库系统又称非关系型数据库系统,其中包括“层次”与“网状”两种数据库系 统。这两种数据库系统均以记录作为基本的数据结构,它们的差别主要体现在记录之间的联系 上。层次型数据库系统中的记录之间只能有单线的联系,而网状数据库系统中的记录之间允许 有两种或两种以上的联系。因为非关系型数据库系统的结构复杂,数据存取路径需要用户一一 指定,因此数据查询和数据操纵困难,不易使用。随着关系型数据库系统的出现,非关系型数 据库系统逐渐被淘汰。 ⑵ 第二代数据库系统 第二代数据库系统是关系型数据库系统(Relational Database System 简称 RDBS),问世 于 20 世纪 70 年代。关系数据库技术以严格的关系数学理论为基础,采用二维表(关系)作为 基本的数据结构。在关系数据库系统中,每个关系都是一个二维表,用于表示实体以及实体之 间的联系,描述实体的数据本身能够自然地反映出实体之间的联系。数据操作的对象和结果都 是关系。 关系型数据库系统因其数学概念简单、清晰,数据描述的一致性好,说明性的数据查询和 数据操纵语言易学易懂,使用方便而受到欢迎。自 20 世纪 70 年代中期推向市场后,已发展成 为应用最广泛的数据库系统。 ⑶ 第三代数据库系统 伴随着数据库系统应用范围的不断扩展,计算机新技术的不断涌现,新的数据管理需求的 提出和人们认识世界、描述世界的新的方法论的提出,推动了新一代数据库技术的研究与发展。 ① 分布式数据库系统 分布式数据库系统(Distributed Database System 简称 DDBS)是数据库技术与计算机网 络技术紧密结合的产物。20 世纪 80 年代以前,数据库系统多数是集中式的。随着计算机网络 通信技术的迅速发展,为数据库提供了分布式的运行环境。数据库系统从主机/终端系统结构 发展到客户/服务器(Client/Server)系统结构。目前分布式数据库管理系统已进入市场应用, 但尚不能完全解决异构数据和系统方面的许多问题。 ② 多媒体数据库系统 随着多媒体应用的扩大,人们已经不满足于数据库系统仅能存储、处理数字、字符等文本 数据,还需要存储、处理诸如声音、图形、图像、视频等多媒体信息。与数字、字符等格式化 数据不同,声音、图形、图像、视频等非格式化数据具有数据量庞大、处理方法复杂等特点。 多媒体数据库系统(Multimedia Database System 简称 MDBS)既要实现对格式化的文本数 据的存储和处理,还要实现对非格式化的多媒体数据的存储、处理。市场上现在已经有可以存 储、处理一些如简短的声音片段、较小的图形、图像等多媒体信息的数据库系统,但还存在着 许多要进一步研究解决的问题。 ③ 面向对象数据库系统 面向对象是一种新的认识、描述事物的方法论。它起源于程序设计语言。面向对象的方法

5


就是按照人们认识世界的习惯,对现实世界的客观事物(对象)进行最自然、最有效的抽象和 表达,同时又以各种严格高效的行为规范和机制,实施对客观事物的有效模拟和处理,而且把 对客观事物的表达(对象属性结构)和对它的操作处理(对象行为特征)结合成为一个有机的 整体,使事物完整的内部结构和外部行为机制得到充分的反映和体现。 面向对象数据库系统(Object Oriented Database System 简称 OODBS)是数据库技术与面 向对象程序设计相结合的产物,是面向对象方法在数据库领域的实现和应用。在关系模型的基 础上进行扩展,引入面向对象特性的对象-关系型数据库系统(Object Relational Database System 简称 ORDBS),已有实用产品推向市场。全新意义的面向对象数据库系统也有产品问 世。 ④ 其它第三代数据库系统 除了上述几种区别于第一、第二代数据库系统的新型数据库系统外,众多的其它新一代数 据库系统也在研究和发展之中。如可以在并行计算机系统上运行的并行数据库系统;与人工智 能技术结合的知识数据库系统;面向特定应用领域的数据库新技术如:数据仓库、工程数据库、 统计数据库、空间数据库等都属于新一代数据库系统。

1.1.2 数据库和数据库系统 一、数据库 所谓数据库(Database),指的是以一定的组织方式存储在计算机存储设备上,与应用程 序彼此独立、能为多个用户所共享、结构化的相关数据的集合。它是数据库系统的核心和管理 对象。 在数据库中,数据按照一定的数据模型组织、描述和存储,具有较小的数据冗余度、较高 的数据独立性、完整性和一致性,可为多个用户所共享。 二、数据库管理系统 数据库管理系统(Database Management System,简称 DBMS)是为了数据库的建立、使 用和维护而配置的软件系统。它建立在操作系统基础上,实现对数据库的统一管理和控制。 DBMS 既要向不同用户提供各自所需的数据,还要承担数据库的维护工作,保证数据库的安 全性和完整性。 数据库管理系统的主要功能包括以下几个方面: 1.数据定义功能 DBMS 一般提供数据描述语言(Data Description Language 简称 DDL)来定义数据库中 的数据对象,如数据库、表的结构和视图等。 2.数据操纵功能

6


DBMS 还提供数据操纵语言(Data Manipulation Language 简称 DML)实现对数据库的 基本操作,如数据的插入、修改、删除和查询等。 3.数据库的运行管理功能 这是 DBMS 运行时的核心功能,包括存取数据时根据约束条件对数据进行控制和检查, 数据使用的并发控制,查询优化,以及发生故障后的系统恢复等。所有这些操作都必须在数据 库管理系统的统一管理、统一控制下进行,以保证事务处理的正确性,数据库的有效性,数据 的安全性和完整性。 4.数据库的建立和维护功能 该功能包括数据库初始数据的输入、转换功能;数据库的转储、恢复功能;数据库的重组 织功能和系统的性能监视、分析功能。 数据库管理系统是数据库系统的重要组成部分,属于系统软件。 三、数据库系统 数据库系统(Database System 简称 DBS)指的是引入数据库技术后的整个计算机系统, 一般由计算机硬件系统、软件系统、数据集合和用户四个部分组成。在软件系统中包括操作系 统、数据库管理系统以及用数据库管理系统和程序设计语言开发的数据库应用系统。在用户中

数据库管理员

最终用户

专业开发人员

数据库应用系统 数据库管理系统 操作系统 硬件系统

包括数据库管理员、专业的应用系统开发人员和数据库最终用户。数据库系统的组成结构如图 1.4 所示。 与人工管理和文件管理系统相比,数据库系统的主要特点如下: 1.数据的结构化 在数据库系统中,数据不再针对某个应用,而是面向整个系统按照某种数据模型统一组织。 数据库系统不仅可以表示事物内部各数据项之间的联系,而且可以表示事物与事物之间的联 系,从而反映出现实世界事物之间的联系,实现了整体数据的结构化。数据的结构化是数据库

7


系统与文件系统的本质区别。 2.数据的共享性 数据库系统从整体的角度对数据进行组织。因此可以提供给多个用户、多个应用程序共享 使用。数据的共享使用可以大大的减少数据冗余,节约存储空间,并提高数据的一致性、完整 性和安全性。 3.数据的独立性 在数据库系统中,对数据的定义和描述已经从应用程序中分离出来。应用程序与存储在数 据库中的数据相互独立。数据在数据库中的物理存储位置、结构、存取方式等均由数据库管理 系统负责,而与应用程序无关。应用程序要处理的只是数据的逻辑结构。 数据与程序的彼此独立,既方便了数据库的维护,也简化了应用程序的设计,大大减小了 对它们进行维护和修改的难度。 4.统一的数据管理控制功能 数据库中的数据可以被多个用户或应用程序共享,其数据的存取往往是并发的,即多个用 户可以同时使用同一个数据库中的数据。为此,数据库管理系统必须提供必要的数据管理控制 功能和安全保护措施。这些功能主要有数据的并发访问控制功能、数据的安全性保护功能、数 据的完整性检查功能和出现故障时数据库的恢复功能。

1.2 关系型数据库 1.2.1 数据模型概述 在现实世界中存在着各种各样的事物。每个事物都有自己的特性,事物与事物之间也存在 着各种各样的联系。客观存在的事物特性及其联系反映到人的头脑,经过认识、抽象、归纳和 总结,可以转化成某种形式的对事物特性及其联系的表达与描述,构建成我们的信息世界。 一、信息世界涉及到的主要概念 1.实体 现实世界中客观存在并可互相区分的事物称为“实体”(Entity)。实体可以是实际的事物 如某个人物、某件商品、某个单位等;也可以是抽象的事件、行为,如体育比赛、文艺表演、 会议、购物等。实体既可以指事物本身,也可以指事物与事物之间的联系。 2.实体的属性 实体所具有的特性称为“属性” (Attribute) 。一个实体可以用若干个属性来描述并和其它 的实体相区别。例如某个单位实体可以用单位名称、地址、行业、隶属关系、法人代表等属性 8


来描述;而某个教师实体可以用教师编号、姓名、性别、年龄、职称、部门、工作简历、照片 等属性来表征。 3.实体集 性质相同的同类型实体的集合称为“实体集” (Entity Set)。例如在教师实体集中,一组具 体的教师属性表征一个具体的教师,而所有的教师都可以用相同的教师实体属性来表示。 4.型与值 实体和属性都有“型”(Type)和“值”(Value)之分。所谓“型”指的是对某一类数据 的结构和属性的说明,而“值”指的是在“型”约束下的一个具体数据。例如一个只有表头的 空表称为实体型,又叫框架。如表 1.1 所示即为一个用“教师编号”、 “姓名”、 “性别”、 “出生 日期”、“学历”、“职称” 、“部门”等属性构成的教师实体型。 表 1.1 教师编号

姓 名

性 别

出生日期

学 历

职 称

部 门

在实体型下,按照表中的栏目要求填入的具体数据就是实体值。例如表 1.2 中所示的 “199806”、 “茅丽燕”、 “女”、 “08/21/1959” 、 “研究生”、 “教授”、 “经济系”就是该教师实体 型的一个实体值。 表 1.2 教师编号

姓 名

性 别

出生日期

学 历

职 称

部 门

199806

茅丽燕

08/21/1959

研究生

教授

经济系

199006

张玉萍

03/21/1966

大学

副教授

会计系

属性也同样具有型和值之分。如在表 1.2 中, “教师编号”、 “姓名”、 “性别”、 “出生日期”、 “学历”、 “职称”、 “部门”等栏目是属性的型,在栏目下所填的“199806” 、 “茅丽燕”、 “女”、 “08/21/1959”、“研究生” 、“教授” 、“经济系”等具体数据就称为对应属性的值。 5.实体标识符 能够唯一、最小标识实体的属性的集合称为实体标识符,也称关键字(Key)。如教师编 号能唯一地标识一个教师实体,可以作为实体标识符。 6.实体间的联系 在现实世界中,事物内部和事物之间都存在着联系(Relational) 。这种联系也必然的反映 在信息世界中,构成实体内部和实体之间的联系。实体内部的联系指的是组成实体的各个属性 之间的联系。实体之间的联系指的是不同实体集之间的联系。实体之间的联系可以分为三类: ⑴ 一对一联系 如果对于实体集 A 中的每一个实体,实体集 B 中至多只有一个实体与其有联系,反之亦 然,则称实体集 A 与实体集 B 之间具有一对一的联系,记为 1:1。 9


例如,在一个单位里,职工与工资之间就是一对一的联系。 ⑵ 一对多联系 如果对于实体集 A 中的每一个实体,实体集 B 中有 n 个实体(n≥0)与其有联系,反之, 对于实体集 B 中的每一个实体,实体集 A 中至多只有一个实体与之联系,则称实体集 A 与实 体集 B 之间具有一对多的联系,记为 1:n。 例如,在一个单位里,部门与职工之间具有一对多的联系。 与一对多的联系正好相反的是多对一的联系。例如职工与部门之间的联系即为多对一的联 系。一对多联系和多对一联系之间的差别取决于以谁为主。 ⑶ 多对多联系 如果对于实体集 A 中的每一个实体,实体集 B 中有 n 个实体(n≥0)与其有联系,反之, 对于实体集 B 中的每一个实体,实体集 A 中也有 m 个实体(m≥0)与之联系,则称实体集 A 与实体集 B 之间具有多对多的联系,记为 m:n。 例如,在学校里,学生与课程之间具有多对多的联系。 在三种联系中,一对多的联系是一种最普遍、最基本的联系。实际上,一对一的联系可以 看作一对多联系的一个特例,而一对多的联系又可以看作多对多联系的特例。 二、数据模型简介 经过抽象得到的,概念化的对事物特性以及事物之间相互联系的表达与描述的集合称为数 据模型。数据模型确定了数据库中数据的组织结构框架,表示出了数据之间的联系。数据模型 通常由数据结构、数据操作和数据的完整性约束条件三个部分组成。 1.数据结构 数据结构是对系统静态特性的描述, 是所研究的对象类型的集合。这些对象通常分为两类, 一类是与数据类型、内容、性质有关的对象,一类是与数据之间的联系有关的对象。 数据结构是刻画一个数据模型性质最重要的方面,因此在数据库系统中,通常都按照数据 结构的类型来命名数据模型。如将层次结构、网状结构和关系结构的数据模型分别命名为层次 模型、网状模型和关系模型。 2.数据操作 数据操作是对系统动态特性的描述,是指对数据库中的各种对象允许执行的操作的集合, 包括操作以及有关的操作规则。数据库中的数据操作主要有检索和更新(包括存储、插入、删 除、修改等)两大类。数据模型必须定义这些操作的确切含义、操作符号、操作规则(如优先 级)以及实现操作的语言。 3.数据的完整性约束条件 数据的完整性约束条件是一组完整性规则的集合。完整性规则是给定的数据模型中数据及 其联系所具有的制约和依存规则,用于限定符合数据模型的数据库状态以及状态的变化,以保 证数据的正确、有效和相容。 10


任何一种数据库管理系统都是基于某种数据模型在计算机上实现的。采用的数据模型不 同,建立的 DBMS 也就不同。在数据库系统中,主要的数据模型有三种:层次模型、网状模 型和关系模型。 三、常用数据模型 1. 层次模型 层次模型是在数据库系统中最早应用的数据模型。层次模型用树形结构来表示实体以及实 体之间的联系。层次模型具有以下特点: ⑴ 有且只有一个结点没有双亲,该结点称为根结点; ⑵ 除根以外的其它结点有且仅有一个双亲。 系部:

教研室:

教师:

室编号

教师编号

系部编号

室名称

室主任

姓名

性别

系部名称

电话

出生日期

系主任

学生:

学历

办公地址

学生编号

职称

电话

姓名

工资

性别

系部

专业

简历

图 1.5 层次模型示意图 在层次模型中,每个结点表示一个记录(实体)类型,记录(实体)之间的联系是一对多 的联系。因此,层次模型只能反映实体间的一对多联系。现实世界中有许多实体之间的联系就 是一种层次关系。如图 1.5 所示一个单位的组织机构就是一个层次模型。 层次结构具有层次分明、结构清晰的优点,其缺点是只能反映事物间的一对多联系。 2. 网状模型 网状模型用网状结构表示实体以及实体之间的联系。网状模型具有以下特点: ⑴ 允许一个以上的结点无双亲; ⑵ 一个结点可以有一个以上的双亲。 网状模型是一种比层次模型更具普遍性的结构,它突破了层次模型的两点限制,既允许多 个结点无双亲,又允许结点有多个双亲结点。

11


与层次模型一样,网状模型中的每个结点也是表示一个记录(实体)类型,但记录(实体) 之间的联系既可以是一对多的联系,也可以是多对多的联系。如图 1.6 所示的厂商与零部件的

A厂

B厂

零件 1

C厂

零件 2

部件 1

零件 4

零件 3

部件 2

部件 3

图 1.6 网状模型示意图 联系就是一个网状模型。 网状模型表达能力强,可以更直接地描述现实世界,方便地表示实体之间多对多的联系, 但结构复杂,实现与使用均较困难。 3. 关系模型 关系模型用二维表格结构来描述实体和实体之间的联系。关系模型以严格的关系数学理论 为基础,数据结构简单,模型概念清楚,格式描述统一,能直接反映实体之间一对一、一对多 和多对多的联系,操作对象和结果均为二维表结构,易学习,易理解,符合使用习惯。

1.2.2 关系型数据库 关系型数据库系统采用关系模型作为数据的组织方式。20 世纪 80 年代以来所推出的数据 库管理系统几乎都支持关系模型,已成为目前应用最为广泛的数据库系统。 一、关系术语与关系数据库 1.关系 一个关系(Relation)对应一张二维表,每个关系有一个关系名。 在 Visual FoxPro 中,一个关系就是一个表(或称数据表文件,扩展名为 .dbf)。如表 1.3 所示的教师情况表就是一个关系,该二维表描述了教师之间的联系。 表 1.3 教师编号

教 师 情 况 表 姓 名

性别

出生日期

学 历

学 位

职 称

系 部

12


199806

茅丽燕

08/21/1959

研究生

硕士

教授

经济系

199006

张玉萍

03/21/1966

大学

学士

副教授

会计系

199812

呼延景

12/17/1972

研究生

博士

副教授

财税系

199310

许斌

05/30/1954

大学

教授

计算机系

2.属性 二维表中的一列即为一个属性(Attribute)。每个属性有一个名字,称为属性名。如表 1.3 中的教师编号、姓名、性别、出生日期、学历、学位、职称和系部等都是属性名。 在 Visual FoxPro 中属性又称为字段。 3.元组 在二维表中,水平方向的行称为元组(Tuple)。每一行对应一个元组,由若干个属性值组 成。如表 1.3 中的 199806、茅丽燕、女、08/21/1959、研究生、硕士、教授、经济系等属性值 组成了一个元组。 元组在 Visual FoxPro 中又称为记录。 4.域 域(Domain)是属性的取值范围。例如性别的取值范围是男和女;学历的取值范围是小 学、初中、高中、中专、大专、大学、研究生等。 5.关键字 关键字(Key)是一个属性或者几个属性的集合,其特点是它(或它们)的值可以唯一、 最小地表示一个元组。例如在教师情况表中,教师编号可以唯一地确定一个教师,因此能够 作为标识一个元组的关键字。而诸如姓名、性别、出生日期、职称、系部等属性值可能不是唯 一的,就不能作为关键字。由几个属性的集合构成的关键字,称为复合关键字。 ⑴ 候选关键字 对于可以作为关键字的所有属性或属性的集合,它们中的每一个都称之为候选关键字 (Candidate Key)。 ⑵ 主关键字 在候选关键字中指定的一个现行关键字,称为主关键字(Primary Key)。 ⑶ 外部关键字 如果某个表中的某个属性(或属性集合)在另外一个表中是主关键字或候选关键字,则称 该属性(或属性集合)为本表的外部关键字(Foreign Key) 。 ⑷ 主属性和非主属性 主属性指的是可以做候选关键字的属性;不能做候选关键字的属性则称为非主属性。 在 Visual FoxPro 系统中,按主关键字进行的索引称之为主索引,按候选关键字进行的索

13


引称之为候选索引。Visual FoxPro 使用主索引来唯一地标识一条记录。 6.关系模式 对关系的描述称为关系模式,一个关系模式对应一个关系的结构。关系模式的格式为: 关系名(属性名 1,属性名 2,… …,属性名 n) 在 Visual FoxPro 中关系模式表示为表的结构: 表名(字段名 1,字段名 2,… …,字段名 n) 例如表 1.3 所表示的关系可描述为: 教师情况表(教师编号,姓名,性别,出生日期,学历,学位,职称,系部) 7.关系术语间的联系 从集合论的观点来定义关系,可以将关系定义为元组的集合;元组是属性值的集合;关系 模式是属性名的集合。 在 Visual FoxPro 中,是将若干个相互之间存在联系的表集中到一个数据库中进行统一管 理。数据库文件的扩展名为 .dbc。例如,可以将教师表、工资表、系部表放入人事管理数据 库中;将图书表、读者表、借阅表放入图书管理数据库中。 * 二、关系的规范化 关系模型看起来虽然很简单,但是并不能把日常手工管理使用的各种表格,按照一个表格 是一个关系,直接存放到数据库中。关系模型对关系有一定的要求,一个表格必须满足了关系 的这些要求才能成为关系数据库中的一个关系。 1.关系的性质 关系必须具有以下性质: ⑴ 关系可以为空关系。即一个关系中可以没有任何元组。例如关系在初建时只有框架(结 构),而无属性值,如表 1.1 所示就是如此。 ⑵ 属性和元组是一个关系中不可分割的最小数据单元,不允许行中有行,列中有列。 ⑶ 在同一个关系中,属性(字段)的名称不能有相同的。 ⑷ 在同一个关系中,元组(记录)不能有完全相同的。 ⑸ 在同一个关系中,属性的顺序,元组的顺序可以任意排列。 ⑹ 不同的属性可以在同一个域中取值,但同一个属性中的所有取值只能来自同一个域, 即必须是相同类型的数据。 2.关系的规范化 关系数据库中的关系必须要满足一定的要求,满足要求的程度不同其范式定义也不同。满 足关系最低要求的称为第一范式(1NF)。在第一范式中满足进一步要求的称为第二范式 (2NF),其余依此类推,还有第三范式(3NF),修正的第三范式(BCNF)和第四范式(4NF), 最高可达第五范式(5NF)。但在实际应用中,并非越高越好。一般能达到第三范式就可以满

14


足要求了。 一个低级范式的关系模式,通过模式分解,可以转化为若干个高一级范式的关系模式的集 合,这一转化的过程称为关系的规范化。关系规范化的三个范式的定义如下: ⑴ 第一范式(1NF) 定义:在一个关系中若无重复的元组,并且各属性都是不可再分割的基本数据项,则该关 系为第一范式。例如一个给定的购书单如表 1.4 所示。 购

表 1.4

订 户 信 息 单位编号

单位名称

3001

建工学院

1010

师范大学

2202

财经学院

单 图

书 信 息

书编号

书名称

单 价

数 量

出版社名称

出版社编号

QH10120

数据库概论

12.50

160

清华大学

QH101

JX20115

计算机基础

16.00

520

机械工业

JX201

GD01011

高等数学

11.60

280

高等教育

GD010

GD01028

教育心理学

18.50

560

高等教育

GD010

JX20115

计算机基础

16.00

450

机械工业

JX201

GD01055

政治经济学

11.60

360

高等教育

GD010

在表 1.4 中,存在着大栏套小栏,即一个大属性对应多个小属性,和一行对多行,即有的 属性一次取值(如单位号、单位名)被其它属性多次(重复)引用。这种表中套表的结构不符 合关系的基本要求:属性和元组是不能再分割的最小数据项。对此类表格关系数据库系统难以 处理,必须按照关系规范的要求进行规范化。 将表 1.4 中的大栏套小栏,一行对多行消除掉,并保持原有信息不变,该关系被规范化成 第一范式,如表 1.5 所示。 购

表 1.5

单位编号*

单位名称

书编号*

书名称

单 价

数 量

出版社名称

出版社编号

3001

建工学院

QH10120

数据库概论

12.50

160

清华大学

QH101

3001

建工学院

JX20115

计算机基础

16.00

520

机械工业

JX201

1010

师范大学

GD01011

高等数学

11.60

280

高等教育

GD010

1010

师范大学

GD01028

教育心理学

18.50

560

高等教育

GD010

2202

财经学院

JX20115

计算机基础

16.00

450

机械工业

JX201

2202

财经学院

GD01055

政治经济学

11.60

360

高等教育

GD010

若将单位编号和书编号两个属性作为表 1.5 关系的复合主关键字(用“*”表示),则表中 各属性之间的函数依赖关系如图 1.7 所示。 由图可见,在表 1.5 的关系中除了“数量”完全依赖于复合主关键字外,其它的非主属性

15


并不完全依赖于复合主关键字,而只是部分依赖于复合主关键字。如“单位名称”依赖于单位 编号,而“书名称”、“出版社名称” 、“出版社编号”和“单价”则依赖于书号。 ⑵ 第二范式(2NF) 定义:若一个关系属于 1NF,并且所有非主属性都完全依赖于主关键字,则称该关系为 第二范式。若关系中无复合主关键字,则 1NF 自然满足 2NF。 单位名称 书 名 称

单位编号* 数 量

出版社名称 书编号* 出版社编号 单

图 1.7 表 1.5 中的函数依赖关系 为消除非主属性部分依赖于主关键字的问题,对表 1.5 所示的关系进行分解。分解的原则 是:把部分依赖于主关键字的非主属性从关系中分解出来,使非主属性完全依赖于主关键字, 并且保持分解后的原有信息不丢失,分解后的关系相互独立。按此原则可以将表 1.5 分解成表 1.6、表 1.7 和表 1.8 三张表,表中有“*”号的属性为主关键字。 表 1.7

表 1.6 单位编号*

单位名称

书编号*

书名称

单 价

出版社名称

出版社编号

3001

建工学院

QH10120

数据库概论

12.50

清华大学

QH101

1010

师范大学

JX20115

计算机基础

16.00

机械工业

JX201

2202

财经学院

GD01011

高等数学

15.90

高等教育

GD010

GD01028

教育心理学

18.50

高等教育

GD010

GD01055

政治经济学

14.60

高等教育

GD010

表 1.8 单位编号*

书编号*

数量

3001

QH10120

160

3001

JX20115

520

1010

GD01011

280

1010

GD01028

560

2202

JX20115

450

2202

GD01055

360

16


三张表中的函数依赖关系如图 1.8 所示。从图中可以看出,在三张表中,所有非主属性均 已完全依赖于主关键字,符合第二范式的规范。第二范式的结构虽然优于第一范式,但仍存在 着缺陷。分析表 1.7 所示关系中的函数依赖关系可见,在非主属性中存在着相互不独立的情况。 如“出版社名称”和“出版社编号”之间有函数依赖关系。 “出版社名称”函数依赖于“出版 社编号”,“出版社编号”函数依赖于主关键字,从而使“出版社名称”传递依赖于主关键字。 ⑶ 第三范式(3NF) 定义:若一个关系属于 2NF,并且关系中的所有非主属性不需传递依赖,而都直接依赖 于主关键字,则称关系为第三范式。 为消除非主属性的传递依赖,对表 1.7 再进一步分解成表 1.9 和表 1.10 两个表,表中有“*” 号的属性为主关键字。两张表中的函数依赖关系如图 1.9 所示。 表 1.9

表 1.10

书编号*

书名称

单 价

出版社编号

出版社编号*

出版社名称

QH10120

数据库概论

12.50

QH101

QH101

清华大学

JX20115

计算机基础

16.00

JX201

JX201

机械工业

GD01011

高等数学

15.90

GD010

GD010

高等教育

GD01028

教育心理学

18.50

GD010

GD01055

政治经济学

14.60

GD010 书名称

单位

单位

编号*

名称

书编号* 单位编号*

书编号*

出版社名称

出版社编号

图 1.8 第二范式函数依赖关系示例 书 名 称

出版社编号* 书编号* 出版社名称

17

出版社编号 图 1.9 第三范式函数依赖关系示例

三、关系间的联系


在关系型数据库系统中,通常是将经过关系规范化得到的若干个彼此独立,又相互联系的 关系(在 Visual FoxPro 中称为数据表)组织在一起,放入同一个数据库中。在数据库中,这 些关系之间的联系反映了客观事物间的联系。与实体间的联系类型相同,关系间的联系也有三 种类型。 1.一对一的联系 在两个关系中选择一个相同的属性(字段),该属性在第一个关系中作为主关键字,其属 性值是唯一的;而在第二个关系中该属性也作为主关键字,因此是第一个关系的外部关键字, 其属性值也是唯一的。这两个关系之间便建立了一对一的联系。 例如,在人事管理数据库中,教师情况表和工资表之间就是一对一的联系,如图 1.10 所 示。 教 师 情 况 表

教师编号

姓 名

职 称

部门编号

教师编号

基础工资

职务补贴

职绩津贴

199806

茅丽燕

教授

101

199806

2180.00

880.00

560.00

199006

张玉萍

副教授

107

199006

1880.00

660.00

480.00

199812

呼延景

副教授

102

199812

1800.00

720.00

450.00

199310

许斌

教授

108

199310

2300.00

950.00

600.00

199802

高大宇

工程师

107

199802

1650.00

400.00

360.00

(父表)

教师编号-教师编号

(子表)

图 1.10 一对一的联系 2.一对多的联系 一对多联系是关系型数据库中最普遍的联系。在两个关系中选择一个相同的属性,该属性 在第一个关系中作为主关键字,其属性值是唯一的,而在第二个关系中该属性作为本关系的外 部关键字,并且属性值不是唯一的,这两个关系之间便建立了一对多的联系。 例如,在人事管理数据库中,系部表和教师情况表之间就是一对多的联系,如图 1.11 所 示。 系 部 表

教 师 情 况 表

系部编号

系部名称

教师编号

系部编号

姓 名

性别

学 历

职 称

107

会计系

199806

101

茅丽燕

研究生

教授

101

经济系

199310

108

许斌

大学

教授

108

计算机系

200010

108

东方剑

研究生

讲师

(父表)

系部编号-系部编号

(子表)

图 1.11 一对多的联系 18


通常我们将包含主关键字的关系称为父关系,包含外部关键字的关系称为子关系。若将一 对多联系的父、子关系互换,即构成多对一的联系。如图 1.12 所示。 系 部 表

教 师 情 况 表

系部编号

系部名称

教师编号

系部编号

姓 名

性别

学 历

职 称

107

会计系

199806

101

茅丽燕

研究生

教授

101

经济系

199310

108

许斌

大学

教授

108

计算机系

200010

108

东方剑

研究生

讲师

(子表)

系部编号-系部编号

(父表)

图 1.12

3.多对多的联系

多对一的联系

若关系 A 中的一个记录对应关系 B 中的多条记录,而关系 B 中的一个记录同样对应关系 A 中的多条记录,则 A、B 两个关系之间构成多对多的联系。 例如在图书管理数据库系统中,图书表与借阅表之间的联系就是多对多的联系。一本书可 以被若干个读者借阅,而一个读者又可以借阅若干本书,从而构成多对多的联系。如图 1.13 所示。 图

书 名

作 者

出版社

借书证号

姓 名

职 称

书 名

借阅日期

数据库概论

萨师煊

高等教育

199806

茅丽燕

教授

Basic 语言

2007/03/20

数据库概论

萨师煊

高等教育

200010

东方剑

讲师

C 程序设计

2007/04/08

Basic 语言

谭浩强

科学普及

199806

茅丽燕

教授

C 程序设计

2007/05/12

C 程序设计

谭浩强

清华大学

199806

茅丽燕

教授

数据库概论

2007/09/15

C 程序设计

谭浩强

清华大学

200010

东方剑

讲师

数据库概论

2007/10/29

书名-书名

图 1.13 多对多的联系

因为多对多的联系使数据结构复杂,数据操作困难,且容易出现数据的重复存储,产生数 据冗余。所以,应根据关系的规范化原则将多对多的联系分解成若干个一对多的联系。例如将 原借阅表分解成读者表和借阅表,并在表中增加一个“书编号”属性。 在图书、借阅和读者三个关系中,读者表的“借书证号”(借书证号和教师编号相同)与 借阅表的“借书证号”构成一对多的联系,图书表的“书编号”和借阅表的“书编号”也构成 一对多的联系。如图 1.14 所示。 图 19


书编号

书 名

作 者

借书证号

姓 名

性别

职 称

系部编号

TP2-01

数据库概论

萨师煊

199806

茅丽燕

教授

101

TP3-10

Basic 语言

谭浩强

199006

张玉萍

副教授

107

TP3-20

C 程序设计

谭浩强

200010

东方剑

讲师

108

借书证号-借书证号(一对多)

书编号-书编号(一对多)

书编号

借书证号

借阅日期

TP3-10

199806

2007/03/20

TP3-20

200010

2007/04/08

TP3-20

199806

2007/05/12

TP2-01

199806

2007/09/15

TP2-01 200010 2007/10/29 图 1.14 多对多联系分解为一对多联系 四、关系的完整性 关系的完整性指的是对关系的某种约束条件。它确定了具有联系的关系中的数据之间必须 遵循的制约和依存关系,以保证数据的正确性、有效性和相容性。 关系的完整性主要包括实体完整性、参照完整性和域完整性三种。 1.实体完整性 实体完整性规则是对关系中元组唯一性的约束。该规则规定:在关系中,组成主关键字的 所有属性均不能为空值(Null),并且不能有完全相同的属性值。 所谓的空值就是“没有”或者“无意义”的值。若主关键字取了空值,就说明这是一个不 能标识的实体,因无法与其它实体区分而违反了实体的定义,破坏了实体的完整性。若主关键 字的属性值有完全相同的,在关系中就会出现重复的元组,而违背了实体的唯一性,并造成数 据冗余。 例如在图 1.15 中,教师情况表中的主关键字“教师编号”,系部表中的主关键字“部门编 号”的属性值既不能为空,也不能有重复值。 2.参照完整性 因为实体之间存在着联系,所以在建立了联系的关系中,数据之间也存在着一定的联系。 一个关系中的外部关键字的值必须是与之已建立联系的另一个关系中的主关键字的值,或者是 空值(Null),但不能是主关键字中不存在的值。这种关系之间数据引用的约束,就称为参照 完整性。

20


例如在图 1.15 中,教师情况表中的外部关键字“部门编号”属性,其取值必须是在部门 表中确实存在的主关键字“部门编号”中的某个属性值,或者是空值(Null)。也就是说,教 师情况表中的“部门编号”属性的取值需要参照部门表的主关键字属性值。 系 部 表

教 师 情 况 表

系部编号*

系部名称

系部编号

教师编号*

姓 名

性别

学 历

职 称

107

会计系

107

199006

张玉萍

大学

副教授

102

财税系

107

199802

高大宇

大专

工程师

108

计算机系

108

199316

杨柳青

大学

教授

101

经济系

101

199806

茅丽燕

研究生

教授

东方剑

研究生

讲师

外语系

外部关键字值受部门表约束,但可为“空”(Null) 系部表中的“系部编号”值决定

主关键字的属性值不能为“空”(Null)

了教师表中“系部编号”的取值

图 1.15 关系的实体完整性和参照完整性 3.域完整性 域完整性是对关系中属性的约束,包括属性的数据类型,属性取值的域,以及是否可以为 Null 等有效性约束等。域完整性的约束条件和具体的关系数据库有关,是由确定关系结构时 所定义的属性所决定的。因此又称为用户自定义完整性。它是关系完整性中最简单、最基本的 约束。 表 1.11

教 师 情 况 表

教师编号

姓 名

性别

出生日期

学 历

学 位

职 称

部门编号

199806

茅丽燕

08/21/1959

研究生

硕士

教授

101

199006

张玉萍

03/21/1966

大学

学士

副教授

107

199310

许斌

05/30/1954

大学

教授

108

例如表 1.11 所示的教师情况表。表中“性别”属性的取值只能是“男”或者“女” ;“出 生日期”属性的取值与格式必须符合年、月、日之间的约束关系;“工资”属性的取值则必须 是数值;同时,它们也都可以定义为 Null。 关系完整性约束是关系设计的一个重要内容,其中实体完整性和参照完整性是关系模型必 须满足的完整性约束条件,被称作关系的两个不变性,由关系系统自动支持。域完整性则由用 户自己设置。通过系统自身以及用户自定义的约束机制,就能充分保证关系的准确性、完整性 和相容性。 五、关系运算

21


关系运算是关系数据操纵语言的一种表示方法,它用对关系的运算来表达查询。关系运算 以关系作为运算对象,运算结果也是关系。 关系的基本运算分为两类:传统的集合运算和专门的关系运算,一些复杂的查询需要几个 基本运算的组合来实现。 1.传统的集合运算 传统的集合运算属于二目运算,主要包括并、差、交等。集合运算要求参与运算的两个关 系必须具有相同的关系模式,即它们的结构(属性)相同,并且属性的域(取值范围)也相同。 ⑴ 并 两个关系并(Union)运算的结果是将属于这两个关系的所有元组合并在一起,消去重复 元组后所得到的元组组成的集合。

图 1.16 集合的并、差、交运算 例如,设有结构相同的两个关系:选修课程 R 和选修课程 S,如表 1.12 和表 1.13 所示。 R 与 S 的并运算就是将选修了课程 R 的学生与选修了课程 S 的学生合并后,组成的一个扩大 了的新关系,即选修了 R 和 S 两门课程的所有学生的集合,如表 1.14 所示和图 1.16(a)中的 阴影区域。 ⑵ 差 两个关系差(Difference)运算的结果是将一个关系中既属于本关系,又属于另一个关系 的元组去掉,本关系所余下的元组组成的集合。 例如,选修课程 R 和选修课程 S 的差运算就是将选修了 R 课程的学生中,又选修了 S 课 程的学生去除后,所组成的一个缩小了的新关系,即只选修了 R 课程的学生的集合,如表 1.15 所示和图 1.16(b)中的阴影区域。 选修课程 R

表 1.12

选修课程 S

表 1.13

学号

姓名

性别

出生日期

学号

姓名

性别

出生日期

10102

张洪

1981/09/20

10102

张洪

1981/09/20

10610

路雪英

1982/12/02

10610

路雪英

1982/12/02

10205

刘庆华

1984/04/08

10106

吕建军

1983/06/08

10616

林明

1983/06/18

表 1.14

R并S

R差S

表 1.15 学号

姓名

性别

出生日期

22


学号

姓名

性别

出生日期

10205

刘庆华

1984/04/08

10102

张洪

1981/09/20

10616

林明

1983/06/18

10610

路雪英

1982/12/02

10205

刘庆华

1984/04/08

学号

姓名

性别

出生日期

10616

林明

1983/06/18

10102

张洪

1981/09/20

10106

吕建军

1983/06/08

10610

路雪英

1982/12/02

表 1.16

R交S

⑶ 交 两个关系交(Intersection)运算的结果是一个关系中既属于本关系,又属于另一个关系的 元组组成的集合。 例如,选修课程 R 和选修课程 S 的交运算就是将两个关系中既选修了 R 课程,又选修了 S 课程的所有学生,所组成的一个缩小了的新关系,即同时选修了这两门课程的学生的集合。 如表 1.16 所示和图 1.16(c)中的阴影区域。 2.专门的关系运算 专门的关系运算主要有选择、投影和连接。 ⑴ 选择 选择(Selection)运算是对一个关系进行的运算,是从关系中找出满足给定条件的元组的 操作。选择的条件以逻辑表达式的形式给出,能使逻辑表达式的值为真的元组将被选取。 选择是从行的角度进行的运算,即从水平方向抽取记录的操作。经过选择运算得到的结果 形成一个新的关系,其关系模式不变,但其中的元组是原关系的一个子集。 例如,用选择运算从表 1.11“教师情况表”中将所有女同志的记录提取出来,得到如表 1.17 所示的“女教师情况表”。

表 1.17

女 教 师 情 况 表

教师编号

姓 名

性别

出生日期

学 历

学 位

职 称

部门编号

199806

茅丽燕

08/21/1959

研究生

硕士

教授

101

199006

张玉萍

03/21/1966

大学

学士

副教授

107

⑵ 投影 投影(Projection)运算也是对一个关系进行的运算,是从关系中选取若干个属性组成一 个新关系的操作。 投影是从列的角度进行的运算,即从垂直方向抽取字段的操作。经过投影运算得到的结果 形成一个新关系,其关系模式所包含的属性个数通常少于原关系,或者属性的顺序不同。投影

23


运算提供了在垂直方向调整关系的手段,也体现了关系中属性的顺序无关紧要的特点。 例如,用投影运算可以从表 1.11“教师情况表”中提取出“教师编号” 、“姓名” 、“学历” 和“职称”属性组成一个新的“学历职称表”,如表 1.18 所示。 要需注意的是,经投影运算得到的新关系中,有可能出现因属性的减少而导致元组数据完 全相同的情况,因此,投影运算后必须对元组数据进行检查,去掉重复的元组。 ⑶ 连接

表 1.18

连接(Join)是对两个关系进行的运算,是根据

学历职称表

教师编号

姓 名

学 历

职 称

一定的连接条件将两个关系组合成一个新关系的操

199806

茅丽燕

研究生

教授

作。常见的连接运算有两种:等值连接和自然连接。

199006

张玉萍

大学

副教授

199310

许斌

大学

教授

① 等值连接

等值连接是将两个关系中指定属性值相等的元组组合起来构成新关系的连接运算。例如, 将表 1.19“系部表”和表 1.20“教师情况表”按照“系部编号”属性进行等值连接,得到一个 新的“系部教师表”,如表 1.21 所示。 表 1.19 系部表

表 1.20

教师情况表

系部编号*

系部名称

系部编号

教师编号*

姓 名

性别

学 历

职 称

107

会计系

107

199006

张玉萍

大学

副教授

102

财税系

107

199802

高大宇

大专

工程师

108

计算机系

108

199316

杨柳青

大学

教授

101

经济系

101

199806

茅丽燕

研究生

教授

110

基础部

108

200010

东方剑

研究生

讲师

表 1.21

系 部 教 师 表

系部编号*

系部名称

系部编号

教师编号*

姓 名

性别

学 历

职 称

107

会计系

107

199006

张玉萍

大学

副教授

107

会计系

107

199802

高大宇

大专

工程师

108

计算机系

108

199316

杨柳青

大学

教授

101

经济系

101

199806

茅丽燕

研究生

教授

108

计算机系

108

200010

东方剑

研究生

讲师

② 自然连接 自然连接是自动去掉重复属性的等值连接,是最常用的连接运算。如对表 1.19 和表 1.20 进行自然连接得到新表为表 1.22。

24


表 1.22

系 部 教 师 表

系部编号*

系部名称

教师编号*

姓 名

性别

学 历

职 称

107

会计系

199006

张玉萍

大学

副教授

107

会计系

199802

高大宇

大专

工程师

108

计算机系

199316

杨柳青

大学

教授

101

经济系

199806

茅丽燕

研究生

教授

108

计算机系

200010

东方剑

研究生

讲师

在关系数据库系统中,通常是将关系的选择、投影、连接等关系运算综合应用,实现对关 系的多种查询操作。 例如,在图书管理数据库系统中,要查询某个读者所借图书的“书名称”、 “作者” 、 “出版 社”以及“借阅日期”等信息,其基本操作是: 首先将“读者表”和“借阅表”按照“借书证号”相等的条件连接起来,然后对连接所得 结果再按照“书编号”相等的条件与“图书表”进行连接,最后根据“借书证号”或“姓名” 选择所需的元组(记录) ,并对“书名称”、“作者”、“出版社”、“借阅日期”几个属性进行投 影。 如果还要查询读者的其它信息,如“性别” 、 “出生日期”、 “学历” 、 “职称”等,可以按照 “借阅表”的“借书证号”与“教师情况表”的“教师编号”对应相等为条件连接起来。“借 阅表”中的“借书证号”和“教师情况表”中的“教师编号”属于结构定义相同,取值的域也 相同,而属性名不同的情况。 由上述例子可以看出,在关系数据库中,不同表中的公共字段(属性)和具有相同语义(结 构定义和取值的域相同)的字段均可用于建立关系之间的连接。

1.3 数据库设计基础 数据库设计是建立数据库及其应用系统的基础,是信息管理系统开发和建设的核心技术。 数据库应用系统一般都具有数据量庞大、数据保存时间长、数据关联比较复杂、用户要求多样 化等特点。设计数据库的目的实质上是设计出满足应用需求的实际关系模型。数据库要将信息 系统中大量的数据按照一定的模型组织起来,提供存储、维护、检索数据的功能,使信息系统 可以方便、及时、准确地从数据库中获得所需的信息。一个信息系统的各个部分能否紧密地结 合在一起,以及如何结合,关键在数据库的设计。

25


1.3.1 数据库设计的基本原则 为了合理地组织数据,应遵从以下基本设计原则,以保证数据库、表的结构设计合理,使 存储的数据不仅能反映实体信息,而且能反映实体之间的客观联系。 1.概念单一化 在关系数据库中用一个表来描述一个实体或实体间的一种联系。设计时要避免设计大而杂 的表。首先应分解那些需要作为单个主体而独立保存的信息,然后通过确定这些主体之间的联 系,以便在需要时将信息正确地组合在一起。通过将不同的信息分散到不同的表中,可以使数 据的组织工作和维护工作变得简单,同时也容易保证建立的应用系统具有较好的性能。 例如,在人事管理系统中,将有关教师基本情况的数据,包括学历、职称、专业等保存到 教师情况表中,而将工资单的信息保存到单独的工资表中,所在部门的信息保存到系部表中, 这样既避免了将所有信息放在一起造成表的字段太多,数据结构过大的问题,又可以通过表间 的关联建立联系后,满足查询所有信息的需要。 2.避免表之间的重复字段 除了保证在表中要有能与其它表建立关联的外部关键字外, 应尽量避免在不同的表中出现 重复的字段。这样既可减少数据的冗余量,还可避免在对数据进行插入、修改、删除等更新操 作时造成数据的不一致。 例如,在教师情况表中只保留系部编号字段,系部名称、系部地址、系部电话等其它信息 均保存在系部表中,需要时通过两个表的关联即可获得。在系部表中对除了系部编号外的其它 信息进行的更新操作,可同步反映到教师信息中。 3.表中保存原始数据 在表中保存的数据应该是原始数据,应尽量避免出现能够通过计算获得的字段。 例如,教师表中应该有出生日期字段,而不应该有年龄字段。因为具体的年龄通过指定日 期与出生日期之间的简单运算即可得到。 若在特殊条件下需要有计算字段,必须保证计算字段数据更新的同步。例如,在工资表中 有“实发工资”字段,其值是按照公式“基础工资+职务补贴+职绩津贴-水电费”进行计算 得到的。当公式中的字段值进行了任何修改时,都必须重新计算以保证“实发工资”同步更新。 4.合理选用主关键字 关键字保证了表中记录的唯一性。不同表之间的关联通过主关键字和外部关键字建立联 系。合理选用主关键字不仅使表具有合理的结构,能存储所表示实体的信息,而且可以正确 反映出实体之间的联系,满足实际应用的需求。 例如,将教师情况表中的教师编号设置为主关键字,而系部表中的系部编号设置为主关

26


键字,并作为教师情况表的外部关键字。

1.3.2 数据库设计的过程 数据库设计主要有以下几个基本步骤: 1.需求分析 需求分析是数据库设计的基础。只有详细调查、充分了解了用户的需求,才有可能对用户 需求所涉及的各方面信息及其相互之间的关系作出正确的分析,设计出符合用户要求的数据库 系统。用户的需求主要有三个方面: ⑴ 信息需求 信息需求指的是用户要从数据库中获得信息的内容和性质。 信息需求决定了数据库系统应 该提供哪些数据和数据的类型。 ⑵ 处理需求 处理需求指的是用户对数据要以何种处理方式进行怎样的加工处理。处理需求定义了数据 库系统对数据的操作。 ⑶ 安全与完整性需求 指的是数据库系统中的数据必须要遵循的安全性和完整性的约束条件。 在调查、了解用户需求时,要多与使用人员如最终用户、数据库管理员等交流,详尽细致 地了解现行系统(手工或计算机系统)的业务流程、信息流动方向、加工处理情况、输出数据 格式、以及各信息之间的联系。要尽可能全面地收集所有的数据资料,如各种原始数据、单据、 文档、报表等。 2.结构设计 结构设计是数据库设计中技巧性要求最高的一个过程。它是在需求分析的基础上,在充分 了解了用户需求,准确掌握了数据库系统要存储、处理的各种数据,数据的类型,数据所表示 的实体以及实体之间的相互联系后,按照数据库设计的基本原则和关系模型的规范化要求,设 计数据库中的表结构。 ⑴ 确定数据库中所需要的表 根据概念单一化的原则,用一个表来描述一个实体或实体间的一种联系。如在学校人事管 理系统中,将教师、工资、系部、科研成果、课程等实体各自设计成一个独立的表。 ⑵ 确定表中的字段 ① 表中的字段应和该表描述的实体直接相关,即直接描述该实体的一个属性应该是该表 的一个字段。描述同一个实体的字段若在其它表中重复出现,应尽可能的消除不必要的重复字

27


段。例如在工资表中,不应出现诸如“姓名”、 “性别”、“职称”等在教师表中已有的字段。 ② 字段必须是最小的数据单位,而不应是若干数据项的集合。例如,在工资表中,将应 发工资项分解成“基础工资”、 “职务补贴”、 “职绩津贴”和“福利奖金”几个字段;扣发工资 项分解成“水电费”、“煤气费”等。 ③ 字段中的数据应是原始数据,要尽量避免出现计算数据。例如,商品表中有“单价”、 “数量”字段,而总价=单价×数量,可以通过计算得到,则不必在表中作为字段存储。 ⑶ 确定主关键字段 为了使关系型数据库管理系统能够迅速查找存储在多个独立表中的数据并组合它们,避免 出现重复记录,每个表都必须设置一个能够唯一标识一个记录的主关键字。主关键字可以是一 个单独的字段,也可以由若干个字段组合而成。作为主关键字的字段不允许出现空值或者重复 的值。关系数据库使用主关键字建立多个表之间的数据关联,将它们组合成用户所需的信息。 一般的,在表中建立一个专门的字段来做主关键字。例如, “教师编号”、 “系部编号”、 “商 品编号”、 “图书编号”、 “订单号”等可分别定义为教师表、系部表、商品表、图书表和订单表 的主关键字段。 ⑷ 确定表间联系 ① 一对一联系 如果存在一对一的联系,且表示的是同样实体的表,首先要考虑是否可以将两个表的字段 合并到一个表中。例如一个单位图书馆的读者表,就可以和教师表合为一个表。 如果两个表合并后的字段数目太多,且其中一些字段数据经常变化,则以保持两个表,在 两个表中设置相同的主关键字段,建立一对一的联系为好。例如,与工资相关的数据经常变化, 而教师的基本情况数据则较少变化。为保证数据之间的关系清晰,操作方便,可以建立教师表 和工资表,在这两个表中都使用“教师编号”作为主关键字段,建立起一对一的联系。 若两个表对应着不同的实体,或者主关键字段不同,可选择将一个表的主关键字段放到另 一个表中作外部关键字,或者设置一个语义相同,字段名不同的字段,来建立表间一对一的联 系。例如,学校图书馆的读者包含了教师和学生,可以在读者表中设置一个“借书证号”字段, 该字段的定义及其数据与教师表的“教师编号”字段,学生表的“学生编号”字段相同。通过 “教师编号” 、“学生编号”和“借书证号”,即可建立教师表与读者表,学生表与读者表的一 对一联系。 ② 一对多联系 一对多联系是关系型数据库系统中最普遍的联系。将“一方”表的主关键字段添加到“多 方”表中作外部关键字段,即可实现一对多的联系。 例如,在人事管理系统中,将系部表的主关键字段“系部编号”添加到教师表中,通过“系 部编号”,系部表和教师表之间就建立了一对多的联系。 ③ 多对多联系 28


多对多的联系是实体之间常见的联系。例如读者与图书之间,学生与课程之间都是多对多 的联系。为了避免数据的重复存储,尽量减少冗余数据,同时又要保持多对多的联系,一般的 方法是建立一个中间表,通过中间表将多对多的联系分解成两个一对多的联系。通常在中间表 中包含了具有多对多联系的两个表的主关键字段。 例如,在图书管理系统中,读者与图书之间构成多对多的联系。建立一个中间表——借阅 表,使得图书表的主关键字段“图书编号”和借阅表的“图书编号”字段形成一对多的联系; 而读者表的主关键字段“借书证号”和借阅表的“借书证号”字段也形成一对多的联系。从而 将多对多的联系分解为一对多的联系。如 1.2.2 节中的图 1.13 和图 1.14 所示。 在中间表中,可以用它所联系的两个表的主关键字段组成复合关键字,作为自己的主关键 字。 3.系统设计实施 完成数据库的结构设计后,进入系统设计实施阶段。用选定的数据库管理系统所提供的数 据定义语言和方法在计算机中建立数据库和数据表,并将原始数据输入库中。 数据库应用程序的设计应该与数据库设计同步进行。根据整个数据库系统的功能要求,设 计、编写数据库应用系统的各功能模块,以实现对数据库中数据的各种操作、处理。因此,在 实施数据库设计的同时,还要编写、调试应用程序。数据库应用系统的设计、编写和调试的方 法与步骤请参考第九章“应用系统开发简介”,或者其它的介绍系统开发、软件工程等方面的 参考书籍。 在数据库系统设计的实施阶段,要向数据库中小批量的输入一些原始数据,试运行来测试 数据库和应用程序的功能是否满足了设计要求。 若不满足,则需要查找未达到设计要求的原因, 是数据库结构设计上的问题,还是应用程序功能设计的问题。对发现的问题要及时进行修改、 调整,直到达到设计要求为止。这一过程应贯穿于整个设计实施阶段。

1.4

Visual FoxPro 系统概述

Visual FoxPro 是美国 Microsoft 公司研制推出的,可运行于 Windows 操作系统平台的数据 库开发系统。它提供了强大的数据库结构设计和应用程序开发功能,是广泛应用于微型计算机 上的一种关系型数据库管理系统软件。 本节将结合 Visual FoxPro 的发展,简要介绍其主要功能和特性。

1.4.1

Visual FoxPro 简介

一、Visual FoxPro 的发展 20 世纪 80 年代初期,随着微型计算机的发展,美国 Ashton-Tate 公司开发研制的应用于 29


微型计算机上的 dBase 关系数据库管理系统软件推向市场。由于其体积小巧,交互式的工作方 式只需键入简单的命令即可完成数据库结构的建立,数据的增添、修改、删除,记录的索引、 查询和输出报表的生成, 还可以利用其自带的程序设计语言开发、编写小型的数据库应用系统, 因而受到用户的普遍欢迎,迅速成为在微型计算机上使用最为广泛的数据库管理系统。并形成 了 dBase II、dBase III、dBase III+、dBase IV 等系列产品。 1986 年后,美国 Fox Software 公司推出了与 dBase 完全兼容,但比 dBase 功能更强,运 行速度更快的 FoxBase 1.0、FoxBase 2.0、FoxBase 2.1 系列产品,取代 dBase 成为微型计算机 上数据库管理系统的主导。1989 年又推出了 FoxBase 的换代产品 FoxPro 1.0。 随着计算机软、硬件技术的快速发展,图形界面的 Windows 操作系统的应用与普及,Fox Software 公司于 1991 年推出了 FoxPro 2.0。因为引入了仿图形的用户界面、字符窗口技术和 多媒体技术,使用了 Rushmore 查询优化技术,FoxPro 2.0 在与 FoxBase 高度兼容的基础上, 增加了 100 余条全新的命令与函数,并支持对微型计算机扩展内存的管理,在性能上得到大幅 度的提高,成为 XBase 数据库管理系统的新标准。XBase 指的是基于 dBase 的命令语法和文 件格式,与 dBase 兼容,应用于微型计算机系统的关系型数据库管理系统系列产品。 1992 年 Microsoft 公司收购了 Fox Software 公司。1993 年~1994 年陆续推出了 FoxPro 2.5 和 FoxPro 2.6,它们均包含了可分别应用于 DOS 操作系统和 Windows 操作系统的两种产品。 1995 年,随着 Windows 95 操作系统的问世,面向对象技术的成熟和可视化编程技术的推 广,Microsoft 公司推出了 32 位的 Visual FoxPro 3.0。该软件引进了面向对象程序设计技术和 可视化的概念;明确提出了客户/服务器体系结构;引进逻辑数据库结构的概念,使得在 XBase 中零乱的数据库表文件得到了全面统一的管理。 1997 年 Microsoft 公司推出 Visual FoxPro 5.0 及其中文版。1998 年推出包含了 Visual FoxPro 6.0 的可视化编程语言集成包 Visual Studio 6.0 及其中文版。2003 年推出 Visual FoxPro 8.0 及其 中文版。本教程介绍的就是 Visual FoxPro 8.0 中文版。后面提到的 Visual FoxPro,若无特别说 明均指此版本。 二、Visual FoxPro 8.0 的特点 Visual FoxPro 8.0 除了具有 XBase 系列数据库管理系统的功能和特性外,在系统资源利 用、数据库系统的运行效能、设计开发环境等多个方面采用了新技术,做了全方位的改进和优 化。其特点主要有以下几个方面。 1.良好的用户界面 Visual FoxPro 8.0 提供了一个以菜单、工具栏命令按钮为主,同时包含了输入命令窗口的 用户界面。用户既可以使用 Windows 操作系统窗口界面所提供的菜单、命令按钮方式,也可 以使用传统 XBase 的交互式命令方式,实现对 Visual FoxPro 各种功能的操作与管理任务,大 大方便了新、老用户。 2.增强的数据库管理

30


Visual FoxPro 8.0 对数据库管理的支持得到加强。它将 XBase 数据库管理系统中的数据库 文件 .dbf 作为数据表集合在数据库中进行统一管理,增强了对数据的管理控制和数据库的安 全性。Visual FoxPro 8.0 提供的结构化查询语言 SQL(Structured Query Language),能够完成 对数据库、表的各种操作。优化的 Rushmore 技术能够快速地访问索引文件,迅速而准确地从 庞大的数据表中检索数据,显著提高了查询速度。 3.集中的应用程序开发环境 Visual FoxPro 8.0 提供了一个集中的应用程序开发环境。数据库应用系统的各个组成部分, 包括数据库和表、查询、表单、报表和标签、应用程序代码、菜单、类、文本文件以及创建、 维护、管理它们的各类向导、设计器、生成器、工具栏等,都可以在“项目管理器”中进行统 一的访问管理,并且提供了允许同时访问数据组件的能力,使多个用户能够一起开发应用程序。 项目管理器和向导、设计器、生成器、工具栏等软件开发、管理工具的使用大大降低了数 据库应用系统的开发难度。 4.面向对象的程序设计 除了一贯坚持的在 XBase 数据库管理系统中包含应用程序开发工具,提供数百条命令和 标准函数,继续支持传统的面向过程的程序设计方法外,Visual FoxPro 8.0 还提供了面向对象 的可视化程序设计方法。使用 Visual FoxPro 8.0 的对象模型和事件驱动,充分利用面向对象程 序设计的各种功能,包括类的继承性、封装性、多态性和子类,以及可视化的编程工具,可以 方便快捷地进行系统开发,加快应用系统的开发速度,提高效率。 5.程序间的互操作性 Visual FoxPro 8.0 支持对象的链接与嵌入(Object Link Embed) ,可以在 Visual FoxPro 8.0 应用程序内部,以及 Visual FoxPro 8.0 和其它应用程序之间移动数据,实现互操作和数据共享、 数据交换。 6.对 Internet 的支持 Active Document 是一种基于 Windows 的、嵌入浏览器的非 HTML 应用程序,它提供了在 浏览器界面中访问该应用程序功能的途径。Active Document 应用程序与任何其他的 Visual FoxPro 应用程序一样,都可以运行表单、报表和标签,将类实例化,运行代码及操作数据, 而且 Active Document 应用程序能包容在像 Internet Explorer 这样的 Active Document 容器中。 除了 BMP 图形格式外,增加了对 GIF(Graphics Interchange Format)和 JPEG(Joint Photographic Electronic Group)等图形格式的支持,进一步加强了对 Internet 的支持。 7.客户/服务器解决方案 Visual FoxPro 8.0 支持大多数后台数据库的客户机/服务器应用程序连接。使用 32 位的 ODBC(Open Database Connectivity 开放式数据库连接)驱动程序可以连接多种不同的数据库 系统,提供灵活、可靠、安全的客户/服务器解决方案。 8.对早期版本的兼容与升级 31


Visual FoxPro 8.0 向下兼容。既可以在 Visual FoxPro 8.0 环境下直接使用 ForPro 的数据库 文件,执行 FoxPro 应用程序,也可以使用 Visual FoxPro 8.0 提供的转换工具,将 FoxPro 的各 种文件转换升级为 Visual FoxPro 8.0 文件,以充分利用已有的数据,实现低版本向高版本的平 滑过渡与升级。 三、Visual FoxPro 8.0 的性能指标 Visual FoxPro 8.0 的主要性能指标如表 1.23 所示。 表 1.23

Visual FoxPro 8.0 的主要性能指标 项

数据表与索引文件 变量数组 字 段 命令与程序

每个数据表允许的最多记录个数

10 亿个

每个数据表的最大存储容量

2GB

每个记录允许的最大长度

65000B

每个记录允许的最多字段个数

255 个

允许同时打开的数据表个数

255 个

允许使用的工作区个数

32767 个

普通索引中关键字的最多字符数

100B

压缩索引中关键字的最多字符数

240B

默认的内存变量数目

1024 个

内存变量的最大数目

65000 个

数组的最大数目

65000 个

每个数组中元素的的最大数目

65000 个

字符型字段的最大长度

254B

数值型和浮点型字段的最大长度

20 位

数据库表字段名的最大长度

128B

自由表字段名的最大长度

10B

整数最小值

-2147483647

整数最大值

2147483647

数值计算精度

16 位

每个命令行的最大长度

8192B

每个字符串允许的最多字符数

254B

程序文件的最大容量

64KB

DO 调用嵌套的最多层数

128

READ 嵌套的最多层数

5

32


程序嵌套结构的最多层数

384

传递参数的最大数目

27 个

浏览窗口打开的最多个数

255 个

SQL Select 语句选择字段的最多个数

255 个

分组的最多层数

128

四、Visual FoxPro 8.0 的工作环境 Visual FoxPro 8.0 是一个 32 位的关系型数据库管理系统。其软、硬件工作环境必须满足以 下基本要求。 1.硬件环境 ⑴ 一台带有 Pentium 处理器或更高档处理器的 IBM-PC 兼容机; ⑵ 推荐使用 256MB 或更高容量的内存; ⑶ 至少使用 800×600 或更高分辨率的显示器; ⑷ CD-ROM 和鼠标; ⑸ 硬盘空间: 根据安装选项的不同,需要的硬盘空间在 115MB~200MB 之间。 2.软件环境 中文 Windows 9X/NT/2000/XP 操作系统。

1.4.2

Visual FoxPro 的用户界面

与 Windows 操作系统下的其它应用程序一样,Visual FoxPro 8.0 也为用户提供了丰富而又 友好的可视化图形界面。 一、Visual FoxPro 8.0 的启动与退出 1.启动 Visual FoxPro 8.0 系统 Visual FoxPro 8.0 的起动方法和 Windows 操作系统其它应用程序的起动方法相似,可以单 击“开始”菜单按钮,在“程序”中单击“Microsoft Visual FoxPro 8.0”项。若在桌面上有“Microsoft Visual FoxPro 8.0”的快捷图标,直接双击即可启动。也可以通过打开扩展名为 .dbf、.fpt、.prg 的 Visual FoxPro 文件启动 Visual FoxPro 8.0 系统。

33


Visual FoxPro 8.0 系统启动成功,首先进入由标题栏、菜单栏、工具栏、工作区、状态栏 组成的“Microsoft Visual FoxPro 8.0”主窗口界面,其中还有一个命令窗口,如图 1.17 所示。

标题栏

菜单栏

工具栏

工作区

状态栏

命令窗口

图 1.17

Visual FoxPro 8.0 系统主窗口界面

2.退出 Visual FoxPro 8.0 系统 退出 Visual FoxPro 8.0 的方法也和 Windows 操作系统其它应用程序的退出方法相似。可 以单击系统主窗口标题栏右端的“×” (关闭)按钮;或者单击“文件”下拉菜单中的“退出” 命令项;或者双击标题栏左端的图标;或者按快捷组合键 Alt+F4;或者在命令窗口中输入 Quit 命令后按回车键执行,均能退出 Visual FoxPro 8.0 系统。 二、Visual FoxPro 的工作方式 Visual FoxPro 8.0 系统提供了两类共三种工作方式: 1.交互式工作方式 交互式工作方式是一种人机对话方式,每次执行一条命令,并即时显示命令执行的结果。 交互式方式又分为两种操作方式。 ⑴ 菜单操作方式 菜单操作方式使用图形窗口界面所提供的菜单系统中的下拉式菜单、弹出式菜单(又称快 捷菜单)和工具栏命令按钮,实现人机对话、交互式的对数据库系统的各种操作。菜单命令的 具体操作方法,请参考有关的介绍 Windows 操作系统的书籍。 ⑵ 命令操作方式 命令操作方式是 Visual FoxPro 8.0 系统所提供的与以前的 XBase 数据库管理系统兼容的操 作方法。该方法通过在命令窗口中直接输入并执行单条命令来实现对数据库的各种操作。它与 菜单方式一样,也是一种人机对话,交互式的操作方式。 2.程序工作方式 程序工作方式是根据需要将若干条 Visual FoxPro 8.0 系统支持的命令,按照一定的结构组 织、编写成程序文件,然后运行程序文件,以实现对数据库的各种操作。它是一种自动工作方

34


式。 本小节主要介绍 Visual FoxPro 8.0 所提供的菜单系统的主要功能及操作。 三、Visual FoxPro 的菜单系统 Visual FoxPro 8.0 系统启动后,在其主窗口的菜单栏中有八个下拉式菜单项:文件(F)、 编辑(E)、显示(V)、格式(O)、工具(T)、程序(P)、窗口(W)、帮助(H)。下面分别 简要介绍。 1.常用菜单 常用菜单指的是在 Windows 应用程序中几乎都有的菜单项。这些菜单中的命令项及其功 能在不同的应用程序中基本相同,例如“文件”菜单中主要有“新建” 、 “打开”、 “保存”、 “另 存为”、 “页面设置”、 “打印预览” “打印”、 “文件清单”、 “退出”等各种与文件相关的命令项; “编辑”菜单中主要有“撤销”、 “剪切”、 “复制”、 “粘贴” 、 “清除”、 “查找”、 “替换”等命令 项; “格式”菜单中主要有“字体”、 “行距”、 “缩进”等命令项; “帮助”菜单中主要包含了“帮 助主题”、“技术支持”、 “关于…”等命令项。 常用菜单的详细介绍请参考相关的计算机基础教材,此处不再赘述。 2.Visual FoxPro 系统菜单 系统菜单指的是 Visual FoxPro 8.0 特有的菜单项。它们主要有: ⑴“显示”菜单 在用户尚未打开任何文件时,“显示”下拉菜单中只有一个“工具栏”命令项。当已经打 开了表、表单或者报表等文件时,“显示”菜单中的命令项根据打开文件的不同而有所不同, 其中主要包含了“浏览” 、“编辑” 、“设计器”、“工具栏”等命令项。表 1.24 所示为打开“浏 览”窗口后“显示”菜单中的各命令项及其功能。 表 1.24

“显示”菜单中的命令项及其功能

命令项

浏览

在“浏览”窗口中以一行一条记录的形式显示、编辑修改表或视图中的数据

编辑

在“编辑”窗口中以一行一个字段的形式显示、编辑修改表或视图中的数据

追加模式

在表的尾部添加一条空白记录,并将指针移到第一个字段上

数据库设计器

打开“数据库设计器”,显示、编辑修改当前数据库中的表、视图及其关系

表设计器

打开“表设计器”,显示、编辑修改当前表的结构

网格线

显示或清除“浏览”、“编辑”窗口中的网格线

工具栏

显示“工具栏”对话框,编辑、显示、隐藏、新建、定制、重置工具栏

⑵“工具”菜单 “工具”下拉菜单中主要包含“向导”、 “宏” 、 “调试器” 、 “选项”等命令项,其功能如表 1.25 所示。

35


表 1.25

“工具”菜单中的命令项及其功能

命令项

向导

在其下级子菜单中包含 Visual FoxPro 的 14 种向导调用命令项

拼写检查

检查文本、备注字段和命令的拼写是否正确

打开“宏”对话框,用定义键盘组合键的方式来代替一组命令序列。

类浏览器

打开“类浏览器”窗口,显示类库或表单中的类

组件管理库

在“组件管理库”窗口中对对象、项目、应用程序或其他类等组件分类管理

范围分析器

显示“代码范围日志”文件中记录的代码运行信息

修饰

对文本编辑窗口中的程序或文本文件指定字母大小写及缩进的样式

断点

打开“断点”对话框,设置断点

调试器

打开“调试器”窗口对程序进行调试

选项

打开“选项”对话框,设置 Visual FoxPro 系统的运行环境 ⑶“程序”菜单 “程序”下拉菜单中主要包含了“运行”、“编译”等命令项,其功能如表 1.26 所示。 表 1.26

“程序”菜单中的命令项及其功能

命令项

运行

打开“运行”对话框,选定要运行的程序、查询、表单或菜单文件

取消

停止运行当前程序

恢复

恢复运行当前挂起的程序 暂停正在运行的程序,但保持程序的打开状态,以后可以选择“恢复”命令

挂起

继续运行,或选择“取消”命令停止运行

编译

打开“编译”对话框,对当前或选定的程序文件进行编译

执行程序列表

运行在“编辑”窗口中打开的程序文件

⑷“窗口”菜单 “窗口”下拉菜单中主要包含了窗口控制与操作命令项,其功能如表 1.27 所示。 表 1.27

“窗口”菜单中的命令项及其功能

命令项

层叠

以互相重叠的方式重新排列所有显示的窗口

全部重排

以不互相重叠的方式重新排列所有显示的窗口

游离

设置命令、属性、数据工作期窗口是否局限在主窗口中及能否最大、最小化

隐藏

隐藏当前窗口

清除

清除应用程序工作区或者当前输出窗口中的文本

循环

将所有显示的窗口按顺序循环切换为当前窗口 36


命令窗口

显示“命令”窗口

数据工作期

显示“数据工作期”窗口,浏览、打开、关闭表,建立关系,设置工作区属性

属性窗口

显示“属性”窗口

窗口名列表

显示打开的所有窗口名称列表,切换当前窗口

3.其它菜单 其它菜单指的是随着打开窗口的不同,或者当前操作对象的不同而在 Visual FoxPro 主窗 口菜单栏中出现的一些菜单项。例如在“浏览”窗口中显示一个数据表中的数据时,菜单栏中 会出现一个“表”菜单项;若打开“项目管理器”对话框则出现一个“项目”菜单项;而打开 “表单设计器”窗口则出现一个“表单”菜单项等。 其它菜单项中的命令项及其功能详见后续章节中的介绍。 四、Visual FoxPro 的工具栏 工具栏是 Windows 应用程序提供的一种简捷操作方法。它将一些常用的功能、操作以工 具栏命令按钮的形式提供给用户。用户只需用鼠标单击这些工具栏按钮,即可按该命令的默认 参数完成相应的功能或操作,比使用菜单命令要方便快捷得多。 所有的工具栏按钮都有帮助提示功能。当把鼠标指针移动到某个工具栏按钮上并稍作停留 时,系统即会显示该按钮的功能提示信息。 1.工具栏种类 在 Visual FoxPro 主窗口界面中,默认显示的是位于菜单栏下面的“常用”工具栏。除了 “常用”工具栏,Visual FoxPro 系统还提供了另外 10 种工具栏见表 1.28 所示。 Visual FoxPro 的工具栏

表 1.28 报表控件

报表设计器

查询设计器

布局

打印预览

表单控件

表单设计器

视图设计器

调色板

数据库设计器

2.显示/隐藏工具栏 通常情况下,表 1.28 中的工具栏均不显示,处于隐藏状态。当作某种操作时,系统会自 动显示相应功能的工具栏。例如,要创建表单,系统自动显示“表单控件”和“表单设计器” 工具栏;若关闭表单窗口,两个工具栏也自动隐藏。此外,用户还可以使用下列两种方法显示 /隐藏工具栏。 ⑴ 单击“显示”下拉菜单中的“工具栏”命令项,在“工具栏”对话框设置要显示/隐 藏的工具栏。 ⑵ 右键单击工具栏,在弹出的快捷菜单中选择要显示/隐藏的工具栏。 五、命令窗口、状态栏和工作区 1.命令窗口 37


命令窗口位于主窗口的工作区中,是编辑、执行 Visual FoxPro 系统命令的地方。可以通 过在命令窗口中输入命令来实现对数据库的各种操作;也可以用编辑工具在窗口中对操作命令 进行修改、插入、删除、剪切、复制、粘贴等编辑操作。此外,使用菜单系统对数据库进行各 种操作所对应的命令会自动显示在命令窗口中。 使用“窗口”菜单,“常用”工具栏按钮,或者直接对命令窗口操作,可以设置命令窗口 的显示、隐藏、游离等状态。 2.状态栏 位于主窗口的最底部。当移动鼠标到某个对象上或者单击菜单项或者打开某个窗口时,在 状态栏上会显示相应的提示、帮助、状态信息。例如打开一个数据表后,在状态栏中显示:数 据表名、表所在的数据库名、表中当前记录号、表中记录总数、共享状态等提示信息。 3.工作区 工具栏与状态栏之间的空白区域。用于显示 Visual FoxPro 系统的各种工作窗口,数据库 表中的数据等。 六、Visual FoxPro 系统运行环境参数设置 Visual FoxPro 8.0 安装成功后,系统会自动采用一些默认参数来设置其运行环境。为满足 各种不同要求,系统允许用户定制自己的运行环境参数。运行环境参数的设置主要包括主窗口 的显示,日期、时间的显示格式,文件保存的默认目录,以及表单、项目、控件等。 可以使用“选项”对话框或者使用 Set 命令进行系统运行环境参数的设置。在此仅介绍使 用“选项”对话框进行参数设置的方法。使用 Set 命令的方法将在后续章节中介绍。 1.打开“选项”对话框 单击“工具”下拉菜单中的“选项”命令项,即可打开“选项”对话框如图 1.18 所示。 “选 项”对话框中共有 14 个选项卡。各选项卡的名称及其设置功能见表 1.29。 表 1.29

“选项”对话框中的选项卡及其设置功能

名 称

功 能

区域

设置日期、时间、货币和数字的格式。

调试

调试器选项设置,如窗口、字体、颜色等。

语法着色

设置程序文件中各组成部分如注释、关键字、其它子句的字体及颜色。

字段映象

设置从数据环境设计器、数据库设计器或项目管理器向表单中拖放表或字段时 创建何种控件。

IDE

编写程序、查询、菜单文件时的缩排、保存选项、外观和性能等的设置

报表

报表设计器选项,如网格间距、显示位置、字体等

显示

设置主窗口是否显示状态栏、时钟、命令结果、系统信息等

38


常规 数据

设置数据输入和编程选项,警告声音,是否记录编译错误和自动填充新纪录, 以及定位键,调色板颜色,改写文件是否警告等。 字符串比较设定、表选项,是否使用 Rushmore 优化和索引强制唯一性,排序序 列,备注块大小,记录计数器间隔,以及锁定和缓冲选项等

远程数据

远程数据访问选项,如连接超时限定值,每次取记录数,SQL 更新的使用

文件位置

设置 Visual FoxPro 的默认目录位置,以及帮助文件和辅助文件的存储位置

表单

表单设计器选项,如网格间距、度量单位、设计区域的大小以及模板等

项目

项目管理器选项,如是否向导提示,使用双击运行或修改文件,以及源代码管理等

控件

设置是否使用“表单控件”工具栏中的“查看类”按钮所提供的可视类库或者 ActiveX 控件选项。

下面使用“选项”对话框介绍几种常用的系统运行环境参数设置。 ⑴ 设置默认目录 在 Visual FoxPro 系统中所建立的各种文件均默认保存在系统的默认目录中。通常默认目 录是安装 Visual FoxPro 系统时设定的目标文件夹,其中保存了大量的各种 Visual FoxPro 系统 文件。Visual FoxPro 8.0 系统安装时在“我的文档”文件夹中自动建立了“Visual FoxPro Projects (项目)”文件夹,供用户开发应用系统时使用。为了方便管理,本书将“Visual FoxPro 项目”

图 1.18 “文件位置”选项卡

39


设置为用户默认目录,用于保存用户创建的各种文件。修改默认目录的设置步骤如下: ① 单击“文件位置”选项卡;在列表框中选择“默认目录(未用)”项,如图 1.18 所示。 ② 单击“修改”按钮,或者直接双击“默认目录(未用)”项,打开“更改文件位置”对 话框,如图 1.19 所示。

图 1.19 “更改文件位置”对话框 ③ 选择“使用默认目录”复选框;在“定位默认目录”文本框中输入用户工作目录的完 整路径;或者单击右端的“…”按钮,打开“选择目录”对话框选定用户工作目录,单击“选 定”按钮返回后,系统自动在文本框中输入用户工作目录的完整路径。 ④ 单击“确定”按钮返回“选项”对话框,修改后的新默认目录出现在列表框中。 ⑵ 设置日期和时间 单击“区域”选项卡,如图 1.20 所示。在该选项卡中可以设置日期格式,计时制,货币

图 1.20

“选项”对话框的“区域”选项卡

40


格式及符号,小数位数等。 ⑶ 设置表单 单击“表单”选项卡,如图 1.21 所示。在该选项卡中可以设置是否使用网格线,移动控 件对象时是否按网格线对齐,修改网格的水平、垂直间距,度量单位,表单的最大设计区域, 是否使用以及使用何种模板类等。 2.环境参数设置的保存 对 Visual FoxPro 系统运行环境参数所作的修改设置既可以是临时性的,也可以是永久性 的。

图 1.21“表单”选项卡 ⑴ 临时保存 临时保存是将对 Visual FoxPro 系统运行环境参数所做的修改保存在系统内存中。这种临 时保存的运行环境参数仅对当前正在运行的 Visual FoxPro 系统有效,一旦退出 Visual FoxPro 系统,所作的修改即失效。再启动 Visual FoxPro 时又恢复到系统原来的默认运行状态。 将修改保存为临时性设置的操作是:关闭“选项”对话框时只单击“确定”按钮。 ⑵ 永久保存 永久保存是将对 Visual FoxPro 系统运行环境参数所做的修改保存到 Windows 操作系统的

41


注册表中,退出 Visual FoxPro 系统后,这些修改也不会失效。以后每次启动 Visual FoxPro 时, 系统都自动按照注册表中保存的参数进行系统运行环境的设置。 将修改保存为永久性设置的操作是:首先单击“设置为默认值”按钮,再单击“确定”按 钮退出“选项”对话框。

1.4.3

Visual FoxPro 命令简介

Visual FoxPro 8.0 系统提供了丰富的功能强大的命令供用户使用。除了少量专用于程序设 计的命令外,其中的大部分命令既可以在主窗口界面的命令窗口中用键盘直接输入并执行,也 可以用于编写程序文件。因为 Visual FoxPro 的命令数量众多,且功能各异,只有确切地了解 了命令的结构组成,正确理解了命令的功能,才能准确无误的使用。 一、Visual FoxPro 的命令格式 Visual FoxPro 命令通常由命令动词和限定该命令动词的若干个子句组成。一般的标准命令 格式如下: 命令动词

[<范围>] [[Fields] <表达式表>]

[For|While <条件>]

[To <目标 1>|<目标 2>]

1.说明 ⑴ 命令动词使用英文单词, 是命令的主体, 不可缺少。它规定了该命令要完成的“动作”, 实现的功能或者操作。 ⑵ 除命令动词外的其它组成部分称为子句。子句一般由功能短语和表达式等组成, 用于 说明或限定命令动词操作的对象、范围、条件等。 ⑶ 除了字符串外, 命令中的字母、数字、标点等均为 ASCII 码字符, 并且不区分英文字 母的大小写。 ⑷ 除了极个别的命令动词, 例如, Locate 和 Local 因前四个字母完全一样不能短写外, 其 它大多数的命令动词和子句中的功能短语只需输入前四个字母就可以被系统识别、执行。 ⑸ 各子句的先后顺序可以任意排列。命令动词与子句, 以及各子句之间应至少用一个空 格隔开。表达式表中的各项之间使用逗号“,”分隔。 ⑹ 尖括号< >表示其中的内容是必选项,即用户必须提供的内容;方括号[]表示其中的 内容为可选项, 可以根据命令和用户的具体要求决定是否需要;使用竖线“|”分隔的子句之间 为或的关系, 表示用户可以选用其中之一。 注意:命令格式中的符号“< >”、“[ ]”、“|”在实际操作中不能在命令中输入。 ⑺ 常用的子句主要有:范围、表达式表、条件、输出目标等。 ① [<范围>] 可选项, 限定命令动词对数据表中记录(行)的操作范围, 为下列四种格式之一: 42


z All:对数据表中的所有记录进行操作。有些命令默认操作范围为全部记录, 则可省略。 z Next <n>:从当前记录起向后, 对 n 个记录进行操作。 z Record <n>:对第 n 个记录进行操作 z Rest:对从当前记录起直到最后一条记录的若干条记录进行操作。 ② [Fields] <表达式表> 可选项, 限定命令操作的内容或公式, 可包含多项, 各项之间用逗号“, ”分隔, 最后一项 的后面无逗号。若有 [Fields] 项, 则为字段名表, 指定数据表中要操作的字段(列)。个别命 令例如 List, 可以省略 [Fields] 项而仅有字段名表。 ③ [For | While <条件>] 可选项, 根据<条件>检查记录是否符合要求, 以确定怎样操作。 z For <条件>:对指定范围内所有符合<条件>的记录进行查找、操作。当遇到不符合条 件的记录时,不进行操作,越过它继续查找符合条件的下一个记录,直到指定范围查 找完为止。默认范围为 All。 z While <条件>:从当前记录起, 对符合条件的记录进行查找、操作, 一旦遇到不符合 条件的记录, 即停止查找和操作。通常用于查找、操作已索引或已排序的表中记录。 ④ [To <目标 1>|<目标 2>] 可选项, 用于指定命令操作的内容输送到的位置。例如, 打印机或文件等。默认为输出到 屏幕。 2.命令举例 【例 1.1】 分页显示数据表中性别为“男”的所有记录中的教师编号、姓名、性别、学 历和职称字段的内容并从打印机输出。 Display

All

命令动词

范围

Fields jsbh, xm, xb, xl, zc 表达式表

For xb="男" 条件

To

Print

目标

二、命令窗口操作 命令窗口操作与菜单操作相似,属于交互式工作方式,用于输入单条命令并立即执行,可 即时观察命令执行的结果。 1.命令窗口的隐藏、显示和游离 ⑴ 隐藏:单击命令窗口右上角的“×”按钮,或者单击“窗口”下拉菜单中的“隐藏” 命令项,或者按快捷组合键 Ctrl+F4 均可隐藏命令窗口。 ⑵ 显示:单击“窗口”下拉菜单中的“命令窗口”命令项,或者按快捷组合键 Ctrl+F2 均可显示命令窗口。 单击常用工具栏上的“命令窗口”按钮也可隐藏或者显示命令窗口。 ⑶ 游离:处于游离状态时,命令窗口的标题栏上只有“×”按钮。此时可以将命令窗口

43


拖离到 Visual FoxPro 主窗口工作区以外的位置。 命令窗口是否处于游离状态取决于在“窗口”下拉菜单中是否选择了“游离”命令项 2.命令的输入、编辑执行 命令窗口是一个 Visual FoxPro 系统窗口。Visual FoxPro 的大多数命令都可以在命令窗口 中输入并执行。采用菜单操作时,相对应的命令也会自动显示在命令窗口中。 ⑴ 命令的输入执行 执行新命令:激活命令窗口,在插入光标处输入命令后按回车键执行该命令,插入光标自 动换行等待输入下一条命令。 重复执行命令:已执行过的命令仍然存在于命令窗口中,可用光标键或者鼠标将插入光标 定位到已执行过的命令行中,按回车键即可重复执行该命令。 插入光标不论处于命令行的什么位置,都可以按回车键执行该条命令。 ⑵ 命令的编辑 与其他文本编辑窗口一样,在命令窗口中可用光标键上下左右地移动插入光标,或者用鼠 标定位插入光标,进行文本的插入、删除、修改、复制、移动等各种编辑操作。 使用“格式”菜单中的命令项可以改变命令窗口中的字体、字号、行间距、缩进等。 注意:一条命令通常在一行中输入执行。若命令过长也可以分行输入,但前面行必须 用分号“;”结尾,并用光标键或者鼠标将插入光标移到下一行,而不能按回车键 换行。命令的最后一行不能用分号结尾,必须按回车键作为整条命令的输入结束 并执行。

1.4.4

Visual FoxPro 项目管理器

项目指的是用户利用 Visual FoxPro 系统创建的一个应用系统文件。它集合了应用系统中 的数据库、表、表单、报表、标签、查询、类、程序、菜单和一些其它类型的文件,并通过“项 目管理器”对这些文件进行统一地组织管理。用可视化的方法可以很方便地实现这些文件的创 建、修改、删除等编辑操作。利用“项目管理器”还可以将一个应用系统编译成一个扩展名为.app 的应用程序文件,或扩展名为.exe 的一个可执行程序文件。 一、项目的创建、打开和关闭 1.创建项目

44


创建一个新项目有两个方法:一是使用“新建”命令仅创建一个项目文件,用于分类管理 各种文件;二是使用新建向导,创建一个项目文件和一个 Visual FoxPro 应用程序框架。此处

(a)

图 1.22

新建项目

(b)

只介绍第一种方法,具体操作如下。 ⑴ 单击“文件”下拉菜单中的“新建”命令项,或者单击“常用”工具栏上的“新建” 按钮,打开“新建”对话框如图 1.22(a)所示。 ⑵ 选择“项目”单选钮,单击“新建”按钮,打开“创建”对话框如图 1.22(b)所示。 ⑶ 在“保存在”下拉列表框中选择设置保存项目文件的文件夹,在“项目文件”文本框 中输入项目名称,单击“保存”按钮,即可在指定位置建立一个新的项目文件。项目文件的扩 展名系统默认为 .pjx。 2.打开/关闭项目 在 Visual FoxPro 中可以随时打开一个已建立的项目。也可以随时关闭一个已打开的项目。 ⑴ 打开项目 单击“文件”下拉菜单中的“打开”命令项,或者单击“常用”工具栏上的“打开”按钮, 显示“打开”对话框如图 1.23 所示。

45

图 1.23“打开”对话框

图 1.24 关闭空项目的提示信息


在“文件类型”下拉列表框中选择“项目”,在“查找范围”下拉列表框中选择文件夹, 在列表框中单击要打开的项目文件,再单击“确定”按钮,或者直接双击项目文件,即可打开 该项目。 ⑵ 关闭项目 单击“项目管理器”标题栏上的“×”按钮即可关闭当前项目。 未包含任何文件的项目称为空项目。当关闭一个空项目文件时,系统会显示一个提示信息 框,如图 1.24 所示。单击提示框中的删除按钮,系统将从磁盘上删除此空项目文件;若单击 “保持”按钮,系统则不删除而保存此空项目文件。 二、项目管理器的使用 1.项目管理器的组成 项目管理器由 6 个选项卡和 6 个 命令按钮组成,如图 1.25 所示。 选项卡为各类文件的管理提供 了一个组织良好、关系明确的层次结 构。与 Windows 操作系统中的资源 管理器类似,若选项卡中的某个数据 项中包含了一个或多个数据项,则该 数据项前有一个加号标志。单击加号 展开该数据项所包含项目的列表,标 志变为减号。单击减号则折叠列表。 如此即可方便地查看各类文件中不 同层次的细节。 各选项卡的功能简介如下。 ⑴ “数据”选项卡

图 1.25 “项目管理器”数据选项卡

数据选项卡中包含一个项目中的所有数据文件:数据库、表、自由表、查询和视图等。并 且可以从数据库一直展开到表中的字段,显示出它们之间的关系。 ⑵ “文档”选项卡 文档选项卡中包含了处理数据时用到的三类文件:表单、报表和标签。 ⑶ “类”选项卡 类选项卡中包含用户自己创建的类文件。 ⑷ “代码”选项卡 代码选项卡中包含了三大类程序:扩展名为 .prg 的程序文件、函数库 API Libraries 和应 用程序 .app 文件。 ⑸ “其他”选项卡

46


其他选项卡包含了菜单文件、文本文件和其他文件,如位图文件 .bmp、图标文件 .ico 等。 ⑹ “全部”选项卡 全部选项卡中可以显示以上选项卡中的所有文件。 2.项目管理器的使用 在项目管理器中,用户可以通过可视化的直观操作在项目中创建、添加、修改、移去和运 行指定的文件。进行这些操作最方便的方法便是使用项目管理器中的命令按钮。项目管理器的 右侧同时显示 6 个按钮,它们随着用户选择选项卡和数据项的不同而被激活或者屏蔽,提供不 同的文件操作功能。 ⑴ 创建文件 使用“新建”按钮可以在当前项目中建立新文件。所建文件的类型取决于当前选定的数据 项。只有选择了一个具体的文件数据项,“新建”按钮才能激活。例如,在“全部”选项卡中 选择了“数据”项时“新建”按钮并未激活,必须选择了“数据”下的数据库或数据表项, “新 建”按钮才激活可用。其他按钮也有类似的特性。 单击“新建”按钮,或者单击“项目”下拉菜单中的“新建文件”命令,即可打开相应的 设计器创建一个新文件。在项目管理器中建立的文件自动包含在该项目文件中,这与利用主窗 口“文件”下拉菜单中的“新建”命令建立的文件不属于任何项目文件是不同的。 ⑵ 添加文件 项目管理器可以将已经建立,但不属于当前项目的其他文件添加到项目文件中,具体操作 步骤如下: ① 选择要添加的文件类型。例如要添加一个数据库文件,应在“数据”选项卡中选择“数 据库”选项。 ② 单击“添加”按钮,或者单击“项目”下拉菜单中的“添加文件”命令,系统显示“打 开”对话框,选择要添加的数据库文件。 ③ 单击“确定”按钮,选择的数据库文件即添加到当前项目文件中。 注意:在项目管理器中新建或添加的文件并不意味着该文件已成为该项目文件的一部 分。实际上,每一个文件都以独立的文件形式存在。在某个项目文件中建立或添 加的文件只表明该文件和该项目文件之间建立了一种关联。这样做有两个好处: 一是项目文件仅仅需要知道它所包含的文件在什么位置就可以了,而不必关心它 所包含文件的其他详细信息。 二是一个文件可以同时被多个项目文件所包含。则在修改该文件时,修改的结果 将同时体现在包含该文件的各项目文件中,从而避免了在多个项目中对文件分别进 行修改时可能造成的数据不一致的后果。 ⑶ 修改文件 利用项目管理器可以随时修改项目文件中的指定文件,具体操作步骤如下:。

47


① 选择要修改的文件,例如,数据库中的一个表文件。 ② 单击“修改”按钮,或者单击“项目”下拉菜单中的“修改文件”命令,系统将根据 要修改文件的类型打开相应的设计器。例如表设计器。 ③ 在设计器中对选定的文件进行修改后,单击“确定”完成。 ⑷ 浏览文件 对于数据表文件,可以在项目管理器中进行浏览操作,具体操作步骤如下: ① 选择一个表文件。 ② 单击“浏览”按钮,或者单击“项目”下拉菜单中的“浏览文件”命令,打开 Browse 窗口,显示当前选择的表中数据。 ⑸ 移去文件 若项目中的某个文件不需要了,可以从项 目文件中移去。具体操作步骤如下: ① 选择要移去的文件。 ② 单击“移去”按钮,或者单击“项目” 下拉菜单中的“移去文件”命令,系统显示如

图 1.26

移去文件提示信息框

图 1.26 所示的提示信息对话框。 ③ 单击“移去”按钮,系统仅从项目文件中移去该文件;若单击“删除”按钮,则系统 不仅从项目文件中移去而且从磁盘上删除该文件。 ⑹ 连编文件 单击“连编”按钮,或者单击“项目”下拉菜单中的“连编”命令,将编译一个项目或者 应用程序。 ⑺ 其他功能 除了上面介绍的文件操作功能和相应的命令按钮外,根据所选择文件类型的不同,某些命 令按钮的名称会随之而改变。其它命令按钮的名称与功能简介如下: ① 打开/关闭按钮 用于打开/关闭一个数据库文件。 ② 预览按钮 用于以打印预览的方式显示选定的报表或者标签文件。 ③ 运行按钮 用于执行选定的查询、表单、类、程序、菜单文件等。 3.调整项目管理器 用户可以根据需要改变项目管理器的外观形态,如改变窗口大小、位置,折叠或拆分窗口, 将选项卡变为工具栏按钮等。 ⑴ 移动与缩放 48


拖动标题栏可以移动项目管理器窗口位置。拖动边框或边角可以改变项目管理器大小。 ⑵ 折叠与展开 单击项目管理器选项卡右边的“u”按钮,可以将项目管理器的工作区折叠隐藏,而只显 示选项卡标签。在折叠状态下,单击某选项标签可打开相应的选项卡,如图 1.27 (a) 所示,打

(a)

图 1.27

项目管理器的折叠与拆分

(b)

开了“数据”选项卡。单击“v”按钮即可展开还原成正常状态。 ⑶ 拆分与固定 项目管理器在折叠状态下,还可以进一步拆分,使各选项卡成为独立、浮动的窗口,以方 便调整其位置。拆分的方法是将选项卡拖离项目管理器,如图 1.27 (b) 所示。 单击浮动选项卡上的图钉图标,可以将选项卡固定为“顶层显示”,如(b)图左边的“数 据”选项卡;或者取消“顶层显示” ,如(b)图右边的“文档”选项卡。 要还原已拆分的选项卡,可以单击浮动选项卡上的“×”按钮,也可将其拖回到项目管理 器中。 ⑷ 转换为工具栏 拖动项目管理器窗口到工作区顶部的工具栏上,即可将项目管理器转变成工具栏,各选项 卡标签则转换成工具栏按钮。 转换为工具栏后,单击各选项按钮可以打开选项卡。各选项卡与折叠时一样,也可以拖离 工具栏而变成浮动的,如图 1.28 所示。

49


图 1.28

项目管理器的工具栏化

将项目管理器拖离工具栏即可还原恢复为窗口。

Visual FoxPro 向导、设计器和生成器

1.4.5

Visual FoxPro 8.0 系统提供了面向对象的程序设计工具,包括各种向导(Wizards)、设计 器(Designers)和生成器(Builders)。用户利用这些工具可以简便、快速、灵活地进行应用程 序的开发。本小节简要介绍这些工具的功能和使用方法。 一、Visual FoxPro 向导 向导是一种交互式的程序。系统通过一系列的向导屏幕,提示一些与要实现的任务或要建 立的文件有关的问题,让用户回答或者选择、设置选项。系统则根据用户的回应,帮助用户快 速地完成一般性任务。例如创建数据库、数据表、表单,设置报表格式,建立查询、视图等。 Visual FoxPro 8.0 提供了二十几个向导,常用的向导及其功能如表 1.30 所示。 表 1.30

Visual FoxPro 常用向导及其功能

向导名称

向 导 功 能

表向导

引导用户在 Visual FoxPro 表结构的基础上创建一个新表

查询向导

引导用户创建一个查询

表单向导

引导用户创建一个表单

报表向导

引导用户利用单独的表创建一个报表

标签向导

引导用户创建一个标签

邮件合并向导

引导用户创建一个邮件合并文件

50


数据透视表向导

引导用户创建一个数据透视表

导入向导

引导用户导入或追加数据

文档向导

引导用户从项目文件和程序文件的代码中产生格式化的文本文件

安装向导

引导用户创建一套安装磁盘

SQL Server 升迁向导

引导用户创建一个 SQL Server 数据库

应用程序向导

引导用户创建一个 Visual FoxPro 应用程序

数据库向导

引导用户创建一个数据库

Web 发布向导

引导用户在 HTML 文档中显示表或视图中的数据

本地视图向导

引导用户创建本地视图

远程视图向导

引导用户创建远程视图

交叉表向导

引导用户创建一个交叉表查询

图形向导

引导用户创建一个图形

一对多报表向导

引导用户创建一个一对多的报表

一对多表单向导

引导用户创建一个一对多的表单

各种向导的使用详见后续章节的介绍 二、Visual FoxPro 设计器 Visual FoxPro 的设计器是创建和修改应用系统各个组件的可视化工具。利用各种设计器使 得象创建数据库、表、表单、查询、视图和报表等工作变得轻而易举。 Visual FoxPro 8.0 系统提供的主要设计器及其功能如表 1.31 所示。 表 1.31

Visual FoxPro 设计器及其功能

设计器名称

设 计 器 功 能

数据库设计器

创建、管理数据库中包含的全部表、视图和关系。

表设计器

创建、修改数据库表、自由表的结构,设置索引

表单设计器

创建、修改表单和表单集

查询设计器

创建、修改在本地表中运行的查询

报表设计器

创建、修改报表以便显示、打印数据

标签设计器

创建、修改标签布局以便显示、打印标签

视图设计器

创建、修改本地视图和远程视图

菜单设计器

创建、修改菜单栏、下拉菜单或弹出菜单

连接设计器

为远程视图创建连接

数据环境设计器

为用户创建表单、报表定义和修改数据源,包括表、视图、关系

各类设计器的使用详见后续章节的介绍。

51


三、Visual FoxPro 生成器 Visual FoxPro 系统提供的生成器可以简化创建、修改用户界面应用程序的设计过程,提高 软件开发的质量和效率。每个生成器都由若干个选项卡组成。表 1.32 列出了 Visual FoxPro 8.0 提供的主要生成器的名称和功能。 表 1.32 生成器名称

Visual FoxPro 生成器及其功能 生成器功能

生成器名称

生成器功能

表单生成器

建立表单

表格生成器

建立表格

编辑框生成器

建立编辑框

列表框生成器

建立列表框

文本框生成器

建立文本框

组合框生成器

建立组合框

命令按钮组生成器

建立命令按钮组

选项按钮生成器

建立选项按钮组

自动格式生成器

用于格式化一组控件

参照完整性生成器

建立参照完整性规则

应用程序生成器

建立应用程序

通常情况下,在创建或者修改文件及其中的组成部分,如某个组件、控件时,系统根据需 要启动相应的生成器。各类生成器的使用详见后续章节的介绍。

52


第二章 Visual FoxPro 语言基础 除了菜单方式,Visual FoxPro 还提供了另外一种交互式的操作方法:命令方式。本章将介 绍 Visual FoxPro 数据库管理系统所提供的程序设计语言的基础知识,包括其所支持的数据类 型,以及常量、变量、表达式和系统提供的常用函数等。为后续章节学习 Visual FoxPro 系统 的各种操作命令,更进一步地学习编程打下一个良好的基础。

2.1 数据类型 数据是数据库管理系统进行各种管理的主要对象。一个数据库管理系统的性能怎样,在很 大程度上取决于其支持的数据类型是否丰富,对数据的处理能力是否强大。 数据有型和值之分,型是数据的分类,值则是数据的具体表示。Visual FoxPro 8.0 支持的 数据类型如下: 1.字符型数据 字符型(Character)数据用 C 表示。可以由英文字母、数字、标点符号、空格、其他 ASCII 码字符集中的可打印符号和中文字符组成。 字符型数据的最大长度为 254 个字节,其中每个 ASCII 码字符占用一个字节,每个中文 字符占用两个字节。 2.数值型数据 数值型(Numeric)数据用 N 表示。是由数字(0~9)、正负(+、-)号、小数点(.) 组成,用于表示数值大小的数据。可以使用科学计数法。 数值型数据在内存中的长度为 8 个字节,在字段中的最大长度为 20 个字节。其取值范围 是:-0.9999999999E+19 ~ 0.9999999999E+20。 3.货币型数据 货币型(Currency)数据用 Y 表示,是用于表示货币的一种数值型数据。货币型数据的前 面要加一个前缀货币符号($)。 货 币 型 数 据 的 长 度 固 定 为 8 个 字 节 , 其 取 值 范 围 是 : -922337203685477.5808 ~ 922337203685477.5807。货币型数据的小数位固定为 4 位,并且不能使用科学计数法。 4.日期型数据 日期型(Date)数据用 D 表示。它是由年、月、日组成的表示日期的一种特殊数据。 日期型数据的长度固定为 8 个字节,取值范围是:{^0001-01-01}~{^9999-12-31}。

53


5.日期时间型 日期时间型(DateTime)数据用 T 表示。它是在日期型数据的基础上增加了时间组成的 一种数据。 日期时间型数据长度也固定为 8 个字节。日期部分的取值范围与日期型数据相同,时间部 分的取值范围是:00:00:00 am ~11:59:59 pm。 6.逻辑型数据 逻辑型(Logical)数据用 L 表示。它只有逻辑真(.T.或.t.)和逻辑假(.F.或.f.)两个值。 逻辑型数据长度只占一个字节。 7.备注型数据 备注型(Memo)数据用 M 表示。备注型数据是一种特殊的、仅能用于数据表文件中的字 符型数据。 在数据表文件中定义的备注型字段的长度固定为 4 个字节, 但对它所保存的字符型数据本 身没有长度的限制,仅受计算机系统可用存储空间的限制。因为数据表文件中的备注型字段数 据实际上是保存在一个与数据表文件同名,但扩展名为 .fpt 的备注文件中。 8.通用型数据 通用型(General)数据用 G 表示。通用型数据也仅能用于数据表文件。它可以存储诸如 图片、图像、声音、电子表格等 OLE 对象和多媒体数据。 与备注型字段相同,在数据表文件中定义的通用型字段的长度也固定为 4 个字节,其数据 实际存储在备注文件中,可存储的数据长度同样取决于系统可用存储空间的限制。 9.整型数据 整型(Integer)数据用 I 表示。整型数据仅能用于数据表中存储无小数的整数值,其长度 为 4 个字节,取值范围是:-2147483647 ~ 2147483647。 10.整数型数据 整数型(AutoInc)数据用 A 表示。整数型数据也是一种仅能用于数据表中存储无小数的 整数值,其长度为 4 个字节。整数型数据与整型数据的差别是:整数型数据是一种只读的可自 动增量的数据,其值的变化由设定的下一个值(Next)和步长值(Step)控制。 11.浮点型数据 浮点型(Float)数据用 F 表示。浮点型数据的数据长度和取值范围与数值型数据完全相 同,不同处是以浮点数的格式存储。它也仅能使用于数据表字段中。 12.双精度型数据 双精度型(Double)数据用 B 表示。双精度型数据是一种高精度的、采用固定长度浮点 数格式存储的数值数据。也仅能使用于数据表字段中。其固定长度为 8 个字节,取值范围是: +/- 4.94065645841247E-324 ~ +/- 8.9884656743115E307。 13.二进制字符型数据 二进制字符型(Character Binary)数据也用 C 表示。它与字符型数据相似,但一般用来 54


存储不需要系统代码页维护的字符数据。只能用于数据表字段中。最大长度 254 个字节。 代码页是一个供系统使用,以正确显示数据字符的编码表。如代码页更改,字符型数据会 随之而变,而二进制字符型数据则不会随着变动。 14.二进制备注型数据 二进制备注型(Memo Binary)数据用 M 表示。与二进制字符型数据相似,是用于存储不 需要系统代码页维护的备注型数据。只能用于数据表字段中。表中长度固定为 4 个字节,实际 长度仅受计算机系统存储空间的限制。

2.2 常量、变量与函数 数据根据其表现形式、处理方式的不同,分为常量、变量、函数和表达式等几种。

2.2.1 常量 所谓常量,指的是在程序运行或操作过程中其值始终保持不变的数据。 在 Visual FoxPro 中,常量的数据类型有字符型(C)、数值型(N)、货币型(Y)、日期 型(D)、日期时间型(T)和逻辑型(L)6 种。 1.字符型常量 字符型常量又称字符串,是由英文字母、数字、标点符号、空格、其他 ASCII 码字符集 中的可打印符号和中文字符组成,用定界符界定的字符串。字符串定界符有单引号‘’,双引 号“”和方括号[]三种。定界符必须用 ASCII 码字符,且必须成对匹配。若某种定界符已 作为字符串的内容使用,则必须使用另外的定界符。 例如,“数据库”,‘DBMS’,[“山东财院 计算机系”+‘sdfi’]都是字符型常量。在第 三个字符常量中,双引号“”和单引号‘’均属于字符串的内容,其定界符是方括号[]。 字符型常量的长度最大为 254 个 ASCII 码字符,其中每个 ASCII 码字符占用一个字节, 每个中文字符占用两个字节。 注意:不包含任何字符的字符串“”称为空串,与仅包含空格的字符串“ ”是不同的。 2.数值型常量 数据型常量通常由正负号、小数点和数字组成。既可以使用日常记数法表示,如 1234.56, -0.2345,8957,-4253 等;也可以使用科学记数法表示,如 1.23E-5(表示 1.23×10-5),-2.34E12 (表示-2.34×1012)。 3.货币型常量 货币型常量是专用于表示货币的一种数值型数据。其数据前面要加一个前缀货币符号($), 小数位不允许超过 4 位。若输入或计算得到的货币型常量的小数多于 4 位时,系统会自动将多 55


余的小数位四舍五入。例如,$432.2345498 自动转换为$432.2345,而$432.2345598 则自动转 换为$432.2346。 4.日期型常量 日期型常量通常由年、月、日组成,并用定界符花括号{}界定。根据选定国家区域的不 同,日期型常量的显示格式有多种。 例如,传统的美国格式为: {mm/dd/yy}表示月/日/年;英国格式为: {dd/mm/yy}表示日 /月/年;中国格式为:{yy/mm/dd}表示年/月/日。系统默认显示为传统的美国日期格式,年、 月、日均使用两位数字表示,用“/”做分隔符。 “-”和“.”号也可做分隔符。 传统的日期格式受到相关的日期、国家等系统环境参数设置的影响可能产生不确切的结 果。例如:对于{10/08/07}这一日期在不同的设置状态下,计算机可能会给出:2007 年 10 月 8 日、2007 年 8 月 10 日、2010 年 8 月 7 日等多种结果。 为避免上述情况的出现,Visual FoxPro 提供了一种严格的日期格式: {^yyyy-mm-dd}。使 用这种日期格式能够表达一个确切的日期。在严格的日期格式中,首字符必须是“^”符号, 年份必须用 4 位,年月日的顺序不能颠倒,不能缺省,分隔符为“-”。严格的日期格式可以在 任何情况下使用。若使用的日期格式与当前设置不同,系统将会显示日期时间格式提示框如图

图 2.1

日期时间格式提示框

2.1 所示。 日期时间格式的设置分为菜单操作和命令设置两种方式。使用菜单操作进行日期格式的设 置方法参见前面 1.4.2 节中的“Visual FoxPro 运行环境设置”。日期格式的命令设置方法将在后 面 2.6 节“常用 Visual FoxPro 系统设置命令”中介绍。 5.日期时间型常量 日期时间型常量由日期和时间两部分组成,一般格式为: {<日期>,<时间>}。<日期>部分 与日期型常量相似,同样有传统和严格两种格式。 时间部分的格式为:[hh [:mm [:ss]] [am|pm]]。其中的 hh、mm、ss 分别表示时、分、秒, 分隔符是“: ”。此处的方括号表示其中的内容为可有可无的可选项,它们的默认值分别为 12 时 0 分 0 秒;am 和 pm 分别表示上午和下午,默认值为 am。如果指定的时间大于等于 12,则 系统自动认定为下午时间。 56


例如,在命令窗口键入下列命令后按回车键: ? {^2007/05/15,}, {^2007-06-16, 8}, {^2007/10/20, 8 p}, {^2007-12-30, 15:45} 则在主窗口的工作区中显示: 05/15/07 12:00:00 AM

06/16/07 08:00:00 AM

10/20/07 08:00:00 PM

12/30/07 03:45:00 PM

时间的表示存在着一些等价的方法, 例如:00:00:00 am 等价于 12:00:00 am (午夜); 00:00:00 pm 等价于 12:00:00 pm(中午);00:00:00~11:59:59 等价于 12:00:00 am~11:59:59 am;而 12:00:00~23:59:59 等价于 12:00:00 pm~11:59:59 pm。 6.逻辑型常量 逻辑型常量只有逻辑真值和逻辑假值两个。逻辑真值的表示形式有:.t.、.T.、.y.、.Y.; 逻辑假值的表示形式有:.n.、.N.、.f.、.F.。逻辑值两边的点号“.”是逻辑型常量的定界符, 不可缺少。

2.2.2 变量 变量是数据库系统和程序设计中的一个重要概念,它是存储数据的基本单位。变量中存储 的数据(称为变量值)在程序运行或操作过程中可以改变。 在 Visual FoxPro 中,变量分为两大类:字段变量和内存变量。 1.字段变量 字段变量依赖于数据表文件而存在。当定义了一个数据表文件的结构后,该数据表的每一 个字段名就代表着一个字段变量。字段变量是一种永久性的多值变量。其永久性指的是它依附 于数据表而存在,不能随意地删除和改变其数据类型。退出 Visual FoxPro 系统或关闭计算机 也不会被破坏。其多值性指的是在一个字段变量中取值的个数取决于数据表中的记录个数,有 多少个记录,就有多少个字段变量值。 字段变量支持的数据类型有 14 种,详见 2.1 节。字段变量的命名规则将在第三章(3.2 节 和 3.5 节)中详细介绍。 2.内存变量 内存变量是由 Visual FoxPro 系统管理的计算机内存储器中的一部分存储区域。内存变量 值就是保存在这个存储区域里的具体数据。每个内存变量每次只能存储一个数据。内存变量的 数据类型取决于其保存的具体数据的类型,它支持的数据类型与常量相同,有字符型(C)、 数值型(N)、货币型(Y)、日期型(D)、日期时间型(T)和逻辑型(L)6 种。 每一个内存变量都必须有一个固定且唯一的名称,以标识该内存变量所对应的存储单元。 在 Visual FoxPro 中,内存变量名可以使用字母、数字、下划线等 ASCII 码字符和汉字符,但 首字符不能是数字,长度≤128 个 ASCII 码字符。要注意避免使用 Visual FoxPro 系统的保留 字、表达式等做变量名。

57


例如:abc10,姓名,XY_1,_mon 为合法的变量名,而 b-10,2ab,if 是非法的变量名。 若当前打开的数据表中有与内存变量同名的字段变量,则在使用内存变量时,必须在内存 变量名的前面加上前缀符号“M.”或“M->”,否则系统将优先使用同名的字段变量。 除非已经保存到内存变量文件中,内存变量及其中保存的数据会因为退出 Visual FoxPro 系统或关闭计算机而全部丢失。因此,内存变量是一种临时性的单值变量。 内存变量根据其命名格式,存储单元分配方式的不同又分为三种。 ⑴ 简单变量 简单变量每个名字对应一个存储单元。简单变量在使用之前不需要声明或定义。当使用赋 值命令给某个变量赋值时,若该变量不存在,系统将自动建立并赋值于它。若该变量已存在, 则用新值代替原值,且数据类型也取决于新值。 变量的赋值命令有两种格式: 格式 1:Store

<表达式>

To <内存变量名表>

格式 2:<内存变量名>=<表达式> 功能:将表达式的值赋予指定名字的变量。 说明: ① 格式 1 可以将一个值同时赋予由变量名表指定的多个简单变量,表中各变量名之间必 须用逗号“, ”分隔。 ② 格式 2 只能给一个简单变量赋值。 【例 2.1】简单变量的赋值与输出显示。 注意:在命令窗口输入下列命令,并在每条命令输入后按回车键执行。各个命令中&& 符号后面的内容是命令注释,说明该条命令的功能,不用输入。后续例题的命令操 作均同此,不再赘述。 Store

"张玉萍"

To

姓名,xm

&& 字符串常量同时赋予变量:姓名和 xm

rq={^2007/05/23}

&& 日期常量赋予变量:rq

bh="201192"

&& 字符串常量赋予变量:bh

gz=1234.56+123.12

&& 表达式运算结果值赋予变量:gz

y=.t.

&& 逻辑常量赋予变量:y

? 姓名, rq, xm, bh, gz, y

&& 显示变量中的值

屏幕显示结果为: 张玉萍

05/23/07

张玉萍 201192

1357.68 .T.

⑵ 数组变量 数组变量是内存储器中由若干个存储单元构成的一片连续的存储区域。 这片存储区域共用 一个变量名。每个存储单元相当于一个简单变量, 称为数组元素, 用数组名加下标表示。各数 据元素既可以统一赋予相同的值,也可以分别赋予不同的值,并且数据类型也可以各不相同。

58


数组变量在使用之前必须先通过声明进行创建, 以定义数组名称, 数组大小和维数。声明 数组的命令格式有两个: 格式 1:Dimension 格式 2:Declare

<数组名>(<下标上限 1> [,<下标上限 2>] ) [, <数组名 2>( … ) … ]

<数组名>(<下标上限 1> [,<下标上限 2>] ) [, <数组名 2>( … ) … ]

功能:两种格式的功能完全一样, 创建指定了名称、大小和维数(一维或二维)的一个或若 干个数组变量。 说明: ① 数组的大小取决于设定的下标上限值, 下限值系统默认为 1。 ② 下标的个数决定了数组是一维数组还是二维数组。 ③ 数组创建后, 系统自动给每个数组元素赋以逻辑假值 .F.。 ④ 数组变量的赋值操作与简单变量一样,可以使用 Store 命令或者赋值号“=”。要注意 的是赋值操作的数组变量范围。详见例题。 【例 2.2】数组的创建与赋值使用。 Dimension x(2), y(2,3)

&&定义一维数组 x 有 2 个元素 x(1), x(2);二维数组 y 有 6 个元素 y(1,1), y(1,2), y(1,3), y(2,1), y(2,2), y(2,3)

Store

"数组"

To x, y(1,2)

&&字符串常量赋予数组 x 和数组元素 y(1,2)

y(1, 1)="元素"

&&字符串常量赋予数组元素 y(1,1)

y(1, 3)={^2007/05/23}

&&日期常量赋予数组元素 y(1,3)

y(2, 1)=1234.56+123.12

&&表达式运算结果值赋予数组元素 y(2,1)

y(2, 2)=.t.

&&逻辑常量赋予数组元素 y(2,2)

? x, y

&&显示数组变量中的值

? x(1), x(2), y(1,1), y(1,2), y(1,3), y(2,1), y(2,2), y(2,3) xy=x+y

&&显示数组变量中的值

&&表达式运算结果值赋予简单变量 xy

? xy, y, x, y(1), y(3), y(4), y(5) &&显示变量中的值 屏幕显示结果为: 数组

元素

数组

数组 元素

数组元素

元素

数组 05/23/07 1357.68 .T. 数组 元素

05/23/07

1357.68

.F. .T.

从上面的介绍和例题可以看出, 数组变量与简单变量有相同之处, 也有不同之处, 因此在 使用中应注意以下几点: ① 因为每个数组元素相当于一个简单变量, 所以在一切能使用简单变量的地方, 均可以 使用数组元素。如上例中给各数组元素单独赋值并显示它们。 ② 在赋值语句中仅使用数组名时, 表示将同一个值同时赋予该数组的所有数组元素。 ③ 在屏幕显示命令或表达式中, 仅使用数组名时所操作的是第一个数组元素的值。如上

59


例中的 ? x, y 和 xy=x+y 两条命令。 ④ 可以用一维数组的形式访问二维数组。例如, 二维数组 y 中的各元素可以用一维数组 的形式表示为:y(1)、y(2)、y(3)、y(4)、y(5)、y(6)。如上例中的最后一条显示命令。 ⑤ 在同一个运行环境中, 数组与简单变量不能重名。 ⑶ 系统变量 系统变量是由 Visual FoxPro 系统在启动时自己定义的一些内存变量。系统变量名均以下 划线“_”为首字符,其中保存着与系统运行环境有关的一些参数。对这些参数应通过系统环 境设置操作或命令进行修改,而不要随意地直接改变它们,以免影响系统的正常运行。 3.常用内存变量操作 ⑴ 显示内存变量 格式 1:List Memory

[Like <通配符>] [To Print | To

格式 2:Display Memory

[Like

File <文件名>]

<通配符>] [To Print | To

File

<文件名>]

功能:显示当前内存变量的信息, 包括变量名、作用域、类型、值等。 说明: ① 若有可选子句 Like,则只显示与通配符相匹配的内存变量信息。通配符包括 * 和 ? , * 表示多个任意字符,? 表示一个任意字符。 ② 可选子句 To … 用于在屏幕显示的同时还将信息送到打印机输出, 或者保存到指定文 件名的文本文件中, 文本文件的扩展名为 .txt 。 ③ List 命令的特点是不间断地连续显示所有匹配的内存信息。若内存变量多, 一屏不能 显示出全部, 则会自动向上滚动直到全部显示出来为止。而 Display 则可以分屏显示所有匹配 的内存信息。当显示的内存信息满一屏后, 自动暂停, 等按任意键时再继续显示下一屏, 依次 直到显示出全部。 ⑵ 清除内存变量 格式 1:Clear

Memory

格式 2:Release

<内存变量名表>

格式 3:Release

All [Extended]

格式 4:Release

All [Like

<通配符> | Except

<通配符>]

功能:清除内存变量,释放它们占用的内存空间。各格式的使用环境和对内存变量的清除 范围略有不同。 说明: ① 格式 1 清除所有内存变量;格式 2 清除指定的内存变量。 ② 格式 3 在命令窗口中使用与格式 1 的功能完全相同,若在程序中使用,则应有可选项 Extended,否则不能清除公共内存变量。 ③ 格式 4 中若选用 Like 子句,清除与通配符匹配的内存变量;若选用 Except 子句,则 清除与通配符不匹配的内存变量。 60


④ 数组变量的清除以数组为单位。命令中不允许出现数组元素,只能是数组名。 ⑶ 保存内存变量 格式:Save

To <文件名>

[All Like <通配符> | All

Except

<通配符>]

功能:将当前内存中的全部或部分变量保存到指定文件名的内存变量文件中。系统默认内 存变量文件的扩展名为 .mem。 说明: ① 无可选项, 将当前的全部内存变量保存到指定的内存变量文件中。 ② 若有可选项, 则将符合子句要求的内存变量保存到内存变量文件中。Like 与 Except 的 作用见清除命令的说明。 ③ 数组变量的保存以数组为单位, 不允许只保存数组元素。 ④ 除了保存外, 本命令对当前内存变量没有其他影响。 ⑷ 恢复内存变量 格式:Restore

From <文件名>

[Additive]

功能:将指定的内存文件中保存的内存变量恢复到内存中。 说明: ① 无 Additive 可选项时, 执行该命令首先将当前的内存变量全部清除, 然后恢复文件中 保存的内存变量。 ② 若有 Additive 可选项, 当前的内存变量不被清除而仍然保留, 指定文件中保存的内存 变量则追加恢复到内存中。 ③ 若追加恢复的变量与当前的内存变量同名, 则当前内存变量被恢复的内存变量取代。 。 【例 2.3】 显示、保存、清除、恢复内存变量的操作(在【例 2.2】操作的基础上) List

Memo

Like x*

&&显示首字符为 x 的内存变量信息

屏幕显示结果为: X

Pub

A

(1)

C

“数组”

(2)

C

“数组”

C

“数组元素”

XY

Pub

yx=$1234.56

&&货币型常量赋予简单变量 yx

yt={^2007/05/23,16:26}

&&日期时间常量赋予简单变量 yt

Disp

&&显示首字符为 y 的内存变量信息

Memo

Like

y*

屏幕显示结果为: Y

61

Pub

A

(1, 1)

C

“元素”

(1, 2)

C

“数组”


(1, 3)

D

05/23/07

(2, 1)

N

1357.68

(2, 2)

L

.T.

(2, 3)

L

.F.

(

YX

Pub

Y

1234.5600

YT

Pub

T

05/23/07 04:26:00 PM

1357.68000000)

Save To d:\user\y All Like y*

&&将首字符为 y 的内存变量保存到 y.mem 文件中

Save To d:\user\x All Except y*

&&将首字符非 y 的内存变量保存到 x.mem 文件中

Release x, y

&&清除数组变量 x, y

Disp Memo Like x*

&&显示首字符为 x 的内存变量信息

屏幕显示结果为: XY

Pub

C

“数组元素”

yx=$1234.56+4321.32

&&货币型运算值赋予简单变量 yx

yt={^2007/06/12,11:36}

&&新的日期时间常量赋予简单变量 yt

Restore From d:\user\x additive

&&恢复保存在 x.mem 中的内存变量且保留原有 变量

Disp Memo Like x*

&&显示首字符为 x 的内存变量信息

屏幕显示结果为: X

Pub

A

(1)

C

“数组”

(2)

C

“数组”

C

“数组元素”

XY

Pub

Disp Memo Like y*

&&显示首字符为 y 的内存变量信息

屏幕显示结果为: YX

Pub

Y

5555.8800

YT

Pub

T

06/12/07 11:36:00 AM

Restore From d:\user\y

&&恢复保存在 y.mem 中的内存变量且清除原有变量

Disp Memo Like y*

&&显示首字符为 y 的内存变量信息

屏幕显示结果为: Y

Pub

A

(1, 1)

C

“元素”

(1, 2)

C

“数组”

(1, 3)

D

05/23/07

62


(2, 1)

N

1357.68

(2, 2)

L

.T.

(2, 3)

L

.F.

(

YX

Pub

Y

1234.5600

YT

Pub

T

05/23/07 04:26:00 PM

1357.68000000)

注意:上述例题中用于保存内存变量文件的文件夹 d:\user,应在做此例题前先建立。

2.2.3 函数 函数是 Visual FoxPro 系统提供的能够实现某种运算功能, 或者完成某项操作的一小段程 序。函数通过函数名加一对圆括号进行调用。一般的, 函数需要一个至若干个运算或操作的对 象, 称为参数。得到的运算结果则称为函数值或者返回值。函数只能应用于表达式中, 用函数 值参与表达式的运算。 除了系统提供的标准函数, Visual FoxPro 还允许用户自己编写函数, 称为自定义函数。 Visual FoxPro 系统提供的常用函数在 2.5 节中介绍, 自定义函数将在第六章“程序设计基础” 中介绍。

2.3 运算符与表达式 运算符是用于构成表达式, 表征实现某种运算功能的重要符号。运算符不同, 构成的表达 式类型不同, 得到的结果也不同。Visual FoxPro 提供了五类运算符:算术运算符、字符串运算 符、日期时间运算符、关系运算符和逻辑运算符。根据运算对象(又称操作数)的多少, 可以 分为单目运算符(有一个运算对象)和双目运算符(有两个运算对象) 。同类型的运算符之间 有运算优先级的不同。 表达式是用运算符、圆括号将常量、变量、函数等按一定规则连接起来构成的有意义的式 子。在 Visual FoxPro 的命令和程序语句中, 表达式几乎无处不在。表达式中包含了运算对象, 如 各种常量、变量和函数,将运算对象连接在一起的各种运算符, 改变运算优先级的圆括号等。 每个表达式都有一个运算结果值。根据运算符和其所连接的运算对象, 以及运算结果值的数据 类型, 表达式可以分为数值表达式、字符串表达式、日期时间表达式、关系表达式、逻辑表达 式, 以及由这些表达式组成的复杂表达式。 在一个包含多种表达式的复杂表达式中, 不同类型表达式的运算优先级如下: 数值表达式→字符串和日期时间表达式→关系表达式→逻辑表达式。 优先级相同的运算按自左向右的顺序进行。可以使用圆括号改变运算优先级。

63


2.3.1 算术运算符和数值表达式 1.算术运算符 算术运算符用于构建数值表达式, 运算对象为数值型和货币型数据, 其运算结果为数值。 根据算术运算符在运算中的优先级, 由高到低的排列顺序为: 取负 - ;乘方 ^ 或者 ** ;乘 * 、除 / 、取余(模运算) % ;加 + 、减 - 。 取负是单目运算, 其功能是对其右边的运算对象取负值。其它运算都是双目运算。 2.数值表达式 【例 2.4】算术运算符和数值表达式运算结果及显示举例。设已赋值 x=15, y=4, z=-7。 ⑴ 取负、乘方、乘、除、加、减运算;使用括号改变运算优先级。 ? -2^3+5, -2^4+x, (3-1)**-2*6+y, (3-z)**-2*6, 3*y /6**-2, (3*y/6)^-2 -3.00

31.00

5.50

0.06

432.0000

0.2500

⑵ 取余运算是两个整数相除, 得其余数, 再根据被除数和除数的符号确定结果值及其符 号。若被除数与除数符号相同, 结果值等于余数;若被除数与除数符号相异, 则结果值为余数 加上除数的值, 符号与除数相同。 ? x%y, x%-y, -x%y, -x%-y, -17%z, -17%-z, 17%z, 17%-z 3

-1

1

-3

-3

4

-4

3

⑶ 货币型数据的运算。 ? $100.45*x+$2500.82, ($100.45*x+$2500.82)/y, ($100.45*x+$2500.82-$26.78*x)/y 4007.5700

1001.8925

901.4675

2.3.2 字符串运算符及其表达式 1.字符串运算符 字符串运算符用于构建字符串表达式, 其运算对象和运算结果均为字符串。字符串运算符 有两个, 均为双目运算符且优先级相同。它们是: + 将其左右两边的两个字符串顺序连接起来, 形成一个新的字符串。 - 将其左右两边的两个字符串连接起来, 并将左边字符串尾部的空格移动到连接形成的 新字符串的尾部。 2.字符串表达式 【例 2.5】字符串的连接运算。设已赋值 x="财政学院", y="SDFI ", z=" ? "山东 山东

"+x, "山东 财政学院

计算机系"。

"-x+y-z 山东财政学院

SDFI

计算机系

64


2.3.3 日期时间运算符及其表达式 1.日期时间运算符 日期时间运算符用于构建日期时间表达式, 根据运算对象的不同, 其运算结果可能是日期 时间, 也可能是数值。日期时间运算符也有“+”和“-”两个, 均为双目运算符且优先级相同。 2.日期时间表达式 在日期时间表达式中, 运算对象和运算符的使用有严格限制, 不能随意组合。例如, 不能 用运算符“+”将两个日期或者两个日期时间连接起来构成表达式。合法的日期时间表达式的 格式、运算结果及其类型如表 2.1 所示。 表 2.1

日期时间表达式的格式 格

运算结果及类型

<日期> + <天数>

指定日期加上若干天后的日期, 日期型

<天数> + <日期>

指定日期加上若干天后的日期, 日期型

<日期> - <天数>

指定日期减去若干天后的日期, 日期型

<日期> - <日期>

两个指定日期之间间隔的天数, 数值型

<日期时间> + <秒数>

指定日期时间加上若干秒后的日期时间, 日期时间型

<秒数> + <日期时间>

指定日期时间加上若干秒后的日期时间, 日期时间型

<日期时间> - <秒数>

指定日期时间减去若干秒后的日期时间, 日期时间型

<日期时间> - <日期时间>

两个指定日期时间之间间隔的秒数, 数值型

【例 2.6】日期时间表达式举例。设已赋值 x={^2007-5-10}, y={^2007-5-20,10:30:00}。 ? {^2007/05/12}+15, 10+{^2007/05/20}-x, {^2007/06/28}-x, {^2007/06/15}-15 05/27/07

20

49 05/31/07

? 3600*5+y, y-{^2007/05/20,00:30:00}, y-36000, y-36000-{^2007/05/19,23:30} 05/20/07 03:30:00 PM

36000

05/20/07 12:30:00 AM

3600

2.3.4 关系运算符及其表达式 1.关系运算符 关系运算符用于构建关系表达式, 运算对象可以是数值型、货币型、日期/日期时间型、 逻辑型或者字符串型, 其作用是比较左右两个表达式值的大小, 或者是否是包含关系。其运算 结果为逻辑值(.T.或.F.)。所有关系运算符均为双目运算符且优先级相同。它们是: 小于 <;小于等于 <=;大于 >;大于等于 >=;等于 =;不等于 <>、#、!=;

65


字符串精确比较 ==;子字符串包含测试 $。 字符串精确比较符==和子字符串包含测试符$只能用于字符型数据, 而其余关系运算符 可用于各种类型的数据, 但要求进行比较的两个运算对象必须是相同的数据类型。一个例外是 日期型和日期时间型之间可以进行比较。 2.关系表达式 各种数据类型构成的关系表达式进行比较的规则是: ⑴ 数值型和货币型数据按数值的大小进行比较。 ⑵ 日期或日期时间型数据按其早晚顺序进行比较。早的日期时间小, 晚的日期时间大。 ⑶ 逻辑型数据的比较为逻辑真大于逻辑假, 即 .T.>.F. 。 ⑷ 子字符串包含测试运算是检测运算符左边的字符表达式的值是否包含在右边的值中。 若左边字符串是右边字符串中的子字符串, 则结果为逻辑真, 否则为逻辑假。 ⑸ 字符型数据的比较, 是对两个字符串的字符从左至右逐个对应比较, 遇到第一对不同 的字符时, 就根据系统设置的字符排序顺序, 确定这两个字符之间的大小关系, 从而决定两个 字符串的大小。系统对字符序列的排序设置有菜单操作和命令两种方式。 ① 菜单操作设置 单击“工具”下拉菜单中的“选项”命令, 打开“选项”对话框。单击“数据”选项卡, 如 图 2.2 所示。 单击“排序序列”下拉框箭头, 在打开的列表框中选择“Machine(机器) ” 、 “PinYin(拼 音)”或者“Stroke(笔画)”, 然后单击“确定”按纽。 ② 命令设置 格式:Set

Collate

To "<排序序列名>"

功能:设置字符串的排序顺序。 说明:排序序列名是“Machine” 、“PinYin” 、“Stroke”三者之一,必须放在引号中。 z Machine(机器)顺序:指定的字符排序顺序与 XBase 兼容, 按照字符机内码的大小顺 序排序。西文字符按 ASCII 码值排列:空格最小(最前面), 数字小(前)于字母, 大 写字母小(前)于小写字母。汉字符的机内码与汉字国标码一致。对常用的一级汉字 符, 按拼音顺序排序。 z PinYin(拼音)顺序:汉字符按拼音顺序排序。西文字符则为空格最小(最前面), 数 字小(前)于字母, 小写字母小(前)于大写字母。 z Stroke(笔画)顺序:中文按照笔画多少排序。 ⑹ 字符串精确比较、相等比较与 Exact 的状态设置。 在使用双等号运算符==对两个字符串进行精确比较时, 只有当两个字符串完全相同时 (包括空格以及各字符的具体位置), 运算结果才是逻辑真, 否则为逻辑假。 使用单等号运算符=对两个字符串进行相等比较时, 运算结果取决于当前系统精确匹配 设置开关 Exact 的状态。该状态可以在命令窗口或者程序中使用命令 Set Exact On | Off 进行 66


设置。也可以在“数据”选项卡对话框中设置(参见图 2.2 左下方椭圆圈中的“字符串比较” 复选框)。系统默认为 Off(关)状态(复选框未被选择)。 ① 当 Exact 处于 Off 状态, 进行相等比较时, 只要右边字符串与左边字符串前面的部分内

图 2.2

“数据”选项卡设置对话框

容相匹配, 就可以得到逻辑真的结果。即字符串的相等比较是以右边字符串的长度为标准, 当 右边字符串比较结束即停止比较, 获得结果。 ② 当 Exact 处于 On(开)状态, 进行相等比较时, 要以两个字符串中长的字符串为标准 进行全部比较。系统自动在较短的字符串尾部添加若干个空格使两个字符串的长度相等后, 再 从左至右逐个对应地进行比较。 Exact 状态对字符串比较的影响

表 2.2 比较字符串

=(Exact Off)

=(Exact On)

==(Exact On | Off)

"abc"="abc"

.T.

.T.

.T.

"ab"="abc"

.F.

.F.

.F.

"abc"="ab"

.T.

.F.

.F.

"abc"="ab

"

.F.

.F.

.F.

"ab"="ab

"

.F.

.T.

.F.

"="ab"

.T.

.T.

.F.

""="ab"

.F.

.F.

.F.

"ab"=""

.T.

.F.

.F.

"ab

67


精确比较则不受 Exact 状态的影响。Exact 状态对字符串比较的影响详见表 2.2。 【例 2.7】关系表达式举例。 ⑴ 数值型、货币型的比较。设已赋值 x=2345.6, y=$1500。 ? x>-1, -x*10>0, $125.5*100>y, y/10>$1250 .T.

.F.

.T.

.F.

⑵ 日期时间型、逻辑型数据的比较。设已赋值 x={^2007/5/10}, y={^2007-5-10,10:30}。 ? x>y, x+1>y, y-3600*11>x, .T.>.F., .T.<.F. .F.

.T.

.F.

.T.

.F.

⑶ 字符串的比较。设已赋值 x="A", y="按", z="您好"。 ① 按机内码排序 Set

Collate

To “Machine”

&&设置系统按机器顺序排序

? "A 1"<"A01", "a"<x, "a6"<"aA", "你好">z, "一"<"三", y<"丁" .T.

.F.

.T.

.F.

.F.

.T.

② 按拼音排序 Set Collate To “PinYin”

&&设置系统按拼音顺序排序

? "A 1"<"A01", "a"<x, "a6"<"aA", "你好">z, "一"<"三", y<"丁" .T.

.T.

.T.

.F.

.F.

.T.

③ 按笔划排序 Set Collate To “Stroke”

&&设置系统按笔画顺序排序

? "A 1"<"A01", "a"<x, "a6"<"aA", "你好">z, "一"<"三", .T.

.T.

.T.

.F.

.T.

y<"丁"

.F.

2.3.5 逻辑运算符及其表达式 1.逻辑运算符 逻辑运算符用于构建逻辑表达式, 运算对象为逻辑型数据, 其运算结果也是逻辑值。逻辑 运算符共有三个, 按优先级的高低排序是: 逻辑非:.Not. 或者 ! ;逻辑与:.And. ;逻辑或:.Or. 。 逻辑非为单目运算符, 逻辑与、逻辑或为双目运算符。逻辑运算符也可以省略两端的点号 而写成:Not、And、Or。 2.逻辑表达式 表 2.3

逻辑运算规则

L1

L2

Not L1

L1 And L2

L1 Or L2

.F.

.F.

.T.

.F.

.F.

68


.F.

.T.

.T.

.F.

.T.

.T.

.F.

.F.

.F.

.T.

.T.

.T.

.F.

.T.

.T.

逻辑运算符的运算规则如表 2.3 所示, 其中的 L1 和 L2 分别表示两个逻辑型数据。 【例 2.8】逻辑运算表达式举例。已设置字符按 Machine 排序。 ? 10> 2^3 And "a">"8", "A"<"3" And "a">"8", Not "a">"8" .T.

.F.

.F.

? 10 <2^3 Or "a"<"8", "A"<"3" Or "a">"8", Not "a"<"8" .F.

.T.

.T.

在 Visual FoxPro 的许多命令和程序语句中都会用到由关系表达式或者逻辑表达式构成的 <条件>子句。编写比较复杂的条件子句时, 要注意正确分析问题, 合理构建表达式, 以得到正 确的结果值。而且有时候可能有几种形式的表达式都是正确的。例如, 要查询基础工资在 800 元及以上, 职称为讲师或副教授的教师, 其条件表达式可以写成: ① 基础工资>= 800 And 职称 = "讲师" Or 基础工资>= 800 And 职称 = "副教授" ② 基础工资>= 800 And(职称 = "讲师" Or 职称 = "副教授") 上述两种表达式都能满足条件要求。

2.4 常用函数 函数是 Visual FoxPro 系统提供的能够实现某种运算功能, 或者完成某项操作的一小段程 序。函数的一般格式为: 函数名([<参数 1> [, <参数 2>] [, … ]]) 说明: ① 函数名为英文单词或缩写, 说明实现的运算功能或者操作。 ② 圆括号中的参数是函数的运算或操作对象, 可以是常量、变量、函数及表达式等。如 果在参数中包含有函数, 称之为函数嵌套。不同的函数, 参数的个数、数据类型不同。 ③ 每个函数都有一个确切的运算结果, 称为函数值或者返回值。 ④ 函数值的数据类型与参数的数据类型可能相同, 也可能不同。 ⑤ 函数不能单独使用, 必须用在表达式中。 根据函数的功能, Visual FoxPro 系统提供的常用函数一般可以分为数值运算函数、字符串 操作函数、日期时间函数、数据类型转换函数和测试函数五大类。 为了叙述的方便和简练, 我们采用字母 N 表示数值表达式、C 表示字符串表达式、D 表示 日期表达式、T 表示日期时间表达式、L 表示逻辑表达式, 来代表函数中的参数。下面分别介

69


绍各类函数。

2.4.1 数值运算函数 数值运算函数主要用于一些常见的数学运算。其参数和函数值一般均为数值型数据。 1.绝对值和符号函数 格式:Abs(<N>) Sign(<N>) 功能:Abs( )返回给定 N 值的绝对值。Sign( )根据给定<N>值的所在区域返回相应数据表 示其符号。<N>值大于 0 时返回 1;等于 0 时返回 0;小于 0 时返回-1。 【例 2.9】x = 10 ? Abs( x-20 ), Abs( 5-x ), Sign( x ), Sign( x-10 ), Sign( -x ) 10

5

1

0

-1

2.取整函数 格式:Int(<N>) Ceiling(<N>) Floor(<N>) 功能:Int( ) 返回给定 N 值的整数部分;Ceiling( )返回大于或等于给定 N 值的最小整数; Floor( ) 返回小于或等于给定 N 值的最大整数。 【例 2.10】x = 15 ? Int( x*0.5 ), Int( -x*0.5 ), Ceiling( x*0.5 ), Ceiling( -x*0.5 ), Floor( x*0.5 ), Floor( -x*0.5 ) 7

-7

8

-7

7

-8

3.四舍五入函数 格式:Round(<N1>, <N2>) 功能:返回对<N1>的值在指定位置<N2>处进行四舍五入后的结果值。<N2>的值若大于 等于 0, 表示要保留的小数位数;若小于 0, 则表示整数部分的舍入位数。 【例 2.11】x = 29381.7546 ? Round( -x, 2 ), Round( x, 0 ), Round( x, -2 ) -29381.75 29382

29400

4.指数和对数函数 格式:Exp(<N>) Log(<N>) 功能:Exp( )返回以自然数 e 为底, 以给定<N>值为指数的 eN 的值;Log( )返回给定<N> 值的自然对数值,<N>值必须大于 0。

70


【例 2.12】x = 5, y=10 ? Exp(1), Exp(0), Exp(x), Log(2.72 ), Log(y), Log(1 ) 2.72

1.00

148.41

1.00

2.30

0.00

5.求最大值、最小值函数 格式:Max(<N1> | <D1> | <T2>, <N2> | <D2> | <T2>, <N3> | <D3> | <T3> …

)

Min( <N1> | <D1> | <T2>, <N2> | <D2> | <T2>, <N3> | <D3> | <T3> …

)

功能:Max( )返回给定的若干个<N>值, 若干个<D>值或者若干个<T>值中较大的一个; Min( )则返回若干个给定值中较小的一个。参数可以同时是数值型, 也可以同时是日期型或者 日期时间型;日期和日期时间型可以混用, 但不能与数值型混用。 【例 2.13】x = 10, y = {^2007/05/20,10:30}, z = {^2007/05/26} ? Max( x, 15 ), Max( y, z ), Min( x, 15 ), Min( y, z ) 15

05/26/07

10

05/20/07, 10:30:00 AM

6.三角函数和圆周率函数 格式:Sin(<N>) Cos(<N>) Pi( ) 功能:Sin( )返回给定<N>值的正弦值;Cos( )则返回余弦值;<N>值的单位为弧度。PI( ) 返回圆周率的值,该函数无参数。 【例 2.14】x = 45 ? Sin( x*3.14/180 ), Sin(( x-15 )*Pi( )/180 ), Cos( x*3.14/180 ), Cos(( x-15 )*Pi( )/180 ) 0.71

0.50

0.71

0.87

7.求平方根函数 格式:Sqrt(<N>) 功能:返回给定<N>值的平方根值。<N>值不能小于 0。 8.取余函数 格式:Mod(<N1>, <N2>) 功能:取余函数 Mod( )的功能与取余运算符“%”的功能相同。<N1>除以<N2>得余数,再 根据<N1>和<N2>的符号确定结果值和符号。若<N1>与<N2>符号相同,结果值等于余数,若 <N1>与<N2>符号相异,则结果值为余数加上<N2>的值,符号与<N2>相同。 【例 2.15】设已赋值 x=15,y=4,z=-7。 ?Mod(x,y), Mod(x,-y), Mod(-x,y), Mod(-x,-y) 3

-1

1

-3

?Mod(-17,z), Mod(-17,-z), Mod(17,z), Mod(17,-z) -3

4

9.随机数函数 71

-4

3


格式:Rand([<N>]) 功能:返回一个 0~1 之间的随机数。参数为可选项。 【例 2.16】x = 10 ? Sqrt(x+15 ), Sqrt(Sqrt( x*10 ) +6 ), Rand( ), Rand( ), Rand( ) 5.00

4.00

0.85

0.55

0.91

2.4.2 字符串操作函数 字符串操作函数主要用于对字符型数据的处理。其参数一般为字符串表达式(用 C 表示)。 大多数函数值是字符型的, 但也有数值型或逻辑型的。 1.宏代换函数 格式:&<字符型变量>[.<C>] 功能:将字符型变量的值替换出来, 放在&<字符型变量>所在的位置以代替它们, 即&的 值是字符型变量中的字符串。若有可选项, 则<C>的值紧跟在替换的内容后面。该函数没有圆 括号。 【例 2.17】x="山东", y="财政学院", z="d:\user\jsqk ", w="x" ? w, x, &w, "&x", "&x.SDFI", "&x.&y" x 山东

山东

山东

山东 SDFI

Use &z

山东财政学院 &&相当于命令 Use d:\user\jsqk

2.子字符串定位函数 格式:At(<C1>, <C2> [, <N> ] ) Atc(<C1>, <C2> [, <N> ] ) 功能:若<C1>的值是<C2>中的子字符串, 则返回该子字符串的首字符在<C2>中的位置 值,若不是子字符串, 则返回 0。函数值为数值型。可选项<N>的值用于设定检测<C1>的值在 <C2>中第 N 次出现时的位置。Atc( )与 At( )的功能相似, 但在比较时不区分字母大小写。 【例 2.18】x ="山东财政学院", y="fox" ? At("学院", x ), At( y, "Visual FoxPro 8.0"), Atc( y, "Visual FoxPro 8.0") 9

0

8

3.求字符串长度函数 格式:Len(<C>) 功能:返回给定字符串的长度值, 即<C>值中包含的 ASCII 码字符个数。函数值为数值型。 4.删除空格函数 格式:Alltrim(<C>) Ltrim(<C>)

72


Trim(<C>) 或者 Rtrim(<C>) 功能:Alltrim( )将给定<C>值首尾(左右)两端的空格全部删除;Ltrim( )将给定<C>值首(左) 端的空格全部删除;Trim( )或 Rtrim( )则将给定<C>值尾(右)端的空格全部删除。 【例 2.19】x ="

财政学院

", y="SDFI", z="山东"

? Len( x ), Len(Alltrim(x)), Len(Ltrim(x)), z+Trim(x)+y 12

8

10 山东

财政学院 SDFI

5.截取子字符串函数 格式:Left(<C>, <N>) Right(<C>, <N>) Substr(<C>, <N1>[, <N2>]) 功能:Left( )从<C>值的左端截取长度等于<N>个字符的子字符串;Right( )则从右端截取; 而 Substr( )从指定位置<N1>开始向右截取长度等于<N2>个字符的子字符串,若无可选项 <N2>,则从<N1>截取到最后。 6.大小写转换函数 格式:Lower(<C>) Upper(<C>) 功能:Lower( )将给定<C>值中的大写字母转换为小写字母, 其它字符不变;Upper( )则将 小写转换为大写。 【例 2.20】x ="Visual FoxPro 8.0", y=8, z=6 ? Left( x , 6 ), Right( x , 10 ), Substr( x , y , z ), Upper( x ), Lower( x ) Visual

FoxPro 8.0

FoxPro

VISUAL FOXPRO 8.0

visual foxpro 8.0

7.子字符串替换函数 格式:Stuff(<C1>, <N1>, <N2>, <C2>) 功能:用<C2>的值替换<C1>中以<N1>的值为起点的<N2>个字符。若<N2>的值等于 0, <C2>的值插入起点字符的前面;若<C2>的值是空串, 则由起点开始, 个数等于<N2>的若干个 字符被删除。 8.字符替换函数 格式:Chrtran(<C1>, <C2>, <C3>) 功能:当<C1>的值中有一个或若干个字符与<C2>值中的字符相匹配时, 就用<C3>的值中 对应位置的字符替换<C1>值中的这些相匹配字符。若<C3>的值中包含的字符个数少于<C2> 的值中包含的字符个数, 则<C1>的值中相对应的字符被删除;若<C3>的值中字符个数多于 <C2>的值中包含的字符个数, 则多的字符被忽略。 【例 2.21】x ="山东建筑学院", y ="计算机", z ="电脑" ? Stuff( x, 5, 4, "财政"), Stuff( x, 9, 0, "工程"), Chrtran("计算机 ABC", y , z ) 山东财政学院 73

山东建筑工程学院

电脑 ABC


9.字符串匹配函数 格式:Like(<C1>, <C2>) 功能:比较两个字符串对应位置的字符, 若所有字符都对应匹配, 返回逻辑真值, 否则返 回逻辑假值。<C1>中可以包含通配符 * 和 ? 。* 可以与多个任意字符匹配,? 则只能与一 个任意字符匹配。 10.空格字符串生成函数 格式:Space(<N>) 功能:返回由<N>个空格组成的字符串。 11.统计子字符串出现次数函数 格式:Occurs(<C1>, <C2>) 功能:返回<C1>在<C2>中出现的次数。函数值为数值型。 【例 2.22】x ="This is Visual FoxPro 6.0", y = "山东", z ="财政学院" ? Like("This", x), Like("This*", x), y+z, y+Space(2)+z, Occurs("is", x) .F.

.T. 山东财政学院

山东

财政学院

3

2.4.3 日期时间函数 日期时间函数主要用于对日期时间数据进行运算处理。有一部分日期时间函数不需要参数, 需要的其参数一般都是日期型或者日期时间型的数据。返回的函数值大多数是日期型或者日期 时间型的, 也有部分是数值型和字符型的。 1.系统日期、时间函数 格式:Date( ) Time( ) Datetime( ) 功能:Date( )返回当前系统的日期;Time( )以 24 小时制、hh:mm:ss 的格式返回当前系统 的时间;Datetime( )返回当前系统的日期时间;均无参数,函数值分别为日期型、字符型和日 期时间型。 2.年、月、日函数 格式:Year(<D|T>) Month(<D|T>) Day(<D|T>) 功能:Year( )返回给定参数值中的年份;Month( )返回给定参数值中的月份;Day( )返回给 定参数值中的日期,返回值均为数值型。 【例 2.23】x = {^2007/05/25}

74


? Date( ), Time( ), Datetime( ), Year(x), Month(x), Day(x) 06/18/07

21:26:51 06/12/07 09:26:51 PM

2007

5

25

3.时、分、秒函数 格式:Hour(<T>) Minute(<T>) Sec(<T>) 功能:Hour(<T>)以 24 小时制返回给定参数值中的小时;Minute(<T>)返回给定参数值中 的分钟;Sec(<T>)返回给定参数值中的秒数;返回值均为数值型。 4.年月日格式函数 格式:Dmy(<D|T>) Mdy(<D|T>) 功能:Dmy( )返回用英文表示的日、月、年;Mdy( )返回用英文表示的月、日、年,返回 值为字符型。 【例 2.24】 x = {^2007/05/25, 02:29:47 PM} ? Hour( x ), Minute( x ), 14

29

47

Sec( x ), 25 May 07

Dmy( x ),

Mdy( x )

May 25, 07

2.4.4 数据类型转换函数 数据类型转换函数的功能主要是将某一种类型的数据转换成另一种类型的数据, 因此参 数值的类型和函数值的类型不同。 1.字符、ASCII 码值转换函数 格式:Asc(<C>) Chr(<N>) 功能:Asc( )将<C>的首字符转换成对应的十进制 ASCII 码值,函数值为数值型。Chr( ) 将<N>值作为十进制的 ASCII 码值转换成所对应的字符,<N>值≤255。函数值为字符型。 2.字符串、数值转换函数 格式:Val(<C>) Str(<N1>[, <N2>[, <N3>]]) 功能:Val( )将<C>值左端连续的数字字符串(包括正负号、数字和小数点)转换成数值, 遇到非数字符号或者第二个正负号、小数点即停止转换。前置空格不影响转换。若首字符为非 空格或者非数字时,返回 0 值。 Str( )将<N1>转换成对应的数字字符串。可选项<N2>确定字符串的总长度, 包括正负号、 小数点和小数;<N3>确定小数的位数。若无可选项<N3>, 则默认为无小数,多出的位数四舍

75


五入删除。若无<N2>,默认转换成 10 位字符串,位数不足 10 位,在数字左边补空格。 【例 2.25】 x ="SDFI", y ="-1234.56ab7890", z = -257.368914 ? Asc( x ), Asc("6.0"), Chr(36), Val( y ), Str( z, 9, 3 ) 83

54 $

-1234.56

-257.369

3.日期时间、字符串转换函数 格式:Dtoc(<D>|<T> [, <1>] ) Ttoc(<T>, [<1>] ) Ctod(<C>) Ctot(<C>) 功能:Dtoc( )将<D>或者<T>中的日期转换成由年月日构成的字符串;Ttoc( )则将<T>转换 成字符串。日期格式取决于 Set Date 命令和 Set Century On|Off 的设置。Set Date 命令设置年月 日的顺序, Set Century On 显示 4 位数长年份, Off 则显示 2 位数短年份。系统默认显示为美国 格式(mm/dd/yy)和 2 位数短年份。若有可选项<1>, 则转换成长年份的紧凑格式 YYYYMMDD。 时间格式取决于 Set Hours To 12|24 的设置。系统默认 12 小时制。若有可选项<1>, 则转换成 采用 24 小时制的紧凑格式 YYYYMMDDHHMMSS。 Ctod( )将给定的<C>值转换成日期型数据。字符串中的日期格式要符合 Set Date 命令的设 置, 年份可以用 4 位也可以用 2 位。Ctot( )则将给定的<C>值转换成日期时间型数据。字符串 中的格式要求同上。 【例 2.26】 x = {^1999/04/28, 16:39:00}, y = "10/18/2001", z = "06/22/2007, 11:15:20" ? Dtoc(Date( )), Ttoc( x ), Ctod( y ), Ctot( z ) 06/18/07

04/28/99 04:39:00 PM

10/18/01

06/22/07 11:15:20 AM

2.4.5 测试函数 1.字母检测函数 格式:Isalpha(<C>) Islower(<C>) Isupper(<C>) 功能:Isalpha( )检测<C>的首字符是否是字母;Islower( )检测<C>的首字符是否是小写字 母;Isupper( )检测<C>的首字符是否是大写字母。是返回逻辑真值,否则返回逻辑假值。 【例 2.27】 字母测试函数举例。x ="visual" ? Isalpha( x ), Isalpha("23ab") , Islower( x ) , Isupper( x ), Isupper(Upper( x )) .T.

.F.

.T.

.F.

.T.

2.数据库、数据表、索引文件名检测函数

76


格式:Dbc( ) Dbf( [N] ) Ndx(<N1> [, N2] ) 功能:Dbc( )返回当前打开的数据库名;Dbf( )返回当前或指定工作区中打开的数据表名, N 为指定的工作区号;Ndx(<N1>[, N2])返回当前或指定工作区中在 N1 位置打开的单索引文件 名,N2 为指定的工作区号。 3.工作区号检测函数 格式:Select( [1] ) 功能:无可选项返回当前工作区号, 有可选项则返回未使用的最大工作区号。 4.磁盘文件检测函数 格式:File(<C>) 功能:测试由<C>指定的磁盘文件是否存在。存在返回逻辑真值, 否则返回逻辑假值。字 符串<C>中应包含完整的路径完整的文件名。 【例 2.28】 打开数据库;在指定的工作区打开数据表以及与其相关的单索引文件。 Open Database d:\user\jsgl

&&打开保存在 d:\user\中的 jsgl 数据库

Use jsqk In 2 Index d:\user\jsbh, d:\user\xbbh

&&在第 2 工作区打开 jsqk 数据表及其 索引文件 jsbh, xbbh

Select 3

&&选择第三工作区

? Select( ), Dbc( ), Select(1), File("d:\user\jsqk"), File("d:\user\jsqk.dbf") 3

D:\USER\JSGL.DBC

32767

.F.

.T.

? Dbf(2), Ndx(1, 2), Ndx(2, 2) D:\USER\JSQK.DBF

D:\USER\JSBH.IDX

D:\USER\XBBH.IDX

5.数据表首、尾部检测函数 格式:Bof( [N] ) Eof( [N] ) 功能:Bof( )测试当前或指定工作区中打开的数据表记录指针是否指向数据表的首部,Eof( ) 测试当前或指定工作区中打开的数据表记录指针是否指向数据表的尾部。是返回逻辑真值, 否 则返回逻辑假值。N 为指定的工作区号。 【例 2.29】 记录指针指向数据表首尾部的检测。 Goto Top

&&记录指针移到第一条记录

? Bof( ), Eof( ) .F.

.F.

Skip –1

&&记录指针移到数据表的首部

? Bof( ), Eof( ) .T. 77

.F.


Goto Bottom

&&记录指针移到最后一条记录

? Bof( ), Eof( ) .F.

.F.

Skip 1

&&记录指针移到数据表的尾部

? Bof( ), Eof( ) .F.

.T.

6.字段检测函数 格式:Fcount( [N] ) Field( N1 [, N2 ] ) Fsize(<C> [, N ] ) 功能:Fcount( )返回当前或指定工作区中打开的数据表的字段个数,N 为指定的工作区号; Field( )返回当前或指定工作区中打开的数据表中 N1 位置的字段名 N2 为指定的工作区号; Fsize( )返回当前或指定工作区中打开的数据表中<C>字段的宽度,N 为指定的工作区号。 7.记录检测函数 格式:Reccount( [N] ) Recsize( [N] ) Recno( [N] ) Found( [N] ) Deleted( [N] ) 功能:Reccount( )返回当前或指定工作区中打开的数据表中记录的个数;Recsize( )返回当 前或指定工作区中打开的数据表中记录的长度值;Recno( )返回当前或指定工作区中打开的数 据表中的当前记录号。N 为指定的工作区号。 Deleted( )测试当前或指定工作区中数据表的当前记录是否有删除标记。有删除标记返回 逻辑真值, 否则返回逻辑假值。Found( )测试当前或指定工作区中在打开的数据表中进行的记 录查询是否成功。若找到查询的记录, 返回逻辑真值, 否则返回逻辑假值。 【例 2.30】检测已在第二工作区打开的 jsqk.dbf 数据表中的字段、记录。 ? Fcount(2), Field(1, 2), Field(2,2), Fsize("jsbh", 2), Fsize("xm", 2) 12

JSBH

XM

6

8

? Reccount(2), Recsize(2) 10

69

select 2

&&选择第 2 工作区

List

&&显示所有记录

go 5

&&记录指针移到第五条记录

? Select( ), Recno( ), Deleted( ) 2

5

.F. 78


Delete

&&对当前(第 5 条)记录作删除标记

Display ? Select( ), Recno( ), Deleted( ) 2

5

.T.

Locate For xb="女" And zc= "教授"

&&查找性别为"女", 职称为"教授"的记录

? Found( ) .T. Locate For xb="男" And zc="教授"

&&查找性别为"男", 职称为"教授"的记录

? Found( ) .F. 8.条件检测函数 格式:Iif( <L>,<表达式 1>,<表达式 2>)) 功能:根据<L>的值确定返回值。当<L>的值为逻辑真值时, 返回<表达式 1>的值, 否则返 回<表达式 2>的值。表达式可以为字符串型、数值型、货币型、日期型或者日期时间型。 9.数据类型检测函数 格式:Type( <C>) 功能:返回值为字母, 表示字符串<C>中表达式值的数据类型。 10.当前驱动器、工作目录检测函数 格式:Sys( 5 ) Curdir( ) 或者 Sys( 2003 ) 功能:Sys(5)返回当前默认的驱动器号; Curdir( )或者 Sys(2003)返回当前默认的工作目录。 【例 2.31】条件检测、数据类型、当前驱动器和工作目录检测函数举例。 x ="Visual FoxPro 8.0", y = {^2007/06/16, 10:25:30}, z=100 ? Iif(z>100, z, z+100), Iif(z=100, z, z+100), Type("x"), Type( '(2*3)+4' ) 200

100

C

N

? Type("y"), Type("Date( )"), Type("A=42"), Sys(5), Curdir( ) T

D

U

C:

\VISUAL STUDIO\VFP98\

U 表示表达式的值是未定义的或者不明确的数据类型。

*2.5 常用 Visual FoxPro 系统设置命令 除了 1.4.2 小节中介绍的使用菜单方式设置 Visual FoxPro 系统运行环境的方法外, 还可以 用命令方式对系统运行环境进行设置。系统设置命令分为状态开关设置和环境参数设置两类。 1.状态开关设置命令

79


格式:Set <状态参数> On | Off 功能:设定指定的系统状态参数为打开或关闭状态。 ⑴ 设置显示世纪年份 格式:Set Century Off | On 功能:设置显示日期型或者日期时间型数据时的年份格式。设为 On 时, 以 4 位数字显示 年份, 否则只以 2 位数字显示年份。系统默认设置为 Off。 ⑵ 设置屏幕显示 格式:Set Console On | Off 功能:设置屏幕的显示。设置为 On 时, 要输出的数据显示在主窗口或者活动的自定义窗 口中。若设置为 Off, 输出的数据不能显示在主窗口或者活动的自定义窗口中。常用于屏蔽一 些不允许显示的重要数据, 如输入的口令、密码等。系统默认设置为 On。 Set Console 命令不影响@ … Say … Get 命令的输出显示, 仅屏蔽 Accept、Input、Wait 等 命令在屏幕上的显示, 并对一些对话框有影响。例如将该命令设置为 On 时, 若尚未打开数据 表就使用显示、浏览命令, 系统显示一个打开对话框;若设置为 Off, 则显示一个错误信息。 该命令不能在命令窗口使用, 只能用于程序中。 ⑶ 设置逻辑删除 格式:Set Deleted Off | On 功能:设定是否能对已做删除标记的记录进行操作。设置为 On, 在对记录进行如显示、 浏览、统计等操作时, 将忽略已做删除标记的记录。若设置为 Off, 则不忽略。系统默认为 Off。 ⑷ 设置字符串精确比较 格式:Set Exact Off | On 功能:设定字符串是否进行精确比较。设置为 On, 进行精确比较, 否则不精确比较。详见 2.3.4 节。系统默认设置为 Off。 ⑸ 设置打印机开关 格式:Set Printer On | Off 功能:设定能否将数据输出到打印机。设置为 On, 能输出到打印机;若设置为 Off, 则不 能输出到打印机。系统默认设置为 Off。 ⑹ 设置安全保护开关 格式:Set Safety On | Off 功能:设定在对数据库、数据表文件进行删除、覆盖操作, 或对数据表结构进行修改, 或 要删除表中所有记录时, 是否显示安全保护提示信息。设置为 On 时, 显示提示信息, 否则不显 示。系统默认设置为 On。 ⑺ 设置命令结果的显示 格式:Set Talk On | Off 功能:设定命令执行的结果是否显示。设置为 On 时, 命令的执行结果显示在主窗口的工 80


作区中, 设置为 Off 则不显示。系统默认设置为 On。 2.环境参数设置命令 格式:Set <环境参数> To <参数值> 功能:设定指定的系统环境参数值。 ⑴ 设置日期格式 格式:Set Date [To] American | USA | mdy | dmy | ymd 功能:设置日期数据显示的格式。各参数对应的日期格式为:American-mm/dd/yy;USA -mm-dd-yy;mdy-mm/dd/yy;dmy-dd/mm/yy;ymd-yy/mm/dd。系统默认设置为 American (美国格式) 。 ⑵ 设置默认的驱动器或路径 格式:Set Default To <盘符:>|<路径> 功能:将当前的系统默认驱动器或者路径设置为指定的驱动器或者路径。例如:Set Default To A: 将 A: 盘设置为系统当前默认的驱动器;而 Set Default To d:\vfp-user 则将 D 盘中的 vfp-user 子目录设置为系统当前默认的驱动器和路径。 ⑶ 设置计时制 格式:Set Hours To [12 | 24] 功能:设定 12 小时或者 24 小时计时制。若无可选项,则恢复系统默认的 12 小时计时制。 ⑷ 打开、关闭索引文件 格式:Set Index To [<索引文件名表>] 功能:为当前已打开的数据表文件打开指定的索引文件, 各文件名之间用逗号分隔。若无 可选项, 则关闭已打开的索引文件。详见 3.4.3 小节。 ⑸ 设置当前索引 格式:Set Order To [<序号> | <索引文件名> | [Tag]<索引名> [Ascending | Descending]] 功能:设置指定的索引文件或者索引名为当前索引。详见 3.4.3 小节。 ⑹ 设置文件搜索路径 格式:Set Path To [<路径表>] 功能:设置由路径表指定的文件搜索路径。各路径之间用逗号或者分号分隔。若无可选项, 则取消设置的搜索路径。 ⑺ 打开、关闭过程文件 格式:Set Procedure To [<过程文件名表>][Additive] 功能:打开[<过程文件名表>]中指定的过程文件,各文件名之间用逗号分隔;若无该可选 项,则关闭所有已打开的过程文件。若有[Additive]可选项,在打开新的过程文件时,已打开 的过程文件不会关闭,否则在打开新过程文件的同时关闭已打开的过程文件。 ⑻ 设置数据表间的关联 格式:Set Relation To [<表达式> Into <区号>|<表别名>] [Additive]

81


功能:将当前表与指定的表之间建立关联。若有[Additive]可选项, 建立新关联时不取消已 建立的关联, 否则建立新关联的同时取消旧关联。若无可选项,则取消所有已建立的关联。详 见 3.6.3 小节。 ⑼ 取消关联 格式:Set Relation Off Into <区号> | <表别名> 功能:取消当前表与指定表之间已建立的关联。

第三章

数据库与数据表的基本操作 3.1

数据库的基本操作

简单地说,数据库就是数据的集合。建立数据库的目的是将相互之间有联系的信息有机地 组织在一起,进行统一的管理和使用。通常,一个应用系统中至少有一个数据库,也可以包含 多个数据库。 在这里,很重要的一点就是明确区分数据库和数据表这两个不同的概念。Visual FoxPro 3.0 以前,数据库和数据表是同一个概念,即一个数据库就是一张表(文件扩展名为.dbf)。这样 建立的各个数据库是彼此孤立的,很难进行统一的管理。Visual FoxPro 3.0 以后,数据表(简 称表)是指扩展名为.dbf 的文件,它既可以独立于数据库之外(称为自由表),也可以包含在 数据库中(称为数据库表)。数据库是指一个扩展名为.dbc 的文件,是一个能够包含各种数据对象的“容器” 。这个“容 器”包含了若干相关的数据表,同时还可以包含这些数据表 之间的永久关系以及视图、连接、存储过程等各种数据对象。

3.1.1 创建数据库 除了可以在“项目管理器”中创建数据库外,还可以采 用菜单方式和交互式命令方式创建数据库。 1.使用菜单

82

图 3.1“新建”对话框


利用菜单命令可以方便快捷地建立一个数据库,并且可以在 Visual FoxPro 系统提供的可 视化工具——“数据库设计器”中对数据库进行管理和维护。操作步骤如下: ⑴ 单击常用工具栏上的“新建”按钮,或者单击主菜单“文件”下拉菜单中的“新建” 命令,打开“新建”对话框,如图 3.1 所示。 ⑵ 在“文件类型”中选择“数据库” ,单击“新建文件” 按钮,打开如图 3.2 所示的“创 建”对话框。 ⑶ 在“数据库名”文本框中输入文件名,如:“jsgl”(教师管理),单击“保存”按钮, 即可在默认目录下建立新的数据库文件 jsgl.dbc。 说明: ① 系统默认的数据库文件扩展名为.dbc。与.dbc 同时生成的还有扩展名为.dct 和.dcx 的两

图 3.2 “创建”对话框

图 3.3 “数据库设计器”窗口及工具栏 个文件,分别为数据库备注文件和数据库索引文件。请注意,不要随意删除.dct 文件,否则,

83


数据库将无法正常打开。 ② 保存文件后,数据库处于打开状态,并且系统会自动显示出相应的“数据库设计器” 窗口,如图 3.3 所示。此时,新建的数据库中不含任何对象,是一个空文件。 ③ 数据库打开后,系统主菜单中会增加“数据库”菜单项,工作区中会出现“数据库设 计器”工具栏(若未出现,可单击“显示”下拉菜单中的“工具栏”命令,打开“工具栏”对 话框,在列表中选择“数据库设计器”复选框,将其调出) 。用户可利用系统提供的菜单命令 或工具栏上相应的按钮对数据库进行各种操作,如添加表、建立视图等。 2.使用 Create 命令 格式:Create Database [<文件名>|?] 功能:创建一个新的数据库文件。 说明: ① <文件名>:指定要建立的数据库文件名。文件名中可包含完整的路径,用以指定文件 的保存位置;缺省<文件名>或使用?,将显示“创建”对话框,让用户定义数据库文件名和 指定文件的保存位置。 ② 命令执行后,新建的数据库文件是一个空文件并自动处于打开状态。但此时, “数据库 设计器”窗口不会打开。

3.1.2 打开、关闭和设置数据库 1.打开数据库 在数据库中新建、添加或使用数据表之前,需要先打开数据库文件。 ⑴ 使用菜单 单击常用工具栏上的“打开”按钮,或单击主菜单“文件”下拉菜单中的“打开”命令, 出现“打开”对话框,如图 3.4 所示。在“文件类型”下拉列表框中选择“数据库(*.dbc)”, 然后在文件列表中选择要打开的数据库文件,单击“确定”按钮。 说明: ① 在“打开”对话框下方有“以只读方式打开”和“以独占方式打开”两个复选框,用 以指定数据库文件的打开方式。系统默认以共享方式打开数据库。

84


图 3.4 “打开”对话框 ② 系统打开数据库的同时,显示“数据库设计器”窗口。 ⑵ 使用 Open Database 命令 格式:Open Database [<数据库文件名> | ?] [Exclusive | Shared] [Noupdate] 功能:按照指定方式打开指定的数据库文件。 说明: ① <数据库文件名>:指定要打开的数据库文件名,其中可以包含完整路径;缺省<数据 库文件名>或使用?,将出现“打开”对话框,让用户选择要打开的数据库文件名。 ② Exclusive:以独占方式打开数据库,不允许其它用户同时访问该数据库。相当于在“打 开”对话框中选中“以独占方式打开”复选框。 ③ Shared:以共享方式打开数据库,允许其它用户访问数据库。 ④ Noupdate:以只读方式打开数据库,不允许在数据库中添加、新建或删除数据对象。 相当于在“打开”对话框中选中“以只读方式打开”复选框。 ⑤ 用命令方式打开数据库文件,不出现“数据库设计器”窗口。 2.关闭数据库 数据库操作完毕后,必须将其关闭,以确保数据的安全。 ⑴ 使用菜单 单击主菜单“文件”下拉菜单中的“退出”命令,则退出 Visual FoxPro 系统的同时,自 动关闭当前已打开的所有数据库。 注意:单击“数据库设计器”的关闭按钮或主菜单“文件”下拉菜单中的“关闭”命 令,仅关闭“数据库设计器”窗口,并不能关闭已打开的数据库文件。

85


⑵ 使用 Close Database 命令 格式: Close Database [All] 功能:关闭当前数据库或关闭所有已打开的数据库。 说明: 缺省 All 可选项,关闭当前数据库;使用 All 可选项,则关闭所有打开的数据库。 3.设置当前数据库 在 Visual FoxPro 中,用户可以同时打开多个数据库。但某一时刻,只能对一个数据库进 行操作,这个数据库称为当前数据库。当用命令或菜单方式依次打开多个数据库时,系统自动 将最后打开的数据库设置为当前数据库,此后用户所创建或添加到数据库的任何数据表或其他 对象,均默认为当前数据库的一部分。设置数据库有两种方法: ⑴ 使用工具栏设置 单击“常用”工具栏的下拉列表框右侧的按钮,展开的列表中将显示出当前打开的所有数 据库文件名,如图 3.5 所示。单击列表中的文件名,即可将其指定为当前数据库。

图 3.5 设置当前数据库 ⑵ 使用 Set Database 命令设置 格式:Set Database To [<数据库文件名>] 功能:指定当前数据库或取消对当前数据库的指定。 说明: 使用可选项<数据库文件名>,可将该数据库设置为当前数据库;省略可选项,取消对当 前数据库的指定,但系统不关闭任何已打开的数据库。

3.1.3 修改、删除数据库 1.修改数据库 在 Visual FoxPro 中,修改数据库首先要打开“数据库设计器”,然后在其中完成数据表、 视图等数据对象的添加、新建、修改、删除操作,以及建立数据表间的永久关系,设置、编辑 参照完整性等。 ⑴ 使用菜单

86


用“文件”下拉菜单中的“打开”命令,打开数据库文件及其“数据库设计器”窗口。 ⑵ 使用 Modify Database 命令 格式:Modify Database [<数据库文件名> | ?] 功能:打开数据库文件以及相应的“数据库设计器”。 说明: 使用可选项<数据库文件名>,打开指定的数据库文件及其“数据库设计器”;缺省可选项 或使用?,将出现“打开”对话框,让用户选择要打开的数据库文件名。 2.删除数据库 当一个数据库文件不再使用时,可以将其从磁盘上删除。删除数据库的命令如下: 格式:Delete Database <数据库文件名> | ? [Deletetables] 功能:删除指定的数据库文件及其所包含的数据表。 说明: ① <数据库文件名>:指定要删除的数据库文件名。使用?,将出现“打开”对话框,让 用户选择数据库文件名。 ② Deletetables:删除数据库文件的同时删除该数据库所包含的所有数据库表(.dbf) 。若 省略该可选项,仅删除指定的数据库。此时,原本包含在数据库中的数据库表会自动解除与该 数据库的链接关系,成为独立于数据库之外的自由表(参见 3.5 节)。 注意:① 删除数据库文件前,首先要关闭数据库。 ② 如果用户在 Windows 的“资源管理器”中以删除磁盘文件的方式删除了非空的 数据库文件(.dbc),那么在 Visual FoxPro 中,如果再试图打开与它关联的数据表 时,会出现如图 3.6 所示的提示信息。 这是因为,在 Visual FoxPro 数据库中“建立”或“添加”一个数据表,并非正真意义上 的“包含”关系,而是在数据库和该数据表之间建立了一种双向链接关系,即它们各自建立了 一个包含对方地址(由相对路径和文件名组成)的指针指向对方。在“资源管理器”中删除数 据库文件时,库、表间的链接关系并不会自动解 除,数据表指针仍然指向该数据库,因而不能正 常打开。 如果要打开数据表,单击图 3.6 中的“删除” 按钮,解除数据表与数据库的链接关系,数据库 表将转变成为自由表;如果数据库没有被删除而 是改变了存储位置,单击“定位”按钮,重新确 立数据库和数据表之间正确的链接关系。 图 3.6 “打开表”对话框

87


数据库表的基本操作

3.2

Visual FoxPro 支持两种不同的数据表。一种是独立于数据库之外的数据表,称为自由表; 另一种是和数据库建立了链接关系的数据表,称为数据库表。数据库表可以直接在数据库中新 建,也可以先建立自由表,再将其添加进数据库中。

3.2.1 数据库表结构的设计 Visual FoxPro 使用数据表存储数据,建立一个结构合理、数据操作简便的数据表是数据 库系统应用的基础。要建立数据表,首先要设计数据表的基本结构,包括字段名称、类型、宽 度、小数点位数等的分析和定义。 表 3.1

教师情况表

教师编号

姓名

性别 出生日期

工作日期

学历

学位

职称

婚否

简历

照片

系部编号

199806

茅丽燕

08/21/59

07/16/76

研究生

硕士

教授

T

(略)

(略)

101

199006

张玉萍

03/21/66

07/21/88

大学

学士

副教授

T

(略)

(略)

107

199812

呼延景

12/17/67

07/01/95

研究生

博士

副教授

T

(略)

(略)

102

199310

许斌

05/30/54

11/01/72

大学

教授

T

(略)

(略)

108

199802

高大宇

01/31/72

05/15/92

大专

工程师

F

(略)

(略)

107

199205

陈建民

12/15/66

02/01/92

研究生

博士

教授

T

(略)

(略)

101

199316

杨柳青

03/26/62

01/16/81

大学

学士

教授

T

(略)

(略)

108

200010

东方剑

04/04/75

07/20/00

研究生

硕士

讲师

F

(略)

(略)

108

200003

李新

07/02/68

07/30/91

大学

学士

副教授

T

(略)

(略)

108

200703

欧阳春

11/09/82

06/20/07

研究生

硕士

助教

F

(略)

(略)

102

下面以表 3.1 所示的“教师情况表”为例,简单介绍表结构的设计思想: 1.为了操作方便,数据表字段名通常采用英文名称表示。本例中,字段名分别用它们的 拼音缩写来定义,如:xm(姓名)、csrq(出生日期)、xw(学位)等。 2.对于字段类型,应根据其存储内容的不同和需要来指定。比如,职工编号 “199806” 由 6 位数字符号组成,它的前 4 个字符“1998”代表教师调入本单位的时间,为了便于提取这 个信息(使用求子串函数),应将该字段定义为字符型;婚否字段只包含“是”与“否”两种 情况,采用逻辑型表示婚姻状况比字符型要简单、自然;对于不同的教师,其简历字段内容的 长短差别很大,采用备注类型更合适;而照片字段则需要定义成通用类型。 3.字段宽度和小数位的定义要满足该字段最长内容的存储需要。比如,姓名字段考虑到 可能有四个汉字的名字,那就应该将其宽度定义为 8(字节);对于数值型字段则要考虑整数 88


和小数位数等。 在对每个字段进行详细分析和设计后,得到“教师情况表”的基本结构如表 3.2 所示。 本教材后续章节中,都将以“教师情况表”为例讲解例题。此外,例题中涉及的其他三个 数据表是:工资表、系部表、科研情况表,它们的表结构参见配套的实验指导书,在此不一一 赘述。

表 3.2

教师情况表结构

字段名

类型

宽度

小数位数

jsbh

字符型

6

----

xm

字符型

8

----

xb

字符型

2

----

csrq

日期型

8

----

gzrq

日期型

8

----

xl

字符型

6

----

xw

字符型

4

zc

字符型

6

----

⑵ 在“数据库设计器”窗口的空白区

hf

逻辑型

1

----

域中单击鼠标右键,弹出如图 3.7 所示的快

jl

备注型

4

----

捷菜单,选择“新建表”命令,出现“新

zp

通用型

4

----

建表”对话框,如图 3.8 所示。单击“新建

bmbh

字符型

3

----

3.2.2 创建数据库表 要创建数据库表,首先要打开数据库, 然后使用菜单方式或命令方式打开“表设 计器”,在其中定义并保存表的结构。 1.使用菜单 下面以数据库表 jsqk.dbf 的创建为例: ⑴ 打开 jsgl.dbc,出现“数据库设计器” 窗口。

表”按钮, 在随后出现的“创建”对话框中,输入表文件名,如“jsqk”(教师情况),然后 单击“保存”按钮。这时将出现“表设计器”窗口,如图 3.9 所示。 ⑶ 在“表设计器”的“字段”选项卡中,按照表 3.2 设计的数据表结构依次输入各个字 段名、类型、宽度、小数位。当所有字段定义完毕,单击“确定”按钮。 至此,建立了一个名为 jsqk.dbf 的数据库表,它属于数据库 jsgl.dbc。 注意:① 新建立的数据表只包含表结构而不含任何数据记录,是一个空表。

89


② 新建表处于打开状态,可以打开“浏览”窗口输入数据记录(单击“显示”

图 3.7 快捷菜单

图 3.8 “新建表”对话框

菜单中“浏览”命令),也可打开“表设计器”修改表结构(单击“显示”菜单中 “表设计器” )。 2.使用 Create 命令 格式:Create [<表文件名> | ?] 功能:打开“表设计器” ,建立数据表文件。如果此时某个数据库已打开,则在当前数据 库中建立数据库表;如果没有打开数据库,则建立自由表。 说明: ① <表文件名>:指定要创建的数据表文件名。省略可选项或使用?,将打开“创建”对 话框,让用户定义文件名和指定文件的保存位置。 ② 系统默认扩展名为 .dbf。如果在数据表中定义了备注型或通用型字段,系统将自动产 生一个与该数据表文件名相同而扩展名为 .fpt 的表备注文件,用以保存这两个字段的内容, 其它字段的值均保存在 .dbf 文件中。 3.“表设计器”窗口的组成 如图 3.9 所示,“表设计器”窗口的“字段”选项卡由以下几部分组成: ⑴ 字段定义区域 ①“字段名”列:定义字段名。字段名以字母或汉字开头,其后可为字母、汉字、下划线 和数字,但不能含有空格。在 Visual FoxPro 中,数据库表字段名的最大长度可达 128 个 ASCII 码字符。 ②“类型”列:指定字段类型。下拉列表中列出所有的字段类型。默认类型为“字符型”。 ③“宽度”列:设置字段所占字节总数。当字段定义为日期型、日期时间型、逻辑型、备 注型、通用型等具有固定宽度的类型时,该项自动填入。 90


④ 小数位数:指定数值型字段的小数位数。 注意:数值型字段的宽度值是整数位数、小数点位数和小数位数之和。 ⑤ 索引:若使用当前字段作为索引字段,可在列表中指定升序或降序排序方式。 ⑥ Null:设置是否允许该字段为空值。选中复选框表示允许。 空值 Null 的含义与空串、空的字段或数值 0 不同,表示暂时缺值或没有确定值。例如, 设置“xw”字段允许为 Null,那么在教师的学位情况不清楚时,可将该字段赋值为空值(在 “浏览”窗口相应字段处,按组合键“Ctrl+0” ) 。一个字段是否允许为空值与实际应用有关, 如主关键字段不允许设置为空值,允许内容暂缺的字段可设置为空值。

图 3.9 “表设计器”窗口 ⑵“显示”区域 ① 格式:设定字段在“浏览”窗口、表单或报表中显示时的样式。例如,设置“! ”,则 输入输出时将字母转换成大写。 ② 输入掩码:控制字段输入时应遵循的格式要求,以便减少输入错误。例如,可设置电 话号码字段的输入掩码为(999)9999-9999,其中 9 表示数字。常用掩码如表 3.3 所示。 表 3.3

常用输入掩码

掩码字符

91

X

允许输入任何字符

*

显示“*”号

9

允许输入数字


#

可以输入数字、空格、+、-

$

显示货币符号

.

小数点位置

,

为数字加“, ”分隔符

③ 标题:设置在“浏览”窗口、表单或报表中显示的字段标题。如不设定,系统默认以 字段名作为标题名。例如,在“xb”字段对应的标题文本框中输入“性别”,则在浏览窗口以 “性别”标题取代原来的英文标题“xb”。 ⑶“字段有效性”区域 ① 规则:对字段进行有效性检查的表达式。当输入内容不符合该表达式时,不接受输入 值。例如,要限制“xb”字段的输入值为“男”或“女”,在文本框中输入表达式“xb="男" .Or. xb="女"”,或者单击后面的按钮,打开“表达式生成器”建立表达式。规则表达式的类型应为 逻辑型。 ② 信息:违反有效性规则时显示的提示信息,信息为字符类型表达式。例如,在文本框 中输入“只能输入男或女!”。当输入数据违反了有效性规则时,将在屏幕上出现提示信息。 ③ 默认值:字段在没有输入的情况下,自动填写的值。例如:可设置“xb”字段默认值 为“男”。那么,在“浏览”窗口或表单中输入数据时,默认值都会自动填写。 ⑷“将字段类型映射到类”区域 指定字段的默认控件类,使得在界面设计时,自动设置相应的库和类。如不指定,系统使 用默认的类库和控件。“显示库”文本框,用以输入一个扩展名为“.vcx”的类库文件名;控 件类名可在“显示类”下拉列表中选定。 ⑸“Auto Increment”区域 这是 Visual FoxPro 8.0 的新增功能,该项仅对整数(AutoIncr)字段类型有效。其中, “下 一个”文本框用于设置增加后的值; “步长”文本框用于设定数值的增量。这个字段类型适合 用于有数列规律的字段。 ⑹“字段注释”区域 对字段添加注释,便于以后对数据库进行维护。

3.2.3 打开与关闭数据库表 在对数据表进行任何操作之前都必须打开该数据表,即把数据表文件从磁盘“复制”到计 算机内存中;当完成对数据表的各种操作后,需要关闭数据表,即把数据表保存到磁盘,并内 存中清除数据表。 1.打开数据库表

92


当打开一个数据库时,并不能自动打开其中包含的表,还需要使用菜单或命令方式打开需 要操作的数据库表。 ⑴ 使用菜单 单击常用工具栏上的“打开”按钮,或单击主菜单“文件”下拉菜单中的“打开”命令, 在“打开”对话框的“文件类型”下拉列表框中选择“表(.dbf)”,然后在文件列表中选择要 打开的文件,单击“确定”按钮打开数据表。 注意:① 在“打开”对话框下方有两个复选框,一个是“以只读方式打开”,另一个 是“以独占方式打开”,用户可以根据操作需要来指定数据表文件的打开方式。 ② 若用户没有选择打开方式,系统默认以“共享方式”打开数据表。此时“表 设计器”为只读状态,不允许修改表结构。但用户可以对数据表记录进行添加、删 除、修改等操作。 ⑵ 使用 Use 命令 格式:Use [<表文件名>[.dbf]] [In <工作区号>] [Alias <别名>] [Exclusive] [Shared] [NoUpdate] 功能:在指定的工作区以指定方式打开数据表文件。 说明: ① <表文件名> [.dbf]:指定要打开的数据表,其扩展名.dbf 可以省略。 ② [In <工作区号>]:指定打开数据表的工作区号。工作区号范围是 1~32767。如果工作 区号指定为 0,则系统自动选用目前未使用的最小工作区号(参见 3.6.1 节)。 ③ [Alias <别名>]:打开数据表的同时定义它的别名。别名以字母开头,由字母、数字、 下划线组成。若省略该可选项,系统默认数据表文件名作为它的别名。 ④ [Exclusive]:以独占方式打开数据表,不允许其它用户同时访问,只允许本地用户修 改数据表结构以及对数据表记录进行添加、删除、修改操作。若命令中同时省略 Exclusive、 Shared 和 NoUpdate 可选项,系统默认以独占方式打开数据表。 ⑤ [Shared]:以共享方式打开数据表,允许其它用户访问。 ⑥ [NoUpdate]:以只读方式打开数据表,即不允许用户对数据表进行任何添加、删除和 修改数据的操作,也不允许修改表结构。 ⑦ 省略所有可选项,只使用 Use,则是关闭当前打开的数据表。 注意:① 此命令也适用于自由表。 ② 在任何打开的数据表中,系统都会自动设置一个记录指针,该指针指向的记 录被称为当前记录。当使用 Use 命令打开一个数据表时,记录指针默认指向表中 的第一条记录。 ③ 在同一工作区中,当打开一个新表时,系统会自动关闭先前已经打开的数据 表。也就是说,在某一时刻,一个工作区中只允许打开一个数据表。 ④ 在命令窗口中,用 Use 命令关闭当前打开的数据库表时,该表所在的数据库 93


仍处于打开状态。 2.关闭数据库表 除了用 Use 命令关闭当前数据表外,也可选用以下命令关闭数据表: ⑴ Close Tables:如果有打开的数据库,关闭当前数据库中的所有表;若没有打开的数据 库,则关闭所有工作区内的自由表。 ⑵ Close Database:关闭当前数据库的同时关闭其中的所有数据库表。 ⑶ Close All:关闭所有工作区中打开的数据库、数据表和索引,并选择 1 号工作区为当 前工作区。

3.2.4 修改数据库表结构和属性 在 Visual FoxPro 中,常需要对数据表结构进行修改,以适应不同数据的存储需要。 1.修改数据表结构 ⑴ 使用菜单 若“数据库设计器”窗口已经打开,右单击要修改的数据表子窗口,在弹出的快捷菜单中 选择“修改”命令(如图 3.10 所示),打开“表设计器”,在“字段”选项卡中对表结构进行

图 3.10 数据库表快捷菜单 修改(如图 3.9 所示)。 ① 增加字段:若要在某个字段前插入一个新字段,单击该字段,然后单击“插入”按钮, 这时会出现一个空白字段行,输入字段名、类型和宽度;若要在现有字段的最后面插入一个新 字段,只需将光标移至最后。 ② 删除字段:选定要删除的字段名,单击“删除”按钮。 ③ 修改字段:选定要修改的段,然后根据需要修改其字段名、类型、长度、小数位数等 属性。 94


④ 调整字段顺序:将鼠标指向要调整的字段名左边的上下箭头按钮,按住鼠标左键移动 到适当位置。 数据表结构修改结束,单击“确定”按钮,出现确认对话框,如图 3.11 所示。若要保存

图 3.11 “表设计器”确认对话框 对数据表的修改,单击“是”按钮;若要放弃对数据表的修改,单击“否”按钮。 ⑵ 使用 Modify Structure 命令 若“数据库设计器”窗口没有打开,可用命令方式修改数据表结构。 格式:Modify Structure 功能:打开“表设计器”窗口,修改当前数据表结构。 注意:① 必须以独占方式打开数据表,才能修改表结构。 ② 如果数据表中已经输入记录数据,修改其结构可能会造成数据的丢失,必须 慎重。例如,减小字段的宽度,系统自动将该字段中的数据从尾部截去若干位以适 应新的宽度;对于数值型字段,如果截取以后仍不能适应字段宽度,数据将以一串 星号(*)显示表示溢出。 2.修改数据库表属性 数据库表建立后,可通过“表设计器”的“表”选项卡设置或修改其属性,如图 3.12 所 示。选项卡中显示了数据库表文件名、记录个数、字段个数、字段总宽度以及它所属的数据库。 ⑴ “表名”文本框 默认情况下, “表名”文本框中显示的是数据库表的文件名。可以在文本框中另外定义一 个长表名。例如,将表名“jsqk”改为中文表名“教师情况表”。 注意:① 定义长表名后,“数据库设计器”中数据表子窗口标题栏将显示该名称。但是, 这种操作没有改变数据表在磁盘上的文件名。

95


② 长表名最多可包含 128 个字符,可以由字母、数字、汉字和下划线组成,但 不能使用空格。

图 3.12 “表”选项卡 ⑵ “记录有效性”组框 在“记录有效性”组框中,可以进行字段间约束关系的设置,以确保数据输入的有效性和 正确性。例如,在“jsqk”表中,要保证“csrq”字段(出生日期)的值小于“gzrq”字段(工 作日期)的值,可在“规则”文本框中输入规则“csrq<gzrq”,同时在“信息”文本框中输入 “出生日期应小于工作日期!”。这样,当输入的数据违反了记录有效性规则,将显示此提示信 息。 ⑶ “触发器”组框 触发器是一个记录级的事件代码,当对记录进行插入、更新或删除操作时被激活,调用相 应的语句或过程。不同的事件可以对应不同的动作。触发器有三种类型: ① 插入触发器:每次向数据表中插入记录时被激活。 ② 更改触发器:每次更改数据表中记录时被激活。 ③ 删除触发器:每次删除数据表中记录时被激活。 创建触发器的步骤是: ① 在“插入触发器”、“更新触发器” 、“删除触发器”文本框中分别输入过程名。 ② 单击“确定”按钮关闭“表设计器”,在“数据库设计器”中,单击鼠标右键,在快捷 菜单中选择“编辑存储过程”,打开存储过程的编辑窗口,输入相应的过程代码。 ⑷“表注释”列表框

96


在此列表框中,可对数据库表的各项内容进行详细的说明。

3.3

数据库表记录的基本操作

数据表的结构建立之后,下一步的工作就是对数据表记录操作,包括记录的显示、添加、 修改、删除等。

3.3.1 使用浏览窗口 Visual FoxPro 提供了使用简便而又直观的“浏览”窗口,用于显示数据表中的所有或部 分记录,还可以对数据表记录进行增加、删除、修改等操作。 1.打开浏览窗口 ⑴ 使用菜单 首先打开数据表,然后单击主菜单“显示”下拉菜单中的“浏览”命令。此操作等价于 “Browse Last”命令。 ⑵ 使用 Browse 命令 Browse 命令的子句很多,这里仅给出最基本的命令形式。 格式:Browse [Fields <字段名表>] [For <条件>] [NoAppend] [NoEdit | NoModify] [NoDelete] [NoWait] [Last] 说明: ① Fields <字段名表>:指定需要显示在“浏览”窗口中的字段及顺序。省略该可选项, 则显示所有字段。<字段名表>中的每一个字段名还可以包含其他可选项,例如: [:H=<字符表达式>]:系统默认将字段名作为“浏览”窗口列标题名,使用该选项,则以< 字符表达式>作为列标题名。 [:R]:表示该字段为只读,不能编辑。 ② [For <条件>]:显示满足条件的记录。 ③ [NoAppend]:禁止用户添加记录。 ④ [NoEdit | NoModify]:禁止用户编辑、修改数据表记录数据。 ⑤ [NoDelelte]:禁止用户对记录作删除标记。 ⑥ [NoWait]:用于在程序中指定打开“浏览”窗口之后是否继续运行程序。在命令中若 省略该可选项,则“浏览”窗口打开后,暂停执行程序,直至“浏览”窗口关闭后,再继续执 行。若有该可选项,“浏览”窗口打开后不暂停而继续执行程序。 ⑦ [Last]:恢复最后一个 Browse 命令创建的“浏览”窗口。如果在命令窗口中最后发出 的 Browse 命令带有一长串子句,那么使用该可选项,可以避免重新键入命令。 97


【例 3.1】 打开 jsqk.dbf 对应的“浏览”窗口(假定数据表中已包含若干记录),显示所 有教授的 jsbh、xm、xb、csrq、xl 和 zc 信息,并将前四个字段对应的列标题设置为相应的汉 字标题。命令如下: Use jsqk Browse Fields jsbh:H="教师编号", xm:H="姓名", xb:H="性别", ; csrq:H="出生日期", xl, zc For zc="教授" 命令执行结果如图 3.13 所示。

图 3.13 “浏览”窗口 2.使用浏览窗口 ⑴ 切换与拆分“浏览”窗口 “浏览”窗口打开后,单击主菜单“显示”下拉菜单中的 “浏览”或“编辑” 命令,可 在“浏览”窗口和“编辑”窗口之间进行切换。 用鼠标指向窗口左下角的黑色矩形块(窗口拆分条) ,并按住鼠标左键向右拖动,“浏览” 窗口被分为左右两个区域。单击左侧或右侧区域,再单击“显示”菜单的“浏览”或“编辑”命令, 则 Browse 窗口以一窗两区方式显示数据表内容,如图 3.14 所示。默认情况下,两个分区是链 接在一起的,即在一个区域选择某一记录时,另一区域也同步显示该记录。 ⑵ “浏览”窗口的操作命令 打开“浏览”窗口以后,主菜单增加“表”菜单项,其中包含以下窗口操作命令: ① 调整字段大小:调整字段在“浏览”窗口中的显示宽度。这种操作不会影响数据表结 构中对字段宽度的定义。 ② 移动字段:改变字段在“浏览”窗口中的显示顺序。这种操作不会影响表结构中对字

98

图 3.14 拆分“浏览”窗口


段顺序的定义。 ③ 调整分区大小:重新划分两个显示区域的大小。最简单的调整分区大小的方法是,用 鼠标直接拖动两分区之间的拆分条。 ④ 链接分区:选中该命令,建立两个区域的链接;取消该命令,断开两个区域的链接。 ⑤ 切换分区:使光标从当前区域转换到另一个区域。

3.3.2 添加记录 1.使用菜单 当数据表处于打开状态时,单击“显示”下拉菜单中的“浏览”命令,打开“浏览”窗口。 然后用下面三种方式之一添加新记录: ⑴ 单击主菜单“显示”菜单中的“追加模式”命令,如图 3.15(a)所示,可以连续向数

(a)

图 3.15 添加记录

(b)

据表尾部添加多条记录。 ⑵ 单击主菜单“表”下拉菜单中的“追加新记录”命令,如图 3.15(b)所示,只能向数 据表尾部添加一条记录。 ⑶ 单击主菜单“表”下拉菜单中的“追加记录”命令,可将另外一个数据表中的记录添 加到当前数据表中。 2.使用命令 格式:Append [Blank] 功能:向数据表文件的尾部追加一条新记 录或一条空白记录。 说明: ① 省略 Blank 可选项,打开如图 3.16 所示 的“编辑”窗口,可以连续输入多条记录,输

99

图 3.16 “编辑”窗口 un


入完毕关闭窗口。 ② 使用 Blank 可选项,不打开任何窗口,系统自动在表文件的尾部追加一条空白记录, 此后需要用 Browse、Edit、Change 或者 Replace 等命令输入各字段的值。 3.备注型和通用型字段内容的输入 在“编辑”窗口或者“浏览”窗口中,不能直接输入备注型字段和通用型字段的内容。因 为,这两个字段的内容不是保存在.dbf 文件中而是保存在.fpt 文件(备注文件)中。备注型字 段和通用型字段在“浏览”窗口中只显示“memo”和“gen”标记。 ⑴ 备注型字段内容的输入 双击“浏览”窗口(或“编辑”窗口) 中的“memo”标记,打开如图 3.17 所示的 备注型字段编辑窗口,输入字段内容,然 后单击右上角“关闭”按钮或按组合键 “Ctrl+W”保存内容并返回“浏览”窗口。

图 3.17 备注字段编辑窗口

此时,“memo”标记自动变为“Memo”, 表明该字段已输入数据。若按组合键“Ctrl+Q” ,则不保存修改的内容。 ⑵ 通用型字段内容的输入 双击“浏览”窗口(或“编辑” 窗口)中的“gen”标记,打开通 用字段编辑窗口。单击主菜单“编 辑”下拉菜单中的“插入对象”命 令,打开如图 3.18 所示的对话框。 列表框里列出了各种可插入的 OLE 对象。选择“新建”单选按 钮,可创建这些对象;选择“由文 件创建”单选按钮,可将一个已存 在的对象文件插入到当前编辑窗

图 3.18 “插入对象”对话框

口。关闭编辑窗口后,“gen”标记自动变为“Gen”,表明该字段已输入数据。如果要清除通 用字段内容,单击主菜单“编辑”下拉菜单中的“清除”命令。

3.3.3 显示记录 除了在“浏览”窗口中显示和编辑当前数据表的记录, Visual FoxPro 还提供了 List 和 Display 命令在主屏幕工作区中显示数据记录。 格式:List | Display [<范围>] [[Fields] <字段名表>] [For <条件表达式>] [To File <文件 100


名>] 功能:将指定范围内满足条件的数据记录显示在主屏幕工作区中。 说明: ① <范围>指以下四种短语之一: z All

全部记录

z Record <n>

记录号为 n 的记录

z Next <n>

从当前记录开始的 n 条记录

z Rest

从当前记录开始至最后一条记录

② [[Fields] <字段名表>]:指定记录中显示的字段及顺序,其中“Fields”标识符可省略。 各字段名(包括备注型字段)之间用逗号隔开。省略该可选项,将显示所有字段。 ③ [For <条件表达式>]:显示满足条件的记录。 ④ [To File <文件名>]:显示结果输出到指定的文件。默认文件扩展名为 .txt。 注意:⑴ 字段名表除字段名外,还可以包含任何合法的表达式。命令执行时先计算表 达式的值,再显示其结果。 ⑵ List 和 Display 命令有以下两方面的区别: ① 同时省略<范围>和“For”可选项,List 命令默认显示所有记录,而 Display 命 令则显示当前记录。省略<范围>但使用“For”可选项时,两个命令的应用范围均指 All。 ② 当显示记录数目多于一屏幕时,Display 命令具有“分页”显示的功能,即每显 示满一屏记录,暂停显示,等待用户按任意键后继续显示下一屏内容;List 命令则 不具备这种“分页”功能,将连续显示出全部记录。 【例 3.2】显示 jsqk.dbf 中所有女同志的教师编号、姓名、性别、出生日期和学位。 Use jsqk List jsbh, xm, xb, csrq, xw For xb= "女"

&& 连续显示记录

屏幕显示: 记录号

JSBH

XM

XB

CSRQ

XW

1 199806

茅丽燕

女 08/21/59

硕士

2 199006

张玉萍

女 03/21/66

学士

7 199316

杨柳青

女 03/26/62

学士

9 200003

李新

女 07/02/68

学士

欧阳春

女 11/09/82

硕士

10 200703

也可使用下面的 Display 命令: Display All jsbh, xm, xb, csrq, xw For xb= "女"

101

&& All 可以省略


【例 3.3】 在 jsqk.dbf 中,从 5 号记录到最后一条记录范围内,查找并显示具有高级职称 (教授、副教授)的教师姓名、职称、学位和所在系部编号。 Use jsqk Go 5

&& 将指针指向 5 号记录

Display Rest xm, zc, xw, xbbh For zc="教授" Or zc="副教授" 屏幕显示: XM

ZC

6

陈建民

教授

博士

101

7

杨柳青

教授

学士

108

9

李新

副教授

学士

108

记录号

XW

XBBH

Display 命令中条件表达式可以替换成:For "教授"$zc。 【例 3.4】 显示 jsqk.dbf 中工龄在 25 年以上(含 25 年)的教师的编号、姓名、工作日期 和工龄。 Use jsqk List jsbh, xm, gzrq, year(date( ))-year(gzrq) For year(date( ))-year(gzrq) >= 25 && 工龄通过表达式计算得到 屏幕显示: JSBH

XM

1

199806

茅丽燕

07/16/76

31

4

199310

许斌

11/01/72

35

7

199316

杨柳青

01/16/81

26

记录号

GZRQ

YEAR(DATE())-YEAR(gzrq)

3.3.4 修改记录 1.使用菜单 ⑴ 打开数据表文件对应的“浏览”窗口。单 击主菜单“表”下拉菜单中“替换字段”命令,出 现如图 3.19 所示的“替换字段”对话框。 ⑵ 在“字段”下拉列表中选择字段名;在“替 换为”文本框中输入表达式,或单击后面的按钮,

图 3.19 “替换字段”对话框

利用“表达式生成器”构造表达式;在“替换条件” 中指定操作范围和条件。然后单击“替换”按钮。

102


命令执行以后,指定字段的当前值被相应表达式的值所取代。需要注意,输入的表达式的 类型应与字段类型相匹配。 2.使用命令 ⑴ Replace 命令 格式:Replace [<范围>] <字段名 1 > With <表达式 1> [Additive] [,<字段名 2 > With < 表达式 2 > [Additive].. .. ..] [For <条件表达式>] 功能:对于满足条件的记录,用表达式的值替换对应字段中的数据。 说明: ① 省略<范围>可选项,仅对当前记录进行操作。 ② [For <条件表达式>]:对满足条件的记录进行操作。 ③ [Additive]:用于备注型字段,表示将表达式的值添加到该字段原有内容的后面;省略 可选项,则是用表达式的值替换该备注型字段原有内容。 注意:① With 后面的表达式的类型应当与对应字段类型一致,否则系统将提示“数据类 型不匹配”。 ② 对于数值型字段,如果表达式值的整数部分位数小于等于字段定义宽度,系 统以四舍五入后得到的数值替换该字段;如果整数部分位数大于字段定义宽度,则 系统提示“数值溢出。数据已丢失。”,然后将该数值表示成科学计数法的形式替换 字段。当在“浏览”窗口单击该字段时,显示“*”组成的字符串表示溢出。 【例 3.5】 将 jsqk.dbf 中 3 号记录的职称字段的值改为“教授”。 Use jsqk Go 3 Replace zc With "教授"

&&省略范围,对当前记录操作

【例 3.6】 在 gz.dbf(工资表)中,有 jsbh(教师编号)、jcgz(基础工资)、zwbt(职务 补贴)、zjjt(职级津贴)、ksdf(扣水电费)等字段(表结构参见配套的实验指导书)。 为所有教师普调工资:将基础工资上调 10%。先显示普调前基础工资,然后显示普调后 基础工资及实发工资(基础工资+职务补贴+职级津贴-扣水电费)。 Use gz List jsbh, jcgz

&& 显示普调前的基础工资

Replace All jcgz With jcgz*1.1

&& 基础工资上调 10%

List jsbh, jcgz, jcgz+zwbt+zjjt-ksdf

&& 显示普调后的基础工资和实发工资

⑵ Edit 和 Change 命令 格式:Edit | Change [<范围>] [Fields <字段名表>] [For <条件表达式>] 功能:打开“编辑”窗口,编辑、修改指定记录的内容。 说明: 103


① [Fields <字段名表>]:给出“编辑”窗口包含的字段,通常是要修改的字段。 ② [For <条件表达式>]:满足条件的记录显示在“编辑”窗口。 ③ 在“编辑”窗口中,可以通过 PageDown、PageUp 键或拖动滚动条快速定位到要修改 屏幕显示普调前基础工资:

屏幕显示普调后基础工资和实发工资:

JSBH

JCGZ

1

199006

1880.00

1

199006 2068.00

3048.00

2

200703

1400.00

2

200703 1540.00

2110.00

3

199316

2060.00

3

199316 2266.00

3416.00

4

199806

2180.00

4

199806 2398.00

3618.00

5

199812

1800.00

5

199812 1980.00

2940.00

6

199310

2300.00

6

199310 2530.00

3890.00

7

200003

1800.00

7

200003 1980.00

2810.00

8

199802

1650.00

8

199802 1815.00

2365.00

9

199205

2060.00

9

199205 2266.00

3416.00

10

200010

1700.00

10

200010 1870.00

2570.00

记录号

记录号 JSBH

JCGZ

jcgz+zwbt+zjjt-ksdf

的记录,直接修改各个字段的值。修改完毕,关闭编辑窗口,系统自动保存修改后的结果。

3.3.5 删除和恢复记录 对于数据表中的无用记录,可以通过删除操作将其删除。Visual FoxPro 支持的删除操作 有两种:一是在欲删除的记录旁加上 删除标记,但并不真正删除记录,称 为逻辑删除;另一种是将记录从磁盘 上真正删除,称为物理删除。逻辑删 除的记录可以通过恢复操作恢复原来 的状态,而物理删除记录则是不可逆 的。 1.使用菜单

图 3.20 设置删除标记

⑴ 逻辑删除记录 打开“浏览”窗口,选择要删除的记 录,然后单击“表”下拉菜单中的“切换删 除标记”命令,该记录前面会出现黑色矩形 框;或者直接单击记录第一个字段左边的矩

104

图 3.21 “删除”对话


形框,使其变为黑色,表示为该记录设置了删除标记,即逻辑删除记录。如图 3.20 所示。 如果要按某个条件删除记录,可单击“表”下拉菜单中的“删除记录”命令,打开如图 3.21 所示的“删除”对话框,设置删除范围和删除条件,单击“删除”按钮。 ⑵ 恢复记录 恢复记录就是要取消已设置的删除标记。在“浏览”窗口中单击黑色矩形框,即可取消删 除标记;或者单击“表”下拉菜单中的“恢复记录”命令,在“恢复记录”对话框中设置范围 和条件,然后单击“恢复记录”按钮,取消满足条件记录的删除标记。 ⑶ 物理删除记录 单击主菜单“表”下拉菜单中的“彻底删除”命令,在随后出现的对话框中单击“是”, 则带有删除标记的记录将从数据表中彻底删去。 注意:① 物理删除记录时,数据表必须以独占方式打开。 ② 物理删除记录后,系统将重新构造、排序数据表中剩余记录。 2.使用命令 ⑴ Delete 命令 格式:Delete [<范围>] [For <条件表达式>] 功能:给数据表指定范围内满足条件的记录加上删除标记。 说明: ① 省略<范围>可选项,仅对当前记录操作。 ② For<条件表达式>:给满足条件的记录加删除标记。 【例 3.7】 假定 jsqk.dbf 中,jsbh 字段的前 4 个字符表示教师调入本单位的年份。要求: 在 1998 年调入的教师记录加上删除标记,并显示这些记录的教师编号和姓名。 Use jsqk Delete For Substr(jsbh, 1, 4)= "1998" List jsbh, xm For Substr(jsbh, 1, 4)= "1998" 屏幕显示: 记录号

JSBH

XM

1 *199806

茅丽燕

3 *199812

呼延景

5 *199802

高大宇

注意:① 用 List 或 Display 命令显示记录时,记录号旁有“*”的记录表示加上了删除 标记。 ② 条件表达式可替换成:Left(jsbh, 4)= "1998"。 ⑵ Recall 命令 格式:Recall [<范围>] [For <条件表达式>]

105


功能:取消删除标记,恢复逻辑删除的记录。 说明: ① 省略<范围>可选项,仅对当前记录操作。 ② 此命令必须在物理删除之前使用,否则无法恢复记录。 ⑶ Pack 命令 格式:Pack 功能:将当前数据表中带有删除标记的记录从磁盘上删除。 说明: 此命令是物理删除命令,执行后将不能再恢复记录。因此,使用时应慎重。 ⑷ Zap 命令 格式:Zap 功能:将数据表中所有记录从磁盘上删除,只保留表结构。 说明: 该命令将数据表中所有记录物理删除,不管记录是否带有删除标记。相当于 Delete All 与 Pack 命令连用,需慎重使用。

3.3.6 定位记录指针 数据表操作过程中,记录指针指向当前记录。如果要对其他记录进行操作,就需要移动记 录指针,使其指向目标记录。 1.使用菜单 在“浏览”窗口中,直接单击某一记录或者用键盘上的编辑键“↑”和“↓”进行选择, 窗口中的“f”指示出当前记录。 单击主菜单“表”下拉菜单中的“转到记录”,在其右侧的级联菜单中选择“第一个”、 “最 后一个”、“下一个”或“上一个”命令,记录指针将定位到指定记录上;如果选择“记录号” 命令,打开“转到记录”对话框,输入记录号;如果选择“定位”命令,打开“定位记录”对 话框指定范围和条件。 2.使用命令 ⑴ 绝对移动命令 格式 1:[Go | Goto] <数值表达式> 格式 2:Go | Goto Top 格式 3:Go | Goto Bottom 功能:将指针移动到指定的记录。

文件起始标记(文件首部,BOF) 第 1 条记录(首记录,Top) 第 2 条记录 第 3 条记录 …… 第 n 条记录(尾记录,Bottom) 文件结束标记(文件尾部,EOF)

图 3.22 数据表结构 106


说明: ① <数值表达式>:数据表的记录号。命令执行后,指针指向该记录号对应的记录。数值 表达式的值应为大于 0 的数,如果表达式的值不为整数,系统自动取整。 ② Top:指针指向数据表首记录。如果数据表没有使用索引,首记录指记录号为 1 的记 录;如果数据表使用了索引,首记录指逻辑顺序上的第一条记录。图 3.22 为数据表结构示意。 ③ Bottom:指针指向数据表的尾记录。如果数据表没有使用索引,尾记录指记录号最大 的记录;如果数据表使用了索引,尾记录指逻辑顺序上的最后一条记录。 ⑵ 相对移动命令 格式:Skip [±<数值表达式>] 功能:将记录指针从当前位置向前或向后移动若干条记录。 说明: ① <数值表达式>为正,指针向后(文件尾方向)移动;<数值表达式>为负,指针向前(文 件头方向)移动。 ② 省略可选项,相当于 Skip 1,指针向后移动,指向下一条记录。 【例 3.8】 在 jsqk.dbf 中用相对移动命令定位记录。 Use jsqk

&& 打开数据表,指针默认指向第 1 条记录

Go 3

&& 指针指向第 3 条记录

Skip +3

&& 指针指向第 6 条记录

? Recno( )

&& 记录号函数测试结果为:6

Skip –5

&& 指针指向第 1 条记录

? Recno( )

&& 记录号函数测试结果为:1

⑶ 检索定位命令 格式 1:Locate [<范围>] For <条件表达式> 格式 2:Continue 功能:Locate 命令是将指针定位于满足条件的第一条记录上。若没有满足条件的记录,指 针将指向文件尾部。Continue 命令使指针指向满足 Locate 条件的下一条记录。 说明: ① <范围>:指定命令的作用范围。省略可选项时,默认为 All。 ② 一个 Locate 命令通常与多个 Continue 命令配合使用,可以一直检索到文件尾或<范围 >结束,以便查找满足条件的所有记录。 ③ 判断是否找到满足条件的记录,用函数 Found( )测试。如果找到满足条件的记录,函 数值为.T.,否则函数值为.F.。 【例 3.9】在 jsqk.dbf 中查找女教授的记录,并将她们的姓名依次显示出来。 Use jsqk

107


Locate For xb="女" And zc="教授"

&&状态栏提示:记录=1,定位 1 号记录

Display xm Continue

&&状态栏提示:记录=7,定位 7 号记录

Display xm Continue

&& 状态栏提示:已到定位范围末尾

屏幕显示: XM

记录号 1

茅丽燕 XM

记录号 7

杨柳青

3.3.7 其他操作 1.统计记录数命令 格式:Count [<范围>] [For <条件表达式>] [To <内存变量>] 功能:统计当前数据表中指定范围内满足条件的记录数。 说明: ⑴ <范围>:省略该可选项,默认为 All。 ⑵ For <条件表达式>:对满足条件的记录操作。 ⑶ To <内存变量>:将统计结果保存在指定的变量中。省略该可选项,统计结果在主窗 口的状态栏中显示。 2.求和命令 格式:Sum [<数值表达式表>] [<范围>] [For <条件表达式>] [To <内存变量表>] 功能:对当前数据表中指定的表达式分别求和,结果保存在内存变量表中。 说明: ① [<范围>]:省略该可选项,默认为 All。 ② [<数值表达式表>]:指定一个或多个欲求和的数值表达式。省略该可选项,指当前数 据表中所有的数值型字段分别求和。 ③ [For <条件表达式>]:对满足条件的记录进行操作。 ④ [To <内存变量表>]:使用该选项,计算结果将保存在指定的内存变量表中。 3.求平均值命令 格式:Average [<数值表达式表>] [<范围>] [For <条件表达式>] [To <内存变量表>] 功能:对当前表中指定的表达式分别求平均值,结果保存在内存变量表中。 说明: 108


各个可选项的含义和使用方法同 Sum 命令。 【例 3.10】 在 gz.dbf 表中,按下面要求进行统计和计算: ① 求教师人数(即记录个数),结果保存在变量 t_num 中; ② 求基础工资平均值、实发工资的平均值,分别保存在 jc 和 sf 变量中; ③ 求全体教师的实发工资总和。 Use gz Count To t_num Average jcgz, jcgz+zwbt+zjjt-ksdf To jc, sf Sum jcgz+zwbt+zjjt-ksdf

3.4 索引 Visual FoxPro 提供了索引技术,用户可以根据应用的需要建立一个或多个索引,从而实现 按照某些特定的顺序定位、查询表中的记录或者提高数据检索和显示速度的目的。

3.4.1 基本概念 1.索引的概念 所谓索引,就是按照一定的规则对数据表的记录进行逻辑排序,并将排序结果保存成索引 文件。索引文件依附于数据表而工作,单独存在或使用都没有意义。 索引建立之前,数据表记录的操作顺序是按照记录在数据表中的存储顺序进行的,这种顺 序在输入记录时由记录号表示出来,称为物理顺序。建立索引后,数据表记录按照索引表达式 的顺序显示和访问,这种顺序称为逻辑顺序。 索引作为一种排序机制,允许用户为数据表创建一个或多个索引。每一个索引实际上都是 一种逻辑排序,不会改变数据表记录的物理顺序。索引排序不是要复制出一个与原表内容相同 的有序文件,而是按指定索引关键字排序后,建立关键字和记录号之间的对应关系,并存储到 一个索引文件中。表中使用索引就如同使用一本书的目录,通过搜索特定关键字的值,使指针 快速定位到数据表中的对应记录。 在索引中,索引表达式和索引标识是两个非常重要概念。 ⑴ 索引表达式 索引表达式又称索引关键字,是建立索引的依据,由数据表中一个或多个字段构成,索引 文件按照表达式值的大小排列记录。 ⑵ 索引标识 索引标识又称索引名,用以区分通过不同索引表达式建立的索引。索引标识最多不能超过 109


10 个字符,由用户定义。 2.索引的类型 Visual FoxPro 中的索引主要有三种类型,即主索引、候选索引和普通索引。 ⑴ 主索引(Primary Index):索引字段或表达式的值不允许出现重复的索引。它确保了该 字段输入值的唯一性,起到主关键字的作用。例如,在 jsqk.dbf 中,可以按照 jsbh(教师编号) 建立主索引,因为 jsbh 的值是唯一的。 主索引只能在数据库表中建立,而且每一个数据库表中只能包含一个主索引。 ⑵ 候选索引(Candidate Index):候选索引与主索引一样能够确保字段输入的唯一性,不 同的是,一个数据表可以有多个候选索引。例如,在 xb.dbf 中,可以分别按 xbbh(系部编号) 和 xbmc(系部名称)建立候选索引。 ⑶ 普通索引(Regular Index) :允许索引字段或表达式的值重复的索引,一个数据表中可 建立多个普通索引。例如,在 jsqk.dbf 中,可按照 xm(姓名)字段建立普通索引,即允许记 录中出现相同的姓名。 除了上述三种类型的索引外,为兼容早期版本 Visual FoxPro 还提供了唯一索引(Unique Index):当字段或表达式的值出现重复时,在索引中只保留一个记录。即索引中表达式的值是 唯一的,而数据表中的字段值是可以重复的。 3.索引文件的类型 索引保存在索引文件中。Visual FoxPro 的索引文件有两类: ⑴ 单索引文件 仅包含一个索引的文件称为单索引文件,其扩展名为.idx。 对于一个给定的数据表可以建立多个单索引文件。每个单索引文件都是独立存储的。打开 数据表时,与之相关的单索引文件不会自动打开,需要使用相应的命令打开这些单索引文件。 ⑵ 复合索引文件 包含多个索引标识的索引文件称为复合索引文件,其扩展名为.cdx.。 复合索引文件分为结构复合索引文件和非结构复合索引文件两种类型。它们的区别在于: 结构复合索引文件与数据表具有相同的文件名,并随着数据表文件的打开而自动打开;而非结 构复合索引文件的文件名是创建时由用户指定的,可以与数据表名不同,它不会随着数据表的 打开而自动打开。

3.4.2 创建索引 1.用“表设计器”创建索引 在“表设计器”中建立的索引,系统默认为结构复合索引,并自动创建与数据表文件名相 同,扩展名为 .cdx 的结构复合索引文件。 110


⑴ 单字段索引 打开“表设计器”,单击“字段”选项卡(参见图 3.9)。在字段列表中选定要建立索引的 字段,单击“索引”列右侧的三角箭头,然后在下拉列表中选择“升序”或“降序”。此时, 建立了以该字段名为索引标识,按该字段为索引表达式的普通索引。 注意:① 系统默认索引标识与字段名相同。若要编辑和修改索引,可单击“索引”选 项卡。 ② 要取消索引,单击“索引”列右侧三角箭头,在下拉列表中选择“无”。 ⑵ 复合字段索引 在“表设计器”的“索引”选项卡中,可以建立主索引、候选索引、普通索引等不同类型 的复合字段索引,其索引表达式可以由一个或多个字段构成。如图 3.23 所示。 ①“排序”按钮:指定按索引表达式的升序(↑)或降序(↓)排序。默认为升序。 ②“索引”列:为索引指定索引标识。 ③“类型”列:在下拉列表中选择主索引、候选索引或普通索引。对于自由表,列表中只 有候选索引和普通索引两个选项。 ④“表达式”列:在文本框中输入索引表达式,或者单击后面的按钮,打开“表达式生成 器”对话框构建索引表达式。 ⑤“筛选”列:在文本框中输入条件表达式,对满足条件的记录进行索引。也可打开“表 达式生成器”对话框构建条件表达式。 ⑥“排序”列:在下拉列表中选择排序方式,“Machine” 、“Pinyin”或“Stroke”。 注意:① 在“表设计器”中建立的所有索引都会保存在与数据表同名的复合索引文件中。 例如,在图 3.28 中建立的三个索引都保存在 jsqk.cdx 中。 ② 如果要改变索引的先后顺序,可以通过最左侧的双向箭头按钮(R)进行调 整。

111


③ 在“表设计器”中不能建立唯一索引(Unique) 。

图 3.23 “表设计器”的“索引”选项卡 2.使用 Index 命令创建索引 Visual FoxPro 提供的 Index 命令,既可以创建单索引文件也可以创建复合索引文件,但 在格式上有所不同。 ⑴ 创建单索引文件 格式:Index On <索引表达式> To <单索引文件名> [Additive] 功能:按索引表达式值的升序建立单索引文件。 说明: ① <索引表达式>:可以由单个字段构成,也可以由多个字段组合而成。表达式的长度最 多为 100 个字符。 ② [Additive]:默认情况下,建立一个索引文件时,系统会自动关闭此前已打开的索引文 件。使用该可选项,则建立索引文件的同时保持先前打开的索引文件不被关闭。 ③ 单索引文件扩展名为.idx。该索引文件要用 Set Index To 命令或在 Use 命令中使用 Index 子句打开。 ④ 单索引文件建立后,自动处于打开状态并作为当前索引生效。 ⑵ 复合索引文件的建立 格式:Index On <索引表达式> Tag <索引名> [Of <复合索引文件名>] [For <条件表达 式>] [Ascending | Descending] [Unique | Candidate] [Additive]

112


功能:建立复合索引文件或向复合索引文件中添加索引。 说明: ① <索引表达式>:可以由单个字段构成,也可以由多个字段组合而成。表达式的长度最 多为 240 个字符。 ② <索引名>:即索引标识。由于一个复合索引文件中可包含多个索引,因此索引标识不 能重复命名。 ③ [Of

<复合索引文件名>]:省略该可选项,建立与数据表文件名相同的结构复合索引

文件,其扩展名为.cdx。使用该可选项,建立非结构复合索引文件,扩展名也是 .cdx,但文件 主名需要另外定义。 ④ [For <条件表达式>]:对满足条件的记录进行索引。 ⑤ [Ascending | Descending]:指定按索引表达式的升序或降序索引,默认为 Ascending(升 序)。 ⑥ [Unique | Candidate]:指定唯一索引或候选索引。省略可选项,默认建立普通索引。命 令方式不能建立主索引。 ⑦ [Additive]:确定建立索引时是否关闭以前已打开的索引。省略该可选项,关闭以前的 索引,使新建立的索引成为当前索引。 【例 3.11】 在 gz.dbf 中,分别按基础工资(jcgz)的升序和降序建立单索引文件 jcgz_1.idx 和 jcgz_2.idx。 Use gz Index On jcgz To jcgz_1 Index On -jcgz To jcgz_2

&& 索引表达式为-jcgz,系统自动设为当前索引

List Next 5 Fields jsbh,jcgz

&& 按当前索引的顺序显示前 5 条记录

屏幕显示: 记录号

JSBH

JCGZ

6

199310

2530.00

4

199806

2398.00

3

199316

2266.00

9

199205

2266.00

1

199006

2068.00

【例 3.12】打开 jsqk.dbf,建立以 jsbh 为索引表达式的单索引文件 jsbh.idx,然后再建立 结构复合索引文件,包含以下索引: ① 以 jsbh 为索引表达式,按降序顺序建立索引名为 t_bh 的候选索引; ② 先按 xm 字段升序,姓名相同时再按 csrq 字段的升序建立普通索引,索引名为 xmcrq。 Use jsqk

113


Index On jsbh To jsbh Index On jsbh Tag t_bh Descending Candidate Index On xm+Dtoc(csrq) Tag xmcsrq

&& 系统自动设为当前索引

List xm, csrq For xm="李新"

&& 事先在表中追加一条“李新”的记录

屏幕显示: 记录号

XM

CSRQ

12 李新

05/05/78

9 李新

07/02/68

注意:① 如果仅把“xm”作为索引表达式,那么当数据表中有相同姓名的记录时,系统 将按照它们原来的物理顺序排序。 ② 索引表达式 xm+Dtoc(csrq)为字符型,系统按其值的升序排序构成索引。由于 系统默认日期格式是“月/日/年”,因此 Csrq 字段转换成字符并按“月/日/年”格式的 顺序排序。如果要按出生年、月、日顺序排序记录,只需在索引之前设置日期格式: Set Date to ymd

&& 将系统日期格式设置为“年/月/日”

屏幕显示结果将是: XM

CSRQ

9

李新

68/07/02

12

李新

78/05/05

记录号

3.4.3 使用索引 1.打开/关闭索引文件 结构复合索引文件随着数据表文件的打开而自动打开,随着数据表文件的关闭而自动关 闭。若要使用单索引文件或非结构复合索引文件,就必须使用菜单或命令将其打开。菜单方式 打开索引文件和打开其他文件的操作步骤一样,在此不再赘述。以下两个命令均用于打开索引 文件。 格式 1:Set Index To [<索引文件名表>] 功能:打开或关闭指定的一个或多个索引文件。 格式 2:Use <表文件名> Index <索引文件名表> 功能:打开数据表的同时打开相关的索引文件。 说明: ① <索引文件名表>:指定要打开的一个或多个索引文件。索引文件可以是单索引文件也 可以是非结构复合索引文件,列表中的文件名用逗号隔开。 ② 省略命令格式 1 中的可选项,Set Index To 用于关闭除结构复合索引文件以外的索引 114


文件。 ③ 索引文件名列表中的第一个索引文件将自动作为主控索引文件(也称为当前索引文 件),控制当前数据表记录的显示和访问。 2.设置主控索引 用户可以打开某个数据表的多个索引文件,但在任何时刻只能有一个索引文件作为主控索 引文件。如果该主控索引文件是复合索引文件,还需要指定其中的一个索引为主控索引(也称 为当前索引) ,才能确定记录的显示和访问顺序。由于非结构复合索引文件很少使用,下面的 讨论针对单索引文件和结构复合索引文件。 格式:Set Order To [<索引序号>|<单索引文件名>| [Tag] <索引名>] 功能:指定或取消主控索引。 说明: ⑴ <索引序号>:按索引打开、建立的顺序号指定主控索引。序号的编号方法是:先按 Use 或 Set Index 命令中打开索引文件名表的顺序为单索引文件(.idx)编号,然后按创建 的先后顺序为结构复合索引文件(.cdx)中的索引编号。编号从 1 开始。 ⑵ <单索引文件名>:指定作为主控索引的单索引文件。 ⑶ [Tag] <索引名>:指定复合索引文件中的一个标识作为主控索引。 ⑷ 省略可选项的 Set Order To 或 Set Order To 0 命令可以取消指定的主控索引,使数据表 记录的操作恢复物理顺序。 【例 3.13】在例题 3.12 中,为 jsqk.dbf 建立了单索引文件和结构复合索引文件,假定此 后没有再增加新的索引。使用 set order 命令设置不同的主控索引,按不同顺序显示记录。 Use jsqk Index jsbh

&& 打开 jsqk.dbf 及其单索引文件

Set Order To 1

&& 指定 jsbh.idx 为主控索引

List

&& 按 jsbh 的升序显示记录

Set Order To 2

&& 指定 jsqk.cdx 中 t_bh 为主控索引

List

&& 记录按 jsbh 的降序显示

Set Order To 0

&& 取消主控索引

List

&& 记录按物理顺序显示

Set Order To Tag xmcsrq

&& 指定 jsqk.cdx 的 xmcsrq 为主控索引

List

&& 记录先按 xm 升序,xm 相同再按 csrq 升序显示

Set Order To

&& 取消主控索引

3.4.4 索引定位命令 格式:Seek <表达式> 115


功能:将指针定位于索引关键字的值与表达式的值相匹配的第一条记录上。 说明: ① 只能在已经索引的数据表中使用 Seek 命令。 ② <表达式>的类型应与主控索引的索引关键字类型一致。 ③ 如果找到匹配的记录,则 Recno( )函数返回匹配记录的记录号,Found( )函数返回.T., Eof( )函数返回.F.。 【例 3.14】 根据索引查询教师编号为“199802”的记录并显示其编号、姓名。 Use jsqk Set Order To t_bh

&& 指定主控索引

Seek "199316"

&& 指针定位在 7 号记录

?Found( ), Recno( ) Display jsbh, xm 屏幕显示: .T.

7

记录号

ZGBH

XM

7

199316

杨柳青

3.4.5 删除索引命令 格式:Delete Tag <索引名> | All 功能:删除指定的索引标识或全部索引标识。 说明: ① 该命令用于复合索引文件。删除指定的索引不影响复合索引文件中的其它索引。 ② 若要删除单索引文件,只需在 Windows“资源管理器”中删除相应的磁盘文件即可。

3.5 自由表的操作 3.5.1 自由表与数据库表 1.基本概念 在 Visual FoxPro 中,数据表分为两种类型:数据库表和自由表。数据库表是在数据库中 建立或已添加到数据库中的数据表,它“属于”数据库,是数据库中的一个对象。自由表是独 立于数据库之外的数据表。 116


2.创建自由表 在没有打开数据库的情况下,打开“表设计器” ,然后依次定义字段名及其类型、宽度和 小数位等。自由表的“表设计器”与图 3.9 相同,只是窗口右侧的字段显示、有效性设置等组 框为灰色不可使用区域。 3.自由表与数据表的区别 除了自由表不能设置字段有效性外,两者的差别还体现在: ⑴ 数据库表字段名最长达 128 个字符;自由表字段名最多只能含 10 个字符。 ⑵ 在“表设计器”的“表”选项卡中,可以为数据库表定义长表名、设置记录有效性; 对于自由表则无法设置。 ⑶ 在“表设计器”中,数据库表可以建立包含主索引在内的三种索引;自由表只能建立 候选索引和普通索引。 ⑷ 同一个数据库中的数据库表之间可以建立永久关系以及参照完整性等;自由表间相互 独立,不能建立永久关系。

3.5.2 自由表和数据库表的转换 自由表和数据库表之间可以相互转换。当自由表被添加到数据库中时,它就成为数据库表; 反之,当一个数据库表从数据库中移出时,就成为自由表。 1.将自由表加入数据库 打开“数据库设计器”,单击主菜单“数据库”下拉菜单中“添加表”命令,或者右单击 “数据库设计器”空白区,在快捷菜单中选择“添加表”命令,在“打开”对话框中选择要添 加的自由表,单击“确定”,将它添加到当前数据库中。 注意:一个自由表只能添加到一个数据库中。如果试图把已“属于”某个数据库的表加入 到另外一个数据库中时,系统会出现错误提示。 2.将数据库表移出数据库 当一个数据库表不再需要或者要加入到另一个数据库中时,需移出当前数据库: 打开“数据库设计器”,右单击要删除的数据表子窗口,在快捷菜单中选择“删除”命令, 出现图 3.24 所示对话框。命令按钮“移去”指将数据表从数据库中移出,自动解除该表与数 据库的链接关系,使其成为自由表。 “删除”则是将该表从数据库中移出并从磁盘上删除相应 的数据表文件。 注意:一旦一个数据库表从数据库中 移出,它与其他数据库表间建立 的所有关系都会随之消失,数据 库表的一些属性也将消失,如不

117

图 3.24 确认移出数据表对话框


能再使用长文件名和长字段名,主索引会自动变为候选索引等。

3.6 多数据表操作 前面所有例题都只涉及一个数据表的操作,实际上,在 Visual FoxPro 中,允许同时打开 多个数据表,这些数据表可以是数据库表,也可以是自由表。

3.6.1 工作区的概念 所谓工作区,就是数据表在内存中所占用的存储区域。默认情况下,用 Use 命令打开的 数据表被调入第 1 工作区。如果再用 Use 命令打开另外一个数据表,则前一个数据表被自动 关闭。也就是说,不允许两个数据表同时占用同一个工作区。因此,要打开多个数据表,就需 要用 Select 命令指定不同的工作区。 格式:Select <工作区号> | <别名> 功能:激活指定工作区,使其成为当前工作区。 说明: ① <工作区号>:Visual

FoxPro 支持最多 32767 个工作区,工作区的编号是 1~32767 中

的任意数字。如果工作区号为 0,则是指编号最小的、未使用的工作区。 ② <别名>:用已打开的数据表的别名激活工作区。若没有定义别名,则用数据表文件名 作为别名。此外,字母 A~J 可作为前 10 个工作区的别名。 ③ 用 Use 命令打开数据表时,可以使用 In 子句指定工作区并定义别名(参见 3.2.3 节)。 例如: Use jsqk in 2 Alias js 即在 2 号工作区打开别名为 js 的 jsqk.dbf 文件。以后,当从其它工作区转回到第 2 工作区 时,下面三个命令等价: Select 2 Select B Select js 注意:一旦定义了别名,就不允许原数据表名以别名身份出现在后续命令中。因此, 不能用 Select jsqk 命令返回 2 号工作区。

118


3.6.2 不同工作区的互访 在一个工作区中,除了可以使用当前数据表的字段外,还可以利用表名或别名引用非当前 工作区中数据表的字段。引用格式为: “<别名>.<字段名>”或“<别名>-><字段名>” 。值得注 意的是,这种互访操作不会引起非当前工作区中数据表记录指针的移动,引用的对象仅是别名 工作区中指针指向的记录的相应字段。 【例 3.15】在当前工作区引用非当前工作区的字段。 Use jsqk Alias js

&& 在 1 号工作区打开 jsqk.dbf

Select 2 Use gz

&& 打开 gz.dbf,记录指针指向 1 号记录

Select js

&& 返回 1 号工作区

List Next 3 jsbh, xm, gz->jcgz,gz->jsbh

&& 显示前 3 条记录的内容

屏幕显示: JSBH

XM

1

199806

2 3

记录号

Gz->JCGZ

Gz->JSBH

茅丽燕

2068.00

199006

199006

张玉萍

2068.00

199006

199812

呼延景

2068.00

199006

注意:2 号工作区指针没有移动,一直指向第 1 条记录,因此连续三次显示同一个教师 编号和基础工资。

3.6.3 数据表之间的关联 1.关联的概念 如果要同时查询多个数据表中的相关数据,如某个教师的姓名、职称以及他的基础工资、 职务补贴等信息,就要建立数据表间的关联。 关联又称为临时联系,它可以在任何数据表之间建立,其目的是使数据表之间的指针产生 联动,即一个表(主表)的记录指针移动时,被关联表(子表)的记录指针也按照某种条件相 应移动。关联是保存在内存中的,只要关闭数据库或某个已建立关联的数据表,关联就会自动 取消。 关联的类型有: ⑴ 一对一关联:主表中的一条记录在子表中有唯一一条记录与之对应。 ⑵ 一对多关联:主表中的一条记录在子表中有多条记录与之对应。 2.建立关联

119


建立关联有两种方式,一是使用“数据工作期”窗口进行设置,二是用 Set Relation 命令 建立。 ⑴ 使用“数据工作期”建立关联 下面以 jsqk.dbf 和 gz.dbf 为例,在“数据工作期”中建立关联。操作步骤如下: ① 单击主菜单“窗口”下拉菜单中的“数据工作期”,打开“数据工作期”窗口。

图 3.25 “数据工作期”窗口 ② 分别打开 jsqk.dbf 和 gz.dbf。数据表文件名出现在“别名”列表框中,如图 3.25 所示。 ③ 选择列表框中的“jsqk” (作为主表),单击“关系”按钮,再选择“gz” (作为子表), 出现“设置索引顺序”对话框,如图 3.26 所示。选择索引“Gz:Jsbh”,单击“确定”按钮,然 后在“表达式生成器”中双击“jsbh”作为关联字段,单击“确定”按钮,返回“数据工作期” 窗口。此时,窗口右侧“关系”列表中显示出数 据表之间的一对一关系,如图 3.27 所示。 ④ 在“别名”列表中分别选定两表,单击“浏 览”按钮,打开相应的“浏览”窗口。当在 jsqk 表(主表)窗口中选择任意记录时,gz 表窗口将 显示出教师编号相同的记录。 ⑵ 使用 Set Relation 命令建立关联 格式:Set Relation To [<表达式> Into <工 作区号> | <别名>] 图 3.26 “设置索引顺序”对话框

120


功能:以当前工作区中的数据表为主表与其它工作区中的数据表建立关联。 说明:

图 3.27 数据表间的关联 ① <表达式>:在主表和子表之间建立关系的表达式,它的值将与子表索引关键字进行比 较。所以,该命令使用之前,子表需要建立索引。 ② <工作区号> | <别名>:子表所在工作区的区号或子表别名。 ③ 省略所有可选项,Set Relation To 将解除当前表与所有表的关联。如果要解除当前表 和某个表的关联,使用下面的命令: Set Relation Off Into <工作区号> | <别名>。 【例 3.16】用命令方式建立 jsqk.dbf 和 gz.dbf 之间的临时联系,并显示前 5 条记录的教师 编号、姓名、基础工资和职务补贴。 Open Database jsgl

&& 打开 jsgl 数据库

Select 2 Use gz

&& 在 2 号工作区打开 gz.dbf

Set Order To Tag jsbh

&& 指定 jsbh 为当前索引

Select 1 Use jsqk

&& 在 1 号工作区打开 jsqk.dbf

Set Relation To jsbh Into 2

&& 建立两表的一对一关联

List Next 5 jsbh, xm, gz->jcgz, gz->zwbt 屏幕显示: JSBH

XM

1

199806

2

199006

记录号

121

Gz->JCGZ

Gz->ZWBT

茅丽燕

2398.00

880.00

张玉萍

2068.00

660.00


3

199812

呼延景

1980.00

720.00

4

199310

许斌

2530.00

950.00

5

199802

高大宇

1815.00

400.00

3.6.4 永久关系与参照完整性设置 1.永久关系的概念 在 Visual FoxPro 中,数据库这个“容器”中包含了多个数据库表。通常情况下,数据库 表是彼此独立、互不影响的。为了保持数据的一致性,就要建立它们之间的相互制约关系—— 永久关系。 永久关系是在“数据库设计器”中建立的数据库表间的联系,保存在数据库中。永久关系 在“数据库设计器”中显示为数据表索引之间的一条连线,并且在打开“查询设计器”、 “视图 设计器”以及表单的“数据环境设计器”时自动作为默认的连接条件。但是,永久关系的建立 不能控制不同工作区中数据表记录指针之间的联动。 2.建立永久关系 建立数据库表间的“永久关系”,可按以下步骤进行: ⑴ 打开“数据库设计器”窗口。 ⑵ 为需要建立永久关系的数据库表按照相同的关键字建立索引。如果是一对一联系,主 表和子表都要建立主索引或候选索引;如果是一对多联系,主表要建立主索引或候选索引,而 子表要建立普通索引。 ⑶ 单击主表的索引标识,按住鼠标左键,将其拖动至子表相应索引标识上,此时在两数 据表之间出现一条连线,表明它们之间建立起了永久关系。连线上带十字型的一端表示永久关 系中“一”的一方,带分岔的一端表示关系中“多”的一方。 【例 3.17】在 jsgl.dbc 中建立 jsqk.dbf、gz.dbf、xb.dbf 三个表之间的永久关系。 ⑴ 打开 jsgl.dbc 相应的“数据库设计器”窗口。 ⑵ 在 jsqk.dbf 中,分别按 jsbh、xbbh 字段建立主索引 jsbh 和普通索引 xbbh;在 gz.dbf 中,按 jsbh 字段建立主索引 jsbh;在 xb.dbf 中,按 xbbh 字段建立主索引 xbbh。 若索引已经建立,此步骤可以跳过。 ⑶ 单击 jsqk.dbf 的 jsbh 索引,按住鼠标左键,将其拖至 gz.dbf 对应的 jsbh 索引上;单击 xb.dbf 的 xbbh 索引,将其拖至 jsqk.dbf 对应的 xbbh 索引上。 永久关系的设置结果如图 3.28 所示,jsqk.dbf(主表)和 gz.dbf(子表)之间是一对一关 系;xb.dbf(主表)和 jsqk.dbf(子表)之间是一对多关系。

122


图 3.28 建立数据表间的永久关系 若要删除数据表之间的永久关系,单击关系连线,连线将变粗,然后单击鼠标右键,在快 捷菜单中选择“删除关系”命令。 3.参照完整性设置 参照完整性是在不同数据库表的主关键字和外部关键字之间建立的关系规则,使得插入、 删除、更新记录时,各个数据表之间仍能保持已有的关系。参照完整性包括更新规则、删除规 则和插入规则,分别在“参照完整性生成器”的三个选项卡中设置。设置步骤如下: ⑴ 在“数据库设计器”窗口,双击两个表之间的关系连线,打开“编辑关系”对话框, 如图 3.29 所示,单击“Referential Integrity”(参照完整性)按钮,或者右单击“数据库设计 器”空白区域,在快捷菜单中选择“编辑参照完整性”命令;也可以在主菜单“数据库”下拉 菜单中选择“编辑参照完整性”命令。打开“Referential Integrity Builder”(参照完整性生成

图 3.29 “编辑关系”对话框 器)对话框,如图 3.30 所示。 ⑵ “参照完整性生成器”对话框下方表格中列出了各数据表之间建立的所有关系,选定 要设置的关系,分别在三个选项卡中设置更新、删除和插入规则。默认情况下,三种规则均设 置为“Ignore”(忽略)。

123


图 3.30 “参照完整性生成器”对话框 三个规则的含义如下: ① Rules for Updating(更新规则) “Cascade” (级联):当父表中关键字被修改时,用新的关键字值更新相关子表中所有相 关记录的关键字的值; “Restrict”(限制):如果子表中有与主表关键字的值相匹配的记录,则禁止修改父表中 的关键字的值,防止在子表中出现孤立记录; “Ignore”(忽略):允许随意更新父表关键字的值,忽略子表中是否有相匹配的记录。 ② Rules for Deleting(删除规则) “Cascade” (级联):当删除父表中的记录时,同时删除子表中关键字的值相匹配的记录; “Restrict”(限制):如果子表中有与主表关键字的值相匹配的记录,则禁止删除父表中 的记录; “Ignore”(忽略):允许随意删除父表中的记录,忽略子表中是否有匹配的记录。 ③ Rules for Inserting(插入规则) “Restrict”(限制):如果父表的关键字中没有与子表关键字相匹配的值,则禁止在子表 中插入记录; “Ignore”(忽略):允许随意在子表中插入记录,忽略父表中是否有相匹配的记录。 ⑶ 设置完毕,单击“OK”(确定)按钮,系统提示生成新的参照完整性代码,在对话框 中单击“Yes”(是)按钮,保存新的设置。

124


第四章

数据查询与视图

为便于访问数据库中的数据,Visual FoxPro 提供了查询和视图。查询和视图有许多类似之 处,视图兼有表和查询的特点,查询可以根据数据表或视图进行创建。

4.1

查询

查询是数据库应用中最重要的操作之一。通过查询,用户可以从数据源——表或视图中筛 选出满足条件的记录,按需要进行分组和排序,并将查询结果输出到不同的目标,例如,作为 报表或表单的数据来源,或基于查询结果创建新的表和图形等。 使用系统提供的“查询设计器”将自动生成 SQL-Select 语句,用户可将该命令嵌入到相 应的程序模块中,也可直接在命令窗口中执行。

4.1.1 创建查询 在 Visual FoxPro 中,可以用查询向导和“查询设计器”来创建查询。 1.使用查询向导 使用查询向导可以快速、简捷地建立一个扩展名为.qpr 的查询文件。步骤如下: ⑴ 单击主菜单“文件”下拉菜单中的“新建”命令或工具栏上的“新建”按钮,在“新 建”对话框中选择“查询”,单击“向导”按钮,出现“向导选取”对话框,选择“查询向导”,

125

图 4.1 向导选取

图 4.2 步骤 1-字段选取


单击“确定”按钮,进入“步骤 1-字段选取”对话框,如图 4.1、图 4.2 所示。 ⑵ 在“Database and Table” (数据库和表)下拉列表中选择已打开的数据库或自由表,然 后在下方列表框中选择需要的表或视图。双击“Available fields” (可用字段)列表框中的字段, 或选择字段后再单击“►”按钮将该字段添加到“Selected fields”(选定字段)列表框中。单 击“Next”(下一步)。 ⑶ 如果选定字段只来自一个表或视图,直接进入“步骤 3-筛选记录”;如果选定的字段 来自不同的表或视图,则出现如图 4.3 所示的“步骤 2-为表建立关系”对话框。 ⑷ 如果两数据表间已建立永久关系,只需单击“Add” (添加)按钮将关系添加到列表中; 如果数据表间没有建立永久关系,则需要在两个下拉列表框中选择匹配的字段,单击“Add” 按钮建立并添加关系。列表中的关系可以是一个也可以是多个。多余的关系,可通过“Remove”

图 4.3 步骤 2-为表建立关系

图 4.5 步骤 3-筛选记录

图 4.4 步骤 2a-包括记录

图 4.6

步骤 4-排序记录

(移去)按钮删除。单击“Next”。

126


⑸ 在“步骤 2a-字段选取”对话框中(如图 4.4 所示),指定查询结果中包含的记录:仅 包含匹配的记录;包含匹配的记录以及某个表(主表或子表)中所有记录;包含两个表中所有 记录。单击“Next”。 ⑹ 在“步骤 3-筛选记录”对话框中(图 4.5 所示),选择某个字段和操作符,然后输入 字段值,组成一个筛选条件。筛选条件可按两个字段进行设置,用“And”(与) 、“Or”(或) 运算连接,形成一个复合筛选条件。 图中设置的复合筛选条件与条件表达式“jsqk.xb="女".And. jsqk.zc= "教授"”等效。 设置好筛选条件后,单击“Preview” (预览)查看筛选后的结果。单击“Next”。 ⑺ 在如图 4.6 所示“步骤 4-排序记录”对话框中,选择“Available fields”列表框中一 个或多个字段,指定其升序(Ascending)或降序(Descending),然后添加到右边的列表框中。 单击“Next” 。 ⑻ 在图 4.7 所示的“完成”对话框中,选择三个操作选项之一:保存查询;保存并运行 查询;保存查询并在“查询设计器”中修改。单击“Finish”(完成)按钮保存文件。 默认情况下,查询运行结果在“浏览”窗口中显示,如图 4.8 所示。

图 4.7 步骤 5-完成

图 4.8 查询结果

2.使用“查询设计器” 尽管使用向导能够快捷地建立查询,但它有一定局限性。比如,不能分组汇总,查询结果 只能在“浏览”窗口中显示等。 Visual FoxPro 提供的“查询设计器”是一种可视化工具,可以创建单表查询或多表查询, 也可以用来编辑、修改由向导或“查询设计器”建立的查询。使用“查询设计器”建立查询的 步骤如下: ⑴ 打开“查询设计器”。在命令窗口中输入 Create Query,或单击主菜单“文件”下拉菜 单中“新建”命令,在“新建”对话框中选择“查询”,单击“新建文件”按钮,打开“查询

127


设计器”,系统同时打开“添加表或视图”对话框,如图 4.9 所示。 ⑵ 添加表或视图。在“添加表或视图”对话框中显示出当前数据库中包含的表,选择所 需的表名,单击“添加”按钮,数据表以子窗口的形式出现在“查询设计器”中。如果单击“视 图”选项或单击“其他”按钮,可将当前数据库中的视图或非当前数据库中的数据表及自由表 作为数据源添加到设计器中。

图 4.9 “查询设计器”及“添加表或视图”对话框 ⑶ 设置表间连接关系。如果添加数据表时选择了一个以上的表并且表之间未曾建立永久 关系的话,将出现如图 4.10 所示的“连接条件”对话框,用以指定两个数据表的连接关系。 四种连接类型及含义为: “Inner Join” (内部联接) :查询结果只包含匹配的记录; “Left Join” (左联接):除包含所有匹配记录外,查询结果还包含主表中所有记录; “Right Join”(右联接) :包含所有匹配记录外,查询结果还包含子表中所有记录; “Full Join” (完全联接) :查询结果包含所有匹配记录以及主表和子表的所有记录。 注意:这种连接是临时性的,并不保存到数据库中。

图 4.10 “连接条件”对话框

128


⑷ 在“查询设计器”中设置各选项卡: ①“Fields” (字段)选项卡:指定查询所包含的字段或表达式。如果查询中包含函数或表

图 4.11“字段”选项卡 达式,可以直接在左下方“Functions and expressions”(函数和表达式)文本框中输入,或者 用“表达式生成器”生成,然后单击“Add”(添加)按钮将其加入到字段列表中。如图 4.11 所示。 ②“Join”(联接)选项卡:建立、编辑或修改两个表之间的连接关系,如图 4.12 所示。 “Field Name”中为主表字段;“Criteria”下拉列表中为运算符;“Value”中为子表的相 应字段。如果有多个表的连接关系,要在“Logical” (逻辑)下拉列表中选择“AND”或“OR” 进行逻辑连接。单击“Insert”、“Remove”按钮可增加、删除连接关系。 ③“Filter” (筛选)选项卡:设置记录的筛选条件。如有多个条件,需由“AND”或“OR” 进行逻辑连接。图 4.13 中设置的条件是筛选“女教授”的记录。 ④“Order By”(排序依据)选项卡:设置排序字段和排序方法。可选择一个或多个排序 字段。默认排序方式为升序。 ⑤“Group By”(分组依据)选项卡:设置分组字段。图 4.14 中设置分组字段为 jsqk.dbf 中的 xbbh 字段。若分组后需要按照某个条件输出结果,则单击“Having”(满足条件)按钮, 在图 4.15 所示对话框中设置,图中设置的条件是“人数大于等于 3 人” 。

129

图 4.12 “连接”选项卡


⑥ “Miscellaneous” (杂项)选项卡:设置是否有重复记录(No duplicates)、查询结果中 显示的记录数或百分比等。 ⑸ 设置查询去向。单击主菜单“查询”下拉菜单中的“查询去向”命令,出现“查询去 向”对话框,如图 4.16 所示。Visual FoxPro 提供了四种查询去向:浏览、临时表、表和屏幕。 系统默认的查询去向为“浏览”窗口。 ⑹ 保存文件。关闭“查询设计器”窗口,或单击常用工具栏“保存”按钮,在“另存 为”对话框中指定文件名,将查询保存为.qpr 文件。

图 4.13 “筛选”选项卡

图 4.14“分组依据”选项卡

130

图 4.15 “分组条件”选项卡


图 4.16 “查询去向”对话框

4.1.2

使用查询

1.运行查询 查询文件是一个扩展名为.qpr 的独立的文本文件,它不依赖于数据库而存在。查询文件建 立后,就可以运行查询,以获得查询结果。参见图 4.8 所示。 ⑴ 使用菜单 用“打开”命令打开要运行的查询文件,系统显示出“查询设计器”窗口,然后单击主菜 单“查询”下拉菜单中的“运行查询”命令,或单击常用工具栏上的“!”按钮 。 ⑵ 使用 Do 命令 格式:Do <查询文件名> 说明:查询文件名中必须给出查询文件的扩展名.qpr。 2.查看生成的 SQL -Select 命令 “查询设计器”的各个选项卡是和 SQL –Select 语句(具体内容参见第五章)的各个子句

131

图 4.17 “查看 SQL”窗口


相对应的。建立查询的过程实际上就是系统根据用户的设置生成一个 SQL -Select 命令的过程。 当“查询设计器”窗口处于打开状态时,单击主菜单“查询”下拉菜单中“查看 SQL” 命令,系统打开当前查询文件的文本窗口,窗口中显示出 Select-SQL 命令,如图 4.17 所示。 可以通过剪贴板将该命令复制到命令窗口直接执行,也可以将其插入到程序模块中作为其中的 一条语句使用。 注意:在建立一些规则简单的查询时,利用“查询设计器”比较方便、快捷。但是,对于 较为复杂的查询,如嵌套查询,则只能由用户自己编写 SQL-Select 语句来完成, 无法使用“查询设计器”进行设计和修改。因此,“查询设计器”也有一定的局限性。

4.2

视图

Visual FoxPro 中除了建立查询外,另一种检索数据的方法是建立视图。相对查询而言, 视图更加灵活、方便。本节介绍视图的概念、创建的方法和视图的使用。

4.2.1 视图的概念 视图是一个可定义的、从一个或多个数据表中派生出来的“表”。它与数据表不同的是, 视图并不独立存储数据,而是将数据存储在它的数据源中,当用户访问视图时,系统按照视图 的定义从数据源中提取数据,组成一个“虚表”,以便动态反映数据源中的当前数据。视图的数 据源可以是本地的或远程的一个或多个数据表,甚至可以是已建立的视图。视图与数据库密不 可分,它在数据库中建立,是数据库的一个对象。视图除了反映源表数据外,它的数据还可以 经过编辑、修改后再送回到源表中以更新相应的记录。 Visual FoxPro 的视图有两种:本地视图和远程视图。基于当前数据库中的表或视图建立 的视图称为本地视图,基于远程服务器上的表或视图建立的视图称为远程视图。

4.2.2 创建视图 Visual FoxPro 提供两种方法建立视图,即使用视图向导和使用“视图设计器”。 1.使用视图向导 视图是数据库的一部分,因此首先要打开数据库,然后用下面方法之一启动视图向导并按 步骤顺序进行设置: ⑴ 单击主菜单“文件”下拉菜单中的“新建”命令,在“新建”对话框中选择“视图”, 单击“向导”按钮。

132


⑵ 在“数据库设计器”窗口中,单击鼠标右键,快捷菜单中选择“新建本地视图”命令, 或单击主菜单“数据库”下拉菜单中 “新建本地视图”命令,打开“新建本地视图”对话框, 单击“向导”按钮。 2.使用“视图设计器” 打开数据库,用下面方法之一打开“视图设计器”: ⑴ 单击主菜单“文件”下拉菜单中的“新建”命令,在“新建”对话框中选择“视图”, 单击“新建”按钮。 ⑵ 在“数据库设计器”窗口中,单击鼠标右键,快捷菜单中选择“新建本地视图”命令, 或单击主菜单“数据库”下拉菜单中 “新建本地视图”命令,打开“新建本地视图”对话框,

图 4.18 “视图设计器”窗口 单击“新建视图”按钮。

133


图 4.18 所示“视图设计器”窗口与“查询设计器”窗口类似。区别在于,“视图设计器” 窗口的下半部分增加了“更新条件”选项卡,而在主菜单“查询”下拉菜单中少了“查询去向” 命令,因为视图仅有“浏览”窗口一种显示形式,无需设置查询去向。 注意:① 查询以.qpr 文件的形式保存在磁盘上,能够单独运行。但视图不以独立的磁 盘文件的形式保存,而是以子窗口的形式保存在数据库中,如图 4.19 所示。所以, 只有打开数据库,才能使用视图。 ② 当视图不再需要时,可将其删除。其操作为:用鼠标右键单击要删除的视图 子窗口,在快捷菜单选择“删除”命令,出现确认移去对话框,单击“移去”按钮。

4.2.3 连接与远程视图 远程视图的数据来源于远程服务器,必须首先在数据库中建立一个命名的“连接” ,作为 通向远程数据源的“通道”,创建远程视图时,就可以利用此“通道”访问远程数据源。 “连接” 是数据库的一部分,在数据库中创建并保存。 建立连接及远程视图的步骤如下: ⑴ 打开数据库,在主菜单“文件”下拉菜单中选择“新建”命令,在“新建”对话框中 选择“连接” ,单击“新建文件”按钮,打开如图 4.20 所示的“连接设计器”窗口。

图 4.19 数据库中的视图

134


图 4.20 “连接设计器”窗口 ⑵ 在数据源下拉列表中选择数据源,单击“验证连接”按钮,出现“设置连接”对话框, 如图 4.21 所示。设置数据库类型和路径,然后单击“确定”按钮。如果出现“连接成功”提 示信息,表明成功连接到远程数据源。关闭“连接设计器”窗口,命名并保存所建立的连接。

135


⑶ 在主菜单“文件”下拉菜单中选择“新建”,在“新建”对话框中选择“远程视图”,

图 4.21 “设置连接”对话框

图 4.22 “选择连接或数据源”对话框 单击“新建文件”按钮。在如图 4.22 所示的“选择连接或数据源”对话框中选择连接的名称, 单击“确定”按钮。 ⑷ 按创建本地视图的步骤创建远程视图。

4.2.4 参数化视图 参数化视图是一种通用视图,系统提供在运行视图时传递参数值的功能,从而避免每查询 一部分记录就要单独创建一个视图。例如,要查询各系部的教师记录,建立多个视图既麻烦, 使用起来也不方便,可使用参数化视图解决。 ⑴ 在“视图设计器”的“Filter”(筛选依据)选项卡的“Example”(实例)文本框中输 入“?<参数>”。参数可以是字段或表达式,如果是表达式,应使用圆括号将表达式括起来,

136


将其作为一个参数进行计算。图 4.23 中设置筛选条件为:jsqk.xbbh=?xbbh。 ⑵ 对视图参数进一步定义,以便在浏览视图时给用户更多的提示。单击主菜单“视图参 数”命令,在“视图参数”对话框中定义参数名和类型。如图 4.24 所示。 注意:视图参数名必须与筛选条件中的参数名相同,否则不起作用。 ⑶ 运行视图。单击工具栏上的“!”按钮,出现图 4.25 的提示信息,输入相应的值,单

图 4.23 设置视图参数

图 4.24 “视图参数”对话框

图 4.25 输入视图参数值 击“确定”按钮。 注意:字符型、日期型、逻辑型等类型要加定界符输入。

137


4.2.5 视图与数据更新 当数据库打开时,系统从源数据表中检索数据构成独立的视图供用户使用。浏览视图时, 视图和其源数据表分别在不同工作区打开。默认情况下,对视图数据的更新不会自动反映在源 数据表中,对源数据表的更新在视图中也不会反映出来。 为了通过视图更新源数据表的数据,需要设置该视图为可以更新。对于用“视图设计器” 创建的视图,Visual FoxPro 系统已将其自动设置为可更新视图,只需在“视图设计器”的“更 新条件”选项卡中按以下步骤进行相关设置即可。如图 4.26 所示。

图 4.26 “更新条件”选项卡 ⑴ 指定更新的表。在“Table” (表)下拉框中选择要更新的数据表;也可选择“全部表” 以便更新所有相关字段。 ⑵ 指定更新字段。“Field name”(字段名)列表中,列出了视图中使用的字段,左侧的 “钥匙”图标列表示关键字,“铅笔”图标列表示可更新字段。若要使源数据表数据可以因视 图的更新而更新,需设置关键字,且关键字必须是唯一的;然后,指定可以更新的字段。 如要恢复原有设置,单击“Reset Key”(重置关键字)按钮。若要更新所有非关键字段, 单击“Update All”(全部更新)按钮。 注意:① 一般情况下,不要将关键字设置为可更新的字段。 ② 在“字段”选项卡中设置的表达式不出现在更新字段列表中。 ⑶ 单击选项卡左下角的“Send SQL updates”(发送 SQL 更新)复选框,Visual FoxPro 将打开更新开关,并通过关键字完成更新操作。 如果用户在一个多用户环境中工作,服务器上的数据表记录可以被其他用户使用和更新。 因此,需要检查视图操作的记录在更新之前,远程表中的指定字段是否被其他用户修改过。设 置选项如下: ⑴“SQL WHERE clause includes”(SQL WHERE 子句包括)选项用于控制数据源中的 138


记录被修改后,是否可以进行更新操作: ①“关键字段”(Key fields only):当源表中关键字被修改时,禁止更新。 ②“关键字和可更新字段”(Key and updatable fields):当源表中关键字和任意可更新字 段被修改过,则禁止更新。 ③“关键字和已修改字段”(Key and modified fields):当源表中关键字和视图中改变的 任一字段的值在源表中被修改,则禁止更新。 ④“关键字和时间戳”(Key and timestamp):当源表中关键字和时间戳被修改过,则禁 止更新。 ⑵“Update using”(使用更新)中的选项用于控制视图的更新方式: ①“SQL DELETE then INSERT”:先删除源表中要更新的记录,然后再插入视图中更新 后的新记录。 ②“SQL UPDATE”:用视图中的新数据更新源表中的数据。

4.2.6 使用视图 视图建立后,就可以像数据表一样使用,如可以用 Use 命令打开和关闭;可以打开“浏 览”窗口修改记录;可以使用 Index On 命令建立视图的索引;也可以用 Set Relation 命令建立 与其它表的关联等。 例如:在图 4.19 所示“视图 1”中有 jsbh、xm、xb、xbbh 字段。用命令完成“视图 1” 的索引、显示、关联等操作。 Open Database jsgl

&& 打开 jsgl 数据库

Use 视图 1

&& 打开“视图 1”,其源表 jsqk.dbf 自动在 && 另一工作区打开

Index On xm Tag v_xm

&& 按姓名建立复合索引

Seek "许斌"

&& 查找“许斌”的记录

? Found( )

&& 显示.T.

Display Select jsqk Set Order To Tag t_bh

&& 指定 jsqk.dbf 的当前索引(见例题 3.12)

Select 视图 1 Set Relation To jsbh Into jsqk

&& 以“视图 1”为主表、jsqk.dbf 为子表 && 建立关联

List jsbh, xm, jsqk.zc Close All

139

&& 显示 jsbh、xm 和 zc 字段


注意:① 与视图相关的索引和关联都是临时性的,将随着视图的关闭或数据库的关闭 而自动消失。 ② 视图是一张虚表,不能用 Modify Structure 修改它的“结构”。当选择“数据 库设计器”中的视图子窗口,在其快捷菜单中选择“修改”命令时,打开的将是“视 图设计器”而不是“表设计器”。因此,只能修改当前视图的定义。

140


第五章 关系数据库结构化查询语言 SQL 5.1 SQL 语言概述 SQL 是 Structured Query Language(结构化查询语言)的缩写,是一种用于关系数据库操 作的标准语言,利用它,用户可以使用格式几乎完全相同的命令在不同的关系数据库系统上执 行同样的操作。 SQL 语言包括了对关系数据库的查询、操纵、定义、控制和管理等功能,它是一个综合 的、通用的、功能极强的关系数据库语言。 1986 年 10 月,美国 ANSI(美国国家标准化委员会)首先确定 SQL 为关系数据库管理系 统的标准语言,随后 ISO(国际标准化组织)在 1987 年 6 月将其定为国际标准,并进行了补 充。1989 年 4 月,ISO 提出了具有完整性特征的 SQL ,称为 SQL-89。SQL 标准的制订对数 据库技术的发展和数据库的应用都起了很大的推动作用,多年以来,SQL 标准一直在不断完 善和修订,历经了 SQL-86、SQL-89、SQL-92 和 SQL-1999,当前的标准是 SQL-2003。 SQL 语言按照功能可以分为三大类。 ① 数据定义语言 DDL:建立、删除和修改数据对象。 ② 数据操纵语言 DML:完成数据操作的命令,包括查询。 ③ 数据控制语言 DCL:控制对数据库的访问,服务器的关闭、启动等。 以前的数据库管理系统为上述各类操作提供单独的语言,而 SQL 将全部任务统一在一种 语言中。 SQL 语言具有以下特点: ① SQL 是一种一体化的语言,可以完成数据库应用中的全部工作。 ② SQL 是一种高度非过程化的语言。SQL 不是一步步告诉计算机“如何”去做,而是描 述用户要求计算机“做什么”,计算机系统根据 SQL 命令的描述,自动完成全部“如何做” 的工作,这大大减轻了用户的负担,也有利于提高数据的独立性。 ③ SQL 语言非常简洁。虽然 SQL 语言功能强大,但它只有为数不多的几条命令,表 5-1 列出了 SQL 的命令分类。SQL 语言的语法非常简单,很接近自然语言,所以很容易学习、掌 握。 ④ SQL 是关系数据库的通用语言。由于所有主要的关系数据库管理系统都支持 SQL 语 言,用户只要掌握了 SQL 语言,就可以操作不同的关系数据库。 ⑤ SQL 命令有交互式和嵌入式两种使用方式。SQL 能够以命令方式交互使用,也可以嵌

141


入到某种程序设计语言中以程序方式执行,并且由于其通用性,这种用 SQL 编写的程序可以 移植到不同数据库平台上。 SQL 语言命令分类

表 5 .1 功

数据定义

Create,Drop,Alter

数据操纵

Select,Insert,Update,Delete

数据控制

Grant,Revoke

Visual FoxPro 支持 SQL 的数据定义、数据操纵以及部分数据控制功能—完整性控制功 能。

5.2

SQL 数据定义功能

标准 SQL 的数据定义功能一般包括数据库定义、表的定义、视图的定义、存储过程定义、 规则定义、索引定义等,本节将主要介绍 Visual FoxPro 支持的数据库、表、视图的定义,包 括创建数据库、创建表、创建视图、修改表、删除表等,用于数据定义的命令包括:Create、 Drop、Alter。

5.2.1 创建数据库和表 1.数据库定义 格式:Create

Database <数据库名>

功能:创建一个数据库。 2.表的定义 在第三章介绍了如何利用表设计器来创建表,创建表的操作还可以通过 SQL 语言的 Create Table 命令实现。在使用这个命令之前,首先要设计好表结构的各种细节,包括: ① 表名 ② 各列(字段)的名称、数据类型、宽度 ③ 哪(几)列将组成表的主关键字 ④ 表中的哪些列必须提供数据 创建表的命令格式如下: Create Table | DBF TableName1 [Name LongTableName] [Free] (FieldName1 FieldType [(nFieldWidth [, nPrecision] )] [Null | Not Null] 142


[Check LExpression1 [Error cMessageText1]] [Default eExpression1] [Primary Key | Unique] [References TableName2 [Tag TagName1]] [, 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 尽管格式看起来很复杂,但实际应用时往往只用到其中几个主要选项。关于 Create Table 命令说明如下: (1) 当前有打开的数据库时,表建立在此数据库中。 (2) 命令关键字 Create Table 与 Create DBF 功能相同。TableName1 则为所创建表的名字。 (3) Name LongTableName :为所创建的表定义长表名。只有当前有打开的数据库时,才 能使用此选项。 (4) Free:创建表为自由表。 (5) FieldName1 FieldType [(nFieldWidth [, nPrecision]:4 个选项依次分别定义字段名、字 段类型,数值型和字符型字段的宽度,数值型字段的小数位宽度。 (6) Null | Not Null:定义本字段是否可以为空。 (7) Check lExpression1 [Error cMessageText1]:定义本字段的有效性规则和出错时的提示 信息字符串。 (8) Default eExpression1:定义本字段的默认值。 (9) Primary Key:将本字段定义为主关键字(主索引)字段。 (10) Unique:将本字段定义为侯选关键字(侯选索引)字段。 (11) References TableName2 [Tag TagName1]:说明本表与之建立永久联系的父表及父表 的索引名。 (12) Foreign Key:定义一个外部关键字(非主索引),并与一个父表建立关联。 (13) From Array ArrayName:由一个数组创建表,数组中存放了有关表的每个字段的名 称、类型、宽度、小数宽度等信息。 【例 5.1】 表结构为:student(sno , sname , sex , birthday , dno),用 Create Table 命令创建 此表。 命令如下: Create Table student ( sno C (6) , sname C(6) , sex C(2) , birthday D , dno C(3)) 如果要在创建表的同时定义主索引、有效性规则等,命令可以写成下面的形式: Create Table student ( sno C (6) Primary Key Not Null , sname C(6) , sex C(2) ; Check sex ="男" Or sex="女" Error "错误" , birthday D , dno C(3) )

143


5.2.2 表的修改 在表创建以后,还可以使用 Alter Table 命令来修改它。读者可以增添列(字段) 、删除列、 改变列的定义,增添和删除约束。Alter Table 命令 有 3 种格式。 表的修改格式 1: 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]] 说明: ① 这种格式用来添加字段或修改字段的参数,Add 表示增加字段,Alter 表示修改字段的 参数,其它各选项含义与 Create Table 命令相同。该格式可以修改字段的类型、宽度、有效性 规则等,但不能修改字段名,不能删除字段及已经定义的字段有效性规则。 ② 在这种格式中,不管是否修改字段类型,都必须将字段名和字段类型一同在命令中列 出。 【例 5.2】在例 5.1 创建的表 student 中加入一个新字段 grade N(3)。 Alter Table student Add grade n(3) Check grade>=0 And grade<=100 【例 5.3】将例 5.1 中创建的表 student 中的字段 sname 宽度改为 10。 Alter Table student Alter

sname C(10)

表的修改格式 2: Alter Table TableName1 Alter [Column] FieldName2 [Null | Not Null] [Set Default eExpression2] [Set Check lExpression2 [Error cMessageText2]] [Drop Default] [Drop Check] 说明: 这种格式主要用于定义、修改和删除字段的有效性规则和默认值定义。 144


【例 5.4】将表 Student 中的字段 sex 宽度改为 1,并修改其有效性规则。 Alter Table student ; Alter sex c(1) Check sex="F" Or sex="M" 【例 5.5】删除表 Student 中的字段 sex 的有效性规则 Alter Table student Alter sex Drop Check 表的修改格式 3: Alter Table TableName1 [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]), 可以为字段改名(Rename Column FieldName4 To FieldName5),还可以增加或删除表一级的有效性规则、主索引等。 【例 5.6】删除表 Student 中的字段 grade 。 Alter Table student Drop grade 【例 5.7】将表 Student 中的字段 dno 改名为 dn 。 Alter Table student Rename Column dno To dn

5.2.3 表的删除 删除表的命令格式: Drop Table Table_name 说明: Drop Table 命令直接从磁盘删除表。如果要删除的表是数据库表,应当在数据库打开的 情况下删除该表,否则,只删除了表的磁盘文件,但记录在数据库.dbc 文件中的信息没有删除,

145


下一次使用数据库文件时会出错。 【例 5.8】将表 Student 删除 Drop Table Student

5.3

SQL 数据查询功能

Select 命令是 SQL 的数据查询命令,是 SQL 语言的核心内容,它从一个或多个表中返回 用户需要的数据。就像我们日常使用的自然语言是由主语、谓语、宾语等成分构成一样,Select 命令也由多个子句构成,某些子句是必需的,而另外一些子句是可选的,Select 命令的执行结 果是生成一个新的关系。 Select 命令的基本结构如下: Select [All | Distinct] [Top nExpr [Percent]] [Alias.] Select_Item [As Column_Name] [, [Alias.] Select_Item [As Column_Name] ...] From [DatabaseName!] Table [[As] Local_Alias] [[Inner | Left [Outer] | Right [Outer] | Full [Outer]] Join DatabaseName!] Table [[As] Local_Alias] [On

JoinCondition …]

[Where JoinCondition [And JoinCondition ...] [And | Or FilterCondition [And | Or FilterCondition ...]]] [Group By GroupColumn [, GroupColumn ...]] [Having FilterCondition] [Order By Order_Item [Asc | Desc] [, Order_Item [Asc | Desc] ...]] [[Into Destination] | [To File FileName [Additive] | To Printer [Prompt] | To Screen]] [Union [All] SelectCommand] 说明: 虽然 Select 命令的格式看起来很复杂,但其结构清晰,语义明确,掌握起来并不困难。各 子句的基本功能如下: ① Select 子句说明要查询的数据项(Select_Item),其中可以包含字段名、统计函数、表 达式、常量,如果这一部分用“*”来代替,则表示输出表中的所有列(字段)。Select 子句中 的保留字 All 表示显示查询结果的所有记录行;Distinct 表示去掉查询结果中重复的记录行; ToP nExpr 表示只保留查询结果中排列在前面的、由数值表达式 nExpr 确定数量的行。 ② From 子句是必需与 Select 子句联合使用的子句,不可缺少。它包含一个或多个表名, 这些表是查询数据的来源。 ③ Where 子句通过设置条件来选择用户所需要的记录行。如果条件比较复杂,可以用一 些操作符来描述条件。 146


④ Group By 子句用来对查询结果进行分组,通过分组可以完成较为复杂的分组统计运 算。 ⑤ Having 子句用来完成对分组的选择,即只在查询结果中保留符合条件的分组。 ⑥ Order By 子句可以设置查询结果中记录的排列顺序 ⑦ Into 子句是 Visual FoxPro 的 SQL—Select 命令特有的选项,用来确定查询结果的输出 去向,例如输出去向可以是数组、数据表、临时表、打印机等。默认输出到 Browse 窗口。 ⑧ Union 子句功能是将两个 Select 命令的执行结果进行并运算,得到一个新的关系。 在下面的小节中将详细介绍这些子句的使用方式,仍以教师管理数据库为例,来说明 Select 命令查询功能的实现。 SQL 命令书写说明: ① 命令涉及两个以上表的数据时,这些表中的共有字段名前面必须冠以用“.”分隔的表 名作为前缀,例如 jsqk.jsbh。 ② 命令需要分成几行时,除最末行外,其它行末尾加分号。

5.3.1 基本查询 最简单的查询命令只包含 Select、From 两个子句,且数据只来自一个表,这类查询称为 基本查询。 【例 5.9】查询教师管理数据库中 xb 表的所有数据。 命令:Select *

From xb

结果: XBBH

XBMC

108

计算机系

101

经济系

107

会计系

104

国经系

102

财税系

105

金融系

110

基础部

说明: ① 只包括 Select、From 子句的查询命令属于基本查询。 ② Select 子句中的“*”表示查询表中的所有字段。 【例 5.10】查询 jsqk 表中 jsbh、xm、zc、jbgz 字段的值。

147


这是查询命令中的投影操作。投影操作是从关系的属性集中选择属性子集,即由关系的部 分列组成一个新关系。 命令:Select

jsbh,

xm,

zc,

xw, “在职”

From jsqk

结果如图 5.1:

图 5.1

Select 默认输出到 Browse 窗口

说明: 在此查询结果中,最后一列并不是表中的属性,而是增加的属性,其值是常量“在职”。

5.3.2 条件查询 当需要在数据表中找出某些满足特定条件的记录时,可以使用 Where 子句来指定查询条 件,如果查询条件多于一个,则需要使用逻辑运算符 And 和 Or 将条件进行连接。 【例 5.11】查询 jsqk 表中 zc 字段为“教授”或“副教授”的教师的 jsbh、xm、zc、gzrq 字段的值。 命令:Select

jsbh, xm , zc , gzrq

From jsqk

Where

"教授"

$

zc

结果如图 5.2:

148


图 5.2 【例 5.12】查询 jsqk 表中 zc 字段为“教授”且性别为“女”的教师的 jsbh、xm、zc、xw 字 段的值。 命令:Select

jsbh, xm , zc , xw

From jsqk

Where

zc= "教授" And xb=”女”

结果如图 5.3:

图 5.3

5.3.3 连接查询 连接是关系的基本操作之一,连接查询是一种基于多个关系的查询,查询的数据和条件 涉及两个或两个以上的表。 1. 简单的连接查询 【例 5.13】在教师管理数据库中查询基础工资(jcgz)多于 2000 元的教师的 xm、zc、jcgz 和 zwbt。 在这个查询中,xm、zc 来自 jsqk 表,jcgz、zwbt 来自 gz 表,因此必须用连接查询来实现, 可以用两种形式实现。 方法 1: Select xm , zc , jcgz , zwbt From jsqk , gz Where jsqk.jsbh=gz.jsbh and jcgz>=2000 结果:(以下查询结果均以文本格式显示) XM

149

ZC

JCGZ

ZWBT


杨柳青

教授

2060.00

810.00

茅丽燕

教授

2180.00

880.00

许斌

教授

2300.00

950.00

陈建民

教授

2060.00

810.00

说明: 这里,From 子句列出了相关的表,连接条件体现在 Where 子句中。 方法 2: Select xm , zc , jcgz , zwbt From jsqk Join gz On jsqk.jsbh=gz.jsbh Where jcgz>=2000 说明: 在这种方式中,连接条件用 From 子句中的 Join 短语来表示。 【例 5.14】 查询所有科研成果的作者、职称、成果名称 Select xm , zc , cgmc From kyqk , jsqk Where kyqk.jsbh=jsqk.jsbh XM

ZC

CGMC

茅丽燕

教授

环境与生态经济学

东方剑

讲师

医院综合信息管理系统的开发研究

杨柳青

教授

VB 编程中的几个常见问题

许斌

教授

发电厂 MIS 系统的开发设计

李新

副教授

PB 报表输出中的多表与模糊查询研究

茅丽燕

教授

制约地方经济快速发展的几个问题

李新

副教授

使用 PB 设计输出报表的几个问题

许斌

教授

电力系统信息管理系统的设计研究

杨柳青

教授

使用 EWB 仿真数字电路实验的研究

许斌

教授

Visual Basic 程序设计教程

2. 多个表的连接查询 如果查询的数据涉及两个以上的表,就要用到多个表之间的连接查询,这种查询仍然可 以使用 Join 子句或 Where 子句来表示连接条件。 【例 5.15】查询所有科研成果的作者姓名、系部名称、职称、成果名称。 本查询数据涉及 jsqk、xb、kyqk 三个表,可以下面两种方式实现: 方法 1:Select xm , zc , xbmc , cgmc From jsqk Join xb On jsqk.xbbh=xb.xbbh ; Join kyqk On jsqk.jsbh=kyqk.jsbh 方法 2:Select xm , zc , xbmc , cgmc From jsqk , xb , kyqk ; Where

jsqk.xbbh=xb.xbbh

and jsqk.jsbh=kyqk.jsbh

结果: XM

ZC

XBMC

CGMC

150


茅丽燕

教授

经济系

环境与生态经济学

东方剑

讲师

计算机系

医院综合信息管理系统的开发研究

杨柳青

教授

计算机系

VB 编程中的几个常见问题

许斌

教授

计算机系

发电厂 MIS 系统的开发设计

李新

副教授

计算机系

PB 报表输出中的多表与模糊查询研究

茅丽燕

教授

经济系

制约地方经济快速发展的几个问题

李新

副教授

计算机系

使用 PB 设计输出报表的几个问题

许斌

教授

计算机系

电力系统信息管理系统的设计研究

杨柳青

教授

计算机系

使用 EWB 仿真数字电路实验的研究

许斌

教授

计算机系

Visual Basic 程序设计教程

说明: Where 子句中包含三个表的两个连接条件。From 子句中表的排列顺序和 Where 子句 的连接条件书写顺序不会影响结果。 3. 超连接查询 前面介绍的连接查询,其特点是只有满足连接条件的元组(记录)才出现在结果关系中, 这种连接也称为“内部连接”或“自然连接”。SQL 还支持另外的连接方式,即不满足连接条 件的元组也可以包含在结果关系中,这些连接方式包括: (1) 左连接 在进行连接运算时,首先将满足连接条件的所有元组放在结果关系中,同时将第一个表 (或称 Join 左边的表)中不满足连接条件的元组也放入结果关系中,这些元组对应第二个表 (或称 Join 右边的表)的属性值为空值。 (2) 右连接 在进行连接运算时,首先将满足连接条件的所有元组放在结果关系中,同时将第二个表 (或称 Join 右边的表)中不满足连接条件的元组也放入结果关系中,这些元组对应第一个表 (或称 Join 左边的表)的属性值为空值。 (3) 全连接 在进行连接运算时,首先将满足连接条件的所有元组放在结果关系中,同时将两个表中 不满足连接条件的元组也放入结果关系中,这些元组对应另一个表的属性值为空值。 连接查询的 SQL Select 命令的格式如下: Select …… From Table [[Inner | Left | Right | Full [Outer]] Join Table On …… Where …… 其中,Left 、 Right 、Full 分别代表左连接、右连接和全连接,保留字 Outer 只能与 Left 、

151


Right 、Full 连用,Outer 是否使用不影响功能,Left 、 Right 、Full 三种连接方式也称为外 连接。 【例 5.16】查询所有人的科研成果。 Select xm , zc , cgmc From jsqk Left Join kyqk On jsqk.jsbh=kyqk.jsbh 结果: XM

ZC

CGMC

茅丽燕

教授

环境与生态经济学

茅丽燕

教授

制约地方经济快速发展的几个问题

张玉萍

副教授

.Null.

呼延景

副教授

.Null.

许斌

教授

发电厂 MIS 系统的开发设计

许斌

教授

电力系统信息管理系统的设计研究

许斌

教授

Visual Basic 程序设计教程

高大宇

工程师

.Null.

陈建民

教授

.Null.

杨柳青

教授

VB 编程中的几个常见问题

杨柳青

教授

使用 EWB 仿真数字电路实验的研究

东方剑

讲师

医院综合信息管理系统的开发研究

李新

副教授

PB 报表输出中的多表与模糊查询研究

李新

副教授

使用 PB 设计输出报表的几个问题

欧阳春

助教

.Null.

4. 自连接查询与别名 SQL 不仅可以对多个关系进行连接操作,也可以将一个关系与其自身进行连接,这种连 接称为自连接。在进行自连接查询时,一般要为表定义别名,所谓别名就是在 From 子句中, 为表定义一个另外的名字,格式如下: <表名>

<别名>

【例 5.17】 查询与姓名为“许斌”的教师同一系部的人。 Select a.xm From jsqk a , jsqk b Where b.xm="许斌" And a.xbbh=b.xbbh 结果: XM 杨柳青 李新 许斌 东方剑

152


说明: 在此例中,表 jsqk 通过定义别名形成了两个逻辑关系 a 和 b,两个关系的连接实现了查询 要求。 有时为了简化 SQL 命令的书写,也通过定义别名的方法,使较长的表名可以用简短的别 名来替代。

5.3.4 嵌套查询 Select 命令中嵌套查询是嵌入到另外一个 SQL Select 命令中的查询命令。在很多情况下, 一个查询的 Where 条件子句中,需要用到另一个查询的结果,后一个查询就是嵌套查询,或 称为子查询。 当查询命令中包含子查询时,先执行子查询,然后根据子查询返回的条件再执行父查询。 子查询的结果用于处理父查询的 Where 子句中的表达式。 1.嵌套查询中使用的运算符 子查询返回的结果可能是单个值,也可能是多个值,当返回单个值时,可以用=、>、<、 >=、<=、<>等运算符生成父查询的查询条件;当返回多个值时,则常常利用集合运算符生成 父查询的查询条件,如 In,Any(Some),All ,Union、Exists。下面首先介绍这些运算符的 功能: ① In:测试是否在集合中。 ② Any 和 Some:与 In 功能近似,检测是否是集合中的某一个值。在 Visual FoxPro 中, Any、Some 及 All 一般仅用于子查询得到的集合。 ③ All:子查询结果关系中的所有行都使运算为真时,结果才为真。 ④ Union:将两个查询的结果关系进行集合并运算。 ⑤ Exists:判断子查询有无结果返回。 【例 5.18】查询有学位为博士的教师的系部名称。 Select xbmc 系部名称 From xb Where xbbh=Any(Select xbbh From jsqk; Where xw=”博士”) 结果: 系部名称 经济系 财税系 说明: 首先从 jsqk 表中找出所有博士学位教师的系部编号,再从 xb 表中查询这些系部的名称。 2.嵌套查询中必须遵循的规则: 153


① 嵌套查询必须用括号括起来。 ② 嵌套查询一般在 Select 子句中只能有一个列。 ③ 返回多行的嵌套查询可以和多值操作符一起使用,例如 In 操作符。 ④ Between 操作符不能和嵌套查询一起使用,却可以用于嵌套查询的条件中。 ⑤ 在 Visual FoxPro 中,嵌套查询层数不能超过 2 层。 【例 5.19】 查询没有职称为“教授”的教师的系部名称。 分析:先找出有教授的系部集合,不在此集合内的即是没有职称为“教授”的教师的系部。 Select xbmc From xb ; Where xbbh !=All(Select xbbh From jsqk Where zc="教授") 上述命令等价于: Select xbmc From xb ; Where xbbh Not In (Select xbbh From jsqk Where zc="教授") 结果: XBMC 会计系 财税系 金融系 基础部 【例 5.20】查询职称为“教授”或者有科研成果的教师姓名。 分析:在这个查询中,可以使用集合并运算,首先查询职称为“教授”的教师集合,再查 询有科研成果的教师集合,将两者进行并运算。 Select xm From jsqk Union

Select

Where zc

xm From jsqk

="教授" ;

Where

jsbh

In

(Select jsbh From kyqk)

结果: XM 陈建民 东方剑 李新 茅丽燕 许斌 杨柳青 【例 5.21】查询有科研成果的教师姓名(有多项成果时,仅列出一次) 。 Select xm From jsqk Where Exists (Select jsbh From kyqk where jsbh=jsqk.jsbh ) 结果: XM 154


茅丽燕 许斌 杨柳青 东方剑 李新 说明: 这里内层查询引用了外层查询的表的字段。 3.SQL 命令中的各类运算符 在 SQL 命令中可以使用一些运算符,运算符是保留字或字符,主要用于 SQL 命令的 Where 子句中,用来执行比较和数学运算等操作,以便确定条件和建立多个条件之间的连接,SQL 中使用的主要运算符包括: ① 比较运算符:=,!=,>,<,>=,<= ② 逻辑运算符: AND,OR,Not ③ 数学运算符:+,-,*,/ ④ 谓词:In,Any (Some),All,Union,Exists,Between … And … ,Like,Is Null,Is Not Null 。 前三大类运算符与 Visual FoxPro 运算符的用法相同,下面详细介绍第四类谓词运算符中 部分运算符的使用方法。 Is [Not] Null 测试字段值是否为 Null(空),Null 可以与任何类型的数据匹配。 Between … And … 判断字段值是否在指定的区间内。 Like 判断字段值是否与某个模式匹配。可以使用通配符“%”和“_” (下划线), “%”代 表多个字符, “_”代表一个字符。 【例 5.22】查询学历字段为空值的教师姓名。 Select xm From jsqk Where xl Is Null 结果:空。 【例 5.23】查询出生日期在 70 年代的教师姓名。 Select xm From jsqk Where csrq Between {^1970/01/01} And {^1979/12/31} 结果: XM 呼延景 高大宇 东方剑 【例 5.24】查询学历为大学或大专的教师姓名。 Select xm From jsqk where xl Like “大%”

155


结果: XM 张玉萍 许斌 高大宇 杨柳青 李新

5.3.5 数据统计查询 SQL 不仅有一般的查询功能,还可以进行计算方式的查询。SQL 提供了多种统计函数, 用来累加、合计和显示数据极限值等。在本节中将介绍几个常用的统计函数和分组计算查询。 1. 简单的计算查询 统计函数用于在 SQL 命令中实现计算累加、总和和平均值等统计信息,完成这些功能的 函数包括 Count、Sum、Max、Min、Avg。 ⑴ Count 函数 格式:Count (*| [ Distinct ]

<字段名>)

功能:统计行数或指定字段不为 Null 的数量。在查询中使用 Count 函数将会返回一个数 值。 说明: ① 当 Count 函数使用 Distinct 选项时,只有那些指定字段不重复的行才被计算在内,省 略 Distinct 时,重复的行也被计算在内。 ② Count 函数中使用星号(*)选项时,表示统计表中记录的总行数。 ③ Distinct 不能用于 Count(*),只能用于 Count(字段名)。 【例 5.25】查询计算机系的教师人数。 Select Count(*) 人数 From jsqk Where xbbh= ; (Select xbbh From xb Where xbmc=“计算机系”) 结果: 人数 4 【例 5.26】 查询有科研成果的教师数,有多项成果的只统计一次。 Select Count(Distinct jsbh)

数量 From kyqk

结果: 数量 156


6 ⑵ Sum 函数 格式:Sum( [ Distinct ] <字段名>) 功能:返回一组数据行中指定字段的值的总和。 说明: ① Sum 函数可以使用 Distinct 可选项,这时只有指定字段数据不重复的行才被计算在总和 内,由于一些数据行被忽略,总和可能不正确。 ② 使用 Sum 函数时,指定字段的值必须是数值类型。Sum 函数不能用于数值类型以外的 数据类型,比如字符类型或日期类型。 【例 5.27】查询计算机系的教师的基础工资总和。 Select Sum(jcgz) From jsqk, gz Where jsqk.jsbh=gz.jsbh And xbbh= ; (Select xbbh From xb Where xbmc="计算机系") 结果: SUM_JCGZ 7860.00 说明: 由于存储基础工资信息的 gz 表与存储系名称信息的 xb 表无法直接连接,故先将 jsqk 表 与 gz 表连接,再进行基础工资总和的查询。 ⑶ Avg 函数 格式:Avg ([ Distinct ] <字段名>) 功能:Avg 函数用于返回一组数据行中指定字段的平均值。 说明: ① Avg 函数使用 Distinct 选项时,只有指定字段数据不重复的行才被计算在平均值内。 ② 使用 Avg 函数时,指定字段必须是数值类型。 ⑷ Min 和 Max 函数 格式: Min(<字段名>) Max(<字段名>) 功能:Min 函数用于返回一组数据行中指定字段的最小值,而 Max 函数用于返回一组数据 行中指定字段的最大值。 说明:使用 Min 和 Max 函数时,系统会忽略那些 Null 值。 【例 5.28】查询全部教师中的基础工资最高、最低值。 Select Min(jcgz) 最低工资,Max (jcgz) 结果: 最低工资

157

最高工资

最高工资 From gz


1400.00

2300.00

【例 5.29】查询全部教师中的基础工资最高、最低值及其姓名、职称 Select xm, Where Or

zc, jcgz

From jsqk, gz;

jsqk.jsbh=gz.jsbh And

jcgz =(Select

Min(jcgz)

(jcgz =(Select Max(jcgz)

From gz) ;

From gz))

结果: XM

ZC

JCGZ

许斌

教授

2300.00

欧阳春

助教

1400.00

2.分组与计算查询 除对整个表进行统计计算外,还常常用到分组统计,比如,按系部统计人数、平均工资, 或按职称的不同统计科研成果数量等。分组查询可以通过带有 Group By 子句的 Select 命令实 现,当一个统计函数与一个 Group By 子句一起使用时,计算函数的作用范围变成一组中的记 录,而不是表中的全体记录。 格式:Group By <字段名 1>[ , <字段名 2>……] [Having <条件表达式>] 其中字段名 1、字段名 2……是分组依据的字段名。多个字段名可以形成多级分组,即在 大组下面再分小组。Having 子句的作用是对分组进行筛选,只对符合条件的分组进行统计查 询。 说明: ① 当 Where 子句、Group By 子句、Having 子句同时出现时,执行顺序如图 5.4 所示。 执行 Where 子句,从表中筛选符合条件的记录 执行 Group By 子句,对筛选后的记录进行分组 执行计算函数 执行 Having 子句,选取满足条件的分组 图 5.4 ② Having 子句只能与 Group By 子句连用,不能单独使用,且只能放在 Group By 子句之 后。 【例 5.30】查询每个系部中教师基础工资的最大、最小值,并显示系部编号。 分析:在此查询中,分组字段为 xbbh(系别编号),由于 gz 表中没有 xbbh 字段,必须将 jsqk 表与 gz 表进行连接,再执行查询。 158


Select xbbh 系别编号, Min(jcgz) 最低工资, Max (jcgz) 最高工资 ; From jsqk, gz

Where jsqk.jsbh=gz.jsbh

Group By xbbh

结果: 系别编号

最低工资

最高工资

101

2060.00

2180.00

102

1400.00

1800.00

107

1650.00

188 0.00

108

1700.00

2300.00

【例 5.31】查询每个系部中教师的人数,并显示系部编号。 Select xbbh , Count(*) From jsqk Group By xbbh 结果: XBBH

CNT

101

2

102

2

107

2

108

4

【例 5.32】查询教师的人数超过 3 人的系部,并显示系部编号。 分析:在此查询中,要对系部进行选择显示,条件是系部中人数超过 3 人,所以要使用 Having 子句。 Select xbbh 系部, Group

By xbbh

Count(*) 人数 From jsqk ; Having

Count(*)>=3

结果: 系部

人数

108

4

【例 5.33】查询每个系部中男、女教师的人数,并显示系部编号。 Select xbbh, xb, Count(*)

From jsqk Group

结果:

159

XBBH

XB

CNT

101

1

101

1

102

1

102

1

107

1

107

1

108

2

By

xbbh,xb


108

2

5.3.6 查询结果排序 在 SQL Select 命令中,能够使用排序子句 Order By 将查询结果按照某种顺序输出。 格式:Order By <字段名 1> [Asc | Desc] [ , <字段名 2> [Asc | Desc] ……] 说明: ① 在 Order By 子句中选择 Asc 或省略时,按指定字段的升序排序,选 Desc 时按降序排 序,字段名 1 是排序的主关键字,字段名 2 是第二关键字(主关键字值相同时,按第二关键字 排序),之后是第三关键字、第四 ……。 ② 与排序有关的另一短语是 Top nExpr

[Percent],可以用来显示查询结果的前面几项,

加参数 Percent 时按百分比显示排序在前的项。 ③ Order By 是对最终的查询结果进行排序,不能在子查询中使用该子句。 ④ 排序是查询结果输出前的最后一步,因此 Order By 子句一般放在 Select 命令的末尾。 【例 5.34】按照出生日期升序显示 jsqk 表中的姓名、职称、出生日期。 Select xm , zc , csrq From jsqk Order By csrq 结果: XM

ZC

CSRQ

许斌

教授

05/30/54

茅丽燕

教授

08/21/59

杨柳青

教授

03/26/62

张玉萍

副教授

03/21/66

陈建民

教授

12/15/66

李新

副教授

07/02/68

高大宇

工程师

01/31/72

呼延景

副教授

12/17/72

东方剑

讲师

04/04/75

欧阳春

助教

11/09/82

【例 5.35】先按系部编号升序,再按 gzrq 降序显示 jsqk 表中的姓名、系部编号、职称、 工作日期。 Select xm,

xbbh,

zc,

gzrq

From jsqk

Order

By xbbh ,

gzrq

Desc

结果: XM 陈建民

XBBH 101

ZC

GZRQ

教授

02/01/92

160


茅丽燕

101

教授

07/16/76

欧阳春

102

助教

06/20/07

呼延景

102

副教授

07/01/95

高大宇

107

工程师

05/15/92

张玉萍

107

副教授

07/21/88

东方剑

108

讲师

07/20/00

李新

108

副教授

07/30/91

杨柳青

108

教授

01/16/81

许斌

108

教授

11/01/72

【例 5.36】显示 gz 表中 jcgz 字段最高的前 5 位教师的姓名和基础工资。 Select Top

5 xm ,

jcgz

From jsqk ,

gz

Where

gz.jsbh=jsqk.jsbh ;

Order By jcgz desc 结果: XM

JCGZ

许斌

2300.00

茅丽燕

2180.00

杨柳青

2060.00

陈建民

2060.00

张玉萍

1880.00

【例 5.37】 显示 gz 表中 jcgz 字段最高的前 15%的教师姓名和基础工资。 Select Top

15

Percent xm ,

Where gz.jsbh=jsqk.jsbh

Order

jcgz

From jsqk ,

By jcgz

gz ;

Desc

结果: XM

JCGZ

许斌

2300.00

茅丽燕

2180.00

5.3.7 查询结果处理 在 Visual FoxPro 中,SQL_Select 命令可以设置查询结果的保存方式,一般情况下,省略 查询结果去向说明时,查询结果显示在一个浏览(Browse)窗口中,此外,还可以将结果以下列 方式保存: ⑴ Into Array <数组名> 这种方式将查询结果保存在一个数组中,一般是二维数组,数组的每一行存放一条记录。

161


如果查询结果只有一个值,也要以数组方式处理,这个值存放在数组的第一个元素中。 ⑵ Into Cursor <临时表名> 将查询结果保存在一个只读的临时表中,且这个临时表自动成为当前打开的表。临时表的 使用方式与数据库表和自由表相同。当该临时表关闭时,自动被删除,不能再次使用。 ⑶ Into Table <表名> 将查询结果保存在一个永久表中。 ⑷ To File <文本文件名> 将查询结果保存在一个文本文件中。 ⑸ To Printer [Prompt] 将查询结果送往打印机打印。有 Prompt 选项时,打印之前首先弹出设置对话框。 【例 5.38】 查询工资表的数据,分别存放到数组和临时表中。

5.3.8

Select

*

From gz Into Array

Select

*

From gz

Into

x

Cursor lsb

视图语句

1.创建视图 在 SQL 语言中,创建视图可以使用 Create View 命令来实现。 格式:Create View

<视图名>

As

< Select 查询命令>

说明:上述命令中的 Select 查询命令可以是任意的,它定义了视图中的数据,视图中的字 段名将与 Select 命令中指定的字段名相同。 【例 5.39】 创建视图,包括 jsqk、gz 表中的 gz.jsbh, xm,zc,jcgz,,zwbt 字段。 Create View jsgz

As

Select gz.jsbh , xm , zc , jcgz , zwbt From jsqk , gz ;

Where gz.jsbh=jsqk.jsbh

162


图 5.5 结果如图 5.5 所示。 2.删除视图 对于不再使用的视图,可以使用 SQL 语言中的删除视图命令来实现。 格式:Drop View

<视图名>

说明:上述语句的功能是删除数据库中的视图。

5.4

SQL 数据修改功能

数据操纵命令(DML)是 SQL 的一部分,它允许数据库用户在关系型数据库中改变数据。 通过使用 DML,用户可以为表添加新的数据、修改已存在的数据和从表中删除数据。在 DML 命令中也能执行简单的数据库查询。 在 SQL 中,有三种基本的 DML 命令:Insert、Update、Delete。 下面将详细讨论这三种命令。

5.4.1 插入数据 Visual FoxPro 支持两种 SQL 插入命令的格式,第一种格式是标准格式,第二种格式是 Visual FoxPro 的特有格式。 格式 1:Insert

Into

<表名> [(字段名 1 , 字段名 ……,字段名 n )] ;

Values(值 1 , 值 2 , ……, 值 n ) 格式 2:Insert

163

Into

<表名>

From Array <数组名>


使用格式 1 时,如果只向几个特定字段输入值,要列出字段名表,若向全部字段输入值, 则可省略字段名表。在 Values 后面列出对应每一字段的值,各个值之间用逗号分开。插入到 表中的值如果是字符或日期型数据时,要用定界符。可以使用 Null 为字段赋值。 格式 2 是将二维数组中的数据按行插入到表中。 在这种格式中要特别注意数组元素与表中 字段的类型匹配问题。 【例 5.40】向 xb 表插入一条新记录,为所有字段赋值。 Insert

Into

xb

Values( “109” , “法律系” )

说明:由于 xbbh 是表 xb 的主关键字,插入的 xbbh 字段的值不能与原有的值重复。 【例 5.41】 向 jsqk 表插入一条新记录,只为字段 jsbh, xm, xb, zc 赋值。 Insert

Into

jsqk (jsbh, xm,

xb,

zc, csrq) ;

Values( “199009” , “和悦” , “女” , “助教” , {^1982-01-08}) 【例 5.42】复制与插入命令应用举例。 Select *

From jsqk Where

zc=“教授”

Into

Table zg

说明:上述命令创建一个新表,结构与 jsqk 相同,其中包括职称为教授的教师记录。 Select *

From jsqk Where

zc != “教授”

Into Array

aa

说明:上述命令将职称不是教授的教师记录存放到数组 aa 中。 Insert

Into

zg

From Array

aa

说明:上述命令将数组中的数据插入到表 zg 中。 以上 3 条命令连续执行的结果是产生了一个与 jsqk 相同的表 zg ,但两者记录的排列顺序 不同。

5.4.2 更新数据 对表中已经存在的数据可以使用 Update 命令来更新。Update 命令不会向表中增添新的 记录,也不删除记录,它仅仅更新已经存在的数据。在数据库中,Update 通常在某一时刻只 能更新一个表,但可以同时更新一个表中的多个列。在一条命令中,可以根据需要更新表中的 一行数据,也可以更新多行数据。 格式:Update Where

<表名>

Set

<字段名 1>=<表达式 1>,<字段名 2>=<表达式 2>,…… ;

<条件表达式>

这里,“表名”指定了要更新的表,“字段名 1”、“字段名 2”……指出了要更新的字段,而 Where 子句选择出要更新的记录行。 注意:使用 Update 命令时,如果没有 Where 子句,将更新表中所有的数据行。 【例 5.43】 在 gz 表中,为具有教授职称的教师增加的 100 元职务补贴(字段名 zwbt)。 表中的原始数据如图 5.6 所示。

164


执行命令: Update

gz Set

Where

zwbt=zwbt+100

Where

jsbh In ( Select jsbh

From jsqk

;

zc=“教授”)

表中数据改变为如图 5.7 所示。

图 5.6

图 5.7

5.4.3 删除数据 Delete 命令用于从表中删除整行的数据,Delete 命令不是用来从特定列中删除数据,而是 一整行记录中的所有列都被删除。Delete 命令在 FoxPro 中是一种逻辑删除,要物理删除还要 使用命令 Pack。 要从表中删除一条单独的记录或是选定的多条记录,Delete 命令的格式为: Delete

From <表名> Where

<条件表达式>

【例 5.44】 删除 xb 表中系部名称为 Null 的记录。 Delete

165

From xb

Where xbmc

Is

Null


第六章 程序设计基础 前面已经介绍了在 Visual FoxPro 系统中通过菜单方式和命令方式对数据库进行操作。使 用单条命令进行操作,简单易学,对于初学者掌握每一条命令的格式、功能有很大的帮助,但 在实际应用中,各类事务的管理如果使用命令逐条输入、执行的方式来完成,操作过程中输入 的命令不能保留,在多次使用同一功能时,必须每次重复输入相同的命令,使操作效率非常低 下且解决问题的能力很差。

Visual FoxPro 还提供了另外一种操作方式:程序方式。程序方式是一种高效率的操作方 式。本章将介绍程序设计的基本方法和各种辅助命令。

6.1 结构化程序设计概述 6.1.1 程序的概念 简单地说,程序就是计算机能够分析执行的指令集合。程序设计就是计算机用户根据问题 的要求,按一定的逻辑关系,将一系列的指令组合在一起,形成一个指令序列的过程。执行程 序就是依次执行其中的每一条命令,直至全部命令执行完毕。 程序通常以文件形式存放在磁盘上,在 Visual FoxPro 中,程序文件也称为命令文件,其 扩展名为.prg。程序文件一旦建立,可以多次重复执行,这无疑会极大地提高工作效率。 程序可反复执行,故编写程序应力求具有通用性,使程序的应用范围更广。例如,编写一 个计算圆面积的程序,若只能计算半径为 3 的圆面积,其价值就不大,若对任意半径都能计算 圆面积,则程序的通用性就好。在后面的章节中,将对此展开进一步的讨论。

6.1.2 程序设计和算法 1.算法的概念 程序设计的关键环节是在深入分析程序功能的基础上,设计出算法。所谓算法就是解决 问题的方法和步骤。事实上,算法不是程序设计特有的概念,在日常生活中做任何一件事情都 要有步骤和方法,也就是有算法。比如,弹钢琴时,乐谱就是算法;做菜时,菜谱也是算法; 还有工作计划、生产流程等都是算法。在这里只讨论计算机算法,下面是两个计算机算法的例 166


子。 【例 6.1】有两个内存变量 X 和 Y,要求将它们的值互换(即 X 存放原来 Y 的值,Y 存 放 X 的值)。 算法说明: 步骤 1:先将 X 的值存放到另一个临时变量 T 中; 步骤 2:将 Y 的值存放到 X 中; 步骤 3:将 T 的值存放到 Y 中; 步骤 4:输出 X,Y 的值。 【例 6.2】从 10 个数中挑选出最大的数。 步骤 1:将第一个数存放到 X 中; 步骤 2:将第二个数与 X 中的数比较,大者放入 X 中; 步骤 3:将第三个数与 X 中的数比较,大者放入 X 中; …… 步骤 10:将第十个数与 X 中的数比较,大者放入 X 中; 步骤 11:输出 X 的值。 本例题还可以有另外一种算法: 步骤 1:将第一个数输入到 X 中; 步骤 2:变量 N 赋初值为 1; 步骤 3:判断 N 是否大于等于 10,若是则转移执行步骤 8,否则继续执行下一步骤; 步骤 4:输入下一个数 Y; 步骤 5:N 增加 1; 步骤 6:将 Y 与 X 比较,大者放入 X 中; 步骤 7:从步骤 3 开始重复; 步骤 8:输出 X 的值。 2.算法的表示 算法可以有多种表示方法,常用的有自然语言法和流程图法。在前面的例子中我们使用的 是自然语言法。自然语言就是我们日常使用的语言,用它来描述算法通俗易懂,但它的缺点是: ⑴ 繁琐冗长,往往要很长的文字才能说明要进行的操作,特别是复杂算法。 ⑵ 容易出现歧义。自然语言文字不严格,常常要根据上下文才能正确判断其含义,容易 出现判断错误。例如“张三对李四说他很好”,其中的“他”究竟指谁,不明确。 ⑶ 自然语言描述顺序执行的算法比较容易,但如果算法中包含判断和转移,描述起来有 困难。 流程图法是用图形来代表不同性质的操作,这些图形已经被规定为标准符号,主要有以下

起止框 167

判断框 1

处理框

连接点

输入输出框

流程线


几种(输入输出框经常以处理框替代): 图 6.1,图 6.2 是用流程图表示的例 6.1,例 6.2 的算法。

168


开 始

输入第一个数 X

输入 X , Y

N=1 T=X 是

N >= 10 ?

X=Y

否 输入下一个数 Y

Y=T

输出 X , Y

N = N +1 是

X>Y?

X=Y

图 6.1 例 6.1 用流程图表示的算法

输出 X 结

图 6.2 例 6.2 用流程图表示的算法

6.2 程序文件的建立、编辑与执行 6.2.1 程序文件的建立与编辑 程序文件是扩展名为.prg 的纯文本文件,其建立和编辑的方法有使用外部编辑器和内部编 辑器两种。外部编辑器是指任何可以编辑纯文本文件的字处理软件(如记事本、写字板、Word 等),内部编辑器是 Visual FoxPro 本身提供的文本编辑器,它们都可以建立和编辑程序文件。

169


采用内部编辑器建立程序文件的方法如下: 1.菜单方式 单击菜单命令“文件”,在弹出的下拉菜单中选择“新建”命令,或者单击常用工具栏上 的“新建”按钮;在“新建”对话框中选择文件类型为“程序”,之后单击“新建文件”按钮, 打开编辑窗口。 单击菜单“文件”,在弹出的下拉菜单中选择“打开”命令,则可以将已经建立的文件打 开并进行编辑。 2.命令方式 格式 1: Modify

Command

格式 2: Modify

File

< 程序文件名 >

<程序文件名.扩展名>

功能:建立或编辑程序文件。 说明: ① 程序文件名必须以字母开头,由字母、数字、下划线组成,其默认的扩展名为.prg, 使用 Modify Command 命令,可以省略扩展名,使用 Modify

File 命令不能省略扩展名。

② 执行 Modify 命令时,文件名前可以加路径,系统首先在指定路径或当前路径下查找 命令中指定的文件,如果未找到,则建立新文件,进入编辑状态;如果找到了命令中指定的文 件,系统自动将该文件调入并显示在编辑窗口内。 ③ 程序的书写规则包括: z 一行只能写一条命令,写完要输入回车符,表示命令结束。 z 为便于阅读,可以将长的命令分成若干行书写,但要在行尾加上分号,表示下一行是 本行的继续。 z 绝大部分命令或函数都可缩写成前四个字符。 【例 6.3】简单程序举例:编写程序求半径为 3 的圆面积。 假设我们为程序文件取名为 circle.prg,在命令窗口输入命令: Modify Command

circle

在打开的程序编辑窗口中,输入下列程序行: r=3 s=3.14159*r*r ? “圆面积:”, s Return 关闭编辑窗口,则在当前路径下建立了程序文件 circle.prg。

170


6.2.2 程序文件的调用执行 Visual FoxPro 程序文件的内容是 Visual FoxPro 的命令。如果未编译成能独立运行的可执 行文件,就必须在 Visual FoxPro 环境下,以解释方式执行。在 Visual FoxPro 环境下,程序文 件的执行可以使用菜单方式和 Do 命令。 1.菜单方式 单击主菜单项“程序”,在弹出的下拉菜单中选择“运行”命令,从弹出的对话框中选择 一个程序文件,之后单击“运行”按钮,即可运行所选的程序。 在打开了程序编辑窗口的情况下,单击常用工具栏上的“运行”按钮,也可以运行正在编 辑的程序。 2.命令方式 格式:DO [<路径>]<程序文件名>

[With

<实际参数表>]

功能:将磁盘上“文件名”所指的命令文件调入内存并运行。 说明: ① 程序文件的执行中,如果发生错误,系统将给出错误信息,用户可返回编辑状态进行 修改。 ② 本命令中的可选项 [With <参数表>] 用于执行带参数的程序。参数的作用是向将要运 行的程序传递数据,在下一节中,将详细介绍参数的使用方法。 例如,例题 6.3 中所建立的程序文件,可用下述命令执行: Do

circle

执行结果: 圆面积:28.27431

6.3 程序设计辅助命令 程序运行时要不间断地执行其中的每一条命令,因此在程序中除要用到对数据库、内存变 量操作命令外,还需要使用一些在交互方式下不需要的命令,例如变量的输入输出命令、程序 结构的控制命令等。

6.3.1 常用输入输出命令 输入与输出处理是程序设计中不可缺少的组成部分。在编制应用程序时,无论是让计算机

171


解题,还是处理数据库中的数据,通常需要用户提供一些原始数据,在这些数据中,有些是预 先知道的,可以直接写在程序里,而有些则要根据用户的需要在程序运行时输入。比如,编写 查询数据库程序时,查询条件常常是运行程序时,用户根据自己需要输入的信息。为了接收这 些随机输人的数据,就要使用数据输入命令。此外,为将数据处理的结果显示给用户,还必须 使用输出命令。 1.数据输入命令 ⑴ Input 命令 格式:Input

[<提示信息>]

To

<内存变量>

功能:用于接收从键盘输入的表达式,并将计算结果存入指定的内存变量中。 说明: ① Input 命令执行时,先在屏幕上显示提示信息,然后暂停程序的运行,等待从键盘输入 数据。用户输入后,按下回车键,系统将所输入的数据送到指定的内存变量中。 ② Input 命令能够接收任意类型的 Visual FoxPro 表达式,计算出结果后,再赋值给内存变 量。如果输入的表达式中有字符串、日期型、逻辑型常量,则必须使用定界符。 ③ 如果内存变量未定义,将在执行此命令时建立内存变量。 ④ Input 命令每次只能为一个变量输入值。 ⑤ <提示信息>可以省略。 【例 6.4】编写程序,由键盘输入半径,求圆面积(在程序运行时输入半径,可以实现求 任意半径的圆面积,提高程序的通用性)。 程序 circle1.prg 的内容如下: Input

“半径=”

To

r

s=3.14159*r*r ? “圆面积=”,s Return 运行程序时输入半径为 1,运行结果为: Do circle1 半径=1 圆面积=3.14159 重新运行此程序,若输入半径为 6+4,则运行结果: Do Circle1 半径=6+4 圆面积=314.15900 ⑵ Accept 命令 格式:Accept [<提示信息>]

TO <内存变量名> 172


功能:将从键盘上接收的字符串存入指定的内存变量中。 说明: ① 执行此命令时,先在屏幕上显示提示信息,然后暂停程序运行,等待用户从键盘输入 数据,并以回车键结束。系统将输入的数据存入指定的内存变量中,然后,继续运行程序。 ② Accept 命令只能接收字符型数据,因此所有输入的数据都被作为字符型,并且不需要 加定界符。 ③ 如果内存变量未定义,将在执行此命令时建立内存变量,Accept 命令所定义的内存变 量为字符型。 ④ <提示信息>可以省略。 【例 6.5】编程完成如下功能:从键盘输入某个表文件名,要求打开并显示此表中的数据。 Accept “请输入表名” To x Use &x List Use Return ⑶ Wait 命令 格式: Wait [<提示信息>] [To <内存变量>] [Window] [Nowait] [Timeout <数值表达式>] 功能:执行该命令时,暂停程序的运行,在屏幕上显示<提示信息>,并等待用户从键 盘输入任意字符,之后将其赋值给指定的内存变量,程序继续往下执行。 说明: ① 可选项<提示信息>含义同 Accept 命令的提示信息。 ② 可选项 To<内存变量>,将用户输入的字符存入<内存变量>中,若按回车,内存变量 的值为空。若无此可选项,键入的值不保存。 注意:<内存变量>中只能保存输入的第一个字符。 ③ 如无任何可选项,系统在执行此命令后,自动显示“Press any key to continue …”,表 示按任意键继续执行程序。 ④ 加 Window 选项时,将在屏幕右上角的提示窗口内显示提示信息;选择 Nowait 选项则 仅显示提示信息,而不暂停。Timeout 表示最大等待时间,如果在<数值表达式>表示的时间 内无键盘输入,则继续程序的执行,等待时间以秒计。 【例 6.6】 依次显示 jsqk、gz、kyqk 三个表的内容,没有输入任何键时,最多等待 10 秒钟, 即开始显示下一个表的内容。 Use

jsqk

List Wait

173

“请按任意键显示下一个表的内容” Timeout

10


Use Use

gz

List Wait

“请按任意键显示下一个表的内容”

Timeout 10

Use Use

kyqk

List Wait

“请按任意键结束”

Timeout

10

Use Return 2.数据输出命令 格式:?/??

[<表达式表>]

功能:计算并输出表达式的值 说明: ① 命令中的表达式可以包含字段变量和内存变量,表达式之间以逗号分隔。 ② 两个命令的区别在于:? 命令先换行,再开始输出,?? 命令不换行即开始输出。 ③ ? 命令后面若没有表达式表,则只进行换行操作。 【例 6.7】输出命令使用举例。 Use Go

jsqk 3

? xm , Go

zc, xw

7

? xm ?? zc ? xw 上述程序的执行结果为: 呼延景

副教授

杨柳青

教授

博士

学士 除这两条输出命令外,前面章节中介绍的多条命令都属于输出命令,如 List、Display、 Browse 等。

174


6.3.2 其它常用程序命令 1.

返回命令

格式:Return [<表达式> | To Master] 功能:结束当前程序的执行,返回到调用它的上级程序,如果没有上级程序,则返回到 命令窗口。 说明: ① Return 通常是程序的最后一条命令,一般允许缺省。 ② 可选项用于子程序嵌套调用时指定返回位置,详细信息请参考 6.5.1 节。 2.终止命令 格式:Cancel 功能:终止程序运行,返回命令窗口。 3.参数定义命令 参数可以在不同程序之间进行数据传递,使用参数也可以增强程序的通用性。 格式 1: Parameters 格式 2: LParameters

<形式参数表> <形式参数表>

功能:定义形式参数,以接收 Do 命令中实际参数所传送的数据。 说明: ① 编辑带参数的程序文件时,必须把定义参数命令作为程序中的第一条命令,其中的参 数是有效的任意变量名。参数表中可以有一个或多个参数,各参数之间用逗号分隔。程序中定 义的参数又称为形式参数,Do 命令中使用的参数称为实际参数。 ② 参数不仅可以接收数据,还可以向调用程序时使用的变量回送数据。 ③ 调用程序时,形式参数的数目必须等于或多于实际参数的数目,否则系统产生运行错 误,如果形式参数多于实际参数,多余的形式参数取逻辑值 .F.。 ④ 格式 2 定义的参数为“本地参数”,这种参数的使用范围与普通参数不同,与本地变量 性质相同。关于本地变量的详细信息请参阅 6.4.5。 【例 6.8】带参数程序文件的编制与调用示例:求任意半径的圆面积。 程序名 Circle2.prg,程序内容如下: Parameters

r

a=3.14159*r*r ? “圆面积: ”,a Return 为求半径为 5 的圆面积,只须键入命令:

175


Do

circle With 5

则输出为: 圆面积:78.53975 说明:使用参数增强了计算圆面积程序的通用性,使之可以计算任意半径的圆面积。 上述程序的运算结果不能保存,程序运行结束后,计算所得的数据即无法访问。如果将程 序稍作修改,变量 a 也设置为形式参数,程序改变为: Parameters

r,a

a=3.14159*r*r Return 则在命令窗口依次输入以下命令: x=0 Do

Circle2 with 5, x

? “面积为: ”,x 输出结果为: 面积为:78.53975 由此可以看出,在程序运行结束后,形式参数 a 中的数据保存在其调用时的实际参数 x 中,在程序运行结束后,x 仍可访问。 4.注释命令 为增加程序的可读性,常常要在程序中加入一些注释,对程序中使用的变量、算法等进行 说明。注释仅起说明作用,不影响程序运行。Visual FoxPro 提供了两种注释的方法: ⑴ 在程序行开头加“*”或“Note”,表示本行为注释行; ⑵ 命令行中字符串“&&” 后面的部分为注释。 例如下面带注释的程序: *本程序用来计算圆面积 Parameters

r

&&变量 r 用于存放半径值

a=3.14159*r*r ? “圆面积: ”,a Return

6.4 程序的基本控制结构 此前设计的程序尽管内容各异,然而有一点是相同的,那就是执行时都是依照命令的书写 次序逐条执行,直至程序结束。实际应用千变万化,单用这种方式来组织程序是远远不够的。 程序中通常要用到三种基本的控制结构,它们是顺序结构、选择结构与循环结构。利用这三种

176


基本的控制结构能够把任何复杂的数据处理问题描述清楚并自动实现。

6.4.1 顺序结构 按顺序结构组织程序,只需先把处理过程的各个步骤详细列出,然后把有关命令按照处理 的逻辑顺序自上而下地排列起来便可。前面所列举的所有程序例子都是按顺序结构组织程序 的,且此前我们介绍的所有命令均为顺序结构命令。

6.4.2 分支结构 分支结构能根据指定条件的当前值在两条或多条程序路径中选择一条执行,这样,程序中 便能处理多种情况的复杂问题。Visual FoxPro 提供三种格式的分支结构。 1.单分支选择命令 命令格式: 条件

If <条件> <命令序列>

.F.

.T.

Endif

命令序列

功能:条件表达式的值为.T.时,执行命令序 列, 然后执行 Endif 后的命令;条件表达式的值 为.F.时,不执行命令序列, 直接执行 Endif 后的

Endif 后面命令

命令。

图 6.3 单分支命令的执行流程

【例 6.9】键盘输入一个实数,计算并输出 其绝对值。 Input

'请输入一个实数'

To x

If x<0 x= - x Endif ? “其绝对值为”, x Return 【例 6.10】根据用户要求打印文件内容。 Clear Use

jsqk

Wait If 177

“是否打印教师情况表? (Y/N)”

Upper(a)=“Y”

To

a

&& 变量 a 用于保存用户的选择


Wait

“请准备好打印机,按任意键后打印”

List To Print Endif Return 2.双分支选择命令 格式:

.T.

If <条件>

.F. 条件

<命令序列 1> Else

命令序列 2

命令序列 1

<命令序列 2> Endif 功能:根据条件表达式的值在<命令序列 1

Endif 后面命令

>与<命令序列 2>这两条路径中选择一条执行。 条件值为.T.时,执行<命令序列 1>;条件值为.F.

图 6.4 双分支命令的执行流程

时,执行<命令序列 2>;然后执行 Endif 后的命令。 说明: ① If、Else 和 Endif 必须配对使用,且这三条子句应各占一行。 ② <命令序列 1 >和<命令序列 2 >中可以嵌套 If 命令,但不能交叉。 【例 6.11】键盘输入一个表文件名,若文件存在,则显示其记录,若不存在,则显示提示 信息”文件不存在”。 Clear All Accept “请输入文件名” To s If File(s) Use

&s

Disp All Else ? “文件不存在”

.T.

Endif

.F. X>Y

Return 【例 6.12】编写程序实现:从键

T

盘输入 3 个整数,输出其中最大的一 个。 Input

“x=” To x

Input

“y=”

To

F

T

X >Z 输出 X

输出 Z

输出 Y

Y >Z

F

输出 Z

y

178

结 束 图 6.5 例 6.12 算法


Input If

“z=”

To z

x>y If x>z ? ”最大值为” ,

x

Else ? ”最大值为” ,

z

Endif Else If

y>z ? ”最大值为” ,

y

Else ? ”最大值为” ,

z

Endif Endif Return 说明:此程序使用了双分支嵌套,分支嵌套可 以构成多向选择。嵌套结构应特别注意 If、Else 和 Endif 的匹配关系,缩进格式能使程序结构更清晰。 3.

条件 1

条件 2

Do Case

Case<条件 2> <命令序列 2> …… Case<条件 n>

.T.

命令序列 2

.F.

Case<条件 l> <命令序列 1>

命令序列 1

.F.

多分支选择命令

格式:

.T.

条件 n .F.

.T.

Otherwise

命令序列 n

命令序列 Q

<命令序列 n> [Otherwise <命令序列 Q>]

Endcase 后面命令 图 6.6 多分支命令的执行流程

Endcase 功能:依次判断命令中列出的条件,只要找到某一条件表达式的值为.T.,就执行与之相 关的命令序列,余下的条件便不再判断,有关的命令当然亦不执行。在没有一个条件取值为.T. 时,若有可选项 Otherwise,就执行命令序列 Q,否则,什么也不执行。因此,在众多的命令

179


序列中,多分支选择最多只选择执行其中的一个命令序列,也可能一个命令序列也不执行。 说明: ① Do Case 和第一个 Case 子句之间不能插入任何命令。 ② Do Case 和 Endcase 必须配对使用,且 Do Case、Case、Otherwise 和 Endcase 各子句 必须各占一行。 ③ <命令序列>中可含有任何 Visual FoxPro 命令,包括可嵌套 Do Case 命令。 【例 6.13】 根据 gz 表中的数据,计算职工应缴纳的税费。计算方法如下:gz 表中的前 3 项(jcgz、zwbt、zjjt)之和在 1500 到 2000 之间时,多于 1500 部分缴税 5%;3 项之和在 2000 到 2500 之间时,多于 1500 部分缴税 5%,多于 2000 部分附加缴税 4%;3 项之和多于 2500 时,多于 1500 部分缴税 5%,多于 2000 部分附加缴税 4%,多于 2500 部分附加缴税 3%;低 于 1500 元时不缴税。 Clear Open Use

Database jsgl gz

Accept '请输入职工编号:' To Locate If

For

jsbh=bh

Found( )

bh

&& 将记录指针定位到 jsbh 的值与输入值匹配的记录上 && 判断是否找到指定的记录

x=jcgz+zwbt+zjjt Do

Case

Case x<1500 tax=0 Case x<=2000 tax=(x-1500)*0.05 Case x<=2500 tax= (x-1500)*0.05 +(x-2000)*0.04 Otherwise tax= (x-1500)*0.05 +(x-2000)*0.04+(x-2500)*0.03 Endcase ? “应缴税为:”+str(tax, 10, 2)+ “元” Else ? “查无此人” Endif Close Database Return

180


6.4.3 循环结构 循环结构也称为重复结构,是指程序执行过程中,其中的某段代码被重复执行若干次。被 重复执行的代码段,通常称之为循环体。Visual FoxPro 支持循环结构的命令包括:Do While-Enddo 命令、For-Endfor 命令和 Scan-Endscan 命令。 While 命令

1.Do 格式: Do

While <条件>

条件

<命令序列>

..F.

.T.

[Loop]

命令序列

<命令序列> [Exit ] <命令序列> Enddo 功能:首先判断条件表达式的值,若为“真”,

Enddo 后面命令 图 6.7

Do While 循环的执行流程

就执行 Do While 与 Enddo 之间的命令序列(循环 体),然后再判断条件表达式的值。重复刚才的过程。一旦条件取值为“假”,就跳出循环体转 而执行 Enddo 的下一条命令。可见,只要条件取值保持为“真”,循环体就会不断地重复执行。 说明: ① 命令从 Do While 开始,到 Enddo 结束,两者必须成对出现。 ② 可选项 Exit 能立即跳出循环,执行 Enddo 后的下一条命令。 ③ 可选项 Loop 将控制跳转到循环结构的开始处,并根据条件的取值决定是否开始一次 新的循环。Exit 与 loop 可以出现在循环体内的任何位置上。 ④ 循环是否继续取决于条件表达式的当前取值。一般情况下, 循环体中应含有改变条件 表达式值的命令,否则将形成死循环。 ⑤ 循环结构也能自身嵌套,还能与分支结构的各种形式嵌套。 【例 6.14】利用循环结构计算 1 到 1000 中偶数的和。 i=0 s=0 Do While i<=1000 s=s+i i=i+2 Enddo ? “1000 之内的偶数和是:” , s 181


Return 运行结果: 1000 之内的偶数和是:

250500

【例 6.15】根据 gz 表中的数据,计算 gz 表中每个教师应缴纳的税金(计算方法同例 6.13) , 并显示每个职工的编号和税金。 Clear Clear All Open

Database jsgl

Use

gz

? space(25) + “教师编号” + space(10) + “应缴税金” Do

While Not

&& 输出表头

Eof( )

x=jcgz+zwbt+zjjt

&& 计算当前记录的工资前 3 项之和

Do case

&& Case 命令计算当前职工的税金

Case x<1500 tax=0 Case x<=2000 tax=(x-1500)*0.05 Case x <=2500 tax=(x-1500)*0.05 +(x-2000)*0.04 Otherwise tax= (x-1500)*0.05 +(x-2000)*0.04+(x-2500)*0.03 Endcase ?Space(25) + jsbh + Space(8) + Str(tax, 10, 2) + “元”

&& 输出职工编号和税金

Skip

&& 指向下一条记录

Enddo Close

Database

Return 运行结果:

182


【例 6.16】使用 Loop 和 Exit 命令示例。键盘输入职工姓名,从表 jsqk 中查询其信息并显 示出来。(本例是为了说明 Loop 和 Exit 命令用法,所以使用的算法不是最优的)。 Use

jsqk

Accept “请输入职工姓名” Do

While Not

IF

to

nn

Eof( )

xm=nn Disp Exit

Endif Skip Enddo Use Return 上述 Do While 命令还可改写为下面形式,程序功能不变: Do

While Not Eof( )

IF

xm<>nn Skip Loop

Endif Disp Exit Enddo 2.For-Next 循环命令 格式:

183


For

<内存变量>=<表达式 l> To <表达式 2> [Step <表达式 3>]

<命令序列> [Exit] [Loop] Endfor | Next 功能:本命令中的内存变量(又称循环变量)类似于计数器,它的取值范围由<表达式 1> (初值)与<表达式 2>(终值)确定。通过判断内存变量的取值是否在指定范围之中来确定循环 体是否重复执行。 说明: ① <表达式 3>表示步长,每执行一次循环体,循环变量增加一个步长,步长值可正可 负,步长值缺省,则默认为 1。 ② 循环变量的初值、终值和步长,决定了循环的执行次数,因此 For 循环命令通常用于 循环次数能完全确定的情况。 ③ 一般情况下,For 循环体中不应包含改变循环变量值的命令,否则循环执行的次数也 将随之改变。 ④ Exit 与 Loop 命令可放置在 For 与 Endfor 之间的任意位置。它们的功能与用法与 Do While 循环相同。如果循环可通过计数来控制,则使用 For 循环比用 Do While 循环更为方便。 【例 6.17】求自然数 1 到 100 的和。 (下面两段程序结果相同) 程序 1 :

程序 2:

Clear All

Clear All

s=0

s=0

For

i=1

to 100

For

s=s+i

i=100 to 1 Step -1

s=s+i

Endfor

Endfor

? “s=”, s

? “s=”, s

【例 6.18】从键盘输入 10 个数,找出其中的最大值和最小值。 Clear Input

“请输入第一个数”

Store

a

For

i=2

Input If

To

mina,

To

a

maxa

To 10 “请输入下一个数”

To a

a>maxa maxa=a

184


Endif If

a<mina mina=a

Endif Endfor ? “最大值: ” , maxa ? “最小值: ” , mina Return 3.Scan-Endscan 命令 格式: Scan [ <范围>]

[ For <条件表达式> ]

<命令序列> [Exit] [Loop] Endscan 功能:对当前表的指定记录,依次重复执行循环体,每循环一次,表的指针自动下移一 位。 说明:在数据库应用程序中,经常要对表中指定的记录逐个进行某种处理,Visual FoxPro 专门提供了表记录扫描循环,利用它能非常方便地完成逐条扫描记录。请注意,Scan 循环只 能用于有表打开的情况。 【例 6.19】在工资表中统计工资前 3 项之和在 0~1500、1500~2500 和 2500 以上各区间中 的人数。 Clear Clear All Dimension y(3)

&&定义数组变量

y=0

&&为数组中所有元素赋初值为 0

Use

gz

Scan x=jcgz+zwbt+zjjt Do

Case

Case x<1500 Y(1)=y(1)+1 Case x<=2500 Y(2)=y(2)+1

185

&&计算当前记录的工资前 3 项之和


Otherwise Y(3)=y(3)+1 Endcase Endscan ? “0~1500 人数: ”,y (1) ? “1500~2500 人数: ”,y (2) ? “2500 以上人数:”,y (3) Use Return

结果: 4.多重循环 循环可以嵌套。例如,若在循环体中又包含一个循环,即形成两层循环嵌套。按其所处的 位置分别称为外循环与内循环。Visual FoxPro 中循环嵌套层数最多允许 128 层,内循环必须完 全嵌在外循环中,不能出现交叉。 【例 6.20】打印九九表。 分析:九九表是一个二维图形,必须用二重循环才能输出,外循环控制打出多少行,内循 环控制打出多少列。 Clear For

I=1 to 9

For J= 1

to

I

?? Str(I, 1) + “ * ” + Str(J, 1) + “ = ” + Str(I*j, 2) + Space(2) Endfor ? Endfor Return 结果:

186


6.5 子程序、过程文件与自定义函数 6.5.1 子程序 在程序设计中,如果实现某个功能的程序段需多次重复使用,可把这个程序段独立出来单 独组成一个程序,称为子程序,以后凡需要完成该功能时,只要调用相应的子程序便可。可见, 子程序的基本思想是把”重复编”改为”编一次,重复用”。 使用子程序的另一个优点是:可以将一个较大的程序按一定的功能分解成若干个小的子程 序,以简化程序的设计和调试过程,提高程序设计效率,更方便管理整个程序系统。 供其它程序调用的程序称为子程序,调用它的程序称为上级程序,在命令窗口调用的程序 称为主程序。 子程序调用

1.

子程序调用使用 Do 命令。为使子程序具有通用性,通常子程序都带有参数。 【例 6.21】计算二项式系数:

c

r n

=

n! r!×( n − r )!

说明:在此例中,需要计算 3 次阶乘,3 段代码的算法完全相同,故我们可以设计一个子程序,用来计算任意整数的阶乘, 在主程序中 3 次调用它,实现计算要求。 子程序 fact.prg Parameter

m, y

&& 参数 m 存放整数,y 存放计算所得的阶乘值

y=1 For i=1 to m y=y*i Endfor Return 主程序

main.prg

*建立三个变量用来存放调用子程序返回的 3 个不同阶乘值,赋初值为 0 Store

0 to x1, x2, x3

Input “n=“ to n Input “r=“ to r If

187

n>=0

and

r>=0 and

Do

fact With n,

Do

fact With

x1

r, x2

n>r


Do

fact

With n-r, x3

c=x1/x2/x3 ? “c=” , c Endif Return 2.

子程序嵌套

主程序与子程序的概念是相对的,子程序还可以调用它自己的子程序,即子程序可以嵌套 调用,在这种情况下,被调用的子程序执行 Return 命令时,返回到调用它的上级程序处。见 图 6.8 子程序嵌套示意图 1。 主程序

子程序 A

子程序 B

┇ Do

Do

A

B ┇

┇ Return

Return

图 6.8 子程序嵌套示意图 1 除此之外,Return 命令还有下列 2 种返回方式: Return

[ To

Master | To <程序文件名>]

To Master 选项使子程序直接返回到最外层的主程序;To <程序文件名>选项则使子程序返 主程序 ┇ Do

A

子程序 B

子程序 A ┇ Do

┇ B

┇ Return

┇ Return To Master

图 6.9 子程序嵌套示意图 2 回到指定的程序文件。见图 6.9 子程序嵌套示意图 2。

6.5.2 过程与过程文件 子程序通常是单独建立的程序文件,如果程序系统中使用了较多的子程序,势必会产生许

188


多程序文件,造成管理的困难。Visual FoxPro 还支持另一种形式的子程序:过程。过程的功能 和调用方式与子程序完全相同,不同之处在于格式和保存方式。每个子程序保存为一个独立程 序文件,而多个过程可以保存在一个程序文件中。 1. 过程的定义 过程的定义方式有两种,其一,将多个过程保存成一个独立的程序文件;其二,直接与主 程序保存在一起,这种情况下,习惯上常把它写在主程序的后面。过程的定义格式如下: Procedure

<过程名 1>

┇ Return Procedure

<过程名 2>

┇ Return ┇ ┇ 说明:每个过程以 Procedure 开头,以 Return 结尾。 2. 过程的调用 过程的调用与子程序调用一样,使用 Do 命令。对于独立保存的过程文件,主程序调用其 中的过程前,首先要打开这个过程文件,使用完后要关闭;与主程序保存在一起的过程,则无 须打开和关闭过程文件。 ⑴ 打开过程文件 格式:Set Procedure To <过程文件名表>

[Additive]

功能:打开一个或多个过程文件。 说明:有 Additive 选项时,打开新的过程文件时,并不关闭之前已经打开的,否则打开 新过程文件时,自动关闭原来打开的。 ⑵ 关闭过程文件 Procedure

格式 1:Close 格式 2:Set

Procedure To

格式 3:Release

Procedure

<过程文件名表>

功能:格式 1、格式 2 关闭所有打开的过程文件;格式 3 关闭指定的过程文件。 【例 6.22】独立过程文件使用示例。 过程文件 Proc1.prg Procedure p1 Para y=1

189

m,

y

&&本过程用来计算阶乘


For

i=1

To

m

y=y*i Endfor Return Procedure p2 Para

&&本过程的功能是判断一个整数是几位数

y, n

n=0 y=Int(y) Do

While y>0

n=n+1 y=Int(y/10) Enddo Return 主程序 main.prg *本程序用来计算二项式系数, 计算阶乘的过程存放在过程文件 Proc1 中 Store Set

0 To x1, x2, x3 Procedure

To

Input

“n=” To n

Input

“r=”

If

To

n>=0 And

proc1

&&打开过程文件

r r>=0 And n>r

Do p1 With n, x1 Do p1 With

r, x2

Do p1 With n-r, x3 c=x1/x2/x3 ? “c=” , c Else ? “输入数据错” Endif Set Proc To

&&关闭过程文件

Return 【例 6.23】过程与主程序共同保存示例。 程序文件 Proc2.prg Store

0 to x1, x2, x3

Input

“n=” To n

190


Input If

“r=”

To

n>=0 And

r r>=0 And n>r

Do pp1 with

n,

x1

Do pp1 with

r,

x2

Do pp1 with

n-r, x3

c=x1/x2/x3 ? “c=” , c Else ? “输入数据错” Endif Return

&&主程序结束

* 过程定义 Procedure pp1 Para

m,

y

i=1

To

&&计算阶乘

y=1 For

m

y=y*i Endfor Return

6.5.3 自定义函数 除过程外,Visual FoxPro 还支持自定义函数。它允许用户按一定的规则自行定义一个专用 的函数。用户可以象调用系统标准函数那样调用自定义函数,非常方便。如果某些程序段的功 能是完成特定计算,将其定义成自定义函数,比定义为过程或子程序更有利于程序的简化。 1.自定义函数的定义 自定义函数与过程定义方法相似,主要区别为: ① 过程文件中,自定义函数必须以 Function 开头来定义 ② 自定义函数必须返回一个函数值,而子程序或过程却无此限制。 格式:Function

<函数名>

<命令序列> Return <表达式> 说明: ① 自定义函数必须以 Return 191

<表达式>结尾,表示用函数名返回此表达式的值。


② 自定义函数名不能与 Visual FoxPro 系统的标准函数同名,也不能与内存变量同名。 ③ 通常自定义函数放在过程文件中,也可以象子程序一样保存为一个单独的程序文件, 此时程序文件名就是函数名。 自定义函数的调用

2.

自定义函数的调用方法有 2 种,其一,与系统标准函数一样,作为表达式的一个组成部分; 其二,与过程一样,使用 Do 命令,但第二种方法无法体现作为函数调用的优越性。 【例 6.24】自定义函数定义和调用示例。仍以计算二项式系数为例,阶乘计算定义为自 定义函数。 Input

“n=” To n

Input

“r=”

If

To

n>=0 And

r r>=0 And n>r

c=f1(n)/f1(r)/f1(n-r)

&&自定义函数调用,在表达式中 3 次调用 fl

? “c=” , c Else ? “输入数据错” Endif Return Function Para

f1

&&阶乘函数定义

m

y=1 For

&&变量 Y 用来存放计算的阶乘值 i=1

To

m

y=y*i Endfor Return

y

&& y 作为函数的返回值

6.5.4 变量的作用域 前面的章节已经介绍过内存变量,内存变量必须先定义再使用,否则系统将提出“变量找 不到”的提示信息。在使用了子程序的系统中,并不是任何程序模块中定义的内存变量都能够 在所有代码段中使用,事实上,每个内存变量都有一定的作用范围,它们中有的能在所有程序 模块中使用,有的只能在某些程序模块中使用。变量能够合法使用的程序范围就叫做变量的作 用域。在 Visual FoxPro 中,根据变量的作用域,可将内存变量划分为全局变量、局部变量和 本地变量。 1.

全局变量 192


在主程序和任何子程序(包括过程和自定义函数)中都可使用的变量称为全局变量。它只 能用下面两种方法之一定义: ① 在命令窗口中定义的变量,尽管它们不从属于某一个应用程序,但它们都是全局变量。 ② 在任何程序模块中,用 Public 命令定义的变量也是全局变量。 格式: Public <内存变量表> 全局变量有以下特点: ① 全局变量可以在任何程序代码中使用,包括主程序和各级子程序。 ② 全局变量必须使用 Release、Clear All、Clear Memory 命令释放,否则,在程序运行结 束后,全局变量仍然存在。 ③ 在程序模块中建立的全局变量,必须先定义后使用,定义后的初值为逻辑假 .F.。 2.

局部变量

在某个程序(包括主程序和子程序、自定义函数、过程)内部用赋值命令建立的变量称为 局部变量。局部量只在定义它的程序模块及其下级程序中有效,该程序模块执行结束后,局部 变量也被自动清除。 局部变量有以下特点: ① 局部变量只能在建立它的程序和其下级子程序中使用,在除此之外的程序模块中使用 时,会产生找不到变量的错误。 ② 局部变量在定义它的程序模块开始执行时建立,该程序模块执行结束时自动被释放, 因此其存在有时间性。 ③ 使用局部变量可以使各程序模块相互独立,互不影响,不会因局部变量的相同名称而 引起混乱,这对于大型系统的团队开发特别有利。 3.

屏蔽型局部变量

Visual FoxPro 还支持一种特殊的局部变量:屏蔽型局部变量,其定义格式为: Private <内存变量表> Private All

[Like

或者:

<通配符> | Except

<通配符>]

该命令的作用是:如果在较高层的程序模块中定义了与屏蔽型局部变量同名的变量时,则 高层程序模块中的同名变量被隐藏, 即这些高层中的同名变量在当前程序模块及其下层子程序 中暂时无效,待当前程序模块执行结束返回上层程序模块时,被隐藏起来的同名变量会自动恢 复并保持原来的值。 请注意本命令并不能建立内存变量,它只能隐藏上级模块中的已经存在的变量。 【例 6.25】全局变量和局部变量使用示例。在此例中,x1 是全局变量,主程序中定义了 局部变量 x、x2,子程序中定义了局部变量 x3、x4,还定义了屏蔽型局部变量 x。 *main Public

193

x1


x1=8 x2=16 x=0 ? “调用子程序前” List Memo Do

Like x*

sub1

? “调用子程序后” List Memo

Like x*

Return Procedure Private Store

sub1

x .T. To

x3,

x4

x=100 x1=x1*x1 x2=x2*x2 ? “调用子程序中” List

Memo

Like

X*

Return

运行结果: 4.本地变量 本地变量是指用 Local 命令建立的变量,它不同于一般局部变量,本地变量只能在建立它 的程序模块中使用,不能在其下级程序模块中使用。本地变量在程序模块执行时建立,结束时

194


被释放。 <内存变量表>

格式:Local

功能:定义本地变量,并赋初值为逻辑假 .F.。 说明:Local 命令不能缩写为 Loca,避免与 Locate 命令的缩写混淆。 【例 6.26】本地变量使用示例 *主程序 Local

x1

x1=8 x2=16 ? “调用过程前” List Memo

Like x*

Do sub1 ? “调用过程后” List Memo Like x* Return Procedure

sub1

x=x1*x1 x2=x2*x2 ? “过程执行中” List Memo

Like x*

Return 本程序执行到子程序 sub1 时,会出现错误信息“变量 x1 找不到”,说明 x1 在子程序中

不能使用,若忽略此错误,则显示下列执行结果:

195


6.6

程序调试

6.6.1 程序调试的一般方法 编好的程序难免有错,必须通过反复地检查改正,直至达到预定的设计要求后才能投入使 用。为发现程序中的错误,通常有下面两种做法: ① 动态检查:通过在计算机执行程序来发现其中的错误。 ② 静态检查:用执行程序以外的办法。例如用阅读程序的方法来发现其中的错误。 调试就是用动态检查的方法来发现并纠正程序中的错误,以保证程序的可靠性。 1.程序中的常见错误 ① 语法错误。系统对所要执行的命令都要进行语法检查,若有不符合语法规定的命令, 就提示产生了语法错误并指示错误位置。例如,保留字拼写错误、命令格式写错、使用了未定 义的变量、数据类型不匹配等,都属于语法错误。 ② 逻辑错误。因算法设计不正确等原因而造成的错误称为逻辑错误,这类错误系统无法 判定,只能由用户自己来查错。 ③ 系统错误。例如,嵌套层数超过规定的允许范围等。 2.常用的调试技术 ① 设置断点 若程序执行到某命令处能暂停执行,该处称为断点。在程序中设置断点,可以在程序的执 行中途,通过查看有关的信息,从而判断错误原因和错误位置。 设置断点的方法: 在程序中欲设置断点的命令后面加入命令:Suspend,系统执行到此命令时,能够暂时回 到命令窗口,此时用户可以输入一些输出命令来查看各种数据,之后在命令窗口输入命令 “Resume”,程序即可继续运行。 利用调试器窗口设置断点。我们将在本节的后面详细介绍调试器的使用。 ② 输出附加信息 一种比设置断点更为简便的方法是在程序的适当位置加上一些输出命令,输出变量的中间 结果,以帮助判断错误所在。一旦程序调试成功,即可删除这些输出命令。 ③ 单步执行 每次执行一条命令,相当于每执行一句,暂停一次。 ④ 跟踪 在程序执行过程中跟踪某些信息的变化。 ⑤ 缩小调试范围 196


为了提高调试的效率,可在运行程序时将已经查明没有错误的程序段暂时变成注释行,调 试时就可跳过这个程序段不予执行,避免了重复调试。

6.6.2 Visual FoxPro 调试器的使用 1.调用调试器 调用调试器的方法一般有两种: ① 单击“工具”菜单,在弹出的下拉菜单中选择“调试器”命令 ② 在命令窗口中输入 Debug 命令 2.调试器环境 打开系统的调试器窗口,进入调试器环境。在调试器环境中可选择打开 5 个子窗口:跟踪、 监视、局部、调用堆栈和调试输出。每个窗口可以独立打开和关闭,各子窗口通过调试器的“窗 口”菜单中的对应选项打开,通过单击子窗口的关闭按钮关闭。图 6.10 为调试器窗口,其中打

197

图 6.10

调试器窗口


开了全部 5 个子窗口。 各子窗口的功能和使用方法如下: ① 跟踪窗口 在调试器窗口中利用“文件/打开”菜单命令就可以打开一个准备调试的程序文件。跟踪 窗口用于显示正在调试的程序文件中的命令行。 在跟踪窗口中可以为程序设置断点,方法是双击某命令行左边的竖条,出现符号“●”, 表示此行为断点。如果再次双击此命令行,则取消断点。 程序执行过程中,命令行左边的符号“→”表示正在执行的命令。 ② 监视窗口 用于监视指定的表达式在程序调试执行过程中取值的变化情况。 监视表达式的设置方法是:在窗口的“监视”文本框中输入表达式,按回车健后,此表达 式即加入到监视窗口的列表框中,重复这个过程,可以向列表框中加入多个表达式。 在程序调试执行过程中,列表框中的表达式的值会动态地显示出来,特别是如果设置了断 点或以单步执行方式运行,用户可以清楚地观察到表达式的变化情况。 ③ 局部窗口 用于显示程序模块(主程序、子程序、方法程序)中的内存变量(简单变量、数组、对象 及对象成员) ,显示其名称、当前取值和类型。 局部窗口只显示当前正在运行的各程序模块中的内存变量,所以在程序运行前和运行后, 窗口中将没有内容(除非有未释放的全局变量) ,因此若要从局部窗口中查看内存变量信息, 必须为程序设置断点。 局部窗口使用方法为:在程序运行期间,从“位置”下拉列表中选定一个程序模块名,下 方的列表框中将显示在该模块中有效的所有内存变量的当前状态。此外,在局部窗口内右单击, 然后在弹出的快捷菜单中选择“公共”、 “局部” 、 “常用”、 “对象”等命令,可以控制在列表框 内显示的变量种类。 ④ 调用堆栈窗口 用于显示当前处于执行状态的程序、子程序或方法程序等。若正在执行的是一个子程序, 那么,主程序和子程序的名字都会显示在该窗口中。 在程序模块名称的左边会显示数字, 它们代表模块的调用顺序号,序号小的模块处于上层, 是调用程序,序号大的模块处于下层,是被调用程序。 符号“→”指向的是正在执行的程序模块。 从快捷菜单中选择“原位置”和“当前过程”能控制数字和“→”是否显示。 ⑤ 调试输出窗口 可以在所调试的程序模块中插入一些调试输出命令,格式为: Debugout

<表达式>

198


当程序执行到此命令时, 会计算出表达式的值,并将计算结果在调试输出窗口中显示出来。 为了区分 Debug 和 Debugout 命令,命令动词 Debugout 至少应写出 6 个字母。 3.调试器的“调试”菜单的使用 “调试”菜单中包含有多条重要的调试命令,比如选择程序执行方式、修改程序、终止程 序执行及调整程序执行速度等命令,各命令具体功能如下: ① 运行:开始执行跟踪窗口中打开的程序。如果跟踪窗口里还没有打开程序,那么选择 此命令将会打开“运行”对话框,当用户从对话框中指定一个程序后,调试器随即执行此程序, 并中断于程序的第一条可执行代码上。 ② 继续执行:从程序当前中断处继续向下执行。 ③ 取消:终止程序的调试执行,并关闭程序。 ④ 定位修改:终止程序的调试执行,然后在文本编辑窗口打开调试程序,以便用户进行 修改。 ⑤ 单步:逐句执行程序中的每一条命令,即每执行一条命令中断一次。如果是调用子程 序命令,则不跟踪进入子程序内部,而是作为一条命令执行。 ⑥ 跳出:以连续方式而非单步运行方式执行所调用的子程序模块,执行完子程序后,回 到上级模块的子程序调用命令的下一行中断。 ⑦ 单步追踪:逐句执行程序中的每一条命令。如果是调用子程序命令,则跟踪进入子程 序内部,单步执行子程序中的每一条命令。 ⑧ 运行到光标处:从当前位置执行代码至光标处中断。光标位置可以在开始时设置,也 可以在程序中断时设置。 ⑨ 调速:打开“调整运行速度”对话框,设置两条代码执行之间延迟的秒数。 ⑩ 设置下一条命令:程序中断时,选择此命令,可以使光标所在行成为恢复执行后要执 行的命令。 【例 6.27】结构化程序设计举例。 数据库应用系统通常包括数据的输入、查询、修改、打印等程序模块,还要有一个主控模 块来管理这些子模块,主控模块中,一般包含一个菜单,使用户可以选择要进行的操作。本例 题说明如何使用传统的结构化程序设计方法编写简单的数据库应用程序。 编写教师管理数据库应用系统。因为篇幅所限,应用程序简化为仅包括对教师基本情况表 (jsqk)的数据输入、查询、修改模块,此外还包括一个用户口令检查模块和主控模块。程序 的主控模块包括一个主菜单,在每执行完一个子模块后,回到主菜单,等候用户的下一个选择。 程序保存为:main.prg(主控模块)、oper.prg(过程文件,存放所有子程序)。 Main.prg 程序清单如下: Clear all Use jsqk

199


Set

Procedure

Do

kljc

Do

While .T.

To

oper

&&打开过程文件 &&调用口令检查模块

Clear ? ? ? ?space(10) + “1. 输入数据”

&&输出菜单

?space(10) + “2. 信息查询” ?space(10) + “3. 数据修改” ?space(10) + “0. 退出系统” ?space(10) Wait Do

“请选择(0-3)”

To n

Case

Case Do Case

n=“1” srsj

&&调用输入数据模块

n=“2”

Do xxcx Case Do Case

&&调用信息查询模块

n=“3” sjxg

&&调用数据修改模块

n=“0”

Exit Endcase Enddo Use Close

Procedure

Return 过程文件 oper.prg 程序清单如下: *口令检查模块 Procedure

kljc

**允许用户最多输入 3 次密码 n=1 Do

&&变量 n 用来保存密码的输入次数 While .T.

? “请输入密码”

&&先输出提示信息

Set

&&关闭屏幕显示开关,使键盘输入的信息不显示

Console

Off

200


Accept To password Set If

Console

On

&&打开屏幕显示开关

password = = “54321” Exit

&&密码正确时退出循环继续执行

Else If n>=3 Wait

“对不起,你不能使用本系统”

Cancel

Window

Timeout

3

&& 3 次输入密码不正确时,终止程序执行

Else n=n+1 Endif Endif Enddo Return *输入数据模块 Procedure

srsj

Clear Dimension dd(10)

&&数组用来存放读入的各项数据

Do

&&利用循环输入多条记录

While .T.

? “提示: 在职工编号处输入 Exit 退出” Accept If

“输入职工编号”

To

dd(1)

Lower(dd(1))=“Exit” Exit

Endif Accept “职工姓名”

To dd(2)

Accept “性

To

别”

dd(3)

Accept “出生日期”

To dd(4)

Accept “工作日期”

To dd(5)

Accept “学

历”

To

dd(6)

Accept “学

位”

To

dd(8)

Accept “职

称”

To

dd(7)

Accept “婚

否(Y/N)”

Accept “系别编号”

To dd(9)

To dd(10)

Accept “将本记录存入(Y/N)?” If 201

Lower(nn)=“y”

To

nn


Append

Blank

dd(4)=Ctod(dd(4)) dd(5)=Ctod(dd(5)) If

upper(dd(9))=“Y” dd(9)=.T.

Else dd(9)=.F. Endif Gather From dd Endif Enddo Return *信息查询模块 Procedure

xxcx

**本过程只提供 3 种查询方式 Clear ? ? ? space(10) + “请选择查询方式” ? space(10) + “1. 按姓名” ? space(10) + “2. 按职称” ? space(10) + “3. 按部门” Wait

“请选择 1-3” To

m

Clear Do

Case

Case

m=“1”

yy=“xm” Case

m=“2”

yy=“zc” Case

m=“3”

yy=“bmbh” Endcase Accept Space(10) + “请输入查询条件” + yy + “=” To Brow

For &yy=Alltrim(xx)

xx

&&将查询结果显示在 Browse 窗口

Return 202


*数据修改模块 Procedure sjxg **为简化程序,本过程采用最简单的修改方式,在 Browse 窗口中进行修改 Browse Return 【例 6.28】表 score (学号,物理,高数,英语,学分),前 4 项已经有数据,设计程序 计算每个学生的总学分,并存入学分字段。计算方法: 物理

>=60

2 学分,否则 0 学分

高数

>=60

3 学分,否则 0 学分

英语

>=60

4 学分,否则 0 学分

并根据上面的计算结果生成一个新的表 xf(表结构与 score 表一致,按学分升序排序, 如果学分相等,则按学号降序排序) 。 Use

score

Scan s=0 If

物理>=60 s=s+2

Endif If

高数>=60 s=s+3

Endif If

英语>=60 s=s+4

Endif Replace 学分 With s Endscan Select * From score Use Return

203

Into Table xf Order By 学分, 学号

Desc


第七章 面向对象的程序设计基础 7.1 面向对象的概念 Visual FoxPro 8.0 不仅支持传统的面向过程的结构化程序设计,还支持面向对象的程序设 计(Object-Oriented Programming,OOP)。面向对象程序设计方法引入了许多新的概念,使得 开发应用程序变得更容易,效率更高。 本章将详细介绍 Visual FoxPro 8.0 中面向对象的基本思想、基本概念和基本方法。

7.1.1 对象与类 对象与类是 OOP 的两个最基本的概念。 1.对象 在 OOP 中,对象(Object)是构成程序的基本单位和运行实体。客观世界的任何事物都 可以被看作是对象。例如,一部电话、一个学生、一个表格、一个命令按钮等都是对象。 对象由属性和方法(行为)两个基本要素构成,并且能够对外界事件进行响应。属性是 对象的静态特征,如一部电话有品牌、型号、颜色等属性,一个学生有身高、年龄、籍贯等属 性。方法是对象的动态特征即行为和动作,如电话可以实现通话或者存储来电号码等功能,学 生有上课、出操等行为。 对象就是特定的属性和行为的封装体。 2.类 同类型的对象具有同类型的属性和行为(方法),我们将同类型的对象抽象为类(Class) 。 类就像一个模板,定义了对象所共有的属性和行为,对象都是由类生成的具体实例。由一个类 可以生成成千上万个具体的对象,这些对象拥有所属类的全部共有属性和行为。但这并不意味 着这些对象不分彼此无法区分,它们共同拥有的仅是相同的属性名称和行为名称,而每个对象 可以赋予不同的属性值和行为实现。 如可以定义一个“学生”类。描述“学生”的属性有“姓名”、 “性别”、 “出生日期”、 “班 级”等。描述“学生”的方法有“上课”、 “运动”、 “考试”等。对于“学生”这一类,可以生 成任何一个具体的学生对象,可以为其设置特有的属性值,为其确定特定的行为实现。 类按层次可以划分为基类、父类和子类。基类是系统已经定义好的基本类。Visual FoxPro 204


系统预先为用户定义了 29 个基类。用户可以用这些基类生成对象,也可以用基类派生出其他 新类,称之为用户自定义类。通常把已有的类称为父类,由父类派生出的新类称为子类。子类 继承了父类的全部属性和方法,也可以为新类添加新的属性和方法。 引入类和对象的概念,就是要通过预先定义好的类来生成一组相似的对象,通过对对象 的属性和行为的操作来操作对象,达到实现开发功能的目的。这样就可以大大简化代码,提高 开发效率。

7.1.2 属性、方法和事件 1.属性 属性(Attribute)是描述对象特征的数据。根据属性的不同,可以在设计对象时设置属性 值,或者在程序运行时动态改变属性值。对象属性的访问格式如下: <对象引用>.<对象属性> <对象引用>是指广义的对象名,后续小节中将有介绍。 2.方法 方法(Method)是对象自身具有的行为和动作,使对象能够实现一定的功能。不同对象 具有不同的方法。对象方法必须通过程序代码来显式调用来执行,调用格式如下: <对象引用>.<对象方法> 3.事件 事件(Event)是对象可以识别和响应的一个外界(用户或者系统)发出的动作。例如表 单运行时系统自动触发的 Load 事件,被用户单击时触发的 Click 事件。每个对象都能响应由 系统定义的特定事件集。一个事件产生后会触发相关联的代码,即事件驱动程序的执行。为了 使对象在接到事件后能够完成相应的功能,就必须编写相应的事件驱动程序代码,以具体的描 述做什么以及怎么做。 事件驱动程序既能在事件触发时执行,也能在代码中显式调用。事件的调用格式如下: <对象引用>.<事件> 每个类产生的对象都具有由系统预定义的属性、方法和事件,并具有系统给定的默认值或 者默认过程。除此之外,用户还可以为对象定义新的属性和方法,但是不能定义新的事件,因 为事件集合是固定的。 对对象的操作是通过对象的属性、事件和方法来完成的。

205


7.1.3 Visual FoxPro 中的基类 Visual FoxPro 系统预先为用户定义了基类。基类又可以分为控件类和容器类。相应地,可 以分别生成控件对象和容器对象。附录 IV 中列出了 Visual FoxPro 的基类清单。 控件类对象,例如命令按钮或者文本框等,通常放在某种容器类对象中。在控件类对象中 不能包含其它的控件对象或容器对象。 容器是一种特殊的对象。它可以包含控件对象或其它的容器对象。容器对象称为其所包含 的对象的父对象,而被包含的对象则称为子对象。 容器所包含的对象也可以是容器。例如表单作为一个容器对象,既可以包含命令按钮、文 本框等控件对象,也可以包含表格、页框等容器对象,而表格或页框内又可以包含其它的容器 或控件对象,这样就形成了对象的嵌套包含关系。在 Visual FoxPro 的界面设计中,就是通过 在表单中添加各种容器对象和控件对象,形成可视化的数据库应用系统的工作界面,从而实现 信息传递和各种交互式操作。 在 Visual FoxPro 的程序中要引用某个对象,必须指明这个对象在对象的嵌套包含关系中 所处的位置。经常用到的有以下几个关键字或属性: 1.ThisForm:关键字,代表当前对象所在的表单。如: ThisForm.Caption="myObject"

&&对当前表单的标题属性进行设置

2.ThisFormSet:关键字,代表当前对象所在的表单集。如: ThisFormSet.Frm1.Cmd1.Cpation="myObject"

&&对当前表单集中的 Frm1 表单的 Cmd1 命令按钮标题属性进行设置

3.This:关键字,代表当前对象。如: This.Caption="myObject"

&&对当前对象的标题属性进行设置

4.Parent:是对象的一个属性,其值指明该对象的直接容器对象。如: This.Parent.Caption="myObject"

&&对当前对象的直接容器的标题 属性进行设置

对象引用方式可以分为两种:绝对引用和相对引用。绝对引用是指以 ThisForm 和 ThisFormSet 关键字开头的引用方式,即以当前对象所在表单或表单集作为引用的起点,将对 象的嵌套关系一层层地指明,直到被引用的对象,每一层之间用“.”操作符分隔。如 ThisFormSet.Frm1.Cmd1 就是对于当前表单集的表单 Frm1 中的 Cmd1 这个对象的引用。相对 引用是指以 This 关键字开头的引用方式,即以当前对象作为引用的起点,可以向上指向其父 对象,也可以向下指向其子对象,直到被引用的对象。如 This.Parent 就是对当前对象的直接 容器的引用。 所有 Visual FoxPro 基类有如下的最小属性集:

206


属性 Class 说明该类属于何种类;属性 BaseClass 说明该类由何种基类派生而来。例如 Form、CommandButton 或 Custom 等;属性 ClassLibrary 说明该类从属于哪种类库;属性 ParentClass 说明对象所基于的类。若该类直接由 Visual FoxPro 基类派生而来,则 ParentClass 属性值与 BaseClass 属性值相同。 所有 Visual FoxPro 基类有如下的最小事件集: Init 事件:当对象创建时激活;Destroy 事件:当对象从内存中释放时激活;Error 事件: 当类中的事件或方法程序过程中发生错误时激活。

7.2 表单的基本操作 “表单”来自英文 Form,也可以称为窗体,即人机交互界面,在基于图形用户界面的应 用软件中大量应用。在 Visual FoxPro 系统中,表单是数据库应用系统的主要工作界面,为数 据信息的输入、输出和各种操作处理提供了非常简便的方法。 设计表单的过程,就是设计表单界面,设置表单及其控件属性,确定事件代码的过程。

7.2.1 创建表单 1.使用窗体设计器创建表单 使用窗体设计器,不但能创建新的表单,而 且可以修改已建立的表单。可以用菜单方式或命 令方式打开窗体设计器。 ⑴ 菜单方式 ① 单击“文件”下拉菜单中的“新建”命 令,或“常用”工具栏上的“新建”按钮,打开 “新建”对话框。 ② 在对话框的“文件类型”中选定“表单”

图 7.1 空白“窗体设计器”窗口

选项,单击“新建文件”按钮,打开“窗体设计器”窗口,如图 7.1 所示。 ⑵ 命令方式 格式:Create Form <表单名>[.scx] 功能:打开窗体设计器,创建新的以<表单名>命名的表单文件。<表单名>可包含表单的 完整路径。

207


图 7.2 “表单生成器”对话框 在“窗体设计器”环境下,也可以使用表单生成器方便快捷地生成表单。使用“表单” 菜单中的“快速表单”命令,或者右单击表单窗口,在快捷菜单中选择“生成器”命令,都可 以打开“表单生成器”对话框,如图 7.2 所示。用户在其中选择表或者视图中的字段,这些字 段将以控件的形式被添加到表单上,并可以通过对“式样”选项卡内容的设置改变控件在表单 上显示的样式。 无论哪种方式生成的表单都被保存在扩展名为 .scx 的表单文件中,同时系统自动生成一 个文件名与表单文件相同且扩展名为 .sct 的表单备注文件,这两个文件存放在同一目录下。 2.使用表单向导创建表单 使用表单向导能引导用户选定数据表来产生实用的数据表维护窗口。Visual FoxPro 提供 了两种表单向导: “表单向导”和“一对多表单向导”。前者是用于单表表单,后者适用于具有 一对多关系的两个数据表的表单。利用表 单向导创建的表单,如果不满意还可以用 窗体设计器进一步进行修改。以下例 7.1 说明的是“表单向导”的使用方法,例 7.2 说明的是“一对多表单向导”的使用方法。 【例 7.1】用表单向导创建一个维护数 据表 jsqk.dbf 的表单:教师情况表维护表 单。具体操作如下: ⑴ 单击“文件”下拉菜单中的“新建” 命令,或单击“常用”工具栏上的“新建”

图 7.3 “向导选择”对话框 208


按钮,然后在“新建”对话框中选择“表单”文件并单击“向导”按钮,打开“向导选取”对 话框,如图 7.3 所示。 ⑵ 在“向导选取”对话框中选择要使用的向导。如果数据源是单表,应选择“表单向导”; 如果数据源包括父表和子表,应选取“一对多表单向导”。本例中选择“表单向导”,单击“确 定”按钮,出现如图 7.4 所示的表单向导(Form Wizard)步骤 1 对话框。

图 7.4

表单向导步骤 1

⑶“表单向导”共有 4 个步骤,会顺序出现 4 个对话框分别设置相应内容。 ① 步骤 1-字段选取(Select Fields):在步骤 1 对话框中单击 “数据库和表”(Databases and lables)下拉列表框右边带“…” 的按钮,在出现的“打开”对话 框 中 选 定 jsgl 数 据 库 中 的 jsqk.dbf 表,系统将此表的字段 显示在“可用字段”(Avalable fields)列表框中;选择要显示 在表单上的字段,单击右箭头按 钮将其移到“选定字段” (Selected fields)列表框中。单

图 7.5 表单向导步骤 2

击双右箭头按钮可以将全部可用字段移到“选定字段”列表框中。左箭头按钮的作用与右箭头 按钮的作用相反。本例中选定所有字段,然后单击“下一步”(Next)按钮,出现如图 7.5 所

209


示“表单向导”步骤 2 对话框。 ② 步骤 2-选择表单样式(Choose Form Style):在“样式”(Style)列表中选定一种窗体 样式,在“按钮类型”(Button type)列表中选定一种按钮类型。本例选择标准式(Standard) 及文本按钮(Text buttons),单 击“下一步”按钮,打开如图 7.6 所示“表单向导”步骤 3 对 话框。 ③ 步骤 3-排序记录(Sort Records):选择“可用的字段或 索引标识”(Avalable fields or index tag)中的 jsbh 字段,单 击“添加”(Add)按钮将该字 段添加到“选定字段” (Selected fields)列表框中,并选定“升 序”(Ascending),指定表单显 示记录的顺序。单击“下一步” 按钮,出现如图 7.7 所示“表单

图 7.6 表单向导步骤 3

向导”步骤 4 对话框。 ④ 步骤 4-完成(Finish):输入表单标题“教师情况表维护表单” (Type a title for your form), 并选择“保存表单并用窗体设计 器修改表单”(Sava form and modify it in the Form Designer), 单击“完成” (Finish)按钮。打 开“另存为”对话框,输入表单 文件名 jsqk.scx,并指定保存位 置,单击“保存”,将创建的表 单保存在 jsqk.scx 和 jsqk.sct 文 件中。然后在“窗体设计器”中 显示表单。 ⑷ 单击“表单”下拉菜单 中的“执行表单”命令,表单运 行结果如图 7.8 所示。表单上部 显示当前记录的数据,表单底部

图 7.7 表单向导步骤 4

的一排按钮用来执行浏览、修改、添加或删除记录等操作。 【例 7.2】创建一个用于维护数据表 jsqk.dbf 和 kyqk.dbf 的部分数据的表单。操作步骤如 210


下: ⑴ 单击“文件”下拉菜单的“新建”命令,然后在“打开”对话框中选择“表单”文件 并单击“向导”按钮,在“向导选取”对话框中选择“一对多表单向导”,单击“确定”按钮。 ⑵ 打开“一对多表单向导”(One-To-Many Form Wizard)对话框。该向导有 6 个步骤。

图 7.8 教师情况表维护表单 ① 步骤 1-从父表中选取字段(Select Parent Table Fields):如图 7.9 所示。单击 “数据库 和表” (Databases and tables)下拉列表框右边带“…”的按钮,在“打开”对话框中选定 jsgl 数据库中的 jsqk.dbf 表,系统将此表的可用字段显示在“可用字段”(Available fields)列表框中; 选择要显示在表单上的字段,单击右箭头按钮将其移到“选定字段”(Selected fields)列表框

图 7.9 一对多表单向导步骤 1 中;单击“下一步”, 出现如图 7.10 所示“一对多表单向导”步骤 2 对话框。 211


② 步骤 2-从子表中选取字段(Select Child Table Fields):按照步骤 1 的方法选定子表字 段,单击“下一步”, 出现如图 7.11 所示“一对多表单向导”步骤 3 对话框。 ③ 步骤 3-建立表之间的关系(Relate Tables):将 jsqk 中的 jsbh 字段与 kyqk 中的 jsbh 建 立关联关系,单击“下一步”,出现“一对多表单向导”步骤 4 对话框。默认情况下,系统按 两个表的同名字段建立关联。若没有同名字段,则需在下拉列表中选择。 ④ 步骤 4-选择表单样式(Choose Form Style),参考图 7.5。 ⑤ 步骤 5-排序记录(Sort Records),本例中略过。

图 7.10 一对多表单向导步骤 2

图 7.11 一对多表单向导步骤 3

212

图 7.12 例 7.2 表单执行结果示意图


⑥ 步骤 6-完成(Finish) :参考图 7.7,输入表单标题,保存表单文件。 表单运行结果如图 7.12 所示。父表提供单条记录的数据,显示在表单的上半部分;子表 与父表相关联的数据显示在表单下半部分的表格中,用按钮翻页时子表的内容随父表变化。

7.2.2 操作表单 1.打开表单 无论是通过何种途径创建的,都可以再次打开表单进行修改。打开表单实际上就是打开 包含指定表单的窗体设计器,然后在窗体设计器中对其进行编辑修改。打开已有表单有以下两 种方式: ⑴ 菜单方式 ① 单击“文件”下拉菜单中的“打开”命令,进入“打开”对话框。 ② 在“文件类型”下拉列表中选择“表单(*.scx)”,在文件列表框中选择要打开的表 单,单击“打开”按钮。包含该表单的“窗体设计器”窗口被打开,可在其中进行编辑修改。 ⑵ 命令方式 格式:Modify Form <表单名>[.scx] 功能:打开包含<表单名>所指定表单的“窗体设计器”窗口。<表单名>可包含表单的完 整路径。 2.修改表单 修改表单是在窗体设计器中进行的。 窗体设计器启动后,Visual FoxPro 主窗口的 菜单栏中将增加“表单”菜单项,工作区将出现 “窗体设计器”窗口、 “属性”窗口、 “表单控件” 工具栏和“窗体设计器”工具栏,代码编辑窗口、 “调色板”工具栏、 “布局”工具栏等,共同构成 窗体设计器环境,用户在此环境中可以交互地、 可视化地完成表单的设计和修改。 ⑴“窗体设计器”窗口 “窗体设计器”窗口中包含正在设计的表单 界面,为用户在表单中添加和修改控件提供可视 化的环境,如图 7.1 所示。 ⑵“窗体控件”工具栏 在窗体设计器打开的状态下,选择“显示” 菜单中的“表单控件工具栏”命令可以打开(或

选定对象

查看类

标签

文本框

编辑框 命令按钮

命令按钮 选项按钮组

复选框

组合框

列表框

微调按钮

表格 计时器 ActiveX 控件 线条 容器 超级链接 生成器锁定

图像 页框 ActiveX 绑定控件 形状 分隔符 按钮锁定

图 7.13 “窗体控件”工具栏 213


关闭) “窗体控件”工具栏,如图 7.13 所示。工具栏中包含各种控件按钮,利用控件按钮可以 方便地往表单中添加控件: 鼠标单击选定相应的控件按钮,使其呈现凹陷状态,表明该控件被选定。然后在表单窗 口的适当位置单击鼠标即可添加一个 该控件对象,或拖动鼠标添加一个适

对象下拉

当大小的该控件对象。各控件具体的

列表框

使用方法后续节中将陆续介绍。

属性选项卡

⑶“属性”窗口 在窗体设计器打开的状态下,选

属性值

择“显示”下拉菜单中的“属性”命

输入框

令可以打开(或关闭)“属性”窗口,

属性列表框

如图 7.14 所示。 “属性”窗口包含下面 几部分: ① 对象下拉列表框:其中分层列

属性说明

出了当前表单对象及其所包含的对象 的名称,可以单击右端的下拉箭头看 到这个列表,在列表中单击对象名选

图 7.14 属性窗口

择对象,在下面的属性列表框中显示 所选对象的所有的属性、方法和事件。 ② 属性分类选项卡:共有 5 个。 z 全部——按字母排序的对象的所有属性、事件、方法。 z 数据——与对象数据有关的属性。 z 方法程序——对象的事件和方法程序。两者都是对象的程序,区别在于,带“Event” 后缀的选项是事件,否则就是方法程序。 z 布局——控制对象外观的属性,如颜色等。 z 其他——不属于以上各项的属性及用户自定义属性。 ③ 属性列表框:按字母顺序列出当前选项卡的所有属性名及其取值,左边是属性名,右 边是属性值。单击属性列表中的某一项目,则选中该属性,称为当前属性。 ④ 属性值输入框:用来输入或在下拉列表中选择当前属性的值。 表单和控件的绝大多数属性数据类型是固定的,如 Width 属性是数值型的。但有些属性的 数据类型并不是固定的,如文本框的 Value 属性可以是任意类型数据。 注意:在属性值输入框中输入字符类型的数据时,不要输入字符串定界符,只输入字 符串内容即可。 ⑤ 属性说明框:对当前属性含义的文字解释。 ⑷ 代码编辑窗口 214


在窗体设计器打开的状态下,可以用以下方法打开如图 7.15 所示的代码编辑窗口。 z 双击表单中的某一控件。 z 用鼠标右键单击表单控件,在快捷菜单中选择“代码 …”命令。 z 单击“窗体设计器”工具栏中的代码按钮。 z 单击“显示”下拉菜单中的“代码”命令。

图 7.15 代码编辑窗口 代码编辑窗口的标题是表单中对象的某一方法或事件程序的名称,由“对象名.方法名” 表示。代码编辑窗口有三部分: ①“对象”下拉列表框:列出当前表单及其包含的所有对象的名称; ②“过程”下拉列表框:列出对象列表中选择的对象所拥有的所有方法、事件过程的名 称; ③ 代码编辑区:显示、编辑所选择对象的相应过程的代码。 用户可以在代码编辑窗口中编辑表单中所有对象的方法和事件的过程代码,步骤如下: ① 在“对象”下拉列表框中选择对象; ② 在“过程”下拉列表框中选择该对象需要编辑的方法或事件; ③ 在代码编辑区中输入或修改方法或事件的代码。 ⑸“窗体设计器”工具栏 “窗体设计器”工具栏如图 7.16 所示,包含 “设置 Tab 键顺序”、“数据环境”、 “属性窗口” 、 “代码窗口”、“窗体控件工具栏”、“调色板工具 栏”、“布局工具栏”、“窗体生成器”和“自动格

图 7.16“窗体设计器”工具栏

式”等按钮。 ⑹“表单”下拉菜单 “表单”下拉菜单中的命令主要用于为表单增加新的属性或方法、创建表单集、运行表单 等。 3.保存表单 表单设计(无论是新建或修改)完毕后,单击“文件”下拉菜单中的“保存”命令,或 者工具栏上的“保存”按钮,或者使用组合键 Ctrl+w,将表单保存在.scx 表单文件和.sct 表单 215


备注文件中。如果表单为首次保存,在存盘时会出现“另存为”对话框,提示用户输入表单文 件名,指定保存位置。 4.运行表单 运行表单可以采用菜单方式或者命令方式。 ⑴ 菜单方式 在窗体设计器环境下,单击“表单”下拉菜单中的“执行表单”命令;或者单击“常用” 工具栏上的“运行”按钮;或者在表单的快捷菜单中选择“执行表单”命令。 ⑵ 命令方式 格式:Do

Form <表单名>[.scx]

功能:运行<表单名>所指定的表单。<表单名>可包含表单的完整路径。 注意:表单文件及其表单备注文件必须同时存在才能运行表单。

7.2.3 表单属性、事件和方法 1.表单的属性 ⑴ 常用的表单属性 表 7.1 列出了常用的一些表单属性。 表 7.1 属

表单常用属性

ALWAYSONT

指定表单是否总位于其他窗口之上

默认值 .F.

OP

AutoCenter

指定表单初始化时是否自动在 Visual FoxPro 主窗口内居中

.F.

BackColor

指定表单窗口的颜色

255,255,255

BorderStyle

指定表单边框的风格。0(无边框)、1(单线边框)、2(固定对

3

话框)、3(可调边框) Caption

指定显示于表单标题上的文本

Form1

Closable

指定是否可以通过单击关闭按钮或双击控制菜单框来关闭

.T.

对话框 Height

指定表单的高度

250

MaxButton

确定表单是否有最大化按钮

.T.

MinButton

确定表单是否有最小化按钮

.T.

Movable

确定表单是否能够移动

.T.

216


Picture

指定一个位图文件作为表单的背景

ScrollBars

指定表单滚动条类型。0(无)、1(水平)、2(垂直)、3(水平加

0

垂直) Width

指定表单的宽度

375

WindowState

指明表单的状态。可取 0(正常)、1(最小化)、2(最大化)

0

WindowType

指定表单是模式表单(取 1)还是非模式表单(取 0)。模式表单

0

在关闭该表单之前不能访问应用程序中的其他界面元素。 ⑵ 属性设置方法 表单和控件对象的大部分属性设置可以在设计阶段的属性值输入框中完成,可以在属性值 输入框中直接输入属性值,或者在属性值输入框已给出的属性值列表中选择一个值。也可以在 代码中用赋值语句进行赋值,即程序运行阶段进行设置。 注意:有些属性只能在设计时设置,而有些属性在设计时是只读的,用户不能在属性 窗口中设置。 ⑶ 创建新属性 可以根据需要向表单添加任意数量的新属性,向表单添加新属性的步骤如下: ① 单击“表单”下拉菜单中的“新 建属性”命令,打开“新建属性”对话 框,如图 7.17 所示。 ② 在“名称”文本框中输入属性 名称,单击“添加”按钮,新建属性将 出现在“属性”窗口中。 ③ 可以在“说明”列表框中输入 属性说明信息,这些信息将出现在“属

图 7.17 “新建属性”对话框

性”窗口中属性列表的底部。 属性创建完毕之后,系统自动将其赋值为.F.,可以在属性窗口中对其值进行设定,从而改 变该属性的数据类型,之后就可以像引用表单的其它属性那样引用它们。 2.表单的常用事件和方法 ⑴ Load 事件 表单装入内存时触发。 ⑵ Init 事件 对象(包括表单对象和其它对象)建立时触发。在表单对象的 Init 事件触发之前,先触发 它所包含的控件对象的 Init 事件,所以在表单的 Init 事件中可以访问它所包含的所有控件对象。 运行表单时,先触发表单的 Load 事件,再触发表单的 Init 事件。 ⑶ Activate 事件 217


表单被激活,即变成活动窗体时触发。 ⑷ Destroy 事件 对象被释放时触发。表单对象的 Destroy 事件在它所包含的控件对象的 Destroy 事件触发 之前触发,所以在表单的 Destroy 事件中可以访问它所包含的所有控件对象。 ⑸ Unload 事件 表单对象释放时触发。释放表单时,先触发表单的 Destroy 事件,再触发表单所包含的控 件对象的 Destroy 事件,最后触发表单的 Unload 事件。 ⑹ Click 事件 用鼠标单击对象时触发。如果单击的对象是表单,则单击表单的空白部分将触发该事件, 而单击表单标题栏或边框不会触发该事件。 ⑺ DblClick 事件 用鼠标双击对象时触发。 ⑻ RightClick 事件 用鼠标右键单击对象时触发。 3.表单方法 ⑴ 表单的常用方法 ① Release 方法 关闭表单,并将表单从内存中释放。 ② Refresh 方法 重新绘制表单或控件对象,并且刷新它的所有值。当表单被刷新时,表单上的所有控件 对象也都被刷新。 ③ Show 方法 显示表单。 ④ Hide 方法 隐藏表单,但并不从内存中释放表单。 ⑤ SetFocus 方法 使对象获得焦点。表单对象以及无法拥有焦点的控件对象不具有该方法。能够获得焦点 的控件对象如果 Enabled 属性或 Visible 属性为.F.,将不能获得焦点。 ⑵ 创建新方法 同样可以根据需要向表单添加任意数量的新方法。向表单添加新方法的步骤如下: ① 单击“表单”下拉菜单中的“新建方法程序”命令,打开“新建方法程序”对话框, 如图 7.18 所示。 ② 在“名称”文本框中输入方 法名称,单击“添加”按钮,新建方

218

图 7.18 “新建方法程序”对话框


法将出现在“属性”窗口的属性列表中。 ③ 可以在“说明”列表框中输入属性说明信息,这些信息将出现在“属性”窗口中属性 列表的底部。 双击“属性”窗口中的方法名称,打开代码编辑窗口,输入方法的代码,然后就可以像引 用表单的其他方法那样引用它们。 【例 7.3】按下列要求建立表单 myform。① 为表单添加新属性 redp,用以设置表单背景 色中的红色含量;② 单击表单时背景色根据 redp 的变化而变化。 操作步骤如下: ① 在命令窗口中输入命令:Create Form myform 新建表单文件 myform.scx,打开“窗体设计器”,其 name 属性取默认值 Form1; ② 单击“表单”下拉菜单中的“新建属性”命令,打开“新建属性”对话框,在“名称” 文本框中输入属性名称 redp,单击“添加”按钮,并关闭该对话框。redp 出现在属性列表中, 且系统给出默认初始值 .F.,将其改为 0,即数值类型,以便下面用作数值计算。 ③ 打开代码编辑窗口,选择 Form1 的 Click 事件,在编辑区输入如下代码: Thisform.Redp=Thisform.Redp+50

&&将 redp 增加 50

If Thisform.Redp>255 Thisform.Redp=0

&&如果 redp 超过 255,置 0

Endif Thisform.Backcolor=Rgb(Thisform.Redp,0,0)

&&设置窗口背景色

④ 单击常用工具栏中的“运行”按钮,运行表单。 当鼠标单击表单窗口时,表单的背景色将随之不停变换

7.2.4 表单数据环境的设置 1.数据环境的概念 数据环境(Dataenvironment)指表单或表单集使用的数据源,包括表、视图、以及表之间 的关系,以方便用户在向表单添加字段控件时直接使用。数据环境及其中的表和视图都是对象。 一旦数据环境建立,其中的表或视图会随着表单的打开或运行而自动打开,而在关闭或释放表 单时,表或视图也会随之关闭。而且,在“属性”窗口中对象的 ControlSource 属性(多数控 件对象的数据绑定属性,决定控件的 数据源)设置框将列出数据环境的所 有字段,帮助用户设置控件的 ControlSource 属性。 2.打开数据环境设计器 219

图 7.19 “数据环境设计器”窗口


数据环境设计器可用来可视化地创建或修改表单数据环境。 在窗体设计器打开的状态下,单击“显示”下拉菜单中的“数据环境”命令,或者单击 “窗体设计器”工具栏中的“数据环境”按钮,可打开“数据环境设计器”窗口,如图 7.19 所示。同时系统菜单栏中将显示“数据环境”菜单项。 3.向数据环境中添加表或视图

图 7.20“添加表或视图”对话框 单击“数据环境”下拉菜单中的“添加”命令,或者右键单击数据环境设计器弹出快捷 菜单,单击其中的“添加”命令,打开“添加表或视图”对话框,如图 7.20 所示。用户可以 选择一个已存在的表或视图,单击“添加”按钮,将选定的表或视图添加到数据环境中。重复 此过程可以为数据环境添加多个表或视图,添加的表和视图都会出现在数据环境设计器中。 如果用户添加的表之间已具有永久关系,这些关系也会自动添加到数据环境中。用户也 可以在数据环境窗口中建立新的关系(新建立的关系是临时关系)或者删除已有关系。建立关 系只需将父表的某个字段拖动到子表的相关索引上,假若子表没有相关索引,则系统提示用户 是否建立索引。删除关系则直接选定表示关系的连线,按“Del”键来删除。 使用“数据环境”下拉菜单中的“浏览”命令,系统将在“浏览”窗口中显示选定的表 或视图,用户可以浏览或编辑表或视图的内容。 4.从数据环境移去表或视图 在数据环境设计器窗口中选定要删除的表或视图,用“数据环境”下拉菜单的“移去” 命令或者“Del”键来移出表或视图,但并不从磁盘中删除。 5.向表单添加字段 表单上产生的控件在很多情况下被用来显示或修改表中的数据,此时需要设定控件的某个 属性(如文本框的 ControlSource 属性),来使控件与字段相绑定。用户也可以直接从“数据环 境设计器”中将需要的字段、表或者视图拖入表单,系统即会在表单上产生相应的控件与字段

220


相绑定,而无须设定控件的 ControlSource 属性。将字符型、数字型、日期型字段拖入表单, 会自动生成与该字段绑定的文本框控件;将逻辑型字段拖入表单,会自动生成与该字段绑定的 复选框控件;将备注型字段拖入表单,会自动生成与该字段绑定的编辑框控件;如果被拖入的 是通用型字段,会自动生成与该字段绑定的 OLE 绑定控件。

7.3 表单常用控件 在设计表单时,用户可以使用“窗体控件”工具栏(如图 7.13 所示)中的各种控件按钮 在表单中逐个地创建控件对象。 使用和设计控件,需要了解控件的属性、方法和事件,在表单常用事件中已经介绍了一些 控件的常用事件。本节将逐一介绍常用控件的主要属性、方法和事件。表 7.2 列出了大部分控 件共有的常用属性。其它属性请参见附录 VI。 表 7.2 属

控件共有属性列表 取

Caption

字符型

对象的标题文本

Name

字符型

对象的名称(唯一标识对象,用于在代码中引用对象)

BackColor

RGB 三色值

对象内部的背景色

BorderColor

RGB 三色值

对象边框的颜色

BorderStyle

0,1,2,3

对象边框的样式(无边框、单线边框、固定对话框、可调边框)

ForeColor

RGB 三色值

对象的前景色(文本和图形的颜色)

Height

数值型

对象的高度

Width

数值型

对象的宽度

Left

数值型

对象左边框的位置

Top

数值型

对象顶边框的位置

Enable

逻辑型

对象是否可用

Visible

逻辑型

对象是否可见

FontName

字符型

字体名,设置字体类型

FontSize

数值型

设置字体大小

7.3.1 控件的基本操作 为了合理安排控件,常需对控件进行移动位置、改变大小、剪贴、删除等基本编辑操作。 对控件进行任何操作之前都应先选定控件。

221


⑴ 选定单个控件:单击控件,控件四周出现 8 个控点,表明该控件已被选定。 ⑵ 选定多个控件:按住 Shift 键,逐个单击要选定的控件。或者在“表单控件”工具栏的 “选定对象”按钮被按下的情况下,拖动鼠标,出现的矩形框围住的控件被选定。这时“属性” 窗口中显示这些对象的共有属性,用户可以对所选对象的共有属性同时进行设置。 ⑶ 取消选定:单击已选定的控件外部。 ⑷ 移动控件:选定控件后直接用鼠标拖动到目的位置放开即可。或者在选定的状态下用 键盘上的方向键来进行位置的微调。 ⑸ 改变控件大小:拖动选定控件的某个控点即可改变控件的大小。 ⑹ 删除控件:选定控件后按“Del”键删除。 ⑺ 剪贴控件:选定控件后,利用编辑菜单的“剪切”、“复制”、“粘帖”命令分别可以实 现控件对象的剪切、复制、粘贴操作。 ⑻ 控件布局规格化 “布局”工具栏或者“格式”菜单中的相应命令具有使选定的控件居中、对齐等功能。

7.3.2 标签控件 标签(Label)控件是用来显示不可编辑文本的控件,常用于提示或说明,在运行时通常 不响应事件。 常用的标签属性: 1.Caption 属性 字符型,指定标签的标题文本,即在标签控件上显示的标题文本。 2.Name 属性 字符型,指定对象的名字,所有对象都具有 Name 属性,用于在代码中引用对象。同一作 用域内的两个对象(如一个表单内的两个命令按钮)不能有相同的 Name 属性。该属性只能在 设计阶段属性窗口中进行设置。 3.Alignment 属性 指定标题文本在控件中显示的对齐方式。取 0(默认值),左对齐;取 1,右对齐;取 2, 居中对齐。除了标签控件,还适用于文本框、复选框、选项按钮、列、列标题等控件。 4.BackStyle 属性 设置标签控件背景是否透明。取 1(默认值),不透明;取 0,透明。

222


7.3.3 按钮类控件 按钮类控件分为命令按钮(CommandButton)控件和命令按钮组(CommandGroup)控件。 1.命令按钮 命令按钮的操作代码通常放置在命令按钮的 Click 事件中。 ⑴ Caption 属性 指定命令按钮上显示的标题文本。可以利用该属性为按钮增加热键,在该属性值中某字 符前插入符号“\<”,该字符就设置为热键。例如,Caption 属性设置为“Comm\<and1”则字 符 a 为热键。热键显示时有一条下划线,表示按该热键字符就会触发命令按钮的 Click 事件。 ⑵ Enabled 属性 逻辑型,指定表单或控件能否响应由用户触发的事件。默认值为.T.,即对象是有效的, 能响应外部事件,否则不能响应外部事件。 该属性适用于绝大多数控件,可以根据应用程序的当前状态随时设定一个对象是否有效, 从而限制对象的使用。如果一个容器的 Enabled 属性为.F.,则不管其中所包含对象的 Enabled 属性如何设置,这些对象也都不会响应外部事件。 ⑶ Visible 属性 指定对象是可见还是隐藏。默认值 为.T.,即对象是可见的,否则对象是隐藏 的。即使对象是隐藏的,在代码中仍可以 访问它。 该属性适用于绝大多数控件,可以根 据应用程序的当前状态随时设定一个对象 是否可见。如果一个容器控件的 Visible 属 性为.F.,则不管其中所包含对象的 Visible

图 7.21 系统欢迎表单

属性如何设置,这些对象也都是隐藏的。 【例 7.4】设计系统欢迎表单,如图 7.21 所示。单击“关闭”按钮时,关闭表单,退出运 行。 操作要点如下: ① 创建空白表单,在表单上添加一个命令按钮,两个标签控件,其 Name 属性分别取系 统默认值:Command1、Label1、Label2。表单的 Name 属性也取默认值 Form1。 ② 设置表单及控件的有关属性: Form1 的 Caption 属性设置为“欢迎使用”;Label1 的 Caption 属性设置为“教师信息管理系统”,FontName 属性设置为“华文彩云”,FontSize 属性 设置为 20;Label2 的 Caption 属性设置为“1.1 版”;Command1 的 Caption 属性设置为“关闭”。 ③ 为 Command1 的 Click 事件添加如下代码: 223


Thisform.Release 2.命令按钮组 命令按钮组是包含一组命令按钮的容器控件,用户可以选择单个按钮来操作,或作为一 个整体对象来操作。 在表单设计中,类似命令按钮组的常用容器还有选项按钮组、表格控件、页框控件等。 为了使用容器中包含的某个控件,以便单独为其设置属性、方法或事件,可以采用以下的方法: ⑴ 从属性窗口的对象下拉列表框中选择所需的容器中包含的某个控件的名称; ⑵ 用鼠标右键单击窗体 设计器中的容器对象,然后从 弹出的快捷菜单中选择“编辑” 命令,容器对象四周出现阴影, 表明容器进入编辑状态,用户 就可以通过单击容器中的某个 控件对其进行选定。 可以使用命令组生成器来 设置命令按钮组常用属性。在 命令按钮组的快捷菜单中选择 “生成器”命令,就可以打开 “命令组生成器”对话框。如

(a)

图 7.22(a)、(b)所示,分别是命 令组生成器的两个选项卡。 在“按钮”选项卡中可以 设定命令按钮组中包含的按钮 的个数、每个按钮的标题,也 可以为每个按钮设置显示的图 像。在“布局”选项卡中,可 以设定命令组里的按钮是水平 排列还是垂直排列,可以指定 各个按钮之间的间距及命令按 钮组的边框样式。

(b) 图 7.22 按钮组生成器

文本框、编辑框、选项按钮组、列表框、组合框和表格等控件都具有各自的生成器用于 设定控件主要属性,使用方法与此相类似,将不再重复介绍。 命令按钮组有以下常用属性: ⑴ AutoSize 属性

224


指定是否根据命令按钮的个数和大小自动调整命令按钮组的大小。取.F.(默认值),不调 整;取.T.,自动调整大小。 ⑵ ButtonCount 属性 指定命令按钮组中命令按钮的个数。默认值为 2。 ⑶ Value 属性 由于命令按钮组中包含了若干命令按钮,响应用户单击时必须区分出操作的是按钮组控 件还是其中的某一个命令按钮。如果辨别出了是对命令按钮进行操作,还需知道是对哪一个命 令按钮进行了操作 Value 属性返回值指明哪一个命令按钮被操作,即命令按钮组的当前状态。用户操作某个 命令按钮时,该属性就会获得一个数值或者字符串:当 Value 值在属性窗口中设置为 1(默认 值)时,该属性返回数值型值 n,表明命令按钮组中的第 n 个按钮被操作;当 Value 值在属性 窗口中设置为空时,该属性返回字符型值 c,表明命令按钮组中的 Caption 属性值为 c 的那个 按钮被操作。 若命令按钮组包含的某个命令按钮有自己的 Click 事件代码,那么一旦单击该按钮,则执 行它自己的 Click 事件代码,而不会执行命令按钮组的 Click 事件代码;若某个命令按钮不拥 有自己的 Click 事件代码,那么单击该按钮,则执行命令按钮组的 Click 事件代码。

7.3.4 文本框和编辑框控件 文本框(TextBox)和编辑框(EditBox)控件都可以用来输入、输出、编辑数据。标准的 编辑操作,如剪切、复制、粘贴,在这两个控件中都可以使用。但它们又有各自不同的特点。 1.文本框控件 文本框只包含一行数据,可以用来输入、输出和编辑数值型、字符型、逻辑型、日期型 或日期时间型数据。同样可以用文本框生成器来方便地设置文本框的一些常用属性。 ⑴ ControlSource 属性 文本框的数据可以通过数据绑定来获得,而数据绑定则是通过设置 ControlSource 属性来 实现。 控件数据绑定是指将控件与某个数据源联系在一起。数据源有字段和内存变量两种,字 段来自表单数据环境中的表。ControlSource 属性的设置即是对控件数据源的指定。当控件与 数据源绑定后,控件的值就与数据源一致了。例如将控件与字段绑定,则控件值由字段值决定, 而字段值也随控件值的改变而改变。 该属性还适用于编辑框、选项按钮组、复选框、列表框、组合框、微调控件等控件。 ⑵ Value 属性 指定文本框的值并显示出来,或者返回文本框的当前内容。默认值为空串,字符型。

225


Value 属性值可以为数值型、字符型、逻辑型、日期型或日期时间型数据。通过对该属性 的赋值可以改变文本框可编辑数据的类型。 向文本框输入数据时,如遇长数据能够自动换行,但是不能键入回车符,即只能输入一 段数据。 ⑶ PasswordChar 属性 指定用作占位符的字符,决定控件内是显示用户输入的字符还是显示占位符。 默认值为空串,此时文本框内显示用户输入的内容;为该属性指定一个字符后(如“*”), 文本框内只显示占位符,而不显示用户输入的内容。此属性不会影响 Value 属性的值,Value 属性中总是用户实际输入的内容。 ⑷ InputMask 属性 指定在文本框中如何输入和显示数据。 InputMask 属性值是一个字符串。该字符串通常由一些所谓模式符组成,每个模式符规定 了相应位置上数据的输入和显示行为。各种模式符的功能如表 7.3 所示。该属性之中也可以包 含其它字符,字符在文本框中将会原样显示。 该属性在设计和运行时可用。除了文本框,还适用于组合框、列等控件。 表 7.3

模式符及其功能

模式符

X

允许输入任何字符

9

允许输入数字和正负号

#

允许输入数字、空格和正负号

$

在固定位置上显示当前货币符号(由 Set Currency 命令指定)

$$

在数值前面相邻的位置上显示当前货币符号(浮动货币符)

*

在数值左边显示星号*

.

指定小数点的位置

,

分隔小数点左边的数字串

【例 7.5】设计一个登录表单 password.scx,如图 7.23 所示。当用户在文本框输入密码并 按确定按钮后,检验密码是否正确。若正确(密码为 12345),显示“欢迎使用……”对话框; 若不正确,则显示“密码不对,请重新输入……”对话框;若三次输入不正确,则显示“密码 不对,登录失败!”对话框。 操作要点如下: ① 创建空白表单,在表单上添加一个标 签,一个文本框,两个命令按钮。它们的 Name 属 性 值 分 别 为 默 认 值 Label1 、 Text1 、 Command1、Command2。将表单的 Caption 属 图 7.23 登录表单

226


性设置为“登录”,并将 Label1 的 Caption 属性值设置为“请输入密码:”,Text1 的 PasswordChar 属性值设置为“*” ,Command1 的 Caption 属性值设置为“确定”,Command2 的 Caption 属性 值设置为“取消”。 ② 在表单的 Init 事件中添加代码如下: Public i

&& 定义全局变量 i, 用于统计密码的输入次数

i=0 ③ 命令按钮 Command1 的 Click 事件中添加代码如下: i=i+1 If

Thisform.Text1.Value="12345" Messagebox("欢迎使用……") Thisform.Release

Else If

i<3 Messagebox("密码不对,请重新输入……") Thisform.Text1.Value="" Thisform.Text1.Setfocus

Else Messagebox("密码不对,登录失败!") Thisform.Release Endif Endif ④ 命令按钮 Command2 的 Click 事件中添加代码如下: Thisform.Release MessageBox( )函数的功能及使用方法简介如下: 格式:MessageBox(<提示信息>[, <对话框类型>[, <对话框标题>]]) 功能:在屏幕上弹出一个指定格式的信息提示对话框,其中的<对话框类型>由三部分代 码组合而成:按钮个数+对话框中显示的图标+缺省按钮。各部分代码取值如表 7.4 所示。 表 7.4

对话框类型代码及功能 取值

按钮个数 对话框图标

227

含义

取值

含义

0

确定按钮,默认值

3

是、否和取消按钮

1

确定和取消按钮

4

是和否按钮

2

终止、重试和忽略按钮

5

重试、取消按钮

16

停止图标

48

感叹号图标


缺省按钮

32

问号图标

64

信息图标

0

第一个按钮为缺省按钮,默认值

512

第三个按钮为缺省按钮

256

第二个按钮为缺省按钮

对话框类型缺省值为只有“确定”按钮,无图标,且“确定”按钮为缺省按钮。 函数的返回值为 1~7 之间的整数,该整数表明用户在对话框中单击了哪个按钮。按钮与 返回值之间的关系为: 1-“确定”按钮;2-“取消”按钮;3-“终止”按钮;4-“重试”按钮;5-“忽略”按钮; 6-“是”按钮;7-“否”按钮。 【 例 7.6 】 设 计 添 加 记 录 表 单 tjjl.scx,如图 7.24,用户在两个文本框 中分别输入系部编号和系部名称,单击 “添加”按钮,将输入的值作为一条记 录添加到 xb.dbf 数据表中;单击“清空” 按钮,清空两个文本框的内容。单击 “退出”按钮,退出程序的运行。 图 7.24 添加记录表单

操作要点如下:

① 创建空白表单,在表单上添加两个标签,两个文本框,一个命令按钮组。它们的 name 属性取默认值,分别是:Label1、Label2、Text1、Text2、CommandGroup1。将表单的 Caption 属性设置为“添加记录” ;Label1、Label2 的 Caption 属性分别设置为“系部编号:” 、“系部名 称:”;利用按钮组生成器命令按钮组的按钮布局设为“水平排列”,ButtonCount 设为 3,其中 包含的 Command1 的 Caption 属性设置为“添加”,Command2 的 Caption 属性设置为“清空”, Command3 的 Caption 属性设置为“退出”。 ② 在命令按钮组 CommandGroup1 的 Click 事件中添加代码如下: Do

Case

Case

This.Value=1

&& 单击了第一个命令按钮

ss=MessageBox("确定要添加记录吗?", 1, "确定") If

ss=1 Insert

Into xb

Values(Thisform.Text1.Value, Thisform.Text2.Value)

Else Thisform.Text1.Value=" " Thisform.Text2.Value=" " EndIf Case

This.Value=2

&& 单击了第二个命令按钮

Thisform.Text1.Value=" "

228


Thisform.Text2.Value=" " Case

This.Value=3

&& 单击了第三个命令按钮

Thisform.Release Endcase 2.编辑框控件 编辑框与文本框的主要区别在于: ⑴ 编辑框只能用于输入或编辑字符型数据。 ⑵ 编辑框可以输入多段文本,即可以输入回车符。因此编辑框可用来处理长文本或者备 注型字段。此时通常需要对编辑框的 ScrollBar 属性来设置编辑框是否显示垂直滚动条(默认 值 2-显示滚动条;0-没有滚动条)。

7.3.5 选项组和复选框控件 选项组(OptionGroup)与复选框(CheckBox)是表单中的常见对象。选项组由一组选项 按钮组成,用户只能在其中选择一项;复选框在表单中可以独立存在,如果存在多个复选框, 允许用户同时选择多项。用户的选择通常通过鼠标单击来实现,因此两个控件通常响应 Click 事件。 1.选项组控件 选项组是包含一组选项按钮的容器。一个选项组中包含若干个选项按钮,但用户只能选择 其中的一个按钮,被选中的按钮会显示一个圆点,而选项组中其它的按钮都变为未选状态。 ⑴ AutoSize 属性 指定是否根据选项按钮的个数和大小自动调整命令按钮组的大小。取.F.(默认值),不调 整;取.T.,自动调整大小。 ⑵ ButtonCount 属性 指定选项组中命令选项按钮的个数。默认值为 2。 ⑶ Value 属性 指定选项组中哪个选项按钮被选中。该属性可以是数值型的(默认类型)也可以是字符型 的。若是数值型值 n,表明选项组中的第 n 个选项按钮被选中;若是字符型值 c,表明选项组 中的 Caption 属性值为 c 的那个选项按钮被选中。 选项组的常用属性也可以通过选项组生成器来快速设置,使用方法类似命令按钮组生成 器,不再重复介绍。 2.复选框控件 复选框可被用户指明选定还是清除,被选定的复选框会显示一个对号。在实际应用时通常

229


使用多个,用户可以从中选定多项来实现多选。 ⑴ Value 属性: 复选框的 Value 属性表明了复选框的当前状态。0(默认值)或.F.表明未被选中;1 或.T. 表明被选定;2 或.Null.表明状态不确定,此项仅在代码中有效。 ⑵ ControlSource 属性: 如果复选框的 ControlSource 属性设置为表中的一个逻辑字段,那么当前记录的字段值为 “真”(.T.)时,复选框显示为选中;如果当前记录的字段值为“假”(.F.),复选框显示为未 选中;如果当前记录字段为 Null 值(.Null.),复选框则变为灰色。 【例 7.7】 设计一个能够浏览或编辑关于教师的 4 个数据库表的数据表维护表单 sjbwh.scx,如图 7.25 所示。用户可选择其 中一个数据表,并且选定是否能够对表中 的数据进行编辑,然后单击“确定”按钮, 浏览或者编辑该表中的数据。 操作要点如下: ① 创建空白表单,设置表单数据环 境,将数据表 jsqk.dbf、kyqk.dbf、gz.dbf、

图 7.25 数据表维护表单

xb.dbf 添加到数据环境中。 ② 在表单上添加一个选项组,一个复选框、两个命令按钮,其 Name 属性值分别取系统 默认值 OptionGroup1、Check1、Command1、Command2。利用选项组生成器将选项按钮数目 设置为 4,并将 4 个选项按钮标题分别改为“教师情况表”、 “科研情况表”、 “工资表”和“系 部表”。将 Form1 的 Caption 属性值设置为“数据表维护”,Check1 的 Caption 属性值设置为“编 辑”, Command1 的 Caption 属性值设置为“确定” ,Command2 的 Caption 属性值设置为“取 消”。 ③ 在选项组 OptionGroup1 的 Click 事件中添加代码如下: Do

Case

Case

This.Value=1

Select jsqk Case

This.Value=2

Select kyqk Case

This.Value=3

Select gz Case

This.Value=4

Select xb

&& 选定 option1 选项按钮时 && 选择 jsqk 所在工作区 && 选定 option2 选项按钮时 && 选择 kyqk 所在工作区 && 选定 option3 选项按钮时 && 选择 gz 所在工作区 && 选定 option4 选项按钮时 && 选择 xb 所在工作区

Endcase ④ 在命令按钮 Command1 的 Click 事件中添加代码如下: 230


If

Thisform.Check1.Value=.t.

&& Check1 被选定时返回 1

Browse

&& 可以编辑数据

Else

&& Check1 未被选定

Browse

NoModify

NoAppend

NoDelete

&& 仅可浏览不可编辑

Endif 注意:NoModify 为不可修改字段的值,NoAppend 为不可添加新记录,NoDelete 为不 可删除记录。 ⑤ 在命令按钮 Command2 的 Click 事件中添加代码如下: Thisform.Release

7.3.6 列表框和组合框控件 列表框(ListBox)和组合框(ComboBox)都有一个供用户选择的选项列表。两者有以下 主要区别: ⑴ 列表框任何时候都显示它的选项列表;组合框平时只显示被选择的选项,用户单击下 拉按钮时才能显示可滚动的下拉列表。 ⑵ 组合框又分为下拉列表框与下拉组合框两类。前者与列表框类似,只有选择功能;后 者除可以选择已有选项的功能外,还可以在编辑区内输入数据。 1.列表框控件 列表框提供一组选项列表,用户操作时可以通过鼠标单击或者双击列表项从中选择一项或 多项。因此该控件通常响应 Click 和 DblClick 事件。 ⑴ RowSourceType 属性和 RowSource 属性 RowSourceType 属性决定了列表框列表项的数据源类型;RowSource 属性决定了列表项的 数据源。该属性也适用于组合框。其设置值如表 7.5 所示。 表 7.5 设置值

列表框 RowSourceType 属性设置值和 RowSource 属性取值列表 含

0

默认值, 无。 在代码中用 AddItem 方法添加列表项, 用 RemoveItem 方法移除列表项。

1

值。RowSource 指定逗号分隔的数据项作为列表项。如 RowSource="one, two, three, four"

2

别名。RowSource 指定别名,表由数据环境提供,用 ColumnCount 确定字段数,总 是表中最前面的若干字段名作为列表项。

3

SQL 语句。RowSource 指定 SQL SELECT 命令,选出一个或多个表中的字段,将其 取值作为列表项。如 RowSource="Select * From gz Into Cursor List1"

231


4

查询(.qpr)。RowSource 指定一个.qpr 文件名。

5

数组。RowSource 指定数组名。

6

字段。RowSource 指定逗号分隔的字段名列表,首字段有表名前缀,表来自数据环 境。如 RowSource="gz.jsbh, jcgz"。

8

结构。RowSource 指定表名,以表中所有字段名作为列表项。 ⑵ List 属性 用以存储列表框中列表项的字符串数组。在设计时不可用。该属性也适用于组合框。例如,

表单的 Name 属性为 List1,可以用以下语句分别实现第三个列表项的读与写: myselect=ThisForm.List1.List(3) ThisForm.List1.List(3)= "OK" ⑶ Selected 属性 指定某个列表项是否处于被选定状态的逻辑数组。在设计时不可用。该属性也适用于组合 框。例如可以用以下代码判断第三个列表项是否被选中: If

ThisForm.List1.Selected(3) a=MessageBox("The third is selected!")

Else a=MessageBox("The third is not selected!") Endif ⑷ ColumnCount 属性 指定列表框中列表项的列数。该属性也适用于组合框。 ⑸ ListCount 属性 返回列表项的项数。在设计时不可用,在运行时只读。该属性也适用于组合框。 ⑹ Value 属性 指明列表框中被选中的列表项。该属性可以是字符型的(默认类型),也可以是数值型的。 若是字符型值 c,表明列表框中的内容为 c 的那个列表项被选中;若是数值型值 n,表明列表 框中的第 n 个列表项被选中。该属性也适用于组合框。 ⑺ ControlSource 属性 该属性在列表框和组合框中的用法与在其它控件中的用法不同,用来指定字段或变量, 存储用户选择的列表项。 ⑻ MultiSelect 属性 指定用户能否在列表项中进行多选。为 0 或 .F.(默认值)时,不允许多选;为 1 或 .T. 时,用户可以按下 Ctrl 键的同时用鼠标单击要选择的列表项进行多选。仅适用于列表框。 ⑼ AddItem 方法 格式:<对象引用>.AddItem(<cItem>[, <nIndex>][, <nColumn>])

232


功能:在列表框或组合框中添加以 cItem 为内容的新的列表项,cItem 为字符型;nIndex, 整型值,用来指定新列表项的位置,缺省时当 Sorted 属性为.T.,则按字母顺序插入列表,否 则添加到最后位置;nColumn 用来指定放置新列表项的列,缺省值为 1。 ⑽ RemoveItem 方法 格式:<对象引用>.RemoveItem(<nIndex>) 功能:在列表框或组合框中删除某列表项。nIndex,整型值,用来指定要删除的列表项的 位置。 注意:只有当控件的 RowSourceType 定义为 0,1 时,才能进行添加或者删除列表项的 操作。 2.组合框控件 组合框拥有与列表框类似的属性、方法,并且具有相似的含义和用法。但是组合框不具 有 MultiSelect 属性,因此不能进行多选。 组合框有两种形式:下拉列表框和下拉组合框。通过属性 Style 属性设定:0-下拉组合框, 用户既可以从已有列表项中选择,也可以在编辑区中输入,输入的内容从 Text 属性中获得; 2-下拉列表框,用户只能从已有列表项中选择。 3.生成器

233


可以用列表框生成器或者组合框生成器方便地设置列表框或者组合框的常用属性,快速 生成列表框或者组合框。下面以列表框生成器为例,简单介绍生成器的使用方法,组合框生成

(a1)

(a2)

(a3)

(b)

(c)

图 7.26 列表框生成器

(d)

器与列表框生成器使用方法类似。 列表框生成器含有列表项、样式、布局、值等 4 个选项卡。图 7.26 列出了该生成器的全 部界面,其中(a1)、(a2)、(a3)为“列表项”选项卡的三种填充类型对应界面;(b)、(c)、(d)分 234


别为“样式” 、“布局” 、“值”选项卡。 ⑴“列表项”选项卡 指定列表框的数据项的类型,可以是:表或视图中的字段;手工输入的数据;数组中的 值。用户可以通过“用此项填充列表”下拉列表框来进行选择。选择其中之一后,选项卡下半 部分会出现相应如(a1)、(a2)、(a3)的界面。 在(a1)界面中,用户可通过对话框按钮选择数据库表或自由表,然后从“可用字段”列表 框中向“选定字段”列表框中添加字段。这些字段的值就构成了列表框的列表项,且一个字段 占列表框中的一列。 在(a2)界面中,用户可通过微调按钮指定列数,然后直接在表格中输入各列的列表项。 在(a3)界面中,用户可指定一个已定义数组的全部或者部分元素的值作为列表项数据。 ⑵“样式”选项卡 用于指定列表框的样式,所显示的行数及是否要递增搜索。 ⑶“布局”选项卡 用来控制列宽。在表格中可以用鼠标拖动列标头之间的列间隔线来调整列宽,用鼠标双 击列标头隐藏某列。 ⑷“值”选项卡 “从哪一列中返回值”对应当列表框中有多列列表项时,Value 属性返回的是哪一列中被 选定的列表项;“字段名”下拉列表框对应 ControlSource 属性,用以保存返回的字段值。 【例 7.8】创建一个如图 7.27 所示的学历职称查询表单 xlzccx.scx。用户在组合框中选择 查询方式,列表框中即列出相应字段的所有的值,用户选择其中之一,单击“查询”按钮,可 以查询其所对应的记录的学历及职称。 操作要点如下: ① 创建空白表单,设置表单 数据环境,将数据表 jsqk.dbf 添 加到数据环境中。 ② 在表单上添加四个标签、 两个文本框、一个命令按钮、一 个列表框、一个组合框,它们的 Name 属性值均取系统默认值, 分别为:Lable1、Label2、Lable3、 Lable4、Text1、Text2、Command1、 List1、Combo1。Lable1、Label2、 Lable3、Lable4 的 Caption 属性分

图 7.27 学历职称查询表单

别设置为“请选择查询方式:” 、 “请选择要查询的值:” 、 “学历: ”、 “职称: ”;Command1 的 Caption 属性设置为“查询”;List1 的 RowSourceType 属性设置为 3-SQL 语句;Combo1 的 RowSourceType 235


属性设置为 1,RowSource 属性设置为"教师编号, 教师姓名, 出生日期"。 ③ 在表单 Form1 的 Init 事件中添加代码如下: Thisform.Text1.Value=" "

&& 将文本框清空

Thisform.Text2.Value=" " ④ 在组合框 Combo1 的 Click 事件中添加代码如下: ss=Thisform.Combo1.Value Do

&& 用户单击选择的内容存在 ss 变量中

Case

Case ss="教师编号"

&& 如果用户选择“教师编号”

Thisform.List1.RowSource="Sele jsbh From jsqk Into Cursor List1" && 将所有的 jsbh 字段值显示在列表框中 Case

ss="教师姓名"

Thisform.List1.RowSource="Sele xm Froms jsqk Into Cursor List1" Case

ss="出生日期"

Thisform.List1.RowSource="Sele csrq From jsqk Into Cursor List1" Endcase ⑤ 在命令按钮 Command1 的 Click 事件中添加代码如下: Do

Case

Case

Thisform.Combo1.Value="教师编号"

Locate All Case

For

jsqk.jsbh=Allt(Thisform.List1.Value)

Thisform.Combo1.Value="教师姓名"

Locate All Case

&& 根据用户的选择进行查询

For

jsqk.xm=Allt(Thisform.List1.Value)

Thisform.Combo1.Value="出生日期"

Locate All

For

Dtoc(jsqk.csrq)=Allt(Thisform.List1.Value)

Endcase Thisform.Text1.Value=jsqk.xl Thisform.Text2.Value=jsqk.zc Thisform.Refresh

7.3.7 表格控件 表格(Grid)是一种容器,可以按行和列的形式来显示数据。表格包含如下对象: ① 表格(Grid):由若干列对象组成。 ② 列(Column):一列可以显示表的一个字段。列是包含列标题和列控件的一种容器。 ③ 列标题(Header):显示列标题。

236


④ 列控件:一列必须设置一个列控件,该列中的每个单元格都可用此控件来显示数据。 默认为文本框。可以根据显示数据类型进行修改。 表格、列、列标题、列控件都有自己的属性、方法、事件,便于用户灵活使用表格。 1.生成器 可以利用表格生成器快速生成表格。表格生成器含有表格项、样式、布局、关系 4 个选项 卡。图 7.28 列出了该生成器的全部界面,(a)、(b)、(c)、(d)分别为“表格项”、 “样式” 、 “布局”、 “关系”选项卡。 ⑴“表格项”选项卡 在此卡中选择数据库表、自由表或者视图,然后选取需要显示的字段。 ⑵“样式”选项卡 在此卡的“样式”列表中选择表格样式。 ⑶“布局”选项卡 此卡中包含一个文本框、一个下拉列表框和一个表格。表格中显示的是“表格项”选项卡 中选择的字段的值,一个字段占一列,用户可以通过鼠标点击选定一列,这时在标题文本框中 可以输入该列的列标题文本,对应下面介绍的列标题的 Caption 属性;类似地,在控件类型下 拉列表框中可以选择一种控件来显示字段的值,对应下面介绍的列的 CurrentControl 属性,默 认是文本框控件。不同数据类型的字段可以选用不同的控件来显示,例如逻辑型字段可以选用 复选框来显示。 ⑷“关系”选项卡

237


此选项卡中包含两个下拉列表框,用于指定两表之间的关系。“父表中的关键字段”下拉

(a)

(c)

(b)

图 7.28 表格生成器

(d)

列表框用来指定父表中的关键字,对应于下面介绍的表格的 LinkMaster 属性; “子表中的相关 索引”下拉列表框用来指定子表中的索引标识名,对应于下面介绍的表格的 ChildOrder 属性。 2.表格常用属性 ⑴ RecordSourceType 属性和 RecordSource 属性 RecordSourceType 属性决定了表格的数据源类型;RecordSource 属性决定了表格的数据 源。其设置值如表 7.6 所示。 表 7.6 设置值

表格 RecordSourceType 属性和 RecordSource 属性取值列表 含

0

表。RecordSource 指定表名,该表能自动打开。

1

默认值,别名。RecordSource 指定已打开的表的别名。

2

提示。运行时,用户根据提示选择数据源。

3

查询(.qpr)。RecordSource 指定一个.qpr 文件名。

4

SQL 语句。RecordSource 指定 SQL SELECT 语句。

238


⑵ ColumnCount 属性 指定表格的列数,即表格包含的列对象的个数。默认值为-1,此时表格自动创建足够多的 列来显示数据源中所有字段。 ⑶ LinkMaster 属性 指定与表格中所显示的子表建立关联的父表的名称。 ⑷ ChildOrder 属性 指定建立表间关联时,表格中所显示的子表的索引标识名。 3.列常用属性 ⑴ ControlSource 属性 指定在列中显示的数据源,通常是表中的一个字段。 ⑵ CurrentControl 属性 为列指定活动控件。缺省时,列对象包含一个列标题(Header1)控件和一个文本框(Text1) 控件,CurrentControl 属性即为 Text1。用户可以根据需要在表格控件的编辑状态下向列中添加 新控件,并将 CurrentControl 属性设置为其中的某个控件的 Name 属性。如可以添加复选框控 件并将其设置为活动控件,用来显示逻辑型字段数据。 ⑶ Sparse 属性 逻辑值。为 .T. 时,CurrentControl 属性仅影响当前选定单元格,其它单元格仍为文本框; 为 .F. 时,该列的所有单元格均以 CurrentControl 属性指定的控件显 示。 4.列标题常用属性 列标题的常用属性 Caption 用 来设置表格列的标题文本。 【例 7.9】创建如图 7.29 所示 系部人员信息查询表单 xbrycx.scx, 用户从组合框中选择系部名称,单 图 7.29 系部人员信息查询表单

击查询按钮,在表格中显示该系部 中的教师信息。 操作要点如下:

① 创建表单,设置表单数据环境,将表 jsqk.dbf 和 xb.dbf 添加到数据环境中。 ② 在表单上添加一个标签、一个组合框、一个命令按钮和一个表格,其 Name 属性取系 统默认值。其它控件属性设置如表 7.7 (a)、(b)所示。 表 7.7 对象 239

例 7.9 属性设置 属性

属性值

对象

属性

属性值


Command1

Caption

查询

Label1

Caption

系部:

Grid1

RecordSourceType

4-SQL 说明

Grid1

ColumnCount

5

Combo1

RowSourceType

6-字段

Combo1

RowSource

xb.xbmc

(a) 列对象名

列标头对象名

属性

属性值

Column1

Header1

Caption

教师编号

Column2

Header1

Caption

姓名

Column3

Header1

Caption

性别

Column4

Header1

Caption

出生日期

Column5

Header1

Caption

职称

(b) ③ 在命令按钮 Command1 的 Click 事件中添加代码如下: Thisform.Grid1.RecordSource="Select Where Into

jsqk.xbbh=xb.xbbh And Cursor

jsbh, xm,

xb,

csrq, zc

From jsqk,

xb ;

Allt(xbmc)=Allt(Thisform.Combo1.Value) ;

Grid1"

Thisform.Refresh

7.3.8 页框控件 页框(PageFrame)是包含若干个页面(Page)对象的容器,而页面本身也是一种容器, 可以包含用户所需要的控件。页框、页面及其上面的控件构成了在应用程序中经常用到的选项 卡。 向页面添加需要的控件时,应使页框容器处于编辑状态下,然后选定某个页面,即某个 页面应处于选定状态下,再向其中添加控件。否则控件将创建在表单中而不是页框的某个页面 中。页框的常用属性有: ⑴ PageCount 属性 指明一个页框所包含页面的个数。默认值为 2。 ⑵ Tabs 属性 逻辑值,指定页框控件有无选项卡。默认值为 .T.,显示选项卡。 ⑶ TabStrech 属性 指定页面标题文本过长不能完整显示时的处理方式。默认值为 1,此时标题仅在一行内显 示其中的一部分;为 0 时,以多行显示所有的标题文本。 ⑷ ActivePage 属性 240


指明页框中活动页面的页号。 页面对象最常用的属性是 Caption, 用来设置页面(页框选项卡)的标题文本。 【例 7.10】创建如图 7.30 所示的 教师信息浏览表单 jsxxll.scx,用户可 以通过单击按钮组中的按钮浏览 jsqk.dbf 表 中 的 每 一 条 记 录 及 在 xb.dbf、kyqk.dbf 表中与该记录相关的 数据。 操作要点如下: ① 创建表单,设置表单数据环 境,将表 jsqk.dbf、kyqk.dbf 和 xb.dbf 添加到数据环境中,在数据环境中为 表 jsqk 和 xb 按 xbbh 字段建立关联, 表 jsqk 和 kyqk 按 jsbh 建立关联。

(a)

② 直接将表 jsqk 中的 jsbh、xm、 xb、csrq、xl、zc、gzrq 七个字段从数 据环境中拖动到表单中,系统会自动 产生相应控件来和这些字段相联系。 将表单的 Caption 属性设为“教 师信息浏览” 。 在表单上添加一个包含两个页面 的页框控件,将其置于编辑状态下, 然后将 xb 表中的 xbbh、xbmc 两个字 段从数据环境拖动到 Page1 中,系统 也会自动产生相应控件来和这些字段

(b)

相联系。将 Page1 的 Caption 属性设

图 7.30 例 7.10 示意图

置为“系部” 。 将 Page2 的 Caption 属性设置为“科研成果”。在 Page2 中添加一个表格控件,打开相应 的表格生成器。在“表格项”选项卡中,选择 kyqk 表中的 cgbh、cgmc、cglb 字段作为“选定 字段”;在“布局”选项卡中,将 cgbh、cgmc、cglb 字段三列的标题分别改为成果编号、成果 名称、成果类别;在“关系”选项卡中,将“父表中的关系字段”设置为 jsqk.jsbh,将“子表 中的相关索引”设置为 jsbh。 在表单上添加一个命令按钮组控件,打开相应的命令按钮组生成器。将按钮数目设置为 4 个,标题分别为“首记录”、“末记录”、“上一条”、“下一条”,按钮布局设置为水平。 所有对象的 Name 属性均取系统默认值。 241


③ 在表单的 Load 事件中添加代码如下: Sele

jsqk

④ 在 CommandGroup1 中 Command1 的 Click 事件中添加代码如下: Go

Top

This.Enabled=.F. Thisform.Commandgroup1.Command3.Enabled=.F. Thisform.Commandgroup1.Command2.Enabled=.T. Thisform.Commandgroup1.Command4.Enabled=.T. Thisform.Refresh ⑤ 在 CommandGroup1 中 Command2 的 Click 事件中添加代码如下: Go

Bottom

This.Enabled=.F. Thisform.Commandgroup1.Command4.Enabled=.F. Thisform.Commandgroup1.Command1.Enabled=.T. Thisform.Commandgroup1.Command3.Enabled=.T. Thisform.Refresh ⑥ 在 CommandGroup1 中 Command3 的 Click 事件中添加代码如下: Skip -1 If

Bof( ) This.Enabled=.F. Thisform.Commandgroup1.Command1.Enabled=.F. Thisform.Commandgroup1.Command2.Enabled=.T. Thisform.Commandgroup1.Command4.Enabled=.T.

Else This.Enabled=.T. Thisform.Commandgroup1.Command1.Enabled=.T. Thisform.Commandgroup1.Command2.Enabled=.T. Thisform.Commandgroup1.Command3.Enabled=.T. Endif Thisform.Refresh ⑦ 在 CommandGroup1 中 Command4 的 Click 事件中添加代码如下: Skip If

1

Eof( ) This.Enabled=.F. Thisform.Commandgroup1.Command2.Enabled=.F. 242


Thisform.Commandgroup1.Command1.Enabled=.T. Thisform.Commandgroup1.Command3.Enabled=.T. Else This.Enabled=.T. Thisform.Commandgroup1.Command1.Enabled=.T. Thisform.Commandgroup1.Command2.Enabled=.T. Thisform.Commandgroup1.Command4.Enabled=.T. Endif Thisform.Refresh

7.3.9 计时器控件 计时器(Timer)控件能按指定的时间间隔周期性地执行某种操作。该控件在设计时是可 见的,但在运行时不可见。 ⑴ Timer 事件 每经过指定的时间间隔触发一次 Timer 事件。 ⑵ Interval 属性 指定计时器时间间隔,决定计时器事件发生的频率,单位为毫秒。 时间间隔的长短要根据 Timer 事件动作要达到的精度来确定。应当注意计时器事件越频 繁,处理器就需要用越多的时间响应 Timer 事件,这样会降低整个程序的性能,因此不应将时 间间隔设置得太小。 ⑶ Enabled 属性 当该属性设置为 .T. 时计时器被启动,按定时时间间隔重复执行其 Timer 事件;该属性设 置为 .F.,将挂起计时器的运行,不再执行 Timer 事件。默认值为 .T. 。

7.3.10 微调控件 使用微调(Spinner)控件可以接受指定范围内的数值输入。用户可以通过上箭头或下箭 头增减当前值,或直接在微调框中键入值。 ⑴ KeyboardHighValue 属性和 KeyboardLowValue 属性 分别指定键盘输入数值的最大值和最小值。 ⑵ SpinnerHighValue 属性和 SpinnerLowValue 属性 分别指定按钮微调数值的最大值和最小值。 ⑶ Increment 属性 243


设定每次单击上箭头或下箭头时增加或减少的值,默认为 1.00。 ⑷ Value 属性 微调框中数据的当前值。

7.3.11 图像控件 图像(Image)控件用于图像文件的输出,文件类型可以是 .bmp、.ico、.cur、.gif、.jpg 等。 ⑴ Picture 属性: 指定图像控件显示的图像文件,可在设计或运行时进行设置。如以下代码可以设置当前表 单的 Image1 控件显示的图像: Thisform.Image1.Picture="c:\Visual FoxPro\fox.bmp" ⑵ Stretch 属性 指定如何调整一幅图像以适应控件大小。取 0(默认值)时,剪裁图像以适合控件;取 1 时,等比例填充,即调整图像大小以适合控件,同时保持图像的原始比例。取 2 时,变比例填 充,即调整图像大小以适合控件,但是不保持图像的原始比例。 ⑶ BackStyle 属性 指定图像控件的背景是否透明。取 0 为透明,取 1(默认值)为不透明。

7.3.12 容器控件 容器(Container)控件一般用作根据用户需要包含多个不同类型的控件对象,起到控件分 组作用。在容器控件的编辑状态下(在容器控件的快捷菜单中选定“编辑”命令) ,将所需控 件装入其中,容器控件就包含了该控件。 操作时应注意两点: ⑴ 若容器控件未处于编辑状态下,即 使将控件置于其中也不会被其包含; ⑵ 装入的控件必须是新建的,将已有 的控件拖动到容器控件内也无效。 容器包含控件时,拖动该容器,其包含 的控件也随之移动,否则不会移动。 【例 7.11】 设计如图 7.31 所示图像水 平移动的表单,用户可以设置图像移动的速 度。单击“应用”按钮,图像以用户设定的 图 7.31 例 7.11 示意图 244


速度移动。 操作要点: ① 创建表单,在其中放置一个图像控件、一个计时器、一个容器控件,将容器控件置于 编辑状态下,在其中包含一个标签、一个微调按钮、一个命令按钮。各控件的 Name 属性保留 系统默认值,其它属性设置如表 7.8。Image1 的 Picture 属性可以包含图片文件所在的路径, 该属性的当前设置值必须保证图片在系统默认目录下。 表 7.8

例 7.11 属性设置

对象

属性

属性值

对象

属性

属性值

Image1

Picture

Fox.bmp

Command1

Caption

应用

Container1

SpecialEffect

1-凹下

Label1

Caption

设置速度

Increment

10

Value

100

KeyboardLowValue

100

KeyboardHighValue

300

SpinnerlowValue

100

SpinnerHighValue

300

Spinner1

Spinner1

② 在命令按钮 Command1 的 Click 事件中添加代码如下: Thisform.Timer1.Interval=500-Thisform.Container1.Spinner1.Value ③ 在 Timer1 的 Timer 事件中添加代码如下: If

Thisform.Image1.Left>Thisform.Width Thisform.Image1.Left=0

&&如果图像移出了表单右边界 &&将图像左边界置 0

Endif Thisform.Image1.Left=Thisform.Image1.Left+2

7.4

&&图像向右移动 2 个单位

Visual FoxPro 中类的建立

Visual FoxPro 8.0 支持自定义类,通常用户会为重复使用的通用功能创建类。用户自定义 的类可以添加到表单控件工具栏中,以便用其生成对象,添加到表单中。 创建新类通常有两种方法,利用“类设计器”或者直接通过程序代码创建。本小节仅介 绍“类设计器”创建类的方法。 利用“类设计器”创建类,首先要用菜单方式或命令方式打开“新建类”对话框,完成 新类的命名,指定父类和存储类定义的类库文件,然后在类设计器中设计、修改新类的属性、 方法和事件。 1.创建新类 ⑴ 菜单方式 245


① 单击“文件”下拉菜单中的“新建”命令,打开“新建”窗口; ② 选择“类”,然后单击“新建文件”按钮,进入“新建类”对话框,如图 7.32 所示;

图 7.32 “新建类”对话框 ③ 在“新建类”对话框中,定义如下信息: z 在“类名”文本框中,定义新类名; z 在“派生于”下拉表中,选择基类名或者父类名; z 在“存储于”文本框中,指定类库文件名和类库文件的存储位置。 单击“确定”按钮,进入“类设计器”窗口。 ⑵ 命令方式 格式 1:Create Class <类名> 功能:打开“新建类”窗口,建立以<类名>命名的新类。之后的操作与菜单方式相同。 格式 2:Create Class <类名> of <类库文件名> 功能:建立以<类名>命名的新类,存储于<类库文件名>命名的类库中,并打开“类设计 器”窗口。 使用以上两种方法创建的用户自定义类保存在用户指定的类库文件中,类库文件的扩展 名为 .vcx,同时系统自动生成一个同名的类库备注文件,其扩展名为 .vct。 用户可以引用自定义类,也可以用自定义类派生新类。以某个自定义类为父类派生新类 时,应通过“新建类”对话框中的“派生于”下拉列表框右侧的按钮将一个已存在的用户自定 义类(即指定自定义类所在的类库文件)指定为父类。 2.类的修改 修改类需在“类设计器”中进行。单击“文件”下拉菜单中的“打开”命令,在“打开” 对话框中将文件类型选定为“可视类库”,在文件列表中选择已存在的 .vcx 类库文件,单击“打 开”按钮,打开包含该类库的“类设计器”窗口。或者使用命令: Modify Class <类名> of <类库文件名> 打开类设计器,让用户修改已有的类定义或创建新的类定义。 “类设计器”与“窗体设计器”类似,同样有设计界面、“属性”窗口和代码编辑窗口, 操作方法相同。如果新类是派生自容器类的,可以向其中添加控件,操作与窗体设计器中的方 法一样。 246


新类已经继承了其基类或父类的全部属性、方法和事件,并且保留了默认值。系统允许用 户在“属性”窗口中修改新类中继承下来的属性的值,在“代码”编辑窗口中编辑继承下来的 事件和方法,也允许用户为新类添加新的属性和方法,但不允许定义新的事件。 ⑴ 为类添加新属性

图 7.33 类的“新建属性”对话框 单击“类”下拉菜单中的“新建属性”命令,打开“新建属性”对话框,如图 7.33 所示。 ① 在“名称”文本框中输入要创建的新属性名。 ② 在“可视性”下拉列表框中,选择属性的作用域范围,有三种可供选择: z “公共”:表示可以在其他类或过程中访问; z “保护”:表示只可以在本类中的其它方法或者其子类中访问; z “隐藏”:表示只可以在本类中的其它方法中访问。 ③ 在“说明”框中,输入对新属性的说明。 单击“添加”按钮,新属性被加入到“属性”窗口中,当选定新属性时,其说明显示在 “属性”窗口底部。 ⑵ 为类添加新方法程序

图 7.34 类的“新建方法程序”对话框 单击“类”下拉菜单中的“新建方法程序”命令,打开“新建方法程序”对话框,如图 7.34 所示。 247


① 在“名称”文本框中输入要创建的新方法名。 ② 在“可视性”下拉列表框中,选择新方法的作用域范围,同样有“公共”、 “保护” 、 “隐 藏”三种可供选择。 ③ 在“说明”框中,输入对新方法的说明。 单击“添加”按钮,新方法添加到“属性”窗口中。双击“属性窗口”中新方法名称, 进入“代码编辑”窗口,编辑新方法代码。 【例 7.12】创建一个具有确认功能的“退出按钮”类。 操作要点如下: ① 由 CommandButton 创建子类: 单击“文件”菜单下拉中的“新建”命令,打开“新建”对话框;选择“类”,单击“新 建文件”按钮,打开“新建类”对话框;如图 7.32,在“类名”文本框中输入类名:退出按钮; 在“派生于”下拉列表框中选择基类 CommandButton;在“存储于”文本框中键入类库的名 字:退出按钮类,并选择系统默认目录;单击“确定”按钮,打开“类设计器”。 ② 在“属性”窗口中将“退出按钮类”的 Caption 属性改为“退出”。 ③ 单击“显示”下拉菜单中的“代码”命令,打开“类设计器”的代码编辑窗口,选择 “退出按钮类”的 Click 事件,添加代码如下: If Messagebox("确认要退出吗?",4+48,"确认")=6 Thisform.Release Endif ④ 关于类的几个属性的说明: Class:类名,本例中为“退出按钮” BaseClass:基类名,本例中为 CommandButton。 ClassLibrary : 类 库 的 路 径 与 名 称 , 本 例 中 为 “

c:\Documents

and

Settings\Administrator\My

Documents\Visual FoxPro 项目\退出按钮类.vcx”,路径为 系统默认目录。 ParentClass:父类名,如果该类是由基类派生而来 的,则该属性的值与 BaseClass 属性的值相同。 3.将类添加到表单控件工具栏 退出

将自定义类添加到表单控件工具栏中,用户就可以

按钮类

象使用常用控件一样使用该类来创建对象。这时需要用 到表单控件工具栏中的“查看类”按钮。 【例 7.13】将例 7.12 中的“退出按钮类”添加到表 单控件工具栏中。

(a)

(b)

图 7.35 例 7.12 示意图

248


打开需要使用该控件的表单,单击表单控件工具栏的“查看类”按钮,在弹出的下拉菜 单中选择“添加”命令(如图 7.35(a)所示),在“打开”对话框中选择可视类库文件:退出按 钮类.vcx;单击“确定”按钮,表单控件工具栏中就会包含一个“退出按钮类”,如图 7.35(b) 所示。此后就可以象使用常用控件一样使用该类。

249


第八章 菜单、报表与标签设计 8.1

菜单设计

Visual FoxPro 8.0 支持两种类型的菜单:下拉式菜单和快捷菜单。本节主要介绍使用菜 单设计器来设计这两种菜单。

8.1.1 创建下拉式菜单 下拉式菜单是由主菜单、子菜单和菜单项组成的。主菜单是顶级菜单,如 Visual FoxPro 的系统菜单栏就是主菜单,单击主菜单可以下拉出它的下一级菜单,即子菜单,子菜单中还可 以包含子菜单。各级菜单中都可以包含菜单项,每个菜单项都对应一项操作。菜单项通常通过 鼠标点击来进行操作,也可以为菜单项定义热键和快捷键,即菜单项的键盘操作方式。 生成菜单程序的基本步骤包括:打开菜单设计器窗口;进行菜单设计;保存菜单定义; 生成菜单程序;运行菜单程序。 1.打开菜单设计器窗口新建菜单 无论建立菜单或修改已有菜单,都需要打开菜单设计器窗口。打开菜单设计器窗口有两 种方式: ⑴ 菜单方式 ① 单击“文件”下拉菜单中的“新建”命令,打开“新 建”对话框。 ② 在“新建”对话框中选定文件类型“菜单”,单击 “新建文件”按钮,出现“新建菜单”对话框,如图 8.1 所 示。 ③ 单击“菜单”按钮,打开“菜单设计器”窗口,如 图 8.2 所示。 ⑵ 命令方式

图 8.1“新建菜单”对话框

格式 1:Create Menu <菜单文件名> 功能:打开“菜单设计器”窗口,新建菜单。 格式 2:Modify Menu <菜单文件名>

250


功能:打开“菜单设计器”窗口,如果<菜单文件名>是新文件,则新建菜单,否则打开 已有菜单文件。 “菜单设计器”窗口打开后,Visual FoxPro 主窗口菜单栏中将增加“菜单”项。显示菜 单也会增加两项命令。

图 8.2

菜单设计器

2.菜单设计 在“菜单设计器”窗口中完成菜单各项内容的定义,如菜单的名称、快捷键、菜单命令 等。具体内容在下一节讨论。 3.保存菜单定义 定义完菜单的内容后,使用“文件”下拉菜单中的“保存”命令,或者使用组合键“Ctrl+W”, 将菜单定义存盘。菜单定义保存在系统默认扩展名为 .mnx 的菜单文件中,系统自动生成文件 名相同且默认扩展名为 .mnt 的菜单备注文件。 4.生成菜单程序 菜单文件内存放着对菜单的定义,但其本身并不能运行,必须根据菜单的定义产生可执 行文件,即文件名相同、扩展名为 .mpr 的菜单程序文件。在“菜单设计器”打开的状态下, 单击“菜单”下拉菜单中的“生成”命令,出现“生成菜单”对话框,如图 8.3 所示。在文本 框中直接输入文件名,或者单击文本框右边的按钮改变默认的菜单程序文件的名称和保存路

251

图 8.3 “生成菜单”对话框


径。单击“生成”按钮就会生成相应的菜单程序文件。 5.执行菜单程序 执行 Do <菜单程序文件名.mpr>命令可以运行菜单程序,其中菜单程序扩展名 .mpr 不能 省略。 默认的情况下,设计好的菜单运行之后将出现在系统菜单栏的位置并替代系统菜单栏(也 可以设置为将设计好的菜单插入到系统菜单栏某一顶级菜单项之前或之后,如图 8.6,将在下 一部分提到) 。如要从该菜单退出,可在命令窗口中键入 Set Sysmenu To Default 命令,用来恢 复系统菜单的缺省配置。

8.1.2 菜单设计器 使用菜单设计器可以方便地创建菜单和修改菜单。 1.菜单设计器 如图 8.2 所示,菜单设计器窗口左边是一个列表框,其中每一行可定义一个菜单项,包括 “菜单名称” 、“结果”和“选项”三列内容。 ⑴“菜单名称”列 指定菜单项的标题文本。 在菜单项名称中可以设置菜单项的热键:在要作为访问键的字符之前加上“\<”两个字符。 例如,将菜单项名称设置为“文件(\<F)”,则菜单的显示标题为“文件(F)” ,字母 F 即设 置为该菜单项的热键。菜单被激活后,只要按下热键,该菜单项就被执行。 可以指定菜单名称为“\-”,则对应的菜单项为菜单中的分隔横线,用来给菜单项分组。 ⑵“结果”列 用于定义菜单项的性质,其中包括命令、填充名称或菜单项#、子菜单和过程 4 个选项。 ① 命令:选择此项时,右侧出现一个文本框,可以在其中输入一条命令。单击该菜单项 时,将执行这条命令。 ② 填充名称或菜单项#:用户定义的当前菜单页是顶级菜单时,该项为填充名称;用户 定义的当前菜单页是子菜单时,该项为菜单项#。选定此项时,组合框右侧出现一个文本框, 可以在其中输入顶级菜单名或者子菜单的菜单序号,用于在程序中引用该菜单项。菜单名和子 菜单的菜单序号系统已经有默认定义,但是较难记忆。 ③ 子菜单:用于用户定义当前菜单的子菜单。选定此项时,组合框右侧出现一个“创建” 按钮或者“编辑”按钮(当建立菜单项时显示“创建”,修改菜单项时显示“编辑” ),单击该 按钮将切换到子菜单页,供用户编辑子菜单。 “菜单设计器”右侧的“菜单级”下拉列表框用于在上、下级菜单之间切换。其中的“菜 单栏”一项表示顶级菜单。 252


④ 过程:选定此项时,右侧出现一个“创建”按钮或者“编辑”按钮(当建立菜单项时 显示“创建” ,修改菜单项时显示“编辑”),单击该按钮将出现一个文本编辑窗口,供用户编 辑所需的过程代码。单击该菜单项时,将执行该过程代码。 ⑶“选项”列 每个菜单行的选项列含有一个按钮,单击就会出现“提示选项”对话框,如图 8.4 所示。 该对话框可以定义菜单项的附加属性。主要内容有: ① 快捷方式:指定菜单项的快捷键。单击“键标签”文本框,然后在键盘上按下要设置 的快捷键。通常是 Ctrl 或 Alt 键与另一个字符键的组合。如按下 Ctrl+X,在“键标签”文本框 和“键说明”文本框内显示“CTRL+X”。该快捷键将显示在菜单项名称的右侧。无论菜单是 否处于被激活状态,都可以通过快捷键来执行菜单项。 若要取消快捷键的定义,只需当光标 在“键标签”文本框中时按下空格键即可。 ② 跳过:指定菜单项为不可用的条 件。输入表达式或者单击“跳过”文本框 右边的按钮,在打开的“表达式生成器” 对话框中设定一个条件表达式。当表达式 值为真时,菜单项为灰色不可用状态。 ③ 信息:定义菜单项的说明信息。 当鼠标指向菜单项时,在状态栏上显示说 明信息。 定义过属性后,“选项”列按钮上会 出现符号√。 ⑷“插入”按钮 单击该按钮,会在当前菜单项之前插 入一个新菜单项。 ⑸“插入栏”按钮 单击该按钮,将显示“插入系统菜单

图 8.4 “提示选项”对话框

栏”对话框,如图 8.5 所示。用户可在其 中选择一个 Visual FoxPro 系统菜单项进行 插入。仅当编辑子菜单时,该按钮才为可 选状态。 ⑹“删除”按钮 单击该按钮,删除当前菜单项。 ⑺“预览”按钮 单击该按钮,可以预览菜单效果。 253

图 8.5 “插入系统菜单栏”对话框


⑻“移动”按钮 每个菜单项的最左端是移动按钮。拖动移动按钮,可以调整菜单项在当前菜单中的位置。 2.“显示”菜单 在菜单设计器环境下,Visual FoxPro 主窗口的“显示”下拉菜单中会包含“常规选项” 和“菜单选项”两个命令。将它们 与菜单设计器结合使用,可以使菜 单设计更加完善。 ⑴“常规选项”命令 单击“常规选项”命令会打开 “常规选项”对话框,如图 8.6 所 示。该对话框用于定义整个下拉式 菜单的总体属性。 ①“过程”编辑框:若顶级菜 单中某些菜单项没有设置过任何命 令或过程,则可以在该编辑框中为 这些菜单编辑一个公共过程,当选 择此类顶级菜单项时,将执行该过 程代码。

图 8.6 “常规选项”对话框

②“位置”区:用来描述用户定义的菜单与当前系统菜单的关系。其中: z “替换”:用用户定义的菜单替换当前系统菜单; z “追加”:将用户定义的菜单追加到当前系统菜单之后; z “在…之前” :用户定义的菜单将插在某个菜单项前面。选定该项时,其后将出现一个 用来指定某个菜单项的组合框。 z “在…之后” :用户定义的菜单将插在某个菜单项后面。选定该项时,其后将出现一个 用来指定某个菜单项的组合框。 默认为“替换”。 ③“菜单代码”区:含“设置”与“清理”两个复选框,选择任何一个都会打开相应的 代码编辑窗口。“设置”代码放在菜单程序文件中菜单定义代码前面,在菜单产生之前执行, 通常作初始化的工作。“清理”代码放在菜单定义代码后面,在菜单显示出来之后执行。 ④“顶层表单”复选框:选择该复选框,可以将用户定义的菜单添加到一个顶层表单里。 ⑵“菜单选项”命令 单击“菜单选项”命令会打开“菜单选项”对话框。对话框中的“过程”编辑区,供用 户为当前菜单中没有设置过任何命令或过程而且也没有下级菜单的子菜单项编辑公共过程。菜 单运行时,用户选择此类子菜单项,将执行该过程代码。

254


如果当前菜单是子菜单,在该对话框中还可以定义该子菜单的菜单名。 【例 8.1】利用菜单设计器设计满足如下要求的菜单: ① 顶级菜单的菜单项包括:数据维护(W)、编辑(E)、退出(X)。 ②“数据维护”的下拉子菜单包括:学历职称查询、教师信息浏览、数据表维护,快捷 键分别是 Ctrl+Z、Ctrl+K、Ctrl+W,单击结果分别是执行表单文件 xlzccx.scx(例 7.8)、jsxxll.scx (例 7.10)、sjbwh.scx(例 7.7)。 ③“编辑”的下拉子菜单包括:剪切、复制、粘贴,分别调用相应的系统菜单项。 ④“退出”将菜单恢复为系统标准菜单设置。 操作要点如下: ① 在命令窗口输入命令:Create Menu cd1。在“新建菜单”对话框中单击“菜单”按钮, 打开“菜单设计器”窗口。 ② 设置顶级菜单项,如图 8.7 所示。为“退出”菜单定义命令为:Set Sysmenu to Default。

图 8.7

顶级菜单项设置

③ 单击“数据维护”菜单项“结果”列上的“创建”按钮,切换到“数据维护”子菜单 页,设置“数据维护”下拉子菜单项。每个子菜单用来运行相应表单,如图 8.8 所示。

255

图 8.8 “数据维护”子菜单项设置


④ 为各个子菜单项设置快捷键。选定某个子菜单项,单击其“选项”列上的按钮,打开 “提示选项”对话框;单击“键标签”文本框,按定义要求按下相应组合键即可。 ⑤ 在“菜单级”下拉列表框中选择“菜单栏”,返回主菜单页。 ⑥ 单击“编辑”菜单项“结果”列上的“创建”按钮,切换到“编辑”子菜单页。单击

图 8.9 “编辑”子菜单项设置 “插入栏”按钮,打开“插入系统菜单”对话框,在列表中单击“剪切”项并单击“插入”按 钮。同样方法可以将“复制”、“粘贴”项插入到“编辑”子菜单中。如图 8.9 所示。 ⑦ 保存菜单设计。单击“菜单”下拉菜单中的“生成”命令,生成菜单程序文件 cd1.mpr。

8.1.3 “快速菜单”命令 新建菜单时,打开“菜单设计器”,单击“菜单”下拉菜单中的“快速菜单”命令,可以 生成一个与 Visual FoxPro 主窗口菜单一样的菜单。建立的快速菜单同样可以使用菜单设计器

256

图 8.10 建立快速菜单后的菜单设计器窗口


进行修改、增删、改变功能等操作。用户可以根据设计要求保留所需的内容,或者修改成符合 设计要求的菜单。快速菜单只能用于创建下拉式菜单,不能用于创建快捷菜单。 【例 8.2】利用“快速菜单”命令建立一个下拉式菜单。 操作要点如下: ① 在命令窗口输入命令:Modify Menu cd2,打开“菜单设计器”窗口; ② 单击“菜单”下拉菜单中的“快速菜单”命令,一个与 Visual FoxPro 8.0 主窗口菜单 一样的菜单就自动填入“菜单设计器”窗口中,如图 8.10 所示。 ③ 单击“菜单”下拉菜单中的“生成”命令,在提示保存文件的对话框中单击“是”按 钮,保存菜单文件 cd2.mnx 和菜单备注文件 cd2.mnt;出现“生成菜单”对话框,设置菜单程 序名称和保存路径,单击“生成”按钮,生成菜单程序文件 cd2.mpr。 在命令窗口中键入命令:Do cd2.mpr,就会显示所定义的菜单。此菜单仅比系统菜单栏少 一个“格式”菜单,各子菜单的功能与系统菜单一致。

8.1.4 创建快捷菜单 快捷菜单是一种单击鼠标右键时出现的弹出式菜单。快捷菜单从属于鼠标指向的对象,列 出的通常是与该对象有关的常用功能命令。可以在“快捷菜单设计器”中完成快捷菜单的设计, 但单击右键弹出菜单的动作还需编程实现。 建立快捷菜单的步骤如下: ⑴ 单击“文件”下拉菜单中的“新建”命令,打开“新建”对话框; ⑵ 在“文件类型”中选择“菜单”,单击“新建文件”按钮。 ⑶ 在“新建菜单”对话框中单击“快捷菜单”按钮,打开“快捷菜单设计器”窗口,如

图 8.11 “快捷菜单设计器”窗口 257


图 8.11 所示; ⑷ 设计快捷菜单,保存菜单文件,生成菜单程序文件,方法与下拉式菜单设计方法类似; ⑸ 在“常规选项”对话框中选择“清理”复选框,在出现的“清理”文本编辑框中添加 如下清除菜单代码,以便及时清除菜单,释放内存: Release Popups <快捷菜单名> ⑹ 在表单设计器中,选定要添加快捷菜单的对象,在其 RightClick 事件中添加调用快捷 菜单的命令: Do <快捷菜单文件名.mpr> 【例 8.3】为某表单添加快捷菜单。菜单项为例 8.2 中的“数据维护”下拉菜单中的各子 菜单项。 操作要点如下: ① 按以上介绍的快捷菜单设计步骤打开“快捷菜单设计器”窗口。 ② 建立“学历职称查询”、“教师信息浏览”、 “数据表维护”三个菜单项,操作结果分 别打开 xlzccx.scx(例 7.8)、jsxxll.scx(例 7.10)、sjbwh.scx(例 7.7)表单,设置结果如图 8.11 所示。 ③ 单击“显示”下拉菜单中的“菜单选项”命令,打开“菜单选项”对话框,在“名称” 文本框中输入快捷菜单的名称:kjcd。该名称是程序代码中要引用的菜单名,可以使用默认值。 ④ 单击“显示”下拉菜单中的“常规选项”命令,打开“常规选项”对话框,选中“菜 单代码”区的“清理”复选框,出现一个文本编辑窗口,单击“确定”按钮,然后在文本编辑 窗口中添加代码如下: Release Popups kjcd ⑤ 将设计好的菜单保存到 kjcd.mnx 菜单文件中, 并生成菜单程序文件 kjcd.mpr。 ⑥ 新建空白表单,在表单的 RightClick 事件中添加 代码如下: 图 8.12 例 8.3 示意图

Do Kjcd.mpr 右单击运行中的表单,结果如图 8.12 所示。

8.2

报表设计

报表是数据库应用系统常使用的打印输出形式。本节介绍报表的设计方法。

258


8.2.1 创建报表 创建报表有三种方式:使用报表向导,使用“报表设计器” ,使用“快速报表”命令。 1.使用报表向导创建报表 用报表向导可以创建简单的单表报表和一对多报表,创建好的报表也可以使用“报表设 计器”进行修改和完善。 下面用一个例子来说明单表报表向导的使用步骤。一对多报表向导的使用方法类似。 【例 8.4】利用报表向导为数据表 gz.dbf 创建报表。 操作步骤如下: ⑴ 单击“文件”下拉菜单中的“新建”命令,打开“新建”对话框,在文件类型中选择 “报表”,然后单击“向导”按钮,弹出“向导选取”对话框。 ⑵ 在“向导选取”对话框中选择“报表向导”,单击“确定”按钮。如果数据源是单表, 应选择“报表向导”;如果数据源包括父表和子表,应选取“一对多报表向导” 。本例中选择“报 表向导”。 ⑶ “报表向导”共有 6 个步骤,顺序出现 6 个对话框分别设置相应内容。 ① 步骤 1-字段选取(Select Fields):选取要在报表中输出的数据表及其中的字段,单击 “下一步”(Next)按钮。 ② 步骤 2-分组记录(Group Record):可以在下拉列表框中选择字段作为数据分组显示的 依据。注意只有按分组字段建立索引后,才能正确分组,最多可以建立三层分组。本例不进行 分组,单击“下一步”(Next)按钮。 ③ 步骤 3-选择报表样式(Choose Report Style):选取报表样式。本例选择“经营式” (Executive) ,单击“下一步”(Next)按钮。 ④ 步骤 4-定义报表布局(Define Report Layout):如图 8.13 所示,选取报表布局。在“列 数”(Number of Columns)下拉列表中,如果选择 1,则为单列报表;选择大于 1 的数,则设 置的是多栏报表的栏数。在“字段布局” (Field Layout)下的选项组中,选择“列” (Columns)

259

图 8.13 “报表向导”步骤 4


则为纵向输出,选择“行”(Rows)则为横向输出;在“方向”(Orientation)下的选项组中, 选择“纵向” (Portrait),则打印纸张为纵向,选择“横向” (Landscape),则打印纸张为横向。 本例选择纵向、单列的报表布局,单击“下一步”(Next)按钮。 ⑤ 步骤 5-排序记录(Sort Records):指定排序的字段和排序顺序。排序字段必须已经建 立索引。本例指定按“jsbh” 字段升序排序,单击“下一 步”按钮。 ⑥

步 骤

6- 完 成

(Finish):选择“保存报表 并在报表设计器中修改报 表”(Save Report and Modify it in the Report Designer),单 击“完成”(Finish)按钮, 保存 .frx 报表文件并在报表 设计器中显示报表,如图 8.14

图 8.14 报表设计器中的 gz 报表

所示。 此时单击工具栏上的“预览”按钮,可以查看输出效果,如图 8.15 所示。 2.使用报表设计器创建表单 用报表设计器可以建立 新的报表,也可以修改已有 报表。打开报表设计器的方 法有两种方式: ⑴ 菜单方式 单击“文件”下拉菜单 中的“新建”命令,打开“新 建”对话框。在“文件类型” 中选定“报表”,单击“新建

图 8.15 gz 报表预览

文件”按钮,打开“报表设 计器”窗口。 ⑵ 命令方式 格式 1:Create Report [<报表文件名>] 功能:打开“报表设计器”窗口,新建报表。 格式 2:Modify Report <报表文件名> 功能:打开“报表设计器”窗口,如果<报表文件名>是新文件,则为新建报表,否则打

260


开已有报表。 “报表设计器”窗口打开后,Visual FoxPro 系统菜单栏中将增加“报表”菜单项。 3.使用“快速报表”创建报表 下面用一个例子说明如何使用“快速报表”建立一个简单报表。 【例 8.5】为 kyqk.dbf 表创建一个快速报表。 ① 单击“文件”下拉菜单中的“新建”命令,在对话框“文件类型”中选定“报表”类 型,单击“新建文件”按钮,打开“报表设计器”。 ② 单击“报表”下拉菜单中 “快速报告”命令。因为没有事先设定数据源,系统弹出 “打开”对话框,选择 kyqk.dbf 数据源。设定数据源有两种方法:事先打开一个表;或者在 “报表设计器”窗口中设定数据环境。 ③ 系统弹出“快速报表”对话 框,如图 8.16 所示。在其中可以单 击行布局按钮或者列布局按钮,设 置报表布局。本例中选择行按钮。 还可以设定下面几个复选框: “标题”用于产生每个字段的标题; “添加别名”用于指定是否在字段 名前面显示别名; “将表添加到数据 环境中”,表示是否要将表文件添加 到报表的数据环境中去。本例中同 时选中三个复选框。 ④ 单击“字段”按钮,打开“字

图 8.16 “快速报表”对话框

段选择器”为报表选择输出字段,如图 8.17 所示。单击“确定”按钮,返回“快速报表”对

图 8.17 “字段选择器”对话框 261


话框。 ⑤ 在“快速报表”对话框中单击“确定”按钮。报表出现在“报表设计器”中。单击“打 印预览”按钮可以看到报表输出效果,如图 8.18 所示。 ⑥ 单击工具栏上的“保存”按钮,将该报表保存为 kyqk.frx 报表文件。

8.2.2 设计报表 生成报表之后,需要使用报表设计器设计修改报表,使报表更加完善。报表的设计分为

图 8.18

生成的快速报表预览

设置报表数据源和设计报表布局两部分。 1.设置报表数据源 报表总是与一定的数据源相联系,数据源为报表控件提供数据。可以将数据源添加到报 表的数据环境中。与表单设计器的数据环境设计器类似,报表设计器中也有报表数据环境设计 器,其操作与使用方法也与表单数据环境设计器类似,这里就不再重复介绍。 2.设计报表布局 “报表设计器”窗口中,报表包含若干个带区。表 8.1 列出了在报表中常用的报表带区的 产生方法及作用。报表中默认含有页标头、细节、页注脚三个带区,每个带区的下方是带区名 的标识栏。 表 8.1

报表带区

带区名称

带区的产生方法

带区内控件打印周期

标题

“报表”菜单的“标题/总结”命令

整个报表一次

页标头

默认存在

每页一次

列标头

“文件”菜单的“页面设置”设置列数

每列一次

组标头

“报表”菜单的“数据分组”命令

每组一次

细节

默认存在

262


组注脚

“报表”菜单的“数据分组”命令

每组一次

列注脚

“文件”菜单的“页面设置”设置列数

每列一次

页注脚

默认存在

每页一次

总结

“报表”菜单的“标题/总结”命令

整个报表一次

⑴ 页标头带区 位于页标头标识栏的上方,可用于设置报表名称、字段标题或者图形等,每页开头位置打 印一次。 ⑵ 细节带区 包括从细节标识栏到它上方的相邻标识栏之间的区域。该区设置的控件能多次打印,相 当于循环打印程序中的循环体。 ⑶ 页注脚带区 包括从页注脚标识栏到它上方的相邻标识栏之间的区域。设置的是每页结尾位置的打印内 容,例如页号、日期等。 用户可根据需要设置其他带区。 ⑷ 标题与总结带区 单击“报表”下拉菜单中的“标题/总结”命令,打开“标题/总结”对话框。在对话框中 选择“标题带区”复选框,则在报表的顶部添加一个“标题”带区。“标题”带区含有在报表 开始时要打印的信息,其内容在每个报表中打印一次。若要将标题内容单独打印成一页,选定 “新页”复选框;在对话框中选定“总结带区”复选框,则在页注脚下方添加一个“总结”带 区。“总结”带区含有在报表结束时要打印的信息,其内容在每个报表中打印一次。若要将总 结内容单独打印成一页,选定“新页”复选框。选中“页眉”或者“页脚”复选框,则可以将 页眉或者页脚与“总结”带区一同打印。 ⑸ 列标头、列注脚带区和多栏报表

263


单击“文件”下拉菜单中的“页面设置”命令,打开“页面设置”对话框,如图 8.19 所 示。将列数调整为大于 1,报表将添加一个“列标头”带区和一个“列注脚”带区,细节带区 相应缩短,形成多栏报表,或者称之为多列报表。这里的“列”指的是页面横向打印记录的数 目。在“页面设置”对话框中,还可以设定调整列的宽度和间隔,设定左页边距,以及指定打

图 8.19 “页面设置”对话框 印顺序。 ⑹ 组标头、组注脚带区和数据分组报表 报表中的数据可以进行分组输出,例如按系部对教师进行分类输出。要对数据进行分组, 需要定义分组表达式,即字段表达式。但须注意,为保证正确的分组输出,必须对数据源进行 适当的索引或排序。 数据分组方法如下: ① 单击“报表”下拉菜单中的“数 据分组”命令,打开“数据分组”对话 框,如图 8.20 所示。在“分组表达式” 区设定分组表达式。单击省略号按钮, 打开表达式生成器,生成表达式。系统 根据用户设定的表达式,按表达式值相 同的原则将表的记录分成几组。每一组 数据在“细节”带区中输出,系统自动

264

图 8.20 “数据分组”对话框


在“细节”带区前加上“组标头”带区,其后加上“组注脚”带区。 ② 在“数据分组”对话框中的复选框设置: z “每组从新的一列上开始”:指定组内容改变时,是否打印到下一列上; z “每组从新的一页上开始”:指定组内容改变时,是否打印到下一页上; z “每组页号重新从 1 开始”:指定组改变时, 是否打印到下一页上, 并将页号重置为 1; z “每页都打印组标头”:指定当前组内容分布在多页上时,是否每一页都打印组标头。 使用带区时注意以下几点: ① 可以根据需要对带区进行添加或删除,也可以调整带区的高度。 将鼠标移到某带区标识栏上,指针变成上下双向箭头,拖动鼠标,可以调整带区高度。 每一个带区的标识栏都有其对应的对话框,比如双击“细节”标识栏,可以打开“细节” 对话框,如图 8.21 所示。在“高度”微 调框中可以精确设定带区的高度,也可 以选定“带区高度保持不变”复选框使 得带区不会随着其内部内容的增减而自 动改变其高度。 ② 可以在任何带区中设置任何报 表控件(下一节中介绍) 。 ③ 带区可以控制数据在页面上的 打印位置。

图 8.21 “细节”对话框

8.2.3 报表控件 1.报表控件工具栏 报表中的打印内容是通过报表控件安排在报表 之上的。在“报表设计器”打开的状态下,单击“显示” 下拉菜单中的“报表控件工具栏”命令,可以在工作区 中显示“报表控件”工具栏,如图 8.22 所示。报表控

图 8.22“报表控件”工具栏

件的创建和基本操作与表单控件类似,但报表设计器没 有属性窗口,报表控件的属性只能在相应的对话框中进行设置。表 8.2 列出了各个报表控件的 功能及其属性设置的对话框。 表 8.2 按 标签 265

报 表 控 件 钮

添加说明性文字,如标题

报表控件对话框 “文本”对话框


域控件

添加变量、函数、字段或表达式

“报表表达式”对话框

线条

添加垂直或水平直线

“线条”对话框

矩形

添加矩形

“矩形”对话框

圆角矩形

添加圆角矩形、椭圆或圆形

“圆角矩形”对话框

图片\ActiveX 绑定控件

添加图片等 OLE 对象

“报表图片”对话框

打开报表控件对话框有如下几种方法: ⑴ 双击任何已有控件,或者在控件的快捷菜单中选择“属性”命令,打开相应对话框。 ⑵ 使用鼠标拖动的方法在报表上创建新的域控件或者图片\ActiveX 绑定控件时,释放鼠 标的同时系统会自动打开相应对话框。 标签控件和域控件在报表中是最常见的控件,下面重点介绍它们的使用方法。其它控件 使用较简单,不再一一讨论。 2.标签控件 标签控件用来显示报表的标题、字段的标题等说明文字。在报表的各个带区都可以添加 标签控件。使用报表控件工具栏中的标签按钮创建标签控件,然后在光标处直接输入要显示的 文本即可。标签文本的字体、字号、效果、颜色等属性都可以通过单击标签控件,选择“格式” 菜单中的“字体”菜单项,在“字体”对话框中进行相应的设置。 3.域控件 域控件可以用来打印字段、函数、变量和表达式的计算结果。可以使用域控件按钮创建 域控件,也可以在“数据环境设计器”窗口中将要显示的字段直接用鼠标拖曳到报表设计器的 指定带区中。 ⑴“报表表达式”对话框 “报表表达式”对话框如图 8.23 所示,用于为控件定义表达式,为控件指定统计类型和 范围,以及确定打印条件。 可在“表达式”文本框中键入表达式,或者单击该文本框右侧的按钮打开“表达式生成 器”对话框来设置表达式。 ⑵“计算字段”对话框 单击“报表表达式”对 话框中的“计算”按钮,将 打开“计算字段”对话框, 如图 8.24 所示。该对话框为 控件选择一项统计计算。 ①“重置”下拉列表框: 用于选定控件计算的置零时

266

图 8.23 “报表表达式”对话框


刻。 “报表尾”选项为默认值,表示在报表打印结束时将控件计算置零; “页尾”选项表示在报表每一页打印结束时将控件计算置零; “列尾”选项只在多列报表中可选,表示每一列打印结束时将控件计算置零。 数据分组报表中,分组表达式会作为一项添加 到下拉列表框中,能使控件计算在分组表达式值发 生变化时置零。 ②“计算”区:选择要执行的计算。其中“不 计算”是默认值,表示直接打印表达式的值; “计数” 用于计算并打印表达式出现的次数。 ⑶“打印条件”对话框 单击“报表表达式”对话框中“打印条件”按 钮,将打开“打印条件”对话框,如图 8.25 所示。 用于指定报表控件的打印条件。 ①“打印重复值”区 选择“是”,表示控件总是打印,为默认值;选 择“否”,表示仅当控件值改变时才打印,即不打印

图 8.24“计算字段”对话框

重复值,打印位置将留空。 ②“有条件打印”区 可选的复选框根据当前的对象类型的不同而不同。 若“打印重复值”选“否”,则“在新页/列的第一个完整信息带内打印”复选框指定在同 一页或同一列内不打印重复值,换页或换列后遇到第一条新记录时打印重复值。 若不打印重复值,且报表进行了数据分组,选中“当此组改变时打印”复选框,其右会 出现一个下拉列表框,列出所用的报表分组供用户选择。表示当某个组发生变化时,需要打印 重复值。 当细节带区内的数据已满一 页或一列而换到新页或新列时希 望打印,应选定“当细节区数据溢 出到新页/列时打印”复选框。 ③“若是空白行则删除”复选 框; 当打印条件不满足出现空白 行时,默认情况下打印这些空白 行;选定该复选框,则不打印空白 行。 267

图 8.25“打印条件”对话框


④“仅当下列表达式为真时打印”文本框用于键入一个表达式,或者用“表达式生成器” 生成一个表达式,当表达式为真时控件才被打印输出,否则不打印。

8.2.4 报表输出 通过菜单方式和命令方式可以使用报表。 1.菜单方式 ⑴ 在“报表设计器”打开状态下,单击“文件”下拉菜单中的“打印预览”命令,可以 预览报表。 ⑵ 在“报表设计器”打开状态下,单击“文件”下拉菜单中的“打印”命令,可以打印 报表。 2.命令方式 格式:Report Form <报表名> [Preview | To Print] 功能:在 Visual FoxPro 主窗口中预览以<报表名>为文件名的报表。若有 Preview 可选项, 则在预览窗口中输出。若有 To Printer 可选项,则在打印机上输出。 【例 8.6】以 gz.dbf 表为数据源,设计职工水电费(ksdf)多栏报表。 ① 单击“文件”下拉菜单中的新建命令,打开“新建”对话框,选择“报表”文件类型, 单击“新建文件”按钮,生成一个空白报表。 ② 在“报表设计器”的快捷菜单中选择“数据环境”命令,打开“数据环境设计器”窗 口,选择“数据环境设计器”快捷菜单中的“添加”命令,将表 gz.dbf 添加到数据环境。 ③ 在“页面设置”对话框中将“列数”微调按钮的值设置为 3,设定左页边距为 1.9cm, 并选择“自左向右”的打印顺序。单击“确定”按钮,在报表设计器中将添加占页面三分之一 的一对“列标头”带区和“列注脚”带区。 ④ 添加控件:在“数据环 境设计器”中,选定 jsbh 和 ksdf 两个字段,将它们拖曳到报表 设计器中的“细节”带区,自 动生成域控件。 ⑤ 在“页标头”带区添加 标签控件,输入“职工水电费”, 将字体设置为隶书二号字。 ⑥ 在“页标头”带区添加 线条控件,在“职工水电费” 下面画横贯页面的两条横线。

图 8.26

水电费多栏报表设计 268


⑦ 设计完毕的报表设计器中的各项内容如图 8.26 所示。 ⑧ 单击“文件”下拉菜单中的“打印预览”命令或常用工具栏中的“打印预览”按钮,

图 8.27 水电费多栏报表预览 报表效果如图 8.27 所示。 ⑨ 单击“文件”下拉菜单中的“保存”命令,将报表保存为 .frx 文件。 【例 8.7】 以 jsqk.dbf 表为数据源,设计教师基本信息按系部分组报表。 ① 为 jsqk.dbf 表建立以 xbbh(系部编号)字段为索引关键字的索引,索引名称为“xbbh” 。 ② 建立空白报表,并将 jsqk.dbf 添加到报表数据环境。 ③ 单击“报表”下拉菜单中的“数据分组”命令,打开“数据分组”对话框,单击第一 个“分组表达式”右侧的按钮,用“表达式生成器”将 jsqk.xbbh 作为分组表达式,单击“确 定”按钮,报表设计器中自动添加“组标头 1:xbbh”和“组注脚 1:xbbh”两个带区。 ④ 在“数据环境设计器”中,将 jsbh、xm 和 zc 字段拖曳到报表设计器中的“细节”带 区,将 xbbh 字段拖曳到报表设计器中的“组标头”带区,自动生成域控件。 ⑤ 在“页标头”带区添加标签控件,输入“教师基本信息” ,将字体设置为隶书二号字。 ⑥ 单击“数据环境设计器”快捷菜单中的“属性”命令,在“属性”对话框中将 Cursor 对象的 Order 属性设置为“xbbh”,即将“xbbh”设为当前索引。 ⑦ 设计完毕的报表设计器中的内容如图 8.28 所示。

269

图 8.28 系部分组报表设计


⑧ 单击“打印预览”按钮,报表效果如图 8.29 所示。 ⑨ 单击“文件”下拉菜单中的“保存”命令,将报表保存为 .frx 文件。

8.3

标签设计

标签是打印在专用纸上的带有特殊格式的报表。标签保存在扩展名为 .lbx 的标签文件和 文件名相同且扩展名为 .lbt 的标签备注文件中。 标签与报表极为类似,标签与报表的创建和修改方法也大致相同。不同之处在于,用户 创建标签时,必须根据系统提示指明使用的标签类型,从而确定标签设计器中细节带区的尺寸 大小。

图 8.29 系部分组报表预览

8.3.1 使用标签向导 创建标签可以使用标签向导,下面用一个例子来说明标签向导的使用步骤。 【例 8.8】 使用标签向导创建简单的标签。 ① 单击“文件”下拉菜单中的“新建”命令,打开“新建”对话框。在“文件类型”中 选定标签,单击“向导”按钮,打开标签向导步骤 1(Select Tables)对话框,选择一个要使 用的表。本例中选择 jsqk.dbf 表。单击“下一步” (Next)。 ② 在标签向导步骤 2 的选择标签类型(Choose Label Type)对话框中(如图 8.30 所示)。 选择标签类型,即系统提供的各种样式模板,单击“下一步”(Next) 。 270


图 8.30

标签向导步骤 2

用户还可以自定义标签格式:单击该对话框中的“新建标签” (New Label)按钮,打开“自 定义标签”(Custom Labels)对话框,如图 8.31 所示。单击其中的“新建”按钮,打开“新 标签定义” (New Label Definition)对话框,如图 8.32 所示。在其中输入标签名称(Label Name), 并在对话框下部的标签示意图的各个标签尺寸输入框中输入各部分尺寸值(Enter label measurements in inches)。然后单击“更新”(Update)按钮,关闭对话框,新建标签被添加到 自定义标签列表中。可以继续添加多种自定义标签样式。添加完毕,单击“关闭” (Close)按 钮,新定义标签样式被添加到图 8.30 标签样式列表框中,供用户选择。

271


③ 标签向导步骤 3 对话框(Define Layout) ,如图 8.33 所示。在 “可用字段” (Avalable fields) 中选择在标签中使用的字段,单击右箭头按钮,将其添加到“选定的字段”(Selected fields)

图 8.31 “自定义标签”对话框

图 8.32 “新标签定义”对话框 编辑框中,单击左箭头按钮可以将字段从“选定的字段”编辑框中移除;单击分隔符按钮,可 以设置各选定字段间的分隔符(“.” 、 “,”、“-”、“:”、空格或者回车换行);也可以在“文本” (Text)输入框中输入文本进行添加。 ④ 标签向导步骤 4 与报表向导步骤 5 类似,同样是要求用户选择排序字段。 ⑤ 标签向导步骤 5 即完成标签设计。标签设计器中的标签如图 8.34 所示。单击工具栏的

272


“打印预览”按钮,预览结果如图 8.35 所示。

273


图 8.33

标签向导步骤 3

图 8.34 标签设计器中的标签

图 8.35 标签预览

274


8.3.2 使用标签设计器 标签设计器可以建立新标签,也可以修改已有标签。打开标签设计器的方法有两种方式: 1.菜单方式 单击“文件”下拉菜单中的“新建”命令,打开“新建”对话框。在“文件类型”中选定 “标签”,单击“新建文件”按钮,打开“新建标签”对话框,如图 8.36 所示。选择标签类型, 单击“确定”按钮,打开“标签设计器”窗口。

图 8.36 “新建标签”对话框 2.命令方式 格式 1:Create Label [<标签文件名>] 功能:打开“新建标签”对话框,选择标签类型,并打开“标签设计器”窗口,新建标 签。 格式 2:Modify Label <标签文件名> 功能:打开“标签设计器”窗口。如果<标签文件名>是新文件,则为新建标签,否则打 开已有标签。 标签设计器窗口打开后,Visual FoxPro 系统菜单栏中将增加“标签”菜单项。标签设计 器与报表设计器使用方法相同,不再重复介绍。

8.3.3 标签输出 通过菜单方式和命令方式可以使用标签。 1.菜单方式 275


与使用报表的菜单方式相同,选择“文件”下拉菜单的“打印预览”命令或者“打印” 命令,可以预览标签或者打印标签。 2.命令方式 格式:Label Form <标签名> [Preview] | [To Printer] 功能:在 Visual FoxPro 主窗口中预览以<标签名>为文件名的标签。若有 Preview 可选项, 则在预览窗口中输出;若有 To Printer 可选项,则在打印机上输出。

276


第九章 应用系统开发简介 学习数据库管理系统的最终目的是开发满足实际需求的数据库应用系统。本章将通过一个 小型数据库管理信息系统的开发实例,结合前面各章所介绍的基本知识和设计方法,介绍使用 Visual FoxPro 数据库管理系统开发、设计一个数据库应用系统的基本方法和步骤。

9.1 应用系统开发的基本步骤 一般而言,一个数据库应用系统的开发,通常要经过系统需求分析、系统设计、系统实现、 系统发布和系统使用维护几个阶段。 1.系统需求分析 系统需求分析是整个应用系统开发的基础。在此阶段,系统开发人员要深入细致地进行调 查研究,准确、充分地详细了解用户需求。需求分析主要包括数据分析和功能分析。数据分析 应归纳出需要系统处理的原始数据,数据之间的相互联系,数据处理所遵循的规则,处理结果 的输出方式和格式等。功能分析则是为应用系统功能设计提供依据。 2.系统设计 根据系统需求分析的结果,对应用系统进行总体规划设计,包括两大部分:数据库、表的 设计和应用系统功能设计。 数据库、表设计是在需求分析的基础上,根据数据库系统要存储、处理的各种数据,数据 的类型,数据所表示的实体以及实体之间的相互联系,按照数据库设计的基本原则和关系模型 的规范化要求,设计数据库中表的数量和各表的结构。 应用系统功能设计则是设计能够实现数据的输入、输出和各种加工处理,以及对整个应用 系统进行管理、控制与维护的功能模块。 3.系统实现 根据系统设计的要求,选用合适的数据库管理系统,创建数据库、表;设计、编写、调试 应用系统的各功能模块程序。 在系统实现阶段,要根据系统设计要求和功能实现的情况,向数据库、表中小批量的输入 一些原始数据,通过系统试运行来测试数据库、表的结构设计和应用程序的各功能模块设计是 否能满足应用系统的要求。若不能满足,则需要查找未达到系统要求的原因,对发现的问题及 时进行修改、调整,直到达到系统设计的要求为止。这一过程应贯穿于整个系统的实现阶段。

277


4.系统发布 完成整个系统的设计、实现工作,系统试运行合格后,即可进入系统发布阶段。此阶段的 工作主要有两个方面:一是对组成数据库应用系统的各功能模块文件进行项目连编,将源程序 代码等编译连接生成一个可执行的应用系统软件;二是整理完善文档资料,并与连编生成的应 用系统软件一起发布,交付使用。 5.系统使用维护 应用系统投入使用,正式运行后,即进入系统维护阶段。在运行过程中,系统的应用环境 和系统使用人员均可能发生变化,对系统的安全性带来影响。数据库中的数据会因不断地进行 添加、删除、修改等操作,造成物理存储状况的变化,而影响数据的完整性、系统的工作效率 等。这些都需要通过系统维护来及时的进行调整、改善,以保证整个系统的正常工作和安全、 可靠、高效率的运行。

9.2 “教师管理信息系统”的开发简介 下面以一个简单的“教师管理信息系统”为例,简要介绍怎样使用 Visual FoxPro 数据库 管理系统提供的数据库、表设计功能和面向对象、事件驱动、可视化的编程语言,开发数据库 应用系统的基本过程与步骤。

9.2.1 系统需求分析 1.数据分析 “教师管理信息系统”需要处理的是与教师相关的各类数据。主要包括教师个人的基本信 息、工资数据和科研情况等。 2.功能分析 “教师管理信息系统”功能主要有以下几个方面: ⑴ 教师信息管理功能:实现教师个人基本信息和科研信息的输入、输出,以及因学历、 学位、职称、任职部门等变动时对相关信息的编辑修改。 ⑵ 工资信息管理功能:实现教师工资数据的输入、输出;可根据国家标准对工资津贴进 行统一调整,以及根据教师职称的变动情况进行的个别编辑修改等。 ⑶ 统计查询功能:实现对教师信息的各种统计查询。可以按学历、学位、职称、部门、 性别、婚姻状况、科研情况等多种条件统计、查询各类信息。 ⑷ 系统管理功能:包括增加、删除应用系统用户,设置、修改用户密码,进入、退出应 用系统的操作等。

278


9.2.2 系统总体规划设计 系统的总体规划设计是根据系统需求分析和功能要求,将数据库、表的设计和应用系统功 能设计组织在一起,既能为用户提供一个操作简单、使用方便、清晰易懂的工作界面,又能实 现系统要求的各种功能。在一个数据库应用系统中通常都包含以下几个基本组成部分: 1.一个或多个数据库。每个数据库中又包含多个数据表、视图等,用于保存原始数据或 初步处理结果数据。 2.数据处理模块:如数据的输入、修改、删除、分类、统计、查询、检索等。 3.数据输出与控制:如各种信息的屏幕浏览、各种格式的报表和标签的打印输出等。 4.主控程序:设置应用系统的工作环境,控制各功能模块应用程序的运行。 5.用户界面:包括系统窗口、菜单、工具栏、登录窗口及各种表单等。 应用程序的总体设计通常采用自上而下,按功能分类,逐级分解细化的模块化设计方法。 设计时先整体,再局部,先粗后细,化繁为简,化大为小。根据系统的功能要求将整个系统划 分为若干个子系统,每个子系统又划分为若干个模块,每个模块实现一项功能,从而减小了系 统的设计难度和工作量。因各模块具有较好的独立性,给程序的编写、修改、调试和整个系统 的维护、管理带来很多方便。 模块化的设计方法有利于团队工作,可以做到多人并行地同时进行系统开发,大大提高系 统的开发效率。在面向对象的程序开发环境下,同样可以采用模块化的设计思想。

9.2.3 数据库、表设计 在“教师管理信息系统”的数据中,教师个人的基本情况数据较少变化,而与工资相关的 数据经常变化,为保证数据之间的关系清晰,操作方便,分别建立“教师情况表”和“工资表”。 在这两个表中都使用“教师编号”作为主关键字段,建立起一对一的联系。 每个教师都可能有多个科研成果。建立一个“科研情况表” ,设置一个“教师编号”字段 作为外部关键字,使“教师情况表”与“科研情况表”之间构成一对多的联系。 因学校的系部机构设置等可能发生变化,教师也可能在学校内部的系部之间调动工作,为 保证各表中数据的一致性和完整性,减少数据的调整、修改量,提高工作效率,建立一个“系 部表”,包含与系部相关的数据。“系部表”中的主关键字段“系部编号” ,也同时增设在“教 师情况表”中,做为外部关键字,实现“系部表”和“教师情况表”的一对多联系。 另外,再建立两个表:“用户表”和“使用情况表”。分别用于保存“教师管理信息系统” 的用户信息和该系统的使用信息。 综合上述,在“教师管理信息系统”中设计一个数据库“jsgl.dbc”(教师管理库);库中

279


包含六个数据表。 ① “教师情况表”(jsqk.dbf)。表结构如表 9.1 所示。 表 9.1

Jsqk(教师情况)数据表结构

字段含义

字段名

类型

宽度

小数位数

* 教师编号

Jsbh

字符型(C)

6

----

姓名

Xm

字符型(C)

8

----

性别

Xb

字符型(C)

2

----

出生日期

Csrq

日期型(D)

8

----

工作日期

Gzrq

日期型(D)

8

----

学历

Xl

字符型(C)

6

----

学位

Xw

字符型(C)

4

----

职称

Zc

字符型(C)

6

----

婚否

Hf

逻辑型(L)

1

----

简历

Jl

备注型(M)

4

----

照片

Zp

通用型(G)

4

----

系部编号

Xbbh

字符型(C)

3

----

#

② “工资表”(gz.dbf)。表结构如表 9.2 所示。 表 9.2

Gz(工资)数据表结构

字段含义

字段名

类型

宽度

小数位数

* 教师编号

Jsbh

字符型(C)

6

----

基础工资

Jcgz

数值型(N)

7

2

职务补贴

Zwbt

数值型(N)

7

2

职绩津贴

Zjjt

数值型(N)

7

2

扣水电费

Ksdf

数值型(N)

6

2

③ “科研情况表”(kyqk.dbf)。表结构如表 9.3 所示。 表 9.3

Kyqk(科研情况)数据表结构

字段含义

字段名

类型

宽度

小数位数

教师编号

Jsbh

字符型(C)

6

----

* 成果编号

Cgbh

字符型(C)

6

----

成果名称

Cgmc

字符型(C)

40

----

成果类别

Cglb

字符型(C)

4

----

#

280


④ “系部表”(xb.dbf)。表结构如表 9.4 所示。 表 9.4:

Xb(系部)数据表结构

字段含义

字段名

类型

宽度

小数位数

* 系部编号

Xbbh

字符型(C)

3

----

系部名称

Xbmc

字符型(C)

8

----

⑤ “用户表”(yh.dbf)。表结构如表 9.5 所示。 yh(用户)数据表结构

表 9.5 字段含义

字段名

类型

宽度

* 用户编号

yhbh

C

2

用户名称

yhmc

C

8

用户口令

yhkl

C

6

⑥ “使用情况表”(syqk.dbf)。表结构如表 9.6 所示。 表 9.6

syqk(使用情况)数据表结构

字段含义

字段名

类型

宽度

用户编号

yhbh

C

2

* 登录时间

dlsj

T

退出时间

tcsj

T

注意:在数据表结构中,带有“*”号的字段为主关键字;带有“#”号的字段为外部关 键字。 前四个表是“教师管理信息系统”的基础数据源。 “用户表”(yh.dbf)用于存放“教师管理信息系统”合法用户的相关信息。在启动应用 系统,进行登录的时候,对照检查输入的信息与表中的用户信息是否匹配,口令是否正确,决 定是否允许使用“教师管理信息系统”。 “使用情况表” (syqk.dbf)则用于记录“教师管理信息系统”的使用情况,保存相关的用 户信息及其登录、退出系统的日期、时间。

9.2.4 应用系统功能模块设计 功能模块是应用系统要完成的主要工作任务,通常主要有以下几个部分: 1.数据维护模块:实现各种数据的添加、修改、删除等; 2.数据处理模块:对原始数据进行所需要的诸如索引、分类、汇总、统计、转换等各种

281


加工处理;按一定条件对数据进行各种查询等; 3.数据输出模块:对原始数据或处理后的数据根据需要,按一定的格式、方式浏览或者 打印输出等; 4.系统维护模块:包括对应用系统的用户信息,系统的运行环境进行的维护管理等。 “教师管理信息系统”的功能模块和结构层次框图如图 9.1 所示。

9.2.5 应用系统主控程序 主控程序是一个数据库应用系统的总控制部分。它作为整个应用系统的入口,是系统首先 要执行的程序,并为用户进入系统,实现和完成后续工作提供一个操作控制平台。在主控程序 中,通常要完成以下任务: ⑴ 设置应用系统的运行环境 应用系统在启动时,需要进行初始化,以设置运行环境。我们可以利用在开发系统时由 Visual FoxPro 建立的运行环境设置参数,根据需要略做修改后,插入到主控程序中,为应用 系统建立所需的运行环境。 获得 Visual FoxPro 开发系统运行环境参数的方法如下: ① 单击“工具”下拉菜单中的“选项”命令,打开“选项”对话框; ② 在按下“Shift”键的同时单击“选项”对话框中的“确定”按钮,当前的系统环境设 置命令 Set 及其参数显示在“命令”窗口中; ③ 在“命令”窗口中选择并复制需要的设置命令和参数后,粘贴到主控程序中,并根据 需要进行修改; ④ 在主控程序的初始化代码中还可设置系统默认的驱动器、路径;定义系统的全局变量; 打开需要的数据库、数据表及索引等。

282


教师信息输入、修改、删除 工资信息输入、修改、删除 数据维护模块 科研信息输入、修改、删除 系部信息输入、修改、删除 教师基本信息查询 教师信息分类统计查询 科研情况基本信息查询

教 师

数据处理模块

科研情况分类统计查询 工资基本信息查询

理 信

工资分类统计查询

工资汇总统计查询

教师基本信息浏览、报表打印输出

教师信息分类统计报表打印输出 数据输出模块

科研信息浏览、报表打印输出 科研信息分类统计报表打印输出 工资单打印输出 工资信息分类、汇总统计报表打印 系统用户信息输入、修改、删除、查询

系统维护模块

用户密码修改 系统登录、退出信息输入、查询

图 9.1 “教师管理信息系统”功能模块结构框图 ⑵ 显示用户界面 应用系统启动成功后,应显示一个用户界面。用户界面是应用系统的一个操作平台,一般 是菜单或者表单。在用户界面中,通过对菜单命令或者表单中命令按钮的操作,可以调用执行 应用系统的各功能模块。 在显示用户界面之前,通常要显示一个系统登录窗口(如图 9.2 所示)或对话框,以检查 是否是合法用户。若为合法用户,则显示用户界面,并将其登录进入系统的日期时间记录到“使 283


用情况表”(syqk.dbf)中。否则,显示提示信息后退出。 在主控程序中可以使用 Do 命令调 用一个菜单程序文件,或者使用 Do Form 命令调用一个表单文件以显示用 户界面。例如可以执行下面命令: Do main.mpr

或者:

Do Form start.scx ⑶ 事件循环控制 应用系统启动并进入用户界面后, 需要建立一个事件循环控制来等待用 户的后续操作。建立事件循环控制的方 法是执行命令:Read Events,该命令使

图 9.2 登录表单

Visual FoxPro 系统开始处理如鼠标单 击、按键等用户操作触发的事件。其作用一直到执行命令:Clear Events 后停止。 通常将 Read Events 命令放在主控程序中调用用户界面的命令之后。执行 Read Events 命 令后,应用程序即处于所显示的用户界面的控制之下。例如执行下列两个命令后,应用程序将 显示开始表单 start.scx: Do Form start.scx Read Events 要注意的是在启动系统后的用户界面中必须有结束事件循环控制的命令 Clear Events。例 如菜单中的“退出”命令或者表单中的“退出”按钮。以保证挂起 Visual FoxPro 的事件处理 过程,并将运行控制权返回到调用执行 Read Events 命令的主控程序中。然后继续执行后续结 束系统运行所需的命令。 ⑷ 恢复系统原有环境设置 在确定退出系统后,应在真正退出之前,先恢复系统原有的运行环境设置。方法与上述环 境设置相同。 ⑸ 主控程序文件的组织 主控程序文件中包含的基本任务主要有以下几项: ① 设置系统运行环境、默认驱动器和路径;定义系统全局变量;打开数据库、数据表及 索引等初始化工作; ② 调用登录表单进行用户登录检测; ③ 调用一个菜单或者表单建立初始用户界面; ④ 执行 Read Events 命令建立事件循环控制; ⑤ 执行用户界面(表单或者菜单)中的关闭事件循环控制的命令 Clear Events; ⑥ 恢复原系统环境,退出应用系统。 284


9.3 “教师管理信息系统”应用程序简介 1.系统主控程序如下所示 *应用系统主控程序 js_main.prg Clear All

&& 释放内存变量

Close All

&& 关闭所有打开的数据库、表、索引等文件

Set Talk Off

&& 关闭命令结果显示

Set Default To d: \jsgl

&& 设定默认驱动器和路径为:d:\jsgl

Do Form js_dl.scx

&& 调用系统登录表单

Do js_setup

&& 调用系统初始化程序

Do Form js_start.scx

&& 调用系统开始表单

Read Events

&& 建立事件控制循环

Do js_main.mpr

&& 调用系统主菜单,其中要包含 Clear Events

Do js_end

&& 调用系统结束程序

Quit

&& 退出应用系统,返回操作系统

2.系统登录表单 系统登录表单(表单文件名为:js_dl.scx。登录表单界面如图 9.2 所示)用于检测要进入 应用系统的是否是合法用户。 启动登录表单时触发 Load 事件。在 Load 事件过程代码中打开“教师管理数据库”、 “用 户”数据表和“使用情况”数据表;声明全局变量并赋初值。 登录表单及其中控件对象的几个事件代码如下: ⑴ 登录表单的装载(Load)和卸载(UnLoad)事件代码。 ① 登录表单 Load 事件代码 Set Talk Off Set Safety Off Open Database jsgl

&& 打开 jsgl 数据库

Use yh In 0

&& 打开 yh 数据表

Use syqk In 0

&& 打开 syqk 数据表

Public j, i, yh, kl

&& 声明全局变量

Stor 0 To j, i

&& 变量赋初值

Stor .F. To yh, kl 285


② 登录表单 UnLoad 事件代码 Close All ⑵“确定”和“退出”按钮的单击(Click)事件代码。 ①“确定”按钮的 Click 事件代码 Sele yh

&& 选择 yh.dbf 表所在的工作区

j=j+1 Do While .Not.Eof( ) If Thisform.Text1.Value=yhmc

&& 比较输入的用户名称

yh=.T. If Thisform.Text2.Value=yhkl

&& 比较输入的用户口令

kl=.T. yh_bh=yhbh

&& 获取用户编号

yh_qd=Datetime( )

&& 获取启动时的系统时间

Sele syqk

&& 选择 syqk.dbf 表所在的工作区

Appe Blan Repl yhbh With yh_bh, qdsj With yh_qd &&用户信息保存到 syqk.dbf 中 Exit Else i=i+1 Exit Endif Else Skip yh=.F. Endif Enddo Go Top If yh=.T. If kl=.T. Messagebox("欢迎您使用教师管理信息系统!") Thisform.Release Else If i<3 Messagebox("口令错误,请重新输入。") Thisform.Text2.Value="" 286


Thisform.Text2.Setfocus Else Messagebox("口令错误,您不能登录!") Thisform.Release Quit Endif Endif Else If j<3 Messagebox("用户名错误,请重新输入。") Thisform.Text1.Value="" Thisform.Text1.Setfocus Else Messagebox("非授权用户,您不能使用本系统!") Thisform.Release Quit Endif Endif ②“退出”按钮的 Click 事件代码 Thisform.Release Quit 3.系统初始化程序 *初始化程序 js_setup.Prg,设置系统运行环境参数

287

Set Sysmenu Off

&& 关闭系统菜单

Set Clock On

&& 打开时钟显示

Set Carry On

&& 设定添加新纪录时复制当前记录的数据

Set Confirm On

&& 设定按 Enter 或者 Tab 键退出文本框

Set Safety Off

&& 关闭安全提示信息显示

Set Escape On

&& 设定按 Esc 键中断程序或者命令的运行

Set Notify On

&& 设定显示系统提示信息

Set Palette Off

&& 关闭 Visual Foxpro 调色板

Set Bell On

&& 设定铃声报警

Set Exact Off

&& 关闭精确比较

Set Near Off

&& 设定记录查询不成功时指针位于表尾部


Set Exclusive On

&& 设定在网络上按共享方式打开数据表

Set Deleted On

&& 设定处理带有删除标记的记录

Set Unique Off

&& 设定索引文件中包含重复索引关键字值

Set Refresh To 0, 5

&& 设定在 Browse 窗口中由网络用户进行记录更新的时间

Set Blocksize To 64

&& 设定一次分配给备注型字段的存储空间

Set Collate To "Pinyin"

&& 设定字符串按拼音顺序排序

Set Sysformats Off

&& 设定 Windows 系统设置不更新 Vfp 系统设置

Set Seconds On

&& 设定日期时间型数据中显示秒

Set Century Off

&& 设定在日期数据中显示世纪

Set Currency Left

&& 设定货币符号显示在数据的左端

Set Currency To "$"

&& 设定显示的货币符号为“$”

Set Hours To 12

&& 设定系统时钟为 12 小时制

Set Date To Ymd

&& 设定日期按年月日的格式显示

Set Decimals To 2 && 设定数值数据的小数位为 2 位 Set Fdow To 1

表 9.3 属性名

属性值

属性名

属性值

AutoCenter

.T.

Name

Start

BorderStyle

2

TitleBar

0

Caption

(无)

Picture

Clouds

Height

350

Width

500

&& 设定星期的第一天为星期天 Set Fweek To 1 && 设定包含 1 月 1 日的为第一个星期

开始表单的属性

Set Mark To "/" && 设定日期的分隔符为“/” Set Separator To "," && 设定整数中每 3 位数字间的分隔符“,” Set Point To "."

&& 设定小数点符号为“.”

Set Help On

&& 设定 Vfp 的联机帮助功能可用

Set Help To "c:\program files\microsoft visual foxpro 8\dv_foxhelp.chm" && 设定显示联机帮助时使用的 Vfp 帮助文件 Public xtbt

&& 声明全局变量 xtbt 并且赋值

xtbt=“教师管理信息系统” _Screen.Caption=xtbt

&& 设定主窗口的标题

_Screen.Icon="xttb.Ico"

&& 设定主窗口图标

Return

288


4.系统开始表单 系统开始表单(js_start.Scx)用于显示 一些应用系统的有关信息,引导用户进入系 统,如图 9.3 所示。表单的部分属性如表 9.3 所示。 5.系统主控菜单 系统主控菜单是应用系统的操作控制 平台,提供用户调用执行应用系统各功能模 块的命令。菜单中包括数据维护、数据处理、 数据输出和系统维护等菜单项。各菜单项下

图 9.3 系统开始表单

又包含若干个子菜单及功能命令。如图 9.4 所示。 6.功能表单和报表 各功能表单提供数据库应用系统对数据的各种操作,如数据的输入、修改、删除、浏览、 查询等。 ⑴ 数据维护表单具有数据添加、修改和删除的功能。如图 9.5 所示为“教师基本情况” 数据维护表单。在该表单中可对“jsqk”数据表中的数据进行添加、修改和删除的操作。 ⑵ 数据浏览表单以表格的形式显示表中的数据,类似于交互式工作方式下的 Browse 命 令功能。如图 9.6 所示为“教师基本情况”的浏览表单。使用数据浏览表单可以查看一个或者 多个表中的大量数据。

289


⑶ 数据查询表单具有根据需要综合显示多个表中相关联的数据,或者根据一定条件查询 一个或者多个表中数据的功能。如图 9.7 所示即为以教师基本情况为主,工资状况和科研情况

图 9.4 系统主菜单

图 9.5 数据维护表单

图 9.6 数据浏览表单 为辅的综合查询表单。其中(a)图显示的是教师基本情况及其对应的工资状况;而(b)图显示的 是教师的基本情况及其对应的科研情况。

290


(a)

(b)

图 9.7

291

数据查询表单


图 9.8 是进行分类查询的表单。在该表单的组合框中选择要查询的分类字段,如图 9.8(a) 所示;然后在文本框中输入要查询的字段值,单击“查询”按钮即可根据输入的信息查找数据。

(a)

(b)

(c)

图 9.8 分类查询表单

图 9.9 按部门编号分类查询结果

图 9.10 按姓名分类查询结果 图 9.8(b)所示为选择了“系部编号”作为查询字段,“108”则是要查询字段的记录值。 图 9.9 所示即为按照上述条件查询所得结果的显示表单。图 9.10 所示是以“姓名”字段值 等于“张玉萍”为条件查询所得结果的显示表单。图 9.8(c)所示则是根据输入的数据未查找 292


到记录而显示的提示信息。 ⑷ 报表能够提供通过打印机输出数据的功能。如图 9.11 所示为“系部教师基本情况”报 表打印输出的预览效果。

图 9.11 报表打印输出预览

图 9.12 退出表单 7.系统结束程序 系统结束程序(js_end.prg)的作用与登录和初始化程序的作用正好相反。在结束程序中, 主要的工作通常有: ⑴ 显示一个退出表单,如图 9.12 所示; ⑵ 将用户退出系统的日期时间记录到使用情况(syqk.dbf)数据表中; ⑶ 恢复系统原来的运行环境参数设置等。

293


9.4 应用系统的连编 完成应用系统各组成部分的设计并对各个功能模块分别进行调试后,需要将各模块组装起 来,对整个系统进行联合调试。系统联合调试成功后,最后进行编译生成应用系统的可执行程 序,这在 Visual FoxPro 中称为连编项目。 1.项目组装 Visual FoxPro 提供了项目管理器来组装各个功能模块,进行统一管理,构建一个完整的 应用系统项目。组装功能模块的操作步骤如下: ⑴ 建立或打开项目文件 要组装各功能模块,必须先建立一个项目文件。若已经建立了项目文件,则需要打开它。 建立新项目文件或打开已有项目文件的方法详见 1.4.4 节的介绍。项目文件建立或打开后,系 统自动打开项目管理器。如图 9.13 所示即为打开了“教师管理” (jsgl.pjx)项目文件的项目管 理器。

图 9.13 项目管理器-“全部”选项卡 ⑵ 添加数据

294


单击选择“数据”选项卡,单击“添加”按钮,在“打开”对话框中选择需要的数据库, 将其它数据库中的数据表,自由表以及视图等数据文件添加到项目文件中。如图 9.14 所示。

图 9.14 “数据”选项卡 ⑶ 单击选择“文档”选项卡,单击“添加”按钮,选择需要的表单文件、报表文件等添 加到项目文件中。如图 9.15 所示。

295


图 9.15 “文档”选项卡 ⑷ 单击选择“类”选项卡,将类文件添加到项目文件中。如图 9.16 所示。

图 9.16 “类”选项卡 ⑸ 单击选择“代码”选项卡,将程序文件等添加到项目文件中。如图 9.17 所示。

296


图 9.17 “代码”选项卡

图 9.18 “其他”选项卡 ⑹ 单击选择“其他”选项卡,将菜单文件和其他如位图、图标等相关文件添加到项目文 件中。如图 9.18 所示。 2.设置主程序 主程序是应用系统的起始点。在用户启动应用程序时,首先运行的是主程序。每一个应用

297


系统都必须包含一个主程序。在 Visual FoxPro 8.0 中,程序、表单、菜单、查询等文件都可 以作为主程序文件,但通常是建立一个专门的程序文件作为应用系统的主程序文件。主程序文 件的功能与组成详见 9.3 节的介绍。在项目管理器的“代码”选项卡中主程序文件名以黑体字 显示,如图 9.17 中的 js_main 文件。设置主程序的方法有两种: ⑴ 在项目管理器中选中要设置为主程序的程序文件,单击“项目”下拉菜单中的“设置 主文件”命令,或者右键单击要设置的文件,在弹出的快捷菜单中选择“设置主文件”命令。 ⑵ 单击“项目”下拉菜单中的“项目信息”命令,或者右键单击项目管理器,在弹出的 快捷菜单中单击“项目信息”命令,打开“项目信息”对话框。单击选择“文件”选项卡,右 键单击列表框中要设置为主程序的文件,在弹出的快捷菜单中选择“设置主文件”命令,“包 含”列中该文件后边的复选框自动清空并呈现灰色,表示不能排除和修改,如图 9.19 所示。

图 9.19 项目信息“文件”选项卡 单击“确定”按钮关闭对话框,项目管理器中的对应文件变成黑体,设置为主程序文件。 在一个应用系统中,主程序文件是唯一的。若要重新设置主程序文件,原来的设置则会自 动取消。 3.设置文件“排除”或“包含” Visual FoxPro 将一个项目编译成一个应用程序时,会将项目中包含的所有文件组合成一 个统一的应用系统程序文件。在应用系统的运行过程中,它所包含的文件有些需要能够进行修 改操作,而有些则不能或不允许进行修改操作。

298


例如数据库中的数据表文件,用户经常要做添加、修改、删除表中记录的操作,需要修改。 而程序、表单、查询、菜单、报表等文件在应用系统运行时一般不会被修改。 在项目管理器中,若文件名前有一个标记符号 Ø,表示该文件被从项目中“排除”,如图 9.20 所示。项目编译后,在应用系统的运行过程中被“排除”的文件可以进行修改。无 Ø 标 记的文件称为“包含”文件。项目编译后“包含”文件成为只读文件,在应用系统的运行过程 中不允许进行修改。

图 9.20 设置文件“排除”或“包含” Visual

FoxPro 默认将数据库和其中的数据表文件设置为“排除”,其它的文件默认设置

为“包含” 。但有时候需要人工设置某些文件为“排除”或者“包含” 。例如,为了在应用系统 运行时可以动态地改变一个报表,则需将该报表文件设置为“排除”。而其中保存的数据不需 要或者不允许修改的数据表文件则可以设置为“包含”。设置文件“排除”或者“包含”的方 法有两种: ⑴ 在项目管理器中选定文件,单击“项目”下拉菜单中的“排除”(或“包含”)命令, 即可将选定的文件设置为“排除”(或“包含”) 。 也可以右键单击选定文件,在弹出的快捷菜单中做同样的设置。 ⑵ 打开“项目信息”对话框,在“文件”选项卡的列表框中选定文件,单击“包含”列 中的复选框,框中有“x”号的表示“包含”,空白的表示“排除”。灰色无“x”号的则表示是 “包含”并且不能改变为排除,如主程序文件。

299


4.设置项目信息 在“项目信息”对话框中,单击“项目”选项卡,如图 9.21 所示。在“项目”选项卡中 用户可以输入以下信息: ⑴ 与开发者有关的信息,如姓名、单位、地址等。 ⑵ 设置项目所在的目录路径。 ⑶ 设置在应用程序文件中是否包含调试信息。设置该项对程序的调试很有帮助,但会使 程序体积变大。通常在试连编时设置,而在正式交付前进行最后连编时则应将其清除。 ⑷ 设置是否对应用程序进行加密。 ⑸ 设置应用程序最小化时的图标。

图 9.21 项目信息设置 5.连编项目

300


Visual FoxPro 在连编项目文件时,要对项目的整体性进行测试,并对程序中的引用进行 校验,检查所有的程序组件是否可用。连编的最后结果是除了标记为“排除”的文件以外,所 有在项目中使用的文件,编译连接成为一个应用程序文件。在项目管理器中进行项目连编的操

图 9.22 连编选项 作步骤如下: ⑴ 选择设置为主程序的文件,单击“连编”按钮,打开“连编选项”对话框,如图 9.22 所示。 ⑵ 在“建立操作”中选择“重新连编项目”单选按钮。 其他单选按钮的功能含义如下: z 应用程序:连编生成扩展名为.app 的应用程序文件。 z Win32 可执行程序/com 服务程序:连编生成扩展名为.exe 的可执行程序文件。 z 单线程 com 服务程序:创建扩展名为.dll 的单线程动态链接库。 z 多线程 com 服务程序:创建扩展名为.dll 的多线程动态链接库。 ⑶ 在“选项”中选择“重新编译全部文件”复选框,会将所有上次连编过的文件,以及 新添加到项目中的文件全部进行编译,否则只重新连编上次连编后修改过的文件。 其他复选框的功能含义如下: z 显示错误:确定连编完成后是否显示编译中出现的错误信息。 z 连编后运行:确定连编完成应用程序后是否立即运行该程序。此复选框仅在选定了“应 用程序”或“Win32 可执行程序/com 服务程序”单选按钮后才可用。 z 重新生成组件的 ID:确定连编程序时是否重新生成程序组件的唯一标识。此复选框仅 在选定了“Win32 可执行程序/com 服务程序”或“单线程 com 服务程序”或“多线 301


程 com 服务程序”单选按钮后才可用。 “版本”命令按钮也同时激活,可进行版本信息 的设置。 ⑷ 单击“确定”按钮,开始连编项目。 在命令窗口中输入如下命令,同样实现连编项目文件的功能。 Build Project <项目文件名> 若在连编项目文件中出现错误,必须改正或排除错误,反复进行“重新连编项目”的操作, 直至连编成功。 6.连编应用程序 连编项目文件成功之后,应在连编成应用程序之前试运行该项目。可以在“项目管理器” 中选择主程序后,单击“运行”按钮,或者在命令窗口中执行 Do <主程序名> 来运行项目。 若程序运行正确,就可以连编成一个最终的应用程序文件。连编应用程序根据设置可以生 成两种文件形式: ① 扩展名为 .app 的应用程序文件。此类应用程序运行时需要 Visual FoxPro 系统的支持, 即只能在 Visual FoxPro 环境中执行。 ② 扩展名为 .exe 的可执行程序文件。此类可执行程序可以脱离 Visual FoxPro 系统,直 接在 Windows 操作系统环境下运行。 两种程序文件除了运行环境的不同外,可执行程序文件的运行速度要快于应用程序文件。 根据在“连编选项”对话框中是选择“连编应用程序”单选按钮,还是选择“Win32 可执 行程序/com 服务程序” 单选按钮,分别生成应用程序文件,或者生成可执行程序文件。 在命令窗口中输入连编应用程序的命令如下: 格式 1:Build App <应用程序名> From <项目文件名> 格式 2:Build Exe <应用程序名> From <项目文件名> 说明:格式 1 生成应用程序文件;格式 2 生成可执行程序文件。 应用程序连编完成后,即可发布,交付用户使用,进入系统维护阶段。

302


附 附录 I 命

Visual Foxpro 8.0 命令索引表

#Define…Undef

创建和释放编译期间所用的常量

#If…Endif

编译时根据条件决定是否编辑某段源代码

#Ifdef | #Ifndef…#Endif

根据是否定义了某编译常量, 决定是否编译某段代码

#Include

让预处理器将指定的头文件内容在编译时合并到程序中

&

用于执行宏代换

&&

表示程序文件中不可执行的嵌入式注释的开始

*

注释语句标记;程序文件中用星号开始的行是注释行

? | ??

计算并分行或不分行输出一个或者一组表达式的值

\ | \\

分行或者不分行输出文本行

@...Box

绘制指定边角的方框

@...Class

创建用 Read 激活的控件或对象。

@...Clear

清除 Visual Foxpro 主窗口或者用户自定义窗口

@...Edit

建立编辑框

@...Fill

改变屏幕中某一区域内已存在文本的颜色

@...Get-复选框

创建复选框

@...Get-命令按钮

建立命令按钮

@...Get-组合框

创建组合框

@...Get-列表框

创建列表框

@...Get—透明按钮

建立透明按钮

@...Get-文本框

创建文本框

@...Get-选项按钮

创建选项组

@...Say

在指定的行和列位置显示或打印

@...To

绘制方框、圆或者椭圆

Accept

将键盘输入的字符型数据赋值给指定的内存变量

Activate Menu

显示并激活一个菜单栏

303


Activate Popup

显示并激活一个菜单

Activate Screen

激活 Visual Foxpro 主窗口

Activate Window

显示并激活一个或多个用户自定义窗口或系统窗口

(附录 I 续表) 命

Add Class

添加类定义到 .vcx 可视类库中口

Add Table

添加自由表到当前打开的数据库中

Append

添加一个或多个新记录到表的末尾

Append From

从另一文件添加记录到当前表的末尾

Append From Array

将数组中的每一行作为一条记录追加到当前表的末尾

Append Generel

从文件中导入 OLE 对象,放入当前记录的通用字段中

Append Memo

将文本文件中的内容拷贝到备注型字段中

Append Procedures

将文本文件中存储过程添加到当前数据库的存储过程中

Alter Table

SQL 命令, 可以通过编程修改表的结构

Average

计算数值表达式或数值型字段的算术平均值

Begin Transaction

开始一次事务处理

Blank

清除当前记录中字段的数据

Browse

打开 Browse 窗口并显示当前表或指定表的记录

Build App

从项目文件中创建 .App 应用程序文件

Build Dll

使用项目文件中的类信息创建动态链接库

Build Exe

从项目文件中创建一个可执行文件

Build Project

创建项目文件

Call

执行指定的二进制文件、外部命令或者外部函数

Cancel

中断当前 Visual Foxpro 程序文件的运行

Cd | Chdir

将缺省的 Visual Foxpro 目录改变为指定的目录

Change

显示要编辑的字段

Clear

清理屏幕、释放内存变量、关闭文件等

Clear Class

从内存中清除一个类定义

Clear Classlib

从内存中清除一个类库

Close

关闭各种类型的文件

Close Memo

关闭备注编辑窗口

Close Tables

关闭打开的数据表或视图

Compile

编译一个或多个源文件, 然后为每个源文件建立目标文件

304


Compile Database

编译数据库中的内部存储过程

Compile Form

编译表单对象

Continue

继续执行以前的 Locate 命令

Copy File

用于复制任何类型的文件

Copy Indexes

从单项索引文件 .idx 中建立复合索引标记

Copy Memo

将当前记录中指定备注字段的内容拷贝到文本文件中

(附录 I 续表) 命

Copy Procedures

将当前数据库中的存储过程拷贝到文本文件中

Copy Structure

建立与当前表结构完全相同的新的空表。用于表结构的复制

Copy Structure Extended

将当前表的每个字段的信息作为记录而拷贝到新表中

Copy Tag

从复合索引文件的标识中创建单项索引文件 .idx

Copy To

根据当前表的内容建立一个新的表文件

Copy To Array

将当前表中的数据拷贝到数组

Count

统计表中的记录数

Create

建立新的 Visual Foxpro 表

Create Class

打开类设计器, 建立新的类定义

Create Classlib

建立新的、空的可视类库文件

Create Color Set

在当前颜色设置中建立一个颜色集

Create Connection

建立一个命名连接, 并将其存入当前数据库

Create Database

建立并打开一个数据库

Create Form

打开表单设计器

Create From

使用数据库结构表建立一个新的数据表

Create Label

打开标签设计器

Create Menu

打开菜单设计器

Create Project

打开项目管理器

Create Query

打开查询设计器

Create Report

打开报表设计器

Create Sql View

打开视图设计器,创建当前数据库的一个 SQL 视图

Create Table

SQL 命令,建立一个含有指定字段的表

Create Trigger

为一个表建立 Delete、Insert 和 Update 触发器

Create View

在 Visual Foxpro 环境中建立一个视图文件

Deactivate Menu

撤消用户自定义菜单栏并从屏幕上删除, 但不从内存中释放

305


Deactivate Popup

撤消用 Define Popup 命令建立的弹出式菜单

Deactivate Window

撤消用户自定义窗口或系统窗口并从屏幕上消除, 但不从内存中释放

Debug

打开 Visual Foxpro 调试器

Debugout

在 Debug Output 窗口显示表达式的结果

Declare

建立一维或二维数组内存变量

Define Bar

为 Define Popup 命令建立的菜单定义菜单项

Define Box

在正文内容周围绘制一个方框

Define Class

创建用户自定义的类或者子类, 指定其属性、事件和方法

Define Menu

建立一个菜单栏

(附录 I 续表) 命

Define Pad

为用户自定义菜单栏或者系统菜单栏定义菜单标题

Define Popup

建立一个菜单

Define Window

建立一个窗口, 并确定其属性

Delete

为记录加删除标记

Delete-SQL

标记删除记录

Delete Connection

从当前数据库中删除一个命名连接

Delete Database

从磁盘中删除一个数据库文件

Delete File

从磁盘中删除一个文件

Delete Tag

从复合索引文件中删除一个或一组标记

Delete Trigger

从当前数据库中删除表的 Delete、Insert 和 Update 触发器

Delete View

从当前数据库中删除一个 SQL 视图

Dimension

建立一维或者二维的数组内存变量

Dir 或 Directory

显示一个目录或文件夹中的文件信息

Display

在系统主窗口或者用户自定义窗口中, 显示当前表中的记录

Display Connections

显示当前数据库中命名连接的有关信息

Display Database

显示当前数据库, 以及它的字段、表或者视图的有关信息

Display Dlls

显示与共享库函数有关的信息

Display Files

显示文件的有关信息

Display Memory

显示当前内存变量和数组元素的内容

Display Objects

显示一个对象或者一组对象的有关信息

Display Procedures

显示当前数据库中存储过程的信息

Display Status

显示 Visual Foxpro 的环境状态

306


Display Structure

显示指定表文件的结构

Display Tables

显示当前数据库中所有表的信息

Display Views

显示当前数据库中关于 SQL 视图是本地表还是远程表

Do

运行程序或过程

Do Form

运行已创建或已编译的表单

Do Case…Endcase

分支结构, 执行第一个逻辑表达式为真的分支后面的一组命令

Do While…Enddo

循环结构, 根据指定的条件循环执行一组指定的命令

Drop Table

从当前的数据库中移去并删除一个表

Drop View

从当前的数据库中删除一个 SQL 视图

Edit

显示要编辑的字段

Eject

发送一个换页符给打印机

Eject Page

发送一个条件进页符给打印机

(附录 I 续表) 命

End Transaction

结束当前的事务处理并保存

Erase

从磁盘中删除一个文件

Error

产生一个 Visual Foxpro 错误

Exit

退出 Do While、For 或者 Scan 循环

Export

将 Visual Foxpro 表中的数据拷贝到不同格式的文件中

External

向项目管理器通报未定义的引用

Flush

将表和索引的修改存入磁盘中

For…Endfor(Next)

将一组命令反复执行指定的次数

Free Table

从表中删除数据库引用,把表变为自由表

Function

标识用户自定义函数定义的开始

Gather

用数组、内存变量或者对象中的数据置换活动表中的数据

Getexpr

建立表达式并将其存入内存变量或者数组元素中

Go | Goto

将记录指针移动到指定记录号的记录上

Help

打开帮助窗口

Hide Menu

隐藏活动的自定义菜单

Hide Popup

隐藏一个或者多个用 Define Popup 命令建立的活动菜单

Hide Window

隐藏活动的用户自定义窗口或者 Visual Foxpro 系统窗口

If…Endif

根据逻辑表达式的值有条件地执行一组命令

Import

从外部文件中导入数据, 然后建立新数椐表

307


Index

建立一个索引文件, 按某个逻辑顺序显示和访问表中的数据

Input

中断程序的执行, 将键盘输入的数据赋给指定的内存变量

Insert

在当前表中插入新记录, 然后显示该记录并进行编辑

Insert-SQL

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

Keyboard

将指定的字符表达式置于键盘缓冲区中

Label

根据表文件的内容和标签定义文件, 打印标签

List

连续显示表或者环境的信息

List Connections

连续显示当前数据库中命名连接的有关信息

List Database

连续显示当前数据库, 以及它的字段、表或者视图的有关信息

List Dlls

连续显示与共享库函数有关的信息

List Objects

连续显示一个对象或者一组对象的有关信息

List Procedures

连续显示当前数据库中存储过程的有关信息

List Tables

连续显示当前数据库中所有表的相关信息

List Views

连续显示当前数据库中与 SQL 视图有关的信息

Load

将二进制文件、外部命令或者外部函数装入内存中

(附录 I 续表) 命

Local

建立局部内存变量和内存数组

Locate

顺序查找表中满足指定条件的第一个记录,指针定位于该记录

Lparameters

从调用程序中向一个局部内存变量或者数组传递数据

Md | Mkdir

在磁盘上建立一个新目录

Menu

创建菜单系统

Modify Class

打开类设计器, 修改类定义或者建立新的类定义

Modify Command

打开编辑窗口, 编辑或者建立程序文件

Modify Connection

打开连接设计器, 修改已经存储在当前数据库中的命名连接

Modify Database

打开数据库设计器, 允许用户按交互方式编辑当前数据库

Modify File

打开编辑窗口, 修改或者建立文本文件

Modify Form

打开表单设计器, 修改或者建立表单

Modify General

打开编辑窗口, 编辑当前记录的通用型字段

Modify Label

打开标签设计器, 编辑或者建立标签

Modify Memo

打开编辑窗口, 编辑当前记录的备注字段

Modify Menu

打开菜单设计器, 编辑或者建立菜单系统

Modify Procedure

打开文本编辑器, 为当前数据库建立或者修改存储过程

308


Modify Project

打开项目管理器, 编辑或者建立一个项目文件

Modify Query

打开查询设计器, 编辑或者建立查询

Modify Report

打开报表设计器,编辑或建立报表

Modify Screen

打开表单设计器, 编辑或建立表单

Modify Structure

打开表设计器, 修改表的结构

Modify View

显示视图设计器, 编辑已经存在的 SQL 视图

Modify Window

编辑用户自定义窗口或者 Visual Foxpro 主窗口

Mouse

执行单击、双击、移动或者拖曳鼠标的操作

Move Popup

将 Define Popup 定义的用户自定义菜单移到新的位置

Move Window

移动 Define Window 定义的用户自定义窗口或系统窗口

Note

表示程序文件中不需要执行的注释行的开始

On Bar

指定当选择特定的菜单项时, 激活的菜单或者菜单栏

On Error

指定发生错误时要执行的命令

On Escape

指定在程序或命令执行期间, 当按下 Esc 键时将执行的命令

On Key Label

按下指定键, 或组合键, 或单击鼠标时, 将要执行的命令

On Pad

确定选择菜单标题时要激活的菜单或者菜单栏

On Page

打印输出到报表中的指定行或执行 Eject Page 时, 将要执行的命令

On Selection Bar

确定选择指定的菜单项时将要执行的命令

(附录 I 续表) 命

On Selection Menu

确定当选择菜单栏中的任意一个菜单标题时将要执行的命令

On Selection Pad

确定选择菜单栏中指定的菜单标题时将要执行的命令

On Selection Popup

确定从菜单中任意选择一个菜单项时将要执行的命令

On Shutdown

确定退出 Visual Foxpro 或 Windows 时, 将要执行的命令

Open Database

打开一个数据库文件

Pack

永久性地删除当前表中加有删除标记的记录

Pack Database

删除当前数据库中加有删除标记的记录

Parameters

将调用程序传递的数据赋值给内存变量或数组

Play Macro

执行一个键盘宏

Pop Key

恢复用 Push Key 存入栈中的 On Key Label 指定键值

Pop Menu

恢复用 Push Menu 命令保存在栈中的指定菜单栏的定义

Pop Popup

恢复用 Push Popup 命令存入栈中的指定菜单的定义

Private

在子程序中定义私有内存变量或数组

309


Procedure

标识程序文件中一个过程的开始, 并定义该过程的名字

Public

定义全局内存变量或者数组

Push Key

将当前所有 On Key Label 命令设置放入内存的—个栈中

Push Menu

将菜单栏的定义存入内存的菜单栏定义栈中

Push Popup

将菜单定义存入内存的菜单定义栈中

Quit

退出 Visual FoxPro 系统

Rd | Rmdir

从磁盘中删除一个空目录

Read

激活控件

Read Events

开始事件处理

Recall

去除当前表中记录的删除标记

Regional

建立区域内存变量和数组

Reindex

重建当前打开的索引文件

Release

从内存中释放内存变量和数组

Release Bar

从内存中删除菜单中指定的菜单项或者所有的菜单项

Release Classlib

关闭包含类定义的可视类库文件

Release Menus

从内存中删除用户自定义的菜单栏

Release Pad

从内存中释放指定的菜单标题或者全部菜单标题

Release Popups

从内存中释放指定的菜单或者全部菜单

Release Procedure

关闭用 Set Procedure 命令打开的过程文件

Release Windows

从内存中释放用户自定义窗口或者 Visual Foxpro 系统窗口

Remove Class

从可视类库中删除类定义

(附录 I 续表) 命

Remove Table

从当前数据库中移去一个表

Rename

更改一个文件的名称

Rename Class

重命名包含在可视类库中的类定义

Rename Connection

重命名当前数据库中命名连接

Rename Table

重命名当前数据库中表

Rename View

重命名当前数据库中 SQL 视图

Replace

更新表中的记录

Replace From Array

用内存数组的值来更新字段中的数据

Report

按报表文件的定义显示或打印报表

Restore From

从内存变量文件或者备注字段中恢复保存的内存变量和数组

310


Restore Macros

从键盘宏文件或者备注字段中恢复键盘宏

Restore Screen

恢复存储在屏幕缓冲区、内存变量或者数组元素中的系统主窗口或用户自定义窗口

Restore Window

将保存在窗口文件或备注字段中的窗口定义和窗口状态恢复到内存中

Resume

继续执行被挂起的程序

Retry

重新执行上次的命令

Return

将程序控制权返回给调用程序

Rollback

放弃当前事务处理期间的任何更改

Run | !

执行外部的操作命令或程序

Save Macros

将键盘宏存入键盘宏文件或备注字段中

Save Screen

将 Visual Foxpro 主窗口或活动的用户自定义窗口的图像存入屏幕缓冲区、内存变量 或者数组元素中

Save To

将当前的内存变量和数组存入内存变量文件或者备注字段中

Save Windows

把所有或指定的窗口的定义保存在窗口文件或者备注字段中

Scan…Endscan

移动当前表中记录指针,并对每个记录执行指定的命令序列,直到满足指定的条件为止

Scatter

将当前记录的数据拷贝到内存变量或者数组中

Scroll

全屏幕移动系统主窗口或用户自定义窗口中的一个区域

Seek

查找表中索引关键字值与指定的表达式相匹配的第一条记录

Select

选择指定的工作区

Select-Sql

从一个或多个表中检索数据

Set

打开数据工作期窗口

Set Alternate On | Off

将显示内容或打印输出定向到一个文本文件中

Set Ansi On | Off

确定 SQL 字符串的比较方式

Set Asserts On | Off

确定是否忽略 Asserts 命令

Set Autosave On | Off

确定退出 Read 或返回命令窗口时,是否将缓冲区的数据保存到磁盘

(附录 I 续表) 命

Set Bell On | Off

确定是否关闭计算机铃声

Set Blocksize To

确定 Visual Foxpro 一次分配给备注型字段存储空间的大小

Set Carry On | Off

当用 Append 或者 Insert 命令添加新记录时, 用于确定 Visual Foxpro 是否将当前记 录的数据传入新记录中

Set Century On | Off | To

用于确定 Visual Foxpro 是否显示日期表达式中的世纪部分

Set Classlib To

打开包含类定义的可视类库

Set Clock On | Off

确定 Visual Foxpro 是否显示系统时钟, 并指定时钟的位置

311


Set Collate To

指定字符字段在随后的索引和排序操作中的整理序列

Set Color Of Scheme

指定调色板中的颜色

Set Color Set To

装载以前定义的颜色集

Set Compatible

控制与 Foxbase+和其他 Xbase 语言的兼容性

Set Confirm On | Off

确定是否必须按 Enter 或者 Tab 键来退出文本框

Set Console On | Off

设置是否将输出送到 Visual Foxpro 主窗口或活动的用户自定义窗口

Set Cpdialog On | Off

确定打开表时是否显示 Code Page 对话框

Set Currency To

定义货币符号并指定在表达式中的显示位置

Set Cursor On | Off

当 Visual Foxpro 等待输入时, 确定是否显示插入点

Set Database To

指定当前的数据库

Set Datasession To

激活指定的表单数据工作期

Set Date To

指定日期型和日期时间型表达式显示时的格式

Set Debugout To

将调试结果输出到一个文件中

Set Decimals To

指定数值表达式中显示的小数位数

Set Default To

指定缺省的驱动器、目录或者文件夹

Set Deleted On | Off

指示是否处理带有删除标记的记录

Set Development On | Off

设置程序运行前, 系统是否检测、比较源程序和目标文件的日期时间

Set Device To

将@…Say 命令的输出直接送往屏幕、打印机或者文件

Set Echo On | Off

打开 Trace 窗口, 进行程序的调试

Set Escape On | Off

确定按 Esc 键时是否中断程序和命令的运行

Set Exact On | Off

确定进行两个不同长度的字符串比较规则

Set Exclusive On | Off

将按独占或者共享方式打开网络上的表文件

Set Fdow To

指定一个星期中的第一天

Set Fields On | Off

指定表中可以进行存取的字段

Set Filter To

指定当前表中可以被存取访问的记录必须满足的条件

Set Fixed On | Off

确定数值型数据显示时的小数位数是否固定

Set Fullpath On | Off

确定 Cdx( ), Dbf( ), Mdx( ), Ndx( )函数是否返回文件路径名和文件名

(附录 I 续表) 命

Set Function

将表达式(键盘宏)赋予某一功能键或者组合键

Set Fweek To

指定一年中的第一个星期

Set Headings On | Off

执行 Type 命令时, 确定是否显示字段的列标头和文件信息

312


Set Help On | Off

确定 Visual Foxpro 的联机帮助是否可用

Set Helpfilter

在帮助窗口中显示 .DBF 风格的帮助主题

Set Hours To

设置系统时钟为 12 或者 24 小时格式

Set Index To

为当前表打开一个或者多个索引文件

Set Key

确定基于索引关键字的记录访问范围

Set Keycomp To

控制 Visual Foxpro 击键导航

Set Library To

打开外部 API(应用程序编程接口)库文件

Set Lock On | Off

关闭或打开文件的自动加锁功能

Set Logerrors On | Off

确定是否将编译错误提示信息存入文本文件中

Set Mackey To

显示 Macro Key Definition 对话框的键或者组合键

Set Margin To

设置打印机的左边界, 并且影响直接送往打印机的所有输出

Set Mark Of Menu

为菜单标题或菜单项, 显示或清除或指定一个标记字符

Set Mark To

指定显示日期表达式时所使用的分界符

Set Memowidth To

指定备注型字段和字符表达式的显示宽度

Set Message To

定义主窗口或图形状态栏显示的信息

Set Multilocks On | Off

确定是否可以用 Lock( )和 Rlock( )函数为多个记录加锁

Set Near On | Off

当 Find 和 Seek 命令搜索记录不成功时, 确定记录指针位置

Set Nocptrans To

防止打开表中的某些指定字段转换到不同的代码页中

Set Notify On | Off

确定某系统提示信息是否可以显示

Set Null On | Off

确定 Alter Table、Create Table Insert-SOL 如何支持空值

Set Order To

指定表的控制索引文件或者标识

Set Path To

设置文件的搜索路径

Set Pdsetup To

装载打印机驱动程序或者清除当前的打印机驱动程序

Set Point To

确定用于显示数值型或者货币型表达式中小数点的字符

Set Printer On | Off

设置是否将输出结果送往打印机、文件、端口或者网络打印机

Set Refresh To

确定在 Browse 窗口中, 由网络上的其他用户进行记录更新

Set Relation To

在两个打开表之间建立关联

Set Relation Off Into

消除当前工作区和指定工作区内两个表之间的关联

Set Reprocess To

设置一次加锁失败后, 再次尝试加锁的次数或者时间

Set Resource On | Off

更新或者指定一个资源文件

Set Safety On | Off

设置在改写已有文件之前是否显示警告提示信息

(附录 I 续表) 命

313


Set Seconds On | Off

表示秒是否显示在日期时间型数据中

Set Skip To

在表之间建立一对多的关联

Set Skip Of Menu

禁止或启用用户自定义菜单或 Visual FoxPro 系统菜单

Set Space On | Off

确定使用“?”或“??”时, 字段或表达式之间是否显示空格

Set Status On | Off

显示或者移去基于字符的状态栏

Set Status Bar On | Off

显示或者删除图形状态栏

Set Step On

为程序调试打开跟踪窗口并挂起程序

Set Sysformats On | Off

确定是否用当前 Windows 系统设置更新 Visual Foxpro 系统设置

Set Sysmenu On | Off

程序执行期间, Visual Foxpro 系统菜单栏是否可用并重新配置

Set Talk On | Off

确定 Visual Foxpro 是否显示命令的结果

Set Textmerge On | Off

确定文本合并分界符(“<<”和“>>”)之间的字段、内存变量、数组元素、函数 或者表达式等是否进行计算

Set Textmerge Delimiters

指定文本合并分界符

Set Topic To

指定调用 Visual Foxpro 帮助系统时显示的帮助主题

Set Trbetween On | Off

在 Trace 窗口中, 确定两个断点之间是否可以进行跟踪

Set Typeahead To

指定键盘前置缓冲区中可以存储的最大字符数

Set Udfparms To

确定 Visual Foxpro 给用户自定义函数的参数是按值还是按引用方式传递

Set Unique On | Off

确定索引文件中是否可以存在重复索引关键字值的记录

Set View On | Off

打开或者关闭 View 窗口, 或从视图文件中恢复系统环境

Show Menu

显示一个或者多个用户自定义菜单栏, 但是不激活

Show Object

重新显示指定的控件。支持向下兼容, 可用 Refresh 方法取代

Show Popup

显示用户自定义菜单, 但不激活

Show Window

显示用户自定义窗口及 Visual Foxpro 系统窗口, 但不激活

Size Window

改变用 Define Window 创建的窗口或 Visual Foxpro 系统窗口的大小

Skip

向前或者向后移动表中的记录指针

Sort

对当前表中的记录进行排序, 将排序后的记录输出到新表中

Store

将数据存入内存变量、数组或者数组元素中

Sum

对当前表中的所有或者指定的数值型字段求和

Suspend

暂停程序的运行, 返回到交互式 Visual Foxpro 环境

Text…Endtext

输出若干行的文本、表达式及函数的结果和内存变量的内容

Total

计算当前表中的数值型字段的总和

Type

显示文件的内容

Unlock

对表中的一个或多个记录解除锁定, 或者解除文件的锁定

Update-SQL

用新的值更新表中的记录

314


(附录 I 续表) 命

Use

打开或关闭一个表及其相关的索引文件

Validate Database

确保当前数据库中的表和索引的正确位置

Wait

显示一条信息并暂停 Visual Foxpro 的运行

With…Endwith

指定对象的多个属性

Zap

将表中的所有记录删除, 只保留表的结构

Zoom Window

改变用户自定义窗口或系统窗口的大小和位置。

附录 II 函

Visual Foxpro 8.0 常用函数索引表

&<Memvar>[.<C >]

宏代换函数

Abs(<D>)

取绝对值函数

Alias( [N] )

返回当前或指定工作区中打开的数据表别名

Alltrim(<N>)

删除首尾两端空格

Asc(<C>)

返回首字符的 ASCII 码值

At(<C1>, <C2>)

返回<C1>在<C2>中位置值

Bof( )

文件首测试函数

Cdow (<D>)

返回英文星期名

Ceiling(<D>)

返回大于或等于给定值的最小整数

Chr(<N>)

返回<N>值对应的 ASCII 字符

Chrtran(<C1>,<C2>,<C3>)

在<C1>中找到字符串<C2>, 用<C3>来替换

Cmonth(<D|T>)

返回对应月份的英文名称

Col( )

取光标当前列

Cos(<N>)

返回余弦值

Ctod(<C>)

将字符串转换为日期型数据

Ctot(<C>)

将字符串转换为日期时间型数据

Curdir( ) 或 Sys(2003)

返回当前默认的工作目录

Date( )

返回当前系统的日期

Datetime( )

返回当前系统的日期时间

315


Day(<D|T>)

返回值是给定参数值中的日

Dbc ( )

返回当前打开的数据库名

Dbf ( [N] )

返回当前或指定工作区中打开的数据表名

(附录 II 续表) 函

Deleted( )

删除记录测试函数

Diskspace( )

检测磁盘空间

Dmy(<D|T>)

返回用英文表示的日月年

Dow(<D|T>)

返回用数值表示的星期几

Dtoc(<D>)

将日期型数据转为字符型数据

Dtor(<N>)

返回给定的角度值对应的弧度值

Dtos(<D>)

将给定的日期值转换成 yyyymmdd 格式的字符串

Eof( )

文件尾测试函数

Evalvate(<C>)

计算表达式函数

Exp(<N>)

求 eN

Fcount ( [N] )

返回当前或指定工作区中打开的数据表的字段个数

Field ( N1 [, N2 ] )

返回当前或指定工作区中打开的数据表中 N1 位置的字段名

File(‘Filename’)

文件存在测试函数

Floor(<D>)

返回大于或等于给定值的最小整数

Found( )

查找成功测试函数

Fsize (<C> [, N ] )

返回当前或指定工作区中打开的数据表中<C>字段的宽度

Hour(<T>)

以 24 小时制返回给定值的小数部分

Iif(<L>,<Exp1>,<Exp2>)

当<L>的值为.T.时,返回<Exp1>的值,否则返回<Exp2>的值

Inkey ( [ N ] [, <C>])

检测按键并返回其所对应的数值

Int(<N>)

取<N>的整数值

Isalpha(<C> )

检测<C>的首字符是否是字母

Islower (<C> )

检测<C>的首字符是否是小写字母

Isupper (<C> )

检测<C>的首字符是否是大写字母

Left(<C>, <N>)

在字符串<C>中从左边取长度为<N>的子串

Len(<C>)

求字符串长度

Like(<C1>,<C2>)

比较两个字符串, 返回逻辑值

Log(<N>)

求对数值

Log10(<N>)

求常用对数值

316


Lower(<C>)

将<C>中子符转换成小写

Ltrim(<C>)

删除给定子符串左端空格

Max(X, Y)

取两个数中的最大值

Mdy(<D|T>)

返回用英文表示的月日年

Min(X, Y)

取两个数中的最小值

Minute(<T>)

返回给定值的分钟部分

(附录 II 续表) 函

Mod (< N1 >, < N2 > )

该函数的功能与算术运算中的取余运算相同

Month(<D>)

返回给定参数中的月份

Ndx (<N1> [, N2] )

返回当前或指定工作区中在<N1>位置打开的单索引文件名

Occurs(<C1>, <C2>)

返回<C1>在<C2>中出现的次数

Pcol ( )

返回打印机当前列的值

Pcol( )

取打印机当前列

Pi( )

返回圆周率的值

Prow ( )

返回打印机当前行的值

Prow( )

取打印机当前行

Rand([<N>])

随机函数

Reccount ( [N] )

返回当前或指定工作区中打开的数据表中记录的个数

Recno( )

返回当前记录的记录号

Recsize ( [N] )

返回当前或指定工作区中打开的数据表中记录的长度值

Replicate(<C>, <N>)

将<C>值重复<N>次生成一个字符串

Right(<C>, <N>)

在字符串<C>中从右边取长度为<N>的子串

Round(N1, [<N2>])

对<N1>四舍五入取<N2>位

Row( )

取光标当前行

Rtod(<N>)

返回给定的弧度值对应的角度值

Sec(<T>)

返回给定日期时间的秒数部分

Seconds(<T>)

返回给定日期时间的秒数部分

Select([1])

无可选项返回当前工作区号, 有可选项返回未使用的最大工作区号

Sin(<N>)

返回正弦值

Sing(<N>)

返回<N>相应的数据和符号

Space(<N>)

返回<N>个的空格字符串

Sqrt(<N>)

求平方根

317


Str(<N1>[,<N2>,<N3>])

将数值转换为字符

Strtran(<C1>,<C2>,<C3>[,<N1>] [,<N2>])

在<C1>的值中查找到与<C2>的值匹配的字符串后,用<C3>的值替换它 们。可选项中的<N1>用于确定开始替换的起始位置,<N2>为替换次数

Stuff(<C1>,<N1>,<N2>,<C2>)

字符串替换

Substr(<C>,<N1>,<N2>)

在字符串<C>中,取从<N1>开始长度为<N2>的子串

Sys( 5 )

返回当前默认的工作目录

Tan(<D>)

返回正切值

Time( )

返当前系统时间

Trim(<C>)

删除字符串右端空格

(附录 II 续表) 函

Ttoc(<T>,[<1>])

将日期时间数据转换为字符串

Type(<C>)

测试数据类型函数

Upper(<C>)

将< C >中的字符转换成大写

Val(<C>)

将< C >中的数字字符转换为数值

Week(<D | T>)

返回值表示给定日期所在的星期是一年中的第几个星期

Year(<D | T >)

返回给定日期的年份

附录 III 扩展名

Visual Foxpro 8.0 常用文件类型及其扩展名

文件类型

扩展名

文件类型

扩展名

文件类型

.act

向导操作图文件

.fpt

数据表备注文件

.ocx

ActiveX 控件文件

.app

应用程序文件

.frt

报表备注文件

.pjt

项目备注文件

.bak

备份文件

.frx

报表文件

.pjx

项目文件

.cdx

复合索引文件

.fxp

编译后的程序文件

.prg

程序文件

.chm

编译后的帮助文件

头文件

.qpr

查询程序文件

.dbc

数据库文件

.hlp

帮助文件

.qpx

编译后的查询程序文件

.dbf

数据表文件

.htm

HTML 超文本文件

.sct

表单备注文件

.dbg

调试器配置文件

.idx

单索引, 压缩索引文件

.scx

表单文件

.dct

数据库备注文件

.lbt

标签备注文件

.spr

屏幕程序文件

.dcx

数据库索引文件

.lbx

标签文件

.spx

编译后的屏幕程序文件

.h

318


.dll

Windows 动态链接库

.log

日志文件

.tbk

备注备份文件

.err

编译程序错误文件

.lst

向导列表文件

.tmp

暂存文件

.esl

VFP 支持的库文件

.mem

内存变量文件

.txt

文本文件

.exe

可执行程序

.mnt

菜单备注文件

.vct

可视类库备注文件

.fky

宏指令存储文件

.mnx

菜单文件

.vcx

可视类库文件

.fll

FoxPro 动态链接库

.mpr

菜单程序文件

.vue

视图文件

.fmt

格式文件

.mpx

编译后的菜单程序文件

.win

窗口文件

附录 IV Visual FoxPro 8.0 的基类 基类名称

基类名称

基类名称

ActiveDoc

活动文档

FormSet

表单集

OptionGroup

选项按钮组

CheckBox

复选框

Grid

表格

Page

Column

表格列

Header

列标头

PageFrame

页框

ComboBox

组合框

HyperLink

超级链接

ProjectHook

项目挂钩

CommandButton

命令按钮

Image

图像

Separator

分隔符

CommandGroup

命令按钮组

Label

标签

Shape

形状

Container

容器

Line

线条

Spinner

微调

Control

控件

ListBox

列表框

TextBox

文本框

Custom

定制

OleControl

Ole 容器控件

Timer

定时器

EditBox

编辑框

OleBoundControl

Ole 绑定控件

ToolBar

工具栏

Form

表单

OptionButton

选项按钮

附录 V Visual FoxPro 8.0 的对象 对象名称

Application

远程启动或操纵 Visual FoxPro 实例

Column

在表格中创建一列

319


Container

创建可以包含其他对象的容器对象

Control

创建可以包含其他受保护对象的控件对象

Cursor

创建游标对象

Custom

创建定制的、用户自定义的对象

Data Environment

在创建表单、表单集或者报表时,创建数据环境对象

Form

创建表单

Form Set

创建表单集

Header

为网格中的列创建一个标题对象

Objects Collection

确定 Application

Page

在页框中创建一页

Relation

在建立表单、表单集或者报表数据环境时,建立表间关联

Separator

创建在工具栏的控件之间插入空格字符的 Separator 对象

This

在事件代码或类定义中提供当前对象的引用

Thisform

在表单事件代码或类定义中提供当前表单的引用

(附录 V 续表) 函

Thisformset

在事件代码或类定义中提供当前表单集的引用

Tool Bar

创建一个工具栏

附录 VI

Visual FoxPro 8.0 的对象属性

属性名称

Activecolumn

返回 Grid 控件中包含活动单元的列

Activecontrol

引用对象中的活动控件

Activeform

引用表单集中的活动 Form 对象或-SCREEN 对象

Activepage

返回 Page Frame 对象中活动 Page 号

ActiveRow

指定 Gird 控件中包含活动单元的行

Alias

指定与 Cursor 对象相关的每个表格或者视图的别名

Align

指定表单中 ActiveX 控件对齐方式

Alignment

指定与控件有关的文本对齐方式

AllowAddNew

指定是否从网格中添加新记录到表中

AllowHeaderSizing

指定网格标头的高度是否可以在运行时更改

320


AllowRowSizing

指定网格中记录的高度是否可以在运行时更改

AllowTabs

指定 Edit Box 控件中是否允许使用制表符

AlwaysOnTop

防止其他窗口覆盖表单窗口

Application

引用 Application 对象

AutoActivate

确定 OLE Container 控件如何才能被激活

AutoCenter

确定第一次显示表单对象时是否将空表单对象自动居中

AutoCloseTables

释放表单集、表单或报表时,是否关闭数据表或视图

AutoOpenTables

与表单集、表单数据环境有关的表和视图是否自动装载

AutoRelease

当表单集中最后一个表单释放时,是否释放表单集

AutoSize

确定控件是否根据内容自动改变大小

AutoVerbMenu

指定鼠标右键单击 OLE 对象时,是否显示 OEL 对象快捷菜单

AutoYield

指定在程序代码的每行执行之间,Visral FoxPro 的一个实例是否处理待处理的 Windows 事件

BackColor\ForeColor

指定对象中显示文本和图形时的背景\前景颜色

Backstyle

确定对象的背景是透明的还是不透明的

BaseClass

指定被引用对象的 Visual FoxPro 基类名

BorderColor

指定对象的边界颜色

(附录 VI 续表) 属性名称

BorderStyle

指定对象的边界风格

BorderWidth

指定控件边界的宽度

Bound

确定 Column 对象中的控件是否被绑定到 Column 的控件源中

BoundColumn

确定多列列表框或组合框中哪一列绑定为控件的 Value 属性

BoundTo

列表或组合框的 Value 属性是否由 List、 ListIndex 属性确定

BufferModeOverride

在表单或者表单集中是否可以覆盖 BufferMode 属性确定

ButtonCount

指定 Command Group 或 Option Group 中的按钮数

Buttons

用于访问按钮组中的按钮

Cancel

CommandButton 或 OLEContainer 控件是否是为 Cancel 按钮。如果是,则键入 Esc 键时将发生 Cancel 按钮的 Click 事件

Caption

指定显示在对象提要中的文本内容

Century

指定是否在文本框中显示日期的纪元部分

ChildAlias

指定子表的别名

ChildOrder

为 Grid 控件的记录源或 Relation 对象指定索引标记

Class

返回对象的基类名

321


ClassLibrary

指定包含对象类的用户自定义类库的文件名

ClipControls

确定 Paint 事件中的图形方法是否重新绘制整个对象或者只绘制新的被暴露 (exposed)区域。此外,这个属性还用于确定图形操作环境是否创建排斥对象 所包含非图形控件的裁剪区域

Closable

是否通过双击控件菜单框或者从菜单选择 Close 来关闭表单

ColorScheme

指定控件中所使用的调色盘类型

ColorSource

确定如何设置控件的颜色

ColumnCount

指定 Grid、Combo Box 和 List Box 控件中 Column 对象的数目

ColumnLines

显示或隐藏列之间的行

ColumnOrder

指定 Grid 控件中 Column 对象之间的相对顺序

Columns

是否通过列号来访问每个 Column 对象的数组

ColumnWidths

指定 Combo Box 和 List Box 控件中的列宽度

Comment

保存与对象有关的信息

ControlBox

确定在运行时是否在表单的左上角显示控制菜单框

ControlCount

指定容器(Container)对象中的控件数

Controls

访问容器(Container)对象中的控件

ControlSource

确定绑定对象的数据源

CurrentControl

指定包含在 Column 对象中用于显示活动单元值的控件

CurrentX

为下一个绘制方法指定水平(X)方向的坐标

CurrentY

为下一个绘制方法指定垂直(Y)方向的坐标

(附录 VI 续表) 属性名称

CursorSource

指定与 Cursor 对象有关的表或视图的名称

Curvature

指定 Shape 控件的拐角曲率

Database

指定路径所包含与 Cursor 对象有关的表或视图的数据库

DataSession

指定表单、表单集或工具栏是否可以在数据会话期间运行,及是否有独自的数据 环境 返 回 标识 表单、 表 单集 或 工 具 栏 的 私 有 数 据 会 话 的 数 据 会 话 标 识 符 。 当 DataSession 属性为 1,则返回缺省的数据对话标识符

DataSessionID DateFormat

指定显示在文本框中的 Date 和 DateTime 型数据值的格式

DateMark

指定显示在文本框中的 Date 和 DateTime 型数据值的定界符

Default

指定缺省的命令按钮或 OLE Container 控件

DefaultFilePath

指定由 Application 对象使用的缺省驱动器和目录

DefOLECID

指定表单或 Visual Foxpro 主窗口的缺省 OLE Local ID 值

DeleteMark

确定删除标志列是否在 Grid 控件中显示

322


Desktop

Form 是否出现在 Windows 桌面或 Visual FoxPro 主窗口中

DisabledBackColor

指定不可用控件的背景

DisabledForeColor

指定不可用控件的前景颜色

DisabledItemBackColor

为 Combo Box 和 List Box 中不可用项指定背景颜色

DisabledItemForeColor

为 Combo Box 和 List Box 中不可用项指定前景颜色

DisabledPicture

当控件不可用时,该属性用于确定是否显示图形

DisplayValue

确定 List Box 或 Combo Box 控件中所选择项的第一列的内容

Docked

指定用户自定义的 Tool Bar 对象是否为船坞的(Docked)

DockPosition

指定用户自定义 Tool Bar 对象的船坞位置

DocumentFile

返回被链接对象的文件名

DownPicture

确定当选择控件时是否显示图形

DragIcon

确定拖放操作期间图标是否显示为指针形

DragMode

为拖放操作确定手动或自动方式

DrawMode

与颜色属性一起确定 Shape 和 Line 对象在屏幕上的显示方式

DrawStyle

确定当用图形方式绘制图形时所使用的线型

DrawWidth

确定图形方法中进行输出时的线宽度

DynamicAlignment

确定 Column 对象中文本和控件的对齐方式

DynamicBackColor

确定 Column 对象的背景颜色

DynamicCurrentControl

确定 Column 对象中所包含的哪个控件用于显示活动单元的值

DynamicForeColor

指定 Column 对象的前景颜色

DynamicFontBold

确定是否将 Column 对象中的文本显示为粗体(Bold)

DynamicFontItalic

是否将 Column 对象中的文本显示为斜体(Italic)

(附录 VI 续表) 属性名称

DynamicFontName

确定显示文本时所使用字体的名称

DynamicFontOutline

确定与 Column 对象有关的文本是否带轮廓

DynamicFontShadow

确定与 Column 对象有关的文本是否为有阴影

DynamicFontSize

确定 Column 对象中文本显示的字体大小

DynamicFontStrikeThru

是否将 Column 对象中的文本显示为删除线(StrikeThru)

DynamicFontUnderline

是否将 Column 对象中的文本显示为下划线(underline)

DynamicInputMask

确定如何在 Column 对象中显示和输入数据

Enabled

确定对象是否响应用户产生的事件

Exclusive

确定与 Cursor 对象有关的表是否按互斥方式打开

323


Fillcolor

指定用于填充图形的颜色,图形通过图形例程绘制好轮廓

Fillstyle

指定形状以及用 Circle 与 Box 图形方法创建的图形填充模式

Filter

排除不满足指定表达式条件的记录

FirstElement

指定数组中第一个显示在 ComboBox 或 ListBox 控件中的元素

FontBold

指定文本是否采用一种粗体或多种风格

FontColor

指定文本的颜色

FontItalic

指定文本是否采用一种斜体或多种风格

FontStrikeThru

指定文本是否采用一种删除线或多种风格

FontUnderline

指定文本是否采用一种下划线多种风格

FontCondense

指定文本是否具有压缩(condense)风格

FontExtend

指定文本是否具有扩展(extend)风格

FontName

确定文本显示时所使用的字体名

FontOutline

确定控件所支持的文本是否有轮廓

FontShadow

确定控件中的文本是否有阴影

FontSize

确定本显示时的字体大小

Format

指定控件中 Value 属性的输入和输出格式

FormCount

确定表单集中的表单数

Forms

访问表单集中每个表单的数组

FullName

确定 VisualFoxPro 实例的目录和文件名

GridLineColor

指定 Grid 控件中分隔各单元的线的颜色

GridLines

确定 Grid 控件中是否显示水平和垂直线

GridLineWidth

确定 Grid 控件中分隔各单元的线宽度(像素)

HalfHeightCaption

确定表单提要是否为正常高度的一半

HeaderHeight

确定 Grid 控件中列标头的高度

Height

确定屏幕上对象的垂直方向高度

(附录 VI 续表) 属性名称

HelpContextID

确定在帮助文件中为某个对象提供上下文帮助信息

HideSelection

控件失去焦点时,该属性指定选中的文本是否出现选择标记

Highlight

确定 Grid 控件中具有焦点(focus)的单元是否出现选择标记

HighlightRow

确定 Grid 控件中当前行和单元是否高亮显示(Highlight)

Hours

指定 Date Time 型数值,按 12 还是 24 小时时间格式显示

HostName

返回或设置 Visual FoxPro 应用程序的宿主名

324


Icon

指定表单最小化时显示的图标

Increment

确定单击 Spinner 控件的上箭头或下箭头时,递增的步长

IncrementalSearch

确定键盘操纵时,控件是否支持增量式搜索

InitialSelectedAlias

装载数据环境时,把与 Cursor 对象有关的别名作为当前别名

InputMask

确定如何在控件中输入和显示数据

IntegralHeight

指定 EditBox、ListBox、TextBox 控件高度是否能自动调整

Interval

指定调用 Timer 控件的 Timer 事件之间的毫秒数

IMEMode

指定单个控件的 IME(InputMethodEditor)窗口设置

ItemBackColor

指定 ComboBox 和 ListBox 控件中显示项的背景颜色

ItemForeColor

指定 ComboBox 和 ListBox 控件中显示项的前景颜色

ItemData

使用索引来引用一维数组

ItemIDData

用唯一的标识编号来引用一维数组

ItemTips

指定是否显示组合框或列表框中的提示信息

KeyboardHighValue

指定用键盘可以输入 Spinner 控件中的最大值

KeyboardLowValue

指定用键盘可以输入 Spinner 控件中的最小值

KeyPreview

确定表单的 KeyPress 事件是否优先于控件的 KeyPress 事件

Left

确定控件或表单左边界与其容器对象左边界之间的距离

LeftColumn

确定 Grid 控件中显示在最左边列的列号

LineSlant

指定线条的倾斜方式,从左上角到右下角或者从左下角到右上角

LinkMaster

指定与 Grid 控件中显示的子表链接的父表

List

字符串数组用于存取 ComboBox 或 ListBox 控件中的项

ListCount

确定 ComboBox 或 ListBox 控件的列表部分的项数

ListIndex

确定 ComboBox 或 ListBox 控件中所选中项的索引号

ListItem

字符串数组,通过项标识存取 ComboBox 或 ListBox 控件中的项

ListItemID

为 ComboBox 或 ListBox 控件中所选择的选项,指定唯一的标识号

LockScreen

确定表单是否批处理所包含对象的所有属性值的变化

Margin

指定控件文本部分创建的页边宽度

MaxButton

指定表单是否具有最大化按钮

(附录 VI 续表) 属性名称

MaxHeight

指定可改变大小的表单的最大高度

Maxleft

指定表单与 Visual FoxPro 主窗口左边界之间的最大距离

Maxlength

指定 EditBox 或 TextBox 中可以输入字符的最大长度

325


MaxTop

指定表单与 Visual FoxPro 主窗口上边界的最大距离

MaxWidth

指定可改变大小的表单的最大宽度

MDIForm

指定表单是否为 MDI 界面

MemoWindow

当 TextBox 控件的数据源是备注字段时, 确定所使用的用户自定义窗口名称

MinButton

指定窗体是否具有最小化按钮

MinHeight

指定可变大小的表单的最小高度

MinWidth

指定可变大小的表单的最小宽度

MouseIcon

指定当鼠标指针位于某一对象上时要显示的鼠标指针图标

MousePointer

鼠标置于对象的某一特定部分时,指定鼠标指针的形状

Movable

指定对象在运行时是否可移动

MoverBars

指定 ListBox 控件是否显示移动条

MultiSelect

指定用户是否可以在 ListBox 控件中进行多重选择以及如何进行多重选择

Name

指定在程序代码中用于引用对象的名称

NewIndex

确定最近添加到 ComboBox 或 ListBox 控件中的项的索引号

NewItemID

确定最近添加到 ComboBox 或 ListBox 控件中的项的标识号

NoDataOnLoad

将导致与 Cursor 对象有关的视图在没有下载数据时就被激活

NullDisplay

指定显示为空值(null)文本

NumberOfElements

指定数组中有多少个项用于填充 ComboBox 或 ListBox 控件的列表部分

Object

访问 OLE 服务器(server)的属性和方法

OLEClass

返回 OLE 对象的类标识号

OLELCID

指示 OLEBound 或 OLEContainer 控件的 LocalID 的数值型数值

OLERequestPendingTimeout

用于指定自动化请求之后显示忙消息之前要消耗多少毫秒

OLEServerBusyRaiseError

用于指定当自动化请求被拒绝时是否发出错误消息

OLEServerBusyTimeout

指定当前服务器忙时自动化请求要重试多长时间

OLETypeAllowed

返回包含在控件中的 OLE 对象的类型

OneToMany

在父表中移动记录指针时,指定记录指针是否保持在同一父记录上,直到子表 中的记录指针移动通过所有的关联记录为止

OpenViews

确定要自动打开与表单集、表单或报表数据环境有关视图类型

OpenWindow

当局限于备注字段的 TextBox 控件接收到焦点时,确定是否自动打开窗口

Order

为 Cursor 对象指定控制索引标记

PageCount

确定页框(PageFrame)中所包含页的数量

(附录 VI 续表) 属性名称

326


PageHeight

指定页的高度

PageOrder

指定页框(PageFrame)中页之间的相对顺序

Pages

用于访问页框中某一页的数组

PageWidth

指定页的宽度

Panel

确定 Grid 控件中的活动面板(panel)

PanelLink

确定 Grid 控件的左面板和右面板是否链接

Parent

引用控件的容器对象

ParentAlias

确定父表的别名

ParentClass

返回对象类的父类名

Partition

确定是否将 Grid 控件分割成两个面板,并指定分割相对于 Grid 控件左边界的位置

PasswordChar

确定是否在 TextBox 控件显示用户键入的字符或占位符(placeholder character),并 确定所用的字符为占位符

Picture

确定显示在控件中的位图文件(.bmp)或图标文件(.ico)

ReadCycle

确定焦点移出表单集的最后一个对象时,是否移到表单集的第一个对象中

ReadLock

确定表单集中任意一个表单所引用的全部记录是否被锁定

ReadMouse

确定是否可以用鼠标在表单集的表单中的控件之间进行移动

ReadObject

确定激活表单集时具有焦点(focus)的对象

ReadOnly

指定能否编辑控件或能否更改与 Cursor 对象有关的表或视图

ReadSave

确定 READ 命令能否用于激活对象

ReadTimeout

确定在没有用户输入时,表单集将保持活动状态的时间

RecordMark

确定 Grid 控件中是否显示记录选择标记列

RecordSource

确定 Grid 控件绑定的数据源

RecordSourceType

确定如何打开 Grid 控件的数据源

RelationalExpr

是一个关联表达式,通过在父表字段与子表中的索引建立关联关系来连接这两个表

RelativeColumn

确定 Grid 控件中可视部分的活动列

RelativeRow

确定 Grid 控件中可视部分的活动行

ReleaseType

返回用于确定如何释放 Form 对象的整数值

Resizable

运行时,确定 Column 对象是否可以由用户改变大小

RowHeight

确定 Grid 控件的行高度

RowSource

确定 ComboBox 或 ListBox 控件中值的数据源

RowSourceType

确定控件中数据源的类型

ScaleMode

当使用图形方法或定位控件时,指定对象坐标的计量单位

ScrollBars

确定控件的滚动条类型

Seconds

确定是否在文本框中显示 DateTime 型数值的秒部分

327


(附录 VI 续表) 属性名称

Selected

确定列表框或组合框中的某一项是否被选择

SelectedBackColor

确定被选中文本的背景颜色

SelectedForeColor

确定被选中文本的前景颜色

SelectedID

确定组合框或列表框中的某一项是否被选择

SelectedItemBackColor

确定组合框或列表框中被选择项的背景颜色

SelectedItemForeColor

确定组合框或列表框中被选择项的前景颜色

SelectOnEntry

当移动到列单元、编辑框或文本框中的文本时,确定是否选择该文本

SelLength

返回用户在控件的文本输入区中选择的字符数,或者指定选择的字符数

SelStart

返回用户在控件文本输入区中所选择文本的起始位置,或指定文本插入点位置

SelText

返回用户在控件的文本输入区中所选择的文本内容,或空串

ShowTips

确定是否显示 Form 对象或 ToolBar 对象中指定控件工具提示

ShowWindow

确定表单或工具栏是否为顶层表单或子表单

Sizable

确定对象是否可以改变大小

SizeBox

确定表单是否有大小框

Sorted

确定 ComboBox 或 ListBox 控件中列表部分的项是否自动按字母顺序排列

Sparse

确定 CurrentControl 属性是影响 Column 对象中的所有单元还是只影响活动单元

SpinnerHighValue

确定单击鼠标上下箭头键,可以输入到 Spinner 控件的最大值

SpinnerLowValue

确定单击鼠标上下箭头键,可以输入到 Spinner 控件的最小值

SpiltBar

确定是否在 Grid 控件中显示分割条

StartMode

包含指示 Visual FoxPro 如何启动数值型数值

StatusBar

指定在 Visual FoxPro 状态栏中显示的文本

StatusBarText

指定控件获得焦点(focus)时,在状态栏中显示的文本内容

Stretch

确定如何调整图像的大小来适应控件

StrictDateEntry

确定是否在文本框中按特定的静态格式显示 Date、DateTime 型数据

Style

确定控件的风格

TabIndex

指定页中控件的 Tab 顺序和表单集中表单的 Tab 顺序

Tabs

指定页框是否有标记(Tab)

Tabstop

确定用户是否可以用 Tab 键把焦点(focus)移动到对象中

TabStretch

指定当标记不适合于页框时要采取的动作

Tag

存储程序中需要的任何额外数据

328


TerminateRead

单击控件时,确定表单或表单集是否失去活动性

Text

包含输入到控件文本框部分的未格式化文本

TitleBar

关闭滚动条

ToolTipText

为控件的工具提示(ToolTip)指定文本内容

(附录 VI 续表) 属性名称

Top

确定对象上边界与其容器对象上边界之间的距离

TopIndex

确定列表中出现在最顶端的项

TopItemID

确定列表中出现在最顶端的项的标识号

Value

确定控件的当前状态

Version

按字符串返回 Visual FoxPro 的版本号

View

确定 Grid 控件的视图类型

Visible

确定对象是可见的还是隐藏的

WhatsThisButton

确定 What’s This 按钮是否出现在表单标题栏中

WhatsThisHelp

确定上下文敏感帮助是否使用 WhatsThisHelp 技术来打开 SetHelp 指定的帮助文 件

Width

Width 属性用于确定对象的宽度

WindowList

确定可以参与当前表单的 Read 处理的一组表单

WindowState

在运行时,确定表单窗口的可视状态(如最大化、最小化等)

WindowType

显示或用 Do 命令运行表单集或表单时,确定其类型

WordWrap

当控件调整大小时,确定 Label 控件是否进行垂直或水平扩充

ZoomBox

确定表单是否有缩放框

附录 VII 事件名称

Visual FoxPro 8.0 的对象事件 功

Activate

当 FormSet、Form 或 Page 对象变成活动的或 ToolBar 对象显示时, 发生 Activate 事件

AfterCloseTables

表单、表单集或报表的数据环境中指定的表或视图释放时, 产生 AfterCloseTables 事件

AfterDock

当 ToolBar 对象被船坞化(docked)后,将产生 AfterDock 事件

AfterRowColChange

当用户移到 Grid 控件中的另一行或列时,新单元获得焦点(focus)且新行或列中对象的 When 事件发生后,将发生 AfterRowColChange 事件。除非新行或列中对象的 When 事件返回真,否则 AfterRowCoChange 事件不会触发

329


BeforeDock

在 ToolBar 对象被船坞化(docked)之前,将发生 BeforeDock 事件

BeforeOpenTables

当与表单、表单集或报表的数据环境有关的表和视图刚打开之前,将发生 BeforeOpenTables 事件 在 用 户 改 变 活 动 行 或 者 列 时 , 新 单 元 获 得 焦 点 (focus) 之 前 , 将 发 生 BeforeRowColChange 事件;此外,网格列中当前对象的 Valid 事件发生之前,也将发 生 BeforeRowColChange 事件 鼠标指针指向控件时,如果用户按下并释放鼠标左键,或者改变某个控件的值,或者 单击表单的空白区域时发生 Click 事件;在程序中包含触发该事件的代码时也可发生 Click 事件

BeforeRowColChange

Click

(附录 VII 续表) 事件名称 DblClick Deactivate Deleted

短时间内用户连续按下并释放两次鼠标左键(双击),则产生 DblClick 事件;选择列表 框或组合框中的项并按回车键,也将发生该事件 当容器对象(如表单等)由于所包含的对象没有一个有焦点(Focus)而不再活动时,将 产生 Deactivate 事件 当用户给某一记录作删除标记、取消为删除而作的标记或者发出 Delete 命令时,将产 生 Deleted 事件

Destroy

释放对象时将产生 Destroy 事件

Docmd

执行 Visual FoxPro 自动化服务器的一条 Visual FoxPro 命令时,将触发 DoCmd 事件

DownClick

单击控件的下箭头时,将产生 DownClick 事件

DragDrop

当拖放操作完成时,将产生 DragDrop 事件

DragOver

当控件被拖到目标对象上时,将产生 DragOver 事件

DropDown

单击下拉箭头后,ComboBox 控件的列表部分即将下拉时,将产生 DropDown 事件

Error

当方法中有一个运行错误时将产生 Error 事件

ErrorMessage

当 Valid 事件返回假时将发生 ErrorMessage 事件,并提供错误信息

GotFocus

无论是用户动作或通过程序使对象接收到焦点(Focus),都将产生 GotFocus 事件

Init

当创建对象时将产生 Init 事件

InteractiveChange

使用键盘或鼠标改变控件的值时,将发生 Interactive 事件

KeyPress

当用户按下并释放一个键时,将产生 KeyPress 事件

Load

在创建对象之前产生 Load 事件

LostFocus

当对象失去焦点(Focus)时将发生 LostFocus 事件

Message

Message 事件将在屏幕底部的状态栏中显示信息

MiddleClick

当用户用中间的鼠标键单击控件时,将发生 MiddleClick 事件

MouseDown

当用户按下鼠标键时,将发生 MouseDown 事件

MouseMove

当用户移动鼠标到对象上时,将发生 MouseMove 事件

MouseUp

当用户释放鼠标键时,将发生 MouseUp 事件

MouseWheel

对于有鼠标球的鼠标,当用户旋转鼠标球时,将发生 MouseWheel 事件

330


Moved

当对象移到新的位置或者在程序代码中改变容器对象的 Top 或 Left 属性设置值时,将 产生 Moved 事件

Paint

当重新绘制表单或工具栏时,将发生 Paint 事件

ProgrammaticChange

程序代码中改变控件的值时,将产生 ProgrammaticChange 事件

QueryUnload

表单卸载(Unload)之前,将发生 QueryUnload 事件

RangeHigh

当控件失去焦点(focus)时,对于 Spinner 或 TextBox 控件将发生 RangeHight 事件;当 控件接收焦点时,对于 ComboBox 或 ListBox 控件将发生 RangeHigh 事件 当控件接收焦点(focus)时,对于 Spinner 或 TextBox 控件将发生 RangeHight 事件;当 控件失去焦点时,对于 ComboBox 或 ListBox 控件将发生 RangeHigh 事件 当表单集中的表单变为活动表单时,将发生 ReadActivate 事件。支持对 READ 的向下 兼容

RangeLow ReadActivate

(附录 VII 续表) 事件名称

ReadDeactivate

当表单集中的表单失去活动性时,将产生 ReadDeactivate 事件

ReadShow

当在活动表单集中键入 SHOW GETS 命令时,将发生 ReadShow 事件

ReadValid

当表单集失去活动性时,将立刻发生 ReadValid 事件

ReadWhen

在加载表单集后,将产生 ReadWhen 事件

Resize

当对象重新确定大小时,将发生 Resize 事件

RightClick

当用户在控件中按下并释放鼠标右键时,将产生 RightClick 事件

Scrolled

在 Grid 控件中,当用户单击水平或垂直滚动框时,将产生 Scrolled 事件

Timer

当消耗完 Interval 属性指定的时间(毫秒)时,将发生 Timer 事件

UIEnable

无论何时只要页激活或失去活动性,对于所有页中包含的对象都将发生 UIEnable 事件

UnDock

当 ToolBar 对象从船坞位置拖离时,将产生 UnDock 事件

Unload

释放对象时,将发生 Unload 事件

UpClick

当用户单击控件的上箭头时,将发生 UnClick 事件

Valid

在控件失去焦点(focus)之前,将发生 Valid 事件

When

在控件接收到焦点(focus)之前,将发生 When 事件

附录 VIII

Visual FoxPro 8.0 的对象方法

方法名称

ActivateCell

激活 Grid 控件的某一单元

AddColumn

添加 Column 对象到 Grid 控件中

331


AddItem

添加新项到 Combo Box 或 List Box 控件中

AddListItem

添加新项到 Combo Box 或 List Box 控件中,并指定新项的 ID 值

AddObject

在运行时添加对象到容器对象中

Box

在表单中画一个矩形

Circle

在表单中绘制圆或椭圆形

Clear

清除 Combo Box 或 List Box 控件的内容

CloneObject

复制对象,包括对象的所有属性、事件和方法

CloseTables

关闭与数据环境有关的表和视图

Cls

清除表单中的图形和文本

DataToClip

将记录集作为文本拷贝到剪贴板中

DeleteColumn

从 Grid 控件中删除 Column 对象

DoScroll

滚动 Grid 控件

(附录 VIII 续表) 方法名称

DoVerb

执行指定对象上的动词(Verb)

Drag

开始、结束或中断一次拖放操作

Draw

重新绘制表单

Eval

计算表达式并将结果返回给 Visual FoxPro 自动化服务器

Help

打开帮助窗口

Hide

通过设置 Visible 属性为假来隐藏表单、表单集或工具栏

IndexToItemID

返回给定项索引号的标识号

ItemIDToIndex

返回给定项标识号的索引号

Line

在表单中绘制线条

Move

移动对象

Point

返回表单中指定的红绿蓝(RGB)颜色

Print

在表单中打印字符串

Pset

将表单或 Visual FoxPro 主窗口中的点设置为前景色

Quit

结束 Visual FoxPro

ReadExpression

返回属性窗口中输入的属性表达式的值

ReadMethod

返回指定方法的文本

Refresh

重新绘制表单或控件,并刷新所有值

Release

从内存中释放表单集或表单

RemoveItem

从 Combo Box 或 List Box 控件中删除一项

332


RemoveListItem

从 Combo Box 或 List Box 控件中删除一项

RemoveObject

从容器对象中删除指定的对象

Requery

重新查询 List Box 或 Combo Box 控件的数据源

RequestData

在 Visual FoxPro 实例中,创建包含所打开表数据的数组

Reset

重新设置 Timer 控件,以便从 0 开始计数

SaveAs

将对象保存为.SCX 文件

SaveAsClass

将对象的实例作为类定义保存到类库中

SetAll

为容器对象中的所有控件或者某个控件类赋予属性设置值

SetFocus

给控件设置焦点

SetVal

为 Visral FoxPro 自动化服务器的实例创建变量并给变量储值

Show

显示表单并确定该表单是模态的还是非模态的

ShowWhatsThis

显示由对象的 What’s This Help 属性指定的帮助主题

TextHeight

返回文本串按当前字体显示时的高度

TextWidth

返回文本串按当前字体显示时的宽度

WhatsThisMode

显示 What’s This Help 问号标记

(附录 VIII 续表) 方法名称

WriteExpression

将表达式写到属性中

WriteMethod

将指定的文本写入指定的方法中

Zorder

在 Z-Order 图形层中将指定表单或控件放置到 Z-Order 的前面或后面

333


参 考 文 献 1.《数据库系统概论》(第三版) 萨师煊 2.《Visual FoxPro 8.0 实用教程》 3.《Visual FoxPro 程序设计教程》

李明

王珊 北京

顾振山

刘卫国

北京

匡松

6.《Visual FoxPro 程序设计教程》

刘瑞新

康萍

北京 王利

谢川 北京

9. 《Visual FoxPro 数据库应用》

2006 年

清华大学出版社

经济科学出版社

7.《二级教程-Visual FoxPro 程序设计》 8.《Visual FoxPro 程序设计》

清华大学出版社

何福良

北京 5.《Visual FoxPro 程序设计教程》 程玮

2000 年

北京邮电大学出版社 2005 年

北京

4.《Visual FoxPro 面向对象程序设计及应用》

高等教育出版社

2007 年

2003 年

机械工业出版社 2002 年 北京

高等教育出版社

机械工业出版社

刘小东 北京

2002 年

清华大学出版社

10.《Visual FoxPro 应用基础与面向对象程序设计教程》(第二版) 北京

2001 年 2007 年

李雁翎

高等教育出版社

2002 年

334

Visual FoxPro 數據庫管理系統教程  

Visual FoxPro 數據庫管理系統教程

Visual FoxPro 數據庫管理系統教程  

Visual FoxPro 數據庫管理系統教程

Advertisement