You are on page 1of 348

计算机基础教育丛书

FoxP ro 及 其 应 用 系 统 开 发

史济民   汤观全   邵存蓓   罗钟鸣

清 华 大 学 出 版 社
( 京 ) 新登字 158 号

内 容 简 介
+
    本书是谭浩强教授最新主编的《计算机基础教育丛 书》中 的一本 , 是 电视教材《FoxBASE 及其应 用
系统开发》一书的姐妹篇。全书从应用出发 , 遵循“语 言基础—程 序设计—系统 开发”三 阶段教 学法 , 全
面介绍了 FoxPro 的语言基础、窗口环境和辅助开发工具及其应用系统开发方法。
本书实例丰富 , 各章配有习题 , 适合于高校或电视教育 及培训 班用作 教材 , 也可供 计算机 应用人 员
自学或参考。

版权所有 , 翻印 必究。
本书封面 贴有清华 大学出版社 激光防伪 标签 , 无标签者不 得销售。

图书在版编目 ( CIP) 数据

Fox Pro 及其应用系统开发/ 史济民编著 . - 北京 : 清华大学出版社 , 1998


( 计算机基础教育丛书/ 谭浩强主编 )
ISBN 7-302-02883-4

Ⅰ .F…   Ⅱ .史…   Ⅲ .关系型数据库-数据库管理系统 , Foxpro   Ⅳ .TP311 .13

中国版本图书馆 CIP 数据核字 (98) 第 03595 号

出版者 : 清华大学出版社 ( 北京清华大学校内 , 邮编 100084)


h ttp :/ / www .t up .tsinghua .edu .cn
印刷者 : 北京市清华园胶印厂
发行者 : 新华书店总店北京科技发行所
开   本 : 787 ×1092 1/ 16   印张 : 22   字数 : 519 千字
版   次 : 1998 年 3 月第 1 版   1999 年 4 月第 6 次印刷
书   号 : ISBN 7-302-02883-4/ T P・1522
印   数 : 97001 ~128000
定   价 : 23 .00 元
新编《计算机基础教育丛书》
序    言

    人们正在迎接 21 世纪 , 迎接信息时 代。自 80 年 代初 掀起 第一次 全国 性计算 机普 及


高潮以来 , 90 年代又掀起了一次波澜壮阔的全国性计算机 普及高 潮。第二次 普及高潮 的
广度和深度都大大超过了第一次。现在计算机正 向一 切有 文化的 人群 普及 , 计算 机知 识
已成为当代文化的一个重要组成部分。
高等学校的计算机教育发展十分迅速。十多 年前 , 只 有部 分理工 科专 业开设 计算 机
课程 , 今天 , 几乎所有高校 的所 有 专业 ( 包括 理、工、农、林、医、财经、师范、政法、文史、体
育、艺术等类 ) 都开设了程度不同的计算 机课 程。人们 已经 认识到 , 计 算机 知识已 成为 当
代知识分子知识结构中不可缺少的重要组成部分。
通过十几年的实践 , 多数人已经就下列问题取得共识 :
1. 计算机应用人才队伍是 由两 部分 人组成 的。一部 分是 从高 校计算 机 专业 毕业 的
计算机专门人才 , 他们是计算机应用人才队伍中的骨干 ; 另一部分是各行各业中从事计算
机应用的人才 , 他们既熟悉本专业的业务 , 又掌 握计算 机应 用的技 术 , 能把 计算机 技术 用
于本专业领域 , 是复合型人才。这后一部分人 数量 巨大 , 影 响面广 , 是 计算 机应用 人才 队
伍中的基本力量。他们掌握计算机知识的情况和应用计算机的能力在相当大程度上决定
着我国在各个领域中计算机应用的水平。因此 , 必须 十分 重视 高校非 计算 机专业 的计 算
机教育。
2. 非计算机专业中的计算机教育 , 无论就目的、内容、教学体 系、教 材、教 学方法等 各
方面都与计算机专业有很大的不同 , 决不能简 单搬 用计算 机专 业的 一套 , 也不 能采 取“ 压
缩饼干”式的简单浓缩处理。应该强调以应用为目的 , 以应用为出发点。如果不注意这个
特点 , 将事倍功半。应该找到适合自己特点的教学体系、教材和教学方法。
3. 计算机基础教育的基本 模式 是层 次结构。 不同的 人在 不同 的层次 上 使用 着计 算
机 , 也就是说 , 计算机应用是分层次的。同 样 , 计算 机人 才培养 也是 分层 次的 , 不同 领域、
不同专业情况各异 , 应该区别对待 , 决不能不问实际情况一刀切。对每一个学习计算机知
识的人来说 , 也有一个由浅入深、逐步提高的过程。全国高等学校计算机基础教育研究会
十几年前提出了按层次结构来组织教学的方 案 , 受 到了 全国 高校的 赞同 , 实 践证明 , 它 是
行之有效的。
4. 计算机技术发展如此迅速 , 计算机应用如此广泛 , 需要学习的东 西愈来愈 多 , 而 学
生的总学时是有限的 , 因此必须分清主次 , 确 定每一 门课 的性质 和要 求。一般 说 , 可以 分
为两大类 : 一类是理论性较强的课程 , 一类是 侧重应 用的 课程。对 非计 算机专 业来 说 , 前
者是少数 , 后者是多数。应当考虑如何在有 限的 学时内 学到 更多 更有用 的内 容。不能 脱
离实际地对每门课都提出“学深学透”, 任 何事情都 应当 有一 个“ 度”。对于 侧重操 作的 课
・Ⅰ・
程 , 提倡“ 少讲多练”, 以自学上机为主。
我们在十年前组 织 编写 并 出版 了 一 套《计 算 机 基础 教 育 丛 书》( 清 华 大学 出 版 社 出
版 ) , 先后出版了近 20 种教材和参考读物 , 内容 切合高 校非 计算机 专业 特点 , 初步 形成 了
自己独特的风格 , 受到各校师生的欢迎 , 十年 来累 计发 行了 466 万册 ( 其中《C 程序设 计》
累计发行近 200 万册 ) , 有力地推动了我国高校的计算机基础教育。
根据近年来计算机科学技术的发展和高校计 算机 基础 教育改 革的 情况 , 我们 决定 组
织新的《计算机基础教育丛书》, 保留原来丛书中受群众欢迎的优秀书目 , 并加以必要的补
充修改 ; 同时 , 根据面 向 21 世 纪 的需 要 , 增加 计算 机 公共 基础、QBasic 程 序设 计、网 络 应
用基础、多媒体应用基础、微型计算机原理及应用等新的教材。
本丛书是针对广大非计算机专业的需要和特点来组织编写的 , 注意从实际出发 , 力求
用读者容易理解的体系和叙述方法 , 深入浅出 , 循序渐进地帮助读者更好地掌握课程的基
本内容。丛书遵循的方针是 “
: 内容新颖、实用性 强、概念 清晰、通 俗易懂、层 次配 套”。 丛
书中既包括一些必选课教材 , 也包括一些任选课教材 , 供各校选用。
本丛书从 1998 年起陆续以新的面貌问 世。希望 对我 国高 校计算 机基 础教育 继续 作
出贡献。
本丛书的对象是高校非计算机专业师生、计算机 培训 班师 生以及 广大 计算机 应用 人
员 , 部分中专也可选用。

《计算机基础教育丛书》主编              
全国高等学校计算机基础教育研究会理事长
谭浩强
1998 .1

・Ⅱ・
前    言

    本 书 是 编 者 根 据 近 年 讲 授 Fox Pro 课 的 经 验 编 写 的 教 材 , 是 三 年 前 出 版 的
+
《FoxBASE 及其应用系统开发》的姐妹篇。
+
1994 年 , 我们为谭浩强教授主编的“计算机基础教育丛书”编写了《FoxBASE 及其应
用系统开发》一书。该教材由于遵循“ 语言基础—程序设计—系统开发”的三段教学法 , 被
许多学校用作教材 , 迄今已发行近 45 万册。本书 继承 了前 一本书 的结 构和风 格 , 增加 了
关于环境与工具 的 介绍 , 内 容 扩 充而 篇 幅 不 增。希 望 它 对 数据 库 教 学 尤 其是 学 习 开 发
Fox Pro 应用系统的读者发挥良好的作用。
Fox Pro 引入我国后 , 出版的书已经不少 ; 其升 级产 品 Visual Fox Pro 也已 问世。为 什
么现在还写 FoxP ro, 不直接写 Visual FoxPro 呢 ?
一、FoxBASE 是基于 DOS 的。 Fox Pro for Windows 是 基于 Windows 3 .x 的 , 而 Vi-
sual FoxP ro 则主要基于 Windows 95。根据国内高校当前的设备条件 , 对非计算机专业 学
生主要处于普及 Windows 3 .x 及 其 应 用 软件 的 阶 段。 近年 来 出 版 的 各省 市 ( 例 如 上 海
市 ) 新一轮计算机培训教材 , Fox Pro 仍然是其中的重要内容。
二、早期微机数据库语言只有命令执行和程序执行两种 方式。Windows 应用程序 大
力推行选单操作与“向导”操作 方式 , 大 大方便 了最 终 用户。 FoxP ro 则同 时支 持“ 选单 操
作”、
“ 命令交互”和“自动编程”三种方式 , 加上对多媒体和多用户应用的支持 , 这表明它具
有现代应用软件的主要特征 , 适宜于非计算机专业学生用作现阶段的数据库教学语言。
三、FoxPro 继承了 dBASE , FoxBASE 等语言简明易用的特点 , 但在界面与功能上 均
有重要提高。它所配置的多种辅助工具有很强的实用性 , 能明显减轻软件的开发工作量。
所以直至今天 , 它仍是开发微机数据库应用系统的常用语种。
近几年出版的 FoxP ro 图书虽多 , 但有些篇幅太大 , 有些又过于简单 , 内容较全而篇 幅
适中的教材并不多见。因此 , 我们为本书 确定 的编写 方针 为 : 全面 介绍 FoxP ro 的 三种 工
作方式 , 展示其现代应用软件的特色 , 而重点则放在“程序设计”与“系统开发”方面。在程
序设计中既注意传统方法的继承 ( 第四章 ) , 更着眼于开发工具的利用 ( 第六至第九章 ) , 在
第四、第九两章各用一个模拟实例来说明 这种变 化。全书 精选 内容 , 多 讲实例 , 尽 可能 结
合实例阐明方法和原理 , 达到既省篇幅、又方便教学的目的。
本书由四川联合大学史济民主编。汤观全编 写了 第三 章和第 五至 第九章 , 邵 存蓓 编
写了第二、第四两章 , 罗钟鸣编写了第十章 , 史济民撰写了第一章 , 并负责全书的策划和修
改定稿。顾益明参加了第二、第四两章的程序调试和录入工作。鉴于本书内容丰富、篇幅
紧凑 , 选材难免不当 , 敬请读者批评指正。

编 者
1997 年 9 月于上海
・Ⅲ・
本   书   导  读
+
    本书为三年前编者编写《FoxBASE 及其应用系统开 发》( 清华大学 出版社 出版 , 1994
年 4 月 ) 一书的姐妹 篇。两 本书 具有 相似 的 结构 与风 格。全 书分 上、中、下三 篇 , 共 有 十
章。
上篇为“ FoxPro 语言基础”, 包括第一章至第三章。
第一章“绪论”介绍 数据 库 和 FoxPro 的 基本 概 念 , 目的 是 使初 学 者 对数 据 库特 别 是
Fox Pro 有一初步的认识。通过对 Fox Pro 的 界面 风格 和工 作 方式 的重 点介 绍 , 期 望读 者
能对 FoxP ro 的风格和特色获得较为全面的印象。
第二、第三两章介绍 Fox Pro 的基本语 言成 分和 命令窗、视 图窗、查 询窗 等基本 窗口。
其中第二章侧重讲述 数据 库 文件 的建 立、修改 和复 制 , 第 三章 侧重 讲述 数 据的 查询 和 统
计。它们概括了 FoxP ro 语言的两类基 本操 作命令 : 建库和 查询。 初步介 绍了 Fox Pro 的
两类基本工作方式 : 选单 〔1〕 操作方式和命令交互方式。
中篇为“ FoxPro 程序设计”, 包括第四章至第八章 , 共计五章。
第四章“程序设计初步”引入 FoxPro 程 序设计 的基 本概 念。在讨 论了 数据库 应用 系
统的一般功能的基础上 , 向读者介绍设计和调试数据库应用程序的基本方法 , 重点介绍了
编者在数据库教学中总结出来的、基于模块化设计的“ 积木式程序”及其编制方法 , 使读者
对数据库应用程序的传统设计方法有一初步的了解。
第五章至第八章分别讲述在 FoxP ro 应用 程序 中设计 窗口、屏 幕、报表 和选单 程序 的
方法。每章说明一类程序。为了提高程序设计的 效率 , 这 四章 将重点 放在 各种辅 助设 计
工具的使用上。凡是有工具可用的地方 , 均以 工具的 使用 为线 索 , 对有关 的 FoxPro 命 令
只做简要介绍 , 从而节省了全书的篇幅。
下篇介绍“系统开发”, 包括第九、第十两章。
第九章“应用开发实例”通过“汽车修理管理系统”及模拟实例 , 阐述了从需求分析、数
据库设计到应用程序设计与编码的系统开发过程。如果说第四章是从传统的手工方法介
绍数据库应用程序的设计 , 则本章更多地注意到充分利用开发工具来辅助 Fox Pro 应用 系
统的开发。通过“设定一个屏幕、生成一个模块”及样例 , 引导读者对面向对象的程序设计
新思想和新方法获得初步的感性认识。
如果说第四章为引入程序设计开了一个头 , 则第 五章 到第 八章分 别讨 论了程 序设 计
的若干类专题 , 然后通过第九章归结为数据库应用系统的完整开发过程 , 在第四章的基础
上达到新的提高。

〔1 〕 menu , 俗称“菜 单”, 本 书统 一写作“ 选单”。

・Ⅴ・
第十章“多用户应用”引入了多用户应用的 基本概 念 , 简述 了与多 用户 操作有 关的 命
令和函数 , 以及设计多用户应用程序的注意事项。
综上可见 , 本教材概括 了 FoxPro 的 语 言、程 序设 计 方法 和 工 具 , 较 为全 面 地介 绍 了
Fox Pro 所支持的选单操作、命令交互 和程序 执行 等工 作方 式 , 并 且把 全书 重 点放 在程 序
设计和系统开发上 ( 这两部分内容占全书篇幅 70 % 以上 ) , 因 而适合 用作高等 学校非计 算
机专业学生“数据库应用”课的教材 , 也可供从 事数据 库使 用和 开发的 人员 在自学 和工 作
中参考。

・Ⅵ・
目    录

上篇   语 言 基 础

第一章   绪论 ………………………………………………………………………………………………… 3
1 .1   数据库的基本概念 ……………………………………………………………………………… 3
1 .1 .1   从文件管理到数据库管理 ……………………………………………………………… 3
1 .1 .2   数据库系统的特点 ……………………………………………………………………… 3
1 .1 .3   数据库系统的分代 ……………………………………………………………………… 4
1 .1 .4   数据库系统的分类 ……………………………………………………………………… 5
1 .1 .5   数据库语言和数据库管理系统 ………………………………………………………… 6
1 .2   FoxPro 概述 ……………………………………………………………………………………… 6
1 .2 .1   引例 : 认识 FoxPro ……………………………………………………………………… 7
1 .2 .2   FoxPro 的语言成分 ……………………………………………………………………… 8
1 .2 .3   FoxPro 文件的主要类型 ……………………………………………………………… 10
1 .2 .4   FoxPro 的特点和技术指标 …………………………………………………………… 11
1 .2 .5   FoxPro 的安装和启动 ………………………………………………………………… 13
1 .3   FoxPro 的界面风格与工作方式 ………………………………………………………………… 15
1 .3 .1   鼠标器及其操作 ……………………………………………………………………… 16
1 .3 .2   FoxPro 的界面风格 …………………………………………………………………… 17
1 .3 .3   FoxPro 的帮助系统 …………………………………………………………………… 22
1 .3 .4   FoxPro 的工作方式 …………………………………………………………………… 24
1 .4   Visual FoxPro 简介 ……………………………………………………………………………… 26
习题 …………………………………………………………………………………………………… 27

第二章   数据库的基本操作 ……………………………………………………………………………… 28


2 .1   建立数据库文件 ………………………………………………………………………………… 28
2 .1 .1   库文件结构的建立 …………………………………………………………………… 28
2 .1 .2   库文件数据的输入 …………………………………………………………………… 33
2 .1 .3   库文件内容的查看 …………………………………………………………………… 35
2 .2   FoxPro 的命令工作方式 ……………………………………………………………………… 38
2 .2 .1   FoxPro 的命令与命令子句 …………………………………………………………… 38
2 .2 .2   表达式、数组与函数 …………………………………………………………………… 44
2 .2 .3   FoxPro 的命令窗口 …………………………………………………………………… 52
2 .3   修改数据库文件 ………………………………………………………………………………… 53
2 .3 .1   库文件结构的修改 …………………………………………………………………… 53
2 .3 .2   记录的插入、删除与添加 ……………………………………………………………… 54
2 .3 .3   记录数据的替换 ……………………………………………………………………… 59
2 .3 .4   单个记录与数组间的数据传送 ……………………………………………………… 59

・Ⅶ・
2 .4   复制数据库文件 ………………………………………………………………………………… 61
2 .4 .1   库文件结构与数据的复制 …………………………………………………………… 61
2 .4 .2   库文件的结构文件 …………………………………………………………………… 63
2 .4 .3   成批记录与数组间的数据传送 ……………………………………………………… 64
2 .5   磁盘文件操作 …………………………………………………………………………………… 66
2 .5 .1   文件维护窗口 ………………………………………………………………………… 66
2 .5 .2   磁盘文件操作命令 …………………………………………………………………… 68
习题 …………………………………………………………………………………………………… 68

第三章   查询与统计 ……………………………………………………………………………………… 72


3 .1   排序与索引 ……………………………………………………………………………………… 72
3 .1 .1   排序 …………………………………………………………………………………… 72
3 .1 .2   索引 …………………………………………………………………………………… 73
3 .2   查询命令 ………………………………………………………………………………………… 77
3 .2 .1   顺序查询命令 ………………………………………………………………………… 77
3 .2 .2   索引查询命令 ………………………………………………………………………… 78
3 .3   VI EW 窗口 ……………………………………………………………………………………… 79
3 .3 .1   多工作区查询 ………………………………………………………………………… 79
3 .3 .2   VI EW 窗口的面板 …………………………………………………………………… 81
3 .3 .3   视图文件 ……………………………………………………………………………… 84
3 .3 .4   库文件的关联 ………………………………………………………………………… 84
3 .4   RQBE 窗口 ……………………………………………………………………………………… 89
3 .4 .1   RQBE 查询 …………………………………………………………………………… 89
3 .4 .2   RQBE 的窗口组成 …………………………………………………………………… 92
3 .4 .3   图形处理 ……………………………………………………………………………… 96
3 .4 .4   SQL SEL EC T 命令 …………………………………………………………………… 99
3 .5   统计命令 ……………………………………………………………………………………… 102
3 .5 .1   计数命令 ……………………………………………………………………………… 102
3 .5 .2   求和命令 ……………………………………………………………………………… 102
3 .5 .3   求平均值命令 ………………………………………………………………………… 103
3 .5 .4   计算命令 ……………………………………………………………………………… 103
3 .5 .5   汇总命令 ……………………………………………………………………………… 104
习题 …………………………………………………………………………………………………… 104

中篇   程 序 设 计

第四章   程序设计初步 ………………………………………………………………………………… 109


4 .1   程序文件 ……………………………………………………………………………………… 109
4 .1 .1   程序文件的建立与执行 ……………………………………………………………… 109
4 .1 .2   状态设置命令 ………………………………………………………………………… 112
4 .1 .3   输入输出命令 ………………………………………………………………………… 114
4 .1 .4   运行控制命令 ………………………………………………………………………… 124
4 .2   程序的控制结构 ……………………………………………………………………………… 126

・Ⅷ・
4 .2 .1   顺序结构 ……………………………………………………………………………… 126
4 .2 .2   选择结构 ……………………………………………………………………………… 127
4 .2 .3   循环结构 ……………………………………………………………………………… 129
4 .3   模块化程序设计 ……………………………………………………………………………… 136
4 .3 .1   基本概念 ……………………………………………………………………………… 136
4 .3 .2   子程序、函数与过程 ………………………………………………………………… 137
4 .3 .3   全程量与局部量 ……………………………………………………………………… 140
4 .4   积木式程序的编制 …………………………………………………………………………… 142
4 .4 .1   程序中的功能模块 …………………………………………………………………… 142
4 .4 .2   带选单的控制模块 …………………………………………………………………… 148
4 .4 .3   积木式程序的装配 …………………………………………………………………… 155
4 .4 .4   一个典型的积木式程序 ……………………………………………………………… 157
4 .5   应用程序的调试 ……………………………………………………………………………… 161
4 .5 .1   调试的目的与步骤 …………………………………………………………………… 161
4 .5 .2   调试技术 ……………………………………………………………………………… 162
4 .5 .3   调试窗口与跟踪窗口 ………………………………………………………………… 163
习题 …………………………………………………………………………………………………… 165

第五章   窗口设计 ………………………………………………………………………………………… 167


5 .1   窗口操作命令 ………………………………………………………………………………… 167
5 .1 .1   窗口定义与修改 ……………………………………………………………………… 167
5 .1 .2   窗口管理 ……………………………………………………………………………… 171
5 .1 .3   建立窗口的控制对象 ………………………………………………………………… 174
5 .1 .4   清除窗口内容和其他 ………………………………………………………………… 177
5 .2   窗口着色 ……………………………………………………………………………………… 178
5 .2 .1   颜色对与颜色模式 …………………………………………………………………… 178
5 .2 .2   设置颜色的命令和子句 ……………………………………………………………… 179
5 .3   BROWSE 窗的设计 …………………………………………………………………………… 182
5 .3 .1   定义 BROWSE 窗 …………………………………………………………………… 182
5 .3 .2   定义功能键 …………………………………………………………………………… 184
习题 …………………………………………………………………………………………………… 187

第六章   屏幕生成器 ……………………………………………………………………………………… 188


6 .1   屏幕生成的基本概念 ………………………………………………………………………… 188
6 .1 .1   屏幕生成器的组成 …………………………………………………………………… 188
6 .1 .2   屏幕生成的基本步骤 ………………………………………………………………… 189
6 .1 .3   快速屏幕生成 ………………………………………………………………………… 190
6 .2   屏幕工具箱 …………………………………………………………………………………… 193
6 .2 .1   定义屏幕对象的一般方法 …………………………………………………………… 193
6 .2 .2   数据类对象的定义 …………………………………………………………………… 194
6 .2 .3   控制类对象的定义 …………………………………………………………………… 199
6 .2 .4   图形类对象的定义 …………………………………………………………………… 206

・Ⅸ・
6 .3   屏幕生成器的选单 …………………………………………………………………………… 206
6 .3 .1   Screen 选单 …………………………………………………………………………… 206
6 .3 .2   Object 选单 …………………………………………………………………………… 215
6 .4   组合查询窗口设计 : 用屏幕生成器修改现有屏幕文件一例 ……………………………… 218
习题 …………………………………………………………………………………………………… 220

第七章   报表设计 ………………………………………………………………………………………… 222


7 .1   打印基础 ……………………………………………………………………………………… 222
7 .1 .1   打印准备 ……………………………………………………………………………… 222
7 .1 .2   打印方法 ……………………………………………………………………………… 223
7 .2   传统的报表打印设计 ………………………………………………………………………… 226
7 .3   报表书写器的基本操作 ……………………………………………………………………… 227
7 .3 .1   打开报表设计窗口 …………………………………………………………………… 227
7 .3 .2   快速制表 ……………………………………………………………………………… 228
7 .3 .3   页面预览 ……………………………………………………………………………… 230
7 .3 .4   报表打印 ……………………………………………………………………………… 231
7 .4   报表书写器的高级操作 ……………………………………………………………………… 232
7 .4 .1   设置页面布局 ………………………………………………………………………… 232
7 .4 .2   设计报表分区 ………………………………………………………………………… 234
7 .4 .3   定义报表对象 ………………………………………………………………………… 240
7 .4 .4   报表变量的应用 ……………………………………………………………………… 244
习题 …………………………………………………………………………………………………… 249

第八章   选单设计 ………………………………………………………………………………………… 250


8 .1   下拉式选单设计 ……………………………………………………………………………… 250
8 .1 .1   选单生成器组成和基本操作步骤 …………………………………………………… 250
8 .1 .2   快速选单生成 ………………………………………………………………………… 251
8 .1 .3   选单设计窗口 ………………………………………………………………………… 252
8 .1 .4   Menu 选单 …………………………………………………………………………… 254
8 .2   弹出式选单设计 ……………………………………………………………………………… 258
习题 …………………………………………………………………………………………………… 263

下篇   系 统 开 发

第九章   系统开发实例 …………………………………………………………………………………… 267


9 .1   数据库应用系统的开发步骤 ………………………………………………………………… 267
9 .2  “汽车修理管理系统”的开发 ………………………………………………………………… 268
9 .2 .1   需求分析 ……………………………………………………………………………… 268
9 .2 .2   数据库设计 …………………………………………………………………………… 271
9 .2 .3   应用程序设计 ………………………………………………………………………… 275
9 .2 .4   编码 ………………………………………………………………………………… 276
9 .2 .5   运行设计 ……………………………………………………………………………… 292

・Ⅹ・
9 .3   项目管理器 …………………………………………………………………………………… 293
9 .3 .1   基本操作 ……………………………………………………………………………… 293
9 .3 .2   生成 .EXE 文件 ……………………………………………………………………… 295
9 .4   文档生成器 …………………………………………………………………………………… 296
习题 …………………………………………………………………………………………………… 298

第十章   多用户应用初步 ………………………………………………………………………………… 299


10 .1   多用户环境 …………………………………………………………………………………… 299
10 .1 .1   Novell 网的结构 …………………………………………………………………… 299
10 .1 .2   在 Novell 网上安装和启动 FoxPro ……………………………………………… 301
10 .2   多用户操作和程序设计 ……………………………………………………………………… 303
10 .2 .1   多用户操作的基本概念 …………………………………………………………… 303
10 .2 .2   多用户命令和函数 ………………………………………………………………… 305
10 .2 .3   多用户编程 ………………………………………………………………………… 311
10 .3   多用户系统的性能优化 ……………………………………………………………………… 312
习题 …………………………………………………………………………………………………… 314

附录一   FoxPro for Windows 命令概要 ………………………………………………………………… 315


附录二   FoxPro for Windows 主要函数 ………………………………………………………………… 328
附录三   ON KEY LABEL 键标号一览表 ……………………………………………………………… 336
主要参考文献 ……………………………………………………………………………………………… 338

・Ⅺ・
上 篇

语 言 基 础
第一章   绪    论
+
    FoxPro 是继 dBASE , FoxBASE 之后又一流行的微机数据库管理系统。本章将概述
Fox Pro 数据库的特点、语言成分、界面风格和工作方式。 作为先 导 , 首先讲一 点数据库 的
一般知识。

1.1   数据库的基本概念
数据库技 术 是 在 60 年 代 末 期 兴 起 的 一 种 数 据 管 理 技 术。 数 据 库 在 英 语 中 称 为
Database。拆开来看 , Data 是数据 , Base 可 译为 基地。 所以 在 通俗 的意 义上 , 数据 库不 妨
理解为存储数据的基地或仓库。

1.1.1   从文件 管理到数 据库管理

在数据库出现前 , 计算机用户就使用数 据文 件来存 放数 据。常用 高级 语言从 早期 的


FOR TRAN 到后来的 C 语言 , 都 支持 使用 数据 文 件。有 一种 常见 的数 据文 件 的格 式是 ,
一个文件包含若干个“记录”( Record) , 一个记录又包含若干个“数据项”( Data I tem) , 用 户
通过对文件的访问实现对记录的存取。通常称支 持这 种数据 管理 方式的 软件 为“ 文件 管
理系统”, 它自 50 年代末期问世以来 , 一直是操作系统的重要组成部分。
随着社会信息量的迅速增长 , 计算机处 理的 数据量 不断 增加。文 件管 理系统 采用 的
一次最多存取一个记录的访问方式 , 以及在不同文件之间缺乏相互联系的结构 , 越来越不
能适应管理大量数据的需要。于是数据库管理系统便应运而生 , 并在 60 年代末期诞生了
第一个商品 化 的 数 据 库 系 统———美 国 IBM 公 司 的 I MS 系 统 ( Information Management
System) 。
从文件管理到数据库管理 , 代表了两代不同的数据管理技术。今天 , 数据库管理已成
为计算机信息管理的主要方式。但在数据量较小 的一 些场 合中 , 由文 件管 理系统 支持 的
数据文件仍在使用。

1.1.2   数据库 系统的特 点

学习数据库课程 , 经常会接 触到“ 数据库 系统”( Database System ) 一词。 所谓 数据 库


系统 , 其实就是以数据库应用为基础的计算机系统。表 1.1 是一张对照表 , 列出了数据库
系统与只使用一般数据文件的应用系统的差别。
从表 1.1 可见 , 数据库系统的基本特点可以归结为 :
1. 数据共享 , 提高了信息的利用率。
2. 冗余度低且可控制。

・3・
表 1.1   数据库系统与一般文件应用系统性能对照表

序号 文 件 应 用 系 统 数 据 库 系 统

1 文件中的数据由特定的用户专用 库内数据由多个用户共享

原则上可消除重复。为方便查询允许 少
2 每个用户拥有自己的数据 , 导致数据重复存储
量数据重复存储 , 但冗余度可以控制

3 数据从属于程序 , 二者相互依赖 数据独立于程序 , 强调数据的独立性

各文件的数据互相联系 , 从总体看是“有
4 各数据文件彼此独立 , 从整体看为“无结构”的
结构”的

    3. 数据独立性高 , 由“ 数据依赖于程序”改变为“ 以数据为中心”。


4. 实现了整体数据的结构化 , 适于表示相互间有多种联系的大量数据。

1.1.3   数据库 系统的分 代

经过近 30 年的发展 , 数据库系统已经历了第一、第二两代 , 现正向第三代迈进。


一、第一代 : 非关系型数据库系统
非关系型数据库系统是第一代数据库系统的 总称 , 其中 又包 括“ 层次”与“ 网状”两 种
类型。这一代数据库系统以记录型 ( Record Type) 为基本 的数据 结构 , 在不同 的记录型 之
间允许存在联系 , 其中层次 模型 ( Hierachical Model ) 在记录 型之 间只能 有单 线联 系 ( 参 阅
图 1 .1) 。网状模型 ( Network Model) 则允 许记 录型 之间 存 在两 种或 多于 两种 的 联系 ( 参
阅图 1.2) 。但这代数据库系统的 结构 错综 复杂 , 数据 存取 路 径需 用户 指定 , 使用 难度 较
高 , 所以自关系型数据库系统兴起后 , 它们已逐渐被关系型数据库取代。
 

图 1.2   网状模型数据库
图 1.1   层次模型数据库

二、第二代 : 关系型数据库系统
70 年代中期 , 商品化 的关 系型 数 据库 ( Relational Database System , 简称 RDBS ) 开 始
问世。80 年代后 , 许多 RDBS 在微型机 上实 现 , 现在 微 机上 使用 的数 据库 系 统几 乎都 是
RDBS。
RDBS 采用人们常用的二维表为基 本的 数据 结构 , 通过 公共 的关 键字 段 实现 不同 二
维表 ( 或“关系”) 之 间 的 数据 联 系。 二维 表 形 式 简 单 , 直 观 明 , 学习 与 使 用 均 甚方 便。
RDBS 允许一次访问整个关系 , 其 效率 远比 第一代 数据 库系统 ( 一次 仅能 访 问一 个记 录 )
为高 , 因而受到用户的普遍欢迎。
・4・
三、第三代 : 对象-关系数据库系统
随着多媒体应用的扩大 , 人们希望新一代数据库系统除存储传统的文本信息外 , 还能
存储和处理图形、声音等多媒体对象 , 于是第三代数据库便应运而生。将数据库技术与面
向对象技术相结合 , 自然地成为第三代数据库系统的发展方向。
80 年代中期以来 , 对新 一代 数据 库 系统 的研 究日 趋活 跃 , 并 出现 了包 括“对 象-关 系
型数据库系统”( 简称 ORDBS ) 和“面向 对象 型数据 库系 统”( 简 称 OODBS ) 在内的 多个 分
支。由于 ORDBS 是建立在关系型数 据 库技 术之 上的 , 可以 直接 利用 第二 代 数据 库系 统
的原有基础 , 所以发展迅速 , 正在形成第三代数据库系统的主流。少数厂商现已推出了可
供实用的 ORDBS 产品 , 显示了光明的发展前景。

1.1.4   数据库 系统的分 类

数据库系统可按照以下几种方法来分类。
一、单用户数据库和多用户数据库
早期的微机数据库都是单用户系统 , 在 同一 时间只 能供 一人 使用。随 着网络 应用 的
扩大 , 供网络用户共享的多用户数据库开始流行 , 它们由多用户数据库管理系统管理和支
持。本书讨论的 FoxPro 2 .5 就 是 一种 多用 户 数据 库 管 理系 统。在 此 以 前 , 已 有 dBASE
+ +
Ⅲ , FoxBASE 等多用户数据库管理系统供微机用户使用。
多用户数据库的关键是保证“并行 存取”( Concurren t Access ) 的 正确 执行。例 如飞 机
订票系统通常是多用户系统 , 它允许乘客在 多个 售票点 预订 机票。当 两位 乘客从 不同 的
售票点同时向某个航班订票时 , 如果缺乏应有的措施 ( 参阅本书第十章 ) , 在数据库系统中
可能仅反映出一位乘客的订票 , 从而发生一票两订的错误。
二、集中式数据库和分布式数据库
集中和分布首先是对数据存储场地而言的 , 同时也反映了对数据库应用方式的差别。
例如 , 一个银行有多个储蓄所 , 每个储蓄所都有许多储户。如果将他们的数据全部存储在
一个集中式数据库中 , 任何储户存取款时都要访问这个数据库 , 网络通信量必然很大。但
若改用分布式数据库 , 把储户的数据分散存储在各自的开户储蓄所 , 则大多数情况下数据
可就近存取 ( 称为“ 局部应用”) , 仅当银 行转 帐 ( 例如 把储 户 A 的 一笔 款子 从 甲储 蓄所 转
到乙储蓄所储户 B 的帐上 ) 或统计全行储户的数 据时 , 才需要把 数据通 过网络 来传 送 ( 称
为“分布应用”或“全局应用”) , 通信量可大大 减小。分 布式 数据库 的目 标 , 是存取 数据 时
不要求用户指明数据的存储场地 , 换言之 , 应使用户像对集中式数据库访问时一样方便。
分布式数据库和多用户数据库都是在网络上使用的。但多用户数据库通常为集中式
数据库。例如上述的飞机订票系统 , 其票房数据一般是集中存放的 , 并不分散存储在各个
售票点上。
三、传统数据库和智能数据库
传统数据库存储的数据都代表已知的“ 事实”。智 能数 据库则 在存 储事实 外 , 也存 储
用于逻辑推理的“规则”。所以后者也称为“基于规则的数据库”( Rules Based Database) 。
例如 , 某智能数据库 存储 有“ 处长 领导 科长”的规 则。如 果它 同时 存有“甲 是 处长”、
“乙是科长”等数据 , 它就能推理出“ 甲领导乙”的新事实。
・5・
随着人工智能日益走向实用化 , 对智能数据库的研究日趋活跃。演 绎数据库 ( Deduc-
tive Database ) 、专家数据库 ( Expert Database ) , 都带有一 定的 智能。这 类数 据库的 关键 是
逻辑推理。如果推理模式出了问题 , 就可能出现荒诞的结果。
本书不讨论分布式数据库和智能数据库 , 有兴趣的读者请参阅其它书籍。

1.1.5   数据库 语言和数 据库管理系 统

数据库的建立和查询 , 都是通过特定的 数据 库语言 进行 的。关系 数据 库使用 的语 言


称为“关系数据语言”。由于查询是数据库语言 的中心 功能 , 所 以数据 库语 言有时 也称 为
查询语言。被国际标准化组织 ( ISO ) 确定为关系数据语言标准的 SQL 语言 , 就是“ 结构化
查询语言”( Struct ured Q uery Language ) 英文 名 的缩 写。其 实 SQL 也 和任 何 其它 数据 库
语言一样 , 不仅包含用于查询的语句 , 也包含用于建立数据库的语句。
正如使用高级语言需要解释/ 编译程序的支持一样 , 使用数据库语言也需要一个特定
的支持软件 , 这就是“ 数据库管 理系统”( DataBase Management System) 。一般 地说 , 数 据
库管理系统应该具有下列功能 :
1. 支持“数据定义语言”( Data Definition Language, 简称 DDL) , 供用户定义数据库文
件的结构 , 建立所需的数据库。
2. 支持“数据操作语言”( Data Manipulation Language, 简 称 DML ) , 供 用户对 数据 库
进行查询操作 ( 包括检索与统计 ) 和存储操作 ( 包括增加、删除与修改数据 ) 。
3. 向数据库系统提供一组管理 和控制 程序 , 保 障数据 库的 安全、通信 与 其它 管理 事
务。
在微机数据库管理系统中 , DDL 与 DM L 通常合二为一 , 构成一体化的语言。本书 介
绍的 FoxP ro 就属于这种一体化语言。

1.2   FoxPro 概述
Fox Pro 是微型计算机上当今最流行的软件之一 , 也是 Xbase 数 据库家 族中继 dBASE
+
和 FoxBASE 之后又一广泛使用的微机关系数据库管理系统。
1989 年 , 美国 Fox 软件公司首次发表了 Fox Pro 1 .0 , 作为 FoxBASE 的升级产品。 继
而又在 1991 年推出 FoxPro 2.0 , 在性能上有了重大的提高。1992 年微软公司收购了 Fox
软件公司。其后不久 , 就在 1993 年 1 月公 布了 FoxPro 的 两种 版本 : FoxPro 2 .5 for DOS
和 FoxPro 2 .5 for Windows。同 年晚 些时 候 再次 推出 了 FoxPro 2 .5b 及 其中 文 版 , 从 此
Fox Pro 2 .5 就在国外和我国微机用户中广泛流行。
1994 年发表的 FoxPro 2 .6 较 FoxPro 2 .5 增 加了 多种“ 向 导”( Wizard ) 工具 , 从而 简
化了最终用户的操作 , 但在程序开发方面未见明显的改 进。1995 年 , 微软公 司把“可视 化
编程”( Visual Progra mming) 技术引入了 FoxP ro, 使 Visual FoxPro 继 Visual BASIC 和 Vi-
sual C + + 之后成为该公司 Visual 系列软件的又一新成员。但由于 FoxPro 2 .5 的优越 性
已经深入人心 , 加上它与 Xbase 完全兼容 和对 运行 环境要 求较 低 ( 相对 于 Visual FoxPro)
等特点 , 至今它仍拥有大量用 户 , 被许多 学 校用 为数 据库 教学 语 言。本书 主 要讨 论 Fox-
・6・
Pro 2 .5b for Windows ( 中文版 ) , 对 Fox Pro 2 .6 仅在有关章节附带介绍。

1.2.1   引例 : 认识 FoxPro

为使读者对 FoxP ro 有一初步认识 , 下面先举一个简单的例子。


[ 例 1-1]   表 1.2 是 某 工 厂 的 一 张 设 备登 记 表。 假 设 已 经 用 FoxPro 的 建 库 命 令
“CREA TE shebei”建立了一 个名 为 shebei ( 设 备 ) 的 数据 库文 件 , 并 将 上 述登 记 表的 内 容
( 包括结构和数据 ) 存入这一库文件。

表 1.2   ××工厂设备登记表

编 号 名 称 启用日期 价  格 是否主要设备

016 - 1 车 床 87/ 03/ 05 62044 .61 是


016 - 2 车 床 89/ 01/ 15 27132 .73 是
037 - 2 磨 床 87/ 07/ 21 241292 .12 是
038 - 1 钻 床 86/ 10/ 12 5275 .00 否
100 - 1 微 机 94/ 08/ 12 8810 .00 是
101 - 1 复印机 89/ 06/ 01 10305 .01 否

210 - 1 轿 车 92/ 05/ 08 151000 .00 否

    试用 FoxP ro 的有关命令完成下列操作 :
(1 ) 列表显示数据库文件 shebei 的内容。
FoxPro 命令   执行结果  
U SE shebei (打开数据库文件 shebei)
L IST Record # 编号 名称 启用日期 价格   主要设备
1 016 - 1 车床 87/ 03/ 05 62044 .61 .T .
2 016 - 2 车床 89/ 01/ 15 27132 .73 .T .
3 037 - 2 磨床 87/ 07/ 21 241292 .12 .T .
4 038 - 1 钻床 86/ 10/ 12 5275 .00 .F .
5 100 - 1 微机 94/ 08/ 12 8810 .00 .T .
6 101 - 1 复印机 89/ 06/ 01 10305 .01 .F .
7 210 - 1 轿车 92/ 05/ 08 151000 .00 .F .

    (2 ) 将库文件中的主要设备复制到名为 zushebei( 主设备 ) 的库文件中。


FoxPro 命令   执行结果  
CO PY To zushebei FOR 主要设备 4 records copied
USE zushebei ( 打开数据库文件 zushebei )
LIST Record # 编号 名称 启用日期 价格   主要设备
1 016 - 1 车床 87/ 03/ 05 62044 .61 .T .
2 016 - 2 车床 89/ 01/ 15 27132 .73 .T .
3 037 - 2 磨床 87/ 07/ 21 241292 .12 .T .
4 100 - 1 微机 94/ 08/ 12 8810 .00 .T .

・7・
    (3 ) 将主要设备的名称和价格按价格由低到高排列 , 生成名为 jiage 的库文件。
FoxPro 命令   执行结果  
SOR T ON 价格 TO jiage FIELDS 名称 , 价格 4 records sor ted
U SE jiage (打开数据库文件 jiage )
L IST Record # 名称 价格  
1 微机 8810 .00
2 车床 27132 .73
3 车床 62044 .61
4 磨床 241292 .12
    (4 ) 将主要设备的价格全部上调 20 % 。
FoxPro 命令   执行结果  
REPLACE ALL 价格 W I TH 1 .2 * 价格 4 replacements
L IST Record # 名称 价格  
1 微机 10572 .00
2 车床 32559 .28
3 车床 74453 .53
4 磨床 289550 .54
    从上面的简单例子可见 :
(1 ) FoxPro 建立的数据库文件采用表格的形式 , 与 人们 的习惯 相符 , 所 以易学 易用。
在本例中 , 用 LIST 命令 显 示的 shebei 文 件的 内 容除 了 不 带表 格 线 , 以及 在 第 5 栏 中 用
.T .和 .F .代替“ 是”、
“ 否”等细小差别外 , 和表 1.2 完全相同。
(2 ) FoxPro 采用命令式的语言 , 一条 命令 ( 如 USE , LIST , COPY 等 ) 即可完 成一 项
相当复杂的 功 能。在 FORT RAN, C 语 言 等 高 级 语 言中 , 要 完 成 本 例 中 诸 如 COPY ( 复
制 ) , SORT ( 排 序 ) , REPLACE ( 替 换 ) 等 命 令 所 要 求 的 功 能 往 往 要 编 写 一 段 程 序 , 而 在
Fox Pro 中只需要一条命令。这也是关系数据语言受到用户欢迎的一个重要原因。

1.2.2   FoxPro 的语言 成分

与其它高级语言相似 , FoxPro 语言也包括命令 ( 语句 ) 、函数、表达式等成分。


一、命令
一般地说 , FoxPro 的命令总是由一 个称 为命 令字 的动 词 开头 , 后 随一 个 宾语 和若 干
子句 ( 称为命令子句 ) , 用来说明命令的操作对象、操作结果与操作条件。表 1.3 列出了命
令的一般格式和若干示例。

表 1.3   FoxPro 命令一般格式与示例

< 命令字 > < 操作对象 > < 操作结果 > < 操作条件 >

U SE shebei
COPY TO zushebei FOR 主要设备
REPLACE 价格 WI TH 1 .2 * 价格 ALL
SOR T ON 价格 TO jiage FIELDS 名称 , 价格

・8・
    从以上的示例不难看出 , FoxPro 的命令具有下列特点 :
(1 ) 采用英语 祈 使 句的 形 式 , 命 令的 基 本 部 分 简 洁 规 范 , 粗 通 英 语 的 人 都 能 看 懂。
Fox Pro 中文版允许将命令中的专用名词使用汉字 , 但其余词汇仍用英文。
(2 ) 操作对象 , 结果 ( 目的 地 ) 和条 件均 可用命 令子 句的形 式来 表示。命 令子 句的 数
量不限 ( 有些命令有二三十条子句 ) , 顺序不拘 ( 例如“COPY
, TO zushebei FOR 主要设备”
和“COPY FOR 主要设备 TO zushebei”是等效的 ) 。它们使命令的附属功能可以方便地增
删 , 十分灵活。
(3 ) 命令中只讲对操作的要求 , 不描述具体的操作过程 , 言简意 赅 , 所 以又称为“非 过
程化”( Non-Procedural) 语言 , 而常见的高级语言都是“ 过程化”( Procedural) 语言。
同 BASIC 等解释型高级语言相似 , FoxP ro 的命令 既可 逐条用 交互 的方 式执行 , 又 可
编写成程序 , 以“ 程序文件”的方式执行。命令中的词汇 ( 专用名词除外 ) 还可使用简写 , 即
只写出它们的前四个字母 ( 例如 REPLACE 可简写作 REP L) 即可。
二、表达式
表达式是 FoxPro 语言的重要成分 , 通常由常量或变量用运算符连接而成。例如例 1-
1 REPLACE 命令中的“ 1.2 * 价格”便是 一 个表 格式 , 它 由 一个 常量 ( 1.2 ) 、一 个 变量 ( 价
格 ) 和运算符“ * ”( 乘号 ) 构成。在 REPLACE 命令中 , 该表达式用于计算设备的新价格。
Fox Pro 有两类变量 : 一类为“字段变量”, 它们代 表库 文件 中的列。 例如在 例 1-1 中 ,
shebei 库文件有五个字段变量 , 即编号、名 称、启用 日期、价格 和主 要设 备 ; jiage 库 文件 仅
有两个字段变量 , 即名称和价格。字段变量是多值变量 , 因为一个数据库文件有多少条记
录 , 其字段变量就会有多少个值。另一类为“ 内存变量”, 主要用于存储在命令或程序执行
中临时使用的输入、输出或中间数据。FoxPro 还允许使用“数组”。 其实数组 也是内存 变
量 , 不过它是带下标的内存变量。
和其它高级语言 相 似 , FoxPro 的 变 量 也 有 数值 型、字 符型、逻 辑 型、日 期 型 等类 型。
它的字段变量还允许使用备注型和通用型字段 , 后者可以存储多媒体数据。
Fox Pro 有四类运算符 , 包括算术运算符 , 字符运算 符 , 关系运 算符和逻 辑运算符。 例
如 + , - , * ( 乘 ) ,/ ( 除 ) 是算术运算符 , < , > , = 是关系运算符 , 等等。主要由关系运算符
构成 的 表 达 式 称 为 关 系 表 达 式 , 在 Fox Pro 命 令 中 , 它 们 常 被 用 作 FOR 命 令 子 句 或
WH IL E 命令子句中的条件。例如 , 命令

U SE shebei
L IST FOR 价格 < 10000

表示列表显示 shebei 库文件中价格低于 10000 元 的设 备 , 命令 执行后 将显 示钻床 和微 机


两个记录。而命令

L IST FOR 主要设备 AND 价格 < 10000

将显示价格低于 10000 元的主要设备 , 命令执行后只显示微机一个记录。在后一条 LIS T


命令 FOR 子句中的条件是一个逻辑表达式 , 由逻辑运算符 AND 和两个关系表达式“ 主要
设备的字段值为 .T .”和“价格 < 10000”连接而成。
・9・
三、函数
Fox Pro 提供近 290 种 标准 函 数 , 以 方 便 用 户进 行 运 算 或 作出 判 断。 与其 它 语 言 相
似 , FoxPro 的函数也具有自变量与结 果数 , 后 者 即函 数的 返回 值。每 个函 数 必须 也只 能
有一个返回值。
Fox Pro 的函数通常具有 < 函 数名 > ( ) 的形 式。例 如 , LE N “
( 车 床”) 表 示 计算 字 符
串“车床”的长度 , 因一个 汉字占 用 2 个字节 , 故 其值 为 4。 同理 , LE N “
( 复印 机”) 的值 为
6 , 因为它的长度是 3 个汉字即 6 个字节。
由于函数执行后总要 返 回一 个值 给调 用 者 , 所 以在 FoxPro 表 达 式 中也 允 许包 含 函
数。

1.2.3   FoxPro 文件的 主要类型

前已提到 , FoxPro 用数据库文 件存 储数 据 , 用 程序 文件 存 储程 序 , 它们 是 FoxP ro 文


件中两类最常用的文件。实际上 FoxP ro 支持 近 40 种 文件 , 表 1.4 列 出了 其中常 用的 一
些类型。
Fox Pro 的文件都是按名访问的。文件名由不含空格 的字符 串构成 , 主名 长度不超 过
八位 , 扩展名不超过三位。扩展名用来区分文 件的 类型 , 除 非用户 另有 指定 , 在文 件建 立
时系统将为它们自动加上默认的扩展名。

表 1.4   FoxPro 的常用文件类型

序号 文件类型 默认扩展名 文 件 用 途 参考章节

.DBF 库文件 , 存储数据库的结构和备注型、通用型以外的数据


1 数据文件 2 .1 .1
.F PT 备注文件 , 存储备注型和通用型的字段数据

.PRG 又称命令文件 , 用于存储用 FoxPro 语言编写的程序


2 程序文件 4.1
.FX P 存储编译好的目标程序的文件

.IDX 只有一个索引标识符的单索引文件
3 索引文件 3.1.2
.CDX 具有若干个索引标识符的复合索引文件

用于保存通过 RQBE 窗 口设 置的 查 询条 件 和对 查 询输
4 查询文件 .Q PR 3 .4 .1
出的要求

.SCX .SCX 为定义文件


用于保存屏幕格式 ,
.SC T .SCT 为定义备注文件
5 屏幕格式文件 6 .1 .1
.SP R 根据屏幕定义文件自动生成的程序文件 , 其中
.SP X .SPR 为源程序 , .S PX 为目标程序

.M NX .M NX 为定义文件
用于保存选单格式 ,
.M NT .M NT 为定义备注文件
6 选单格式文件 8 .1 .1
.M PR 根据选单定义文件自动生成的程序文件 , 其中
.M PX .M PR 为源程序 , .MPX 为目标程序

.FRX 保存报表定义的文件
7 报表格式文件 7 .3 .4
.FR T 保存报表定义的备注文件

・ 10 ・
续表

序号 文件类型 默认扩展名 文 件 用 途 参考章节

.LBX 保存标签定义的文件
8 标签格式文件
.LBT 保存标签定义的备注文件

9 内存变量文件 .MEM 保存已定义的内存变量 , 以备需要时在内存恢复它们 2 .2 .2

用于保存程序运行 环境的 设置 , 以备 需要时 恢复所 设置


10 视图文件 .VUE 3 .3 .3
的环境

11 文本文件 .TXT 供 FoxPro 与其它语言交换数据的数据文件 2 .4 .1

1 .2 .4   FoxPro 的特点 和技术指标

一、FoxPro 2 .5 的特点
    Fox Pro 2.5 for Windows 在微机用户中广为流行 , 要归功于它的下述特色 :
1. Windows 风格的用户界面
在 Xbase 家族 中 , Fox Pro 2 .5 for W indows 是 第一 个在 Windows 环 境下 运行 的微 机
数据库管理系统。它充分发挥 Windows 的优势 , 全面采用了 以窗口、选单、对 话框和联 机
帮助为特征的图形界面技术和操作方法 , 因而使用户耳目一新 , 受到大众的欢迎。
2. Rushmore 快速查找技术
查询是数据库语言的主要 功能。 Fox Pro 引进 了 SQ L 语言 的 SE LECT 查 询语 言 , 大
大方便了涉及多个库文件的“多库关联查询”。Fox Pro 2.5 进一 步采用了 一种称为 Rush-
more 的快速查找技术。它不仅 是 SQL SEL ECT 实现 优化 查 询的 基本 技术 , 而且 能帮 助
带有 FOR 子句的单库查询命令提高执行速度。例如在使用 SU M FOR , COU N T FOR 等
命令对大型库文件进行数 据统 计时 , 使用 Fox Pro 2.5 以前的 版本 速度 相当 缓 慢 , 而采 用
Rushmore 技术后 , 即使在库文件中包含上百万个记录时 , 也能迅速得出查找的结果。
3. 同时支持多种工作方式
早期的微机数据库语言都具有命令执行和程 序执行 两种方 式 , 供程 序员选 用。Win-
dows 应用程序出现后 , 选单操作方式迅 速流 行 , 大大 方便了 最终 用户。 FoxP ro 则 同时 支
持“命令交互”“
、 程序执行”和“ 选单操作”等三种工作方式 , 使各类用户可以根据需要选择
使用 , 进一步体现了现代软件“ 方便用户使用”的特征。
4. 拥有丰富的辅助设计工具
+
用工具软件辅助开发应用 程序 , 历来 是开 发人 员的 追 求目 标。FoxBASE 的 后期 版
本曾提供过多种辅助开 发 与 管理 工 具 , 由 于操 作 仍 较繁 琐 , 未 能 普遍 推 广。 FoxP ro 2 .5
大力改进各种辅助设计工具 , 使它们基本上达到了实用、方便的目标。本书中篇介绍的屏
幕生成器、报表书写器和项目管理器等软件 , 就是这类工具中比较常用的几种。它们使用
户在开发时不必逐条书写命令 , 明显减少了开发工作量。
5. 支持使用多媒体数据
随着多媒体应用的扩大 , 越来越多的应用 需要数 据库 能存 储和处 理包 括图形 和声 音
在内的多媒体数据。Fox Pro 2 .5 for Windows 支持在数据库文件中使用“通用型”( Gener-
・ 11 ・
al Type) 的字段变量 , 就是为这个目的服务的。不 言而喻 , 使用 声音等 数据 还需有 特定 的
硬件支持。
在 FoxP ro 中 , 多媒体数据可以用工具软件产生 ( 例如 上面 提到的 屏幕 生成器 便能 生
成图形 ) , 也 可 以通 过 Windows 提供 的“数 据交 换”技 术———例如“ 剪贴 板”( Clipboard) 功
能和“ 对象链接与嵌入”( Object Linking and Embedding, 简称 OL E) 功能 , 把其它 Windows
应用程序生成的多媒体数据剪贴或嵌入 FoxP ro 的通用型字段 , 或者把已存入通用型字 段
的多媒体数据输出到其它应用程序中去处理。数据交换使 FoxP ro 仅须增加少量的命令 ,
就可分享 Windows 应用程序中的丰富资源。
6. 不设置单独的单用户版本
+
在 dBASE 和 FoxBASE 中 , 单机用户使用的单用户版本和网络用户使用的多用户 版
本是各自独立的 , 在市场上分别销售。但在 Fox Pro 2.5 中 , 单用 户版不 再单独发 售 , 即 无
论 FoxP ro for Windows 或 FoxP ro for DOS 都适用于多用户 , 同时 也可供单 用户使用。 这
一举措表明 , 网络应用已相当普及 , 不设置单独的多用户版 , 可以更加简化 Fox Pro 的安 装
与使用。
综合以上的介绍可知 , FoxPro 2.5 是第一个具有典型 Windows 界面风格 的微机关 系
数据库管理系统。它支持从选单操作到程序执行等多种工作方式 , 具有现代应用软件“ 对
用户友好”的特征 ; 它拥有丰富的辅助设计和辅 助管理 工具 , 可 以明显 减少 程序员 的开 发
工作量 ; 它采用 Rushmore , OL E 等新技 术 , 使系 统的查 询速 度和多 媒体 支持 功能 均有 明
显的提高。正是由于这些特点 , 使 FoxPro 2 .5 for Windows 从一开始就获得用户 的青睐 ,
至今仍在微机数据库用户中获得广泛的支持。
二、FoxPro 2 .6 的特点
比 FoxP ro 2.5 晚一年推出的 FoxP ro 2.6 , 其基本 功能与 FoxP ro 2.5 相 似 , 但 在下 列
方面有所改进 :
1. 增加了一组“向导”工具。 Fox Pro 2.5 只有 一种 向 导工 具———“ 图形 向导”( Graph
wizard) , 用于帮助用户把查询结果 用 图表 而不 是数 据的 形 式输 出 ( 见 本书 第 3.4.3 节 ) 。
Fox Pro 2.6 增加了“库表”( Table ) 向 导、
“ 屏幕”( Screen) 向导、
“ 报 表”( Repor t ) 向 导、
“标
签”( Label) 向导、
“ 邮件 合 并”( Mailmerge ) 向 导等 多种 向导 工具 , 因而 可进 一步 简化 用 户
操作。
2. 增加了一个“目录管 理器”( Catalog Manager ) 。 这是 主要 为配 合上 述 向导 工具 新
增的又一管理工具。在它的选 单中 含有 File , Data, Tools 等 多个 目录 项 , 用 户可 通过 这
些目录对系统中的文件、数据和向导工具选择调用 , 使操作更加方便。
虽然 FoxP ro 2.6 是更新的版本 , 但多数用户仍习惯使用 Fox Pro 2.5。从 市场销售 量
和装机数量看 , FoxPro 2.5 仍比 FoxPro 2.6 为多。
三、FoxPro 的主要技术指标
1. 关于数据库文件
9
库文件最大记录数                     10 个
记录的最大字段数 225 个
记录的最大长度 65000 字节
・ 12 ・
字符型字段最大长度 254 字节
数值型字段最大长度 20 位
数值计算精度 16 位
2. 关于内存变量
内存变量总数 不多于 65000 个
数组总数 不多于 65000 个
每个数组的最多项数 不多于 65000 项
3. 其它重要指标
可同时打开的 .DBF 文件数 不多于 225 个
.CDX 文件索引码最大长度 240 字节
命令行最大长度 2048 字符
DO 命令嵌套深度 不多于 32 层
READ 命令嵌套深度 不多于 5 层
.DBF 文件关联个数 不受限制

1 .2 .5   FoxPro 的安装 和启动

一、FoxPro 的安装环境
    安装 FoxPro 2.5 for Windows 的微 型计 算机 , 其 软、硬 件必 须符 合 或超 出 以下 的 配
置。
1. 硬件配置
(1 ) 中央处理器为 80386 以上。
(2 ) 已设虚拟内存的计算机要求内存在 4MB 以上 , 未设虚拟内 存的计算 机内存容 量
在 6MB 以上。
(3) 一个 1.2MB 的 软盘 驱 动器 和 一个 硬 盘 驱动 器。 硬盘 在 安 装 Fox Pro 前 至 少 有
20MB 的自由空间 , 安装 FoxPro 后不少于 15MB 的自由空间。
(4 ) 与 Windows 配套的鼠标。
2. 软件配置
(1 ) 3.0 以上版本的 Windows 操作系统 , 且必须采用 386 增强方式。
( 2) 若需使用中文 , 可采用 Windows 3 .1 中文版 , 或在英文版的基础上安装 UCWIN ,
中文之星等中文系统。
(3 ) 如果是多用户使用 , 必须具有相应的网络环境 ( 参阅第 10.1 节 ) 。
二、FoxPro 的安装步骤
本节介绍在单机上安装 FoxP ro 的步骤。在网络 上安装的 步骤请参 阅本书 第 10.1.2
节。
Fox Pro 2 .5 for Windows 记录在七张 1.2MB 的软盘上 , 使 用前须 先把 该软件 装入 硬
盘。安装的步骤如下 :
(1 ) 启动 Windows , 在进入 Windows 后打开它的文件管理器。
(2 ) 将七张软盘中的第一张 ( 1 号盘 ) 插 入软 盘驱 动器 , 单击 该驱 动器 的 图标 使之 成
・ 13 ・
为当前驱动器。
(3 ) 在 Windows 文件管理器窗口中双击文件名 SE T UP.EXE , 安装程序开始运行 , 屏
幕显示“ Initializing Setup……”的信息。
(4 ) 在安装过程中正确回答安装程序的提问 , 例如 :
・ 安装目录的名称 , 默认名为 C∶ \ FOXPROW。
・ 在 Windows 程序管理器窗口中使用的组图标名称 , 默认名为 FoxP ro for Windows。
・ 安装 方式 : 可在 Complete Installation , Custom Installation 和 Minimum Installation
三种方式中选择一种。
・ 按 键 方 式 : 有 Windows-Style 和 DOS-St yle 两 种 , 建 议 选 择 Windows-Style
Keystrokes。
(5 ) 安装完成后 , 屏幕上将显示出相应的信息 , 此时按 En ter 键即退出安装。
下面再说明几点 :
(1 ) 选定安装方式后 , 应根据安装程序的提示 , 及时在软盘驱动 器中插入 不同的系 统
盘 (2 号盘至 7 号盘 ) 。
(2) Complete 代表 完 全安 装 , Custom 代 表 用 户 定制 安 装 , Minimum 代 表 最 小安 装。
三者的区别 , 仅在于 辅助 文件 的安 装 数量 不同。Complete 安装 所 有 的辅 助 文件 , Custom
安装用户指定的辅助文件 , Minimum 不安装辅助文件。
(3 ) 如果安装目录和组图标名均采用 默认名 , 安装 后将在 Windows 的 文件管 理器 窗
口产生 FoxPro 的主目录 FOXPROW , 在程序管理器窗口产生名为 Fox Pro for Windows 的
组图标。为使用户文件与系统文件分开存储 , 建议用 户另 建一 个存储 用户 文件的 专用 目
录 , 例如 SJM。
安装 FoxP ro 后的 C 盘目录如图 1.3 所示。

C∶ \  
  CON FIG .SYS (DOS 配置文件 )
  AUTOEXEC .BAT (自动批命令文件)
— WINDOWS ( Windows 目录)
    WIN .COM ( Windows 启动文件 )
— F OX PROW ( FoxPro 主目录 )
CON FIG .FPW ( FoxPro 配置文件)
  FOXPROW .EXE ( FoxPro 启动文件)
—SJM (存放用户文件的目录 , 用户建立)

图 1.3   安装 FoxPro 后的 C 盘目录

三、FoxPro 的启动与退出
1. 启动 FoxP ro 2 .5 for Windows
(1 ) 首先启动并进入 Windows , 在它 的程 序管 理器 窗口 选定 Fox Pro for Windows 的
组图标 , 如图 1.4 所示。
(2 ) 双击该组图标 , 打开 FoxP ro for Windows 的程序窗 , 如图 1.5 所示。

・ 14 ・
图 1.4   程序管理器中的 FoxPro 组窗口

图 1.5   打开后的 FoxPro 组窗口

(3 ) 双 击图 1.5 中 的狐狸 头图 标 , 打开 Microsoft FoxPro 窗 口 , 即可 进 入 FoxPro for


Windows。其界面图形如 1.3.2 节图 1.6 所显示 , 读者可参阅该节的说明。
2. 退出 FoxP ro 2 .5 for Windows
以下两种方法均可退出 FoxP ro:
(1 ) 在 Microsoft FoxPro 窗口的“文件”( File ) 选单中选择 Exit。
(2 ) 在 Command 窗口中键入命令 Q U IT。
退出 FoxP ro 后 , 系统将回到 Windows 环境。

1.3   FoxPro 的界面风格与工作方式

上节浏览了 FoxP ro 的一般情况 , 本节将着重介绍它的界面风格和多种工作方式。 为


照顾初学者 , 以下先对鼠标器作一简要介绍。

・ 15 ・
1.3.1   鼠标器 及其操作

在图形用户界面上 , 鼠标器是主要的输入工具。与键盘相比 , 鼠标器在多数操作中具


有明显的优势。例如当在界面上选 择一 个对 象时 , 通过 移动 鼠标 器 可以 把光 标 ( Cursor)
或指针 ( Poin ter ) 迅速定位到对象上。但若用键 盘上的 光标 键 ( 如 → , ← , ↑ , ↓等 键 ) 来 操
作 , 速度就慢得多。
一、鼠标器的种类
鼠标 器 属于 指点 式设 备 ( Pointing Device ) , 有 机械 鼠、光 学鼠 和光 学机 械鼠 等 类型。
与机械鼠相比 , 光学鼠具有轻巧、定位精度高、传送 速度 快等 优点 , 但价 格较 贵 , 必 须在 具
有精细坐标的专用平板上滑动。目前 PC 机使用的 鼠标器 多数为光 学机械鼠 , 一 般设左、
右两个按键或左、中、右三个按键。但通常仅 使用左 边的 一个按 键 , 称为 当前 活动键。 对
于习惯使用左手操作的用户 , 可通过程序控 制 , 把当前 活动 键从原 来的 左键 切换为 右键 ,
即将右键设置为当前活动键。
二、鼠标器的操作
安装了鼠标器的 PC 机 , 其屏幕上将显示一个鼠标 指针。该 指针一般 呈单箭 头形 , 在
特定条件下也可能转换为双箭头或十字形箭头。以下介绍四种常见的鼠标操作。
1. 滑动 ( Slipping)
滑动的目的 , 是将鼠标指针定位到所需 的位 置。只要 手握 鼠标在 台面 或专用 平板 上
滑动 , 鼠标指针便随之上、下、左、右地在屏幕上移动。但要注意在滑动中不能按下鼠标的
按键。
2. 单击 ( Clicking)
把手指在当前活动键上按一下即放开 , 称为 单击。当 把鼠 标指针 定位 到某个 界面 对
象后 , 单击这一 对 象 , 就 表 示 选 定 ( Select ) 了 这 个 对 象。它 有 点 类 似 于 键 盘 操 作 中 按 下
En ter 键所起的作用。
3. 双击 ( Double Clicking)
在当前活动键上连按两次即为双击。两次之间不能有明显的停顿 , 但也不宜太快 , 以
免在无意中使鼠标滑动。
双击常用于启动程序的运行。例 如 在 Windows 的 程序 管理 器窗 口双 击 一个 应用 程
序的图标 , 该程序随即被启动并且运行。
4. 拖动 ( Dragging)
鼠标器可以将一个对象在屏幕上拖着 跑 , 称 为“ 拖动”或“拖 放”( Drag and Drop) 。 拖
动的方法 , 是首先把鼠标指针定位于被拖的 对象上 , 然 后按 下当前 活动 键移 动鼠标 , 使 鼠
标指针拖着所选的对象一道移动。等“拖”到目的 地后 释“ 放”按键 , 被 拖的 对象就 停留 在
屏幕的新位置上。拖动与滑动在操作上的区别在于 : 在移动鼠标时前者要按住按键 , 后者
要松开按键。
拖动的对象 , 可以是应 用程 序的 图标 ( 例如 把 程序 从一 个程 序组 移 动到 另 一个 程 序
组 ) 或整个窗口 ( 例如移动窗口位置 ) , 也可以是窗 口的 一条边 ( 例如改 变窗 口的横 向或 纵
向大小 ) 。在字处理软件 ( 例如 Microsoft Word) 中选定一个“文 本块”( 指夹在 块头字符 和
・ 16 ・
块尾字符之间的那部分文本 ) , 只须将鼠标指针 首先移 到文 本块的 头字 符位 置 , 单 击该 字
符使头字符之前出现一个闪烁的光标 , 接着把光标拖动到尾字符上释放 , 即可完成对文本
块的选定。
三、鼠标操作的优点
在 PC 机的输入设备中 , 鼠标器 是后 起之 秀。大 多 数界 面操 作用 键盘 或 鼠标 均可 完
成 , 但鼠标操作具有明显的优势 :
(1 ) 定位迅速   用键盘的光标键定位 , 一次击键仅移动一小步 , 用鼠标可 使光标迅 速
移动。
(2 ) 操作简便   鼠标器仅有滑动、单击、双击和拖放四种操作 , 常用 键仅 1 ~2 个。 键
盘一般有上百个按键 , 不经训练很难熟练掌握。
(3 ) 光标可变   在不同场合 , 鼠标指针能够以不同的形状出现 , 对用户起 到提示某 种
操作的作用。
由此可知鼠标确为界面操作中“得心应 手”的有 力工 具。只有 配备 了鼠标 , 才 能充 分
发挥 FoxP ro 图形界面的优越性。

1.3.2   FoxPro 的界面 风格

启动 FoxP ro, 屏幕上即出现一个标题为 Microsoft Fox Pro 的窗口 ( 见 图 1.6 ) , 表示 已


成功地进入 FoxPro 环境。由图可见 , 该 窗口 由 FoxPro 主窗 口、Command ( 命令 ) 窗、系 统
选单、状态条等构成 , 具有典型的 Windows 界面风格。一般地说 , 这 类窗口的 界面通常 含
有三类要 素 ( 或 对 象 ) , 即 : 多 窗 口 ( Multi-Windows ) 、选 单 ( Menu ) 和 联 机 帮 助 ( On-line
Help) 信息。它们有时也被并称为用户界面的三大友好技术。现分述如下。

图 1.6   刚启动的 Fox Pro 窗口

・ 17 ・
一、FoxPro 的窗口
窗口是从屏幕上划分出来的一个矩形区 域。一个 多窗 口的屏 幕 , 在功 能上相 当于 多
个小型的独立屏幕 , 可帮助用 户更有 效 地利 用屏 幕的 有限 空 间。FoxPro 刚 启动 时 , 屏 幕
上将出现两个窗口。一个是 Command 窗 , 用于显示所执行的 Fox Pro 命令 ( 例如 例 1-1 中
的“FoxPro 命令”) ; 另 一个是主窗口或 FoxP ro 程 序窗 , 用 来显示 FoxPro 的命令或程序 的
运行情况 ( 例如例 1-1 中的“执行结果”) 。一屏多窗 , 实现了信息的分类 显示 , 可使人一 目
了然。
与其它 Windows 应用程序的窗口一样 , FoxPro 的窗口也可以进行放大、缩小、移动位
置等操作。这些操作最好用鼠标器来完成。例 如把鼠 标指 针移到 命令 窗的 Command 标
题上 , 再拖动该标题到 所需 的位 置上 , 就可 使命 令窗 移 动位 置。把鼠 标 指针 压 在窗 口 的
左、右边线上拖动 , 可以改变窗口的横向大小 ; 压在上、下边线上拖动可以改变窗口的纵向
大小。如果把指针压住窗口的某个角 ( 例如左 下角 ) 向 外或 向内拖 动 , 这个 角的两 条边 线
将同时向外或向内移动 , 实现窗口的放大或缩小。
除此以外 , 在窗口左 上 角通 常 有 一 个 以“ 小 矩形”为标 志 的 按 钮 , 称 为“控 制 选 单 框
( 钮 ) ”。用鼠标单击这个 按钮 , 可 弹 出一 个如 图 1.7 所 显示 的控 制选 单 , 其 中 也包 含“ 移
动”、
“ 大小”等窗口操作选项 , 主要供键盘操 作的 用户选 用。在 窗口右 上角 还有两 个分 别
以倒向三角形和正向三角形为标志的按钮 , 前者为“ 最小化”按钮 , 它能将窗口缩小为一个
图标 ; 后者为“ 最大化”按钮 , 它可使窗口放大至充满所
在窗口的整个工作区。
二、FoxPro 的选单
1. 选单的种类
选单的应用由 来已 久。早 期的 选单 只 使用 字符 ,
打开后往往占用整个屏幕 , 故称 为“全 屏幕 选单”( Full
Screen Menu) 。后来出现了 一种带“光带”( Ligh t Bar)
的全屏幕选单 , 它能 在用 户选 定的 选单 项 上覆 盖一 个
图 1.7   控制选单的窗口操作选项
明亮的光带 , 使该项变成“ 反相”( 即亮底暗字 ) 显示 , 较
传统的全屏幕选单更加美观醒目。
随着图形用户界面的推广 , 又出现了与窗口技术相结合的各种选单 , 其中流行最广的
是“弹出式选单”( Popup Menu) 和“下 拉式选 单”( P ull Down Menu) 。前 者平时隐 蔽 , 用 户
需要时才在指定的位置上弹出 , 并在一个弹 出的 窗口中 显示 选单 的选项。 下拉式 选单 其
实是一种复合选单 , 一般由一个水平选单 条 ( Menu Bar) 和多 个弹 出式选 单组 成。弹出 式
选单可以仅有一级 , 从水 平选 单 选定 的选 单项 向下 方 弹出 , 这 就是 下拉 式 选单 得名 的 由
来。选择弹出式选单的某些选项 , 还可能出现新的弹出式选单 ( 通常从选项的右方弹出 ) ,
于是便形成多级的下拉式选单。
Fox Pro 主要使用下拉式选单和 弹出 式选 单。在 主 窗口 中使 用的 系统 选 单为 下拉 式
选单 , 窗口左上角的控制选单钮属于弹 出式 选单。使 用 FoxPro 语 言编 写的程 序 , 不仅 可
产生下拉式选单和弹出式选单 ( 参见本书第 八章 ) , 也 可以 产生 传统的 以及 光带式 的全 屏
幕选单 ( 参见本书第四章 ) 。
・ 18 ・
2. 选单的约定
图 1.8 显示了 FoxP ro 的三种选单。现结合该图说明 Fox Pro 在选单中允许使用的 若
干约定。

图 1.8   FoxPro 的若干选单

(1 ) 对话框标记   如果在 选单项 右方 紧跟一 个省 略号 ( … ) , 表示 选择 该项后 将弹 出


一个对话框。
(2 ) 子选单标记   有些选 单项后 面带 有指向 右方 的三 角形箭 头 ( ) , 表示选 择该 项
会打开一个新的子选单。
(3 ) 选中标记   如果选单项被选 择后在 其左 方出 现一个“ 对号”( ) , 表示该 项在 当
前有效。若要使它失效 , 只须再将它选择一次 , 使 号消失即可。
(4 ) 灰色选单项   当选单项以灰色显示时 , 表示该项在当前环境 下不能使 用。例如 ,
如果现在主窗口中未打开任何 数据库 文件 , 则 系统选 单中 的 Record 选 单项 将 呈现 灰色 ,
因为此时不可能对记录进行操作。
(5 ) 热键和快捷键   热键 ( Hot Key) 和快捷键 ( Shortcut Key) 均用于键 盘操作。前 者
指选单项中带下划 线的字母 , 例 如File ( 文 件 ) 项中的 F, Run ( 运行 ) 项中的 N 等。后者 常
出现在选单项名称的右方 , 一般采用组合键的形式 , 例如 Ct rl + D , Ctrl + F1 等。如果用 户
记住了这些键 , 可直接用它们来选择选单项 , 比逐级选择更省时间。
三、FoxPro 的对话框
在联机帮助技术 中 , 对 话框 ( Dialogue Box ) 扮演 了重 要 的角 色。 FoxP ro 大 量使 用 对
话框 , 借以达到对用 户操 作的 正 确引 导。在 1.2.1 节 的引 例中 , 包 含 有用 SOR T 命 令 对
zushebei( 主设备 ) 库文件中的记录按“价 格”排 序的 操作 , 如 果不是 在键 盘发出 命令 , 改 由
Fox Pro 主选单 的 Database 选单 中选 择 SORT 命 令 , 系 统会 打开 一个 如 图 1.9 所显 示 的
SOR T 对话框 , 供用户通过人-机 对话 来完 成排 序操 作。下 面 就以 此为 例 , 来 说明 对话 框
的一般组成和基本操作。
1. 对话框的组成
典型的对话框通常由列表框 ( List Box) 、弹出式列表框 ( Popup List Box) 、( 文本 ) 编 辑
框 ( Edit Box) 、单选钮 ( Radio Butlon ) 、复选 框 ( Check Box ) 、按钮 ( Push Button) 和数 码 器
( Spinner) 等控制对象组合而成。在 Sort 对话 框中 含有上 述 的前 六种 对象。 如图 1.9 所
・ 19 ・
图 1.9   Sort 对话框

示 , 该对话框左、右两侧为两个列表框 : 其中 All Fields 列表框列 出了 zushebei 库文件的 所


有字段 , Sort Order 列表框则用来指定排序的字段 , 其中 可包含 一至多个 字段。对 话框 左
下角有一标题为 From T able 的弹出式列表框 , 用来显示待排序的库 表 ( 库文件 ) 名。该 框
平时只显示一行 , 目的是节省空间 , 单击其右端的“ 向下”箭 头即弹 出一 个列 表框 , 列出 当
前目录中的全部库表 名 供 用户 选 择。对 话 框中 下 部有 一 Output 框 , 其 中包 含 一个 编 辑
框 , 用户可通过键盘向它键入本次排序产生的新库文件名称。
在图 1.9 的对话框中还有两种选择框。一种 是以 圆圈 为标志 的单 选钮 , 另一 种是 以
小方框为标志的复选框。前者不论有多少项 , 每次仅能从中任选一项 ; 后者则允许一次选
择多项。以 Field Options 中的三 个选择 框为 例 , Ascending 和 Descending 为 单 选钮 , 因 为
升序排列和降序排列是互斥的 , 只能选择其一 ; 而 Ignore Case ( 忽略大、小写 ) 为复选框 , 表
明它可与 Ascending 或 Descending 同时选 择。在 本例对 话框 中还有 5 个按钮 , 每 一按 钮
代表一种功能。例如 OK 钮表示 对话 结束可 以开 始排序 , Cancel 表 示 取消 排序 操作。 有
些按钮面板上有省略号 ( 如图 1.9 中的 Save as… ) , 选择后将打开新的对话框。
Sor t 对话框中未用到数码器。它是一种能在给定的范围内对某一参数值进行调整 的
控制对象 , 所以也译作“ 微调控制”, 图 6.20 的“ 价格”框 给出 了它 的例子。 用鼠标 单击 该
框右端的向上/ 向下箭头 , 就可使框内的价格值增大或者减少。
Fox Pro 使用的对话框 数 量 众多 , 而且 繁 简 不一。 有 些 简单 的 对 话 框 仅有 少 量 的 对
象 , 图 2.16( 见 2.3.1 节 ) 就是其中的一个例子。
2. 对话框的操作
现仍以 Sort 对话框为例 , 简介对话框的操作。
[ 例 1-2]   承例 1-1。试用 Sor t 对话 框对 zushebei 库 文件 中的 全部 记录 按“ 价格”升
序排列 , 形成一个称为 jiage 的排序文件。要求新文件只含名称与价格两个字段。
由题意可知 , 本例与例 1-1 (3 ) 要完成 的排 序是 一样的。 区别 仅在于 例 1-1 是 直接 使
用 SORT 命令 , 而本例则通过 Sort 对话框进行操作。具体步骤如下 :
(1 ) 打开 Sort 对话框。
(2 ) 打开 F rom Table 弹出式列表框 , 从诸 多库 文件 中选定 zushebei 为排序 文件。 若
・ 20 ・
排序文件在打开 Sort 对话框以前已经打开 , 则此步可以省去。
(3 ) FoxPro 自动在 All Fields 列表框中显示出 zushebei 库文件的全部字段。
(4 ) 在 All Field 框 中 选定“ 价 格”为 排 序 字 段 , 通 过 Move 按 钮 将它 移 入 Sor t Order
框。
(5 ) 在 Field Options 框中选定 Ascending 单选钮 , 表示要求升序排列。
(6 ) 在 Out pu t 框中选定 Save as…按 钮 , 并在 随后出现的 Save As 对话框 ( 图 略 ) 中 键
入将要生成的新的排序文件名 jiage。
此时在 Output 框内的文本框中 , 将自动显示 C∶ \ FOXP ROW \ jiage .dbf。
(7 ) 在 Out put 框中选定 Fields… , 并在随后出现的 Field Picker 对 话框 ( 图略 ) 中选 取
新排序文件所需的两个字段“
: zushebei .名称”和“zushebei .价格”。
(8 ) 至此对话结束。在图 1.9 中包含了在对话过程中所设置 的各项参 数。此时若 选
择 OK 按钮 , 排序操作随即开始执行。
在对话框中选择某个对象一般可用鼠标器单击该对象来实现 , 不再一一细述。
四、FoxPro 的向导工具
对话框的出现 , 使不熟悉 Fox Pro 命 令的 用户也 能“按 图索 骥”, 学会 FoxPro 的 操作。
但对于某些复杂的功能 , 如果把参数设置 和对输 入/ 输 出的 要求集 中在 一个对 话框 中 , 其
操作可能变得十分复杂 , 使用 户难于 掌 握。为 了解 决这 类问 题 , FoxPro 向 用 户提 供了 一
种称为“向导”的工具。其基本思想是把一项复 杂的功 能分 解为若 干简 单的 步骤完 成 , 每
一步使用一个对话框 , 然后把这些较简单的对话框按适当的顺序组合在一起。由此可见 ,
向导实质上是一组有序的系列对话框 , 它们是对话框技术的发展。
近几年来 , 向导技术在 Windows 应用程序中应用很广。 FoxP ro 2.5 在图 形输出中 使
用了 Graph Wizard 工具 , 详见 3.4.3 节 ; Fox Pro 2.6 又增加了多种 Wizard 工具 , 请读者参
阅 1.2.4 节。
五、FoxPro 的状态条
状态条 ( Status Bar) 是使 用 较 早的 一 种联 机 帮助 技 术 , 在 字 符用 户 界 面上 已 广 为 使
用。在图形用户界面中 , 它通 常出 现 在主 窗口 的底 部。其 主要 作 用 , 是 利用 较 小的 空 间
( 通常为一行 ) , 把当前最有用的信息告知用户。在 Fox Pro 状态条中显示的信息可能有 以
下几种 :
(1 ) 配合选单操作显示选项的功能   例如 在 File 选单 中选 定 New…命 令时 , 状态 条
将显示 Create a new file ; 选定 exit 命令时状态条 将显 示 exit FoxPro 等 , 使 用户能 及时 了
解所选命令的基本作用。
(2 ) 显示系统对用户的反馈信息   FoxPro 命令 执行后 , 系 统会向 用户 反馈执 行的 结
果。其中除查询结果 ( 例如 LIST 命令显示的库文件数 据 ) 一般 在 Fox Pro 主窗口 显示 , 出
错信息 ( 例 如若将 LIS T 误写 为 L EST , 系统 会给出“ U nrecognized Command verb”的错 误
信息 ) 除用对话框形式显示外 , 其它反馈信息 ( 如例 1-1 中的“4 records copied”“
, 7 replace-
ments”等 ) 均在状态条上显示。
(3 ) 显示操作键的当前状态   状态条右 端有 3 个 小格。左格 显示 Ins 时表示 处于 插
入方式 , 否则为“空”。类似地 , 中 格显 示 Num 表 示小 键盘 处于 数字 方 式 ; 右格 显示 Caps
・ 21 ・
可区分字母大小写等。它们均由键盘上的相应键控制。

1.3.3   FoxPro 的帮助 系统

在 Windows 平台和 Windows 应 用程 序中 , 帮 助信 息 几乎 随处 可 见。FoxPro 的 帮 助


系统是一个十分有效的信息系统 , 它 像一本 内 容丰 富的 使用 手册 , 使用 户不 离开 FoxPro
环境就能检索到它的各种帮助信息。
一、帮助选单
在 FoxP ro for Windows 的任何版本中 , 系统主 选单的最 后一 项总 是 H ELP 选项。 选
定 HE LP , 屏幕上就会显示如图 1.10 所示的 HE LP 选单 , 其内容包括 :
(1 ) 帮助 目录 ( Contents)   这是 帮助 信 息的 总 目
录 , 详见下文“ 帮助窗口”。
(2 ) 搜索关于 . . .的帮助 ( Search for Help on . . .)
用于查看某个指定“主题”( Topic ) , 例如命 令或函数 的
详细说明。
( 3) 帮助的使用方法 ( How to Use Help)   告知用
户怎样使用帮助系统。
(4 ) 关 于 FoxP ro ( About FoxP ro)   显 示 FoxPro
图 1.10   FoxPro 的 HELP 选单
的版本信息和关于本机运行情况的信息。
(5 ) 附件   介绍诸如计算器、日 历、Filer 管理 器等 FoxP ro 附件程 序的 功能和 使用 方
法。
在 FoxP ro 2.6 的帮助选单中 , 还增加一个 dBASE HE LP 选项 , 用于供用户查阅 Fox-
Pro 与 dBASE 语 言在 命令、函 数等方 面的 差别 , 以及 怎样 使二 者生成 的系 统相互 转换 等
知识。
二、帮助窗口
帮助窗口是 FoxPro 向用户提供帮助信 息的一 个服 务窗 口。有三 种方 法可以 打开 帮
助窗 , 即 : 在帮助 ( HE LP ) 选单 ( 见图 1.10) 中选定 Con tents 选项 ; 在 FoxPro 主窗口环境 中
直接按 F1 键 , 或者在命令窗中键入 H EL P 命令。
图 1.11 显示了打开后的 Fox Pro 帮助窗口。由图可见 , 该窗口主要由帮助目录、一 排
命令按钮和一个水平选单条构成。现简述如下 :
(1 ) 帮助目录 ( Help Table of Con tents )   为了 方便 用户检 索 , 本 目录 将 FoxPro 的 帮
助信息总目录分为三类 , 即 :
・ 界面目录 ( In terface)   FoxP ro 2 .5 的界面目录包含选单、窗口和对话框三类界面的
分类目录和把这几类界面总加起来按字母顺序 ( A~Z) 排 列的综 合目录 , 在 FoxPro
2.6 的界面目录中还在末尾增加一类向导类目录。
・ 语言目录 ( Language Reference)   提供 FoxPro 的命令和函数目录 , 其中又包含四组
不同的目录。第一组包括所有 的命 令与函 数 ; 第二 组给出 按功 能分 类 的命 令与 函
数 ; 第三组含有 FoxP ro 数十种系统内存变量的目录 ; 第四组 为 Fox Pro 常用命令 与
函数的目录。
・ 22 ・
图 1.11   FoxPro 的 HELP 窗口

・ 附加目录 ( Additional Reference )   向用户介绍辅助信息。例如 FoxPro for Windows


和 Fox Pro for DOS 两类版本 的区 别 , FoxPro 不 同版 本 的兼 容性 和差 异 , 错 误信 息
的种类与含义 , 新版本较以往版本的改进等。
(2 ) 帮助按钮   帮助按钮位于帮助目录的上方 , 通常包括以下按钮 :
・ 目录 ( Contents) 按钮   用于使帮助系统返回到帮助目录 , 恢复帮助窗的初始画面。
・ 搜索 ( Search) 按钮   用于搜索特定主题的帮助信息。
・ 后退 ( Back) 按钮   显示前次查看的主题的帮助信息。
・ 历史记录 ( History ) 按钮   显示刚才查看过的所有帮助信息。
・ 词汇表 ( Glossary) 按钮   罗列 FoxP ro 的所 有词 汇 , 并 对指 定的 词汇 给 出简 短的 说
明。
・ n 按钮   显示当前主题的前一个主题的说明。
・ m 按钮   显示当前主题的后一个主题的说明。
(3 ) 水平选单选项   在帮助按钮上方还有一水平选单 , 内含 File, Edit , Bookmark 等
选项。它们主要用于把帮助信息打印出来等工作 , 这里就不讲了。
三、对指定主题的帮助
帮助目录是检索帮助信息的总索引。当用户 从目 录中 找到所 需的 主题后 , 即 可查 看
与该主题相关的帮助信息。这好比看一本书 , 首先浏览全书总目录 , 从中找到感兴趣的章
节 , 然后再仔细阅读该节的内容。
但是 , 许多情况下用户希望越过总目录 直接 检索某 一主 题的 帮助信 息。这时 他可 在
・ 23 ・
以下几种方法中任择一种。
(1 ) 在 FoxPro 主窗口的 HE LP 选单中选择“Search for HE LP on . . .”选项 , 或者在 帮
助窗口选择 Search 按钮 , 都 会在屏幕上出现 一个标题为“搜索”的对话框 , 如图 1.12 所 显
示。此时用户可将要查询的主题 ( 例如 SORT) 键入对话框的文本编辑框 , 然后选择“显 示
主题”( Show Topics) 按钮。接着帮助系统会在对话框的下半 部分给 出若干个 相关的帮 助
主题 ( 例如 SORT , SORT DIALOGU E 等 ) 。若 用户想了 解其中的 SOR T DIALOGU E 的
信息 , 可以用鼠标单击这一主题 , 然后选择“ 转到”GOT O 按 钮 , 屏幕上 即可 显示出 该主 题
的帮助信息。

图 1.12   搜索对话框

(2 ) 在命令窗口键入以下命令

HELP < 主题名 >   ( 例如 HELP SOR T )

也可在屏幕上直接显示出指定主题的帮助信息。情况与 (1 ) 相似 , 不再细述。
(3 ) 再一种常见的情形 是 , 用户 在操 作中 遇 到了 需要 查询 的问 题。例 如 在与 SOR T
对话框交互时 , 用户对框中某些对象的用法 可能 不太了 解。此 时用户 可直 接将鼠 标指 针
移至对话框中 , 按下 F1 功能键查询帮助信息。由于 Fox Pro 的帮助系统具有“ 上下文敏感
性”( Context Sensitivity) , 系统在此时给 出的帮 助信 息将 与用 户的 当前 操作 直接 相 关 , 比
通过总目录逐级向下查找更为直截了当。

1.3.4   FoxPro 的工作 方式

作为 90 年代的一种流行软件 , Fox Pro 支持用户使用 三种不 同的工作 方式 , 即选单 操


作方式、命令交互方式和程序执行 方式。其 中后 两种 方式是 dBASE 和 FoxBASE 早已 使
・ 24 ・
用的传统的工作方式 , 第一种方 式则是 Windows 应用 软件 在 90 年代 大力 推 行的 工作 方
式。
一、命令交互方式
从例 1-1 可见 , FoxP ro 是一种命 令 式语 言。用 户每 发出 一条 命 令 , Fox Pro 随 即执 行
并完成一项任务。许多命令执行后会在屏幕上显 示必 要的 反馈信 息 , 包括 命令的 执行 结
果或错误信息 ( 假如在执行中发生了错误 ) 等。 这种工 作方 式直截 了当 , 关 键在于 要求 用
户熟悉 FoxP ro 的命令及其用 法。但 Fox Pro 拥有 300 余条 命令 , 200 余种标准 函数 , 常 用
的命令与函数就有上百种 , 熟悉它们需要时间。所以一般地说 , 命令交互方式仅适合于程
序员使用。
采用命令交互方式工作时 , 用户发出的命令均在命令窗口显示 , 命令的执行结果则在
Fox Pro 主窗口中显示。不同类的信息使用不同的窗口 , 避免了相互混淆。
命令交互方式除了要大量记忆 FoxPro 命 令 , 可能 令初 学者望 而却 步外 , 还存 在以 下
缺点 :
(1 ) 执行完上一条命令才 能输入 下一 条命 令。机器 执行 和用户 操作 相互 交叉 , 限 制
了执行速度。
(2 ) 数据库应用中有许多 需要重 复执 行的 操作。采 用命 令交互 方式 时 , 要在 命令 窗
反复输入内容相同或者相似的命令集合 , 不但费时 , 而且令人乏味。
二、程序执行方式
为了弥补命令交互方式的不足 , 在 实际 工 作中 常常 根据 需要 解 决的 问题 , 将 FoxPro
的命令编成特定的序列 , 并将它们存入程序文件 ( 或称命令文件 ) 。用户需要时 , 只须通过
特定的命令 ( 例如 DO 命令 ) 调 用程 序文 件 , FoxPro 就 能自 动 执行 这一 程序 文件 , 把用 户
的介入减至最小限度。
程序执行方式不仅运行效率高 , 而且可重复执行。要执行几次就调用几次 , 何时调用
便何时执行。另一个好处是 , 虽然编程 序的人 须熟 悉 FoxPro 的命 令和 掌握 编程的 方法 ,
使用程序的人却只须了解程序的运行步骤和运行过程中的人-机交互要 求 , 对 程序的内 部
结构和其中的命令可不必知道。
为了方便用户编程 , FoxPro 还提供 了多 种实 用的 辅助 设 计工 具 , 能帮 助 用户 通过 简
单的人-机交互 , 自动生成 FoxPro 程序。本书从第六章起 , 将对这些工具做详细介绍。
三、选单操作方式
在 PCTools , DOSShell 等 DOS 界 面 软 件 中 , 人 们 就 常 用 选 单 来 选 择 所 需 的 操 作。
Windows 界面包含大量下拉式选单和弹出式选单。随着 Windows 应用程 序的发 展 , 支 持
选单操作的应用软件越来 越多。例如在 Microsoft Word , Microsoft Excel 等 著名软件中 ,
选单操作都是它们主要的甚 至是 唯一 的工作 方式。 FoxP ro 2.5 和 Fox Pro 2.6 都 支持 选
单操作 , 从而使 FoxPro 成为全面支持选单操作、命令 交互 和程 序执行 三种 工作方 式的 新
型数据库管理系统。
如果说在 DOS 环境下选单操作的重点为使 用选单 , 则在 Windows 环境 下 , 所 谓选 单
操作其实是对选单、窗口和对话框技术的联合运用。其中对话框的详细画面 , 对用户操作
常常起到引导的作用。例 1-2 中叙述的 Sort 对话框的操作 , 就是 Fox Pro 选单操作的一个
・ 25 ・
典型例子。
选单操作的优点是直观易懂 , 击键简 单 ( 主 要是 鼠 标单 击和 双击 ) , 对 于 不熟 悉 Fox-
Pro 命令、又没有或 不 想花 时间 去学 习它 们 的最 终用 户 ( End User) 十 分适 合。它的 不 足
是操作环节多 , 步骤繁琐 , 因而速度较慢 , 效率不高。
向导操作是选单操作的延伸和发 展。FoxPro 2.5 和 FoxP ro2.6 都 支持向 导操 作 , 前
文已多次提及 , 不再重复。
从以上的叙述可知 , Fox Pro 是 Windows 应用 软件 中同 时支持 命令 交互、程序 执行 和
选单操作三种工作方式的少数流行软件之一。在这个意义上说 , 学习 Fox Pro 可使读者 对
应用软件的现代工作方式获得比较全面的理解。此外 , FoxPro 具有 多种辅助 设计和辅 助
管理工具 , 为读者理解和应用 P C 机的现 代软 件开 发工 具提 供了 一组 实用 性 很强 的典 型
例子。所 以 虽 然 从 1995 年起 Microsoft 公 司 又 推 出 了 Visual FoxPro, 但 许 多 学 校 仍 将
Fox Pro 2.5 作为数据库应用课的主要语种。

1.4   Visual FoxPro 简介


Visual FoxPro( 简称 VFP ) 是 微 软 公 司 Visual 系 列 软 件 的 新 成 员。 自 1994 年 发 表
Fox Pro 2.6 以后 , 微 软 公 司 又在 1995 年 12 月 和 1997 年 1 月 相 继 发 表 了 VFP 3.0 和
VFP 5.0 , 作为 FoxP ro 的升级产品。 前者 在 Windows 3 .x 平 台上 工作 , 后者 在 Windows
95 环境中工作。前两节已对 FoxPro 作了概略的介 绍 , 本 节将在这 一基础 上对 V FP 作 一
简介 , 供读者进行比较。鉴于对 FoxPro 的详细讲 解尚 未展 开 , 读者也 可先 跳过本 节或 仅
粗读一遍 , 待学完后续各章后再返回来阅读本节。
与 FoxP ro 相比 , VFP 的最大特点是引入了面向对象的 编程思想 , 支 持可视化 的编 程
技术。正如 1.3.2 节所指出 , Windows 应用程 序的窗 口和 对话 框中常 常包 含大量 控制 对
象。Fox Pro 为这些控制对象提供了多种定义命令 ( 详见本书 附录一 ) , 但这些 命令一般 都
含有大量命令子句 , 用它们编程不仅繁琐而且费时。为了减 轻编程的 工作量 , FoxPro 2.5
提供了屏幕生成器等辅助设计工具 ( 参见 1.2.4 节 ) , 通过用工具自动生成屏幕格式程序 ,
向用户初步展示了以 控 制对 象 为处 理 单 元的 面 向对 象 的程 序 设计 思 想。 Visual FoxPro
则将 Visual 系列软件的可视化编程技术引入 Fox Pro 中 , 将传统的逐一用命令来定义控制
对象的作法 , 简化为在一个称为“ 表单设计器”( Form Designer) 的窗口 中主 要靠鼠 标器 来
完成的人-机交互操作。在 VFP 中 , 表单 ( Form ) 常用 来代表 复杂 的窗 口 , 它本质 上是“ 控
制对象的集合”。通过表单设计器既可以 创建新 的表 单 , 也可 以修改 已有 的表 单。这样 ,
建立应用程序的第一步便可归 结为 创建 表单。如 果说 FoxPro 2.5 在 辅助 设 计工 具中 奉
行的“给出一个屏幕、生成一个模块”的方 法代 表了 可视 化编 程 的萌 芽 , V FP 则使 上述 思
想和方法进一步的发展和完善。
VFP 的另一重要改进 , 是在 库文 件上 面增 加一 层 数据 库 , 形成 数 据库 的新 概念。 在
传统的 Xbase 数据库中 , 每张二维表都是一个库文件 , 也是一个独立的数据 库。当操作 的
数据涉及多个库文件时 , 须利用“ 关联”命令将多个库文件从不同工作区临时连接起来 , 待
操作结束再去掉关联。在 VFP 中 , 数据库 的概念 扩充 为若 干相关 的二 维表、表间 关系 和
・ 26 ・
内部程序 ( VFP 把它们称为存储过程———Stored Procedure ) 的集 合 , 使这些 相关的 数据 和
程序封装在一起 , 构成一个完整的数据库。为了方便用户区分数据库和数据库 文件 , VFP
把数据库文件称为“表”( T able ) , 把相关表的集合称为“数据库”( Database) , 而 不属于任 何
数据库的表则 称 为“自 由 表”( Free T able ) 。表 和 数 据 库分 别 使 用 .DBF 和 .DBC 为 扩 展
名。在对表进行定义时 , 同时定义各表之间 的关联 , 并作为“永 久关系”存储 在 .DBC 文 件
中。在使用数据库时 , 永久关系随表的打开而打开 , 用户可利用这种关系快速地访问分散
于不同表中的数据而同时保证信息的完整性。
按照建立数据库应用系统的理论 , 要开发一个数据库应用系统 , 首先要设计出合理的
数据库文件。VFP 引入的数据库新概念 , 使程序员 在开始建 库前就 要确定一 个应用系 统
须包含多少张表 , 各表之间应建立什么样的 永久 关系。这 不仅 有助于 建立 结构合 理的 数
据库 , 也便于程序员养成重视数据库结构设计的良好习惯。
除此以外 , V FP 还直接 支 持客 户机/ 服务 器 ( Client/ Server) 结 构 , 从 而为 它 在网 络 环
境下的应用创造了便利。
由此可见 , 从发展趋势看 , V FP 迟 早会 取代 FoxPro。但 是同 其它可 视化 应用 软件 一
样 , Visual Fox Pro 3 .0 尤其是 Visual FoxPro 5 .0 要求有较高的 C PU 速度和不低于 16MB
的内存容量 , 才能较好地发挥其优越性 能。从认识论 的角度 来说 , 先学 FoxPro 再学 VFP
也是合理的。

习   题

1. 数据库系统的主要特点是什么 ?
2. 简单说明数据库系统的分代。
3. 多用户数据库和分布式数据库有哪些异同 ?
4. 什么是数据库管理系统 ? 它具有哪些主要功能 ?
5. 命令式语言有什么特点 ?
6. Fox Pro 2 .5 for Windows 有哪些特点 ? ForP ro 2.6 有哪些主要改进 ?
7. 鼠标器有哪几种基本操作 ? 鼠标操作的优点是什么 ?
8. 用户界面三大友好技术的含义是什么 ?
9. 对话框的作用是什么 ? 它可能包含哪些界面对象 ?
10. 对话框和向导 ( wizard) 工具有什么区别 ?
11. 什么是帮助目录 ? FoxPro 的帮助目录中有哪几类目录 ?
12. 怎样查找与特定主题 ( topic) 有关的信息 ? 试举出几种不同的方法。
13. FoxPro 有几种工作方式 ? 它们各有什么特点 ?
14. FoxPro 2.5 有哪些重要的辅助设计工具 ?

・ 27 ・
第二章   数据库的基本操作

    本章介绍数据库的基本操作 , 包括数据 库文件 的建 立、修改与 复制 的各 种方法 , 以 及


Fox Pro 中有关磁盘文件操作 的内 容。为 使读 者在 Fox Pro 的 编程 方面 打下 良 好的 基础 ,
本章还将介绍 FoxP ro 表达式的概念以及与数据库基本操作有关的各条命令。

2 .1   建立数据库文件
数据库以文件的形式储存在磁盘中 , 这就是数据库文件 ( 下面简称为库文件 ) 。通常 ,
一个数据库 由 多 个 库 文 件 组 成。 若数 据 关 系 简 单 , 一 个 数 据 库 也 可 只 有 一 个 库 文 件。
Fox Pro 所管理的库文件都是形如表 2 .1 的二维表。

表 2 .1   设 备 清 单

编号 名称 启用日期 价格 部门 主要设备 备注 商标

016-1 车床 87/ 03/ 05 62044 .61 21 .T . Memo gen

016-2 车床 89/ 01/ 15 27132 .73 21 .T . memo gen

037-2 磨床 87/ 07/ 21 241292 .12 22 .T . memo gen

038-1 钻床 86/ 10/ 12 5275 .00 23 .F . Memo gen

100-1 微机 94/ 08/ 12 8810 .00 12 .T . memo Gen

101-1 复印机 89/ 06/ 01 10305 .01 12 .F . memo gen

210-1 轿车 92/ 05/ 08 151000 .00 11 .F . memo Gen

    表的一列为一个栏目 , 每个栏目都有一个栏名 , 存放相同类型的数据。例如 , 名为“ 价


格”的栏目中保存了各种设备的价格。表的一行则 集中了一 种设备 的有关资 料。在 Fox-
Pro 中 , 一个库文件对应一张二维表 , 并称 二维 表的 一个 栏 目为 库文 件的 一个“ 字 段”, 二
维表的一行为库文件的一个“记录”。
要制作一张二维表 , 首先需要画出表格的 样式 , 如 表中 一共有 多少 个栏目 , 确 定栏 目
的名称与宽度 , 然后才能向表里填写数据。类似地建立一个新的库文件也要分两步走 , 就
是先建立库文件的结构 , 再把数据填入库文件之中。

2 .1 .1   库文件 结构的建 立

建立一个库文件的结构需要做下面几项工作 :
一、设计库文件的结构
设计库文件的结构就是把库文件中每一个字 段都 确定 下来 , 也即 确定 各字段 的字 段
・ 28 ・
名、字段类型、字段宽度与小数位数这 4 个结构参数。
1 . 字段名
字段名是以字母或汉字为首 , 长度不超过 10 的字 母、汉字、数 字的 序列 , 中间 可嵌 有
下划线 , 但不可插入空格。
2 . 字段类型
Fox Pro2 .5 for Windows 可使用下面 7 种字段类型 :
(1 ) 字符型 ( Character)
用以存放从键盘输入的并可以在屏幕上显示或打印出来的英文字母、汉字、数字或标
点符号等等 , 长度最多可达 254 个字符。这是在 FoxPro 中使用最多的一种数据类型。
(2 ) 数值型 ( N umeric)
用以存放由数字、小数点与正负号所组成 , 且能参与数值运算的数据。数值型字段最
长可为 20 位。
(3 ) 浮点型 ( Float )
与数值型字段类似 , 用 以存 放能 参与 数值 运 算的 数字、小 数点 以 及 带有 正 负号 的 数
字 , 通常用于科学计算。
(4 ) 逻辑型 ( Logical)
它只能存放 T , Y , F , N 这 4 个字符中的一个 , 其中 T 与 Y 表示逻辑上的“真”值 , F 与
N 表示“假”值。
(5 ) 日期型 ( Date )
Fox Pro2 .5 for Windows 的 日期 型数据 由 yy/ mm/ dd 共 8 个字符 组成 , 其 中 yy 代 表
20 世纪的年份 , 94 就是指 1994 ; mm 从 1 到 12 代表月 ; dd 代表日 , 其范 围视月份 而定 , 如
11 月为 1 ~30 。
(6 ) 备注型 ( Memo)
备注型能接受一切字符型数据 , 但是它比字符型灵活。字符型字段的长度是固定的 ,
而备注型字段的信息则能长能短 , 长到只受硬盘可用空间的限制 , 短到可以一个字符也不
包含。一个库文件的备注信息集中存 放在 一个 与库文 件同 名但扩 展名 为 FP T 的 备注 文
件中 , FoxPro 会自动地把库文件与它的备注文件联系起来。
(7 ) 通用型 ( General )
这是 FoxPro2 .5 for Windows 所特有的字段类型 , 被用来存放图像、电子表格、声音等
多媒体对象。与备注型字段相同 , 通用型字段也储存于扩展名为 FP T 的备注文件之中。
3 . 字段宽度
字段宽度用以表明该字段允许存放的最 大字符 个数。 用户在 建立 库文件 结构 时 , 应
根据所存数据的具体情况规定字符型、数值 型、浮点型 这三 种字段 的宽 度 , 若有小 数部 分
则小数点也占一位。例如 , 设备最大价格定为 6 位整数与 2 位小数 , 则该字段的宽度应设
置为 9 位。其它类型字段的宽度均由 FoxP ro 统一规定 , 它们是 :
日期型 : 宽度为 8               逻辑型 : 宽度为 1
备注型 : 宽度为 10 通用型 : 宽度为 10
需要指出 , 库文件备注型与通用型字段宽 度的 10 个字 节仅用 于存 放信息 的地 址 , 即
・ 29 ・
有关信息在 FPT 文件中的实际储存地址。
4 . 小数位数
只有数值型与浮点型字段才有小数位数 , 小数位数至少 应比该字 段的宽 度值小 2 , 若
字段值都是整数 , 则应定义小数位数为 0。
如果把表 2 .1 中的数据组成一个库文件 , 参照上述规定 , 库文件的结构可设计如下 :

    字段名       字段类型     字段宽度   小数位数


编号 Character 5
名称 Character 6
启用日期 Date 8
价格 Numeric 9 2
部门 Character 2
主要设备 Logical 1
备注 Memo 10
商标 General 10

这里“部门”用两位代码表示。左面一位代码区 分车间 还是 科室 , 右面 一位 代码则 进一 步


区分是哪一个车间或哪一个科室。如“11”表示 办公 室 “
, 21”表示 一车间 等。部门 代码 虽
用数字表示但不需要进行数值运算 , 为此确定为字符型。在数据处理中 , 用代码来表示复
杂的数据不仅能节约 存 储量 , 简 化操 作 , 而 且有 利于 保 证数 据的 一致 性。如 部 门字 段 值
“一车间”若不用代码表示 , 输入数 据很 可能有“ 一车间”、
“ 1 车间”等 多种形 式 , 从 而将 造
成查询的困难。为实现计算机对代码的自动管理 , 还需要同时再建立一个代码库 , 用以指
明各代码所代表的具体含义 ( 代码库文件的结构与数据请参见本章的习题 ) 。
二、生成库文件的结构
Fox Pro 提供一系列的窗口与对话框用于生成库文件的结构。
1 . 定义新库文件结构
(1 ) 操作
选择 File 选单 ( 图 2 .1 ) 中 的 New 选项 , 在 随 后出 现 的 New 对 话 框 ( 图 2 .2 ) 的 File
Type 中单击 Table/ DBF , 再单击按钮 New 后便可在表结构窗口 ( 图 2 .3) 中输 入库文件 结
构。
(2 ) 说明
① 在 File 下拉选单的各项功能中 , 除 Close 用来关闭 当前使用 的窗口以 及 Exit 用 于
退出 FoxP ro 系统外 , 其余都是文件有关的操作。
② 在 New 对话框中列出各种待选 择的 文件 类型 , 用户 可以 用鼠 标单 击 其中 的某 个
选项以示选中 , 选中者以符号○
・标识。
③ 表结构窗口中部的各列 是用 户定 义库文 件结 构的处 所。在 输入所 定 义的 各字 段
内容时须注意 :
( i) 如果字段名少于 10 个字符 , Fox Pro 会自动补上空格。输入完毕后按 Tab 键或 者
用鼠标单击下一列 , 都可使光标移到右面的 Type 列上。各字 段的默认 类型为 Character ,
当鼠标单击 Character 右侧的箭头按钮后 , 将向下拉出 7 种字段类型 , 供用户选择使用。
・ 30 ・
图 2 .1   File 下拉选单 图 2 .2   New 对话框

图 2 .3   表结构窗口

( ii) 如果所定义的字段是 日期 型、逻辑型、备 注型 或通用 型 , 其字 段宽度 由系 统自 行


填入 , 其它型字段宽度的默认值为 10 , 用鼠标单击其右 侧的向上 或向下 箭头 , 可将宽度 调
整成预定值。数值型、浮点型字段在输入宽度后还需要在 Dec 列中填写小数位数 , 其它类
型的字段跳过 Dec 列而等待输入下一字段。
( iii) 若在输入字段内容时产生错误 , 可以通过 光标移动 键找到 要修改 的字段 名或 类
型 , 再输入正确的内容覆盖原来的错误内容。表结构窗 口右侧的 按钮 Insert 与 Delete 用
于在定义过 程中对字 段的增 删。如果把 鼠标按住 标记 T ag ( 用 于索引 , 详见 第三章 ) 的 左
侧符号 \进行拖曳 , 还可以重新调整各字段的排列次序。
( iv) 操作过程中若按了回车键 , Ct rl + W 或者按了按钮 OK 后 , 屏幕上将出现如图 2 .
4 所示的用于储存文件的 Save As 窗 口。若按 了 Cancel , 则 系统 进一 步用 对 话框 询问 是
否撤消本次输入的定义 , 选择 No 后再次返回 编辑状 态 , 选 择 Yes , 则 退出 编辑状 态而 返
・ 31 ・
回命令窗口。
④ 表结构窗口底部指示当前所生成库文件的有关状态。左侧是库 文件名 , 系统默 认
文件主名为 U ntitled ; 中间的 Fields 指示共定义了多少个字段 , 其初 始值为 0 ; 表示记录 长
度的 Leng th 初值为 0 , 随后便依次累加各字段的宽 度 , 但 最后的 累计值不 得大于 4000 个
字节。
2 . 储存库文件结构
(1 ) Save As 窗口 ( 见图 2.4 ) 说明

图 2 .4   Save As 窗口

① 在窗口左端的 Save Table As 下面的文本框 中可直接输入库文 件名以储存刚生 成


的库文件结构。
② 窗口中间显示了当前的磁盘驱动器与 当前目 录 , 使用 Drive 下 方右 侧的按 钮↓ 可
以更改当前盘 ; 用鼠标双击当前目录下面列表框中所显示的目录 , 可以更改当前目录。
③ 窗口右端的按钮 Save 用于存储库文件结构 , Cancel 则取消存储操作返回表结构窗
口。
④ 若选取复选框 All Files , 在窗口左端的文件列 表框 中将 显示当 前目 录下所 有的 文
件。
(2 ) 为库文件命名
库文件名的形式是 < 文件名 > .dbf, 其 中 < 文 件名 > 由 1 ~8 个字 符组成 , 扩 展名 由
系统统一规定。命名时需注意 :
① 不能用 A~J 作文件名 , 它们在 FoxPro 中另有专用 ( 参阅第 3 .3 .1 节 ) 。
② 命名时做到“见名知意”, 以便于记忆与识别。
③ 为方便用户对库文件的存取 操作 , 尽可 能以 字母或 汉语 拼音缩 写作 为 库文 件名。
例如 , 上述已定义的库文件可取名为 sb。
(3 ) 操作
在窗口的文本框中直接输入 sb .dbf , 再 单击 Save 按钮 , 屏 幕上 将显示 如图 2.5 的 对
话框。
此框说明库文件结构定义已经结束 , 下面将处理库文件的数据输入了。
・ 32 ・
图 2 .5   Input 对话框

2 .1 .2   库文件 数据的输 入

将库文件结构存盘 , 并在 Input 对话框中按了 Yes 后 , 屏幕上出现一个数 据输入窗 口


( 见图 2 .6 ) 等待用户输入数据。
一、数据输入窗口
从数据输入窗 口 可见 , 库文 件 的数 据 以
记录为输入单位。屏幕上各字段的排列次序
以及字段名右侧显示的光带宽度都与已经定
义的库文件结构相符。其中日期型字段的两
个间隔 符 号 已 在 相 应 的 位 置 中 标 出。 特 别
地 , 备 注型 与通 用 型字 段中 已填 有 memo 或
gen 等内 容 , 它 提 示 将 用 另 外 的 方 法 来 输 入
有关的数据。具体操作时需注意 : 图 2 .6   数据输入窗口
(1 ) 若 输入 数 据已 填 满 光 带 , 光 标 会 自
动移到下一字段等待输入 ; 若输入信息不足字段宽度 , 需按回车键才能把光标移到下一字
段。
(2 ) 逻辑型字段宽度为 1 , 它只能接受 T , Y, F , N 这 4 个字母之一 ( 不论大小 写 ) 。 而
日期型数据必须与系统的日期 格式相 符。若 需设置 系统 日期格 式为 美国 日期 格 式 mm/
dd/ yy , 只要在命令窗口中键入命令 SE T DA T E MDY 便可。
(3 ) 当光标定位于备注型或 通用型 字段 的“ memo”或“ gen”处 时 , 若当 前 记录 的该 字
段没有值要输入 , 按回车键便可跳过。这些字段值的输入方法下面将单独说明。
(4 ) 一个记录的数据全部 输入后 , 光 标自 动移到 下一 记录 的开始 位置 等待 输入。 如
果在新记录第一个字段的首字符 处按 回车 键或者 在数 据输入 过程 中按 Ctrl + W , 则输 入
数据存盘且返回命令窗口 , 按 Esc 或者 Ctrl + Q 则废弃本次输入的数据而返回。
二、备注型、通用型字段数据的输入
在库文件的数据输入窗口中 , 备注型与通用型字段分别显示出代 号“ memo”与“ gen”,
它们的值将在一个专用的编辑窗口中输入并 编辑。处 理结 束后还 需关 闭此编 辑窗 口 , 而
把值储存到与库文件同名而扩展名 为 FPT 的备注 文件 之中。 下面先 列出 这两个 字段 编
辑窗口的操作方法。
1 . 编辑窗口的打开与关闭
(1 ) 把光标定位于“ memo”或“ gen”处。
・ 33 ・
(2 ) 按 Ct rl + PgDn , Ctrl + Pg U p, Ct rl + Home 等组 合键 中的一 个或 用鼠 标双 击都 能
出现与之相应的编辑窗口。
(3 ) 当数据输入、编辑结束后 , 按 Ctrl + W 能储 存 数据 并返 回数 据输 入 窗口 , 按 Ctrl
+ Q 或 Esc 则能废弃当前所输入的 备注 信息而 返回。 除此 之外 , 还可 用鼠 标双击 编辑 窗
口的选单控制框来关闭。
(4 ) 在备注型或通用型字段 数据输 入后 , 该记 录的“ memo”或“ gen”中 的 第一 个字 母
被改成大写 , 变为“ Memo”或“Gen”。
2 . 备注型字段数据的输入
在备注型字段的编辑窗口中 , 可以依次输入或修改当前记录的备注信息。作为练习 ,
读者可先后在 sb .dbf 的第一个记录与第 4 个记录的备注字 段中分 别输入备 注信息“从 光
华仪表厂租入”与“ 94 年 12 月封存”。若再配合使 用系统选 单中 Text 选单项 中的各个 功
能 , 便能像使用文本编辑程序编辑一个文本那样对备注信息进行各种编辑。例如 , 对备注
信息的显示字体、字型号、行距的设定以及各 种编排 等等。 读者可 自行 上机调 试 , 在此 不
再展开讨论。
3 . 通用型字段数据的输入
通用型字段储存多媒 体 数据。 它无 法由 Fox Pro 本 身建 立 , 而要 依靠 如 画笔 , Word ,
Excel 等其它 Windows 应用程序提供。所以在通用型字段数 据输入 中需要解 决如何实 现
外来数据的嵌入或连接。现以输入 sb .dbf 中的微机与轿 车的商 标为例 , 简单 介绍下面 两
种方法 :
(1 ) 通过剪贴板实现数据的嵌入
假定将 Windows 控制面板的图标用作第 5 个记录微机的商标。操作步骤如下 :
① 用 Alt + Tab 键切换到程序管理器 , 把主群组中的 控制面 板图标剪 下 , 复制到剪 贴
板。
② 再用 Alt + Tab 键切换回 Fox Pro, 将光标移到第 5 个记录商标字段的 gen 字样上 ,
通过双击鼠标或按键进入商标字段的编辑窗口。
③ 选择 Edit 菜单的 Paste 选项把剪贴板上 的控 制面 板图标 嵌入 编辑窗 口 , 如图 2 .7
所示。
上述第①步中的“ 把控 制面 板图 标 复制 到剪 贴板”,
可按照以下步骤操作 :
在键盘上按下 P rint Screen 键 , 将含有上述图标的整
个屏幕复制到剪贴板上 →启 动画 笔程序 → 在画 笔的“ 编
辑”选单中选定“ 粘贴”命令 , 把剪贴板上的图形粘贴到画
笔程序窗口→用“剪刀”工具剪下上述的控制面板图标→
在上述“编辑”选单中选择“复制”命令。
(2 ) 通过 OL E 实现数据的嵌入或连接
如欲以位 图 文 件 cars .bmp 中 的 一 辆轿 车 作 为 第 7 图 2 .7   通用型字段的编辑窗口
个记录轿车的商标 , 操作步骤如下 :
① 用鼠标双击第 7 个记录商标字段的 gen 字样 , 进入商标字段的编辑窗口。
・ 34 ・
② 选择 Edit 菜单中的 Insert Object 选项 , 屏幕弹出形如图 2 .8 的插入对象对话框。

图 2 .8   插入对象对话框

③ 在 Insert Object 对话框中选择画笔图片后按 OK , 并在随后 出现的画 笔窗口中 通


过 File 菜单打开图片文件 cars .bmp , 再用画笔的“ 剪刀”工 具和“复制”命令将 cars 图形 复
制到剪贴板。
④ 回到第 7 个记录商标字段 的编 辑窗 口 ; 在 Edit 菜 单 中选 择 Paste Special 选 项 , 并
在随之出现的对话框中选定按钮 Paste ( 实现“ 嵌入”) 或 Paste Link( 实现“ 连接”) 。
当 OLE 对象本身变化时 , 用连接方式 储存的 通用 型字 段数据 会同 步地改 变 , 而用 嵌
入方式储存的数据却不会自动发生变化。
三、库文件的关闭
数据输入结束后 , 为防止数据的丢失 , 还需进行关闭库文件的操作。下面是关闭库文
件的几种常用方法 :
1 . 在命令窗口中键入命令 USE 后按回车键。
2 . 使用 View 窗口中的 Close 按钮。
在 Windows 选单中选择 View , 并 在 View 窗口 中 单击 Close 按 钮 , 随后 再双 击 View
窗口的控制选单框以关闭 View 窗口。
3 . 通过退出 FoxP ro 来关闭库文件。
在 File 选单中选择 Exit 或在命令窗口中键入 Q U IT。

2 .1 .3   库文件 内容的查 看

库文件建立后 , 常需要对文件进行查看内容、编辑修改等操作。为此必须先把库文件
打开 , 操作结束后又必须及时关上 , 以防止数据丢失。
一、在 Open 窗口中打开库文件
操作 :
在 File 中选择 Open , 再在 Open 窗口 ( 如图 2 .9 所示 ) 中选择待打开的文件 , 随后单击
Open 按钮。
说明 :
( 1) 选择待打开的文件有两种方法 , 其一是在 File Name 下面的文本框中直接键入文
件名 , 其二是在文件列表框中进行选择。
(2 ) 窗口左侧下方 List Files of Type 的下拉式 列表框可 以对文 件列表框 中显示的 文
件类型进行选择 , 系统默认扩展名为 DB F 的库文件。
・ 35 ・
图 2 .9   Open 窗口

(3 ) 窗口右侧的复选框 Read Only 被选中后 , 则对当前打开的库文件只能读取其数据


而不能修改 ; 复选框 Exclusive 适用 于网络 系统 , 若 被选中 , 则 能独 享所 打开 的 库文 件 , 网
络中的其它用户就不能再打开使用 ; Environmen t 决定是否自动设定环境参数格式文件。
(4 ) 在 Open 窗口中只能打开一个库文件 , 若 再打 开另 一个 , 则前 一个 被打开 的库 文
件会自动关闭。已打开的库文件在文件列表 框中呈 灰色 显示。库 文件 被打开 后 , 其中 的
数据即陆续调入内存 , 等待进一步处理。
(5 ) 被打开的库文件称为当前库文件。 FoxP ro 为 当前 库文件 设置 了一 个记录 指针 ,
它是一个指示器 , 始终指向当前库文件中正在进行操作处理的那个记录 , 此记录也被称为
当前记录。库文件刚打开时 , 记录指针指向第一个记录。
二、在 Browse 窗口中查看库文件内容
在 Database 选单项中选择 Browse 可打 开如 图 2 .10 所 示的 Browse 窗 口 , 与此 同时 ,
在系统选单中将新增选单项 Browse , 并在其中列出查看库文件内容的有关功能。

图 2 .10   Browse 窗口

1 . 库文件的两种显示方式
在 FoxP ro 中 , 库文件有两种显示方式 : 一种如图 2 .10 所示 , 一个记录占表格的一行 ,
另一种则为一个字段占一行 , 即一个记录的 各字 段竖直 排列 的单 记录方 式 ( 参见 图2 .6 ) 。
・ 36 ・
若当前窗口显示为表格式 , 则在 Browse 选单 中可 找到 功能 Change; 选 择后 , 窗口 显示 改
为单记录方式 ( 为叙述方便 , 以后把前者称为 Browse 窗口 , 后者称之为 Change 窗 口 ) 。 同
时在 Browse 选单项中的相应功能也由原来的 Change 改为 Browse 了。
2 . 库文件内容的查看
在库文件的记录数或一个记录的字段数较多 的情 况下 , 通 常需通 过键 盘或鼠 标的 操
作才能看到库文件的全部内容。用 Tab 或 Shift + Tab 可选择字段。在 Browse 窗口中 按
↑ 或 ↓ 能在各记录间转换 , 而按 P gDn 与 PgU p 则一次能翻转一屏。在 Change 窗口 中
按↑ 或 ↓ 只能在某个记录的各字段间转换 , 按 PgD n 或 PgU p 则能转到当前记录的下一
个或上一个记录的相应字段。为选择某个字段也 可用 鼠标 单击该 字段 , 若 在水平 或垂 直
滚动条上用鼠标单击滚动条两端的箭头或拖曳其中的滑块都能使库文件记录内容在窗口
中滚动。
3 . Browse 窗口的分割与关联
(1 ) 窗口的分割
Browse 窗口左下角有一黑色 小方 块 , 它 是用 于分 割窗 口 的分 割器 , 把 鼠 标按 住此 分
割器向右拖动 , 便可 把窗口一分为二。另 外 , 在 Browse 选单项中选择 Resize Partitions 功
能后也可利用光标移动键达到同样目的。
(2 ) 活动窗口
Browse 窗口分割后 , 光标所在的 窗口 称为活 动窗 口 , 除用鼠 标操 作 外还 可用 Browse
选单中的 Change Partition 来改变活动窗口。只有活动窗口的显示内容允许改变。
(3 ) 窗口的关联
经分割后的两个窗口通常是关联的 , 就是当记录在一个窗口滚动时 , 另一窗口中的记
录也随之 而 动。 这 样 , 同 一 记 录 必 然 在 两 个 窗 口 同 时 看 到。 选 择 Browse 选 单 项 中 的
Link Partition( 消除该选项前 的“ ”) 可解 除 这种 关 联。此 后 当记 录 在 一个 窗 口中 滚 动
时 , 另一窗口的记录保持不动 , 这样就能在一幅 屏幕上 查看 到更多 的记 录内 容 , 也 便于 在
库文件的前后记录之间进行对照。重新在该选项前打“ ”后 , 又能恢复关联。
图 2 .11 中示出了两种不同方式显示库文件内容的两个窗口。

图 2 .11   Browse 窗口的分割


4 . 库文件显示形式的改变

・ 37 ・
Browse 选单项中的 Grid 功能用以控制库文件显示形式中行列之间的格线是否出现 ;
Fon t 功能可改变显示内容的字体与字型号 ; Move Field 与 Size Field 则可改变库文件各字
段显示的次序与宽度 , 而用鼠标拖曳字段或字 段右面 的分 割线 到指定 位置 也能达 到同 样
目的。但须指出 , 这些操作仅改变记录的显示形式 , 不会使已定义的库文件结构与数据发
生任何变化。

2 .2   FoxPro 的命令工作方式
Fox Pro 是一个多工作方式的数据库管理系统 , 不同的用 户可以 使用各种 不同的方 式
来运行 FoxP ro。就以建立与查看数据库文件来说 , 既能如前 所述那 样通过选 单对话框 进
行操作 ; 也可以像 Foxbase 那样直接键入相应命令来交互式地使用 Fox Pro ; 当然也允许在
Fox Pro 环境下使用程序工作方式 , 那就是将 Fox Pro 命令 先编成 程序储存 起来 , 需要时 再
调用执行。本书重点介绍 FoxP ro 应用程序的 开发 , 因 此 , 随着 内容的 展开 必然会 将重 心
由选单操作方式转向命令工作方式 , 进而转向程序工作方式。
为方便读者逐步掌握 FoxP ro 的命令工 作方式 , 本 节首 先介绍 一些 有关 的预备 知识 ,
包括 FoxP ro 的命令和命令子句、表达式、数组和函数等 , 然后对命令窗口的使用作简要 的
说明。

2 .2 .1   FoxPro 的命令 和命令子句

一、建立和查看库文件的 FoxPro 命令
在命令窗口中键入一条 FoxP ro 命令并按 回车 键后 , 该 命令立 即被 执行 , 命令 执行 的
输出结果出现在 FoxP ro 的主窗口中。作为示例 , 下面以最简形式列出用于建立与查看 数
据库文件的几种命令。

    命令格式                           功能
① CR EATE < 文件名 > 生成新库文件结构
② USE [ < 文件名 > ] 打开指定的库文件 , 缺省可选项则关闭当前库文件
③ LIST/ DISPLAY ST RUC TUR E 显示当前库文件的结构
④ LIST/ DISPLAY ALL 显示当前库文件的全部记录内容
⑤ BROWSE 屏幕上弹出 Browse 窗口

二、FoxPro 命令中的常用子句
Fox Pro 命 令 一 般 都 带 有 各 种 各 样 的 命 令 子 句 , 以 实 现 它 的 强 大 功 能。 例 如 ,
BROW SE 命令就有 30 多个命令子句 , 它们覆盖了比前面所 述 Browse 窗口的 操作更多 的
功能 , 例如 , 使用带有如下子句的 BROWSE 命令就能在 显示形 式中把 库文 件各字 段的 名
称改掉 :

    BROWSE FIELD < 原字 段名 1 > ∶H = < 新 字段 名 1 > [ ; < 原 字段 名 2 > ∶H = < 新字 段 名 2 >
……]

    本书不准备一开始就给出各命令的完整格式 , 而是从实用、循序渐进的角度逐步介绍
・ 38 ・
各条命令。在此 , 先介绍 FoxPro 命令的几个常用子句以及 FoxP ro 命令的书写方法。
1 . 四种常用命令子句
多数 FoxP ro 命令带有 [ < 范围 > ] , [ FOR < 条件 > ] , [ WHILE < 条件 > ] 与 [ F IE LDS
< 字段名表 > ] 等 4 个常用子句。
(1 ) 范围子句
用户通过此子句来指明当前命令操作所涉及的记录范围 , 它又有 4 种选择写法 :
① ALL             表示对库文件的全部记录进行操作。
② N EXT < n > 这里 n 是正整数 , 表示只对从当前记录开始 的共 n 个记录进 行
操作。
③ RECORD < n > 指明操作对象是库文件的第 n 号记录。
④ REST 对从当前记录起到文件尾的全部记录进行操作。
(2 ) FOR 子句
FOR 子句由保留字“ FOR”与某 个指 定的 条 件组 成。如 : FOR 价格 > 50000 , FOR 名
称 = ″车床″等。它指明当前的操作只对指定范围中 那些符 合给定条 件的记录 进行。如 果
在命令窗口中键入

    USE sb
LIST NEXT 5 FOR 价格 < 10000

就能在主窗口中查看到 sb 文件头 5 个记录中价格 < 10000 的记录内容。


(3 ) WHILE 子句
它也用于指明记录进行的操作条件 , 但与 FOR 子句比较有如下不同 :
① 若命令中缺省范围子句而有 FOR 子句时 , 则默认范围为 AL L , 即在库文件全部记
录范围中按条件筛 选 ; 而在 同 样 的 情 况下 , WHILE 子 句 则 只从 当 前 记 录 开始 按 条 件 筛
选。
② 当发 现 一 个 记 录 不 满 足 条 件 时 , FOR 子 句 能 跳 过 该 记 录 继 续 检 查 下 去 , 而
WH IL E 子句只操作到这个不满足条件的记 录为止 , 就不 再检 查下去 了。例 如 , 将 上述 命
令中的 FOR 子句改为 WH ILE 子句 , 即 :

    LIST NEXT 5 WHILE 价格 < 10000

由于库文件 sb 的首记录就不满足条件 , 因此命令执行后就一个记录也显示 不出来。若 一


个命令中同时有 FOR 子句与 WH ILE 子句 , 则优先处理 WH ILE 子句。
(4 ) FIELDS 子句
用以指明当前的操作涉及到库文件的哪些字段。其写法是 FIELDS 后跟有关的字 段
名 , 但两个字段名之间需用“ ,”隔开。如 :

    LIST NEXT 5 FI ELDS 编号 , 名称 , 价格

执行后 , 将列出 sb 内从当前记录开始的 5 个记录中的编号、名称与价 格。如果说 , 范围 子


句、FOR 子句与 WHILE 子句能把库文件中需要操作的记录筛选出来 , 而 F IE LDS 子句能
确定需要操作的字段。在命令中灵活地使用多个 子句 , 将 大大 地增强 各命 令的数 据处 理
・ 39 ・
能力。
2 . 命令和子句的书写规则
(1 ) 每个 FoxPro 命令都由命令动词开始 , 但第一个符号不能是空格。
(2 ) 命令动词与子句、子句与子句、子 句中的各 部分 ( 如 NEX T 与 5 , FOR 与条 件 ) 之
间必须以一个或多个空格隔开 , 至于各个子 句的 书写次 序可 以任 意。若把 上述命 令改 写

    LIST FI ELDS 编号 , 名称 , 价格 NEXT 5

执行的结果没有变化。
(3 ) 命令动词与各子句中的 保留 字 , 包括以 后将 介绍的 函数 名都 可简写 为前 4 个 字
符 , 而且对其中出现的英文字母 , 使用大小写等效。
(4 ) 一行只能写一条命令 , 而一条命令的长度不能超过 2048 个字符。如 果命令长 度
超过屏宽 ( 通常是 80 个字符 ) , 则可在适当的位置上键入续行符“ ; ”并回车 , 然后在下一行
再继续键入该行内容。
三、数据的选择显示
1 . DISPLAY 与 LIST 命令
为能理解与掌握 FoxP ro 命令中常用子句的使用方法 , 这里举出用于显示库文件数 据
的 LIST 与 DISPLAY 命令作例子。虽然在 Fox Pro 环境中这两条命令并没有相应的选 单
操作 , 但它们直观、实用 , 自 dBASE 与 FoxBASE 以来一直被广泛使用。
命令格式 :

    DIS PLA Y | LIST [ [ FI ELDS ] < 表达 式 表 > ] [ < 范 围 > ] [ F OR < 条 件 > ] [ WHILE < 条 件 > ]  
[ O FF ] [ TO PRINT [ PROMP T ] | TO FI LE < 文件 > ]

    功能 :
用于选择输出库文件中的记录数据 , 也可用于显示表达式的值。
说明 :
(1 ) 可选项 F IE LDS < 表达式表 > 中的表达式 ( 详 见 2 .2 .2 节 ) 可 直接 使用库 文件 中
的字段名 ( 包括备注型字段 ) , 也可以是含有字段名的表达式 , 甚至是与库文件毫无关系的
表达式。表达式之间须以逗号分隔 , 保留字 F IE LDS 可省略不写。若命令中无此子句 , 则
显示当前库文件除备注型、通用型字段外的所有字段。
(2 ) 可选项 < 范围 > 、FOR < 条件 > 与 WHILE < 条件 > , 用于选择显示指定 范围或/
与符合条件的记录。若命令中缺省 < 范 围 > , 仅有 FOR < 条件 > , 则 系统 默 认范 围的 值
为 All。
(3 ) 为能有效地管理数据库 , Fox Pro 在建立库 文件时 会按 数据输 入的 先后次 序把 记
录编号。在用本命令显示库文件记录数据时 , 会 将各记 录编 号同 时显示 出来。若 要求 记
录编号不同时显示出来 , 只须在命令中使用 OFF 可选项便可。
(4 ) 使用子句 TO P RIN T 或 TO F IL E 可将显示 信息同时 传送到 打印 机或指 定的 文
件 , 若在 TO P RIN T 中再选用 P ROMP T 就能在打印前先弹出一对话框 , 供用户调节打 印
机的设置。
・ 40 ・
(5 ) < 范围 > 与 < 条件 > 可选 项均缺 省时 , 则 LIST 默 认为 ALL , 而 DISPLAY 默 认
为当前记录 ; 又 LIST 与 DISP LAY ALL 的主要区别在于前者以 滚动方式 输出 , 后者则 为
分屏输出。
[ 例 2-1]   按下列要求显示库文件 sb .dbf 的有关信息。
USE sb           ( 打开库文件 )
(1 ) 列出头 3 个记录 :

    LIST NEXT 3

    (2 ) 列出部门代码为″
21″( 一车间 ) 的编号、名称与备注 :

    LIST 部门 , 编号 , 名称 , 备注   F OR   部门 = ″21″

    ( 3) 列出 88 年 以 前 启 动 的 设 备 的 编 号、名 称、价 格 与 启 动 日 期 , 其 中 价 格 按 9 折
处理 :

    LIST   编号 , 名称 , 价格 * 0 .9 , 启动日期 FOR YEAR( 启动日期 ) < 1988 OF F

    ( 注 : 函数 YEAR( ) 能从启动日期中求出公元年历值。详见 2 .2 .2 节 )
2 . 预设过滤器与字段表
在命令中使用可选项来实现选择显示只能在执行该命令时生效一次。本节所介绍的
过滤器与字段表一旦设置后 , 便能对有关库文件随后执行的任何操作命令都生效 , 从而为
数据处理带来更大的方便。
(1 ) 预设过滤器
命令格式 :

    SE T F ILT ER TO   [ < 条件 > ]

    功能 :
用于预设过滤条件或过滤器。使命令只对 当前库 文件 中满足 条件 的记 录进行 操作 ,
似乎文件中只包含了满足条件的记录一样。
说明 :
① 命令中缺省可选项表示取消已设置的过滤条件。
② 对当前库文件只能设置一个过滤器 , 若连设两个 , 前一个过滤条件被自动取消。
例如 , 执行下列命令

    USE sb
SE T F ILT ER TO 价格 > 10000
LIST

以后 , 在 FoxPro 的主窗口中只能列出价格大于 10000 的 5 条记录。


(2 ) 预设字段表
命令格式 :

    SE T F IELDS TO [ < 字段名表 > | ALL ]


・ 41 ・
SE T F IELDS ON | O FF
CLEAR FI ELDS

    功能 :
SE T FIE LDS TO 命令用于在内存中预设一 个“ 字段表”( 其中 AL L 表 示当前 库文 件
的全部字段 ) , 使用户只能对字段表中“榜上 有名”的字 段进 行访问 , 似 乎库 文件就 只有 这
些字段一样。
说明 :
① 字段表可以逐步形成。即允 许多 次使 用 SE T F IE LDS TO 命 令把 所 需的 字段 累
加到字段表中 , 但不能含有备注型字段。
② 系统为已经建立的字段表设 置一 个控 制开 关。系 统处 在 SE T F IE LDS ON 状 态
下 , 字段表生效 , 即用户只 能对 字段 表中的 字段 进行存 取 ; 在 SE T FIE LDS OFF 状 态下 ,
已建立的字段表无效 , 用户仍可存 取库 文件中 所有 的字 段。系统 默认 为 OFF 状态 , 但 当
用 SE T FIELDS TO 命令设置字段表时 , SE T F IE LDS 自动置为 ON 状态。
③ 用下面两种方法可删除字段表中的字段
( i) 不带可选项的 SE T FIELDS T O 命令 , 能删除字段表中属于当前库文件的所有 字
段名。
( ii) CL EAR FIE LDS 命令 , 能把 字段 表全 部 删除 , 然 后自 动执 行 一条 SE T F IE LDS
OFF 命令。
例如 , 执行下列命令

    USE sb
SE T F IELDS TO 编号 , 名称
SE T F IELDS TO 价格
LIST FOR 价格 > 10000

后 , 将列出的 5 条记录内容中只包含编号、名称与价格 3 个字段 , 如果再键入命令

    SE T F IELDS TO
LIST FOR 价格 > 10000

后 , 屏 幕主 窗口中 将会 显示“变 量找 不到”的 提示 信息。那 是因 为执行 SE T FIELDS TO


命令后 , 当前库文件所有字段名已从字段表中删去 , 故当执 行 LIST 命令去访 问字段表 时
会提示出错。如 果此时再 键入命 令 SE T F IELDS OFF 即宣告字 段表无效 后 , LIST 命 令
则又能把全部记录内容显示在主窗口中 , 若把上面的 SE T F IE LDS TO 命令改 用 CLEAR
F IE LDS 命令代替 , 由于它能自动执行一条 SE T F IE LDS OFF 命令 , 所以执行 LIST 命令
后也不会提示出错。
设置过滤器与字段表后 , 仍然可以在有关的操作命令中再设置相应的可选项 , 它们都
对当前的数据操作起作用 , 但以前者优先 , 即数 据先经 过过 滤器与 字段 表的 选择 , 然后 再
在操作命令时按所设置的可选项再作进一步的选择。
四、范围对话框与表达式构造器
上述 4 个常用子句的功能 , 在 Fox Pro 中也 可通 过选 单操作 来实 现。此时 , 在 有关 命
・ 42 ・
令的对话框中将显示出一个包含 Scope, For , While 等选项 的复选框 , 分 别代 表范围 子句、
For 子句等功能。如果用户选了这些选项 , 屏幕 上就会弹 出相应 的对话框 , 帮助 用户选 择
命令的操作范围或条件。这对不熟悉命令子句的初学者尤为方便。现以下节 ( 第 2 .3 节 )
即将介绍的替 换 命 令 Replace 为 例 , 它 含 有 Scope 等 3 个 子 句。 当 用 户 在 系 统 选 单 的
Record 选单中选用 Replace 功能 后 , 在 屏幕 上 就 出 现 如图 2 .12 所 示的 Replace 对话 框。
由图可见 , 在对话框左上方列出了当前库文件的各个字段名 , 右上方则提供对 3 个子句的
选择 , 用鼠标单击其中任 何一 个 , 将 分别 在屏 幕上 弹 出范 围对 话框 或表 达 式构 造器 对 话
框 , 如图 2 .13 或图 2 .14 所示。

图 2 .12   Replace 对话框 图 2 .13   范围对话框

图 2 .14   表达式构造器对话框

・ 43 ・
1 . 范围对话框
其中列出了对 < 范围 > 子句的各种选项。若选中 Next 或 Record , 位于其右侧的文本
框会变亮 , 等待用户输入一个数值 < n > 。范围选定后按 OK 确定 , 按 Cancel 则取消。
2 . 表达式构造器对话框
用于生成一个逻辑表达式 , 形 成 For 子句或 While 子 句的 条件。 框中 下 侧提 供了 当
前库文件的各个字段变量和系统内存变量 ; 上 侧的 4 个下 拉式 列表框 则能 按运算 符与 函
数值的所属类型 , 分类列出 Fox Pro 各种运算符与各个函数 , 供用户选择使用 ; 对话框的 中
间则是生成表达式的处所 ; 框 中右上 角有 3 个 按钮 , 其中 的 Verify 用 于检 验 所生 成的 表
达式是否合法。

2 .2 .2   表达式 、数 组与函数

一、FoxPro 表达式及其组成成份
为能正确地使用 FoxP ro 命令中的各 种子 句 , 就应 熟练地 掌握 FoxP ro 表达式 的构 成
规则。上述 FIELDS 子 句 中 出 现 的 各 个 字 段 名 以 及 FOR 子 句 中 出 现 的 条 件 如 价 格
< 10000 , 名称 = ″车 床″等 都是 FoxPro 表 达式。 下面先 对组 成表达 式的 各个 成份 分别 予
以介绍。
1 . 常量
在命令操作或程序运行过程中 不变 化的 数据 称 为常 量 , FoxPro 常 量有 字符 型、数 值
型、逻辑型与日期型等 4 种。
(1 ) 字符型常量
是用单引号、双引号或方括号等定界符 括起来的 字符序列 ( 又 称字符串 ) 。如″车床″,

038-1′, [ it’s] 等。注意 : 定界符必须成对使用 , 如 果字 符串 本身已 含有 某一定 界符 , 则 该
字符串的定界符应改用其它两种。另外 , 字符串中英文字母的大小写要严格区分。
(2 ) 数值型常量
数值型常量可为正负号、数字与小数点所组成的数 , 也可以是用科学记数法所表示的
数。如 18 , - 21 .34 , 0 .235E2 等。
(3 ) 逻辑型常量
用 .T ., .Y .表示“ 真”, .F ., .N .表 示“假”, 字 母的 大小 写 不论 , 但 每个 字 母两 旁的 圆
点不可省。
(4 ) 日期型常量
用以表示日期。Fox Pro2 .5 for Windows 的 日期 要用 花括 号括 起 来。如 96 年 12 月
30 日应写为 {96/ 12/ 30}。
2 . 变量
在命令操作或程序执行期间 可任 意改 变其 值的 量 称为 变量。 Fox Pro 有 字段 变量 与
内存变量两种 , 除此以外 , 还可使用数组。
(1 ) 字段变量
在库文件 sb .dbf 中 , 编号、名称、价格等字段的 值都随 着记录的 不同而变 化。它们 称
为字段变量。显然 , 字段 变量 只有 在 库文 件打 开后 才能 使 用。如 前所 述 , 字 段 变量 有 字
・ 44 ・
符、数值、浮点、逻辑、日期、备注与通用等 7 种类型。
(2 ) 内存变量
① 内存变量的种类
与字段变量不同的 是 , 内 存 变 量与 库 文 件无 关。 Fox Pro 的 内 存 变 量 又可 分 为 下 面
两种 :
( i) 系统内存变量
由下划线开头命名的一批系统内存变 量是 由 FoxPro 系 统自身 提供 的。在程 序中 使
用它们可以控制打印机与屏幕的输出格式 , 或处理 有关 计算 器、日 历、剪贴 板等方 面的 信
息。例如 , 系统内 存变 量 - DOS 可用 于判断 所用 Fox Pro 的版 本 ; 而 - CLIP T EXT 则可 用
于存取剪贴板的内容。系统内存变量不能删除。
( ii) 用户定义的内存变量
它是一种临时工作单元 , 用来保存数据处理过程中的有用信息 , 由用户根据需要设置
或删除。内存变量信息一般存于内存中 , 如 有需 要也可 以文 件的 形式储 存起 来。内存 变
量有字符、数值、逻辑、日期与屏幕等 5 种类 型 , 其中屏 幕型 可用于 储存 整幅 屏幕的 信息。
内存变量在使用之前必须先定义 , 即给它们赋以初值。
② 内存变量的赋值命令
命令格式 :

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


STOR E < 表达式 > TO < 内存变量表 >

    内存变量的取名规则与字段取名规则相同。
功能 :
计算表达式的值 , 并把该值赋给指定的一个或几个内存变量。
例如     s = ″ABC″
STOR E 2 * 3 TO a , b , c

③ 内存变量文件的建立与调用
命令格式 :

    SAVE TO < 内存变量文件名 > [ ALL LIKE | EXCEPT < 通配符 > ]
R ESTOR E FROM < 内存变量文件名 > [ ADDI T IVE ]

    功能 :
SAVE 命令能把指定的内存变量 储存 在内 存变量 文件 里 , 而 RESTORE 命令 则能 把
指定内存变量文件中的内存变量调入当前的内存备用。
说明 :
( i) 在 < 通配 符 > 中 允 许 使用 符 号“ ?”( 代表 单 个字 符 ) 与“ * ”( 代 表 一个 或 多 个 字
符 ) 。可选项 [ AL L LIK E < 通配符 > ] 表 示 储存 与通 配符 相匹 配 的内 存变 量 ; [ ALL EX-
CE PT < 通配符 > ] 表示除去与通配符相匹配的 变量以 外的 所有内 存变 量 ; 缺省可 选项 则
储存全部内存变量。如 :
・ 45 ・
    SAVE TO A∶f1

把全部内存变量储存到 A 盘中名为 f1 的文件中去。

    SAVE TO f2 ALL L IKE A *

把所有以 A 为首的内存变量储存到当前目录中名为 f2 的文件中。

    SAVE TO f3 ALL EXCEPT ? B *

除第二个字符为 B 以外的所有内存变量储存到名为 f3 的文件中。


( ii) 内存变量文件的扩展名为 ME M。
( iii) REST ORE 命令中若缺省可选 项 [ ADDITI VE ] , 则 在调 入内 存变 量 文件 中的 变
量之前须先把当前的内存变量全部清除 , 否则清除工作不进行 , 只在原有的基础上把指定
文件中的变量添加进去。
④ 内存变量的清除
命令格式 :

    R EL EASE [ < 内存变量表 > ] [ ALL [ L IKE| EXCEPT < 通配符 > ] ]

    功能 :
清除当前内存中指定的内存变量。例如 ,

    R EL EASE a , b
R EL EASE ALL

    ⑤ 内存变量的显示
命令格式 :

    LIST MEM ORY [ L IKE < 通配符 > ] [ TO PRINT ]


DISPLAY MEMORY [ LIKE < 通配符 > ] [ TO PRINT ]

    功能 :
显示当前已定义的内存变量名、值、类型及其 作用 范围 , 并 同时显 示当 前内存 变量 总
的个数、字节数等。可选项 [ TO P RIN T] 能把屏幕显示信息输出到打印机。例如 ,

    y1 = 25 * 4
y2 = ″
abc″
y3 = .t .
LIST MEM ORY LI KE y ?

    此时在屏幕主窗口中显示下列内容 :

    Y1     Pub     N     100     (     100 .00000000)


Y2 Pub C ″
abc″
Y3 Pub L .T .

SAVE TO f ALL LI KE y ?

・ 46 ・
R EL EASE y1 , y2 , y3
LIST MEM ORY LI KE y ?

    由于 y1~ y3 已被清除 , 此时没有信息显示。但经 执行下述 两条命 令后 , 有关 y1~ y3


的信息重新又出现在主窗口中。

    R ESTOR E FROM f
LIST   MEMORY   L IKE y ?

    3 . 运算符
按照运算的性质与运算结果的类型 , 可把 FoxPro 所提供的运算符划分成如下四类 :
(1 ) 算术运算符
+ ( 加 ) , - ( 减 ) , * ( 乘 ) , / ( 除 ) , * * 或^ ( 乘方 ) , % ( 取模或称取余数 ) 。
例如 , 以下数值表达式
58 % 5 , 50 % 5
的输出结果分别是 3 与 0。
算术运算符的运算对象与运算结果均是 数值型 数据。 运算顺 序是 先乘方 , 再 乘除 与
取模 , 后加减 , 同一级别要从左向右。有圆括号时圆括号内先算 , 若有圆括号嵌套 , 则按先
内后外次序处理。
(2 ) 字符运算符
+ ( 字符串连接运算符 ) , - ( 尾部空格移位连接符 )
运算对象与运算结果都是字符型数据。例如 ,

abc     ″+ ″xyz″= ″
abc     xyz″而 ″
abc   ″- ″
xyz″= ″
abcxyz   ″。
(3 ) 关系运算符
< ( 小于 ) , > ( 大于 ) , = ( 等于 ) , < = ( 小于 等于 ) , > = ( 大于 等于 ) , < > 或 # ( 不 等
于 ) , = = ( 字符全同比较 ) , $ ( 字符串包含运算符 ) 。
关系运算符用来对两个数据或表达式进行比较 , 比较 的结果 成立则取 值为 .T ., 否 则
取值为 .F .。其比较规则是 :
① 数值型数据按数值大小 进行 比较 ; 日期 型数 据按 年、月、日 的先 后进 行 比较 ; 字 符
型数据按相应位置上两个字符 ASCII 码值的大小进行比较 ; 汉字按内码进行比较。
② 在 SE T EXACT OFF 状态下 , 用″= ″比较两个字符串时 , 只要″= ″右面的字符串 与
左面字符串的左端部分一样 , 系统就认为相 同。若用″= = ″进行比 较 , 则只有在 两个字 符
串的各对应字符都相同时 , 取值才为 .T .。例如 , 下列关系表达式

abc″< ″ 103″< ″
abd″,″ 7″,″王大明″= ″王″,″王大明″= = ″王″
的输出结果除最后一个为 .F .外 , 其余均是 .T .。
③ 运算符$只能比较两个字符 串 , 若 左面 的字 符串是 右面 字符串 的子 串 , 则 比较 结
果为 .T ., 否则为 .F .。例如 , 以下字符表达式

ab″$″ ab″$″
abc″,″ acb″
的输出结果依次为 .T .与 .F .。
关系运算符的优先级相同 , 按从左向右 , 圆括号内优先的顺序进行。
・ 47 ・
(4 ) 逻辑运算符
OR 或 .OR .( 逻辑或 ) , AND 或 .AND .( 逻辑与 ) , NOT 或 .NO T .或 ! ( 逻辑非 )
对逻辑型数据进行运算 , 结果是逻辑值。如果说关系运算符被用来描述某种条件 , 则
逻辑运算可用于描述复合的条件。如果若干条件 中只 须有 一个成 立便 进行选 择 , 则应 使
用 OR 来 描述 , 如果 必须 在多 个条 件 同时 成立 的情 况下 才 做选 择 , 则 要使 用 AND ; 至 于
NO T 则用于否定一个条件。一个表达式中如果出现多个逻辑运算 , 则它们的 优先级为 先
NO T 再 AND 后 OR , 使用圆括号可改变优先级。例如 :

            逻辑表达式                                 含义
名称 = ″车床″AND 价格 > 100000                     价格大于 100000 的车床
主要设备 OR year(启用日期 ) > 1988 主要设备或 1988 年以后启用的设备
! 主要设备 非主要设备
! 主要设备 OR 名称 = ″
车床″AND 价格 > 100000 非主要设备或价格大于 100000 的车床

    4 . 表达式
表达式是由常量、变量、函数用运算符与圆括号连接起来的用于描述数据之间运算关
系的一种形式。特别地 , 单个常量、变量与函数都是表达式。
表达式的运算结果是一个值 , 其类型由表达式值的类型确定 , 可分成字符型、数值型、
逻辑型与日期型四种。例如 :

        表达式                     表达式值                 表达式类型


86 .7 * SQRT (84 .5 * 2 ) 1127 .1 数值型
″ab″> ″
bb″OR ″
ac″< ″
ad″ .T . 逻辑型
″123″+ ″xy″ 123xy 字符型
{96/ 11/ 12} + 5 96/ 11/ 17 日期型

    为能构成合法的表达式 , 需注意 :
(1 ) 表达式中出现的变量必须是当前库文件的字段变量或者是 已赋过值 的内存变 量
或数组元素 , 否则系统将提示“ 变量找不到”。
(2 ) 各种运算一般只能在同 类型 的数据 之间 进行 , 唯有 日期 型数 据能通 过加 上或 减
去一个数值型数据而得到一个新的日期型数据。
(3 ) 当一个表达式中出现多 种类 型的运 算符 时 , 它们的 操作 顺序 是先进 行算 术运 算
与字符运算 , 再进行比较运算 , 最后才是逻辑运算。
(4 ) 逻辑表达式常被用来描述 FoxPro 命令中 FOR 子句及 WH IL E 子句中的条件。
二、数组
数组是按一定顺序排列的一组内存变量 , 数组中的各个变量称为数组元素 , 数组元素
用数组名以及该元素在数组 中排 列 位置 的下 标 一起 表 示。例 如 , x ( 1 ) , x ( 2 ) 与 a ( 2 , 1 ) ,
a( 1 , 3) 等。数组元素中下标的 个数 称 为数 组的 维数 , 这里 x 是一 维数 组 , a 是 二维 数组。
在 FoxP ro 中 , 只能使用一维与二维数组 , 而且要先定义再使用。
1 . 数组的定义
命令格式 :
・ 48 ・
    DIMENSION | DECLARE < 数组名 > ( < 下标 1 > [ , < 下标 2 > ] ) [ , < 数组名 > ( < 下标 1 >
[ , < 下标 2 > ] )…… ]

    功能 :
定义一维或二维数组名 ( 数组的取名规则 与字段 名取 法相 同 ) , 以 及有 关数组 各下 标
的上界值。各下标的下界值由系统统一规定为 1。例如 , 命令

    DIMENSION x (3) , a (2 , 3)

分别定义了名为 x 的一维数组与名为 a 的二维数组 , 数组 x 有 3 个数组元素 , 依次表示 为


x(1 ) , x (2 ) 与 x( 3) , 数组 a 的 6 个元素分别表示为 a (1 , 1 ) , a( 1 , 2) , a (1 , 3 ) , a( 2 , 1) , a( 2 , 2)
与 a( 2 , 3) 。
理论上 , 标准版本的 Fox Pro 允许同 时存 在 3600 个 分别 包含 3600 个元素 的数 组 , 在
扩充版本中 , 甚至可达 65000 个分别含 65000 个元素的数组。但实际上 , 数组元素的最大
数仍然依赖于可用内存。
2 . 数组的赋值
(1 ) 一个数组中各元素的取 值类 型可以 互不 相同 , 同一 个元 素的 取值类 型也 可先 后
不同。系统规定 , 各数组元素的初值均为逻辑值 .F .。
(2 ) 用赋值命令可为数组元素赋值 , 也可为整个数组的各个元素 赋以相同 值。例如 ,
使用命令
a=8
就可为上面定义的二维数组 a 的 6 个元素都赋以同样的初值 8。
(3 ) 二维数组各元素在内存 中按 行的顺 序存 储 , 它们也 可按 一维 数组元 素的 顺序 来
存取数据。如上述二维数组 a 中的元素 a ( 2 , 2) 是排 在第 2 行 第 2 列 , 由于 每一行 是 3 个
元素 , 所以 a (2 , 2 ) 也可按 a( 5) 表示。
三、函数
函数用来实现数据处理中常用的特定运算与操作 , FoxPro 可 提供 280 多个函数。 除
个别函数外 , FoxPro 函数总是后跟一 个圆 括号 , 不管 该函 数是 否需 要 参数。 对函 数的 各
个参数都有其规定的数据类型 , 使用时必须与规定相符。通常函数都有一个返回值 , 按返
回值的数据类型还可以把函数划分为字符型、数值型、逻辑型与日期型等 4 种。
本节先介绍几个常用函数 , 另有一部分 函数 待用到 时再 介绍。函 数值 常用输 出命 令
显示 , 下面先介绍一种输出命令。
1 . 输出命令
命令格式 :

    ? | ? ? < 表达式值 >

    功能 :
依次计算并显示各表达式的值。? 与 ?? 的 区别 在于 ? 在显示 表达 式内容 之前 , 先 发
送出一个回车换行符 ; 而 ? ? 则不发出回车换行符。
例如 , 键入下列命令 :
・ 49 ・
    ? 169 ,″efgh″, 68 * 3 .6
USE sb
?″名称∶″, 名称

则在 FoxP ro 的主窗口中将出现下面的输出结果

    169   efgh   244 .8


名称 :   车床

    输出命令不但能把常量以原样显示出来 , 还能显示内存变量、当前记录字段变量和表
达式的值。
2 . 几个常用函数
在函 数 格 式 中 , 函 数 的 参 数 用 表 达 式 表 示。 为 叙 述 方 便 起 见 , 下 面 用 < expC > ,
< exp N > , < expL > , < expD > 分别表示字符型、数值型、逻辑型、日期型表达式。
(1 ) 字符串截取函数
命令格式 :

    SUBST R( < expC > , < expN1 > [ , < expN2 > ] )
LEF T ( < expC > , < expN > )
RIGHT ( < expC > , < expN > )

    功能 :
L EF T 与 R IGHT 分别从给定字符串表达式的 左面或右 面开始 截取由 < exp N > 所 确
定字符 个 数 的 子 串 , 而 SUBST R 则 从 由 < expN1 > 指 定 的 位 置 开 始 截 起 , 共 截 取 由
< exp N2 > 所确定的字符 个数。 若 缺 省其 中 的 第 3 个 参 数 则 一直 截 取 到 最 后一 位。 例
如:

    ? LEFT (″陈小英″, 2) , RIGHT (″陈小英”4 , ) , SUBST R(″陈小英″, 3 , 2 , )

输出结果应是陈 , 小英与小。
(2 ) 字符串查找函数
命令格式 :

    AT ( < expC1 > , < expC2 > [ < expN > ] )

    功能 :
当 < expC1 > 是 < expC2 > 的 子 串时 , A T 函 数 能 返 回 < expC1 > 在 < expC2 > 中 第
< exp N > 次出现的开始位置 , 否则函 数 的返 回值 为 0 。由 此可 从函 数的 返 回值 是否 为 0
来确定一个字符串是否为另一字符串之子串。例如 ,

    ? AT (″型″,″微型机″) , AT (″形″,″微型机″)

输出结果分别是 3 与 0。
(3 ) 大小写字母的转换函数
命令格式 :
・ 50 ・
    LOWER( < expC > )
UP PER( < expC > )

    功能 :
LOWER 函数能把大写字母转换为小写字母 , UPPER 函数则刚好相反。例如 ,

    k = ″n″
? U P PE R( k) = ″N″

其输出值为 .T ., 可见利用这两 个函数 使之 能忽 略变 量 中所 存字 母的 状态 是 大写 还是 小


写。
(4 ) 空格函数与压缩空格函数
命令格式 :

    SPACE( < expN > )


ALL TRIM ( < expC > )

    功能 :
SPACE 函数能 返 回 一 个 由 空 格 所 组 成 的 字 符 串 , 空 格 个 数 由 < expN > 指 定。
ALL TRI M 函数则能把 < expC > 的前后空格符都删除。
(5 ) 类型转换函数
命令格式 :

    STR ( < expN1 > [ , < expN2 > ] [ , < expN3 > ] )
CTOD( < expC > )
DTOC( < expD > )

    功能 :
STR函数能把数值 < expN1 > 转 换为 长 度由 < expN2 > 确定 , 小数 位数 由 < expN3 >
确定的字符串。若函数参数中 < expN3 > 缺省 , 则 作整 数处理 , < exp N2 > 同 时缺 省取 固
定 10 位。若整数位数所指定的长度不够 , 则以输 出指 定长 度个数 之“ * ”响 应 , 否 则自 动
按四舍五入处理。CT OD 函数能把字符型转换成日期型 , 反过来 , DT OC 函数 能把日期 型
转为字符型。例如 ,

    ? STR( 141 .2 , 6 , 2) , ST R( 141 .2 , 5) , ST R( 141 .2 ) , STR (141 .26 , 5 , 2) ,ST R ( 1221 .26 , 3 , 2 )

输出值将依次为

    141 .20     141         141       141 .3 * * *

    (6 ) 日期时间函数
命令格式 :

    DAT E ( )
T IME ( )
YEAR( < expD > )

・ 51 ・
    功能 :
函数 DAT E 与 TI ME 分别返回当前系统的日期与时间 , YEAR 函数则能 从日期表 达
式中求出公元年历值。
(7 ) 涉及库文件查询的若干函数
命令格式 :

    R ECNO ( )
FSIZE ( < expC > )
EOF ( )
BOF ( )
FILE ( < expC > )

    功能 :
RECNO ( ) 能返回当前记录的记录 号 ; FSIZE 函 数 能返 回由 < expC > 所 指定 的字 段
宽度 ; EOF 函数能用以判断记录指 针是 否指 向文 件尾 , 就是 说如 果指 针仍 指 在库 文件 的
某个记录上 , 则返回 .F ., 否则返回 .T .; 类 似地 , BOF 函数 用以 检测记 录指 针是否 指向 文
件头 , 若是返回值为 .T ., 否则为 .F .。F IL E 函数能判断由 < expC > 所指定的 文件是否 存
在 , 若是返回 .T ., 否则返回 .F .。
注意到字段名与文件名都要用定界符括起来 , 同时文件名还须包括驱动器、路径与扩
展名。如果该文件位于当前盘当前目录 , 则盘符与路径可以缺省。例如 ,

    USE sb
GO 5
sb .dbf″) , RECNO( ) , EOF( ) , FSIZE (″部门″)
? F ILE (″

输出结果依次为 .T ., 5 , .F .与 2。

2 .2 .3   FoxPro 的命令 窗口

以上介绍了与命令工作方式有关的一些知识 , 下面再谈谈 Fox Pro 为命令工作方式 专


门开辟的一个窗口———命令窗口。
一、命令窗口的操作
1 . 命令窗口的移动与大小
Fox Pro 以命令 窗 口 取 代 过 去 dBASE 及 FoxBASE 所 沿 用 的 点 提 示 符 模 式。启 动
Fox Pro 时 , 一个以 Command 为标题的命令窗口出现在屏幕的右 上角 , 需要时 可以移动 命
令窗口的位置并改变其大小。
(1 ) 将鼠标指向命令窗口标题 Command 的所在行 , 按住鼠标按钮可将它 拖曳到屏 幕
上任意指定位置。
(2 ) 用鼠标拖曳命令窗口的右下角 , 可调整命令窗口的大小。
2 . 命令窗口的切换与隐藏
Fox Pro 启动后 , 命令窗口被设置为活动窗口 , 在窗口 左上角 出现插入 光标 , 等待用 户
键入命令。如果屏幕上已有多个窗口 , 选用下 面任一 种方 法可 以把命 令窗 口切换 成活 动
・ 52 ・
窗口。
(1 ) 用鼠标单击命令窗口 ;
(2 ) 在 Window 选单中选择 Command 功能 ; 或
(3 ) 按快捷键 Ctrl + F2 。
若要把处于活动状态的命令窗口隐藏起来 , 使之在 屏幕上 不可见 , 可 以选 择 Window
选单中的 Hide 功能。
二、命令窗口的作用
命令窗口有两个作用 , 即 :
(1 ) 供用户键入 FoxPro 命令 , 回车后命令立即执行 ;
(2 ) 进行选单操作时自动显示与选单操作相应的命令。
在以选单方式使用 FoxPro 时 , 每进行一项选 单操作 , Fox Pro 会 把与该操作等价 的命
令自动写入命 令窗 口。 例 如 , 在 表 结 构 窗 口 中 建 立 库 文 件后 , 会 生 成 CREA T E U N TI-
T L ED 命令 , 这里 的 U N TIT LED 是系统默 认的文件 名 ; 打开并查 看库文 件 sb 后 , 所生 成
的命令将是 USE sb .dbf EXCL USIV E 与 BROWSE LAST , 其中的 LAST 表示自动复制上
一次在 Browse 窗口中所设置 的各项 参数。因 此 , 窗口 显示的 形式 与上 一次 的 Browse 窗
口完全相同。对初学者来说 , 这也是学习 FoxPro 命令功能的一种好方法。
三、历史缓冲区
Fox Pro 允许在内存设置一个缓冲 区 , 用来 储存 已执 行 过的 命令 ( 历史 命 令 ) , 称为 历
史缓冲区。在命令窗口中使用方向键能把插入光标移至某个历史命令上。这不仅可用于
查看 , 还可对此命令重新编辑而使命令的改 错工 作变得 十分 方便。若 在某 历史命 令上 按
了回车键则能重新执行该命令 , 并把它再复制于窗口底部。可见 , 若能有效地使用历史缓
冲区就能减少命令的重复输入而方便用户的操作。

2 .3   修改数据库文件
已建立的数据库必须不断地维护 , 才能 维持 长期使 用。其 中最基 本的 操作便 是对 库
文件的结构与数据进行各种修改。

2 .3 .1   库文件 结构的修 改

一、用选单操作方式进行修改
1 . 操作
打开待修改的库文件 , 在 Database 选单中选 Setup , 在 Setup 窗 口中选 用 Modify 即 可
在表结构窗口中修改文件结构。
2 . 说明
(1 ) 如图 2 .15 所示的 Set up 窗口 主要用 于修 改库文 件结 构与 有关索 引 文件 ( 在第 三
章介绍 ) 的操作。窗口左侧列出 了当前 库文 件的所 有字 段。用 Modify 按钮后 , 屏 幕上 出
现如图 2 .3 的表结构窗口 , 也即重新回到建立库文件结构的环境 , 便可着手进行修改了。
(2 ) 如前所述 , 在表结构窗口中利用拖曳鼠标可调整字 段的排 列次序 ; 使用 Insert 与
・ 53 ・
图 2 .15   Setup 窗口

Delete 按 钮 可 以 新 增 或 删 除 字 段。 FoxPro
会自动设定新增字 段的 字段 名 ( Newfield ) 及
其类型 ( 字 符型 ) , 但 此字 段名 通 常不 符合 操
作要求 , 必须还要修改。
(3) 修 改 文 件 结 构 是 一 项 有 风 险 的 操
作。如果随意更 动数 据类 型 , 字 段 宽度 由 长
变短 , 有可能造成数据丢失 , 必须慎重处理。 图 2 .16   结构修改认定对话框
(4 ) 文 件结 构 修改 结 束 后 , 在 表 结 构 窗
口中按 Ok , 此时屏幕上弹出对话框如图 2.16。
按 Yes 认定修改有效 , 返回到 Setup 窗口 , 再按 Ok 便结束修改。
二、用命令方式进行修改
命令格式 :

    M ODIF Y STR UCTUR E

    功能 :
屏幕上出现表结构窗口 , 修改方法同上。

2 .3 .2   记录的 插入、删除与添 加

在 2 .1 .3 节中曾提到 Browse 窗口中可查看库文件内容。事实上 , 在此窗口中也能 对


库文件进行记录的修改、添加与删除。对此只须将光标移至待修改处 , 直接用键入的内容
覆盖原来的内容便可 ; 在 Browse 或 Record 选单中选择 Append Record 或 Append, 都能 出
现空白新记录等待输入数据 ; 如果单击某个 记录左 端的 矩形 框 , 使 其颜 色加 深 , 便 对该 记
・ 54 ・
录打上了删除标记 ( 再次单击 删除标 记后 可自 行取 消 ) , 在 Database 选单 中选 择 Pack , 便
能把具有删除标记的记录全部从库文件中抹去。
下面分几个方面介绍有关记录数据操作的 FoxP ro 命令。
一、记录的定位与插入
1 . 记录的定位
要在库文件中操作某个记录 , 需要先把记录指针移到该记录上 , 亦即把该记录设置为
当前记录。记录定位就是指移动记录指针到当前库文件的某个记录上。
命令格式 :

    [ GO [ TO] ] < 数值表达式 > | TOP | BOT TOM


SKIP [ < 数值表达式 > ]

    功能 :
GO 命令用于把记 录指 针 定 位于 指 定的 记 录。 其中 < 数 值 表 达 式 > 的值 指 明 记 录
号 ; T OP 或 BOT T OM 则分别表示库文件的首、尾记录。
SK IP 命令能将记录指针以库文件的当 前记录 为基 准向上 或向 下移 动。其中 < 数 值
表达式 > 的值指明记录指针移动的相对记录 数 ; 值 为负 , 则 记录指 针向 上移 动 , 否 则向 下
移动。缺省此可选项 , 记录指针向下移动一个记录位置。
说明 :
(1 ) Fox Pro 提供若干函数来获取移动记录指针后的有关信息。在 2 .2 .2 节的函数中
所提到的 RECNO ( ) 与 EOF ( ) , BOF ( ) 就是其中常用的 3 个。函数 RECNO ( ) 能返回当 前
库文件的当前记录号 , 而 EOF ( ) 与 BOF ( ) 则分别用以检测记录指针是否指向 文件尾或 文
件头。当记录指针向上移动越过首 记录 而指 向文件 头 , 此时 RECNO ( ) 的 返回 值仍为 1 ,
而 BOF ( ) 的返回值为 .T ., 也可向下越过末 记录 指向文 件尾 , 此 时 RECNO ( ) 的返 回值 为
该库文件记录总数再加 1 , EOF ( ) 的返回值为 .T .。
为叙述方便 , 在以后举例时 , 在命 令的 同一 行 , 以“ & & ”为 前缀标 出命 令的输 出结 果
或相应说明。

    USE sb
? RECNO( ) , BOF ( )           & &   1     .F .
SKIP - 1
? RECNO( ) , BOF ( ) &&   1 .T .
GO BOTTOM
? RECNO( ) , EOF ( ) &&   7 .F .
SKIP
? RECNO( ) , EOF ( ) &&   8 .T .

    (2 ) 如果当前库文件已用 SE T F IL T ER 命令 作了过滤 , 不满 足过滤 条件的记 录都 将


被跳过 , 此时 TOP 与 BO T TOM 将分别指向满足过滤条件的首、尾记录。而 GO < 数值 表
达式 > 则不受过滤条件的影响 , 直接把指针移到指定的记录。例如 :

    USE sb
・ 55 ・
SE T F ILT ER TO 价格 < 10000
GO TOP
? RECNO( )         & &   4
GO 2
? RECNO( ) &&   2

    2 . 记录的插入
命令格式 :

    INSER T [ BLANK ] [BEFORE ]

    功能 :
用于在库文件的指定位置上插入一个新记录。
说明 :
(1 ) 新记录的插入 位置 与可 选 项 BEFORE 有关。 I NSER T BEFORE 将 新记 录插 在
当前记录之前 , 而 INSERT 则将新记录插在当前记录之后。
(2 ) 命令中有 BLANK 选项 , 将在指定位置插入一个空记录。如果缺省 BLANK 则在
屏幕上出现 Change 窗口 , 以单记录方式等待用户输入新记录。插入后的存盘处理方法同
前。
(3 ) 选单中的 Append 只能在当前 库文 件的末 尾添 加新 记录。至 于在 指定位 置上 插
入记录的功能 , 并没有相应的选单操作。
(4 ) 插入新记录后 , 库文件原有 的记 录都 会相应 地移 动位置 , 需 要花 费一 定的 时间 ,
若非必要 , 还是使用 Append 来添加记录为好。
二、记录的删除与恢复
随着库文件中记录的不断更新 , 必然会 出现 一些无 用的 记录。为 要删 除库文 件的 记
录 , 一般需经过两个步骤 : 第一步是在待删除记录 上加 一个 删除标 记“ * ”; 第二步 是将 带
有删除标记的记录从库文件中抹去。如果需要 , 作了删除标记的记录还允许恢复。
1 . 记录删除的有关命令
(1 ) 加上删除标记
命令格式 :

    DELE TE [ < 范围 > ] [ FOR < 条件 > ] [ WHILE < 条件 > ]

    功能 :
对当前库文件中指定范围内满足一定条件的 记录加 上删 除标记“ * ”, 若所有 可选 项
缺省 , 则仅将当前记录加上删除标记。
(2 ) 取消删除标记
命令格式 :

    R ECALL [ < 范围 > ] [ FOR < 条件 > ] [ WHI LE < 条件 > ]

    功能 :
取消当前库文件中指定记录上的删除标 记。若所 有可 选项缺 省 , 仅将 当前记 录取 消
・ 56 ・
删除标记。
(3 ) 整理库文件
命令格式 :

    PACK

    功能 :
将所有带删除标记的记录从库文件中抹去。
(4 ) 删除全部记录
命令格式 :

    ZAP

    功能 :
删除当前库文件中所有记录 , 通常在删除之前需用户进一步确认。
2 . 删除命令的比较
(1 ) DE LE T E 与 PACK 是两种不同性质的删除。前 者仅在有 关记 录上 作删除 标记 ,
而后者将作了删除标记的记录真正从库文件中 删除出 去。ZAP 将 删除 全部 记录 , 相当 于
DEL E TE AL L 与 PACK 这两条命令的执行效果 , 使用时更需慎重。
(2 ) PACK 命令执行后 , 将调整磁盘空间及记录号 , 但这 部分磁 盘空间只 有在关闭 库
文件后才允许使用。
操作练习 :
为掌握各条命令的使用方法 , 请读 者在 命令 窗口 中 依次 输入 下列 各命 令 , 并 在 Fox-
Pro 主窗口中观察并分析各条命令的执行结果。

    USE sb
COP Y TO sb1     & &   建立一个备份文件进行删除操作以避免破坏原库文件
USE sb1
DELE TE F OR 名称 = ″
钻床″ .O R . RECNO( ) = 1 .OR . RECNO( ) = 2
LIST
PACK
GO 3
DELE TE
LIST
R ECALL RECORD 3
DISP
ZAP
LIST
LIST ST RUC TUR E

三、记录的添加
在选单工作方式下 选用 Append 能 在 当 前库 文 件 的 末 尾留 出 新 记 录 的位 置 等 待 输
入。除这种方式外 , 在 Foxpro 中还能使用 Database 选单中的 Append F rom 选项把另外一
・ 57 ・
个文件中的数据自动添加到当前库文件的末尾。
命令格式 :

    AP PEND[ BLANK ]
AP PEND FROM < 文件名 > [ F IELDS < 字段名表 > ] [ F OR < 条件 > ]

    功能 :
APP END BLANK 能 在 当 前 库 文 件 末 尾 自 动 添 加 一 个 空 记 录。 缺 省 可 选 项
BLANK , 将出现 Change 窗口等待用户输入所添加的数 据。APP END FROM 命令则能 把
另一文件的数据依次添加到当前库文件的末尾。
说明 :
(1 ) APPEND F ROM 命令允许 在相 同或 不 同文 件结 构的 库文 件 之间 添加 记录。 但
是 , F IELDS 可选项中的字段名必须是 共有 的 , 若 两库 文件 同 名字 段的 宽度 不同 , 则以 当
前库文件的字段宽度为基准 , 对另一库文件的 数据进 行适 当调 整后才 添加 到当前 库文 件
中。
(2 ) APPEND F ROM 命令还能 把文 本文 件 中的 数据 添加 到当 前 库文 件末 尾。文 本
文件是 FoxP ro 的又一文件类型 , 它把信息以字符形 式 ( 即 ASCII 码 形式 ) 储 存 , 文 本文 件
的扩展名为 TXT 。为能适应与多种高级语言沟通 , FoxPro 可以把库文件中的数据按不同
的格式组成文本文件。这里先介绍系统数据格式 SDF ( System Data Format ) , 这种格式是
把库文件中的数据按系统的储存格式进行组织。若把一个合适的文本文件中全部数据添
加到当前库文件中来 , 只须使用命令

    AP PEND FROM   < 文本文件名 >   SDF

便可。
在上面删除记录的操作练习中已把 sb 的备份文件 sb1 中的 记录全部 抹去 , 请读者 在
此基础上使用 APPE ND F ROM 命令把已经抹去的记录再添加进去。
四、备注型和通用型字段的数据修改
通用型字段的数据通 常 是由 Fox Pro 以外 的 应用 程序 ( 例 如图 形 数 据可 能 由画 笔 程
序 ) 编辑的。如果需要修改 , 也要先退回提供该 数据的 源应 用程序 , 修 改后 重新返 回通 用
型字段。
OLE 功能的特点之一 , 就是能帮助 用户 迅速 返回 提供 源 数据 的程 序 , 不 需要 用户 记
住源数据的来源。例如 , 在库文件 sb 的第 7 个记录中 , 轿车的商标原来是 一辆汽车 ( 参 阅
上文第 2 .1 .2 节 ) , 如果想把它改成一个狐狸头 , 只须按以下步骤操作即可 :
1 . 双击第 7 个记录商标字段的 Gen , 显示带汽车图形的 sb 商标窗口 ;
2 . 双击汽车图形 , 显示内含汽车图形的画笔窗口 ;
3 . 将汽车图形修改成狐狸头图形 ( 步骤略 ) 。
如果该商标 原来的图 形是用 Paste Link 连 接到商标 字段的 , 则当 画笔中的 图形改 成
狐狸头时 , sb 商标窗口的图形也会自动随之修改。
使用 REP LACE 命令能实现以命令方式来修 改备 注型 字段的 数据 , 请 读者参 阅下 文
2 .3 .3 节 REPLACE 命令的第 ( 1) 点说明 , 不再另述。
・ 58 ・
2 .3 .3   记录数 据的替换

在 Browse 窗口中修改记录的 字段 值时 , 必须 把修 改值直 接键 入 , 而 REP LACE 命 令


则能把字段值用指定的表达式值进行替换 , 不必 直接进 行键 盘操 作。因此 在程序 设计 中
将经常使用 RE PLACE 命令。
命令格式 :

    REPLACE < 字段 名 1 > WI TH < 表达 式 1 > [ ADDI T IVE ] [ , < 字 段 名 2 > WI TH < 表 达 式 2 >
[ ADDI T IVE] …… ] [ < 范围 > ] [ FOR < 条件 > ] [ WHILE < 条件 > ]

    功能 :
在当前库文件的指定记录中 , 把有关字 段的 值用命 令中 相应 的表达 式值 来替换。 若
命令中 < 范围 > 或 < 条件 > 等可选项都缺省 , 则只对当前记录的有关字段进行替换。
说明 :
(1 ) 只有在对 备注 字 段 的 数据 进 行 替 换 时 , 才 须 使 用 ADDITI VE 选 项。如 果 带 有
ADDITI VE , 则表达式值会添加到备注字段中已有数据的尾部 , 否则表达式值 将覆盖该 字
段的原有数据。例如 , 下述命令

    USE sb
R EPLACE   备注   W IT H   ″, 租借期到 2000 年结束。
″  ADDI T IVE

执行后 , 将会在 sb .dbf 第一条记录 备注 字段 的原 有信 息的 尾 部添 加上 述信 息 , 而 使该 记


录的备注信息被修改为“从光华仪表厂租入 , 租借期到 2000 年结束。”
(2 ) REP LACE 命令有多种用法 , 现以某单位的工资管理为例举出下列 3 种 :
① 对选定记录的指定字段值成批地进行替换修改。例如 ,

    R EPLACE 基本工资 WI TH 基本工资 * 1 .1 , 岗贴 WI TH 岗贴 + 40 F OR 职称 = ″工程师″

    ② 可从一个记录的若干字段值得到同一记录的某一字段值。例如 ,

    R EPLACE ALL 实发工资 WI TH 基本工资 + 岗贴 + 奖金

    ③ 在库文件中添加一个新记录

    AP PEND BLANK
R EPLACE 姓名 WI TH ″陈丽红″, 基本工资 WI TH 360 , 岗贴 wit h 400 , 奖金 WI TH ;
250 , 职称 W I TH ″工程师″

这种用 RE PLACE 命令来添加记录的方式在程序中经常被使用。

2 .3 .4   单个记 录与数组 间的数据传 送

Fox Pro 能使库文件的记录数据成为指定数组元素的 值 , 反过来 也能把数 组元素值 传


送到库文件使之成为记录的数据。因此 , FoxPro 也可以利用 数组对 库文件进 行记录的 添
加与修改。在此先简单介绍两条有关的命令。
・ 59 ・
一、把库文件的记录数据传送到数组
命令格式 :

    SCAT T ER [ FI ELDS < 字段名表 > ] [ MEMO]   TO < 数组名 >

    功能 :
将当 前库 文件 当前记 录的 数据按 F IELDS < 字 段名表 > 书写的 顺序 依次送 入指 定
数组元素之中。若缺省 FIE LDS 可选项 , 则将 除备注 型字 段外 的所有 字段 值存入 数组 元
素之中。如果要对备注型字段同样处理 , 还需在命令中使用 ME MO 可选项。
说明 :
(1 ) 如果命令中的数组还不存在 , 或者数组 虽已建 立但却 不够大 , SCAT T ER 命令 会
自动把所需的数组生成或扩大。
(2 ) 为能把含有大量数据的备注型字段传送到一个数组之中 , 必须 要有足够 的内存 ,
否则系统将提示内存不够的出错信息。
二、把数组数据传送到库文件记录
命令格式 :

    GATHER F ROM < 数组名 > [ F IELDS < 字段名表 > ] [ MEMO]

    功能 :
把数组中的数据依次传送 到当 前库 文件 的 当前 记录 中。若 使用 可选 项 FIE LDS , 则
只有在 < 字段 名 表 > 中 列 出的 字 段 才 会 被数 组 元 素 的 值 代 替。 当 缺 省 可 选 项 M EMO
时 , GAT HER 命令将忽略备注型字段。
说明 :
(1 ) 当数组元素的数据类型 与库 文件相 应字 段类 型不同 且不 兼容 ( 如 数值型 数组 元
素仍能被传送到字符型字段之中 , 它们虽类型 不同 却是兼 容的 ) 时 , 该 字段 将自动 被初 始
化为空值。字符型与数值型的 默认 空值 分别是 空格 与 0 , 日 期型 与逻 辑型 的 默认 空值 为
{   /   /   } 与 .F .。
(2 ) 若数组元素多于 字段 数 , 则多 出 的数 组 元素 不 传送 ; 若数 组 元 素个 数 少于 字 段
数 , 则多出的字段值不会改变。
( 3) 由于 GAT HER 命令是将数组数据传送到库文件当前记录 , 所以用数组修改记录
数据时 , 需先将记录指针正确定位 ; 如果要利用 数组在 库文 件中添 加一 个新 记录 , 还需 在
GA TH ER 命令之前先执行一条 APPE ND BLANK 命令。
操作练习 :

    USE sb1                     & &   库文件 sb 的备份文件


GO 5
SCAT T ER TO A MEMO & &   把 5 号记录数据 ( 包括备注型 ) 传送给数组 a
? a (1 ) , a (2) , a (4) & &   屏幕显示   100 - 1 微机与   8810 .00
a (4 ) = 9000 & &   修改对应于 5 号记录价格字段的数组元素值
GATHER F ROM a
DISP & &   5 号记录的价格已由原来的 8810 改为 9000

・ 60 ・
AP PEND BLANK & &   添加一个空记录
a (7 ) = ″规格为 586″
GATHER F ROM a MEMO & & 在添加的新记录中还同时向备注型字段送数据
GO BOTTOM
DISP 编号 , 名称 , 价格 , 备注

从最后一条命令的执行结果可看到所添加新记 录中 4 个字 段的数 据 , 其中 前 3 个 字段 值
与第 5 个记录经修改后的相应字段值相同 , 而备注字段内容即为“ 规格为 586”。
三、记录与一组内存变量间的数据传送
SCA T T ER 与 GA TH ER 命令除能以数组为中介对库文件的记录进行添加与修改外 ,
还能通过一组内存变量来达到相同的目的。命令的形式如下所示 :

    SCAT T ER [ FI ELDS < 字段名表 > ] [ MEMO ] MEMVER [BLAN K]


GATHER F ROM MEMVER [ FI ELDS < 字段名表 > ] [ MEMO]

若是在 SCAT T ER 命令中使用了 M EMV ER , 则 能将 当 前记 录的 数据 复制 到 一组 内存 变


量之中。每一个内存变量与其相应字段的名称、类型、大小完全相同。若在命令中指定了
F IE LDS < 字段名表 > , 则只有与指定字段相应的内存变量被建立。为区分同名的字段 与
内存变量 , 使用时需在内存变量前加上 m。例如 ,

    USE sb1
GO 5
SCAT T ER MEMVER
? m .编号 , m .名称 , m .价格

    注意到 SCAT TER 命令中关键字 ME MV ER 之前不可加“ T O”, 否则将把当前记录 的


数据 复 制 到 一 个 名 为 memver 的 数 组 中 去 了。 如 果 命 令 中 有 BLANK 可 选 项 , 则
SCA T T ER命令将建立一组与当前库文件各字段 相应的 空的 内存 变量备 用。两条 命令 的
其它有关解释同前。具体使用的例子请见第四章 4 .4 .1 节。

2 .4   复制数据库文件

复制数据库文件是指对一个已有的库文 件进行 复制 , 以 得到 它的一 个副 本。这是 保


护数据库常用的安全措施之一。除此以外 , 通过复制还能在已建库文件的基础上 , 灵活方
便地产生新的库文件或新的库文件结构。

2 .4 .1   库文件 结构与数 据的复制

一、同时复制结构与记录数据
命令格式 :

    COP Y TO < 文件名 > [ < 范围 > ] [ FIELDS < 字段名表 > ] [ FOR < 条件 > ] [ WHI LE < 条件 > ]

    功能 :
・ 61 ・
把当前库文件中选定的部分记录和部分字段复制成一个新库文件。如果命令中各可
选项缺省 , 则复制所得的新库文件为当前库文件的一个副本。
说明 :
(1 ) 对于含有备注型字段的 库文 件复制 , 除非在 可选 项 FIELDS 中不 列 出该 备注 型
字段 , 否则系统在复制扩展名为 DB F 的库文件同时自动复制扩展名为 FP T 的备注文件。
(2 ) 命令中的可选项 FIELDS < 字段名表 > 不仅指明了新库文件包含哪些字段 , 同时
这些字段在新库文件结构中的排列次序可与原库文件不同。
(3 ) 复制所得的新库文件必须被打开 , 也即被选作为当前库文件后才可进行操作。
(4 ) 尽管也可通过操作系统中的 COPY 命令 来完 成库 文件的 复制 , 但 是库文 件与 备
注文件的复制必须分别操作 ; 特别地 , 要做到有选择地复制库文件中部分记录和部分字段
也是它所不能胜任的。
操作练习 :

    USE sb
COP Y TO b1           & &   对 sb .dbf 原样复制 , 即同时生成 b1 .dbf 与 b1 .fpt
COP Y TO b2 FI ELDS 编号 , 名称 , 部门   & & 在 b2 .dbf 中只含有 3 个字段的数据
COP Y TO b3 FI ELDS 名称 , 编号 FOR LEFT (部门 , 1 ) = ″
2″  & & b3 .dbf 中只含有各车 ;
间所具设备中的名称与编号两个字段内容 , 而且名称排在编号之前

二、单独复制文件结构
命令格式 :

    COP Y STR UC TUR E TO < 文件名 > [ FI ELDS < 字段名表 > ]

    功能 :
仅复制当前库文件的结构 , 不复制 其中的数据。若有 可选项 F IE LDS < 字段名表 > ,
则新库文件的结构只包含其中指明的字段 , 同 时也决 定了 这些 字段在 新库 文件中 的排 列
次序。
操作练习 :

    USE sb
COP Y STR U TO c1
USE c1         & & 把复制所得的新库文件设置为当前库文件。
LIST & & 可看到 c1 与 sb 的结构相同 , 但无数据。
USE sb
COP Y STR U TO c2 F IELDS 名称 , 价格 , 编号
USE c2
LIST ST RU & & c2 只含 3 个字段并且编号字段已被排在最后。

三、单独复制文件记录
命令格式 :

    COPY TO < 文本文件名 > [ < 范围 > ] [ F OR < 条件 > ] [ WHILE < 条件 > ] [ FI ELDS < 字段名表
> ] SDF

・ 62 ・
    功能 :
将当前库文件选定记录中选定字段的数据按 SDF 格式单独复制到文本文件中去。
说明 :
(1 ) 在上节添加记录中已经提到文本文件与数据库文件的类 型不同 , 它没有 结构 , 只
有数据 , 系统默认的扩展名为 TX T。
(2 ) SDF 指明把当前库文件的数据按系统储存格式复制到文本文件中 去。它有如 下
特点 :
① 记录为定长 , 并以回车、换行符结尾。
② 记录中每个字段的宽度固定 , 字段数据不足宽度时 , 数值型置前 导空格 , 字符型 则
后补空格。同一记录的两个字段间无须分隔符。
③ 把库文件中的日期型数据改变为 19yymmdd 的形式 , 把逻辑型数据中 两侧的圆 点
去除 , 并舍弃备注型数据。
操作练习 :

    USE sb
COP Y TO c3 NEXT 5 FOR 价格 > 10000 SDF
TYPE c3 .txt   & & type 命令能显示文本文件的内容 , 可看到 c3 .t xt 包含有 sb ;
前 5 个记录中价格 > 10000 的 3 个记录的数据。

2 .4 .2   库文件 的结构文 件

结构文件是一种特殊的库文件 , 专用于储存某一库文件的结构 , 这种特殊库文件的结


构由系统按固定的模式自动生成。
一、结构文件的建立
命令格式 :

    COP Y TO < 结构文件名 > ST RUCT UR E EXTENDED

    功能 :
把当前库文件的结构参数作为记录复制到新生成的结构文件中去。
说明 :
(1 ) 结构文件的结构具固定模式 , 它包括 4 个字段 , 各字段的有关参数如下所示 :

        字段名           类型       宽度       小数位数
FIELD - NAME C 10
FIELD - TY PE C 1
FIELD - LEN N 3 0
FIELD - DEC N 3 0

其中 , 各字段名中间的间隔符号必须是 下划线“ - ”, 字母 的大 小写可 任意。 字段 FIELD -


NAM E 用于存储原库文件的各个字 段名 , 由 于字 段名 可由 字 母、汉字 等符 号 组成 且长 度
不超过 10 , 所以系统为 FIE LD - NAM E 字段所设置的类型为字符型 , 宽度为 10。类似地 ,
・ 63 ・
读者可考虑另外 3 个字段类型及宽度的合理性。
(2 ) 如前所述 , 修改库文件的结构必须在表结构窗口中进行操作。 而今 , 库文件的 各
字段 , 已成为它的结构文件的各个记录 , 而记录 的修改 是能 通过命 令来 实现 的 , 由 此可 得
修改库文件结构的新方法。
操作练习 :

    USE sb
COP Y TO jg ST RU EXTENDED   & & 生成 sb 的结构文件 jg
USE jg
LIST ST RU   & & 请注意观察由系统自动生成的 jg .dbf 的文件结构
LIST   & & 源文件 sb 各字段的有关参数已依次成为 jg 的记录数据

二、由结构文件生成新库文件的结构
命令格式 :

    CREATE < 文件名 > FROM < 结构文件 >

    功能 :
把结构文件的记录翻制成一个新库文件的结构 , 并同时打开新库文件。
说明 :
(1 ) 翻制所得的库 文件 只有 结构 而无 数 据。为能 实 现以 命 令方 式 来修 改 库文 件 sb
的结构又不丢失其原有数据需先把 sb 的数据单独复制成文本文件保存 起来 , 待修改结 束
后再把文本文件的数据添加进去。操作步骤如下所示 :

    USE sb1                     & &   库文件 sb 的备份文件


COP Y TO jg ST RU EXTE
COP Y TO wb SDF & &   把 sb1 的数据按 sdf 格式储存到文本文件 wb 之中
USE jg
AP PEND BLANK
R EPLACE field - name W I TH ″保管人″, field - type W IT H ″
C″, field - len WI TH 6
CREATE sb1 FROM jg & &   库文件 sb1 已添加一个字段 , 但数据已全丢失
AP PEND FROM wb SDF & &   把文本文件 wb 中储存的数据再添加到 sb1 之中
LIST

    (2 ) 综上可知 , 利用结构文件能使库文件结构的修改工作由程序自 动控制进 行 , 从 而


避免了通常所采用的在键盘上直接操作的方法。

2 .4 .3   成批记 录与数组 间的数据传 送

使用 SCAT T ER 与 GAT HER 命令 只能 进行 库文 件 单个 记录 与数 组 间的 数 据 传送。


若使用下面介绍的两条命令 , 还能将库文件的成批记录数据与数组相互传送。
一、把库文件的一批记录同时复制到数组
命令格式 :

    COPY TO ARRAY < 数 组 名 > [ FI ELDS < 字 段 名 表 > ] [ < 范 围 > ] [ FOR < 条 件 > ] [ WHI LE
・ 64 ・
< 条件 > ]

    功能 :
将当前库文件选定 记录 中 选定 字段 的数 据复 制 到指 定的 数组 之 中。若 可 选项 都 缺
省 , 则复制除备注型字段以外的全部记录数据。
说明 :
(1 ) 命令中指定的数组如不存在。 FoxPro 会根据 需要 自动建 立此 数组 , 若数 组已 事
先定义好 , 该命令将不会自动调整数组的大小以满足要求。
(2 ) 可以复制库文件单 个记录 的数 据到一 个一 维数 组中 , 但与 SCAT T ER 命 令区 别
的是 COPY T O ARRAY 命令不能把备注字段的数据复制到数组中。
(3 ) COPY T O AR RAY 命令能够一次 把当 前库 文 件中 的多 个记 录同 时 复制 到指 定
二维数组中 , 一个记录的 数据 送 入数 组的 同一 行中 , 即第 一个 字段 数据 送 到该 行的 第 一
列 , 第二个字段数据被送到该行的第二列 , 依此类推。如果二维数组的列数小于库文件的
字段数 , 则多余字段的数据将被丢失 ; 如果大 于 , 则多余 的数 组列 元素值 保持 不变。类 似
地 , 库文件的各个选定记录会按序被复制到 数组 的各行 之中。 如果数 组的 行数少 于被 选
定的记录数 , 则多出的记录数据便不被复制 , 否则剩下的数组行各元素保持原值不变。
二、从数组向库文件添加记录
命令格式 :

    AP PEND FROM ARRAY < 数组名 > [ F OR < 条件 > ] [ F IELDS < 字段名表 > ]

    功能 :
将满足条件的数组行的数据按记录形式依次 添加 到当 前库文 件中 , 但 它忽略 备注 型
字段。若命令中有可选项 FIE LDS , 则在添加记录时只向其中列出的字段传送数据。
说明 :
(1 ) 命令中指定的数组可以是一维或二维 , 一维数组一次向库文件 添加一个 记录 ; 而
二维数组的每一行将添加到库文件成为一个新 记录 , 所以 二维 数组的 行数 即为所 添加 的
新记录个数。
(2 ) 若数组所具的列数多于库文件的字段数 , 这些多余列的数组元 素将被忽 略 ; 反 过
来 , 若库文件的字段数多于数组的列数 , 则多出来的字段被自动赋以空值。
(3 ) 类似于单个记录与数组 间的 数据传 送 , 当数 组元素 的数 据类 型与库 文件 相应 字
段类型不同且不兼容时 , 该字段将自动被赋以空值。
操作练习 :

    USE sb
DIMENSION pr(3 , 3)
COP Y STR U TO f1 F IELDS 编号 , 价格 , 启用日期 , 名称
COP Y TO ARRAY pr FOR 价格 > 10000 F IELD 编号 , 价格 , 启用日期
& &   虽然 sb 中满足条件的记录有 5 个 , 但只有前 3 个记录被复制到数组
USE f1   & &   在 f1 .dbf 中 , 名称字段被排在最后
AP PEND FROM ARRAY pr

・ 65 ・
LIST   & & 由于数组 pr 为 3 行 3 列所以库文件只有 3 个记录 4 个字段 , 其中第 4 个字段名称 ;
已被赋以空值

2 .5   磁盘文件操作

Fox Pro 支持用选单方式或命令方式来进行磁盘文件的操作 , 现分述如下。

2 .5 .1   文件维 护窗口

Fox Pro 提供一个文件维护公用程序 , 供用户按选单方 式来进 行磁盘文 件的操作。 在


Help 选单中选择 Filer 功能 , 便能在屏幕上出现如图 2 .17 所示的文件维护窗口。

图 2 .17   文件维护窗口

窗口左侧列出了当前目录下的全部文件目录 ; 右 侧上 方的 两个文 本框 可用于 设定 当


前驱动器与当前目录 ; 右侧中部的按钮用于 选择待 操作 的文 件 ; 窗 口下 侧的 10 个 按钮 则
用于对所选文件进行相应的操作。使用 Tab 键可将光带移到任何所需的按钮上。
一、选择待操作的文件
在执行具体操作前 , 必须先选定待操作的文件。
(1 ) 用鼠标单击某文件便可选定该文件 ; 若在鼠标单击文件的同时按住 Ct rl 键 , 可 实
现非连续的多重选择 ; 而按住 Shift 键的同时再在 一组 连续 的文件 上拖 曳鼠标 , 就 可以 选
定这一组中连续的各个文件。而使用↑ , ↓ , Shift 与 En ter 等键可通过键盘来实现文件的
选择。
(2 ) 文本框 Files Like 用以指明当前盘当前目录下哪些文件被列示在窗口中。
(3 ) T ag All 可以把文件列表中的全部文件一次性地加上选择标记。
(4 ) T ag None 去除文件列表中所有被选文件上的选择标记。
(5 ) Invert 在文件列表上作逆向 选 择 , 也即 去除 文 件列 表中 所有 被选 文 件上 的选 择
・ 66 ・
标记 , 同时在原来未选的文件上加上选择标记。
二、文件操作按钮的使用示例
(1 ) 文件的编辑
操作文件选定后 , 便可通过 Edit 按 钮来编 辑被 选择 的文件。 若只选 定一 个文 件 , 则
Fox Pro 就打开一个窗口供编辑 ; 若选定了多个文件 , 则以 重叠的 方式打开 多个窗 口 , 用 户
可切换各个窗口 , 同时对这多个文件进行编辑。
(2 ) 文件的移动与复制
选定一个或多个文件后 , 便可使用按钮 Move 或 Copy 来实现对选定文件的移动或复
制。操作时即可通过对话框把移动或复制的文件 放在 指定 的磁盘 目录 下 , 这两种 操作 的
主要区别在于被移动的文件在原先的磁盘目录下已不复存在。
(3 ) 文件的改名与删除
操作 Delete 按钮可将选定的一个或多个文件同时删 除 , 删除前会 在屏幕上 弹出一 个
对话框要求用户进一步确认。Rename 按钮可对所选定的文件进行改名。
(4 ) 使用 Tree 按钮后能出现如图 2 .18 所示的磁盘树型目录结构。

图 2 .18   磁盘树型目录结构

窗口下端第一排 3 个按钮 Rename , Chdir 与 Mkdir 分 别 用于 更改 目录 名称 , 切换 当


前目录以及建立新目录。第二排 5 个按钮的操作功能与文件维护窗口相应按钮的功能相
同。
三、文件维护命令 Filer
文件维护窗口除了用选单操作方式使之出现外 , 也可以命令方式打开。
命令格式 :

    FILE R [ LIKE < 通配符 > ] [ NO WAI T ] [ IN [ W INDOW ] SCREEN ]

    功能 :
・ 67 ・
打开文件维护窗口。
说明 :
(1 ) 可选项 LI KE 可限定在文件维护窗口中只列示某些特定类型的文件 , 例如

    FILE R   LIKE   * .dbf


FILE R   LIKE   e4 - ? .prg

    (2 ) 打开文件维护窗口后 , 通常要暂停程序的执行等待用户进行磁 盘文件操 作 , 只 有


在关闭文件维护窗口后 , 程序才得继续运行。但若命令中有 NO WAIT 可选项 , 则文件 维
护窗口打开后就不再等待 , 随即执行该命令的后续命令。
(3 ) 使用可选项 I N [ WI NDOW ] SCREE N, 可以把磁盘文件的操作安排在 FoxPro 的
主窗口中进行。

2 .5 .2   磁盘文 件操作命 令

下面列出了若干常用的磁盘文件操作命令及其功能 , 它们的使用方法与 FoxBASE 相


同 , 这里不再举例说明。

    命令格式                                     功能
R ENAME < 旧文件名 > TO < 新文件名 > 磁盘文件改名
ERASE | DELETE FILE < 文件名 > | ? 删除磁盘文件
COP Y F ILE < 源文件名 > TO < 目标文件名 > 复制磁盘文件
DIR[ < 驱动器 > ] [ < 通配符 > ] [ TO PRINT ] 显示磁盘文件目录
TYPE < 文件名 > [ TO PRINT ] 显示文本文件的内容

习   题
1 . (1 ) 建立数据库文件 hd .dbf , 文件结构与数据如下所示。
文件结构 :

字段名 类型 宽度 小数位数
货号 Character 6
品名 Character 8
进口 Logical 1
单价 Numeric 7 2
数量 Numeric 2 0
开单日期 Date 8
生产单位 Character 16
备注 Memo 10
商标 Gen 10

    记录数据 :

・ 68 ・
货号     品名     进口     单价     数量   开单日期   生产单位       备注 商标
LX-750   影碟机   T     5900 .00     4     96/ 08/ 10   松下电器公司
Y U-120 彩电     F 6700 .00 4 96/ 10/ 10 上海电视机厂
AX-120 音响     T 3100 .00 5 95/ 10/ 11 日立电器公司
DV-430 影碟机   T 2680 .00 3 96/ 09/ 30 三星公司     从 96 年 9 月 1 日起调价
FZ-901 取暖器   F 318 .00 6 96/ 09/ 05 富利电器厂
LB-133 音响     T 4700 .00 8 95/ 12/ 30 索尼公司
SY-701 电饭锅   F 258 .00 10 96/ 08/ 19 爱德电器厂   本产品属改进型
N V-920 录放机   T 1750 .00 6 96/ 07/ 20 先锋电器公司

    操作要求 :
① 建立库文件 hd .dbf 的文件结构后 , 立即输入 前面 6 个记 录的数据 , 其中商标字 段
的数据由读者自行在 Windows 环境下选择两个图标分别输入。随后存盘退出。
② 重新打开库文件 hd .dbf, 并分别查 看它的 文件 结构 与记录 数据 , 包 括其中 的备 注
字段与商标字段的数据。
③ 在 hd .dbf 中再添加后 两个 记录 数据 , 添加 结 束后 再 分 别用 Browse 方式、Change
方式查看库文件的记录数据。
④ 试用 Browse 选单项中的各个功能以观察库文件的多种显示形式。
(2 ) 建立代码数据库 bmdm 它含有两个字段 5 个记录 , 内容如下所示 :

    代码               名称
11               办公室
12 设备科
21 一车间
22 二车间
23 三车间

    2 . 依次键入下列操作命令并观察各个命令的执行结果。

    (1 ) x1 = 8 * 4
x2 = ″
pqr″
xy = .t .
xz = {96/ 12/ 30}
L IST MEMORY LIKE x ?
SAVE TO fl ALL LIKE x ?
RELEASE x1 , x2
L IST MEMORY LIKE x ?
RESTORE FROM fl
L IST MEMORY LIKE x ?
(2 ) USE hd
L IST FOR SUBST R( 品名 , 1 , 4) = ″
影碟″
L IST FOR RIG HT (品名 , 2 ) = ″机″
L IST FOR ″电″$品名

・ 69 ・
L IST FOR AT (″电″, 品名 ) < > 0

    3 . 在 hd .dbf 中 , 把符合下列要求的记录数据依次显示出来。
(1 ) 显示第 5 个记录 ;
(2 ) 第 3 个记录开始的共 5 个记录 ;
(3 ) 把第 3 个记录到第 5 个记录显示出来 ;
(4 ) 显示数量少于 5 的货号、品名与生产单位 ;
(5 ) 显示进口商品或 95 年开单的商品信息 ;
(6 ) 显示全部国产商品信息 ;
(7 ) 显示单价大于 4000 的进口商品信息或单价大于 5000 的国产商品信息 ;
(8 ) 列出 95 年开单的货号、品名、单价与开单日期 , 其中单价按 9 折处理 ;
(9 ) 列出单价小于 2000 以及单价大于 5000 的进口商品信息 ;
(10) 把从第 3 个记录开始的所有国产商品信息显示出来 ;
(11) 列出货号后 3 位为“120”的全部商品信息 ;
(12) 列出货号的第一个字母为“ L”或者第二个字母为“ V”的全部商品信息 ;
(13) 列出生产单位为“公司”且单价大于 3000 的所有商品信息。
4. 生成 hd .dbf 的备份文件 j1 .dbf, 并修改 j1 .dbf 的文件结构与记录数据。其操作包
括:
(1 ) 把“ 数量”字段的宽度由 2 改为 3 ;
(2 ) 把“ 货号”字段名改为“ 编号”, 宽度由 6 改为 5 ;
(3 ) 在“ 数量”字段之后插入下面字段 ;
      字段名       类型       宽度     小数
      总价         N           9       2
(4 ) 删除名为“ 生产单位”的字段 ;
(5 ) 列出 j1 .dbf 的文件结构与记录数据 , 并观察经修改后的变化情况 ;
(6 ) 把库文件 j1 .dbf 中的总价字段值用单价×数量进行替换 ;
(7 ) 在第 3 个记录之后 插入一 个空 记录 , 并自 行确 定一 些数 据用 REPLACE 命令 将
它们填入该空记录中 ;
(8 ) 在第 3 个记录与第 7 个记录上分别加上删除标记 ;
(9 ) 撤消第 3 个记录上的删除标记并把第 7 个记录从库文件中抹去 ;
(10) 把 hd .dbf 的全部记录数据添加到 j1 .dbf 中去 , 并查看经添加后的记录内容 ;
(11) 用 SCAT TER 与 GAT HER 命令对库文件 j1 的第 3 个 记录作 如下要求 的修改 :
将单价由 3100 .00 改为 3500 .00 , 在备注字段中填入内容 “
: 新产品提价”。
5 . 对库文件 hd .dbf 进行如下要求的复制 :
(1 ) 原样复制 hd .dbf 的文件结构 , 并把复制后的库文件结构显示出来 ;
(2 ) 复制一个仅有货号、品名、单价、数量等 4 个字段的库文件结构 hd1 .dbf ;
(3 ) 将 hd .dbf 原样复制为库文件 b1 ;
(4 ) 复制具有货号、品名、数量、生产单位等 4 个字段的库文件 b2 ;
( 5) 从第 2 个记录到第 6 个记录中把单价不小于 3000 的进口商品复制为库文件 b3 ;
・ 70 ・
(6 ) 将 96 年 1 月 1 日及以后开单的商品复制为库文件 b4 ;
(7 ) 把库文件 hd .dbf 按系统数据格式复制为文本文件 kk .tx t , 再把 kk .txt 中的数 据
添加到库文件 b3 中去 ;
(8 ) 不用全屏幕操作 , 在 b1 .dbf 的文 件结 构中 添加 一 个字 段名 为“进 货 人”, 类型 为
C , 宽度为 6 的字段 , 并要求仍然保存 b1 的原有数据。
6 . 进行如下要求的磁盘文件操作 :
(1 ) 列出当前盘当前目录下的全部库文件目录及所有的文件目录 ;
(2 ) 把库文件 hd .dbf 原样复制成新库文件 dd .dbf 与 hh .dbf;
(3 ) 把库文件 dd 改名为 dh , 然后打开 dh , 观察其记录内容 ;
(4 ) 把 hh .dbf 及其备注文件同时删去 ;
(5 ) 列出 2 .5 题 ( 7) 中文本文件 kk .t xt 内容。

・ 71 ・
第三章   查询与统计

    在数据库系统中 , 数据查询与统计是最常见的 两种实际 应用。本 章主要讨 论 FoxPro


支持的两种查询方 法 : 顺序 查 询 和 索 引查 询 方 法 , 以及 两 种 交 互 方式 操 作 的 查 询工 具 :
View 窗口和 RQBE 窗口。前者 是 微机 数据 库早 已采 用 的传 统查 询方 法 , 后 者 支持 交 互
查询 ( 已经成为 Fox Pro 的 一大 特 点 ) , 充分 体 现了 FoxPro 用 户 界 面友 好、易 于 使用 的 特
色。尤有进者 , FoxP ro 将 RQBE 与 SQL 语言的 SEL ECT 命令结合起来 , 使用户可直接在
Fox Pro 环境中使用 SQL SEL ECT 命令 , 分享 SQ L 的这种功能强大、结构又十分灵活的新
型查询功能。
除此之外 , 本章还将在第一节简介与查询密切相关的排序与索引方法 , 在最后一节讲
解计数、求和、求平均值和数据汇总等常用的统计命令。

3 .1   排序与索引

库文件中记录总是按输入的先后排列的。用 LIST 等命令显示库文件时 , 仍按照这个


顺序输出。如果希望以另一种顺序来输 出记 录 , 例如要 求 SB .DBF 的 记录 按价格 从大 到
小输出 , 便须对库文件进行排序或索引。排序与索引都能起到改变记录输出顺序的作用 ,
索引还能决定记录的存取顺序。

3 .1 .1   排序

排序就是根据库文件的某些字段重排记 录。排序 后将 产生一 个新 的库文 件 , 其记 录


按新的顺序排列 , 但原文件不变。下述命令可用来实现排序。
命令格式 :

    SORT TO < 新文件名 > ON < 字段名 1 > [/ A | / D] [/ C] [ , < 字段名 2 > [/ A | / D] [/ C] . . .]
[ < 范围 > ] [ FOR < 条件 1 > ] [ WH ILE < 条件 2 > ] [ F IELDS < 字段名表 > ]

    说明 :
(1 ) ON 子句的字段名表示排序字段 , 记录可以随字段值的增大 ( 升序 ) 或减小 ( 降序 )
来排序。选项/ A 和/ D 分别用来指定升序或降序 , 默 认按升序 排序。选 项/ C 表示不区 分
字段值中字母大小写 , 即把同一字母的大写与小写看成一样。
不可选用备注型或通用型字段来排序。
(2 ) 如 果在 ON 子 句中使用 多个字 段名表示 多重排序 , 即 先按主 排序字段 < 字段 名
1 > 排序 , 对于字段值相同的记录再按第二排序字段 < 字段名 2 > 排序 , 依此类推。
(3 ) 缺省 < 范围 > 、FOR < 条件 1 > 和 WH IL E < 条件 2 > 等 子句表 示 对所 有记 录
排序。
・ 72 ・
(4 ) F IE LDS 子句的 < 字段 名表 > 指定 新文 件应 包含 的 字段 , 默 认包 含 原库 文件 所
有字段。
[ 例 3-1]   对 SB .DBF 分别按以下要求排序 :
(1 ) 将 1988 年以后启用的设备 按启用 日期 降序排 序 , 并要 求新文 件只 包 含编 号、名
称、启用日期等三个字段。
(2 ) 按部门降序排序 , 当部门相同时则按价格升序排序。

    USE sb
SORT TO rqx ON 启用日期/ D FI ELDS 编号 , 名称 , 启用日期 F OR YEAR (启用日期 ) > 1988
SORT TO bmx O N 部门/ D, 价格
USE rqx                       & & 打开新文件 R QX .DBF
LIST & &   FOXPRO 主窗口显示如下
Record #   编号     名称     启用日期
1 100-1 微机 94/ 08/ 12
2 210-1 轿车 92/ 05/ 08
3 101-1 复印机 89/ 06/ 01
4 016-2 车床 89/ 01/ 15
USE bmx
LIST & &   FOXPRO 主窗口显示如下
  Record #   编号     名称     启用日期           价格   部门   主要设备     备注   商标
1 038-1 钻床 86/ 10/ 12   5275 .00     23 .F . Memo   gen
2 037-2 磨床 87/ 07/ 21 241292 .12     22 .T . memo   gen
3 016-2 车床 89/ 01/ 15 27132 .73     21 .T . memo   gen
4 016-1 车床 87/ 03/ 05 62044 .61     21 .T . Memo   gen
5 100-1 微机 94/ 08/ 12   8810 .00     12 .T . memo   Gen
6 101-1 复印机 89/ 06/ 01 10305 .01     12 .F . memo   gen
7 210-1 轿车 92/ 05/ 08 151000 .00     11 .F . memo   Gen

3 .1 .2   索引

一、索引的概念
1 . 记录的物理顺序与逻辑顺序
库文件中的记录一般按其磁盘存储顺序输出 , 这种顺序称为物理顺序。执行排序后 ,
在新文件中形成了新的物理顺序。索引则不同 , 它不改变记录的物理顺序 , 而是按某个关
键字建立记录的逻辑顺序。在索引文件中 , 所有关键字值按升序或降序排列 , 每个值对应
原文件的一个记录号 , 因此索引能确定记录的逻辑顺序。例如在显示所有记录时 , 系统将
依次按索引文件中的记录号取出库文件中的物 理记录 , 达 到按 关键字 值顺 序列出 库文 件
记录的效果。
虽然排序与索引都以增加一个文件为代价 , 但 索引文 件要 小得 多 ; 索引起 作用 后 , 增
删或修改库文件的记录时索引文件会自动更新。因此索引的应用比排序广得多。
2 . 复合索引和单索引
・ 73 ・
Fox Pro 支持两类索引文件 :
(1 ) 复合索引文件
复合索引文件的扩展名为 .CDX; 它可包含多个索引 , 每个索引都有一个索引标识 , 代
表一种记录逻辑顺序。这种索引文件总以压缩方式存储 , 以便减少占用存储空间。
复合索引文件又可分为结构的和非结构的两 种 , 若定 义复 合索引 文件 时为它 显式 取
了名字 , 则其为非结构的 , 否则为结构的。打开 非结构 复合 索引文 件需 使用 SE T I NDEX
命令或 USE 命令中的 INDEX 子句 ; 结构复合索引文件与库文件主名相同 , 随库文件打开
而打开 , 在各类索引文件中 , 选用它最为省事。
(2 ) 单索引文件
+
单索引文件扩展名为 .IDX , 它只 包含 一 个索 引 , 这种 类 型是 为了 与 FoxBASE 开 发
+
的应用程序兼容而设置的。但如果将它定义为压缩的 , 则不能被 FoxBASE 使用。
由于非结构复合索引文件不常使用 , 以下仅讨论结构复合索引文件和单索引文件。
二、索引的建立
命令格式 :

    INDEX ON < 索引关键字 >


  TO < 单索引文件名 > | TAG < 索引标识 > [ OF < 复合索引文件名 > ]
  [ FOR < 条件 > ] [ CO MPAC T ] [ ASCENDING | DESCENDING ] [ U NIQUE ] [ ADDI T IVE ]

    功能 : 建立索引文件或增加索引标识。
说明 :
(1 ) TO 子句适用于建立单索引文 件 ( 扩 展名 为 .IDX ) , 其 主名 由 < 单 索引 文件 名 >
指出。COM PACT 选项用来指定该单索引文件为压缩的。
(2 ) TAG 子句适用于建立复 合索 引 文件 ( 扩展 名为 .CDX ) 及 索引 标识 , 或为 已建 的
复合索引文件增加索引标识 , 索引标 识由该 子句 的 < 索引 标识 > 指出。 OF 选项 的 < 复
合索引文件名 > 用于指定非结构复合索引文件 的名字 , 缺 省该 选项表 示建 立结构 复合 索
引文件。
(3 ) 索引关键字可用表 达式表 示。记 录逻 辑顺 序默 认为 升序 , 也可 用 ASCENDING
选项表示升序 , DESCE NDI NG 选项表示降序。
(4 ) U NI QU E 表示对于关键字值相同的记录 , 索引中只列入其中第一个记录。
(5 ) ADDITIV E 表示建立本索引文件时并不关闭先前打开的索引文件。
[ 例 3-2]   建立单索引文件示例。

    USE SB
INDEX ON 名称 TO mcidx         & & 建立名称升序排列单索引文件 MCIDX .IDX
LIST
INDEX ON - 价格 TO jgidx & & 建立价格降序排列单索引文件 JGIDX .IDX
LIST

    [ 例 3-3]   为 SB .DBF 建立一个结构复合索引文件 , 其中包括三个索引 :


(1 ) 记录以价格降序排列。
・ 74 ・
(2 ) 记录以部门升序排列 , 部门相同时则按价格升序排列。
(3 ) 记录以部门升序排列 , 部门相同时则按价格降序排列。

    USE sb
INDEX ON 价格 TAG jg DESCENDING   & & 建立 SB .CDX , 价格为索引关键字 ,JG 为索引标识
LIST & & 记录按价格降序排列 , 此作省略
INDEX ON 部门 + ST R( 价格 , 9 , 2) TAG bmjg   ;
      & & 索引关键字为字符串连接表达式 , 索引标识 BM JG 增入 SB .CDX
LIST & & 索引表达式运算结果升序排列恰使记录按部门 ;
升序、部门相同按价格升序排列
INDEX ON VAL( 部门 ) - 价格 * 100 TAG bmjg1
LIST & & 索引表达式运算结果升序排列恰使记录按部门 ;
升序、部门相同按价格降序排列

三、索引的使用
要进行索引查询 , 必须打开库文件与索引文件。一个库文件可以打开多个索引文件 ,
同一个复合索引文件中也可能包含多个索引标 识 , 但 任何 时候 只有一 个索 引文件 能起 作
用 , 对于复合索引文件只有一个索引标识能 起作 用。当前 起作 用的索 引文 件称为 控制 索
引文件 , 当前起作用的索引标识称为控制索引标识。也就是说 , 实现索引查询必须满足以
下的条件 , 即 : 打开库文件 ; 打开索引文件 ; 确定控制索引文件 ; 对于 复合索引 文件还须 确
定控制索引。
1 . 打开和关闭索引文件
(1 ) 如果当前仅有一个索 引文件 被打 开 , 它就成 为控 制索 引文件。 索引 建立 时索 引
文件呈打开状态且成为控制索 引文件 , 例 3-2 是这种 情形。 如果当 前已 打开 了多 个索 引
文件 , 可通过 SE T INDEX 命令来确定控制索引文件。
(2 ) 除结构复合索引能随着 库文 件的打 开而 打开 外 , 其 它索 引文 件必须 用命 令显 式
打开。
(3 ) 库文件关闭时索引文件就随之关闭。
命令格式 :

    SE T INDEX TO [ < 索引文件表 > ] [ ADDI TI VE ]

    功能 : 打开当前库文件的一个或多个索引文件并确定控制索引文件。
说明 :
(1 ) < 索引文件表 > 可包含多个索引文件 , 索引文件名之间以逗号 分隔 , 表中第一 个
索引文件为控制索引文件。该命令常用于打开单索引文件 , 例如 :

    USE sb
SE T INDEX TO jgidx , mcidx   & & 打开 JGIDX .IDX 和 MCIDX .IDX , JGIDX .IDX 为控制索引 ;
文件
LIST & & 记录按价格降序排列

    ( 2) 若缺省所有选项 , 即仅用 SE T INDEX T O, 将关闭当前工作区中除结构复合索引


・ 75 ・
文件外的所有索引文件 ; 同时取消控制索引。
(3 ) 若缺省 ADDITI VE 选项 , 则 在 用本 命令 打开 索引 文 件时 , 除 结构 复 合索 引文 件
以外的索引文件均被关闭。
(4 ) 命令“ USE < 文件名 > INDEX < 索引文件表 > ”也可在打开库文件的同时打 开
索引文件 , 并确定 < 索引文件表 > 中的第一个索引文件为控制索引文件。
2 . 确定控制索引
复合 索引 文 件建 立时 , 当前 建立 的索 引为 控 制索 引 , 例 3-3 就 是这 种情 形。但 须 注
意 , 库文件重新打开时尽管复合索引文件已自动打开 , 还须确定控制索引。
下面的命令用来确定控制索引 , 也能确定控制索引文件。
命令格式 :

    SE T ORDER TO [ < 数值表达式 > | < 单索引文件名 > |


  [ TAG] < 索引标识 > [ ASCENDIN G | DESCENDING ] ]

    说明 :
(1 ) T O 子句的 < 数值表达式 > 表示已打开索引的序号 , 该序号用来指定控制索引 文
件或控制索引。系统先为各单索引文件编号 , 故结构 复合 索引 文件的 序号 比单索 引文 件
大。
(2 ) T O 子句的 < 单索引文件名 > 指定该单索引文件为控制索引文件。
(3 ) T O 子句的 < 索引标识 > 指定该索引标识为控制索引。
(4 ) SE T ORDER TO 或 SE T ORDER T O 0 命令 取消 控制索 引文 件及 控制索 引 , 库
文件中记录将按物理顺序输出。
[ 例 3-4]   根据例 3-2 、例 3-3 建立的索引改变控制索引。

    USE sb INDEX mcidx , jgidx   & & MCIDX .IDX 和 JGIDX .IDX 打开 , MCIDX .IDX 为控制索引 ;
文件
LIST & & 记录按名称升序排列
SE T ORDER TO TAG jg & & 指定 SB .CDX 的索引标识 JG 为控制索引
LIST & & 记录按价格降序排列
SE T ORDER TO 1 & & 指定 MCIDX .IDX 为控制索引
LIST & & 记录按名称升序排列
SE T ORDER TO & & 取消控制索引文件及控制索引
LIST & & 记录按物理顺序显示
SE T ORDER TO 3 & & SB .CDX 的索引标识 JG 为控制索引( JGIDX .IDX 序号为 2 )
LIST & & 记录按价格降序排列
SE T INDEX TO & & 关闭所有 .IDX 文件 , 取消控制索引
LIST & & 虽 SB .CDX 未关闭 , 但未确定控制索引 , 记录按物理顺序显示

    3 . 删除索引
(1 ) 删除索引文件
若用删除文件命令来 删除 索 引文 件 , 须遵 循 先关 闭后 删除 的 原则 , 这与 删 除库 文 件
类似。
・ 76 ・
(2 ) 删除索引标识
命令格式 :

    DELE TE TAG ALL | < 索引标识 1 > [ , < 索引标识 2 > ] . . .

    功能 : 删除打开的结构复合索引文件的索引标识。
说明 : ALL 子句用于删除结构复合索引文件的所有索引标识。如果某索引文件的所
有索引标识都被删除 , 则该索引文件也就被删除了。
例如删除例 3-3 建立的结构复合索引文件中的索引标识 BMJG1 :

    USE sb
DELE TE TAG bmjg1

四、索引的更新
1 . 自动更新
当库文件中的数据发生变化时 ( 例如对它 进行 插入、删 除、添加或 更新 操作之 后 ) , 所
有当时打开的索引文件都会随数据的改变自动 改变记 录的 逻辑顺 序 , 实现 索引文 件的 自
动更新。例如 :

    USE sb
SE T ORDER TO TAG jg & & 指定索引标识 JG 为控制索引
BROWSE & & 记录按价格降序排列

    若在 BROWSE 窗口中将第六个 记录 的价 格 8810 .00 修 改 为 18810 .00 , 关闭 它后 再


用 BROWSE 命令打开 , 便可看到该记录已被调整为第五个记录。
2 . 重新索引
如果不符合实现索引的条件 ( 参阅本小节 三 ) , 在 修改 库文 件的记 录时 索引文 件就 不
会自动更新。若要维持记录的逻辑 顺序 , 可用 REI NDEX 命令 重建 索引 , 其 命令格 式为 :
REI NDEX [ COMPACT ] ; 当然也可用 I NDEX ON 命令再次建立索引。两者效果相同。
顺便指出 , 上述的建立与删除索引、打开和关 闭索 引文 件、确定控 制索 引文件 和重 建
索引等操作都可通过选单操作完成 , 为节省篇幅 , 这里就从略了。

3 .2   查 询 命 令
所谓查询 , 即按照某些条件在数据库中查找所需的记录。本节将介绍 Fox Pro 支持 的
两种传统的查询方法 : 顺序 查询 和索 引 查询。 与 FoxBASE + 不同 的 是 , Fox Pro 还 支持 在
Fox Pro 环境中直接使用 SQL 型的查询命令———SQL SE LECT 命令。 本章将 在第 3 .4 .4
节介绍这一命令。

3 .2 .1   顺序查 询命令

顺序查询包括 LOCAT E 和 CON TI NU E 两条命令。


命令格式 :
・ 77 ・
    LOCATE FOR < 条件 > [ < 范围 > ] [ WHILE < 条件 > ]

    功能 : 搜索满足 < 条件 > 的第一个记录。若找到 , 记录指针就指向 该记录 ; 若库文 件


中无此记录 , 搜索后 Fox Pro 主屏幕的状态条中将显示“ End of locate scope .”, 此时记录 指
针指向文件结束处。
说明 :
(1 ) 缺省范围为 ALL。
(2 ) 查到记录后 , 要继续往下查找满足 < 条件 > 的记录必须用 CON TIN U E 命令。
[ 例 3-5]   在 SB .DBF 中查询价格小于 15000 元的非主要设备。

    USE sb
LOCATE FOR 价格 < 15000 AND NOT 主要设备
DISPLAY & & 显示 : Record # 编号   名称   启用日期   价格     部门 主要设备   备注   商标
        *               4   038 - 1 钻床   86/ 10/ 12   5275 .00 23     .F .     Memo gen
CONT IN UE
? RECNO( ) , 名称 , 价格 , 主要设备   & & 显示 :   6 复印机     10305 .01 .F .
CONT IN UE & & 状态行显示 : End of locate scope .

3 .2 .2   索引查 询命令

索引查询依赖二分法算法来实现 , 在 2 1 0 个记录中寻找一个满足给定条件的记录 , 不
超过 10 次比较就能进行完毕 ; 而顺序查询最 多需 比较 1024 次。由此 可见 顺序查 询速 度
较慢 , 它只适用于记录数较少的库文件。索引查询速度很快 , 但其算法要求库文件记录是
有序的 , 须事先对库文件进行索引。
Fox Pro 提供 了 SEE K 和 F IND 两条命 令进 行索引 查询 , 它 们的 格式不 一致 , 但查 询
结果相同 , 故下面只介绍 SEE K 命令。
命令格式 :

    SE EK < 表达式 >

    功能 : 在已确定控制索引的库文件中按索引关键字搜索满足 < 表达式 > 值的第一 个


记录。若找到 , 记录指 针 就指 向 该 记录 ; 找不 到 该记 录 则在 主 屏 幕的 状 态条 中 显 示“ No
find .”。
[ 例 3-6]   SE EK 命令用法示例。

    USE sb
INDEX ON 编号 TAG bh
SE EK ″
038 - 1″      & & 不可写为 : SEEK 编号 = ″
038 - 1″
? RECNO( ) & & 显示 : 4
INDEX ON 启用日期 TAG qyrq
SE EK {94/ 08/ 12}
? F OU ND( ) & & 显示 .T ., 表示找到 ; 找不到将返回 .F .
INDEX ON 价格 TAG jg

・ 78 ・
SE EK 1000 .00
? RECNO( ) , FOU ND( )   & & 除在状态条上显示“ No find .”外 , 还在主屏幕上显示 : 8   .F .

    对于 字符串表 达式 , 系统允 许模糊 查找 , 即只要 字符串表 达式值 与索引关 键字值 左


子串相同 , 就认为找到。 命令“ SE T EXACT ON | OFF”用于 设 置 匹配 , ON 表 示完 全 匹
配 , 用于精确 查找 ; OFF 表示 模糊 匹 配 , 系统 默 认 OFF。运 算符 = = 和 = 有 类似 的 功
能 , 前者表示完全匹配 , 后者表示模糊匹配。
[ 例 3-7]   模糊查找与精确查找示例。

    USE sb
SE T ORDER TO TAG bh
SE EK ″
03″                  & & 按编号前两个字符查找
? RECNO( ) , FOU ND( ) & & 显示 : 3   .T .
SE T EXACT ON & & 设置完全匹配环境
SE EK ″
03″
? F OU ND( ) & & 返回 .F .
SE T EXACT OFF & & 恢复成模糊匹配环境

3 .3   VIEW 窗 口
V IEW 窗口是一个用来建立环境 的交 互操作 工具。环境 是指 库文 件的 打 开及 索引、
多个库文件的关联和多种 FoxP ro 开关设置等状态。例如执行下述命令序列

    USE sb
INDEX ON 编号 TAG bh

就设置了一种环境。它可供用户对按照“编号”索引了的 SB .DBF 进行索引查询。如果设


置的环境包括了多个相互关联的库文件 , 就可用于多库文件查询。
利用 V IEW 窗口来建立环境还有以下优点 :
(1 ) 直接发命令来 建立 环 境需 有 一 定的 经 验 , 而 V IEW 窗口 交 互 操作 能 起向 导 作
用 , 显得比较方便。
(2 ) 在 V IEW 窗口设置的环境可以作为视图文件保存起来 , 需要时将视 图文件打 开
就能恢复它所保存的环境。如果用户建立了多个视图文件 , 需要某 个环境时 只要打开 相
应的视图文件便可。

3 .3 .1   多工作 区查询

一、设备数据库
实际应用中常需同时查询多个库文件的数据 , 在本书举例的设 备管理数 据库中使 用
了 4 个库文件 , 除 SB .DBF 已见于第 2 .1 节外 , 还有以下三个库文件。
BMDM .DBF 的结构与内容 :

・ 79 ・
    字段名     类型       宽度                     Record # 代码     名称
代码     Character     2                           1   11     办公室
名称     Character     6 2 12 设备科
3 21 一车间
4 22 二车间
5 23 三车间

    DX .DBF 的结构与内容 :

    字段名   类型           宽度       小数位数           Record #   编号     年月       费用


编号     Character         5                               1     016-1     8911     2763 .5
年月 Character 4 2     016-1 9112 3520 .0
费用 Numeric 6 1 3     037-2 9206 6204 .4
4     038-1 8911 2850 .0

    zz .dbf 的结构与内容 :

    字段名   类型           宽度       小数位数           Record #   编号             增值


编号 Character 5 1     016-1 2510 .00
增值 Numeric 8 2 2     016-2 1000 .00
3     037-2 2020 .00
4     038-1 1200 .00

    BMDM .DBF 中记录了 SB .DBF 中代码的意义 , 例如代码 12 表示的部门名称是设备


科。用代码来表示汉字名称可使输 入或 修改 变得简 便 , 而且 能避免 称呼 不一致 ( 例如 办
公室 , 有时称为厂办 , 会被当作不同的科室 ) 引起麻烦。
DX .DBF 记载设备大修的年月与费用。ZZ .DBF 记 载设 备的 增加值。 若设备 添加 了
附件 , 附件的价值就是增值。
二、选择工作区
1 . 工作区号
库文件打开后才能进行操作。实际上 , 打开库文件就是把它从 磁盘调入 内存的某 一
个工作区。Fox Pro 提供了 225 个工作区 , 编号从 1 到 225。
每个工作区只允许打开一个库文件 , 若在已有库文件的工作区打开新的库文件 , 以前
打开的库文件就会自动关闭。反之 , 一个库文件只能在一个工作区打开 , 在其未关闭时如
果试图在其它工作区打开它 , 会出现出错信息“ File is in use .”。
2 . 别名
前 10 个工作区除编号外 , 还可依次用 A~J 十个字母为工作区别名。
还有一种别名称为库文件别名 , 它用命令“ USE < 文件名 > ALIAS < 别 名 > ”指定 ,
例如命令“ USE SB ALI AS SEBEI”指定 SEBEI 为 SB .DBF 的别名。 如果 未用 ALIAS 子
句对库文件指定 别 名 , FoxPro 默 认 库 文 件 主 名 为 别 名。 例 如 命 令“ USE SB”表 示 SB .
DBF 的别名也是 SB。
3 . SE LECT 命令
・ 80 ・
命令格式 :

    SELEC T < 工作区号 > | < 别名 >

    功能 : 选定某个工作区 , 用于打开一个数据库文件。
说明 :
( 1) 用 SEL ECT 命令选定的工作区称为当前工作区 , Fox Pro 默认 1 号工作区为当前
工作区。函数 SE LECT( ) 可以返回当前工作区的区号。
引用非当前工作区库文件的字段须冠以别名 , 引用格式为 : 别名 .字段名。例如 :

    CLOSE ALL         & & 关闭所有打开的库文件 , 当前工作区为 1 号工作区


? SELECT ( ) & & 显示 :     1
USE bmdm
GO 3
? 名称 & & 显示 : 一车间
SELEC T 2 & & 选定 2 号工作区为当前工作区
USE sb
GO 4
? 名称 , bmdm .名称   & & 显示 : 钻床 一车间 , 后一名称为非当前工作区库文件 BMDM 的字段名

    (2 ) 命令“SE LECT 0”表示 选定 当前未 使用 的最小 号工 作区 , 该 命令 使 用户 不必 记


忆工作区号 , 以后要切换到某 工作 区 , 只要 在 SE LECT 命 令中 使用 库 文件 别名 便可。 注
意 , 库文件打开后方可在 SEL ECT 命令中使用其别名。
[ 例 3-8]   通过多区操作从部门代码查出部门名。

    CLOSE ALL                   & & 关闭所有打开的库文件 , 当前工作区为 1 号工作区


SELEC T 0 & & 1 号工作区未打开库文件 , 选定的工作区即该区
USE sb
GO 3
SELEC T 0 & & 选定 2 号工作区为当前工作区
USE bmdm
INDEX ON 代码 TAG dm
SE EK sb .部门 & & 即 SEEK 22 , 部门为非当前工作区库文件 SB 的字段名
? sb .编号 , a .名称 , 名称 & & 显示 : 037-2 磨床     二车间
SELEC T sb & & 选定 SB .DBF 所在工作区为当前工作区
? 编号 , 名称 , bmdm .名称 & & 显示 : 037-2 磨床     二车间

    (3 ) 命令“ USE < 文件名 > IN < 工作区号 > ”相当于 :


SEL ECT < 工作区号 >
USE < 文件名 >

3 .3 .2   VIEW 窗 口的面板

V IEW 窗口可用选单操作方式或命令工作方式打开和关闭 , 具体方法见表 3 .1。


・ 81 ・
表 3 .1   VIEW 窗口的打开与关闭

选单操作方式 命令工作方式 其它方法

打开 选定 Window 选单的 View 选项 SE T VI EW O N

关闭 选定 File 选单的 Close 选项 SE T VI EW O FF 双击该窗口的控制选单框

    打开 VIEW 窗口将出现如图 3 .1 所示的窗口 , 其左侧工具栏上有 五个图形 按钮 , 代


表 V IEW 窗口的 5 种不同面板 , 可供用户设置环境。

图 3 .1   显示 VI EW 面板的 VIEW 窗口

一、View 面板
View 面板为系统默认面板 , 它 包括 三个 部分。左 边为 工作区 滚动 列表 , 可 从 225 个
工作区中选定当前工作区 , 相 当于 执行 SE LECT 命 令。右 边 是关 联显 示区 , 用于 显示 库
文件之间的关联状况。中间为一列六个功能按钮 , 功能如下。
(1 ) Setup 按钮 : 单击该按钮可打开 Set up 对话框 , 用来 修改当前 库文件 的结构、建 立
或修改索引、或设置字段表与过滤器。与 Database 选单中的 Setup 选项的功能相同。
(2 ) Browse 按钮 : 为当前库文件打开 Browse 窗口 , 供浏览或编辑数据。
(3 ) Open 按钮 : 弹出 Open 对话框来打开库文件。
(4 ) Close 按钮 : 关闭当前库文件。
(5 ) Relation 按钮 : 以当前库文件为父文件建立关联。
(6 ) 1-To-Many 按钮 : 系统默认库文件之间以多一关系关联 ( 参阅第 3 .3 .4 节 ) , 如 果
要想建立一多关系 , 可单击这一按钮 , 与 SE T SKI P T O 命令等效。
[ 例 3-9]   利用 View 窗 口在 不 同的 工 作区 打 开 SB .DBF 和 BMDM .DBF。要 求 为
SB .DBF 设置包括编号、名称、部门等字段的字 段表 , 以编号 大于 03 为 条件 设置过 滤器 ,
随后打开 Browse 窗口。
操作步骤 :
・ 82 ・
(1 ) 打开 View 窗口 : 选定 Window 选单的 View 选项 , 屏幕上出现 View 面板。
(2 ) 打 开 库 文 件 : 选 定 1 号 工 作 区 → 选 定 Open 按 钮 → 在 Open 对 话 框 中 选 定
SB .DBF→选定 Open 按钮返回 View 窗口。
选定 3 号工作区 , 以同样方法打开 BMDM .DBF。
(3 ) 设置字段表和过滤器 : 选定 SB 工作区→选定 Setup 按钮→在 Setup 对话框中 选
定 Fields 按钮→在 Field Picker 对话框中把编号、名称、部门字 段从 All Fields 滚动列表 移
到 Selected Fields 滚动列表中→选定 OK 按钮返回 Set up 对话框→选定 Filter Data 按钮→
在 Expression Builder 对话框中输入条件“编号 > ″03″”→ 选定 OK 按钮返 回 Setup 对话 框
→选定 OK 按钮返回 View 窗口。
(4 ) 为 SB .DBF 打开 Browse 窗口 : 选定 Browse 按钮。操作结果如图 3 .2 所示。

图 3 .2   打开库文件后的 View 窗口和 Browse 窗口

二、On | Off 面板
若选定 On | Off 按钮 , View 窗口将出现 On | Off 面板 , 用来设置 SE T 系 列的命令。 下
章图 4 .1 显示了 On | Off 面板画面 , 由图可见 , 该面板 具有很 多状 态设置。 若某个 复选 框
被选中 , 相当于此状态的 SE T 命令被置为 ON , 否 则为 OFF。例如 选中 SAF E TY 复选 框
表示设置了 SE T SAFE T Y ON 命 令 , 文件 重 写时 系统 就会 给出 提 示信 息。又 如 TALK
复选框被选中表示设置了 SE T T ALK ON 命令 , 执行某些命 令时提 示信息将 显示在主 窗
口的状态条中 , 结果会自动显 示在当 前窗 口的 当 前行 中。 TAL K 能影 响统 计、排 序等 14
条命令提示信息与结果的显示 , 系统 H EL P 中列出了这些命令。
三、Files 面板
该面板可用来设置缺省驱动器、工作 目录 和 FoxPro 路 径 , 也可用 来指 定帮助 文件 和
资源文件。
四、International 面板
该面板用来设置国别参数 , 例如日期格式、货币等。
五、Misc 面板
该面板用于设置时钟、铃声等参数。

・ 83 ・
3 .3 .3   视图文 件

V IEW 窗口设置的环 境可 以 作为 视 图文 件 保 存 , 以 便在 需 要时 恢 复 它所 保 存 的 环
境。
一、视图文件的建立
视图文件可通过选单方式或命令方式建立 , 分述如下。
1 . 选单方式
V IEW 窗口打开时 , 可选定 File 选单的 Save As . . .选项来建立视图文件 , 系统默认视
图文件的扩展名为 .VU E。例如 , 为例 3-9 设置的环境建立视图文件可按以下步骤进行 :
关闭 Browse 窗口→选定 File 选单的 Save As 选项→在 Save As 对话框的文本框中 输
入视图文件名 SB→选定 Save 按钮 , 将产生视图文件 SB .V UE。
注意 , 如果 Browse 窗口打开着则 File 选单的 Save As 选项以淡色显示而不能选用。
2 . 命令方式
命令格式 :

    CREATE VI EW < 视图文件名 >

    功能 : 为 FoxPro 的当前环境建立视图文件。
例如在 VIEW 窗口打开时往命令窗口键入命令 CREAT E VIEW SB, 便 可建立视 图
文件 SB .VU E。
二、视图文件的打开
打开视图文件意味着恢复环境 , 相当于重新执行一系列先前设置的命令。
前所建立的视图文件 SB .V U E 利用选单打开 : 选定 File 选单的 Open 选 项→文件 类
型选定 View→选定文件 SB .VU E→选定 Open 按钮。
SB .VU E 用命令打开 : 往命令窗口键入命令 SE T V IEW TO SB。

3 .3 .4   库文件 的关联

要查询多个库文件的数据 , 有关联和连接两种方法 , 后一方法在第 3 .4 节介绍。


一、关联的概念
两个库文件建立关联后 , 用户便可用命令来查询这两个库文 件的数据。 要查询多 于
两个库文件中的数据 , 需建立多个两两关联。
1 . 关联
两个库文件建立关联后 , 总 有一个 是父 文件 , 另一 个便 为子文 件。在 执 行涉 及这 两
个库文件数据的命令时 , 父文件 记录 指针的 移动 , 会 使子文 件的 记录 指针自 动移 到满 足
条件的记录上。
关联条件要求比较不同库文件的两个字段表达式的值是否相等 , 所以除 了要在命 令
中指出这两个字段表达式外 , 还必须为子文件字段表达式建立索 引。图 3 .3 表示了为 库
文件 SB .DBF 和 BMDM .DBF 建立关联 , 条 件是 SB .部门 与 BMDM .代码两 个字段的 值
相等 , 图中对符合条件的记录画 出了 连线 , 表示 子文 件记录 指针 会随 父文件 记录 指针 移
・ 84 ・
动而移动。

图 3 .3   关联及其多一关系与一多关系

2 . 多一关系
按照不同库文件的两个字段表达式值相等来关联的原则 , 若出 现父文件 多条记录 对
应子文件中一条记录的情况 , 这种 关联 称为多 一关 系。在图 3 .3 中 , 若将 SB .DBF 作 为
父文件来建立关联 , 父文件的部门字段值有多于一个的 21 , 而 BMDM .DBF 代码字段 值
仅有一个 21 , 这表示两个库文件是按照多一关系来关联的。
3 . 一多关系
按照不同库文件的两个字段表达式值相等来关联的原则 , 若出 现父文件 一条记录 对
应子文件中多条记录 的情 况 , 这 种关 联称 为 一多 关 系。在 图 3 .3 中 , 若 将 BMDM .DBF
作为父文件进行关联 , 父文件代码字段值中仅有一个 21 , 而 SB .DBF 部门字段值有多 于
一个的 21 , 这表示两个库文件是按照一多关系来关联的。
Fox Pro 关联不处理“ 多 多关 系”, 如 果 出现“多 多 关系”则 需 将其 中的 一个 库文 件 进
行分解 , 然后以多一关系或一多关系处理。
以下将首先说明在 View 窗口建立关联的方法 , 然后介绍怎样用命令建立关联。
二、利用 View 窗口建立关联
建立关联的一般步骤为 :
(1 ) 打开需建立关联的数据库文件。
(2 ) 将子文件按关联的关键字建立索引或确定主控索引。
(3 ) 选定父文件工作区为 当前工 作区 , 并 与一个 或多 个子 文件建 立关 联。建 立的 关
联默认为多一关系。
(4 ) 说明一多关系。仅建立一多关系需要该步骤。
[ 例 3-10]   由库文件 SB .DBF 和 BMDM .DBF 查 找 1989 年 后启 用的 设 备 , 要求 显
・ 85 ・
示设备的编号、名称、启用日期和部门名。
解法 1 : 建立多一关系。
(1 ) 打开库 文件 : 选 定 Window 选 单的 View 选项 → 在 View 窗口 1 号 工 作区 打 开
SB .DBF ; 在 2 号工作区打开 BMDM .DBF。
(2 ) 为子文件建立索引 : 选定 BMDM 工作区→选定 Setup 按钮→在 Set up 对话框 中
选定 Add 按钮→在 Open 对话框中选定 New 按钮→在 Index 对话框中双击 Fields 滚动 列
表的代码字段 , 使该字段移到 Index Key 滚动列表中→选定 OK 按钮返回 Set up 窗口→选
定 OK 按钮返回 View 窗口。
(3 ) 建立关联 : 选定 SB 工作区→选定 Relations 按钮→选定 BMDM 工作区→在表达
式构造器的 Fields 滚动列表双击部门字段 ( 参 阅图 3 .4 ) →选 定 OK 按 钮 , 多一关 系建 立
完成。View 窗口显示如图 3 .5 所示。

图 3 .4   在表达式构造器中指定部门字段

图 3 .5   建立多一关系后的 View 窗口
( 4) 建立视图文件 : 选定 File 选单的 Save As 选项→在 Save As 对话框的文本框中输

・ 86 ・
入视图文件名 SBBM→选定 Save 按钮 , 即产生视图文件 SBBM .V UE。
(5 ) 显示结果 : 往命令窗口输入如下命令 :

    BROWSE FI ELDS Sb .编号 , Sb .名称∶H = ′设备名′, ;


  Sb .启用日期 , BMDM .名称∶H = ′
部门名′F OR Sb .启用日期 > = {89/ 01/ 01}

    命令执行结果见图 3 .6。
解法 2 : 建立一多关系。
建立一多关系只须在第三个步骤后加一步
骤 , 即选定 VIEW 面板 的 1 - To - Many 按 钮
来设置一多关系。
(1 ) 在 View 窗 口 1 号 工 作 区 打 开 SB .
DBF ; 在 2 号工作区打开 BMDM .DBF。 图 3 .6   多一关系显示部门名的 Browse 窗口
(2) 为 子 文 件 SB .DBF 的 部 门 字 段 建 立
索引。
(3 ) 以 BMDM .DBF 为父文 件建 立关联 : 选定 BMDM 工作 区→ 选 定 Relations 按 钮
→选定 SB 工作区→在表达式构造器的 Fields 滚动列表双击代码字段→选定 OK 按钮。
(4 ) 说明一多关系 : 选定 1 - To - Many 按钮→在 1-To-Many 对话框 ( 参阅图 3 .7 ) 中
将子文件从 Child Aliases 滚动列表移入 Seleted Aliases 滚动列表中→选定 OK 按钮。

图 3 .7   显示部门名的 Browse 窗口

(5 ) 显示结果 : 往命令窗口输入如下命令 :

    BROWSE FI ELDS BMDM .名称∶H = ′部门名′, Sb .编号 , ;


  Sb .名称∶h = ′设备名′, Sb .启用日期 FOR Sb .启用日期 > = {89/ 01/ 01}

    命令执行结果见图 3 .8。该图与图 3 .6 略有不同 , 设备科有两个记录 , 仅 第一个记 录


显示部门名。这是一多关系 Browse 窗口的特点。
三、用命令方式建立关联
1 . 建立关联命令
命令格式 :
・ 87 ・
    SE T RELAT ION TO [ < 表 达式 1 > INTO <
别名 1 > , … , < 表 达式 N > INTO < 别名 N
> ] [ ADDI T IVE]

    功能 : 以当前库文件 为父文件 与其他 一


个或多个库文件建立关联。
说明 :
(1 ) < 表达式 > 用来 指定父文 件的字 段
表达式 , 其值将与子文件索引关键字对照 , 看 图 3 .8   一多关系显示部门名的 Browse 窗口
二者是否相同。 < 别名 > 表示子文件或其所
在的工作区。
(2 ) ADDITIV E 保证在建立关联时不取消以前建立的关联。
(3 ) 命令“ SE T RELATI ON T O”解除关联。
例 3-10 设置的多一关系如用命令序列表达将如下所示 :

    SELEC T 2
USE bmdm                           & &   子文件
INDEX ON 代码 TAG 代码 ADDI TI VE & &   子文件以代码字段建立索引
SELEC T 1
USE sb & & 父文件
SE T R ELATIO N TO sb .部门 INTO bmdm ADDI T IVE   & & 指定部门字段 ; 对子文件设置多一关

    通过 V IEW 窗口建立的关联将在命令窗口产生一个命令序列 , 其内容与此一致。


[ 例 3-11]   试用命令方式来列出设备价格、增值和部门名。

    SELEC T 2
USE bmdm                       & & 子文件 1
SE T ORDER TO TAG 代码
SELEC T 3
USE zz & & 子文件 2
INDEX ON 编号 TAG bh
SELEC T 1
USE sb & & 父文件
SE T RELAT ION TO sb .部门 INTO bmdm
SE T RELAT ION TO sb .编号 INTO zz ADDI T IVE
BROWSE FI ELDS 编号 , 价格 , zz .增值 , bmdm .名称 : H = ′
部门名′

    命令序列执行结果如图 3 .9 所示。
如果要清除父文件与某个子文件之间所 建立的关 联 , 可 使用命 令“ SE T RE LA TION
OFF I NT O < 别名 > ”。该命令在父文件所 在工作 区使 用 , < 别 名 > 为子 文件别 名或 其
所在工作区的别名。
2 . 说明一多关系的命令
・ 88 ・
命令格式 :

    SET SKIP TO [ < 别 名 1 > , < 别 名 2 > , …


< 别名 N > ]

    功 能 : 用 在 SE T RELA TION 命 令 之
后 , 说明关联性质为一多关系。
说明 :
(1 ) < 别名 > 表示在 一多关系 中位于 多
方的子文件或其所在的工作区。
图 3 .9   一父多子 Browse 窗口
(2 ) 不带可选项的命令“ SE T SK IP TO”
取消一多关系 , 但 SE T RELA TION 命令建立的多一关系的关联仍存在。
例 3-10 设置的一多关系若用命令序列表达 , 将如下所示 :

    SELEC T 1
USE sb
INDEX ON 部门 TAG bm ADDI T IVE
SELEC T 2
USE bmdm
SE T RELAT ION TO bmdm .代码 I NTO sb ADDIT I VE
SE T SKIP TO sb       & & 说明子文件为多方

3 .4   RQBE 窗 口

为方便用户查询 , FoxPro 还提 供了 一种 交互 方 式的 查询 工具 RQBE。RQBE( Rela-


tional Query By Example ) 的全称为“ 范 例关 系查 询”, 它用 示 例的 方法 生成 查询 条 件 , 使
不懂 FoxP ro 命令的用户也能进行查询。

3 .4 .1   RQBE 查 询

进行 RQBE 查询必 须打 开 RQBE 窗 口。该 窗 口用 来 设 置 被查 询 的 库 文 件、查 询 条


件、输出表达式和输出形式 ; 它还具有执行查询和保存查询的功能。
一、打开 RQBE 窗口
打开 RQBE 窗口的方式分命令和选单两种。
1 . 命令方式打开
打开 RQBE 窗口可使用命令 MODIFY QU ERY < 查询文件名 > , 查询文件的扩展名
默认为 .QPR。例如往命令窗口键 入命 令 MODI FY Q U ERY SB , 并在 随 后出 现的 Open
对话框 中 选 定 Cancel 按 钮 , 屏 幕 上 即 出 现 标 题 为 RQBE-SB 的 RQBE 窗 口 ( 参阅 图 3 .
10 ) 。如果事先已打开了某个库文件 , 则该库文件被默认为所要查询的库文件 ; 如果事先
未打开过库文件 , 也可在 Open 对话框中选定一个所要查询的库文件。
也可用 UN TIT LED 为临时名来建立查询文件 , 但存盘时必须正式取名。需要指出 ,
・ 89 ・
查询文件用于保存 RQBE 查询设 置或 用来 执 行查 询 , 它并 非 所要 查询 的库 文件 , 两者 的
扩展名也不同 , 前者是 .QP R , 后者是 .DBF。

图 3 .10   RQBE 窗口的初始状态

2 . 选单方式打开
(1 ) 建立查询
选定 File 选单的 New 选项→选定 New 对话框的 Q uery 单选钮→选定 New 按钮→在
Open 对话框中选定 Cancel 按钮。
或者 :
选定 File 选单的 Open 选项→在 Open 对话框的 Type 弹出控制中选定 Query 选项 →
选定 New 按钮→在 Open 对话框中选定 Cancel 按钮。
(2 ) 修改查询
选定 File 选单的 Open 选项→在 Open 对话框的 Type 弹出控制中选定 Query 选项 →
在滚动列表中选定 < 查询文件名 > .QPR→选定 Open 按钮。
二、查询基本步骤
利用 RQBE 窗口进行查询的基本步骤为 : 打开 RQBE 窗 口→进 行查询 设置 , 即设 置
被查询的库文件、查询条件、输出表达式和输出形式→执行查询。
[ 例 3-12]   在 Browse 窗口显示设备的名称和增值。
分析 : 由于设备的名称和增 值分 属两个 库文 件 , 故需 把 SB .DBF 和 ZZ .DBF 连接 起
来 , 连接条件是“ SB .编号 = ZZ .编号”。
操作步骤如下 :
(1 ) 打开 RQBE 窗口 : 往命令窗口键入命令 MODIFY QU ERY SBM。
(2 ) 确定要查询的库文 件 : 选定 Add 按钮 , 在 Open 对话 框 中双 击 SB .DBF 后该 库
文件就被增入 T ables 滚动列表 ; 以同样的 方法将 ZZ .DBF 增 入 Tables 滚 动列 表 ( 参阅 图
3 .11 ) 。
・ 90 ・
图 3 .11   设置查询后的 RQBE 窗口

(3 ) 设置查询条件 : ZZ .DBF 增入 Tables 滚动列表后即出现如图 3 .1 2 所示的 RQBE


Join Condition 对话框 , 表明默认的连接条 件为“ZZ .编号 Like SB .编号”( Like 即 = ) , 选
定 OK 按钮确认此条件。

图 3 .12   RQBE 连接条件对话框

(4 ) 选取输出字段 : 选定 Fields 复选框 , 在随后弹出的 RQBE Select Fields 对话框中


将 SB .编号、SB .名称和 ZZ .增值等三个字段从 Table Fields 滚动列表移入 Selected Output
滚动列表 ( 参阅图 3 .13) 。
(5 ) 执行查询 : 选定 Do Query 按钮 , 即出现如图 3 .14 所示 Browse 窗口。
执行查询除可在 RQBE 窗口选定 Do Query 按钮外 , 还有以下两种方法 :
方法一 : 执行命令“ DO   < 查询文件名 > ”, 但此时不可缺省扩展名 .Q PR。
方法二 : 选 定 Run 选 单 的 Query 选 项→ 在 Open 对 话 框 中选 定 某查 询 文件 → 选 定
Run 按钮。
三、RQBE 查询的保存
RQBE 查询经过修改后 , 在 RQBE 窗口关闭前可用以 下三 种方法 之一 来保存 查询 设
置 , 以免下次重新设置。查询设置将保存在扩展名为 .QP R 的查询文件中。
(1 ) 双击 RQBE 窗口的控制选单框或在其控制选单框中选定“ 关闭”选项 , 将会出 现
・ 91 ・
图 3 .13   RQBE 选字段对话框

确认对话框要用户回答要否保存查询。例如要保存
例 3-12 的查询 , 可双击 RQBE 窗口的 控制选单框 ,
对 于 确 认 对 话 框 的 询 问“ Do you want to save
changes to sbm .qpr ?”, 应 选 定 Yes 按 钮 来 保 存 查
询。
(2 ) 按组 合 键 Ct rl + W , 此 时 RQBE 窗 口 的 设
置存盘且窗口被关闭。
( 3) 选定 File 选单的 Save 选项 , 此时 RQBE 窗 图 3 .14   查询结果 Browse 窗口
口的设置存盘但窗口不关闭。

3 .4 .2   RQBE 的 窗口组成

上小节已 举过 一 个 通 过 RQBE 窗 口 实 现 对 多
个库文件进行查询的例子 , 这里再对组成 RQBE 窗口的四个部分分别作补充说明。
一、Tables 滚动列表及 Add 等按钮
这部分位于 RQBE 窗口上半部分左侧 , 其中包括如下对象。
Tables 滚动列表 : 用于显示所要查询的库文件。
Add 按钮 : 用于将库文件增入 Tables 滚动列表。选定该按钮将出现 Open 对话框 , 在
此对话框中可选取库文件。再次增入库文件时会弹出一个 RQBE Join Condition 对话框 ,
若两个库文件具有相同字 段 , 会 自动 在 框中 列 出字 段 相等 的 式子 作 为 默认 的 连接 主 条
件 , 但允许进行修改 ; 选定 OK 按 钮 返回 RQBE 窗 口 后 , 该 条 件 将 自动 显 示 在 Selection
Criteria 区的条件行中。
Clear 按钮 : 用于清除 T ables 滚动列表中选定的库文件。
二、Selection Criteria 区
Selection Criteria ( 选择 标准 ) 区位 于 RQBE 窗 口下 半 部 分 , 用 于 输 入 或 修 改 查 询 条
件。
・ 92 ・
主条件只能在 RQBE Join Condition 对话框中修改 , 单击条件行字段名左 边的左右 箭
头按钮或双击 Tables 滚动列表中的库文件名 , 都会弹 出该对 话框。后一 方法也可 用于 增
加主条件。主条件与其它条件的关系可表达为 : 主条件 AND ( 其它条件的组合 ) 。
除主条件外的其它条件都 在 Selection Criteria 区 输入 , 该区 条件 行中 各 对象 的作 用
说明如下 :
上下箭头按钮 : 拖动该按钮可改变条件之间的次序。
Field Name 弹出控制 : 包含 各库文件的字段和 < Expression > 选项 , 供用户选择字 段
或构造表达式。选定 < expression > 选项时会弹出表达式构造器。
NO T 列复选框 : 打勾表示选择了否定。
运算符弹出控制 : 在 NO T 列右侧 , 它包含以下比较运算符 ,
Like               相当于 =
More Than 相当于 >
Less Than 相当于 <
Exactly Like 相当于 = =
Between 相当于 BE TWE EN 函数
In 相当于 I NLIST 函数
Example 列文本框 : 用于输入数据。
U p/ Lo 列复选框 : 打勾表示字母不区分大小写。
Insert 按钮 : 用来在选定行上方插入一个新行。
Remove 按钮 : 用来删除选定的一个条件。
OR 按钮 : 系统默认条件之间的 逻辑 关系 为 AND。 若选 定该 按钮“ OR”字样 将独 占
一行 , 用于表示与该行相邻的两个条件为 OR 关系。
三、Output Fields 滚动列表及 Fields 等复选框
这部分位于 RQBE 窗口上半部分中央 , 其中包括如下对象。
Out put Fields 滚动列表 : 用来显 示 输出 表达 式 , 上 下拖 动某 行的 上下 箭 头按 钮可 改
变各表达式的显示顺序。
Fields 复选框 : 选定该复选框将弹出 RQBE Select Fields 对话框 ( 参阅 图 3 .13) , 用 此
对话 框 的 Table Fields 滚 动 列 表 来 选 定 输 出 字 段。 若 要 输 出 表 达 式 , 可 利 用 对 话 框 中
Functions/ Expressions 区的弹出控制来 构造 表 达式 , 或 在文 本 框 中直 接 输入 表 达式 , 然
后选定 Move 按钮将表达式移入 Selected Ou tpu t 滚动列表。
Order By 复选框 : 该复选框可用于指定记录按 某表达 式升 序 ( 或降 序 ) 输 出。选定 该
复选框将弹出 RQBE Order By 对 话 框 , 然后 双击 Selected Out pu t 滚动 列表 中 某表 达式 ,
使该表达式移入 Ordering Criteria 滚动列表 ( 参 阅图 3 .17 ) 。如果 要降 序输 出 , 在 移动 表
达式前需先选定 Descending 单选钮。
Group By 复选框 : 该复选框可用于按某表达 式值 进行 分组 , 分组 后输 出结果 中表 达
式值相同的 记 录 只 输 出 一 个。 选 定 该 复 选 框 将 弹 出 RQBE Group By 对 话 框 ( 参 阅 图
3 .18 ) , 双击 Fields In Table 滚 动 列 表 的 某 表 达 式 , 它 就 被 移 入 Group By Fields 滚 动
列表。
・ 93 ・
Having 复选框 : 该复选框可用于在分组的情 况下 设置 查询条 件。选定 该复选 框即 可
弹出 RQBE Having 对话框 , 此对话框用来输入或修改条件。
以上各复选框的应用可参阅下文例 3-13。
四、Output 弹出控制及其它选项
这部分位于 RQBE 窗口上半部分右侧。
Out put 弹出控制用于指定查询的输出形式 , 它包含下面五个选项。
(1 ) Browse 选项 : 使输出结果暂时在 Browse 窗口显示。
(2 ) Report/ Label 选项 : 把结果输出到一个新的或已有的报表或标签文件中。
(3 ) T able/ DBF 选项 : 输出结果存储到库文件中 , 文件名通过 Save As 对话框指定。
(4 ) Cursor 选项 : 输出结果存入一个临时的库文件。文件名在 Name 文本框输入 ; 该
库文件仅存储在内存中 , 一旦关闭文件便消失。
(5 ) Graph 选项 : 输出形式可选择十二种常用统计图之一。
Name 文本框 : 选定 T able/ DBF, Cursor , Graph 选项后可用来输入文件名。
Options 复选框 : 选定 Report/ Label 选 项时 成 为 可 选 , 选 定 该 复 选框 将 弹 出 RQBE
Display Options 对话框 , 以便用户设置打印参数。
Do Q uery 按钮 : 执行查询并输出结果。
See SQL 按钮 : 用于显示由 RQBE 查 询产 生的 SQ L SEL ECT 命 令。显 示出 的命 令
为只读 , 不能编辑 , 但可通过剪贴板复制和粘贴。
[ 例 3-13]   试汇总设备的大修费用 , 要求
(1 ) SB .编号头三位小于 038。
(2 ) 显示设备名称与大修费用小计。
(3 ) 显示结果按大修费用小计降序排列。
分析 : 为显示设备名称与 大修费 用小 计 , 需要把 SB .DBF 和 DX .DBF 连 接起 来 ; 为
对大修费用小计 , 需要按字段 DX .编号进行分组并求出每组大修费用之和。
操作步骤如下 :
(1 ) 打开 RQBE 窗口 : 往命令窗口键入命令 MODIFY QU ERY FYHZ。
( 2 ) 确定要查询的库文件 SB .DBF 和 DX .DBF : 选定 Add 按钮 , 在 Open 对话框中双
击 SB .DBF 后该库文件就被增入 Tables 滚动列表 ; 以同样的方法将 DX .DBF 增入 Tables
滚动列表 ( 参阅图 3 .15) 。
(3 ) 设置查询条件“DX .编号 = SB .编号 AND LEF T ( SB .编 号 , 3 ) < ″038″
”: 当 DX .
DBF 增入 T ables 滚动列表后即出现 RQBE Join Condition 对话框 , 其 中表 明连接 条件 为
“DX .编号 = SB .编号”, 选定 OK 按钮确认此条件。
现在输入条件“ LE FT ( SB .编号 , 3 ) LESS T HAN ″038″
”。单击第 二个条 件行的 Field
Name 列→在弹出控制中选定 < expression > 选项 →在 表达 式构 造器的 expression 滚动 列
表中键入 LEF T ( SB .编号 , 3 ) →选定 OK 按钮返回 RQBE 窗口→在 NO T 列右侧弹出控制
中选定 Less Than→在 Example 列文本框中键入字符串″
038″。
(4 ) 设置输出表达式 SB .名称和 SU M ( DX .费用 ) : 选 定 Fields 复 选框 , 在随 后弹 出
的 RQBE Select Fields 对话框 ( 参阅图 3 .16 ) 中双击 SB .名称 , 将该字段从 Table Fields 滚
・ 94 ・
图 3 .15   例 3-13 R QBE 窗口

动列表移入 Selected Ou tpu t 滚 动列表→在 对话框中 F unctions/ Expressions 区文本框中 输


入 SU M ( DX .费用 ) , 然后选定 Move 按钮将该表达式移入 Selected Output 滚动列表。

图 3 .16   例 3-13 选字段对话框

(5 ) 设置按表达式 SU M ( DX .费 用 ) 降 序输 出 : 选 定 Order By 复 选框 → 选定 RQBE


Order By 对话框 ( 参阅图 3 .17 ) Descending 单选钮→双击 Selected Out put 滚动列表的表达
式 SU M ( DX .费用 ) , 将它移入 Ordering Criteria 滚动列表→ 选定 OK 按钮返 回 RQBE 窗
口。
(6 ) 按字段 DX .编号分组 : 选定 Group By 复选框→在 RQBE Group By 对话框 ( 参阅
图 3 .18 ) 中双击 Fields In Table 滚动列 表的表达 式 DX .编号 , 将 它移入 Group By Fields
滚动列表→选定 OK 按钮返回 RQBE 窗口。
(7 ) 执行查询 : 选定 Do Query 按钮 , 即出现如图 3 .19 所示的 Browse 窗口。
・ 95 ・
图 3 .17   排序对话框

图 3 .18   分组对话框

(8 ) 保存查 询 : 选 定 File 选 单的 Save As 选 项


→在 Save As 对话框 中输入查 询文件 名 FYHZ→ 选
定 Save 按钮。

3 .4 .3   图形处 理

前已指出 , RQBE 允 许将 查 询 结果 以 图形 的 形
式输出。本小节将简介 FoxP ro 的图形输出功能 , 包 图 3 .19   例 3-13Browse 窗口
括 : 在 RQBE 查询 中 输出 统 计 图 ; 对 通用 型 字 段 中
图形的处理。
一、输出统计图
在 RQBE 窗口 Ou tpu t 弹出控制中选定 Graph 选项 , 就可以输出统计图。
[ 例 3-14]   试为例 3-13 的 RQBE 窗口设置输出直方图。
(1 ) 打开 RQBE 窗口 : 往命令窗口键入命令 MODIFY QU ERY FYHZ。
(2 ) 在 Out put 弹出控制中选定 Graph 选项→选定 Do Q uery 按钮 →在图 形向导对 话
框 ( Microsoft FoxPro GraphWizard) 中单 击三 维直方 图图 形按 钮 ( 见图 3 .20 ) →选 定前 进
按钮后 , 在制作图形标题文本框中键入“ 大修费用 汇总图”( 此 图未 列出 ) → 选定前 进按 钮
・ 96 ・
后 , 在如图 3 .21 所示的图形输出选择对话框中选定缩放按钮 , 此时 即显示放 大后的大 修
费用汇总三维直方图。

图 3 .20   图形向导对话框

图 3 .21   图形输出选择对话框

从本例可以看到 , FoxPro 能通过图形向导对话框 引导 用户方 便地 输出 图形 , 下面 进


一步说明输出统计图的有关问题 :
(1 ) 图形向导对话框中含有直方图、折线图、圆饼图 等多种统 计图供 用户挑选 , 默 认
为输出二维直方图。
(2 ) 为输出图形通常需选取两个以上表 达式 , 并且至 少要有一 个数字表 达式。这 是
出于构图的需要 , 即用一个表达式来表示分 点 , 另 一个数 字表达式 表示幅度。 如果选 取
了 N 个表达式 , 则其中有 N - 1 个数字表达式可对比幅度。
(3 ) 图形输出选择对话框中 可选 择显示、打 印或 存入某 个库 文件 的通用 型字 段等 输
出形式 , 默认形式为显示。
・ 97 ・
在本例中 , 要将直方图存入通用型字段 , 则操作步骤可修改为 : 在图形输 出选择对 话
框中选定“另存为”按钮→在 Save As 对话框 中输 入文件 名 FY HZ T→ 选定 Save 按 钮 , 图
形便存入库文件 FYHZT .DBF 的通用型字段 OLEGRAPH。存储图形的库文 件可由用 户
取名 , 但其结构由系统生成。
(4 ) 要想修改图形 , 双击放大后的图形即可。
Fox Pro 还提供了一个能直接打 开图 形向 导 对话 框的 应用 程序。 如果 将 与图 形有 关
的数据存入一个库文件 并打 开 它 , 然后 用 DO 命 令运 行 C∶ \ FOXP ROW 下 的 应用 程 序
GENGRAPH .APP, 屏幕上即出现图形向导对话框 , 便可导出图形。例如执行 下述命令 序
列:

    USE sb
COP Y TO sb1 FI ELDS 编号 , 价格
USE sb1
DO \ foxprow \ gengraph .app       & & 出现图形向导对话框

二、通用型字段中的图形处理
Fox Pro 的通用型字段不但可存储图形 , 而且其中的图形可以修改和输出。
1 . 打开通用型字段窗口
方法一 : 双击 Browse 窗口的 gen 字段。
方法二 : 用命令打开通用型字段窗口。例如执行下述命令序列就能打开名为“ SB .商
标”的通用型字段窗口。

    USE sb
GO 5
M ODIF Y general 商标   & & 出现标题为“SB .商标”的通用型字段窗口 , 其中显示一台微机

    2 . 将图形存人通用型字段
方法一 : 在如图 3 .21 所示的图形输出选择对话框中选定“另存为”按钮。
方法二 : 通过剪贴板。
Fox Pro 的通用型字段可存储图 形、图 像、声 音等 多媒 体数 据。它 可以 接 受本 系统 以
及 Windows 的画笔、Word、Excel 等其它应用 程序 的 多媒 体数 据 , 例如 画 笔中 的 .BMP 文
件 , 但它的多媒体数据不可向其他 Windows 应用程序传送。
通过剪贴板传送的图形可以有 三类 : 图形 向导 对话框 输出 的图形 ; 库 文 件通 用型 字
段的图形 ; 选定 Edit 选单的 Insert Object 选项 , 再在 Inser t Object 对话框选定某个应用 程
序而建立的图形。
通过剪贴板将图形存人通用型字段的步骤 是 : 选 定 Edit 选 单的 Copy 或 Cut 选项 将
源图形送剪贴板→选定 Edit 选单的 Paste 或 Paste Special 选项将 剪贴板上 的图形 粘贴 到
目标通用型字段。
通用型字段也可 存 储 声 音。如 果 选 定 Edit 选 单 的 Insert Object 选 项 后 , 又 选 取 了
Windows 的某声音文件 ( .WAV ) 并将它通过剪贴板存入 通用型 字段 , 以后只 要双击该 通
用型字段中声音文件的图标 , 便会奏出音乐。 但放音 乐的 电脑 必须配 备声 霸卡并 执行 过
・ 98 ・
声音驱动程序 , 还要带有音箱。
3 . 图形的修改
如果通用型字段已储有图形 , 双击通用型字段窗口就会自动进 入产生该 图形的应 用
程序编辑窗口。例如双击 SB .DBF 第五个记录的 Gen 区打开 通用型 字段窗 口后 , 然后 双
击该窗口就会出现画笔窗口。
4 . 图形的输出
通用型字段图形可以通过命令输出。
命令格式 :

    @ < 行 , 列 > SAY < 位图 文件名 > BI TMA P | < 通 用型字 段名 > [ ISOME TRIC | STR ETCH ]
[ SIZE < 数字型表达式 1 > , < 数字型表达式 2 > ] [ NOWAI T ]

    功能 : 输出 .BM P 文件图形或通用型字段图形。
说明 :
(1) < 行 , 列 > 表 示 图 形 左上 角 的 位 置。例 如 执 行 下 述 命 令 序 列 将 显 示 预 先 存 人
OLE GRAPH 通用型字段的图形 :

    USE fyhzt
@3 , 2 SAY olegraph   & & 在指定位置显示通用型字段 OLEGRAPH 存储的大修费用汇总图

    (2 ) SIZE 子句的 < 数字型表达式 1 > 表示 输出对 象的高 度 , < 数 字型表 达式 2 > 则
表示宽度。高度和宽度分别以当前字体的字符高、宽为单位 , 可以使用小数。
(3 ) 该命令也能输出位图 文件存 储的 图形 , 但 < 位图 文件 名 > 要 用引 号括 起来。 例
如:

    @5 , 20 SAY ′\ foxprow \ fox .bmp′BI TMAP     & & 显示狐狸头

    选项 ISOM E TRIC 与 ST RE TCH 能使 图形随 SIZE 设置 改变 大小 , 不 同的是 前者 将


使图形保持原来形状 , 后者才能按 SIZE 的高度与宽度设置改变形状。
(4 ) 该命令可将图形输出到打印机 , 但在其前要放一条 SE T DEV ICE T O PRI NT 命
令 , 而其后还要放一条 SE T P RIN T ER T O LP T1 .DOS 命令方能打印 ( 参阅第 7 .2 节 ) 。

3 .4 .4   SQL SELECT 命令

前已谈到 , 在 RQBE 窗口中有一个“See SQL”按钮 , SQL( Struct ured Query Language)


称为结构化查询语言 , 是关系数据库管理系统 的一种标 准查询 语言 , 具有功能 强而命 令
简洁的特点。 FoxP ro 提供了一 条 SQL SEL ECT 查询 命令 , 利用 它可 在程 序 中简 便地 实
现查询。通过 RQBE 查询能自动生成 相应的 SQL SE LECT 命 令 , 但 SQ L SE LECT 命 令
本身具有比 RQBE 窗口更多的查询功能。
一、通过 RQBE 查询生成 SQL SELECT 命令
若在例 3-12 操作之后选定 See SQ L 按钮 , 将出现一个 sbm .qpr ( Read Only) 窗口 , 其
中显示出由 RQBE 查询产生的 SQL SEL ECT 命令 :

    SELEC T sb .编号 , sb .名称 , zz .增值 ;


・ 99 ・
FROM sb , zz ;
WHER E zz .编号 = sb .编号

    该命令的 F ROM 子句将分别打开 SB .DBF 和 ZZ .DBF ; 由 WHERE 子句 指出两个 库


文件的连接条件“Zz .编号 = Sb .编号”; SE LECT 子句则 选定输出 字段 Sb .编号、Sb .名
称和 Zz .增值。
注意 , RQBE 查询生成的 SQ L SE LECT 命 令是只 读的 , 但 可被剪 贴到 命 令窗 口或 程
序中去。如果在命令窗口执行上述命令 , 其输出结果将与例 3-12 完全一致。
二、SQL SELECT 命令的格式
命令格式 :

    SELEC T [ ALL | DIST INC T ]


  [ < 别名 > .] < SELECT 表达式 > [ AS < 列名 > ] [ , [ < 别名 > .] < SELECT 表达式 > [ AS <
列名 > ] . . .]
FROM < 库文件名 > [ < 本地名 > ] [ , < 库文件名 > [ < 本地名 > ] . . .]
[ [ INTO < 目标 > ] | [ TO FI LE < 文 件名 > [ ADDI TI VE ] | TO PRINTE R [ PROM PT ] | TO
SCREEN] ]
[ PREFER ENCE < 名字 > ] [ NOCONSOL E] [ PLAIN ] [ NOWAIT ]
[ WHERE < 连接主条件 > [ AND < 连接主条件 > . . .]
  [ A ND | OR < 过滤条件 > [ AN D | OR < 过滤条件 > . . .] ] ]
[ GRO UP BY < 组表达式 > [ , < 组表达式 > . . .] ]
[ HAVIN G < 过滤条件 > ]
[ U NION [ ALL ] < SELECT 命令 > ]
[ ORDE R BY < 表达式 > [ ASC | DESC] [ , < 表达式 > [ ASC | DESC] . . .] ]

    说明 :
(1 ) SEL ECT 子句 : ALL 表示选出的记录 中包括 重复 记录 , 这是 默认 值 ; DISTINCT
则表示选出的记录中不包括重复记录。
[ < 别名 > .] < SE LECT 表 达式 > [ AS < 列 名 > ] : < SEL ECT 表达式 > 可 以是 字
段名 , 也可以包含用户自定义函数和如表 3 .2 所 示的系 统函 数。 < 别 名 > 是字段 的库 文
件名 , < 列名 > 表示输出时使用的标题名。

表 3 .2   < SELECT 表达式 > 中可用的系统函数

函 数 功 能

AVG( < SELEC T 表达式 > ) 求 < SELEC T 表达式 > 值的平均值

COU NT ( < SELECT 表达式 > ) 统计记录个数

MIN ( < SELECT 表达式 > ) 求 < SELEC T 表达式 > 值中的最小值

MAX( < SELECT 表达式 > ) 求 < SELEC T 表达式 > 值中的最大值

SU M( < SELECT 表达式 > ) 求 < SELEC T 表达式 > 值的和

    当 SE LECT 表达式中包含上述函数时它不再按记录输出。例如 :
・ 1 00 ・
    SELEC T 编号 , 价格 * 0 .17 AS 增值税 FROM sb       & & BROWSE 窗口按记录显示多行
SELEC T AVG( 价格 ) * 0 .17 AS 增值税均值 FROM sb & & BROWSE 窗口除标 题外只 显示一 个
数据

    (2 ) FROM 子句 : 用于指定查询的库文件 , 但选择工 作区和 打开库文 件均由 系统 自


行安排。
< 本地名 > 是库文件的暂用名 , 取了本地名 后 , 本 命令中 该库文件 只可使用 这个 名
字。
(3 ) IN T O 与 TO 子 句 : 用 于 指 定 查 询 结 果 的 输 出 去 向 , 默 认 查 询 结 果 显 示 在
BROW SE 窗口中。
IN TO 子句中的 < 目标 > 可以有 3 种选项 , 如表 3 .3 所 示。表中 数组 将在第 四章 讲
述。

表 3 .3   目 标 选 项

目 标 输 出 形 式

ARRAY < 数组 > 查询结果输出到数组

CURSOR < 临时库文件名 > 查询结果输出到临时库文件

DBF < 库文件名 > 查询结果输出到库文件

    TO FIL E 子句的 < 文件名 > 表示输出到指定的文本文件 , 取代原文件的内容。AD-


DIT IVE 表示只添加新数据 , 不清除原文件的内容。
TO P RIN T ER 表示输出到打印机 , PROMP T 表示打印前先显示打印确认框。
TO SCRE EN 表示输出到屏幕。例如显示设备增值税的平均值 :

    SELEC T AVG( 价格 ) * 0 .17 AS 增值税均值 ;


  F ROM sb TO SCREEN         & & 平均值显示在“增值税均值”字样下方

    (4 ) P REF ERE NCE 子句 : 用于记载 Browse 窗口 的配 置 参数 , 再 次使 用 该子 句时 可


用 < 名字 > 引用此配置。
(5 ) NOCONSOL E 子句 : 禁止将输出送往屏幕。如果指定过 IN TO 子句则忽略它 的
设置。
(6 ) PLAIN 子句 : 输出时省略字段名。
(7 ) NOWAIT 子句 : 显示 BROWSE 窗口后程序继续往下执行。
( 8) WH ERE 子句 : 用于指定查询条件 , 通常包括建立多个库文件之间的连接和筛选
记录等。例如查询大修过的设备的编号、名称和部门名 :

    SELEC T dx .编号 , sb .名称 , bmdm .名称 AS 部门名 ;


  F ROM sb , dx , bmdm ;
  WHER E dx .编号 = sb .编号 AN D bmdm .代码 = sb .部门

    (9 ) GROU P BY 子句 : 对记录按 < 组表达式 > 值分组 , 常用于分组统计。


( 10 ) HAV I NG 子句 : 当含有 GROUP BY 子句时 , HAVI NG 子句可用作记录查询的
・ 1 01 ・
限制条件 ; 无 GROU P BY 子句时 HAVI NG 子句的作用如同 WH ERE 子句。
(11) UN ION 子句 : 在 SQ L SEL ECT 命令中 可以 用 UN ION 子句 嵌入 另一 个 SQL
SE LECT 命令 , 使这两个 命令 的 查 询结 果 合 并 输出 , 但 输 出字 段 的 类 型 和宽 度 必 须 一
致。例如执行下面的命令将显示 SB .DBF 的编号后接着显示 ZZ .DBF 的编号 :

    SELEC T sb .编号 FROM sb ;


  UNION ALL SELECT zz .编号 FROM zz

    (12) ORDER BY 子句 : 指定查 询结果 中记 录按 < 表 达式 > 排 序 , 默 认升 序。选 项


ASC 表示升序 , DESC 表示降序。例如将 SB .DBF 的记录按部门升序排 列 , 部 门相同时 按
价格降序排列 :

    SELEC T 编号 , 名称 , 部门 , 价格 FROM sb ORDER BY 部门 , 价格 DESC

3 .5   统 计 命 令
统计和汇总是数据库应用的重要内容 , FoxPro 提供 5 种命令来支持统计功能。

3 .5 .1   计数命 令

命令格式 :

    COU NT [ < 范围 > ] [ FOR < 条件 1 > ] [ WHILE < 条件 2 > ] [ TO < 内存变量 > ]

    功能 : 计算指定范围内满足条件的记录数。
说明 :
(1 ) 通常记录数显示在主窗口 的状态 条中 , 使用 TO 子句 还能 将 记录 数保 存到 < 内
存变量 > 中 , 便于以后引用此变量。
(2 ) 缺省范围是库文件的所有记录。
[ 例 3-15]   试统计设备科拥有设备的台数。

    SE T VI EW TO sbbm             & &   恢复例 3-10 所建立的 SB .DBF 与 BMDM .DBF 的关联
LOCATE FOR bmdm .名称 = ′设备科′
dm = bmdm .代码 & & BMDM .DBF 当前代码保存到内存变量
COU NT FOR sb .部门 = dm TO ts & & 由于两个库文件指针联动 , 不可直接用 BMDM .代码
?′
设备科设备台数 :′, ts & & 显示“设备科设备台数 :       2”

3 .5 .2   求和命 令

命令格式 :

    SU M [ < 数值表达式表 > ] [ < 范围 > ] [ FOR < 条件 1 > ] [ WHI LE < 条件 2 > ]
  [ TO < 内存变量表 > | ARRAY < 数组 > ]

    功能 : 在打开的库文件中 , 对 < 数值表达式表 > 的各个表达式分别求和。


・ 1 02 ・
说明 :
(1 ) < 数值表达式表 > 中各 个 表达 式 的值 的 和数 可 依 次存 入 < 内存 变 量表 > 或 数
组。如果缺省该表 , 则对当前库文件所有的数值表达式求和。
(2 ) 缺省 < 范围 > 指库文件中所有记录。
[ 例 3-16]   试根据 SB .DBF 与 ZZ .DBF 求各设备的价格和与增值和。

    CLOSE ALL
USE sb IN 0
USE zz IN 0
SU M sb .价格 , zz .增值 TO mjg , mzz
?′
价格和 , 增值和 :′, mjg , mzz   & & 显示“价格和 , 增值和 :     505859 .47     17570 .00”

3 .5 .3   求平均 值命令

命令格式 :

    AVERAGE [ < 数值表达式表 > ] [ < 范围 > ] [ F OR < 条件 1 > ] [ WHIL E < 条件 2 > ]
  [ TO < 内存变量表 > | ARRAY < 数组 > ]

    功能 : 在打开的库文件中 , 对 < 数值表达式表 > 中的各个表达式分别求平均值。


该命令用法与 SU M 相同 , 不另举例。

3 .5 .4   计算命 令

CALCU LAT E 命令用于对数据库中的字段进行财经统计 , 其计 算工作主 要由函数 来


完成。
命令格式 :

    CALCULAT E < 表达式表 > [ < 范围 > ] [ F OR < 条件 1 > ] [ WHILE < 条件 2 > ]
  [ TO < 内存变量表 > | ARRAY < 数组 > ]

    功能 : 在打开的库文件中 , 分别计算 < 表达式表 > 的表达式。


注意 , 表 达式中至 少须包含 系统规 定的 8 个函数 之一。其中 常用的函 数有 AVG ( <
数值表达式 > ) 、CNT ( ) 、MAX ( < 表 达 式 > ) 、M IN ( < 表 达 式 > ) 、SU M ( < 数 值 表 达 式
> ) 等 5 个 , 这 5 个函数的功能与表 3 .2 所列一致 , 仅计算记录数 函数 CN T( ) 的格式与 表
3 .2 的 CO UN T 不一样。另 3 个函数为 NPV、STD 和 VAR , 详见系统 HE LP, 这里不再说
明。
[ 例 3-17]   试求所有设备价格与增值的总和。

    CLOSE ALL
USE sb IN 0
USE zz IN 0
CALCULAT E SU M (sb .价格 ) ,S UM ( zz .增值 ) TO jgh , zzh
?′
价格与增值总和 :′,jgh + zzh     & & 显示“价格与增值总和 :   523429 .5”

・ 1 03 ・
3 .5 .5   汇总命 令

汇总数据即对数据进行分类合计 , 例如工资计算系统中可能要按部门汇总工资 , 库存
管理系统中可能要按车间汇总零件金额等。
命令格式 :

    TOTAL TO < 文件名 > O N < 关键字 > [ FIELDS < 数值型字段表 > ]
  [ < 范围 > ] [ F OR < 条件 1 > ] [ WHILE < 条件 2 > ]

    功能 : 在当前库文件中 , 分别对 < 关键字 > 值相同的记录的数值型 字段值求 和 , 并 将


结果存入一个新的库文件。一个数值型字段在新 文件 中产 生一个 记录 , 汇 总结果 即写 入
该记录 ; 对于非数值型字段 , 只把关键字值相同的第一个记录的字段值放入该记录。
说明 :
(1 ) < 关键字 > 指排序字段或索引关键字 , 即当前库文件必须是有 序的 , 否则不能 汇
总。
(2 ) F IE LDS 子 句的 < 数 值型 字段表 > 指出要 汇总 的字段。 如果 缺省 , 则对 库文 件
中所有数值型字段汇总。
(3 ) 缺省 < 范围 > 指库文件中所有记录。
[ 例 3-18]   试在 DX .DBF 中按设备的编号来汇总大修费用。

    USE dx
INDEX ON 编号 TAG bh
TOTAL ON 编号 TO jghz FI ELDS 费用         & & 按编号汇总费用 , 新文件 JGHZ .DBF
USE jghz
BROWSE FI ELDS 编号 , 费用 T IT LE ′
大修费用汇总表′;
& & 使 BROWSE 窗口( 见图 3 .22) 仅显示与汇总有关的字段

图 3 .22   大修费用汇总表

习   题
1 . 试对 SB .DBF 分别排序 :
(1 ) 将价格超过 10000 元的设 备按 部门升 序排 序 , 并要求 新文 件只 包 含编 号、名称、
价格、部门等四个字段。
(2 ) 将主要设备按名称降序排序 , 当名称相同时则按启用日期降序排序。
・ 1 04 ・
2 . 通过选单操作实现例 3-2 、例 3-3 的要求。
3 . 为 SB .DBF 建立一个结构复合索引文件 , 其中包括三个索引 :
(1 ) 记录以编号降序排列。
(2 ) 记录以名称降序排列 , 名称相同时则按启用日期降序排列。
(3 ) 记录以部门降序排列 , 部门相同时则按启用日期升序排列。
4 . 分别用顺序查询和索引查询两种方法查询 1989 年启用的非主要设备。
5 . 分别用以下方法查询磨床的增值。
(1 ) 顺序查询。
(2 ) 索引查询。
(3 ) 在 V IEW 窗口建立关联后查询。
6 . 如果例 3-10 的一多关系中省略说明一多关系这一步骤 , BROWSE 窗 口显示结 果
有何不同 ?
7 . 现有两个库文件 T1 和 T2 , 它们的结构如下 :

T1 .DBF       产品编号     C       8
产品名称 C 20
型号规格 C 12
单价 N 7      1
T2 .DBF 合同号 C 10
产品编号 C 8
数量 N 10

    试利用 V IEW 窗 口 , 以 T1 为父文 件、T2 为 子文件 建立关联 , 使 得在 BROWSE 窗 口


显示记录时 , 同一种产品所订的各合同能集 中在 一起显 示。并 将完成 上述 要求的 设置 以
文件名 T .VU E 存盘。
8 . 列出每个设备的名称、大修的费用及增值 , 要求
(1 ) 写出 V IEW 窗口操作步骤。
(2 ) 写出命令序列。
9 . 根据第 7 题中 T1 .DBF 和 T2 .DBF 两个库文件 建立查询 文件 T .QP R 文件 , 要 求
运行该文件能产生库文件 T3 .DBF, 其 中包 含数量 大于 10 的所有 合同 的合 同 号、产品 编
号、单价和数量四个字段。
10 . 对于下列要求 , 分别写出 RQBE 查询的步骤。
(1 ) 查询价格小于十万元的设备启用日期 , 查询结果按启用日期从小到大排列。
(2 ) 查询车间使用的设备中的价格不小于十万元的设备的部门名。
(3 ) 查询 1987 年启用的设备的名称和部门名。
(4 ) 查询大修过的设备的编号和名称 , 查询结果输出到库文件 RESU L T .DBF。
(5 ) 查询增值设备的设备名和部门名。
(6 ) 查询每个设备的名称及大修费用扣去增值的结果 , 并写出 SE LECT SQ L 命令。
( 7) 查询每个设备的名称及大修费用与平均大修费用之差 , 并写出 SE LECT SQL 命
令。
・ 1 05 ・
11 . 查询最早启用和最晚启用的设备。
12 . 将例 3-14 产生的直方图存储到 SB .DBF 第一个记录的商标字段中去。
13 . 试为 SB .DBF 的磨床 增加商 标 , 商标 所用图 形文 件 为 Windows 的 WIN LOGO .
BM P。选定 Edit 选单的 Paste Special 选项后 出现的 对话 框中 有 Paste 和 Paste Link 两 个
按钮 , 要求分别选用这两个按钮将剪贴板上的 图形粘贴 到通用 型字段 , 并说明 操作与 功
能的不同之处。
14 . 试说明如下 SQL SE LECT 命令的功能 :

    SELEC T b mdm .名称 AS 部门名 , sb .编号 , sb .名称 ,sb .价格 ;


  F ROM sb , bmdm ORDER BY 部门 , 价格 DESC WHE RE sb .部门 = bmd m .代码

    15 . 试算出 1988 年前启用的主要设备的台数。


16 . 若学生 .DBF 记载了某班学生的姓名 及语 文、数学 和外语 的成 绩 , 试算出 每人 总
分及全班每门学科的平均成绩 , 并要求上述数据以学生成绩表显示。
17 . 根据 SB .DBF 进行以下汇总 :
(1 ) 按部门汇总价格。
(2 ) 设法按部门汇总设备的台数。

・ 1 06 ・
中 篇

程序 设 计
第四章   程序设计初步

    前两章通过 FoxP ro 的选单操作方式或在命令窗口中键入命令的交互方式 , 介绍了 对


数据库的基本操作和初步使用。这些方式虽然简单 , 但速度慢 , 执行过程不能保留。当某
些操作需反复进 行 时 , 更 使 人感 到 单调 厌 烦。可 喜 的 是 , FoxPro 也支 持 程 序 工 作方 式。
只要用户把有关的操作命令编成 程序储 存在 一个 文 件中 , 当 发出 调 用命 令后 , FoxP ro 就
会自动依次执行该文件中的命令 , 直至全部命令执行完毕。若要重复执行几次 , 只须重复
调用几次 ; 何时调用就何时执行 , 十分方便。可见 , 程 序工 作方 式能极 大地 减少用 户的 重
复劳动 , 现已成为实际应用中主要的工作方式。
本章先介绍程序文件的编制与执行 , 继而 提出若 干工 作于 程序方 式的 命令以 及构 成
程序的各种控制结构。在此基础上初步介绍数据库应用程序的编制与调试技术。其中的
积木式编程是编者长期教学实践的总结 , 它易学、易懂、易模仿 , 能帮助读者在起步阶段就
熟悉“功能分解”的思想与做法 , 便于初学者较快地掌握数据库应用程序的设计技术。

4 .1   程 序 文 件

程序文件是 FoxP ro 最重要的文件类型之 一 , 用于 储存 由命令 组成 的程序 , 故 又称 命


令文件。程序文件的扩展名为 PRG。

4 .1 .1   程序文 件的建立 与执行

一、程序的逻辑性与通用性
1 .程序的逻辑性
Fox Pro 程序多数用于进行数据处理 , 其完整过程通常包括下面三个部分 :
(1 ) 提出原始数据及其处理要求 ;
(2 ) 按指定要求进行数据处理 ;
(3 ) 输出数据处理的结果。
这也可简述为 : 输入→处理→输出。
程序调用后 , 由系统自动按命令的排列 次序 逐条执 行。可 见命令 的排 列次序 必须 严
格遵守解决问题的逻辑顺序。例如 , 要计算圆面积 , 就要依次完成下列三项工作 :
(1 ) 给出圆半径 ;
2
(2 ) 按公式 s =πr 计算圆面积 ;
(3 ) 输出圆面积。
Fox Pro 程序用命令来描述这个过程。虽然计算圆 面积并非 是典型 的数据处 理问题 ,
但程序编制的思想是相仿的。下面写出半径为 3 的圆面积计算程序 :

    r= 3
・ 1 09 ・
s = 3 .1416 * r * r
?″
圆面积 = ″, s

    这三条命令逻辑次序决不是随意的 , 只有 执行 r = 3 后 , 才 能计算 s , 随 后才 能输 出 s ,
否则会因变量找不到而无法继续下去。
2 .程序的通用性
程序可反复执行 , 故编制程序应具有 通用性 , 使 程序 的应用 范围 更广。例 如 , 只能 计
算半径为 3 的圆面积程序就价值不大 , 若对任意半径都能计算其圆面积 , 则程序的功能就
大为增强。一般说来 , 在程序执行过程中输入原始数据与处理要求 , 就能增强程序的通用
性。第 4 .1 .3 节将对此展开进一步的讨论。
二、程序文件的建立与修改
命令格式 :

MODIF Y COMMA ND [ < 文件名 > | ?]


MODIF Y FI LE [ < 文件名 > | ?]

功能 :
调用 FoxP ro 提供的编辑器来建立或修改指定的程序文件。
说明 :
(1 ) 可选项 [ < 文件名 > | ?] 用于设定要编辑的文件名。在文件 名中允许 使用通配 符
* 与 ?, 此时 , 屏幕上将开出几个窗口同时编辑与之匹配的各个文件。若使用“ ?”号而不写
文件名 , 系统将打开一个对话框 , 用户可从框中列示的文件名中选择当前编辑的文件。如
果命令中缺省 文 件 名 , 则 系 统自 动 取 名 为 U NT ITL ED .P RG; 如 果 扩 展 名 缺 省 , 则 命 令
MODIFY COM MAND 默 认 为 P RG , 而 命 令 MODIFY FILE 却 默 认 为 空。 可 见 使 用
MODIFY F IL E 建立程序文件时 , 扩展名 P RG 必须写上。
    ( 2 ) 在 文件名 前可指明 路径 , 若未指 明则默 认为当前 驱动器 的当前目 录。如执行 命

    MODIF Y COMMA ND b∶ \ wang \ ex1


MODIF Y FI LE ex2 .prg

后 , 程序文件 ex1 .prg 储存在 B 盘 的子目 录 wang 之下 , 而程 序文 件 ex2 .prg 仍储 存在 当


前驱动器的当前目录中。
    (3 ) FoxPro 程序是命令行的序列 , 每个命 令都以回 车键 结尾 , 一行 只能 写一条 命令。
若一条命令在一行内写不下 , 也可分行书写并在分行处加上续行符“ ;”。
    (4 ) 程序编辑期间可以任意修改 , 其中常用的控制操作如表 4 .1 所示。
(5 ) 在 Fox Pro 环境中可以通过选单 File 来建立并储存程序文件 , 还可以 在程序编 辑
过程中使用 Edit 选单项的 Copy , Cut 及 Paste 等功能来加速编辑过程。
三、程序文件的执行
    命令格式 :

    DO < 文件名 > [ W IT H < 参数表 > ]


・ 1 10 ・
    功能 :

表 4 .1   程序编辑中常用的控制操作

控 制 操 作 功   能
↑ 光标上移一行
↓ 光标下移一行
← 光标左移一个字符
→ 光标右移一个字符
PgUp 上移一幅屏幕
PgDn 下移一幅屏幕
Ins 插入或覆盖方式转换开关
Del 删除光标所在位置的字符
Ct rl-W 编辑结果存盘并返回命令窗口
Ct rl-Q 或 Esc 编辑结果不存盘而返回命令窗口

    调用并执行指定的程序文件。
    说明 :
    Fox Pro 允许使用带参数的程序文件。在编写带参数的程序文件时 , 必须把命令

    PARAMET ERS     < 参数表 >

作为程序中的第一条命令。其中的参数是有效的 任意 变量 名 , 在参数 表中 可以出 现一 个


或多个参数 , 各参数之间用逗号分隔 , 这里的参数又称为形式参数。
    本命令中的可选项 [ WIT H < 参数表 > ] 用于执行带参数的程序文件。
    [ 例 4-1]   带参数程序文件的编制与调用示例。

    M ODIF Y COM MAND e4-1               MODI FY COM MAND e4-1′


PARAMET ERS r PARA ME TERS l , w
s = 3 .1416 * r * r area = l * w
?″
圆面积∶″, s ?″矩形面积 = ″, area

为求出半径为 5 的圆面积 , 只须键入命令

    DO e4-1 W IT H 5

而执行下述命令后便可求出矩形面积

    p= 3
DO e4-1′WI TH p , 2 * p

    列在 WIT H 后的参数通常称为实在参数 , 它们可以是 常量 , 也可以 是变量和 表达式 ,


但其中所有的变量必须已赋有初值。
    注意在执行带参数的程序文件时 , 实在参数与形式参数的个数、类型与排列次序必须
相匹配。
四、程序的注释
    命令格式 :
・ 1 11 ・
    * / NOTE < 注释内容 >
& & < 注释内容 >

    程序中可插入注释行 , 以提高 程序 的可 读性。以 符号“ * ”或 命令 字“ NOT E”开始 的


注释行可以出现在程序的任何地方。它是一条非执行命令。而在前面章节中已广为使用
的“ & &”则主要用在命令的尾部添加注释。例如 ,

    * 本程序用于修改库文件的指定记录
SE T DAT E MDY   & & 日期格式置为 mm/ dd/ yy

4 .1 .2   状态设 置命令

    FoxPro 提 供大 量的 SE T 命令来 建立 状态设 置。如 打印机 接通 还是断 开 , 系 统是 否


要提供保护功能 , 为屏幕显示提供什么颜色等等 , 借以满足各种用户的不同需要。
一、SET 命令的两种主要形式
    Fox Pro 的 SE T 命令有多种形式 , 但主要有下面两类 :
    1 . SE T < 参数 > ON/ OFF
    这种形式的 SE T 命令有两种状态供用户选择 , 如同开 关一样 , 选 择 ON 为接通 , OFF
为断开。系统启动时 , 这类 SE T 命令总有一个默认的状态。通常约定默认状 态以大写 字
母表 示。例 如 , 在 2 .2 .2 节中 曾 提 到的 SE T EXACT on/ OFF 表示 系 统启 动 时 , 设 定 用
“ = ”比较字符串时不进行精确比较。
    2 . SE T < 参数 > TO < 参数值 >
    这类命令能将指定的值提供给有关的参数。例如 , SE T DE FAUL T TO A: 就把 A 指
定为当前的默认驱动器。又如 , 第 2 .2 .1 节所介绍的 SE T F IL T ER TO 与 SE T   F IE LDS
TO 以及多库操作中的 SE T RELA TION TO 等都属于这一类的命令。
二、若干常用的状态设置命令
    本节先给出简单程序中常用的几条状态设置命令 , 以后根据需要再陆续介绍。
    1 . 置会话状态命令
    命令格式 :

    SE T TALK ON/ off

   “会话”是指 FoxP ro 在执 行命 令时 向 用户 所提 供的 反馈 信 息。例 如 , 执 行 赋值 命 令


时 , 该表达式的值会在屏幕上反 馈出 来 , 执 行 SU M 命 令时 , 会 显示 求 得的 和值 等等。 可
见在会话状态开通时 , 将会有大量信息显示在屏幕上。工作于程序方式时 , 这不仅会减慢
程序的运行速度 , 而且还会与程序本身的 输出相 互夹 杂 , 引起混 淆。所 以程序 调试 时 , 一
般置“会话”于开通状态 , 而在执行程序时则通常要求置“ 会话”于断开状态。
    2 . 置打印状态命令
    命令格式 :

    SE T PRINT on/ OF F

    系统默认打印机置于断开状态 , 就是说 命令的 执行 结果 只送到 屏幕 , 不 送往打 印机。


・ 1 12 ・
若用命令 SE T PR IN T ON 置 打 印 机 为 接 通 状 态 , 则 在 屏 幕 上 显 示 的 执 行 结 果 被 同 时
打印。
    3 . 置屏幕状态命令
    命令格式 :

    SE T CONSOLE ON/ off

    在系统的默认状态下 , 用户从键盘输入的内容都在屏幕上显示 , 然而有时却要求键入


的内容保密而不被显示 , 这只需使用命令 SE T CONSOL E OFF 便可。此命令常用于在应
用程序中要用户键入密码的时刻。
    4 . 置系统提供保护状态命令
    命令格式 :

    SE T SAFETY ON/ off

    在系统默认的状态下 , 对已经建立的文件均提供安全保护 , 当用户发出重写或删除某


个文件的命令时 , 系统会提出警告。如果在文件操作时不需要系统提供这种形式的保护 ,
只需使用命令 SE T SAF E TY OFF 便可。
    5 . 屏幕配色命令
    Fox Pro 对色彩控制较 FoxBASE 做 了重 大的 改进 , 提供 了丰 富的 色彩 设 置命 令与 函
数。下面先介绍其中的一种格式 , 详细介绍请参阅第五章。
    命令格式 :

    SE T COLOR TO [ < 标准型 > [ , < 增强 > [ , < 边框 > ] ] ]

    本命令按形式 < 前景色 >/ < 背景色 > 为屏幕的标准型显示与增强型显示分别配色 ,


还可为屏幕 的边 框同 时配色。 < 前 景色 > 指 字符的 颜色 , 而 < 背 景色 > 指 屏 幕的 底色。
命令中可选项缺省时 , 系统默 认标准 显 示为 黑底 白字 , 增强 显示 为白 底黑 字。 FoxP ro 提
供十种彩色色彩 , 它们的代码如表 4 .2 所示 :

表 4 .2   色彩代码表

黑色 空白 蓝色 棕色 深蓝 绿色 品红 红色 白色 黄色
N X B GR BG G RB R W GR +

在色彩代码中还可使用加号“ + ”表示高亮度 , 星号“ * ”表示闪烁。但是 , 星号只能用于背


景色代码中 , 而加号只能用于前景色代码中 , 否则将被忽略。例如 ,

    SE T COLOR TO GR +/ B , W/ B , GR

能把屏幕的标准显示设置为蓝底色黄字符 , 增强显示为蓝底色白字符 , 边缘为棕色。


三、不同工作方式下的环境设置
    1 . 程序工作方式
    SE T 命令是全局性的 , 在一个 程序 中所作 的状 态设置 不仅 影响 该程 序 , 而且 在 Fox-
Pro 的整个运行期间都起作用 , 从而也会影 响到其 它程 序的执 行。为 了避免 SE T 命令 的
・ 1 13 ・
全局影响 , 通 常 根 据 程 序 的 执 行 需 要 在 程 序 的 开 始 安 排 一 些 状 态 设 置 命 令 , 如 : SE T
TALK OFF, SE T SAF E TY OFF 等 , 而在程序结束前再恢复系统的默认状态。这样 , 所设
置的状态仅在该程序的执行期间有效。如此既改 善了 程序 的运行 环境 , 同 时也不 影响 全
局。
    2 . 选单操作方式
    在选单操作方式下 , 用户可通过 View 窗口进行环境设置。 在 View 窗口 左侧的工 具
条上有五个面板选项按钮。其中的第二个是 ON/ OFF 按钮。用鼠标单 击该按钮 后 , 就 会
弹出如图 4 .1 的 ON/ OFF 面板。图 中有 许 多复 选框 , 凡 被选 中 者便 表示 相应 的 SE T 命
令已被 设 置 为 ON 状 态。 例 如 , 上 述 ON/ OFF 面 板 中 已 设 置 有 状 态 SE T TALK ON ,
SE T SAF E TY ON , SE T PRI N T OFF 等。可见 , 为改变某个 SE T 命令 的设置状 态 , 只 须
单击相应的复选框便可。

图 4 .1   View 窗口中的 O N/ OF F 面板

    3 . 命令交互方式
    Fox Pro 提供专用的 SE T 命令以实现命令交互方 式下的 状态 设置。当 在命令 窗口 键
入 SE T 后 , 立即会 弹出 View 窗口 , 此后即 与选单 操作方式 同样处 理。View 面 板一次 便
能设置一批系统状态的当前值 , 它们在当前使用期间都有效。

4 .1 .3   输入输 出命令

    输入与输出处理是程序设计中不可缺少的组成部分。处理过程中的原始数据及用户
要求都要通过输入来指明 , 而处理结果又通 过各 种形式 的输 出来 得到。本 节主要 介绍 程
序设计中常用的输入、输出命令。
一、文本输出命令
    命令格式 ( 一 ) :

    \ | \ \ < 文本行 >

    命令格式 ( 二 ) :

    T EXT
< 文本信息 >
・ 1 14 ・
ENDT EXT

    功能 :
    格式 ( 一 ) 能将一行文本信息的内容按书写 形式的 原样 显示出 来 , \ 与 \ \ 的 区别 在
于前者输出的文本行带有回车换行符 , 就是 在下一 行的 第一 列开始 输出 ; 而 后者则 不带 ,
文本行在当前光标位置开始显示。格 式 ( 二 ) 则能 把 T EXT 与 ENDT EXT 之间的 文本 信
息内容显示出来 , 允许其间出现多个文本行。
    说明 :
    (1 ) 文本输出命令 T EXT 与 E NDT EXT 只能在程序工作方 式中使 用 , 而 且必须成 对
出现。
    (2 ) 通常把指定的屏幕画面用 T EXT 与 E NDT EXT 括起来 后直接 写在程序 之中 , 以
便在程序执行中把该画面按原样显示或打印出来。
    (3 ) 在文本信息中允许出现变量、函数和表达式 , 本命令能识 别它们并 显示其值。 但
需事先设置状态 SE T T EXT M ERGE ON , 并且把它们用符号“ < < ”与“ > > ”括起来以 区
别于一般的文字信息。如果这两个条件不同时具 备 , 则本 命令 将它们 与其 它的文 字信 息
同样看待而直接输出。例如 , 执 行 下述 命令 后 , 在 所显 示的 图式 下面 将 显示 系 统的 当 前
日期。

    SE T TEXT ME RGE ON
T EXT
    * * * * * * * *
    * 设备管理系统 *
    * * * * * * * *
        < < DATE ( ) > >
ENDT EXT

二、键盘输入命令
    命令格式 :

    IN PU T [ < 提示信息 > ] TO < 内存变量 >


    ACCEPT [ < 提示信息 > ] TO < 内存变量 >

    功能 :
    在 屏幕 上显示 提示 信息 , 等 待用户 从键 盘输入 , 再 把输 入内 容赋值 给指 定的 内存 变
量。
    说明 :
    (1 ) 两条命令的主要区别在于 : ACCE PT 命令能 在用 户的 输入内 容中 自动添 加定 界
符后再给变量赋值 , 而 INP U T 命令则把 输入内容的值计 算出来后向变量 赋值。因此 , 用
ACCEP T 命令只能接受字符型常量 , 而 INP U T 命令则能接受任何类型的表达式。例如 ,

    SE T TALK OF F
jg = 7800
IN PU T ″输入价格 : ″TO a

・ 1 15 ・
ACCEPT TO b
a = ″, a ,″b = ″, b
?″

    执行时 , 先后两次输入同样的内容 jg + 200 , 而输出结果却不相同 , 分别为

    a = 8000     b = jg + 200

(2 ) 命令中可 选项缺 省时 , 屏幕上 无显示信 息而直 接等待用 户的输 入 ; 另 外 , 提示信息 也


可以是含有变量的字符型表达式 , 这时屏幕上显示的提示信息将随变量值的不同而变化。
例如 ,

    m = ″微型机″
IN PU T ″输入″+ m + ″价格″TO p

命令执行时 , 屏幕的提示信息为 :

    输入微型机价格

注意 : IN PU T 命令也能接受字符型常量 , 但需把该常量两 边的定 界符同时 输入。键盘 输


入命令主要用于程序执行过程中原始数据的输入 , 请看例 4-2。
    [ 例 4-2]   在 sb .dbf 中 , 按编号查询设备的启用日期 , 价格。

    MODIF Y COMMA ND e4-2


    CLEAR             & & 清屏幕
    SE T TALK OF F
    U SE sb
    ACCEPT ″输入待查询的编号∶″TO hh
    LOCAT E FOR 编号 = hh
    DISP 编号 , 启用日期 , 价格
    U SE
    SE T TALK ON

    在上述程序中 , 由于使用了键 盘输 入命 令 , 因 而能 在 sb .dbf 中对 任意 编 号的 设备 信


息进行查询 , 增强了程序的通用性。若要使所编制的程序有更好的通用性 , 还须灵活地使
用宏代换函数。
三、宏代换函数
    函数格式 :

    & < 字符型内存变量 >

    功能 :
    把字符型内存变量的值替换出来 , 就是以字符型内存变量的值作为函数值。
    说明 :
    (1 ) 在符号“ &”与字符型内存变量名之间不可有空格。
    (2 ) 宏代换函数能作为字符串的一部分出现 , 此时应以“ .”来标 记该字符 型内存变 量
名的结束 , 避免与后续的字符混淆。例如 ,
・ 1 16 ・
    a = ″qr″
?″&a .st″

执行后的输出值为 qrst。
    (3 ) 宏代换可以嵌套 , 执行 时由外 向内 逐层进 行 , 直至 将最内 层 & 后的 变量 代换 出
来为止。例如 ,

    p1 = ″abc″
q = ″1″
r = ″p & q″
? &r

    执行后的输出值为 abc。
在数据处理中 , 宏代换 函数 有着 广 泛的 应用。 对于 程序 中 重 复出 现 的字 符 串、表 达
式、命令等均可使用宏代换函数 , 以减少重复书写并避免命令超长。例如 ,

    STOR E ″SE T COLOR TO W/ R″TO d


& d                         & & 代替一条命令
k=″
58 .63 * SQR T (86 .6 ) ″
x = LOG ( & k) + INT ( & k) & & 代替一个数值表达式

    除此以外 , 还能用于提高所编程序的通用性。例如 , 若把程序 e4-2 中的命令

    USE sb

改用下面两条命令代替 :
    ACCEPT ″输入库文件名∶″TO s   & & 库文件名在执行程序时才从键盘输入
USE &s & & 打开任意指定的库文件

则程序 e4-2 便能对含有编号字段的任意库文件进行查询 , 扩大了程序的适用范围。


如有需要还可以把宏代换函数用于类型转换。例如 ,

    n = ″241 .45 ″                & & n 是字符型常量


? 34 + & n & & n 经宏代换后已转为数值型

执行后得到的输出结果值为 275 .45。


四、格式化输入输出命令
    格式化输入输出命令具有很强的功能 , 它 能在屏 幕的 指定 位置上 把数 据信息 按规 定
的格式输出 , 也能在指定的位置上输入与修改数据 , 还能对输入数据进行格式控制与值域
检验。由于本命令子句众多形式复杂 , 本节先介绍其中的常用部分。
    命令格式 :

    < 行 ,列 >
    [ SAY < 表达式 > [ PICT UR E < 模式符 > ] [ FU NCT ION < 功能符 > ] ]
    [ GE T < 变量名 > [ PIC TUR E < 模式符 > ] [ F UNCT ION < 功能符 > ] ] [ DEFAUL T < 表达式 > ]
    [ RA NGE [ < 表达式 1 > ] [ , < 表达式 2 > ] ] [ SIZE < 表达式 1 > , < 表达式 2 > ]

・ 1 17 ・
    [ VAL ID < 条件 1 > ] [ WHEN < 条件 2 > ]

    下面分别从四个方面说明 :
    1 . 基本形式
    命令格式 :

    < 行 , 列 > [ SAY < 表达式 > ] [ GET < 变量 > ]

    功能 :
    在屏幕的指定位置上输出 SAY 子句中表达式的值以及 GE T 子句中变量的值。GE T
子句必须与 READ 命令配合工作 , 即用 READ 命令来激活当前的所有 GE T 变量。READ
命令的一般格式为 :

    R EAD[ SA VE ] [CYCLE ] [ T IMEO UT < 等待时间 > ]

    说明 :
    (1 ) < 行 , 列 > 指信息 在窗 口中 出现 的坐 标位 置。行 自 顶向 下编 号 , 列 自左 向右 编
号 , 窗口中第一行、第一列的编号都为 0。行、列都可为 表达式 , 还可 使用十进 制小数精 确
定位。
    (2 ) 缺省 SAY 子句时只显示 GE T 变量之值 ; 含有全部可选 项时 , 则先显 示表达式 的
值 , 空一格后再显示变量的值。在系统默认的 SE T I N T ENSITY ON 状态下 , 表达式值呈
标准显示 , GE T 变量的值呈增强显示。
    (3 ) GE T 子句中的变量 必须 有确 定的 初 值 , 或者 在使 用 前定 义 , 或者 通 过命 令中 的
可选项 [ DEFAUL T < 表达式 > ] 指定。 初值 一旦 指定 , 该变 量的 类型 在编 辑 期间 就不 能
再变 , 字符型变量的宽度与数值型变量的小 数位数 也无 法再 变 , 所 以 GE T 变量初 值的 给
定必须慎重。
    [ 例 4-3]   指定 GE T 变量的初值示例。

    M ODIF Y COM MAND e4-3


CLEAR
SE T TALK OF F
ACCEPT ″
输入库文件名∶″TO s
USE &s
@2 , 3 SAY ″
输入待查询的字段名( C 型 )∶″;
GET k DEFA ULT SPACE ( 10)             & &   字段名长度不超过 10
R EAD & &   激活变量 k
k = ALLT RIM( k ) & &   去除字段名中多余空格
l = FSIZE ( k) & &   求出该字段的实际宽度
@3 , 3 SAY ″
输入待查询的″+ k + ″的值∶″GET p DEFAULT SPACE ( l)
R EAD & &   激活变量 p
LOCATE FOR & k = p
DISP
USE

・ 1 18 ・
SE T TALK ON

    程序 e4-3 能 对 任 何 库 文 件 的 任 意 C 型 字 段 实 现 查 询 , 从 而 更 扩 大 了 程 序 的 适 用
范围。
    (4 ) 激活 GE T 变量是指使该变量进入编辑状态 , 即让光标自动跳到该变 量值所在 位
置上等待编辑修改。若有关的 GE T 变量有若干个 , 则 它们将 依次 被逐个 激活 ( 其 中无 须
修改的变量可按回车键越过 ) , 直至最后一个 GE T 变量处理结束后 , READ 命令的作用 才
终止。如果在 READ 命 令中使 用了 CYCLE 可选 项 , 则在编辑 最后一 个 GE T 变 量后 , 又
回过去重新激活第一个 GE T 变量 , 如此不断地循环。直至发生下列情况才终止循环退出
READ。
    ① 按 Ct rl-W ( 保存编辑内容 ) 或按 Esc ( 舍弃编辑内容 ) ,
    ② 执行请求终止 READ 的命令 CLEAR READ。
    READ 命令使用 TIM EOU T 子句来约束执行命令的等 待时间 ( 以 秒为单位 ) , 若超 过
了预定的等待时间却还没有输入数据 , 则将中断 READ 的执行。
    (5 ) 一般说来 , 已被激活过的 GE T 变量便被 清除 , 但 若在 READ 命令 中带有 可选 项
SAVE , 就不做清除工作 , 当遇到下一个 READ 命令时 , 这些 GE T 变量将被再一次激活。
    [ 例 4-4]   多个 GE T 变量激活示例。

    MODIF Y COMMA ND e4-4


    CLEAR               & & 清屏幕
    SE T TALK OF F
    SE T COLOR TO GR +/ R , W/ R , GR
    STOR E SPACE (8) TO mc
    rq = {   /   /   } & & rq 为日期型变量
    jg = 0
    @2 , 10 SAY ″编号″GET bh DEFAULT S PACE (5 )
    @4 , 10 SAY ″名称″GET mc
    @6 , 10 SAY ″启用日期″GET rq
    @8 , 10 SAY ″价格″GET jg
    READ SAVE
    @10 , 10 SAY   ″请检查 ! 有错即改 , 按回车认可″
    READ
    SE T TALK ON
    SE T COLOR TO
    U SE

    当程序执行到 READ SAVE 命令 时 , 四 个变 量被 依次 激 活等 待用 户输 入 ; 而 当执 行


到 READ 命令时 , 变量被再一次激活 , 用户既可修改又可按回车认可。
    2 . 数据格式编辑
    格式输入输出命令支持在 SAY 子句与 GE T 子 句中选择 PICT U RE < 模式符 > 与
F UNCTI ON < 功能符 > 来控制数据输 入与输 出的 格式。 其中 PICT U RE 子句中 的模 式
符既可用功能符 , 又可用 格式 符。FoxPro 提 供 12 种 格式 符 与 20 种 功能 符 , 详 见 表 4 .3
・ 1 19 ・
和表 4 .4。
    (1 ) 格式符   用以描述某一种格式见表 4 .3。

表 4 .3   格   式   符

A 只允许字母
L 只允许逻辑型数据
N 允许字母和数字
X 允许任何字符
Y 只允许逻辑值 Y, y , N , n , 并把小写转成大写
9 对于字符型数据只允许代表数字 ; 对数值型数据允许代表数字或数符
# 只允许数字、空格与数符
! 把小写字母转换为大写 , 对其它字符无影响
$ 按 SE T CU RR ENCY 命令所定义的位置来显示货币符号$
* 在数值型数据的前置 0 位置上显示 *
・ 指定小数点位置
, 分隔小数点左边的数字 , 只有在该符号的左边有数据时 , 它才会显示出来

    (2 ) 功能符   用以描述某一种功能 , 见表 4 .4。

表 4 .4   功   能   符
A 只允许字母、字符
B 数值型数据左对齐
C 正数后显示贷方标记 CR
D 使用 SE T DAT E 设置的日期格式
E 日期型数据按欧洲形式 (DD/ M M/ YY) 显示
I 使输出值位于输出字段的中间
J 使输出值在输出字段中向右对齐
K 当光标移至 GET 变量时 , 便选取 整个字 段进 行编 辑 ; 若 用户 新输 入了 数据 , 先 前的内
容将自动被清除

L 数值数据前面的空格用 0 补满

M < 列表 > 用以通过列表创建一个用户可选 取的值 表 , 这 些值在 列表中 必须以 逗号 分隔 ( 当遇到


READ 命令时 , 若 GET 变量的已有值不被包含 在列表中 , 则 READ 将把它设 定为列表
中第一个值 ) 按空格键可在列表中移动 , 用回车键选择后退出当前 GE T
R 在后继的格式字符串中可插入其它字符 , 被插入 的字符在相 应位置显示 但不存在变量

S< n> 把字符型数据的显示宽度限制为 n


T 删除首尾空格
X 负数后显示借方标记 DB
Z 数值为零时 , 显示空字符
! 把小写字母转换为大写字母
( 把负数用括号括起来
, 分隔小数点左边的数字 , 只有在该符号的左边有数据时 , 它才会显示出来
^ 用科学表示法显示数值数据

・ 1 20 ・
$ 按 SE T CU RR ENCY 命令所定义的位置来显示货币符号$

    [ 例 4-5]   数据格式编辑示例。

    MODIF Y COMMA ND e4-5


    CLEAR
    SE T TALK OF F
    SE T COLOR TO GR +/ B , W/ R
   m=″
abc″
    n= 0
    @2 , 10 SAY m PICT ″! ! !″
    @3 , 10 SAY N F UNC ″
z″
    @4 , 10 SAY m PICT ″@ r m = xxx″
    n = 86 .54
    @5 , 10 SAY n PIC T ″* 99 .9″GET n P ICT ″
99″
    READ

    程序执行后显示结果如下所示 :

    ABC

    m = abc
    * 86 .5   86

其中的方框表示变量 n 呈增强显示。
    说明 :
    (1 ) P ICT URE 子句中若有功能符 , 则必须把它们集中起来写在最前面并以 @ 作为 功
能符部分的前缀 , 还须以一个空格与格式符部分隔 开 ; 而 在 FU NCTION 子句 中只能使 用
功能符 , 无须再冠以 @ 了。它们的一般形式如下 :

    PICT URE ″@ < 功能符串 >   < 格式符串 > ″


FU NCT ION ″
功能符串″

    (2 ) 一个格式符只能控制 数据中 相应 位置上 的一 个字 符的格 式 , 而一 个功能 符则 能


对整个数据的格式进行控制 , 若把 e4-5 中的命令

          @ 2 , 10 SAY m PIC T ″! ! !″
改为 @ 2 , 10 SAY m PIC T ″@ !″

执行后的显示效果相同。
    (3 ) 在格式符串中可插入非格式符 , 它们能在相应的位置上被同时 显示出来 , 用户 编
辑数据时 , 光标会自动跳过这些非格式符。若被编辑的变量为字符型 , 则非格式符作为变
量值的一部分被储存 , 若在格式符串前有功能符 R , 则这些非格式符仅用于显示而不予 储
存。
    [ 例 4-6]   在格式符串中使用非格式符示例。
・ 1 21 ・
    MODIF Y COMMA ND e4-6
    CLEAR
    SE T TALK OF F
    STOR E SPACE (4) TO b1 , b2
    @6 , 10 SAY ″b1∶″GET b1 PIC T ″
a-99″
    @8 , 10 SAY ″b2∶″GET b2 PIC T ″@ r a-99″
    READ
    ?″b1 = ″+ b1
    ?″b2 = ″+ b2
    SE T TALK ON

    上述 PICT URE 子 句 中 的“-”为 非 格 式符 , 程 序 执 行 时 , 若 对 变 量 b1 与 b2 都 键 入


t01 , 则执行后的输出结果如下 :

    b1 = t - 01
b2 = t01

    (4 ) 模式符要使 用恰当 , 如格式符“ * ”只能用于输 出 , 功能 符 z, c, x 必须与数值 型数


据连用 , 而功能符 S < n > 则能把数据的编辑限制在一个较小的屏幕区域内完成。
    3 . 数据值域检验
    格式输入输出命令中还 能选 择 RANGE 子 句 , VALID 子句 以及 WHEN 子句 来控 制
GE T 变量值的输入。例如 ,

    @3 , 10 SAY ″年龄″GET nl RANGE 18 , 25


    @3 , 10 SAY ″年龄″GET nl VAL ID ( nl > 18 A ND nl < 25) E RROR ″年龄超出范围″

    它们的一般形式是 :

    RANGE [ < 表达式 1 > ] [ , < 表达式 2 > ]


    VALID < 逻辑表达式 > | < 数值表达式 > [ ERROR < 错误提示信息 > ]
    WHEN < 逻辑表达式 >

    RANGE 子句中的两个表达式分别指明 GE T 变量允 许输入 范围的下 界与上 界 , 输 入


值超界时此输入无效。VALID 子句用于变量输入值的有效性检查 , 如果其中 的逻辑表 达
式值为 .F .或是数值表达式值 为 0 则 变 量的 当前 输入 无效 , 也就 是在 原处 等 待再 一次 的
编辑。特别地 , 数值表达式值还进一步指示 接下 去将激 活哪 一个 GE T 变 量。例如 , 值 为
2 将激活下面的第二个 GE T 变量 , 值为 - 1 将 返回激 活上一 个 GE T 变量。而 WHE N 子
句中的逻辑表达式值的计算先于变量的编辑 , 若值为 .F ., 便无权 对该变 量进 行编辑。 就
是跳过此变量而继续处理下去。在使用中还须注意 :
    (1 ) RANGE 子句只能对数值型与日期型变 量进行 值域 检验。如 果其 中缺省 < 表 达
式 1 > , 则只检验是否超过上界 ; 缺省 < 表达式 2 > 只检验是否越过下界。例如 ,

    @4 , 10 SAY ″出生日期∶″GET 出生日期 RAN GE {70/ 01/ 01}


    @5 , 10 SAY ″身高∶″GE T   n   RANGE , 2 .10

    若输入的出生日期在 70 年 1 月 1 日以前或身高在 2 .10 以上 , 系统都将指示出错。


・ 1 22 ・
    (2 ) 如果在编辑某变 量时未 作修 改而直 接按 回车 键 , 则 所设 置的 RANGE 子 句就 不
起作用。然而在退出所编辑的 GE T 变量之前不管对此变量是否修改却总是要 按 VALID
子句进行检验 , 可见 , VALID 子句比 RANGE 子句能更有效地检验用户的输入。
    (3 ) WHE N 子句可用于拒绝非法用户的输入。例如 ,

    ACCEPT ″请输入密码 :″TO mm


    @ 4 , 10 SAY ″编号∶″GET 编号 WHEN mm = ″abc″

如果用户输入的密码不是″
abc″便不能输入编号。
    4 . 指定显示区域
    格式输入输出命令还能通过子句

    SIZE < 表达式 1 > , < 表达式 2 >

指定一个用于输入输出的矩形区域 , 其中 < 表达式 1 > 的值为高 , < 表达式 2 > 的值为宽。


如果数据超过了指定区域的大小 , 则 Fox Pro 把那些在一行显示不下的数据行回绕到下 一
行。若缺省 SIZE 子句 , Fox Pro 将只建立一行高的文 本编辑区。 SIZE 子句常 用于备注 型
与通用型字段数据的显示。例如 ,

    USE sb
GO 5
@12 , 14 SAY 商标 SIZE 6 , 8

就能把库文件 sb 中第 5 个记录的微机商标 显示在高 为 6 , 宽为 8 的矩形 区域 内。为使 该


显示形式更为协调 , 还可在 SIZE 子句后添 加 CEN T ER ( 居中 ) 与 ISOM E TRIC( 按 比例 缩
放 ) 两个可选项 , 即写为 :

    @12 , 14 SAY 商标 SIZE 6 , 8 CENT ER ISOMET RIC

    库文件数据的输入与编辑通常以系统规定 的标准 屏幕 格式进 行 , 这种 固定格 式与 用


户熟悉的环境可能不同。利用格式输入输出命令 , 便可按用户的需要来设计输入屏幕。
    [ 例 4-7]   为库文件 sb .dbf 设计自定义屏幕 , 用于添加主要设备。

    MODIF Y COMMA ND e4-7


    CLEAR
    SE T COLOR TO GR +/ B , W/ R
    U SE sb
    ACCEPT ″请输入密码″TO mm
    AP PEND BLANK
    @2 , 25 SAY ″设备管理系统″
    @4 , 14 SAY ″编号∶″GE T 编号 WHEN mm = ″
abc″    & &   拒绝非法用户输入编号
    @4 , 34 SAY ″名称∶″GE T 名称
    @6 , 14 SAY ″启用日期∶″GET 启用日期 RAN GE {86/ 10/ 12} , DAT E
    @6 , 34 SAY ″价格∶″GE T 价格 PICT ″
@z 999999 .99″
    @8 , 14 SAY ″部门∶″GE T 部门 PICT ″
99″

・ 1 23 ・
    @8 , 34 SAY ″t - 主要设备 , f - 非主要设备∶″GE T 主要设备 ;
    VALID 主要设备 E RROR ″
非主要设备″
    @10 , 14 SAY ″备注∶″GET 备注
    @10 , 34 SAY ″商标∶″GET 商标
    READ SAVE
    @16 , 25 SAY ″若输入有误请修改 , 按回车认可″
    READ
    DELE ALL F OR LEN( ALL TRIM ( 编号 ) ) = 0   & & 函数 LEN( )能返回指定字符串的长度
    PACK                               & & 在库文件中抹去编号字段值为空的记录
    SE T COLOR TO
    SE T TALK ON
    U SE

    如果编辑的是备注型或通用型字段 , 则在该区域内首先显示“ memo”或“ gen”字样 , 待


鼠标双击或按 Ct rl + Home 等组合键后才进入相应的编辑窗口进行处理。另外 , 在上述程
序后部设置的命令 DEL E T E 与 PACK 可方便用户的调试 , 只要在添加记录的编号字段上
输入空格 , 则该记录被自动从库文件中抹去。
    格式化输入输出命令功能强、应 用广 , 是 FoxPro 程 序设 计中 最常用 的命 令之一。 然
而 , 除上述说明 外 , 该 命 令 还 具 有 更 多 的 可 选 功 能。 例 如 , 可 选 项 [ FON T < 字 模 名 > ]
[ , < 字模大小 > ] 能 用以指 明显 示的字 模及 其大 小 ; 可选项 [ STY LE < 字 体代码 > ] 可 用
以确定某种字模 ( 由 FON T 指定 ) 的字体 ( 如 B 表示 黑体 , I 表 示斜体 , U 表 示下 划线 ) , 等
等。例如 , 执行命令

      @ 2 , 10 SAY ″姓名∶″FONT ″宋体″, 10 STYLE ″I″

后 , 便在 2 行 10 列处把姓名以宋体字模、10 点大小、且按斜体 形式输 出。由于篇 幅有限 ,


其他的各种可选项这里不再讨论 , 读者如有需要 , 可参阅有关手册。

4 .1 .4   运行控 制命令

    在某些情况下 , 人们希望程序的运行过程能由用户控制。例如 , 在预定处暂停程序的


运行 , 等待某种处理结束后再继续执行下去 , 或 者在执 行过 程中产 生某 种情 况后 , 立即 终
止程序的执行等。为此 , FoxPro 提供了多种控制运行的命 令与函 数。这里先 介绍其中 三
种。
一、WAIT 命令
    命令格式 :

    WAIT [ < 提示信息 > ] [ TO < 内存变量 > ]


    [ WI NDOW [ NOWAI T ] ] [ T IMEOUT < 数值表达式 > ]

    功能 :
    暂停程序的执行、显示提示信息等待用户按键。
    说明 :
・ 1 24 ・
    (1 ) 用户可通过可选项 [ < 提示 信息 > ] 指定 提示 内容 , 否 则将显 示系 统设定 的提 示
信息 :
   “按任意键继续……”。
    (2 ) 可选项 [ TO < 内存 变量 > ] 用于 指定 一个内 存变 量来存 放操 作过 程 中用 户所 键
入的首字符 , 并自动定义该变量为字符型。如果用户按下的是回车键、非打印字符或组合
键 , 则把空字符存于该变量中。若命令中缺省此可选项 , 用户的按键将自动流失而不再保
存。
    (3 ) 可选项 [ WI NDOW ] 能在 Fox Pro 主窗口的 右上角上 开出一 个提示信 息的显示 窗
口 , 避免提示信息对屏幕画 面产生 干扰。 若在其 中再 加入 可选项 NOWA IT , 则命 令执 行
时仅在指定地点显示提示信息而不会暂停程序的执行。提示信息的显示窗口也将在移动
鼠标或按下任意键后自动消失。
    (4 ) 可选项 [ TIM EOU T < 数值 表达式 > ] 必 须排列 在 WAIT 命令 的最 后 , 用 于指 定
程序暂停的时间 , 单位为秒。如果在指定时间内用户仍未按键 , 则程序继续执行。
    [ 例 4-8]   WAIT 命令示例。

    MODIF Y COMMA ND e4-8


    CLEAR
      T EXT
          1 添加   2 删除
          3 修改   4 返回
      ENDT EXT
    WAIT ″
请选择 1~4″TO m WINDOW T IMEO UT 5
    CLEAR
    SE T TALK ON

二、INKEY 函数
    函数格式 :

    INKEY( [ < 数值表达式 > ] [ , < 功能字符 > ] )

    功能 :  
    等待用户按键或鼠标输入 , 等待时间由数值表达式值确定 ( 单位为秒 ) , 返回由按键而
产生的一个整数值。
    说明 :
    (1 ) IN KEY 函数能返回用户按键的 ASCII 码值。除此以外 , 它还能接受键盘上各 种
不可打印的控制键、功能键等。如对功能键 F1 的 返回值 是 28 , 而对 功能 键 F2 到 F10 的
返回值分别是 - 1 到 - 9。对控制键的返回值为 1~31。其中对控制键 Esc 的返回值为 27
等等。
    (2 ) 用户的按键都送入键盘缓冲区 , 若键盘缓冲区中有多个键码 , 则返回 第一个被 输
入的键码 , 并从键盘缓冲区中去掉该键码。
    (3 ) 关于等待时间有如下几种情况 :
・ 1 25 ・
    ① 若超过了预定的等待时间而用户仍未按键 , 则函数返回值为 0。
    ② 若数值表达式值为 0 , 则无限期等待 , 直至用户按键为止。
    ③ 函数格式中缺省可选项 , 表示不等待 , 直接返回 0 值。
    (4 ) 可选项 < 功能字符 > 用于控 制光 标的显 示或 隐藏 , 也 可用于 检查 鼠标器 按钮 的
状态。在 < 功能字符 > 中可使用下列字符 , 其含义如下 :
    ① 字母 S 为显示光标。
    ② 字母 H 为隐藏光标。
    ③ 字母 M 可检测鼠标器的状态 , 例如 , 在命令窗口中键入命令

    ? INKEY ( 2 ,″M″)

后 , 只要在 2 秒钟内单击鼠标器 , 便能在 FoxP ro 的主窗口中显示出 151。


    综上可知 , 只要在程序的某处安排一条 WAIT 命令或使用 INK EY 函数 , 便能使程 序
执行到该处时暂停而等待用户的进 一步 处理。 容易看 出 , INK EY 函数 具有 更强的 功能 ,
它不仅能预先确定等待的时间 , 还能根据用户按键的不同而给出不同的返回值 , 由此来进
一步控制程序的不同流向。
三、终止命令
    命令格式 :

    CANCEL
    Q UI T

    功能 :
    CANCE L 用于终止 FoxP ro 程序 的运行 , 并清除局部于该 程序的内存变量 , 返回到 命
令窗口。 QU IT 命令则在终止程 序运 行后 , 退 出 FoxP ro 系统 返回 到 Windows , 其 功能 与
在 File 选单中选择 Exit 相同。使用 Q U IT 命令以后再关机 , 既不会丢失数据 或破坏打 开
的文件 , 同时还可将磁盘中的临时文件删掉 , 是一种常用的终止 FoxP ro 系统运行的方法。

4 .2   程序的控制结构

    此前提出的程序尽管内容各异 , 然而有一点是相同的 , 那就是执行时都是依照命令的


书写次序逐条执行 , 直至程序结束。实际应用千变万化 , 单用这种方式来组织程序是远远
不够的。为此 , FoxPro 程序提供了三种基本的控制结构 , 它们是 顺序结构、选 择结构与 循
环结构。利用这三种基本的控制结构能够把任何复杂的数据处理问题描述清楚并自动实
现。

4 .2 .1   顺序结 构

    按顺序结构组织程序 , 只需先把处理过程的各个步骤详细列出 , 然后把有关命令按照


处理的逻辑顺序自上而下地排列起来便可。本章 4 .1 节提出的 8 个例子都是按顺序结构
组织程序的例子。
・ 1 26 ・
4 .2 .2   选择结 构

    选择结构能根据指定条件的当前值在两条或多条程序路径中选择一条执行。因此在
一个程序中便能处理多种情况的复杂问题。Fox Pro 提供三种格式的选择结构。
一、单边选择
    命令格式 :

    IF < 条件 >
  < 命令序列 >
ENDIF

    功能 :
    条件取值为“真”, 执行命令序列 ; 条件取值为“假”, 命令序列就不执行。
二、双边选择
    命令格式 :

    IF < 条件 >
  < 命令序列 1 >
ELSE
  < 命令序列 2 >
ENDIF

    功能 :
    根据条件的取值在 < 命令序列 1 > 与 < 命令序列 2 > 这两条路径中选择一条执行。

图 4 .2   单边选择的执行流程 图 4 .3   双边选择的执行流程

    [ 例 4-9]   单边选择结构示例。

    MODIF Y COMMA ND e4-9


    CLEAR
    U SE sb
    WAIT ″
是否打印 ? ( Y/ N)∶″TO a     & & 变量 a 识别用户是否要求打印
    IF U P PE R( a ) = ″
Y″
      WAIT ″
请接好打印机 ! 按任意键后打印″
      L IST TO PRINT

・ 1 27 ・
    ENDIF

    上述程序中的变量 a 用于识别 用户 的操作 要求 , 通 常把 此种变 量称 为识别 器。使 用


把小写字母转换为大写字母的 U PPER 函数是为了让用户回答提问 时可忽略 字母的大 小
写 , 由此方便了用户的操作。
    [ 例 4-10]   双边选择结构示例。

    MODIF Y COMMA ND e4-10


    CLEAR
    SE T TALK OF F
    ACCEPT ″请输入您的密码 : ″TO mm
    IF mm < > ″
abc″
      ?″
您无权使用设备管理系统″
      Q UI T
    ELSE
      ?″
欢迎您使用设备管理系统″
    ENDIF
    SE T TALK ON

三、多边选择
    命令格式 :

    DO CASE
    CASE < 条件 1 >
        < 命令序列 1 >
    CASE < 条件 2 >
        < 命令序列 2 >
   …
    CASE < 条件 n >
        < 命令序列 n >
    [ OTHER WISE
        < 命令序列 Q > ]
图 4 .4   多边选择的执行流程
  ENDCASE

    功能 :
    依次判断命令中列出的条件 , 只要找到某一条件取值为“ 真”, 就执行与之相关的命令
序列 , 余下的条件便不 再判 断 , 有 关的 命令 当 然亦 不执 行。在 没有 一个 条件 取 值为“ 真”
时 , 若有可选项 , 就执行命令序列 Q , 否则什么也不做。可见在众多的命令序列中 , 多边选
择最多只选择执行其中的一个命令序列 , 也可能一个也不执行。
    [ 例 4-11]   多边选择结构示例。

    MODIF Y COMMA ND e4-11


    CLEAR
    SE T TALK OF F

・ 1 28 ・
        TEXT
          1 .打印设备信息
          2 .添加新的主要设备
          3 .查询设备信息
        ENDTEXT
    IN PU T ″请输入 1~3″TO k
    DO CASE
      CASE k = 1
        DO e4-9       & & 程序 e4-9 可控制设备信息的打印
      CASE k = 2
        DO e4-7       & & 程序 e4-7 能在 SB 中添加新的主要设备
      CASE k = 3
        DO e4-3       & & 程序 e4-3 能用于查询设备信息
      OTHERW ISE
        ?″
输入功能号超范围″
    ENDCASE       多边选择
    SE T TALK ON

    说明 :
    (1 ) IF 与 E NDI F, DO CASE 与 E NDCASE 分别标志选择结构的开始与结束 , 它们 必
须成对出现。在 ENDIF 与 ENDCASE 的 后面 可添 加注 释的 内 容 , 但 必 须与 它 们写 在 同
一行之中。例如 , 上述例子中 ENDCASE 后面的“ 多边选择”便属注释。
    (2 ) 三种选择结构不仅自身可以嵌套 , 而且还能相互嵌套。嵌套的 命令常缩 格书写 ,
使程序清晰易读。

4 .2 .3   循环结 构

    按循环结构来组织程序 , 能做到由指定条 件的当 前值 来控 制程序 中某 一部分 命令 序


列的重复执 行。 FoxPro 提 供 了 多 种 循 环 结 构 , 它 们 是 当 循 环、库 文 件 扫 描 循 环、FOR-
N EXT 循环等等。
一、当循环
    命令格式 :

    DO WHI LE < 条件 >


  < 命令序列 >
  [ LOO P]
  < 命令序列 >
  [ EXI T ]
  < 命令序列 > 图 4 .5   当循环的执行流程
ENDDO

    功能 :  
    判断条件的取值 , 若为“ 真”就执行 DO 与 ENDDO 之间的命令 序列 ( 称为 循环体 ) , 而
・ 1 29 ・
后再判断条件的取值 , 重复 刚 才的 过程。 一旦 条件 取值 为“假”, 就 跳出 循 环体 转而 执 行
E NDDO 的下一条命令。可见 , 只要条件取值保持为“真”, 循环体就会不断地重复执行。
    说明 :
    (1 ) 循环结构从 DO WH IL E 开始 , 到 E NDDO 结束 , 两者必须成对出现。在 E NDDO
的后面也可书写注释。
    (2 ) 可选项 EXIT 能立即跳 出循 环 , 执 行 ENDDO 的 下一 条命 令。可 选项 LOOP 则
把控制转到循环结构的开始 , 并 根据 条 件的 取值 决定 是否 开 始一 次新 的循 环。 EXIT 与
LOOP 能出现在循环体内的任何位置上。
    (3 ) 循环是否继续取决于 条件的 当前 取值 , 一般 情况 下循 环体中 应含 有改变 条件 取
值的命令 , 否则将造成死循环。
    (4 ) 循环结构也能自身嵌套 , 还能与选择结构的各种形式嵌套。
    [ 例 4-12]   在 sb .dbf 中陆续添加 5 种新设备。
    程序 e4-7 能在库文件 sb .dbf 中添 加一个 新的 主要设 备 , 为能 达到 题意要 求 , 只需 将
添加设备数据部分的命令重复执行 5 次便可。

    MODIF Y COMMA ND e4-12


    CLEAR
    SE T TALK OF F
    SE T COLOR TO GR +/ B , W/ R
    U SE sb
    ACCEPT ″请输入密码∶″TO mm
    n= 0
    DO WHI LE n < = 5
      AP PEND BLANK
      @ 2 , 25 SAY ″设备管理系统″
      @ 4 , 14 SAY ″编号∶″GET 编号 WHEN mm = ″abc″
      @ 4 , 34 SAY ″名称∶″GET 名称
      @ 6 , 14 SAY ″启用日期∶″GE T 启用日期 RA NGE {86/ 10/ 12} , DATE ( )
      @ 6 , 34 SAY ″价格∶″GET 价格 PICT ″
@ z 999999 .99″
      @ 8 , 14 SAY ″部门∶″GET 部门 PICT ″
99″
      @ 8 , 34 SAY ″T-主要设备 , F-非主要设备∶″GE T 主要设备 PICT ″l″
      READ SAVE
      @ 16 , 25 SAY ″
若输入有误请修改 , 按回车认可″
      READ
      n= n+ 1
    ENDDO
    SE T COLOR TO
    SE T TALK ON
    U SE

    变量 n 在程序中的作用如同计数器 , 这是程 序设计 中一 种常 用的设 计技 术。在循 环


・ 1 30 ・
开始前应对它置初值如 n = 0 , 每当添加一种新设备时便计数一次即 n = n + 1 , 而循环是否
结束则取决于 n 的值是否超过 5。
    执行程序 e4-12 时 , 用户是通过键盘直接将数据送 入库文件 的 , 另一种作 法是先将 键
入数据送入一组内存变量 , 待核对正确后再替换入库文件中。
    [ 例 4-13]   在 sb .dbf 中控制添加新设备。

    MODIF Y COMMA ND e4-13


    SE T TALK OF F
    CLEAR
    @ 20 , 25 SAY ″
在编号中键入空格可结束添加″
    U SE sb
    DO WHI LE .T .
      * 设定一组变量的初值
      bh = SPACE (5 )
      mc = SPACE (8 )
      qyrq = {   /   /   }
      jg = 0 .00
      bm = SPACE ( 2)
      zysb = .F .
      CLEAR
      @ 2 , 25 SAY ″设备管理系统″
      @ 4 , 14 SAY ″编号∶″GET bh
      @ 4 , 34 SAY ″名称∶″GET mc
      @ 6 , 14 SAY ″启用日期∶″GE T qyrq RA NGE {86/ 10/ 12} , DATE ( )
      @ 6 , 34 SAY ″价格∶″GET jg PIC T ″@z 999999 .99″
      @ 8 , 14 SAY ″部门∶″GET bm PIC T ″
99″
      @ 8 , 34 SAY ″T-主要设备 , F-非主要设备∶″GE T zysb PICT ″
l″
      READ SAVE
      IF bh = S PACE (5 )
        EXI T
      ENDIF
      @ 16 , 25 SAY ″
输入有误请修改 , 按回车认可″
      READ
      * 将添加数据送入库文件
      AP PEND BLANK
      REPLACE 编号 WI TH bh , 名称 WI TH mc , 启用日期 W IT H qyrq , ;
        价格 WI TH jg , 部门 WI TH bm , 主要设备 WI TH zysb
    ENDDO
    U SE
    SE T TALK ON

    在本例中使用了一种条件 值始终 为 .t .的循 环 , 常称之 为永 真循环。 为避 免死 循环 ,


・ 1 31 ・
通常在其中再内嵌一个选择结构的程 序段 , 根 据此 选择结 构中 的条件 取值 用 EXIT 命 令
来跳出永真循环。此程序可 添加 任意 多个新 设备 , 以 编号是 SPACE (5 ) 为标 志来 结束 添
加。
    对于 EXIT 与 LOOP 命令的使用还可看下面的例子。
    [ 例 4-14]   改进以下的程序。
    MODIF Y COMMA ND e4-14
    CLEAR
    SE T TALK OF F
    U SE sb
    ACCEPT ″输入待查询的编号∶″TO k
    DO WHI LE ! EOF ( )
    I F 编号 = k
        DISP
    ENDI F
      SKIP
    ENDDO
    U SE
    SE T TALK ON

    本程序的 缺点是效 率不高 , 因为 当记录 指针指向 sb .dbf 中的任何 记录时 , 函数 EOF


( ) 的返回值均为 .F ., 唯有在记录指针越过最后一个 记录时 , EOF ( ) 才取 值为 .T ., 即使 待
查的编号恰属 sb .dbf 的首记录 , 其余 的记 录仍 然要 逐 个检 查 , 造成 耗 费。所 以设 计中 要
注意循环的及时中止 , 本例可把程序中的循环结构改进成下面 形式 , 其中 ( II) 可作为使 用
LOOP 命令的一个例子。

    DO WHI LE NOT EOF ( )                     DO WHI LE NOT EOF ( )


    IF 编号 = k                                   IF 编号 < > k
        DISP                                       SKIP
        EXIT                                       LOOP
    ENDIF                                     ENDI F
    SKIP                                       DIS P
    ENDDO                                     EXI T
                                            ENDDO
      ( I)                                       ( II)

二、FOR-NEXT 循环
    命令格式 :

    FOR < 内存变量 > = < 表达式 1 > TO < 表达式 2 > [ STEP < 表达式 3 > ]
    < 命令序列 >
    [ EXI T ]
    [ LOOP ]
ENDFOR | NEXT

・ 1 32 ・
    功能 :
    本命令中的内存变量 ( 又 称循环 变量 ) 类似于 计数 器 , 它的取 值范 围由 < 表 达式 1 >
( 初值 ) 、与 < 表达式 2 > ( 终 值 ) 确定。通 过判 断内 存变量 的取 值是否 在指 定 范围 之中 来
确定循环体是否重复执行。
    说明 :
    (1 ) < 表达式 3 > 表示步长 , 其值可正可负。步长值缺省 , 则默认为 1 。
    ( 2 ) 初值、终 值与步 长都在循 环开始时 计算读 入 , 若 其中含 有变量 , 那末 这些变量 的
值必须在执行循环之前已经确定。
    (3 ) 一般情况下 , FOR-NEX T 循 环 体中 不应 包含 改变 循 环变 量值 的命 令 , 否 则循 环
执行的次数也将随之改变。
    ( 4) EXIT 与 LOOP 命令可放置在 FOR 与 E NDFOR 中的任意位置 , 它们的功能与用
法与当循环相同。如果循 环可 通过 计数 来 控制 , 则 使用 FOR-N EXT 循 环比 用 当循 环 更
为方便。省得用户再自行设置计数器。下面列出的命令序列可说明这一点。

    用当循环描述                             用 FOR - NEXT 循环描述


IN PU T ″输入循环次数∶″TO n I NP UT ″输入循环次数 :″TO n
i=1 FOR i = 1 TO n

DO WHI LE i < = n     < 命令序列 >


  < 命令序列 > ENDFOR

 i=i+1

ENDDO

三、库文件扫描循环
    命令格式 :

    SCAN [ < 范围 > ] [ F OR < 条件 > ] [ WHI LE < 条件 > ]


    < 命令序列 >
    [ EXI T ]
    [ LOOP]
ENDSCAN

    功能 :
    对当前库文件的指定记录 , 依次重复执行循环体。
    在数 据 库 应 用 程 序 中 , 经 常 要 对 库 文 件 的 指 定 记 录 逐 个 进 行 某 种 处 理 , 以 往 在
FoxBASE 中只能通过当循环来描述 , 现 在使 用 FoxPro 提供 的库 文件 扫描 循 环将 更为 方
便。下面列出它们之间的比较 :

    用当循环描述               用库文件扫描循环描述
GO TOP SCAN    

・ 1 33 ・
DO WHI LE ! EO F( )     处理一个记录

  处理一个记录
  SKI P ENDSCAN
ENDDO

    [ 例 4-15]   在 sb .dbf 中 , 按 设 备 价 格分 三 档 统 计 ( 10000 元 以 下 , 1000050000 元 之


间 , 50000 以上 ) 设备的台数。
    COU N T 命令虽然可以用于统计 , 但按 照题 意 , 就 要用 三条 COU N T 命 令 , 对 sb .dbf
从头到尾扫描三次才能完成。下面采取的方法 是先设 置 3 个计数 器 , 再对 库文件 的记 录
逐个判断 , 属于哪一档就在相应的计数器中加 1。只要对库文件扫描一次便可达到要求。

    MODIF Y COMMA ND e4-15


    CLEAR
    STOR E 0 TO a1 , a2 , a3   & &   3 个计数器设置初值
    U SE sb
    SCA N
    DO CASE
      CASE 价格 > 50000
        a1 = a1 + 1
      CASE 价格 < 10000
        a3 = a3 + 1
      OTHERW ISE
        a2 = a2 + 1
    ENDCASE
    ENDSCAN
    ?″
价格 50000 元以上的设备有∶″+ ST R( a1 , 2) + ″
台″
    ?″
价格 1000050000 元的设备有∶″+ STR ( a2 , 2 ) + ″
台″
    ?″
价格 10000 元以下的设备有∶″+ ST R( a3 , 2) + ″
台″
    U SE
    SE T TALK OF F

程序运行后结果如下 :

    价格 50000 元以上的设备有 :   3 台
价格 1000050000 元的设备有 :   2 台
价格 10000 元以下的设备有 :   2 台

    [ 例 4-16]   在 sb .dbf 中 , 对指定部门查出设备的编号、名称 和价格 , 并计 算该部门 设


备价格的总和。

    MODIF Y COMMA ND e4-16


    CLEAR
    SE T TALK OF F
    U SE sb

・ 1 34 ・
    ACCEPT   ″输入部门代码∶″TO p
    s = 0         & & 累加器 s 置初值
    SCA N F OR 部门 = p
      ? 编号 , 名称 , 价格
      s = s + 价格   & & 累加
    ENDSCAN
    ?″
部门代码为″+ p + ″的设备价格总和为″, s
    U SE
    SE T TALK ON

其执行过程及运行结果如下 :

    输入部门代码 :   12
100-1 微机     8810 .00
101-1 复印机   10305 .01
部门代码为 12 的设备价格总和为       19115 .01

    程序 e4-16 中的变量 s 用 于 累加 指定 部门 的设 备 价格。 程序 设计 中 , 把 具累 加作 用


的变量称为“累加器”。注意累加器的初值必须在循环开始以前确定。
四、多重循环结构
    循环可以嵌套。例如 , 若在循环体中又包含一个循环 , 即形成两层循环嵌套成双重循
环。按其所处的位置分别称为外循环与内循环。
    [ 例 4-17]   在 sb .dbf 中 , 找出所 有价 格超过 p 的 编号、名 称与 价 格。要 求在 每个 输
出行之后再输出一个虚线行。

    MODIF Y COMMA ND e4-17


    CLEAR
    SE T TALK OF F
    U SE sb
    IN PU T ″输入价格∶″TO p
    SCA N
      IF 价格 > p
        ? 编号 + SPACE (3) + 名称 + SPAC E( 3) + STR (价格 , 9 , 2)
        ?
        F OR i = 1 TO 30
          ? ?″
-″
        ENDF OR
      ENDIF
    ENDSCAN
    U SE
    SE T TALK ON

    本例用 FOR 循环生成虚线 ( 由 30 个“-”号构成 ) , 执行过程及运行结果如下 :


・ 1 35 ・
    输入价格 : 20000
016-1   车床   62044 .61
-------------------------------
016-2   车床   27132 .73
-------------------------------
037-2   磨床   241292 .12
-------------------------------
210-1   轿车   151000 .00
-------------------------------

4 .3   模块化程序设计

    模块化程序设计是人们在软件开发的长期 实践中 总结 出来的 一种 设计 策略 , 在数 据


库应用程序设计中也行之有效。

4 .3 .1   基本概 念

一、模块与模块化
    模块是一个具有独立功能 的程 序 , 可以单 独地 设计、调试 与管 理。例 如 , e4-3 .prg 就
是一个用于在 sb .dbf 中按 C 型关键字进 行查 询的 模块 , 而 e4-11 .prg 则是 一个能 控制 执
行 3 个不同功能的模块。为区分两者 , 把类似于前者的模块称为功能模块 , 而把类似于后
者的模块称为控制模块。
    模块化就是按适当的原则把一个情况复杂、规模 较大 的程 序系统 划分 为一个 个较 小
的、功能相关而又相对独立的模块。
二、模块化设计的策略与要求
    1 .用“自顶向下”的方法进行系统设计
    系统设计中可以采 取“自 底 向上”与“自 顶向 下”两种 设计 方法。 前者 是 从局 部到 整
体 , 即先把某一部分 ( 如最难的部分 ) 设计好 , 然 后再考 虑其 它部分 ; 而 后者 则是从 整体 到
局部 , 先考虑系统的总体结构 , 如整个系统由哪几部分组成 ? 每一部分的功能怎样 ? 它们
之间又有什么联系 ? 等等。然后再以同样的方法 来考 虑各 局部的 设计 , 直 到所有 的模 块
都便于管理为止。实践表明 , 自顶向下、逐层分 解的方 法容 易避免 全局 性的 差错与 失误 ,
能提高软件开发的效率。
    2 .按功能划分法把模块组成树状结构
    根据设计目标把整个系统划分成若干模块 , 一个模块描述一个功能 , 能较好地体现模
块的独立性 , 给编制与调试程序都带来方便。全部模块以树状结构组成系统 , 如图 4 .6 所
示。这种结构层次清楚 , 各分支也可自成系统 , 管理起来比较方便。
    3 . 模块的大小要适中
    模块过大不容易控制复杂性 ; 模块过 小又 会增加 模块 间的 联系。因 此 , 一般说 来 , 模
块的大小以不超过 100 行为宜。
    4 . 各模块间的接口要简单
・ 1 36 ・
图 4 .6   模块的树状结构

    复杂的接口往往是造成系统出错的主要原因之一。应尽可能做到每个模块只有一个
入口、一个出口。
三、模块化程序设计的优点
    (1 ) 把复杂的系统化大为小、化繁为简 , 减少了设计中的工作量。
    (2 ) 便于维护。一旦系统出错 , 便能很快地限定差错的范围 , 把 有关的模 块分隔出 来
进行修正。另一方面 , 若需添加、删除或修改某一功能 , 只需对相关模块作处理或修正 , 用
不着对整个系统进行大的动作。
    ( 3 ) 提 高系统 的设计效 率。模块 设计能做 到多人并 行地进 行系统开 发 , 缩短开发 周
期。鉴于不同的信息管理系统常有部分相似的功能 , 在建立新的数据管理系统时 , 可从别
的已被证明可靠的系统中找出合适的模块经修 改后加 以利 用 , 进一步 提高 系统的 设计 效
率。

4 .3 .2   子程序 、函 数与过程

    在程序设计中 , 如果某个功能的程序段需多次重复使用 , 可把这个程序段独立出来单


独组成一个程序 , 称为子程序。以后凡需要 完成该 功能 时 , 只要调 用相 应的 子程序 便可。
可见 , 子程序的基本思想是把“ 重复编”改为“ 编一次 , 重复用”。
    在 FoxPro 中 , 子程序的形式可以是 一个 程序文 件 , 也可 以是 一个过 程与 函数。下 面
分别加以说明 :
一、子程序
    子程序其实就是程序 , 其特点是它总被 其它 程序调 用而 不单 独执行。 在描述 程序 间
的调用关系时 , 通常称被调用者为子程序 , 调用它的程序为主程序。然而主程序与子程序
的概念是相对的 , 因为子程序也可能再去调用其它的子程序。为此约定 , 主程序专指最外
面的那层调用程序 , 其 它的 都称 为子 程序 , 只是 它们 所处 的 层次 不 同 而已。 若子 程 序 A
调用子程序 B , 称 A 是 B 的上级程序。为说明子程序的调用 , 下面再介绍一条返回命令。
    命令格式 :

    R ETUR N [ < 表达式 > | TO MAST ER | TO < 程序文件名 > ]

    功能 :
    返回到调用该子程序的上级程序。加可选项 [ T O MAST ER] 后 , 则不论前面有多少
级调用 , 都直接返回主程序。可选项 [ TO < 程序文件 名 > ] 可 强制性 地返 回到指 定的 程
・ 1 37 ・
序文件 ; 而 RE T URN < 表达式 > 则表示将指定的表达式值返回给调用程序。
    说明 :
    (1 ) 本命令通常出现在子程序的末尾 , 但也可出现在程序中间 , 作用是一样的。
    (2 ) 返回的具体位置是 : 上级程序中调用该子程序命令的下一条命令处。
    (3 ) 若调用子程序命令从命令窗口中发出 , 则执行后仍返回到命 令窗口。可 见 , 如 果
在前面已编制程序的末尾均添加本命令 , 其执行效果不变。
    (4 ) 子程序可以嵌套调用。图 4 .7 示出了子程序嵌套调用的示意图。

图 4 .7   子程序嵌套调用示意图

二、自定义函数
    Fox Pro 可提供 280 多个函数 , 但还不可能概括用户的 各种需 求。为能满 足某种特 殊
需要 , FoxPro 允许用户按一定的规则 自行 定义 一个 专 用的 函数 , 这 就 是自 定义 函数。 如
是 , 用户就能像调用系统函数那样调用自定义函数 , 带来了很大的方便。
    自定义函数与子程序的主要区别仅在于自 定义函 数必 须返回 一个 函数 值 , 而 子程 序
却无此限制。所以自定义函数的建立与修改方法 与程 序文 件编辑 的方 法相同 , 只 是在 最
后一条的返回命令中必须指出函数的返回值 , 而且要把程序文件名改称为函数名。
    命令格式 :

    [ F UNCT ION < 函数名 > ]


[ PARA ME TERS < 参数表 > ]
< 命令序列 >
R ETUR N < 表达式 >

    说明 :
    (1 ) 自定义函数能以一个 独立的 文件 储存 , 也可 包含 在调 用程序 中作 为它的 一部 分
出现。命令中的可选项 [ FU NCTION < 函数名 > ] 若缺省 , 则表明 该自定义 函数是一 个
独立 的文 件 , 仍用 MODIFY COMMAND 命令建 立并 储存 , 此 可选项 标志 自定义 函数 的
开始 , 通常用作定义该函数的语句。
    (2 ) 自定义函数名不能与 FoxPro 的系统函数同名 , 也不能与内存变量同名。它最 多
由 10 个字符组成 , 字符可以是字母、数字或下划线 , 但必须以字母或下划线开头。
    (3 ) 自定义函数与系统函数的调用方法相同。其形式为 :

      < 函数名 > ( [参数表 ] )

由于自定义函数返回的是一个表达式值 , 所以调用符号只能作为表达式的一项出现。
    (4 ) FoxPro 允许一个自定义函数的 最后一 条命 令不是 RE T URN < 表 达式 > , 或 者
・ 1 38 ・
虽是 RE T URN , 但其后没有说明返回值 , 此时 FoxPro 在遇到下一个 F UNCTION 语句 ,
或是该程序文件的结束语句时 , 函数会自动执行隐含返回。
    [ 例 4-18]   把计算圆面积的程序改写为自定义函数。

    MODIF Y COMMA ND area


    PARAMET ERS   r
    CLEAR
    SE T TALK OF F
    s = 3 .1416 * r * r
    SE T TALK ON
    RE TURN s

    [ 例 4-19]   自定义函数的调用示例。

    MODIF Y COMMA ND e4-19


    ? area (3 )               & & 输出结果为 28 .2744
    ? zc( DAT E ( ) )           & & 把当前系统日期按××××年××月××日的形式输出
    ?″
制表日期∶″+ zc({95/ 12/ 27})   & & 输出形式为     制表日期∶1995 年 12 月 27 日
    F U NC T ION zc
    PARAMET ERS z
    y = YEAR( z)
    m = MONT H( z)
    d = DAY( z)
    c = STR (y , 4 ) + ″年″+ ST R( m , 2) + ″
月″+ ST R( d , 2 ) + ″日″
    RE TURN c

自定义函数 area 是一个独立文 件 , 既可在 命令 窗口中 调用 , 也 可在其 他任 何 地方 单独 调


用。然而自定义函数 zc 却是 程序 e4-19 的一 个部分 , 所 以自 定义函 数 zc 的 调用 符号 只
有在该程序中出现才有意义。
三、过程
    过程是一个程序段。它的书写格式是

    PROCEDU RE < 过程名 >


      [ PARAMET ERS < 参数表 > ]
      < 命令序列 >
R ETUR N

    一个程序文件通常总是单独建立 , 然后以 DO 命令调用执行。与之不同的是 , 过程往


往是程序文件 的 一 个 组 成 部 分 , 习 惯 上 常 把 它 写 在 程 序 的 最 后 , 并 冠 以 PROCEDURE
< 过程名 > 为标志。与程序 的调 用 方 法 相 同 , 过 程 也 以 DO < 过 程 名 > [ WIT H < 参 数
表 > ] 进行调用。
    [ 例 4-20]   把例 4-19 中的自定义函数改写为过程 :

    M ODIF Y COM MAND e4-20


・ 1 39 ・
c = { / / }                     & & 定义日期型内存变量
DO zc WI TH DATE ( ) & & 以 DATE ( ) 作为实在参数调用过程 zc
?″当前系统日期为∶″+ c & & 输出调用过程 zc 后的结果值
DO zc WI TH {95/ 12/ 27}
?″制表日期为∶″+ c
PROCEDU RE zc
PARAMET ERS z
y = YEAR( z )
m = MO NTH( z)
d = DAY( z)
c = ST R(y , 4) + ″
年″+ ST R( m , 2) + ″
月″+ STR (d , 2) + ″日″
R ETUR N

    综上可见 , 过程与自定义函数都是子程 序 , 区别在 于过 程通常 用来 执行 某个动 作 , 而


自定义函数用来返回一个值。显然 , 它们的调用方式也不同 , 过程的调用是一个独立的命
令 , 调用后的结果值往往用另一条命令来输 出 , 而函数 的调 用符号 表示 一个 表达式 的值 ,
该调用符号除单独输出外 , 还可直接写在表达式之中作为它的一项出现。

4 .3 .3   全程量 与局部量

    在 2 .2 .2 节中曾详细地介绍过内存变量 , 指出内存变量必须先定义再使用 , 否则系统


将提出“变量找不到”的警告。本小节将进一步 说明内 存变 量的作 用范 围 , 它们中 有的 能
在任何场合下使用 , 有的只能在局部范围中使用 , 这就是下面要叙述的全程量与局部量。
一、全程量
    在具有嵌套结构的任何程序中都可使用的变量称为全程量。它可用下面两种方法定
义:
    1 . 在命令窗口中定义的变量不从属于某一个应用程序 , 它们都是全程量。
    2 . 用下述命令指明的变量也是全程量。
    命令格式 :

    PUBLIC < 内存变量表 >

    功能 :
    把指定的变量全部设置为全程量 , 并把这些变量的初值均赋以 .F .。
    在 2 .2 .2 节中提到过的 RE LEASE 命令与 CL EAR AL L 命令都可用来清除全程量。
二、局部量
    在一个程序内部定义且未被指明为全程量的变量称为局部量。局部量只在定义它的
局部范围中有效 , 该程序执行结束后 , 有关的变量也被自动清除。
    对于局部量的使用还须明确 :
    1 . 上级程序定义的局部量要到上级程序执行结束后才失效 , 所 以在被调 用的下级 程
序中仍然有效 , 反之不然。
    2 . 局部量可以与全程量或上级的局部量同名 , 但需用下面的命令屏蔽。
・ 1 40 ・
    命令格式 :

    PRI VAT E [ < 内存变量表 > ] [ ALL [ LIKE | EXCEPT < 通配符 > ] ]

    功能 :
    把指定变量的作用范围限制在所属的程序、过程或自定义函数之中 , 此时在较高层中
的同名变量被隐藏并使其值保持不变 , 直到 所属的 程序、过 程或自 定义 函数 执行结 束后 ,
再恢复先前被隐藏起来的同名变量 , 以供继续使用。
    [ 例 4-21]   设已有下列子程序 :

    MODIF Y COMMA ND ar1


    PARAMET ERS   sr
    PRIV s
    SE T TALK OF F
    s = 3 .14 * sr * sr
    ?″程序 ar1 .prg 执行中的内部变量清单″
    L IST MEMO LIKE s ?
    SE T TALK ON
    RE TURN

在命令窗口中按顺序键入下列操作命令 :

    s= 0
    IN PU T ″输入圆半径∶″TO sp     & & 键盘输入圆半径为 3
    ?″程序 ar1 .prg 执行前的内部变量清单″
    L IST MEMO LIKE s ?
    DO ar1 WI TH sp
    ?″程序 ar1 .prg 执行后的内部变量清单″
    L IST MEMO LIKE s ?

则执行的结果如下 :

    输入圆半径∶3
    程序 ar1 .prg 执行前的内部变量清单
    S           Pub       N     0           (               0 .00000000)
    SP         Pub       N     3           (               3 .00000000 )
    程序 ar1 .prg 执行中的内部变量清单
    S         ( hid)                         (               0 .00000000 )
    SP         ( hid)                         (               3 .00000000 )
    SR         Priv       @     sp                        
    S           Priv       N     28 .26         (             28 .26000000)  
    程序 ar1 .prg 执行后的内部变量清单
    S           Pub       N     0           (               0 .00000000)
    SP         Pub       N     3           (               3 .00000000 )

    本例中 , s 先定义为全程量初 值为 0。在 调用 ar1 .prg 时 已通过 PR IVAT E 命 令对 变


・ 1 41 ・
量 s 作了屏蔽。因此变量 s 的原有值被隐藏 , 而有了新 的意义。 一旦程序 执行结 束 , 本 被
屏蔽的变量 s 重新恢复了其原有的值。
三、关于变量使用的若干说明
    1 . 一个应用程序可由多个人员同时开 发 , 只要 各人 把自己 所用 的变量 用 PRI VAT E
命令屏蔽起来 , 即使各人所用的变量名重复 , 以 后在汇 总组 成应用 程序 时 , 也不会 产生 任
何混淆。
    2 . 控制模块中定义的变量可在被它调用的任何功能模块中使用 , 但在某 个功能模 块
中定义的局部量就不能在调用它的控制模块中使用。
    3 . 某个功能模块中定义的局部量不能在与它无调用关系的其他功能模块中使用。

4 .4   积木式程序的编制

    懂得了模块和模块化 , 不等于掌握了应 用程 序的设 计方 法。编者 在长 期教学 实践 的


基础上 , 以模块化思想为指导总结了一种“积木 式编 程”方法。 这种方 法首 先向读 者介 绍
数据管理中常用的模块 ( 积木块 ) , 然后再介绍 如何把 这些 积木 块装配 成一 个完整 的应 用
程序。它易学、易懂、易模仿 , 是帮助初学者运用模块化程序设计原理、掌握小型数据库应
用程序设计技术的一条捷径。

4 .4 .1   程序中 的功能模 块

    熟读唐诗三百首 , 不会作诗也会吟 , 程序设计也是如此。本节将分三类 ( 数据操作、库


结构修改、口令检查 ) 介绍 在 数据 库应 用程 序中 常 见的 典型 功能 模块 , 建 议 读者 读 懂、读
通 , 可能时对它们调试与改写 , 力求融会贯通。
一、数据操作的功能模块
    库文件中典型的数据操作有记录的添加、修改、删除与记录数据的查询等。
    1 . 添加记录模块
    (1 ) MODIFY CO MMAND tj   & & 为任意指定的库文件添加一个或多个记录
      CLEAR
      SET TALK OF F
      ACCEPT ″
输入库文件名∶″TO s
      USE &s
      WAI T ″记录添加结束后按 Ct rl-W 存盘″W INDOW TI MEOUT 2
      AP PEND
      USE
      SET TALK ON
      R ETU RN
    (2 ) MODI FY COM MAND sb tj   & & 在 SB .D BF 中添加记录
      CLEAR
      SE T TALK OF F
      @ 20 , 25 SAY ″按 Esc 键结束添加″

・ 1 42 ・
      U SE sb
      DO WHIL E .T .
      SCAT TE R MEMO memver BLA N     & &   建立一组与当前记录相应的空的内存变量
        @ 2 , 25 SA Y ″设备管理系统″
        @ 4 , 14 SA Y ″编号∶″GE T m .编号
        @ 4 , 34 SA Y ″名称∶″GE T m .名称
        @ 6 , 14 SA Y ″启用日期∶″GE T m .启用日期 RANGE {86/ 10/ 12} ,DATE ( )
        @ 6 , 34 SA Y ″价格∶″GE T m .价格 PIC T ″@z 999999 .99″
        @ 8 , 14 SA Y ″部门∶″GE T m .部门 PIC T ″
99″
        @ 8 , 34 SA Y ″T-主要设备 , F-非主要设备∶″GE T m .主要设备 pict″
l″
        @ 10 个 , 14 SAY ″
备注∶″
        @ 10 , 20 EDI T m .备注 SIZE 2 , 40   & &   建立一个矩形区域来编辑备注型字段内容
        READ SAVE
        @ 16 , 25 SAY ″输入有误请修改 , 按回车认可″
        READ
        APPEND BLA NK
        GAT HE R MEMO memver       & & 将添加数据送入库文件
        IF LASTKEY ( ) = 27             & & 若最近的一次按键为 Esc 则退出循环结束添加
          EXIT
        ENDIF
      ENDDO
      U SE
      SE T TALK ON
      RE TURN

    说明 :
    ① 程序模块 sbtj 专用 于为 sb .dbf 添 加记录。 与 [ 例 4-13 ] 所 提供 的程 序 e4-13 相 比
较 , 可看 到利用 SCA T T ER 与 GA TH ER 命 令以 后 , 不但 能同时 处理 备注型 字段 , 而且 可
省略为变量送初值 , 使程序更 为简洁 , 执行 的速 度也 会 加快。 所以 这两 条命 令在 FoxPro
的程序中经常使用。
    ② 与 INK EY 函数 ( 参见 4 .1 .4 节 ) 不同 , LAST KEY ( ) 返回最 近一 次 击键 的 ASCII
码值。对于各种不可打印的控制键与 功能键 其返 回值与 INK EY 函数 相同。 所以在 sbtj
中 , 可通过按 Esc 键 ( 返回值为 27) 来控制添加过程的结束。
③ 命令 @ …EDIT 用于在屏幕上建立一个矩形文本编辑区域 , 以编辑备 注型变量 的
内容。该命令也需使用 READ 命令激活。
2 . 修改记录模块

    M ODIF Y COM MAND xg     & & 为任意指定的库文件修改任意指定的字段


CLEA
SE T TALK OF F
ACCEPT ″
输入库文件名∶″TO s
USE &s

・ 1 43 ・
WAI T ″修改结束按 Ct rl-w 存盘 , 按 Esc 键废弃″WINDOW T IMEO UT 1 .5
WAI T ″请查看库文件的关键字与待修改字段名的序号″WINDOW T IMEOU T 1 .5
LIST ST RU
IN PU T ″输入库文件关键字序号∶″TO n1
IN PU T ″输入待修改的字段序号∶″TO n2
k = FI ELD( n1 )           & &   FEI LD 函数能返回以 n1 为字段序号的字段名
p = FIELD( n2)
BROWSE FI ELDS & k , & p
USE
SE T TALK ON
R ETUR N

    说明 :
(1 ) 程序模块 xg 中把库文件关键字 ( 如 sb .dbf 中 的编号 字段 ) 与 待修 改的字 段同 时
列出是为了在修改时有所依据。
(2 ) 请 读者 仿照 sb tj 的设 计思 想编 制 在 sb 中修 改指 定 记录 的程 序模 块 sbxg , 并 在
SCA T T ER 与 GA T HER 命令中改用一个数组。
3. 删除记录模块

    M ODIF Y COM MAND sc   & & 按指定条件删除记录


CLEAR
SE T TALK OF F
ACCEPT ″
请输入库文件名∶″TO s
USE &s
@2 , 5 SAY ″
输入关键字 (C 型 )∶″GET k DEFA ULT SPACE ( 10)
& & 字段名最多是 10 个字符
R EAD
k = ALLT RIM( k ) & & 删除 k 中前后的空格
l = FSIZE ( k) & & 返回指定字段的宽度
@3 , 5 SAY ″
输入被删除的″+ k + ″
∶″GET z DEFAULT SPACE ( l)
R EAD
DELE TE F OR & k = z
LIST FOR & k = z
WAI T ″是删除带 * 的记录吗 ? ( Y/ N )″TO p WINDOW
IF U P PE R( p) = ″
Y″
  PACK
ELSE
  RECALL ALL
ENDIF
USE
SE T TALK ON
R ETUR N

・ 1 44 ・
    在处理类似删除等带有某种破坏性的工作时 , 往往给用户一个认定的机会 , 就是先把
待删除的记录列出 , 再要求用户表态。
4 . 查询模块

    M ODIF Y COM MAND sycx   & &   索引查询


CLEAR
SE T TALK OF F
SE T SAFETY O FF
ACCEPT ″
输入库文件名∶″TO s
USE &s
CLEAR
@ 2 , 5 say″输入待查询的字段名 (C 型或 N 型 ) :″get k default space(10)
R EAD
k = ALLT RIM( k )         & &   删除 k 中前后的空格
l = FSIZE ( k) & &   返回指定字段的宽度
@ 3 , 5 say″输入待查询的″+ k + ″
的值∶″GE T p DEFA ULT SPACE( l)
R EAD
INDEX ON & k TO IN
IF TYPE (″& k″) < > ″
C″    & &   如果指定字段不是 C 型 , 注意其中的 C 为大写字母
  p = &p & &   通过宏代换将 p 转为数值型
ENDIF
SE EK p
IF F OU ND( )
  DIS P REST WHILE & k = p   & &   列出满足指定条件的全部记录
ENDIF
SE T SAFETY ON
SE T TALK ON
USE
R ETUR N

    说明 :
(1 ) 每执行本程序时 , 都要按指 定的 关键 字建立 相应 的索引 文件 , 为 避免反 复地“ 声
明”, 程序中对系统提供的保护状态设置为“关闭”。
(2 ) 若 查询 成功 则 函数 FOU ND ( ) 取 值为 .t ., 由 于 经索 引后 相同 关键 字 均排 在 一
起 , 所以使用命令

    DISP REST WHILE & k = p

以后 , 便能把有关的记录全部找出。
(3 ) 在 3 .2 .2 节中曾提到利用状态设置 命令 SE T EXACT OFF/ on 可以 对查询条 件
是精确匹配还是左部匹配进行控制。实用上更多 地遇 到部 分匹配 的情 况 , 这就是 模糊 查
询。使用运算符$或 AT( ) 函数可以实现模糊查询 , 有关的程序请读者自行编制。
・ 1 45 ・
二、修改库结构的功能模块
修改库文件的结构包括添加与删除字段 , 以 及对 指定字 段的 4 个 结构 参数进 行修 改
等。通过程序方式来修改库文件的结构 , 通 常要 利用库 文件 的结 构文件。 下面提 供两 个
功能模块来说明其处理思想。
1 . M ODIF Y COM MAND kxg   & & 用 BROWSE 命令修改不含数据的库结构
    SE T SA FE TY OF F
ACCEPT ″输入库文件名∶″TO s
U SE & s
COPY TO abc ST RUC TUR E EXT E     & &   abc .dbf 为库文件的结构文件
U SE abc
BROWSE FIELDS field- name∶H = ″
字段名″, field- type∶H = ″类型″, ;
  field- len∶H = ″宽度″, field- dec∶H = ″
小数位数″  & &   在 browse 窗口中修改库文件结构
ERASE &s . .dbf           & & 其中第一个圆点表示内存变量名的结束
CREAT E &s FROM abc & & 由修改后的结构文件生成新库文件结构
SE T SA FE TY ON
U SE
RE TURN

    2 . M ODI COM M ktj & & 在带有数据的库文件中添加一个新字段

    CLEAR
SE T TALK OF F
SE T SA FE TY OF F
ACCEPT ″输入库文件名″TO s
U SE & s
COPY TO abc ST RU EXTE       & &   abc .dbf 为库文件的结构文件
COPY TO sj SDF & &   将库文件数据单独复制成一个文本文件
U SE abc
@ 1 , 5 SAY ″
输入待添加的字段名∶″GET k DEFA ULT SPACE ( 10)
@ 2 , 5 SAY ″
输入字段类型∶″GET q DEFAULT S PACE (1 )
@ 3 , 5 SAY ″
输入字段宽度∶″GET w DEFAUL T 0
READ
k = ALLT RIM( k)
AP PEND BLAN
REPLAC E field- name W I TH k , field- t ype W I TH q , field- len WI TH w
IF U P PE R(q) = ″N″
  @ 4 , 5 SAY ″
输入小数位数∶″GET x DEFA ULT 0
  READ
  REPLACE field- dec WI TH x
ENDIF
ERASE &s . .dbf
CREAT E &s FROM abc

・ 1 46 ・
AP PEND FROM sj SDF   & & 再把原库文件的数据添加到新库结构之中
SE T TALK ON
SE T SA FE TY ON
U SE
RE TURN

    请读者考虑修改程序 :
(1 ) 把新增字段插在库文件的第 3 与第 4 个字段之间 ;
(2 ) 若每次新添的字段数不定 , 程序又应如何控制 ?
(3 ) 当用户在出现误操作如字段名重名或键入的字段类型出错时 , 有改正机会。
三、口令检查模块
为避免数据泄密或被破坏 , 通常在程序中设置口令检查 , 防止非法用户使用。
1 . M ODIF Y COM MAND kl1   & & 口令检查模块
    CLEAR
SE T TALK OF F
?″
请输入您的口令∶″
SE T CONSOLE OF F
ACCEPT TO k
SE T CONSOLE ON
CLEAR
IF k < > ″
abc″
  ?″
口令错 , 您不能进入本系统″
  CANCEL
ELSE
  ?″
欢迎您使用本系统″
ENDIF
RE TURN

    说明 :
(1 ) 程序执行时 , 把用户输入口 令与 系统 内定口 令进 行核对 , 核 对正 确便 放行 通过 ,
否则提出警告后返回命令窗口。
(2 ) 命令 SE T CONSOL E OFF 能关 闭屏 幕 , 使 用户 输入 的口令 不出 现在 屏幕 上 , 以
增加口令的保密性。
(3 ) 为使用户对键入口令时的误操作有改正的机会 , 可在程序中设 置一个计 数器 , 以
控制用户键入口令的次数。请读者改写 kl1 .prg , 使之能给用户以 3 次键入口令的机会。
2 . M ODIF Y COM MAND kl2   & & 动态口令检查模块
    CLEAR
SE T TALK OF F
d = STR ( DAY ( DATE ( ) ) , 2)
t = SUBS( T IME ( ) , 1 , 2)
?″
请输入口令∶″

・ 1 47 ・
SE T CONSOLE OF F
ACCEPT TO k
SE T CONSOLE ON
IF k < > t + d
  ?″
口令错 , 您不能进入本系统″
  y = INKEY( 1)
  CANCEL
ENDIF
?″
欢迎您使用本系统″
y = IN KEY( 1)
SE T TALK ON
RE TURN

    程序中的口令由 4 个字符组成 , 头两位是系统当前的 小时数 ( 023 中取值 ) , 后两位 则


是系统日期中日的数值。由于口令本身随着使用 时间 的不 同而不 同 , 所以 这是一 个动 态
口令。读者可根据使用需要自行设置一个动态口令。

4 .4 .2   带选单 的控制模 块

有了功能模块 , 还须编制一个控制模块 , 把这些功能模块组织在一个整体之中进行调


用。在数据库应用程序中 , 控制模块的主要形 式为 选单式 , 通常由 三个 部分组 成 : 首先 在
屏幕上显示应用程序的各种功能 , 如同开列一张菜单那样 ; 其次等待用户对菜单功能进行
选择 ; 然后再按用户的选择去控制执行相应的功能。这三个部分也可通俗地比喻为“ 开菜
单”、
“ 点菜”与“上菜”。
一、选单的显示和选择
Fox Pro 可提供多种选单 , 如传统式选单、光带式选 单、下拉式 选单等。本 节着重介 绍
光带式选单的生成与选择 , 下拉式选单的生成在第八章中介绍。
1 . 传统式选单
传统选单是在 FoxPro 以前就长期沿用 下来的 一种 选单 形式。前 述的 文本输 出命 令
“ T EXT”及“ E ND T EXT”与格式输出命令 @ —SAY 都能用于生成这种选单。
[ 例 4-22]   传统式选单示例。

    M ODIF Y COM MAND e4-22


T EXT

主 选 单
  1 .修改         2 .删除
  3 .添加         4 .查询
0 .返回

ENDT EXT
R ETUR N

    第 4 .1 节所介绍的有关命令都可对传统式选单进行选择。例如 :
・ 1 48 ・
    WAI T ″请输入选择号∶ (0—4 )″TO k
IN PU T ″请输入选择号∶ (0—4 )″TO k
@8 , 10 SAY ″请输入选择号∶ (0—4)″GE T k DEFAULT 1

    2 . 光带式选单
在光带式选单中 , 用户能通过光标的移 动对 选单的 功能 进行 选择。被 选中的 功能 以
增强方式即亮底暗字的形式显示 , 从外表看 来 , 被选中 项晶 亮醒目 , 如 同在 上面覆 盖了 一
条光带。
(1 ) 光带选单的定义 : 可使用 @ . . .P ROM PT 和 SE T M ESSAGE TO 两种命令 , 分述
如下。
命令格式 :

    @ < 行坐标 > , < 列坐标 > PROM PT < 字符表达式 1 > [ MESSAGE < 字符表达式 2 > ]。

    功能 :
< 字符表达式 1 > 用于定义光 带选 单中的 一个 功能 项 , 该项 在屏 幕上 的 显示 位置 由
命令中的 < 行坐标 > 、< 列坐标 > 指定 , 可选项 MESSAGE 后的 < 字符表达式 2 > 用于 定
义该功能项的提示信息。
说明 :
① 定义光带选单时还能为功能项设置热键。为此可先在该功能项 上选定一 个字符 ,
在该字符前插入符号“ \ < ”。例如 , 命令 @3 , 4 P ROMP T ″E \ < XIT″中 的字 符“ X”便 为
该功能项 EXIT 的热键。被设定为热键的字符在选单显示时会自动被加上下划线。
② 功能项也可被屏蔽而成 为不 可选 , 只须 在某 个功 能项的 文字 前加上 符号“ \ ”, 选
单显示时 , 被屏蔽的功能项呈灰色。
③ 如果选单中的某功能被选定 , 则该功能项的提示信息将同步 出现在屏 幕底部的 窗
口类型状态条的左侧。命令 SE T STA T US BAR ON/ off 能 用于 控制 这窗 口 类型 状态 条
是否在 FoxP ro 的主窗口中出现 , 系统的默认值为 ON。
④ 在窗口类型状态条显示的 前提下 , 若再执行一条 SE T S TAT US ON 命令后 , 则功
能项提示信息的位置将能通过下述命令设定。
命令格式 :

    SE T MESSAGE TO < 数值表达式 > [ LEFT | CENTER | RIGHT ]

    功能 :
提示行的位置由数值表 达式 的 值设 定 , 若该 值 为 0 , 则 提示 信 息 不显 示。而 LEF T、
CEN T ER 和 RIGH T 参数则决定这些提示信息靠左、居中或靠右显示。
(2 ) 光带选单的激活 : 可使用 M EN U TO 命令。
命令格式 :

    MEN U TO < 内存变量名 >

    功能 :
激活光带选单 , 就是能使用光标移动键与回车键在该选单上进行功能选择。
・ 1 49 ・
说明 :
① 若命令中的内存变量是一个已定义的数值型变量 , 且其值介 于 1 与功 能项的总 数
之间 , 则光 带的 初始 位置是 以该 值为序 号的 功能 项 ( 各功 能项 在选单 中的 序号按 先行 后
列 , 同一列上先左后右确定。如返回功能的序号为 5 ) 。否则光带停在第一个功能项上。
② 对于光带选单的功能选择除了移动光带到所需功能项上并按回 车键外 , 还可通 过
直接键入该功能的相应“热键”来实现。
③ 功能选择完成后 , 系统自动把该功能项在选单中的序号存入 M EN U T O 命令中的
内存变量。可见 , 该变量有两个作用 : 一是决定光 带在 选单 中的初 始位 置 , 二是储 存用 户
选择功能项的返回值。若用户在选单激活后未作选择就直接退出 , 则返回值为 0。
[ 例 4-23]   光带式选单示例。

    M ODIF Y COM MAND e4-23


CLEAR
SE T TALK OF F
SE T STATU S BAR ON
SE T STATU S ON
ms1 = ″用于修改指定的字段″
ms2 = ″按记录的关键字值删除″
ms3 = ″向数据库添加记录″
ms4 = ″按记录的关键字值索引查询″
ms5 = ″结束运行″
@3 , 10 PROM PT ″\ < 1 .修改″MESSAGE ms1     & & 热键为 1
@3 , 30 PROM PT ″\ 2 .删除″MESSAGE ms2     & & 此功能项不可选
@4 , 10 PROM PT ″\ < 3 .添加″MESSAGE ms3
@4 , 30 PROM PT ″\ < 4 .查询″MESSAGE ms4
@5 , 20 PROM PT ″\ < 0 .返回″MESSAGE ms5
SE T MESSAGE TO 10 LEFT
R ETUR N

执行下述命令后 , 可激活上述的光带式选单 :

    k= 4
MEN U to k

激活后的屏幕形式如下 所示 , 其中 的 方框 表 示光 带 所 在的 位 置 ( 因为 k 的 初 始值 为 4 ) 。
在屏幕第 10 行上同步显示相应的提示信息。

    1 . 修改               2 . 删除
3 . 添加 4 . 查询

        0 .返回
按记录的关键字值索引查询

    综上可见 , 光带式选单与传统式选单相比较 , 具备了如下的优点 :


・ 1 50 ・
① 选择选单功能的方法较灵活。
② 选中项以增强方式显示 , 目标鲜明突出 , 有较好的视觉效果。
③ 能为用户提供针对性很强的屏幕提示。
二、功能模块的调用
命令格式 :

    DO < 功能模块名 >

    功能 :
实现对指定功能模块的调用。例如 , 上节 列出的 选单 中有 5 个 功能 , 它们 是修 改、删
除、添加、查询与返回 , 相应的功能模块名依次是 xg .prg , sc .prg , tj .prg 与 sycx .prg。为 实
现对这些功能的调用 , 就需要组织含选择结构的程序。
1 . 用 DO CASE 命令来控制调用
[ 例 4-24]   用 CASE 命令对由 e4-22 .prg 所示的传统式选单实现功能调用。

    M ODIF Y COM MAND e4-24


* * 假定使用 WAI T ″请输入选择号 : (0—4 )″TO q 命令在传统式选单中进行选择 * *
DO CASE
  CASE q = ″
1″
    DO xg
  CASE q = ″
2″
    DO sc
  CASE q = ″
3″
    DO tj
  CASE q = ″
4″
    DO sycx
    WAIT TI MEOUT 5
  CASE q < > ″
0″
    ?″
选择号错″
    y = IN KEY( .5)
ENDCASE
R ETUR N

    如果选单中开列的功能较多 , 则用 DO CASE 命令来 控制调 用的程序 也随之 变长 , 若


能改进各功能模块的命名方法 , 并在控制调用中使用宏代换函数 , 就可缩短程序的长度。
2 . 在调用中使用宏代换函数
首先对各功能模块确定一个统一的前缀名 , 再按下面公式确定各功能模块的名称 :

    功能模块名 = 前缀名 +“该模块在主选单中的序号”

例如 , 以字母 M 作为统一的前缀名 , 则 4 个 功能 模块 的名 称 依次 为 M1 , M2 , M3 , M4 , 这
样就能利用宏代换函数来实现各功能模块的控制调用了。
[ 例 4-25]   用宏代换实现光带式选单的功能调用。
・ 1 51 ・
    M ODIF Y COM MAND e4-25
IF k > = 1 AND k < 5         & &   光带式选单中返回功能的序号应是 5
  k = ST R( k , 1) & &   将 k 转化为字符型
  DO m & k
ENDIF
R ETUR N

    上述程序不仅篇幅较短 , 而且执 行时也不用像 DO CASE 命令那样对 q 值逐一判断 ,


只须按用户的选择即可直接调用所需的功能模块。
3 . 功能调用结束后的返回方法
(1 ) 功能模块调用后返回原选单
为改善系统的结构 , 要求各模块都只有一个入口 , 一个出口。各功能模块以选单选择
为唯一入口 , 但若执行结束后各有安排 , 或者退 出时都 回到 命令窗 口 , 会使 带选单 的控 制
模块出口很多 , 达不到 单出 口的 要求。 为此 , 要 求 每个 功能 模块 执行 结 束后 仍 返回 原 选
单 , 等待用户再作选择。于是 , 选单显示、选单选择、功能模块的调用这三部分工作不断重
复 , 形成循环 , 唯有在用户选择返回功能后 , 才跳 出此循 环过 程而 转入结 束处 理。为实 现
上述要求 , 只需把选单显示、选单选择与功能模块调用这三部分工作组织在一个循环结构
中便可。即 :

    DO WHI LE < 条件 >


  选单显示
  选单选择
  功能模块调用
ENDDO

    (2 ) 退出循环的两种方法
退出循环结构有多种处理方法 , 这里提供两种常用方法。并以光带式选单为例说明 :
① 设置永真循环。循环条件的取值恒为 .T ., 只有在 选单 中选择 返回 功能 ( k = 5 ) 后
才执行 EXIT 命令 , 使其跳出循环而转入结束处理。

    DO WHI LE .T .
选单显示

  MENU TO k
  IF k = 5
    EXI T
  ENDIF
  功能模块调用
ENDDO

    ② 在循环中使用识别器。当内存 变量 k 取值 为 5 时 , 表示 选择退 出 , 所以 可把 k 当
作一个识别器 , 只要其不等于 5 便继续循环过程。

    k = 1       & & 识别器置初值


・ 1 52 ・
DO WHI LE k < > 5
  选单显示
  MENU TO k
  功能模块调用
ENDDO

三、控制模块的设计
1 . 控制模块的一般结构
带选单的控制模块通常由五个部分 组成。 它们 是初始 化部 分、选单 显示、选单 选择、
功能模块调用以及结束部分。其结构形式如图 4 .8 所示。

图 4 .8   控制模块的一般结构

2 . 初始化部分
控制模块的初始化工作大致包括三个方面 :
(1 ) 对应用程序的有关说 明 , 例如 , 程序 名称、研 制单位 与研 制日 期等。 也就 是亮 出
应用程序的广告。例如 :

    M ODIF Y   COMMAND gg
T EXT

    欢  迎   使   用    
         
 × × 工 厂 设 备 管 理 系 统 
ENDT EXT
y = IN KEY( 1)
R ETUR N

    为能取得更好的视觉效果 , 还可设计活动字幕式广告。请看下面的例子 :

    M ODI TY COM MAND zmsgg


* * 活动字幕式广告示例 * *
* * 注∶本程序字符型变量 n 中的字符必须使用全角字符 * *
CLEAR
SE T TALK OF F
n=″
欢迎使用上海××工厂计算机设备管理系统   研制单位∶上海 XR 大 学 按 Esc 键开始执 行数
据库应用程序″
DO WHI LE .T .
  nl = LEN (n) + 40
  s = 1           & &   位置计数器置初值
  aa = SPACE (40) + n + SPACE (40)   & & 在原广告信息的两端各填补 20 个汉字位置的空格
  DO WHI LE ( s * 2) < nl

・ 1 53 ・
    @20 , 20 SAY SUBS( aa ,s * 2 + 1 , 40)   & & 一行显示 20 个汉字 , 每次向左移一个汉字
    s= s +1
    IF INKEY( .4) = 27   & &   按 Esc 键退出
      SE T TALK ON
      RE TURN
    ENDIF
  ENDDO
ENDDO

    程序执行时 , 从屏幕的 20 行 20 列起显 示一行 含有 20 个汉字 位置 的广 告信息 , 该 广


告信息是活动的 , 每次向 左移 去 一个 汉字 又同 时从 右 边移 进一 个汉 字 , 此 过程 能反 复 循
环 , 直到按 Esc 键后才退出。
(2 ) 设置运行状态。例如 , SE T TALK OFF , SE T SAFE T Y OFF 等。
(3 ) 运行程序所需的准备 工作。例 如 , 打开 有关库 文件、索 引文件 等 , 为 避免 因找 不
到欲打开的文件而出错 , 还可使用以下的程序对用户输入的文件名进行查找处理。

    M ODIF Y COM MAND wjcz


* * 文件查找 * *
ACCEPT ″
输入库文件名∶″TO s
s = ALLT RIM( s)
IF .NOT .FI LE (″&s . .dbf″)
  ?″无此库文件″
  s = INKEY (1 .5)
  CANCEL
ELSE
  USE &s
ENDIF
R ETUR N

    下面就上述各项工作组织一个专用的初始化模块 :

    M ODIF Y COM MAND csh


  * * 初始化 * *
SE T TALK OF F
CLEAR
DO gg
DO wjcz
R ETUR N

    3 . 结束部分
    在结束部分中也可安排三方面的工作 , 它们是 : 关 闭所 有打开 的文 件 , 恢复执 行前 的
系统状态 , 以及显示系统的结束语。如 “
, 再 见”、
“ 欢 迎再使 用”等。下 面列 出结束 退出 的
专用模块 :
・ 1 54 ・
    MODIF Y COMMA ND jstc
    * * 结束退出 * *
    CLEAR
    CLEAR ALL
    TEXT

再   见 !!
   
欢迎您下次再使用

    ENDTEXT
    SE T TALK ON
    RE TURN

    [ 例 4-26]   传统式选单控制模块示例。

    MODIF Y COMMA ND e4-26


    * * 传统式选单控制模块 * *
    DO csh
    q = ″1″                & & q 为识别器置初值为 1
    DO WHI LE q < > ″0″
      CLEAR
      DO e4-22 & & 传统式选单
      WAIT ″
请输入选择号 : (0—4) ″TO q WINDOW T IMEO UT 2
      DO e4-24 & & 用 CASE 命令实现功能调用
    ENDDO
    DO jstc

4 .4 .3   积木式 程序的装 配

    为帮助读者掌握积木式程序的装配技术 , 以下就装配的步骤与要求提几点建议。
一、按设计要求使功能模块各就各位
具体做法可按下列步骤进行 :
1 . 先编制应用程序的框架
例如 , 可先排出下面的命令序列 :

    DO 初始化
    DO WHI LE < 条件 >
      选单显示
      选单选择
      功能模块调用
    ENDDO
    DO 结束

    2 .在框架的基础上添加功能
    如果要在应用程序中实现口令检查 , 就要把口令检查模块插进去 , 插入位置根据预定
・ 1 55 ・
要求确定。例如 , 若需对用户使用该系统的权限进行检查 , 就可把它插在选单显示之前进
行,即:

    DO 初始化
    DO 口令检查
    DO WHI LE < 条件 >
        选单显示
        选单选择
        功能模块调用
    ENDDO
    DO 结束

但若只需检查用户是否具删除操作的权限 , 可把它插入功能调用模块的相应位置上。如 ,

    DO CASE
        :
      CASE k = 2
        DO 口令检查
        DO m2           & & 删除模块
        :
    ENDCASE

此时应用程序的框架可不必更动。类似地 , 若需对应用程序再增加其他的功能要求 , 则只
需先编好相应的功能模块 , 再把它安插在应用程序恰当的位置处便可。
    3 .细化框架使各功能模块就位
    把框架加细使其具 体化。 如确 定使 用哪 几个 功 能模 块 , 选择 循 环控 制的 条 件 等等。
在进行此项工作时要特别 防止 错配 , 如传 统式 选单 用 ME NU TO 命令 去激 活 , 或 者在 选
单中选择删除而实际执行的却是修改等。
二、删除各模块中的重复部分
    各模块的系统状态设置 ( 如 SE T T ALK OFF 等 ) 以及 打 开库 文件 等公 用的 内 容 , 一
般可安排在控制模块的初始化模块中 , 并在结束模块中恢复。这样 , 各功能模块中的相应
部分都可取消。然而专用于某一个功能的状态仍可保持在该功能模块内或者在调用该功
能之前再设置。
三、避免在接口与参数传递中发生差错
    装 配应 用程序 时 , 要防 止在 模块接 口与 参数传 递等 方面 发生差 错 , 尤须 注意 下列 几
点:
    1 .注意变量的作用范围与型值匹配
    由于存放选单功能选择号的变量都在控制 模块中 定义 , 所 以其值 能被 传递到 功能 调
用模块 e4-24 .prg 与 e4-25 .prg 之中。另 一方 面 , 由 WAIT 命令接 受的 变量 值 为字 符型 ,
所以在 e4-24 .prg 中的功能选择号都是 字符型 常量 , 而 用 ME NU TO 命令 所得的 变量 值
是各功能项在选单中的序号 , 它们都是数值 型 , 因 此 e4-25 .prg 中的功 能选 择号必 须转 换
为字符型后才可实现宏代换。除此以外 , 还须 注意返 回功 能的 选择号 在传 统式选 单中 一
・ 1 56 ・
般为“0”, 而在前述的光带式选单中却为“5”。
    2 .装配中要避免语法出错
    例如 , 不能把 DO WH ILE 命令与跳出循环的 EXIT 命令分 隔在两 个控制结 构之中 ,
否则运行时将产生语法错误。

4 .4 .4   一个典 型的积木 式程序

    由于实际问题的要求各式各样 , 解决的 办法也 非千 篇一 律 , 只 有勤 于实 践 , 在 实践 中


发现问题和解决问题 , 才能不断总结经验 , 增长才干。本节将通过一个简单例子说明积木
式程序的编制过程。
一、前提
    已按数据库应用程序的设计要求建立了如下程序模块 :
    1 .数据操作功能模块 : 修改 ( m1 .prg ) , 删除 ( m2 .prg) , 添加 ( m3 .prg ) , 查询 ( m4 .prg)
( 依次由前面的 xg .prg , sc .prg , tj .prg 与 sycx .prg 改写而成 ) 。
    2 .口令检 查模 块 : l1 .prg , l2 .prg( 由前 述的 口令检 查模 块 kl1 .prg 与 kl2 .prg 改写 而
成)。
    3 .初始化模块 : csh .prg。
    4 .结束退出模块 : jstc .prg。
    5 .选单显示模块 : gds .prg( 由前面的光带式选单 e4-23 .prg 改写而成 ) 。
    6 .功能调用模块 : gndy .prg( 由前面的通过宏代换实现调用的 e4-25 .prg 改写而成 ) 。
二、装配要求
    要求数据库应用程序具有修改、删除、添加 与查询 等四 项功能 , 通 过光 带式选 单实 现
功能选择。另外 , 还要求设置两级操作权限的检查功能 , 以便阻止未经同意的用户使用该
应用程序。
    [ 例 4-27]   一个简单的积木式程序。

    MODIF Y COMMA ND m1
    * * 修改指定的字段 * *
    PRIV k , p         & & 屏蔽上级同名的变量
    CLEAR
    ?″
修改结束按 Ct rl - W 存盘 , 按 Esc 键废弃″
    IN PU T ″输入库文件关键字序号∶″TO n1
    IN PU T ″输入待修改的字段序号∶″TO n2
    k = FI ELD( n1)
    p = FIELD(n2)
    BROWSE FIELDS & k , & p
    RE TURN

    MODIF Y COMMA ND m2
    * * 按指定条件删除记录 * *
    PRIV k , z, p
    @3 , 10 SAY ″输入关键字 (C 型)∶″GET k DEF AULT SPACE( 10 )

・ 1 57 ・
    READ
    k = ALLT RIM( k)
    l = F SIZE ( k)
    @5 , 10 SAY ″输入被删除的″+ k + ″
∶″  GET z DEF AULT SPACE ( l)
    READ
    DELE TE FOR & k = z
    L IST FOR & k = z
    WAIT ″
是删除带 * 的记录吗 ? ( Y/ N )″TO p W INDOW
    IF U P PE R( p) = ″
Y″
      PACK
    ELSE
      RECALL ALL
    ENDIF
    RE TURN

    MODIF Y COMMA ND m3
    * * 添加记录 * *
    ″记录添加结束后按 Ct rl - W 存盘″WINDOW T IMEO UT 2
    AP PEND
    RE TURN

    MODIF Y COMMA ND m4
    * * 索引查询 * *
    PRIV k , p
    CLEAR
    SE T SA FE TY OF F         & &   关闭系统保护
    @2 , 5 SAY″输入待查询的字段名 (C 型或 N 型 )∶″GET k DEFAUL T SPACE ( 10)
    READ
    k = ALLT RIM( k)
    l = F SIZE ( k)
    @3 , 5 SAY ″
查询的″+ k + ″的值∶″  GE T p DEF AULT SPACE ( l)
    READ
    INDEX ON & k TO IN
    IF TYPE (″& k″) < > ″
C″              & &   若待查询的字段不是字符型
      p = &p
    ENDIF
    SEEK p
    IF FO U ND( )
      DISP REST WHILE & k = p
    ENDIF
    y = IN KEY( 3)
    SE T SA FE TY ON         & &   恢复系统保护
    RE TURN

・ 1 58 ・
    MODIF Y COMMA ND l1
    * * 口令检查 * *
    PRIV k
    ?″
请输入您的口令∶″
    SE T CONSOLE OF F
    ACCE TO k
    SE T CONSOLE ON
    CLEAR
    IF k < > ″
abc″
      ?″
口令错 , 您不能进入本系统″
    ELSE
      ?″
欢迎您使用本系统″
    ENDIF
    RE TURN

    MODIF Y COMMA ND l2
    * * 用户口令由系统日期与系统时间动态构成 * *
    PRIV k
    d = STR ( DAY ( DATE ( ) ) , 2)
    t = SUBS( T IME ( ) , 1 , 2)
    ?″
请输入口令∶″
    SE T CONSOLE OF F
    ACCEPT TO k
    SE T CONSOLE ON
    IF k < > t + d
      ?″
口令错 , 您不能进入本系统″
      k = I NKEY (1)
      CANCEL
    ENDIF
    ?″
欢迎您使用本系统″
    RE TURN

    MODIF Y COMMA ND gg
    TEXT

欢 迎 使 用
       
××工厂设备管理系统

    ENDTEXT
    y = IN KEY( 1)
    RE TURN

    MODIF Y COMMA ND wjcz


    * * 文件查找 * *
    ACCEPT ″输入库文件名∶″TO s

・ 1 59 ・
    s = ALLT RIM( s)
    IF NOT FILE (″&s . .dbf″)
      ?″
无此库文件″
      s = I NKEY (1 .5)
      CANCEL
    ELSE
      U SE & s
    ENDIF
    RE TURN

    MODIF Y COMMA ND csh


    * * 初始化 * *
    SE T TALK OF F
    CLEAR
    DO gg
    DO wjcz
    RE TURN

    MODIF Y COMMA ND jstc


    * * 结束退出 * *
    CLEAR
    CLEAR ALL
    TEXT

再   见 !!
         
欢迎您下次再使用

    ENDTEXT
    SE T TALK ON
    CANCEL

    MODIF Y COMMA ND gds


    * * 光带式选单 * *
    ms1 = ″用于修改指定的字段″
    ms2 = ″按记录的关键字值删除″
    ms3 = ″向数据库添加记录″
    ms4 = ″按记录的关键字值索引查询″
    ms5 = ″结束运行″
    @3 , 10 PROM PT ′\ < 1 .修改′MESSAGE ms1
    @3 , 30 PROM PT ′\ < 2 .删除′MESSAGE ms2
    @4 , 10 PROM PT ′\ < 3 .添加′MESSAGE ms3
    @4 , 30 PROM PT ′\ < 4 .查询′MESSAGE ms4
    @5 , 20 PROM PT ′\ < 5 .返回′MESSAGE ms5
    RE TURN

    MODIF Y COMMA ND gndy

・ 1 60 ・
    * * 宏代换实现功能调用 * *
    IF k > = 1 AND k < 5
      IF k = 2
        DO l2     & &   口令检查
      ENDIF
      t = STR ( k , 1 )
      DO m & t
    ENDIF
    RE TURN

    下面写出用积木式方法装配后的数据库应用程序。

    MODIF Y COMMA ND e4-27


    * * 数据库应用程序举例 * *
    DO csh             & &   初始化
    DO l1 & &   进行口令检查
    k= 1 & &   识别器置初值
    DO WHI LE k < > 5
      CLEAR
      DO gds & &   显示光带式选单 , 光带在第一个功能项上
      MENU TO k & &   在光带式选单中选择功能
      DO gndy & &   用宏代换进行功能调用
    ENDDO
    DO jstc & &   结束退出

    注意到在光带式选单控制模块及各功能模块中反复地使用了变量 k 。开始 , k 的初值


是数值型 , 经调用某一功能模块如查询后 , k 又成为字符型。 于是再 一次执行 判断循环 条
件 k < > 5 时 , 就要产生类型不匹 配的 错误。为 此 , 在各 功能 模块中 使用 PRI VAT E 命 令
对其中有关变量进行屏蔽。

4 .5   应用程序的调试
4 .5 .1   调试的 目的与步 骤

一、调试的目的
    编好的程序难免有错 , 必须通过反复地检查改正 , 直至达到预定的设计要求后才能投
入使用。为发现程序中的错误 , 通常有下面两种做法 :
    1 .动态检查   通过在计算机上执行程序来发现其中的错误。
    2 .静态检查   用执行程序以外的办法。例如用阅读程序的方法来发现其中的错误。
    调试的目的就是 用 动态 检 查 的方 法 来 发 现 并纠 正 程 序 中 的错 误 , 保 证程 序 的 可 靠
运行。
二、调试的步骤
    数据库应用程序通常是既有控制模块又有 各种功 能模 块的多 模块 程序 , 调试 时可 按
・ 1 61 ・
下列步骤进行 :
    第一步 : 调试各功能模块 , 排除功能模块内部的各种错误。
    第二步 : 调试带选单的控制模块 , 着重考核 它是否 具有 显示选 单 , 按用 户的选 择完 成
指定功能的控制能力 , 以找出整个系统在结构上以及模块接口上所存在的问题。
    第三步 : 系统验收 , 即对照系统设计的预定要求 , 对所编制的应用程序进行考核验收。

4 .5 .2   调试技 术

一、程序中常见错误
    1 . 语法错误。系统对所要执行的命令都要进行语法检查 , 若有 不符合语 法规定就 提
示产生了语法错误。例如 , 命令字拼写错、命令格式写错等。
    2 . 逻辑错误。命令符合语法规定 , 但因操作条件不具备或者操 作内容与 预设要求 不
符等原因而造成的错误称为逻辑错误。例如 , 使用 了未定 义的 变量、数 据类型 不匹 配、操
作的文件不存在等。
    3 . 系统错误。例如 , 文件打开太多、嵌套层数超过规定的允许范围等。
二、常用的调试技术
    1 . 设置断点与跟踪运行进程
    在程序中设置断点 , 使它在预定的地方自动中止运行 , 以便对程序的执行情况划段进
行观察与分析。如果划段观察仍未找到出错的部位 , 还可逐条跟踪程序的运行进程。
    2 . 调试资料的汇集与分析
    在 程 序 的 适 当 处 临 时 增 设 输 出 命 令 , 输 出 某 些 变 量 的 中 间 结 果。 还 可 使 用 SE T
TALK ON , D ISP ME MORY, DISP STA T US 等 命令来 得到 更多的 运行 信息 以帮 助判 断
问题所在。
    3 . 设置错误陷阱
    错误陷阱用于捕捉可能发生的错误 , 并在 错误发 生后 中断 程序的 正常 运行转 而执 行
预先编制的处理程序 , 处理 完毕 , 再返 回被 中断 处继 续 执行。 利用 FoxP ro 所提 供的 ON
ER ROR 命令与两个函数 ERROR( ) 和 M ESSAGE ( ) 就能 使陷 阱技 术 得以 实现。 具体 例
子见第十章。
    4 . 减少调试开销
    为了提高调试的效率 , 可在运行程序时将已经查明没有错误的命令暂时变成注释行 ,
也可把整段的命令组织在一个永假循环之中 , 即 :
    DO WHI LE .F .
    < 程序命令段 >
    ENDDO

调试时就可跳过这个程序命令段不予执行 , 避免了重复调试。
    不言而喻 , 上面介绍的方法需在实际调试过程中根据具体情况选择使用。

4 .5 .3   调试窗 口与跟踪 窗口

    FoxP ro 有两个 有效 的 程序 调 试工 具 : 调试 窗 口 ( Debug Window ) 与 跟踪 窗 口 ( Trace


・ 1 62 ・
Window ) 。
一、调试窗口
    在调试窗口中可指定若干个表达式 , 程序执行时 , 在窗口中可观察到这些表达式值的
变化情况 , 由此帮助找出问题并进行改正。
    1 . 调试窗口的激活
    (1 ) 在 SE T DEBU G ON 状态下 , 在 Program 选单中选择 Debug。
    (2 ) 在命令窗口中执行 ACTIVA T E WI NDOW DEBUG 命令。
    调试窗口形式见图 4 .9( a) 。

图 4 .9   调试窗口与跟踪窗口

    2 . 调试窗口的使用
    (1 ) 指定检测对象
    用 T ab 键或鼠标器可将光标移到调试窗 口的左半 部 , 然 后逐个 输入待 检测的 函数 与
表达式 , 一个表达式占一行。但总数不能超过 16 个 , 在所 输入 的表达 式中 不可使 用宏 代
换函数。
    程序执行时 , 这些表达式的值将在调试窗口右半部的相应位置显示。
    (2 ) 设置程序断点
    在调试窗口中可就 某个 变量 或表 达 式设 置一 个程 序断 点。程 序断 点 通常 带一 个 条
件 , 当条件取值为真或指定的表达式值更改时 , 程序便暂停执行 并在屏 幕上显示“Do Sus-
pended”, 如同执行 SUSP ENDED 命 令 一 样。此 时 便 可 进 行各 种 处 理 , 处 理 结 束 后 选 择
Program 选单中的 Resume 或 Cancel 命令恢复或 终止程 序的 执行。程 序断 点形如 一圆 形
按钮 , 其设置方法如下 :
    ① 用 Tab 键将光标移到调试窗口中间的分隔条上 , 再用↑与↓键将光标移到断点 所
在行的位置上。最后按空格键指定。
    ② 将鼠标指针指向断点所在处的分隔条上再单击鼠标的左按钮。
    注 : 若把光标移到此圆形按钮上 , 再按空格键或单击鼠标左按钮 , 则此断点被删除。
二、跟踪窗口
    由于当前被执行的程序行会以高亮度显示 , 所以 在跟 踪窗 口中可 以观 察到程 序的 执
行过程。与上面类似 , 在跟踪窗口中的指定程序行上同样可以设置断点。
    1 . 跟踪窗口的激活
・ 1 63 ・
    跟踪窗口形式见图 4 .9( b) , 它可以用以下任何一种方法激活 :
    (1 ) 在 SE T DEBU G ON 状态下 , 在 Program 选单中选择 Trace。
    (2 ) 在命令窗口中执行 ACTIVA T E WI NDOW T RACE 命令。
    (3 ) 在命令窗口中执行 SE T ST EP ON 命令。
    (4 ) 在命令窗口中执行 SE T ECHO ON 命令。
    2 . 跟踪窗口的选单
    跟踪窗口具有专用的窗口选单 , 其常用的选项如下。
    (1 ) Program
    Program 还有一个下拉选单 , 其中有下列选择功能 :
    Open 用于指定一个文件在跟踪窗口中打开 ;
    Cancel 可终止一个中断的程序文件的执行 ;
    Line Numbers 在各程序行的左侧显示其行号 ;
    Trace Between Breaks 指示程序中被执行的每一程序行都显示出来并高亮度表示 ;
    Throt tle . . . 在随之出现的 EXECU TION T HRO T T LE 对话 框中 可设 定 各程 序行 被
执行时所要停留的秒数 , 其默认值为 0。
    (2 ) Do . . /. Resume
    执行在跟踪窗口中已打开 的程 序 文件。若 窗 口中 还未 打开 文件 , 则 Do 对话 框将 要
求用户指定。选择一次 Do 后 , 该选单选项变成 Resume, 选中后能继续执行中断的程序。
    (3 ) Ou t
    若所执行的程序行是调用一个子程序 , 选 中 Out 后将 暂时 中断当 前执 行的程 序而 将
跟踪移入被调用的子程序中继续运行。
    (4 ) Over
    继续跟踪执行的程序行 , 但不进入被调用的子程序中继续跟踪。
    (5 ) Step
    控制一次只执行一行程序。
    [ 例 4-28]   调用窗口与跟踪窗口的使用示例。

    MODIF Y COMMA ND e4-29           M ODIF Y COM MAND   area


    SE T TALK OF F PARAMET ERS R
    CLEAR s = 3 .1416 * R * R
    STOR E 0 TO i ,s R ETU RN s
    DO WHI LE i < 100
     i=i+1
      s = s + area ( i )
      ?″
s [″+ ST R( i , 3 ) + ″] = ″, s
    ENDDO
    SE T TALK ON

    e4-29 .prg 用以计算 100 个半径依次递增的圆面积的累加值 , 若在调试窗口分别设 置


两个断点 i > 3 与 i = 10 , 便可观察程序执行的变化过程。
・ 1 64 ・
    程序执行时先后在 i = 4 及 i = 10 的两处中 断 , 并 分别 在调 试窗口 的右 半部显 示下 面
结果 :


4 10
43.9824 895 .3560
        . T. .T .
.F. .T .

习   题
    1 .   读程序 , 写出运行结果。
    (1 )   TYPE ex1 .prg                       TYPE pp .prg
SET TALK OFF PARAMET ER x , y
a=3 CL EAR
b= 5 s= x * y
DO pp WI TH 2 * a , b ?″
s = ″+ ST R( s, 3 )
SET TALK ON RE TUR N
RET URN
    (2 )   TYPE ex2 .prg                       TYPE sub .prg
P UBL IC a P UBLIC b
SET TALK OFF PRIV AT E c
a=1 a = a+ 1
c= 5 b= 2
DO sub c=3
?″ex2 中∶a , b , c, d″, a , b , c, d d= 4
SET TALK ON ?″
sub 中∶a, b , c, d″, a , b , c, d
RET URN RE TUR N

    2 . 按下列要求编制程序。
    (1 ) 已建立 了一个日 销售文 件 ( 营业员 代号、品名、数量、单价、营 业额 ) , 每一笔营 业
构成一个记录 , 但其中营业额字段的值都不填写 , 而成 0 .00 , 编制能 查询某个 营业员全 天
营业额的程序。
    (2 ) 学生成绩数据库文件 ST UD .DBF 中有学号 ( C , 6 ) 、姓名 ( C , 6 ) 、数学 ( N , 3) 、语 文
( N, 3 ) 、外语 ( N , 3) 与平均 ( N, 5 , 1 ) 等 6 个字段和若干个记录 , 其中平均字段值为 0 .0 0 , 就
下列各要求分别编制程序。
    ① 查找指定学号的学生 , 若查到则显示其数学及所属等级 ( 优 : 90~ 100 , 良 : 76 ~89 ,
及格 : 60~75 , 不及格 : 60 以下 ) , 若找不到 , 则显示“无此学号”。
    ② 打印出如下形式的成绩统计表。
・ 1 65 ・
姓名 数学 语文 外语 平均
张小红 76 83 78 79

… … … … …
吴杰中 68 92 84 81 .3
平均 ×× ×× ×× ××

表格中最后一行应填写上各门课程的平均成绩。
    3 . 按下列计算要求编制自定义函数或子程序。
    (1 )   求 f( n) = 1 + 2 + … + n
n m !
    (2 )   求组合数   cm =
n ! ( m - n) !
    (3 )   求 x 的绝对值。
    4 . 按下列要求编制数据库应用程序。
    ( 1 ) 通讯 录数据 库文件包 含了姓 名、地 址、邮政编码 与电话 等四个字 段 , 试编制一 个
通讯录管理程序 , 它具有添加、查询、删除、修改等四项功能。
    (2 ) 就库文件 hd .dbf 编制应用程序 , 它具有如下功能 :
      ① 能以货号、单价与开单日期作关键字进行查询 ;
      ② 对指定品名的数量进行汇总 ;
      ③ 进入应用程序后立即进行口令检查 ;
      ④ 使用光带式全屏幕选单。
5 . 思考题
    (1 ) FoxPro 程序有哪几种控制结构 , 这几种控制结构的程序应如何组织 ?
    (2 ) 列举几种 FoxPro 应用程序中常用的循环结构模式 ?
    (3 )   何谓模块化 ? 如何进行模块化 ?
    (4 )   模块化程序设计有何优点 ?
    (5 )   程序的功能模块与控制模块有何区别 , 说明控制程序的一般结构。
    (6 )   如何编制光带式全屏幕选单 , 它有什么优点 ?
    (7 )   如何装配一个积木式程序 , 其间要注意哪些问题 ?
    (8 )   动态检查与静态检查的主要区别何在 ?
    (9 )   调试的目的与任务是什么 ?
    (10) 应用程序的常用调试方法有哪些 ? 你在调试过程中有哪些体会 ?

・ 1 66 ・
第五章   窗 口 设 计

    Windows 具 有图 形用 户 界面 , 窗 口中 含 有按 钮、滚动 列 表等 各种 控制 对象 , 屏幕 美
观 , 操作方便。用 Fox Pro for Windows 来开 发 软件 , 能 使应 用 软件 也具 有 Windows 风 格
的用户界面。本章主要介绍与窗口设计有关 的命令 , 并 讨论窗 口着 色等 特性。BROWSE
命令是 FoxP ro 最有用的命令之一 , 本章将讨论使用该命令定义数据编辑窗的方法。

5 .1   窗口操作命令

5 .1 .1   窗口定 义与修改

    Fox Pro 允许用户建立具有 Windows 风 格的窗 口。这 种窗 口包含 静态 和动态 两类 属


性 , 静态属性包括窗口的名字、位 置、边界、标题、使 用字 体、图 标、壁纸 和颜 色 , 动 态属 性
包括窗口的关闭、移动、改变大小、最小化、最大化等功能。
一、窗口定义命令
命令格式 :

    DEFI NE WINDOW < 窗口名 1 > FROM < 行坐标 1 , 列坐标 1 >
TO < 行坐标 2 , 列坐标 2 > | AT < 行坐标 3 , 列坐标 3 > SIZE < 行数 , 列数 >
[ IN [ W INDOW ] < 窗口名 2 > | IN SCR EEN | IN DESKTOP ]
[ FO NT < 字符表达式 1 > [ , < 数值表达式 1 > ] ] [ STYLE < 字符表达式 2 > ]
[ TI T LE < 字符表达式 3 > ] [ HALF HE IGHT ] [ DO UBLE | PANEL | NONE | SYSTEM]
[CLOSE | NOCLOSE ] [ FLOAT | NOFLOAT ] [ GROW | NOGROW ]
[ MINI MIZE ] [ ZOOM | NOZOOM]
[ ICON F ILE < .ico 文件名 > ] [ FILL FI LE < .bmp 文件名 > ]
[COLOR SCHEME < 数值表达式 2 > | COLOR < 颜色对表 > ]

    功能 : 建立一个窗口并且指出它的属性。
说明 :
(1 ) 窗口名和窗口位置
WINDOW 子句的 < 窗口名 1 > 指出 要建立 的窗 口的名 字。窗 口名必 须 是由 字母 或
下划线开头的字母、数字与下划线的组合 , 最多 10 个字符长。
F ROM . . .TO 子句的 < 行坐 标 1 , 列坐 标 1 > 指出 窗口左 上角的位 置 , < 行坐 标 2 ,
列坐标 2 > 为窗口右下角的位置 , 这两个位置表示了窗口的大小。
定义最简单的窗口只要指出窗口名和窗口位置 , 例如命令

    DEFI NE WINDOW w1 F RO M 10 , 1 TO 20 , 20

定义了窗口 w1 , 它是一个矩形区 , 左上角是第 10 行第 1 列 , 右下角为第 20 行第 20 列。


・ 1 67 ・
定义好的窗口并不马上看到 , 通过执行激活或显示窗口的命令才 能显示出 来。如果要 激
活刚才定义的窗口 w1 , 可键入命令 ACTI VA T E WINDOW w1。
AT . . .SIZE 子句提供了定义窗口位置 与大 小的 另 一方 法。 < 行坐 标 3 , 列 坐标 3 >
指定窗口左上角的位置 , < 行 数 , 列数 > 分别 指定 窗 口中 行和 列的 数目。 必须 注 意 , 用
这种方法定义的窗口 , 其大 小将 受 该窗 口所 用字 体的 影 响。窗口 中 行高 为字 体 的 高度 ,
列宽为字体中字母的平均宽度。
(2 ) 窗口标题栏
TIT LE 子句的 < 字符表达 式 3 > 指 定窗 口 的标 题 , 标 题 将在 窗 口 标题 栏 里自 动 居
中。窗口标题的意义不同于前面提到的窗口名 , 窗口标 题用于屏 幕显示 , 而窗 口名是 编
程时使用的窗口标识。例如命令

    DEFI NE WINDOW w1 F RO M 10 , 1 TO 20 , 20 T I TLE ″win1″

定义了窗口 w1 , 屏幕显示时窗口的标题是 win1。


标题栏的高度分为半高和全高两种形式。若定义命 令中不 含 SYST EM 或 FONT 子
句 , 所建立的窗口的标题栏为 半高形 式 , 例如 上例定 义的 窗口 w1 , 其标题 栏 高度 默认 为
半高形式 ; 可使用 HALF HEIGH T 子句显式地指定标题栏为半高形式。
(3 ) 窗口边界
Fox Pro 缺省的窗口边界为单线边界。
DOUBLE , PANE L, SYST EM 子 句 都 可 用 来 产 生 宽 条 边 界。SYS TE M 子 句 略 有 不
同 , 它既取宽条边界 , 又使窗口标题栏取全高形式。命令

    DEFI NE WINDOW w1 F RO M 10 , 1 TO 20 , 20 SYST EM

定义了具有宽条边界、全高标题栏的窗口 W1 。
NONE 子句表示不产生窗口边界 , 这种无边界的窗口一般需要配色以与周围环境 区
分。
(4 ) 窗口的动态属性
窗口的关闭、移 动、改 变 大 小、最 小 化、最大 化 等 动 态 属 性 分 别 用 CLOSE , FLOAT ,
GROW , M IN I MIZE , ZOOM 等子句来定义。
使用 CLOSE 子句将会在窗口左上角 产生一 个控 制选 单框 , 且在 控制 选单框 的弹 出
式选单中产生用来关闭窗口的“关闭”选项及其快捷键 Ct rl + F4 , 此外还允许用 Fox Pro 的
File 选单的 Close 选项来关闭窗口。但须注意 , 关闭窗口 不仅将 它从屏幕 上清除 掉 , 并 在
内存中删去了它的定义。NOCLOSE 和省略 CLOSE 起同样作用 , 即禁止关闭窗口。
FLOAT 子 句 允 许 窗 口 移 动 , 用 户 便 可 用 鼠 标 拖 曳 窗 口 标 题 栏 来 移 动 窗 口。
NOFLOAT 和省略 FLOAT 起同样作用 , 即禁止移动窗口。
GROW 子句允许窗口改变大小 , 用户 便可用 鼠标 拖 动窗 口边 界使 窗口 放 大或 缩小。
NOGROW 和省略 GROW 起同样作用 , 即禁止改变窗口大小。
M I NI MIZE 子句支持在 窗 口右 上 角 产 生 最小 化 按 钮 , 选定 该 按 钮 窗 口将 缩 小 为 图
标。
ZOOM 子句支持在窗口右上角产生最大化按钮 , 选定该按钮窗口 将扩展 到和 FoxPro
・ 1 68 ・
主窗口一样大。NOZOOM 和省略 ZOOM 起同样作用 , 即禁止窗口最大化。
[ 例 5-1]   建立一个可以修改当天日期的窗口。

    * e5- 1 .prg
DEFI NE WINDOW jtrq FROM 1 , 1 TO 5 , 30 TI T LE ′
今天日期′;
    CLOSE FLOAT MI NIMIZE SYSTEM
AC T IVATE W INDOW jtrq                                   & & 窗口 JT RQ 成为活动窗口
@1 , 6 SAY VAL ( DTOS( DATE ( ) ) ) PICT UR E ′
9999 年 99 月 99 日′  & & 数据输出到活动窗口

    程序中定义了具有 全 高标 题 栏的 窗 口 , 并 且 可关 闭、可 移 动、可 最小 化。 运行 后 在


Fox Pro 主窗口左上方出现如图 5 .1 所示 的“ 今天 日期”窗 口。函数 DTOS 将 日期 转换 为
具有 YYYYMMDD 形式的字符串。
这里设计的窗口属于信息输出类型 , 使用时 比 WAIT WINDOW 命令的 提示窗口 灵
活。应该注意 , 某窗口成为活动窗口后 , 数据输 入输 出均 可在其 中进 行 , 设计一 个数 据
输入窗口并不困难 ( 参阅例 5-5) 。
(5 ) 多级窗口
系统默认 所 定 义的 窗 口落 在 Fox Pro 主 窗
口中 , 但是也允许将窗口 定义在另一已建 立的
窗口中 或 Windows 的 桌 面 上。 如 果 一 个 窗 口
定义在某 窗 口中 , 可将 前 者称 为 子 窗口 , 后 者
称为父窗口。 图 5 .1   显示当天日期的窗口
命令 格 式 中的 I N 子 句 用 来指 定 父 窗 口。
< 窗口 名 2 > 表 示 已经 存 在 的 父 窗口 的 名 字 ; SCREE N 表示 父 窗 口 是 Fox Pro 主 窗 口 ;
DESK TOP 表示父窗口是桌面。注意 SCREE N 和 DESKT OP 都是专用名词 , 不可缩写为
前四个字符。
[ 例 5-2]   设计一个程序 , 可参考部门代码表来修改设备表中的部门。

    * e5-2 .prg
CLEAR
DEFI NE WINDOW bmdm FROM 1 , 1 TO 10 , 30 T IT LE   ″部门代码″  CLOSE FLOAT GROW
DEFI NE WINDOW   sb FROM 1 , 16 TO 10 , 45   T I TLE ″设备表″I N bmdm ;
    CLOSE FLOAT GROW   & & 窗口 SB 的父窗口是 BMDM , 子窗口位置允许超出父窗口范围
AC T IVATE W INDOW bm dm & & 激活窗口 BMDM, 该窗口成为活动窗口
USE bmdm
LIST OF F & & BMDM .DBF 的内容显示在活动窗口中
AC T IVATE W INDOW sb
USE sb
BROWSE FI ELDS 编号 , 名称 , 部门 & & 浏览窗口成为活动窗口 , 其父窗口是窗口 SB

    程 序 运 行 后 屏 幕 显 示 如 图 5 .2 所 示 , 该 程 序 使 FoxP ro 主 窗 口 , BMDM, SB 和
BROW SE 等四个窗口依次成为父子关系。其中 BMDM 和 SB 两个窗 口是 用窗口 定义 命
令显式定义的 ; FoxPro 主窗口作为 BMDM 窗口 的父 窗口 是系统 默认 的 ; 值得注 意的 是
・ 1 69 ・
执行 BROWSE 命令后会弹出一个浏览窗口 , 当时的活动窗口 SB 就成为它的父窗口。
本程序未设置关闭窗口命 令。程 序执 行后 , 读者 可以 从 BROWSE 窗 口开 始 , 利 用
控制选单框依次关闭各级窗口 , 以加深对多级窗口父子关系的认识。

图 5 .2   多窗口示例

(6 ) 字体、字体大小与字形
Fox Pro 文档规定的系统 默认 字体 为“ FoxFon t”, 大小 为 10 点。 交 互操 作 时可 通 过
Text 选单的 FON T 选项来选择字体 , 但在程 序中将 使用 含有 FON T 子句 的命令 来选 择
字体。FON T 子句的 < 字符表达式 1 > 指定窗口所用字体 ; < 数值表达 式 1 > 表示所用 字
体的大小 , 以点数来计算字体的大小。例如 :

    DEFI NE WINDOW w1 F RO M 5 , 5 TO 15 , 15 TI TL E ′w1′FO NT ′宋体′, 12


? WF ONT (1 ,′ w1′)       & & 返回字体“宋体”, 大小 12 点
w1′) , WFO NT (2 ,′

    WFON T 函数有两个参数 , 第二个参数指出窗口名 , 第一个参数取值可为 1 , 2 , 3 , 分


别表示返回指定窗口的字体名、字体大小、字形。
STY LE 子句的 < 字符表达式 2 > 指定窗口所用字体的字形 , 例如命令

    DEFI NE WINDOW w1 F RO M 5 , 5 TO 15 , 15 TI TL E ′w1′STYLE ′iu′

定义了窗口 w1 , 它使用默认字体 , 字形为有下划线的斜体字。表 5 .1 列出了 ST YL E 字


形代 码表 , 该表字符的有效性取决于 Windows , 故而有时某些字符会不起作用。

表 5 .1   字形代码表

字 形 黑体 斜体 标准 轮廓 不透明 阴影 打印 透明 下划线

字 符 B I N O Q S - T U

    (7 ) 窗口图标与壁纸
ICON F IL E 子句用来定义窗口最小化时显示的图标 , 其中的 < .ico 文件名 > 表明图
标的图形文件必须是 .ICO 文件。为保证窗口能进行最小化操作 , 命令中还须含有 M IN-
I MIZE 子句。系统默认的窗口最小化图标是狐狸头。
F IL L FILE 子句用 来定义 窗口壁纸 , 其 中的 < .bmp 文件 名 > 用 来指出组 成壁纸 的
位图。
・ 1 70 ・
例如命令

    DEFI NE WINDOW w1 F RO M 1 , 1 TO 10 , 30 TI TL E ′w1′ICON FILE ;


 ′
c∶ \ foxprow \ t utorial \ region .i co′MI NIMIZE FILL FI LE ′
c∶ \ windows \ cars .bmp′

表示了窗口最小化后的图标呈地球形 , 窗口背景由轿车组成。
读者不必为寻找图形 文件 烦心 , 只 要 利用 Windows 文 件管 理器 的 File 选 单搜 索 功
能 , 按所需的扩展名来搜索 , 很快就能看到许多图形文件名及其路径。
(8 ) 颜色
COLOR SCHE ME 子句和 COLOR 子句分别用来指定颜色模式及其颜色 , 详见 第 5 .
2 节。
二、窗口修改命令
命令格式 :

    M ODIF Y WINDOW < 窗口名 > | SCREEN

    功能 : 修改一个已定义的窗口或 FoxPro 主窗口的属性。


窗口修改命令和窗口定义命令的属性子 句仅有 如下 差别 : 前 者没有 IN 子句 但增 加
了关键字 SCREE N。为减少重复 , 以上命令格式中没有列出相同的子句。
只要定义的窗口尚未关闭 , 它的 属性 就能修 改。WI NDOW 子 句中 的 < 窗口 名 > 用
来指出要修改的窗口名。在修改窗口命令中只需指定窗口名和有改变 的属性子 句 , 假 如
曾用下述命令定义了窗口 W1 ,

    DEFI NE WINDOW w1 F RO M 1 , 1 TO 10 , 30 T I TLE   ′w1′CLOSE FLOAT MI NIMIZE

那 么 在 它 未 被 关 闭 时 , 命 令“ MOD IFY WI NDOW w1   TIT L E   ′WI NDOW1′


NOFLOAT”可把窗口标题改 成 WINDOW1 并 禁止 窗口 移动 , 而 CLOSE , M IN I MIZE 等
其他属性保留不变。
窗口修改 命 令 中的 名 字 SCREE N 表 示 Fox Pro 主 窗 口 , 该 窗口 的 属 性可 以 直 接 修
改 , 例如 :

    M ODIF Y WINDOW SCREEN NOMINIMIZE   & & FoxPro 主窗口最小化按钮被取消


M ODIF Y WINDOW SCREEN & & 恢复 FoxPro 主窗口所有属性

5 .1 .2   窗口管 理

在多窗口环境里 , 窗口可分为输出窗口和可见窗口两类。任何 时刻只可 能有一个 输


出窗口 , 它可用于数据输入输出 , 但不一定显示在屏幕上 ; 可见窗口 只表示窗 口可以显 示
出来 , 但不一定允许数据输入输出。既可输 出又 可见的 窗口 称为 活动窗 口。为确 定窗 口
的输出和可见特性 , 就需要了解激活、隐藏、显示、挂起、关闭等关于窗口管理的命令。
一、窗口激活命令
命令格式 :

    AC T IVATE W INDOW [ < 窗口名 1 > [ , < 窗口名 2 > . . .] ] | ALL


・ 1 71 ・
[ IN [ W INDOW ] < 窗口名 N > | SCREEN ] [ BOT TO M | TOP | SA ME ] [ NOSHOW]

    功能 : 激活若干个用户定义窗口或 FoxPro 的系统窗口。


说明 :
(1 ) < 窗口名 1 > [ , < 窗口名 2 > . . .] 表示要激 活的窗口 的名字 ; AL L 表示所有 已
定义的窗口都被激活。不管用一条命令还是多条 命令 激活 多少个 窗口 , 系 统规定 仅最 后
激活的一个窗口为活动窗口。
允许激活的 FoxP ro 系统的窗 口包括 : Filer, Calculator , Calendar/ Diary , Command, De-
bug , Trace , View 等。用户窗口需 先定 义后 激 活 , 但系 统所 属 窗口 已预 先定 义 , 所 以可 直
接激活 , 例如命令

    AC T IVATE W INDOW CALENDAR

激活了台历日记本。由于 Calendar/ Diary 包含 两个单 词 , Fox Pro 规定 若取 其前一 单词 来


表示则须将它大写。
Fox Pro 主窗口是系统默认的活动窗 口 , 也可 用命 令 ACTIVA TE SCRE EN 将 它激 活
为活动窗口。
(2 ) 激活若干窗口后 , 系统中就会产生一个反序的窗口序列 , 即 序列中最 前的窗口 是
最后激活的窗口。
下面两条命令先后激活计算器和文本编辑窗口 :

    AC T IVATE W INDOW   calculator


M ODI COM M   wj1 .txt

    此时文本编辑窗口是活动窗口 , 但用鼠标单击某窗口便能进 行窗口切 换。该例表 明


在文本编辑时提供了一个计算器。
BOT TOM 子句表示把激活 的窗 口 放 到序 列 最后 , SAME 子句 使 活 动窗 口 在序 列 中
位置保持不变 , 执行下述三条命令便可了解这两个子句的作用。

    AC T IVATE W INDOW calculator   & & 激活计算器


AC T IVATE W INDOW CALENDAR BOTTOM ;
& & 台历日记本放到窗口序列的最后 , 故计算器将保持为活动窗口
AC T IVATE W INDOW CALENDAR SAME ;
& & 再次激活台历日记本 , 并使它在窗口序列中位置不变 , 计算器仍是活动窗口

    TOP 子句把激活的窗口放到窗口序列的最前 , 这是系统默认状态。


(3 ) NOSHOW 子句令激活的窗口成为不可见。
( 4) IN 子句的 < 窗口名 N > 或 SCREE N 用来指定被激活窗口的父窗口 , 并允许重新
指定父窗口。例 如先前定 义了窗 口 W2 的 父窗口为 W1 , 激活 W2 时 可以指定 它的父 窗
口为 SCREE N。
二、窗口隐藏命令
命令格式 :

    H IDE WINDOW [ < 窗口名 1 > [ , < 窗口名 2 > ] . . .] | ALL


・ 1 72 ・
[ IN [ W INDOW ] < 窗口名 N > | I N [ WINDOW] SCR EEN ] [ BOT TO M | TO P | SA ME ]

    功能 : 隐藏若干个已激活的用户定义窗口或 FoxPro 系统窗口。


隐藏窗口是将激活的窗口设置 为不可 见 , 但这 些窗口 仍为 激活状 态 , 也 不改 变输 出
性质。例如活动窗口被隐藏后它仍是输出窗口。
执行下述命令序列可使命令窗口被隐藏起来 :

    H IDE WI NDOW Command       & &   隐藏 COM MAND 窗口


WAI T

三、窗口显示命令
命令格式 :

    SHOW WINDOW < 窗口名 1 > [ , < 窗口名 2 > . . .] | ALL


[ IN [ W INDOW ] < 窗口名 N > | IN SCR EEN] [ REFR ESH ] [ TOP | BOT TOM | SAME ]

    功能 : 显示若干用户定义窗口和 FoxPro 系统窗口。


窗口显示命令强制窗口显示 , 它可能在如下情况中使用 :
(1 ) 窗口定义后未激活前需要显示 ;
(2 ) 窗口激活命令中用了 NOSHOW 子句 , 但后来需要显示 ;
(3 ) 将隐藏的窗口恢复成可见。
必须注意 , 不管在何种情况下显示都不 会改 变窗口 的激 活状 态。从命 令格式 还可 看
出该命令能够显示多个窗口 , 并且显示先后次序可以控制。
命令中的 RE FRESH 子句适用于网络环境 , 它能对浏览窗口进行刷新。
四、窗口挂起命令
命令格式 :

    DEACT IVAT E WI NDOW < 窗口名 1 > [ , < 窗口名 2 > . . .] | ALL

    功能 : 挂起若干用户定义窗口和 FoxPro 系统窗口。


窗口挂起的含义是 : 窗 口变 成不 可见 且不 可 输出 , 以 前输 出到 窗 口 的内 容 也将 被 清
除 , 但是它在内存中的定义仍然存在。某窗口被挂起后 , 窗口序列中位于该窗口之后的一
个窗口将成为活动窗口。
五、窗口关闭命令
关闭用户定义的窗口就是把它从屏幕上 清除 , 并且 删除 它在 内存中 的定 义。用户 窗
口一旦关闭就不再存在 , 除非重新定义。窗口关闭命令有以下三种。
1 . REL EASE WINDOWS [ < 窗口名表 > ]
用于关闭在 < 窗口名表 > 中指定 的用 户定 义窗口 和 FoxPro 系 统窗 口。缺省 < 窗 口
名表 > 表示关闭活动的用户定义窗口。
2 . CLEAR WINDOWS
关闭所有用户定义的窗口。
3 . CLEAR ALL
关闭所有用户定义的窗口和选 单 , 该 命令 还有 使系统 回到 初始状 态的 作 用 , 即关 闭
・ 1 73 ・
所有库文件、清除所有内存变量 , 并将当前工作区设置为第一工作区。
在用户程序运行时 , 不希望在 Foxpro 主屏幕上出 现系统 的命令窗 口。前已 提到 , 命
令 H IDE WI NDOW Command 能够隐藏命令窗口 , 命令 RE LEASE WI NDOWS Command
能够关闭命令窗口。但是 , 关闭命令窗口最有效的办法是在程序中 将能关闭 它的快捷 键
Ctrl + F4 送入键盘缓冲区。请看下例 :
[ 例 5-3]   在用户程序中关闭命令窗口示例。

    * e5-3 .prg
CLEAR
KEYBOARD ′
{Ctrl + F4}′                        & & 关闭命令窗口
@5 , 5 SAY ′x = ′GE T x DEFAULT S PAC(2 ) & & 用户程序主体
R EAD
AC T IVATE W INDOW COMMAND & & 程序执行结束时激活命令窗口

    KE YBOARD 命令的功能是向键盘缓冲区装入一 个字 符串 , 执行 命令 时该字 符串 犹


如从键盘键入一样立即起 作用。 命令“ K EYBOARD ′{Ct rl + F4}′
”将 向键 盘 缓冲 区装 入
关闭命令窗口所需要的控制字符 Ct rl + F4。
表 5 .2 概括了各种窗口管理命令与窗口输出和可见特性的关系。

表 5 .2   输出窗口和可见窗口管理

命令种类 窗口有定义 窗口可输出 窗口可见

定义窗口 Y N N

激活窗口 保持 Y Y

隐藏窗口 保持 可能 Y N

显示窗口 保持 可能 Y Y

挂起窗口 保持 N N

关闭窗口 N N N

5 .1 .3   建立窗 口的控制 对象

Fox Pro 支持在窗口中定义文本编辑区 ( Tex t Edit Regions ) 、复选框 (Check Boxes) 、不


可见按钮 ( Invisible Buttons) 、滚 动列 表 ( Lists) 、弹出 控 制 ( Popups ) 、下推 按 钮 ( Push But-
tons , 简称按钮 ) 、单选按钮 ( Radio Bu ttons) 、数码器 ( Spinners) 等 控制对象 , 以 方便人机 交
互。这些对象都可用 @ 命令来定义 , 其中文本编辑区使用是 @ . . . EDIT 命令 , 其余均使
用 @ . . . GE T 命令 , 激活仍使用 READ 命令。由于使用屏幕构造器 ( 参阅第六章 ) 能够方
便地定义各种控制对象 , 所以这里只介绍文本编辑区和下推按钮的定义方法。
一、建立文本编辑区
命令格式 :

    @ < 行坐标 , 列坐标 > EDI T < 内存变量 > | < 字段 >
・ 1 74 ・
SIZE < 数值表达式 1 > , < 数值表达式 2 > [ , < 数值表达式 3 > ]
[ F U NCT ION < 字符表达式 1 > ]
[ FO NT < 字符表达式 2 > [ , < 数值表达式 4 > ] ] [ STYLE < 字符表达式 3 > ]
[ DEFAULT < 表达式 > ] [ ENABLE | DISABLE ] [ MESSAGE < 字符表达式 4 > ]
[ VAL ID < 逻辑表达式 1 > | < 数值表达式 5 > [ ERROR < 字符表达式 5 > ] ]
[ WHEN < 逻辑表达式 2 > ] [ NOMODIF Y] [ SCROLL ] [ TAB]
[COLOR SCHEME < 数值表达式 6 > | COLOR < 颜色对表 > ]

    功能 : 定义一个文本编辑区 , 它用 READ 命令激活。文本编辑区是一个滚动列表 , 可


用来编辑字符型的内存变量、数组元素、字段或备注型字段。
说明 :
(1 ) < 行坐标 , 列坐标 > 表示文本编辑区的开始位置。
(2 ) EDIT 子句的 < 内存变量 > 或 < 字段 > 存储编辑内容。
(3 ) SIZE 子句的 < 数值表达式 1 > , < 数值表达 式 2 > 分 别表示 编辑 区的行 数和 列
数 , < 数值表达式 3 > 表示编辑文本最大长度。
(4 ) FU NCTION 子句的 < 字符表达式 1 > 是功能符 , 有两种功能符可以选用 :
I   文本居中
J   文本右对齐
缺省 FU NCTION 子句默认文本左对齐。
(5 ) ENABLE 表示允许使用编辑区 , 此为缺省情况。DISABLE 表示不允许使用编 辑
区 , 此时编辑区以屏蔽颜色显示。
(6 ) MESSAGE 的 < 字符表达式 4 > 用作 编辑 区选 定后 的提 示信 息 , 可 在窗 口的 状
态条中显示。
(7 ) VALID 子句的 < 逻辑表达式 1 > 值为假 时 , < 字符 表达 式 5 > 将 被用作 提示 信
息。
VALID 子句的 < 数值表达 式 5 > 用 于激 活 由 READ 控 制的 某 个对 象。 例如 值 为 0
时将光标保持在编辑区中 ; 值为 1 时激活下一个对象 ; 值为 - 1 激活前一个对象。
(8 ) 带有 NOMODIFY 子句表示编辑区的内容只可显示 , 不允许修改。
(9 ) SCROL L 子句使编辑区右侧具有滚动条。
[ 例 5-4]   设计一个用于编辑备注型字段的文本编辑区。

    * e5-4 .prg
USE sb
GO 4
@2 , 2 EDI T 备注 SIZE 5 , 30 SCROLL MESSAGE ′
第′+ ST R( R ECNO ( ) , 1) + ′个记录′
R EAD

程序运行后出现如图 5 .3 所示的文本编辑区 , 区 中内容 是 SB 库文件 第四 个记录 的备 注


文本 ; 同时在 FoxPro 主窗口的状态条中还显示了提示信息“第 4 个记录”。
二、建立下推按钮
命令格式 :
・ 1 75 ・
    @ < 行坐 标 , 列 坐标 > GET < 内 存 变 量 > | < 字
段>
F U NC T IO N < 字 符表 达 式 1 > | PICT UR E <
字符表达式 2 >
[ FONT < 字 符 表 达 式 3 > [ , < 数 值 表 达 式 1
> ] ] [ STYLE < 字符表达式 4 > ]
[ DEFA ULT < 表达式 > ] [ SIZE < 数值 表达式 2 图 5 .3   文本编辑区

> , < 数值表达式 3 > [ , < 数值表达


式 4 > ]]
[ ENABLE | DISABLE ] [ MESSAGE < 字符表达式 5 > ]
[ VALID < 逻辑表达式 1 > | < 数值表达式 5 > ] [ WHEN < 逻辑表达式 2 > ]
[ COLOR SCHEME < 数值表达式 6 > | COLOR < 颜色对表 > ]

    功能 : 定义一组按钮或图形按钮 , 用 READ 命令激活。


说明 :
(1 ) < 行坐标 , 列坐标 > 表示按钮组的开始位置。
(2 ) GE T 子句的 < 内存变量 > 或 < 字段 > 接受选 定按钮的 序号或 按钮 提示字 符串 ,
提示字符串指在按钮面板上显示的字串。
(3 ) FU NCTION 子句的 < 字符表达式 1 > 格式为 :

    ″* 附加码   提示字符串 1 ; 提示字符串 2 ; …″

    其中符号 * 是定义按钮的功能符 , 附加码有四个 :


T   按钮选定时终止 READ, 此为缺省情况
N   按钮选定时不终止 READ
H   各按钮水平排列
V   各按钮垂直排列
一个提示字符串表示一个按钮。 第一 个字符 串前 须留一 空格 , 各 字符 串 间以 分号 ;
分隔。
功能符 * B 定义图形按钮 , 此时格式中提示字符串变为 .BMP 文件的路径及名字。
若用 PICT URE 子句来表达 , < 字符表达式 2 > 的格式为

    ″@ * 附加码   提示字符串 1 ; 提示字符串 2 ; …″

    (4 ) SIZE 子句定义按钮的大小及按钮间 的距 离。 < 数值表 达式 2 > 表 示按钮 高度 ,


< 数值表达式 3 > 表示按钮宽度 , < 数值表达式 4 > 表示按钮间隔开的行数或列数。
(5 ) MESSAGE 的 < 字符表达式 5 > 作为 按钮 选定 后的 提示 信息 , 显 示 在窗 口的 状
态条中。
[ 例 5-5]   设计一个输入数据库文件名的对话框。
    * e5-5 .prg
CLEAR
DEFINE WINDOW w1 FROM 5 , 5 TO 11 , 40   T I TLE ′输   入′;

・ 1 76 ・
    CLOSE FLOAT MINI MIZE SYST EM
AC TI VAT E WI NDOW w1
@1 , 5 SAY ′
数据库文件名∶′GET biao   DEFAULT SP ACE (8)
@3 , 8 GET xz F U NCT ION ′* h 确定 ; 取消′SIZE 1 .5 , 6 , 5 DEFA UL T 1 VAL ID jy( )
READ CYCLE
RELEASE WI NDOW
F U NC T ION jy
IF xz = 1
IF FI LE(′& biao . .dbf′)
USE & biao
BROWSE
USE
ELSE
    WAI T WINDOW ′
无此数据库文件 !′NOWAI T
ENDIF
ENDIF

    程序运行 后出 现 如图 5 .4 所 示 的 数据 输 入窗
口。程序中的 @ . . . GE T 命 令定义了 一组两 个按
钮 , 变量 XZ 接受选定按钮的序号 , VALID 子句的
自定义函数 JY 用来判别变 量值 , 以 决定是否分析
图 5 .4   输入数据库文件名的对话框
输入的数据。

5 .1 .4   清除窗 口内容和 其它

这里再介 绍 两 条常 用 的 命 令 , : 一 条 是 @ …
CLEAR , 用于清除窗口内容 ; 另一条是 @ …BOX, 可以在屏幕上画框。
一、清除窗口内容
命令格式 :

    @ < 行坐标 1 , 列坐标 1 > [CLEAR | CLEAR TO < 行坐标 2 , 列坐标 2 > ]

    功能 : 根据指出的坐标清除 FoxPro 主窗口或用户定义窗口的一部分。


该命令有以下三种格式 :
(1 ) @ < 行坐标 1 , 列坐标 1 > : 在行坐标 1 指出的行中 , 从列坐标 1 指出的列起清除
至该行末尾。例如执行命令“ @2 , 5”, 将清除第 2 行中从第 5 列起直至行末。
(2 ) @ < 行坐标 1 , 列坐标 1 > CLEAR : 清除由 < 行坐标 1 , 列坐标 1 > 指出的左上角
直到所在窗口右下角的矩形区域。例如执行 命令“ @ 2 , 5 CLEAR”, 将清 除以“ 2 , 5”为 左
上角直到所在窗口右下角的矩形区域。
(3 ) @ < 行坐标 1 , 列坐标 1 > CLEAR T O < 行坐标 2 , 列坐标 2 > : 清除由 < 行坐标
1 , 列坐标 1 > 指出的左上角至 < 行坐标 2 , 列坐标 2 > 指出 的右下 角的矩形 区域。例如 执
行命令“ @2 , 5 CLEAR TO 10 , 20”, 将清除“ 2 , 5”为左 上角 坐标至“ 10 , 20”为右下 角坐 标
・ 1 77 ・
的矩形区域。
二、画矩形框
命令格式 :

    @ < 行坐标 1 , 列坐标 1 > , < 行坐标 2 , 列坐标 2 > BOX

    功能 : 根据指出的坐标在 FoxPro 主窗口或用户定义窗口内画一个单线矩形框。


说明 :
< 行坐标 1 , 列坐标 1 > 和 < 行坐标 2 , 列坐标 2 > 分别为矩形框左上角和右下角的坐
标。若行坐标 1 和行坐标 2 相等则紧缩为一条横线 , 列坐标 1 和列 坐标 2 相 等则紧缩 为
一条竖线。
例如执行命令“ @2 , 5 , 10 , 20 BOX”, 将显示一个左上角位于第 2 行第 5 列、右下角位
于第 10 行第 20 列的单线矩形框。

5 .2   窗 口 着 色

Windows 十分重视界面的配色 , 它为窗口的每一 部分 都设置 了适 当的 颜色 , 组成“ 配


色方案”( Color Scheme ) 。FoxPro for Windows 界面 的初始 颜色 , 就 是从 Windows 的当 前
配色方案得到的。本节将首先说明与配色有关的几个术语 , 然后介绍 Fox Pro 的主要着 色
命令。

5 .2 .1   颜色对 与颜色模 式

一、颜色对
颜色对用来表示一个区域的前景和背景色 , 可记为“ 前景/ 背景”。例如在一个显示文
本的窗口内 , 文本颜色称为前景 , 窗口颜色称为背景。
前景和背景可取的颜色如表 4 .2 所示。下划 线和 反像只 适用 于单色 显示 器 “
; 空白”
并非白色 , 令前景或背景为 X 就表示不显示任何内容。若前景、背景两种颜色缺一 , 则缺
省色为黑色。
颜色还有两个附加符号 + 和 * , 如果 颜色 代码 附加 了 + 号 能 使前 景 色高 亮 度 显示 ,
附加了 * 号则使背景色为高亮度。例如颜色对“R/ W * ”表示前景为红色 , 背景为高亮 度
的白色。
二、颜色模式
Fox Pro 共有 24 个颜色模式 ( Color Scheme) , 其中前 12 个 模式中 的每 个模式 规定 了
某种对象的颜色。如 1 号颜色 模式 适用 于用户 自定 义的窗 口 ; 2 号颜 色模 式 适用 于用 户
自定义的选单 ; 3 号颜色模式用于水平选单 ; 4 号颜色模式用于弹出式选单 ; 等等。颜色模
式 13~ 16 为系统保留使用 ; 颜色模式 17~ 24 可由用户定义颜色。
每个颜色模式包括 10 个颜色对 , 不同的颜色模式其颜色对的作用也不相同 , 表 5 .3
列出了颜色模式 1 和颜色模式 2 的颜 色对 的作用。 例如在 颜色 模式 1 ( 用 于 用户 定义 窗
口 ) 中 , 第一个颜色对用于输出显示 , 第 二个颜 色对 用于 输入显 示。以 @ . . .SAY . . .GE T
・ 1 78 ・
命令为例 , 它的 SAY 子句表达式值是“ 窗口文本”, 以前景色 显示 “
; 窗 口文本”的 背景 用
“窗口背景”颜色显示。其 GE T 子句用于输入一个变量 , 故 编辑区是“ 应用区域”, 以背 景
色显示 ; GE T 的变量值是“窗口文本”, 以前景色显示。
表 5 .3   颜色对作用对象

颜色对 颜色模式 1 ( 用户定义窗口 ) 颜色模式 2 (用户定义选单)

1 窗口文本/ 窗口背景 选单文本/ 选单栏

2 窗口文本/ 应用区域 窗口文本/ 选单栏

3 窗口边框/ 窗口背景 窗口边框/ 选单栏

4 活动标题文本/ 活动标题栏 活动标题文本/ 活动标题栏

5 非活动标题文本/ 非活动标题栏 非活动标题文本/ 非活动标题栏

6 高亮度文本/ 高亮度 高亮度文本/ 高亮度

7 高亮度文本/ 高亮度 高亮度文本/ 高亮度

8 阴影 阴影

9 窗口文本/ 窗口背景 选单文本/ 选单栏

10 无效文本/ 窗口背景 无效文本/ 选单栏

    Fox Pro 初始启动时 , Windows 的当前配色方案自 动装入 FoxPro 的 若干个颜 色模式 ,


从而形成 FoxPro 的缺省颜色。例如将 Windows 配 色方 案的“选 单栏”设 置为 红色 , Fox-
Pro 水平选单的底色也会变为红色。

5 .2 .2   设置颜 色的命令 和子句

虽然 FoxP ro 颜色模式的初始颜色是由 Windows 确定 的 , 但可通 过命 令来改 变其 颜


色 , FoxPro 还允许在不改变颜色模式颜色的情况下临时使用其它颜色。
一、颜色子句
有不少 FoxPro 命 令 都 带 有 形 如 [ COLOR SCH EM E < 数 值 表 达 式 > | COLOR
< 颜色对表 > ] 的 颜 色 子 句 , 如 DEF IN E WI NDOW , @ . . . SAY , 各 种 @ . . . GE T ,
BROW SE 等命令都含有这样的子句。
“COLOR SCH EM E < 数值表达式 > ”子句可用来指定要使用的颜色模式 , 其中的 <
数值表达式 > 表示颜色模式号 , 取值 范围为 1 ~ 24。 但对 于一般 的用 途 , 使用系 统的 默
认颜色模式即可 , 即不需显式指定颜色模式。
“COLOR < 颜色对表 > ”子句用来指定不同 于当前 颜色 模式的 颜色 , < 颜色 对表 >
表示的颜色对 不 超过 10 个。凡 不改 变 的颜 色 对 可仅 用 逗号 表 示。例 如 子句“ COLOR ,
W/ G”表示当前颜色模式的第一颜色对不变 , 第二颜色对变为前景白色 , 背景绿色。
应该指出 , COLOR 子句并不改变颜色模式的颜色配置 , 只是临时指定了颜色对 , 在
其所在命令的有效范围内起作用。例如窗口定 义命令中 COLOR 子句的 颜色设置 , 只 适
用于所定义的窗口 ; @ . . .GE T 命令 COLOR 子句的颜色设置只对本 GE T 变量的显示 有
・ 1 79 ・
效。如果先 后 用 窗口 定 义命 令 和 @ . . .GE T 命 令 的 COLOR 子 句 进行 了 不 同的 颜 色 设
置 , 则后者有效。
[ 例 5-6]   利用“COLOR”子句设置颜色示例。

    * e5-6 .prg
DEFI NE WINDOW w1 F RO M 5 , 5 TO 11 , 30 TI TL E ′
数据输入′FLOAT ;
COLOR N/ GR + * , W + / R * & & 输出显示黑字黄底 , 输入显示白字红底
AC T IVATE W INDOW w1 & & 窗口显示黄底
jg = 123 .00
@1 , 3 SAY ′
价格∶′GET jg & & 以黑字黄底显示“价格 : ”, 白字红底显示 jg 值
@ ROW ( ) + 2 , 3 SAY ′数量∶′GE T sl COLOR , X/ R * DEFA ULT 45 ;
& &“数量 : ”显示颜色不变 , SL 值显示被 X 屏蔽
R EAD
R EL EASE W INDOW

    运行该程序将出现如图 5 .5 所示的窗口。程序中
有二个 @ . . .SAY . . .GE T 命 令 , DEF INE WINDOW
命令的颜色设 置 控制 了 不带 COLOR 子 句 的 SAY 或
GE T 的显示 , 后 一个 GE T 则 按自 带 COLOR 子 句 的
颜色设置来显示。
二、SET COLOR TO 命令 图 5 .5   窗口颜色设置之一
SE T COLOR TO 命 令可 用来 指 定用 户 定义 窗 口
( 颜色模式 1 ) 和用户定义选单 ( 颜色模式 2 ) 的颜色 , 其命令格式也可记为 :

    SE T COLOR TO [ < 第一颜色对 > ] [ , < 第二颜色对 > ]

    该命令所设定颜色的作用范围是随后出现的各种显示命令 , 请看下例。
[ 例 5-7]   利用“ SE T COLOR T O”命令设置颜色示例。

    * e5-7 .prg
DEFI NE WINDOW w1 F RO M 5 , 5 TO 9 , 30       & & 定义无标题栏的窗口 W1
AC T IVATE W INDOW w1
SE T COLOR TO N/ GR + * , W +/ B *   & & 设置输出显示为黑字黄底 , 输入显示为白字蓝底
CLEAR & & 属于输出显示 , 窗口 W1 涂以黄色
@0 , 0 , 3 , 25 BOX & & 属于输出显示 , 画出黑色边框
@1 , 3 SAY ′
价格∶′GET jg DEFA ULT 123 ;
& &“价格∶”以黑字黄底显示 , JG 值以白字蓝底显示
R EAD
SE T COLOR TO N/ W * , W + / N & & 设置输出显示为黑字白底 , 输入显示为白字黑底
@1 , 3 SAY ′
数量∶′GET sl   DEFA ULT 45 ;
& &“数量∶”以黑字白底显示 , SL 值以白字黑底显示
R EAD
R EL EASE W INDOW

・ 1 80 ・
    运行该程序将出现如图 5 .6 所示的窗口。
注意 : 该命令作用于用户定 义窗口时 不会改变 颜
色模 式 的颜 色 , 但 作用 于 FoxPro 主窗 口时 将改 变 颜
色模式 1 的颜色。 图 5 .6   窗口颜色设置之二
三、SET COLOR OF SCHEME 命令
命令格式 :

    SE T COLOR OF SCHEME < 数值表达式 1 > TO [ SCHEME < 数值表达式 2 > | < 颜色对表 > ]

    功能 : 将一个颜 色 模式 的 颜色 配 置复 制 到 另一 个 颜色 模 式 , 或 改 变 颜色 模 式 的 颜
色。
说明 :
( 1) 选用 < 颜色对表 > 表示要改变由 < 数值表达式 1 > 指定的颜色模式的颜色 , < 颜
色对表 > 用来表示不超过 10 个的颜色对 , 不想改变的颜色对可用逗号表示。
(2 ) 在窗口定义前设置才有效。
(3 ) 缺省可选项 [ SCHE ME < 数值表达式 2 > | < 颜色对 表 > ] 表 示恢 复 < 数 值表 达
式 1 > 指定颜色模式的缺省颜色。
[ 例 5-8]   颜色模式对窗口颜色的控制。

    * e5-8 .prg
SE T COLOR OF SCHEME 1 TO       & & 恢复 1 号颜色模式缺省颜色
SE T COLOR OF SCHEME 1 TO W/ B;
& & 1 号颜色模式的第一颜色对改为白字蓝底
DEFI NE WINDOW w1 F RO M 4 , 5 TO 8 , 30 T I TLE ′
w1′
AC T IVATE W INDOW w1
DEFI NE WINDOW w2 F RO M 4 , 44 TO 8 , 70 TI TL E ′
w2′
AC T IVATE W INDOW w2
WAI T W INDOW
R EL EASE W INDOW w1 , w2 & & 关闭窗口 W1 , W2

    程序中的 SE T COLOR OF 命令修改了 1 号颜 色模 式的第 一颜 色对 , 致 使窗口 w1 ,


w2 均为蓝底窗口 , 这说明颜色模式控制了所有窗口的显示。
(4 ) 选用 < 数值表达式 2 > 表示要将一个 颜色模 式的颜色 配置复 制到 另一个 颜色 模
式 , 并且它表示目的颜色模式 , 源颜色模式则由 < 数值表达式 1 > 指定。
如果用户需要自己定义一个颜色模式 , 可使用颜色模 式号 17~ 24。用户 既可以通 过
改变 < 颜色对表 > 来定义颜色 , 也可以从其它 颜色模 式复 制出 一个具 有相 同颜色 配置 的
颜色模式。例如命令“SE T COLOR OF SCHE ME 1 TO SCHEM E 17”就能将 颜色 模式 1
的颜色配置复制到颜色模式 17 中去。

5 .3   BROWSE 窗的设计
打开库文件后发一条 BROWSE 命令 , 就可打开一个标准 的 BROWSE 窗口 , 从而 对
・ 1 81 ・
数据进 行 浏览 与编 辑。但 是在 开发 应 用程 序时 , 用户 可能 希望 由自 己 来设 计 BROWSE
窗 , 使 之更 加 符 合需 要。本 节 将向 读 者 介绍 使 用 BROWSE 命令 定 义 BROW SE 窗 的 方
法。功能键是一种方便的操作工具 , 自定义 的 BROW SE 窗 配上自 定义 的功 能键 , 可以 相
得益彰。本节提供了几个实用的例子 , 可供读者参考。

5 .3 .1   定义 BROWSE 窗

首先介绍 BROWSE 命令及其常用子句。


命令格式 :

    BROWSE [ FI ELDS < 字段表 > ]


[ FO NT < 字符表达式 1 > [ , < 数值表达式 1 > ] ] [ STYLE < 字符表达式 2 > ]
[ FOR < 逻辑表达式 1 > ]
[ FR EEZE < 字段 > ] [ LAST ] [ LEDIT ] [ REDI T ] [ LOCK < 数值表达式 2 > ]
[ NOAP PEND] [ NODELE TE ] [ NOMODI FY ] [ NOLIN K] [ NOMENU ] [ NOWAI T ]
[ TI T LE < 字符表达式 3 > ]
[ VALID [∶F ] < 逻 辑 表 达 式 2 > [ ERROR < 字 符 表 达 式 4 > ] ] [ WHEN < 逻 辑 表 达
式 3> ]
[ [ WINDOW < 窗口名 1 > ] [ I N [ WI NDOW] < 窗口名 2 > | IN SCR EEN ] ]
[COLOR SCHEME < 数值表达式 3 > | COLOR < 颜色对表 > ]

    功能 : 浏览或编辑数据库文件。
说明 :
(1 ) [ F IE LDS < 字段表 > ]
< 字段表 > 中每个字段可包含若干选项 , 字段格式为 :

    < 字段名 > [∶R] [∶< 数值表达式 > ] [∶V = < 表达式 1 > [∶F] [∶E = < 字符表达式 1 > ] ]
    [∶P = < 字符表达式 2 > ] [∶B = < 表达式 2 > , < 表达式 3 > [∶F ] ]
    [∶H = < 字符表达式 3 > ] [∶W = < 逻辑表达式 1 > ]

    下面解释各选项的用法。
① ∶R
表示字段为只读 , 不能编辑。
② ∶< 数值表达式 >
< 数值表达式 > 表示栏宽 , 例如“∶10”表示当前字段显示栏宽度为 10 个字符位置。
③ ∶V = < 表达式 1 > [∶F ] [∶E = < 字符表达式 1 > ]
该选项的功能相当于 @ … GE T 的 VALID 子句 , < 表达式 1 > 设 置光 标离开 字段 校
验。默认字段值被修改才进行校验 , 使用“∶F”不管字段值修改与否都进行校验。 < 字 符
表达式 1 > 为校验设置出错提示信息。
④ ∶P = < 字符表达式 2 >
< 字符表达式 2 > 表示格式符。用法例如“∶P = ″ ”。
999 .99″
⑤ ∶B = < 表达式 2 > , < 表达式 3 > [∶F ]
该选项的功能相当于 @ …GE T 的 RANGE 子句 , 用来设置范围 检查。 < 表 达式 2 >
・ 1 82 ・
表示范围下界 , < 表达式 3 > 则表示上界。
默认字段值被修改才进行校验。使用“∶F”不管字段值修改与否都进行校验。
⑥ ∶H = < 字符表达式 3 >
系统默认字段名作为栏目名 , 使用该选项则 < 字符表达式 3 > 作为栏目名。
⑦ ∶W = < 逻辑表达式 1 >
该选项的功能相当于 @ … GE T 的 WHE N 子句 , < 表 达式 1 > 设 置光标进 入字段 校
验。若 < 逻辑表达式 1 > 值为真 , 移 动光 标时允 许它 进入 该字段 , 否 则光 标会越 过该 字
段。
(2 ) [ F REEZE < 字段 > ]
使得光标只能在指定 < 字段 > 的范围内移动。
(3 ) [ L EDIT] [ REDIT]
BROW SE 窗口的左下角有一个称为分隔器的黑色矩形块 , 把它向右拖动 将使该窗 口
一分为二 , 并且左、右两区都能显示当前库文件的内容。
L EDIT 子句将 BROWSE 窗口的左区 设置为 CHANGE 格 式 ( 字段按行排列 ) , RED-
IT 则将右区设置为 CHANGE 格式。系统默 认 BROWSE 窗口以 BROWSE 格 式 ( 字段 按
列排列 ) 显示。
(4 ) [ LOCK < 数值表达式 2 > ]
多字段库文件常需左右滚动来显示字段 , LOCK 子句能使某些主要字段保持显示。
使用 LOCK 子句将使 BROWSE 窗口一分为二。右区 按常规 显示 , 左 区初始 时只 出
现当前库文件的前 N 个字段 , 字段序号 N 由 < 数值表达式 2 > 表示。
(5 ) [ NOAPPE ND ] [ NODE LE T E] [ NOMODIFY ] [ NOLIN K ] [ NOME NU ]
NOAPPE ND: 不允许 通 过打 Ctrl + N 键 或通 过 选 单选 项 Append Record 来 添 加 记
录。
NODE LE T E : 不允许在 BROWSE 窗口设置删除标记。
NOMOD IFY : 不允许编辑数据 , 但可浏览 , 也可添加或删除记录。
NOLIN K: 默认 BROWSE 窗口左、右两区按记录指针 相应滚 动 , 该 子句取消 这种 连
接。
NOM EN U : 使系统水平选单中不出现 BROWSE 选项。
(6 ) [ TIT LE < 字符表达式 3 > ]
设置 BROWSE 窗口的标题 , 标题用 < 字符表达式 3 > 表示。
(7 ) [ VALID [∶F ] < 逻辑表达式 2 > [ ERROR < 字符表达式 4 > ] ]
设置光标离开记录校验。记录修改后光标要离开 时计算 < 逻 辑表达 式 2 > , 其值 为
真允许光标移到其它记录。
(8 ) [ WH EN < 逻辑表达式 3 > ]
设置光标进入记录校验。 < 逻辑表达式 3 > 值 为真允 许修改 记录 , 否 则该记 录成 为
只读。
[ 例 5-9]   设计一个修改设备价格的 BROWSE 窗口。

    * e5-9 .prg
・ 1 83 ・
CLEAR ALL
SE T SAFETY O FF
SELEC T 0
USE bmdm
INDEX ON 代码 TAG dm
SELEC T 0
USE sb
BROWSE T I TLE ′设 备 价 格 表′  NODELET E LOCK 1 NOMENU ;
  F IELDS 编号∶R ,     名称∶R∶H = ′设备名称′, 价格∶B = 2001 , 500000∶F∶v = bmm ( )∶F
FU NCT ION bmm
SELEC T b mdm
SE EK sb .部门
WAI T 名称 W INDOW NOWAI T     & & WAI T 提示窗口显示部门名
SELEC T sb

    程序 运行后 出现 的 BROWSE 窗口 如图 5 .7 所示。现 在解 释程序 中 BROWSE 命 令


的子句 :
TIT LE 子句设置 BROWSE 窗口 的标 题
为“设 备 价 格 表”。NODE LE T E 不允许 设
置记录 删 除 标记。 LOCK 使 BROWSE 窗 口
左区 初 始 时 只 出 现 SB .DBF 的 第 一 个 字 段
“编号”。NOM EN U 使系 统水 平选单 中不 出
现 BROWSE 选项。
“编号∶R”将编 号 字 段 设 置 为 只 读。 名
称字段除 设 置为 只 读外 还 通过“∶H = ”设 置 图 5 .7   用于修改设备价格的 BROWSE 窗口
显示 名 为“ 设 备 名 称 ”。“ 价 格∶B = 2001 ,
500000∶F”为价格字段 设置 了 范围 校验。 为借 用 有效 性 校 验显 示 该设 备 的部 门 名 “
, ∶V
= ”设置了自定义函数 BM M ( ) , 并通 过“∶F”进 行强制 校验 , 使 得光标 进入 价 格区 时便 显
示部门名。

5 .3 .2   定义功 能键

功能键是指键盘的单键与组合键或鼠标键 , 当用户按下指定键 后即能实 现一定的 功


能 , 但按键及其功能都须事先设置。
命令格式 :

    ON KEY [ LABEL < 键标号 > ] [ < 命令 > ]

    功能 : 设置功能键及其功能 , 包括为鼠标按键设置功能。
说明 :
(1 ) LABEL 子句的 < 键标号 > 表示定义功能的按键 , 功能由 < 命令 > 来实现。可 用
的键标号见附录三。
・ 1 84 ・
(2 ) ON K EY LABE L 命令执行后 , 若进入了某种状态 , 当用户 按了指定 的功能键 或
鼠标键将会执行所设置的 < 命令 > ( 一般为 DO 命令 ) 。
状态是指程 序 执 行 遇到 READ, BROWSE , CHANGE , EDIT 等 命 令 , 或 进 入 窗 口 操
作、用户定义选单 ( 包括弹出式选单 ) 的操作 , 这些状态的特点是程序执行暂停等待用户操
作。
被设置的 < 命令 > 执行后 , 返回到原状态。
(3 ) 对于以前由 ON K EY LABE L 命令建立的功能键定义 , 可用命 令 PUSH KEY 来
保存 , 用命令 POP KEY 来恢复 , 用命令 P USH K EY CLEAR 来清除。
(4 ) 功能键和按钮等屏幕控制对象都用于实现一定的功能 , 后者仅 由 READ 命令 激
活。
[例 5-10]   设 计 一 个 可 利 用 功 能 键 为 SB .DBF 添 加 记 录、删 除 或 恢 复 记 录 的
BROW SE 窗口。

    * e5-10 .prg
CLEAR ALL
PUS H KEY CLEAR                 & & 清除以前设置过的功能键
ON KEY LABEL f4 DO tj & & F4 — 设置添加记录功能键
ON KEY LABEL f5 DO schf & & F5 — 设置删除/ 恢复功能键
ON KEY LABEL f6 DO pk & & F6 — 清除有删除标记的记录
bs = ″
BROWSE T I TLE ′设 备 表′+ ′    F4 : 添加   F5 : 删除/ 恢复   F6 : 清除′

USE sb
& bs
PROCEDU RE tj & & 添加记录
AP PEND BLANK & & 添加一个记录
PROCEDU RE schf & & 删除/ 恢复记录处理
IF DELE TED( ) & & 记录有删除标记返回 .T .
    RECALL & & 当前记录有删除标记则取消它 , 即恢复记录
ELSE
    DELE TE & & 当前记录无删除标记则打上删除标记■
ENDIF
PROCEDU RE pk & & 清除有删除标记的记录
PACK & & 清除有删除标记的记录 , BROWSE 窗口被关闭
& bs & & 重新打开 BROWSE 窗口

    程序运行后出现的 BROWSE 窗口如图 5 .8 所 示。程序 通过 ON K EY LABEL 命 令


设置了 F4( 添加记录 ) 、F5 ( 删 除/ 恢 复 记录 ) 、F6 ( 清 除 有删 除 标记 的 记 录 ) 三 个 功 能键 ,
它们 的 功 能 分别 由 过 程 tj, schf , pk 来 实现。 功 能 键提 示 信 息 利 用 T ITL E 子 句 显 示 在
BROW SE 窗口的标题栏中。
[ 例 5-11]   把 鼠标右 键设 置为 功能键 , 使 用户 在 SB .DBF 的 BROWSE 窗口 中编 辑
部门字段时 , 按下鼠标右键可显示部门代码及其名称。

    * e5-11 .prg
・ 1 85 ・
图 5 .8   处理记录的 BROWSE 窗口

CLEAR ALL
PUS H KEY CLEAR                   & & 清除以前设置过的功能键
ON KEY LABEL right mouse DO tis & & 设置鼠标右键为功能键
DEFI NE WINDOW   bm b T I TLE ′部 门 表′FROM 10 , 50 TO 20 , 70 SYST EM ;
& & 定义窗口 BMB
SELEC T 0
USE bmdm
SELEC T 0
USE sb
BROWSE T I TLE ′设 备 表′ & & 编辑 SB .DBF
CLEAR W INDOW
PROC tis
IF VARREAD( ) = ′部门′ & & BROWSE 窗口当前编辑字段名为部门返回 .T .
AC T IVATE W INDOW bm b & & 激活窗口 BMB 部门
SELEC T b mdm
LIST OF F & & 显示部门代码及其名称
IF INKEY( 0 ,′M′) = 151 & & INKEY 函数等待击键
    DEACT IVAT E WINDOW bmb   & & 挂起窗口 BMB
ENDI
SELEC T sb
ENDIF

    程序运行后将出现显示 SB .DBF 的 BROWSE 窗 口 , 当光 标处于 部门 字段时 按鼠 标


右键就会在名为 BMB 的窗口中显示部门代码及其名称。
函数 VARREAD( ) 返回 BROWSE 窗口当前编辑字段的名字。
INK EY 函数的格式为 : I NKE Y ( [ [ < expN > ] [ ,″S″| ″H″|″M″] ] ) 。S 表 示 显示 光标 ,
H 表示隐藏光标 , M 用于检查鼠标拾取 ( click) , 鼠 标的左 键按下 返回 151 , 右键按 下返 回
- 9。

习   题
1 . 分别设置标题为设备、部门代码的窗口 , 要求如下 :
・ 1 86 ・
(1 ) 设备窗口在 FoxPro 主窗口中 , 部门代码窗口作为设备窗口的子窗口。
(2 ) 这些窗口都要可关闭、可移动、可改变大小、可最小化。
(3 ) 分别在设备窗口、部门代码窗口中显示 SB .DBF, BMDM .DBF 的内容。
2 . 在 FoxP ro 主窗口中设置设备和 部门 代码两 个窗 口 , 要求 在部 门代 码 窗口 中改 变
BMDM .DBF 的代码时 , 设备窗口中 SB .DBF 的部门值会随之变动。
3 . 编写程序 , 要求按 Ctrl + W 键退出 Browse 窗口时会出现如图所示的窗口 , 并且其
中的按钮具有正确的功能。
4 . 利用颜色代 码 X 的 显示 屏 蔽特 性 设
计一个密码输入窗口 , 试编程序。
5 . SE T COLOR T O 命 令 和 DEF IN E
WINDOW 等 命 令 中的 COLOR 子 句都 能 设
置颜色 , 试说明它们的不同之处。
6 . 将 SB .DBF 以 Browse 窗 口 浏 览 , 要
求对每个字 段 进行 离开 强制 校验 , 并具 有 出 (第 3 题图 )
错提示。
7 . 例 5-10 功能键提示 设置 在 窗口 标题 栏中 , 若要 将 它 放到 BROWSE 窗 口外 的 下
方 , 程序如何修改 ?  
8 . 试编程序 , 要求按下鼠标的左键能退出循环。
9 . 将 SB .DBF 增 加 至 40 个 记 录 , 然 后 以 Browse 窗 口 浏 览 , 要 求 定 义 功 能 键 : 按
Home 键光标到首记录 , 按 End 键光标到末记录 , 按 PgU p 键上翻一页 , 按 PgDn 键下翻 一
页。假定一页为 10 个记录。
10 . 设计一个修改 SB .DBF 记录的窗口 , 并定义 F10 为帮助功能键。要求是 : 光标 在
名称字段时按 F10 会显示“必须输 入汉 字 !”, 而 光标 在部 门字 段时 按 F10 会 显示 部门 代
码表。 ( 提示 : 函数 SYS (18) 能返回光标所在字段的字段名 )

・ 1 87 ・
第六章   屏幕生成器

    第五章介绍了通过编程来定义窗口及其控制对象的方法 , 但窗 口设计命 令不仅种 类


多 , 命令中的子句也多 , 编程工作较为复杂。为此 FoxP ro 提供了一种屏幕生成器 , 使用 户
通过人机交互操作就能设计出 具有特 定功 能的 窗口 并 生成 程序。 Fox Pro 还 提供 了选 单
生成器、报表书写器、项目管理器和文档生成器等程序或文件生成工具。本章 只介绍屏 幕
生成器 , 其余生成工具将在以后各章陆续讨论。
程序自动生成虽然很便利 , 但是并不意味着不需编写程序。因 为在使用 程序生成 工
具时常需在多处加入称为“代码片段”的程序段 ; 为构成一个应用系统 , 有时还需要直接编
写程序模块。在使用生成工具时尤需注意代码片段在所生成程序中的执行时机。

6 .1   屏幕生成的基本概念

6 .1 .1   屏幕生 成器的组 成

    屏幕生成器包括屏幕 构造器 ( Screen Builder) 和程 序生成 器 ( Generate ) 两 个部 分 , 前


者用来设计屏幕 , 后者根据构 造好的 屏幕 来生 成屏幕 程序。 为讨论 方便 , 以 下对 这两 个
部分一律称为屏幕生成器。
屏幕生成器启动后 , 在 Fox Pro 主屏 幕上 将打 开一 个屏 幕 设计 窗口 ( 参阅 图 6 .1 ) , 供

图 6 .1   屏幕生成器

・ 1 88 ・
用户设计屏幕画面。窗口左侧为屏幕工具箱 , 用 于定义 构成 屏幕 画面的 各种 对象。与 此
同时 , 在窗口上方的 Fox Pro 系统选单中将自动增 加 Object 和 Screen 两 个选单项 , 它们 各
包含一个下拉子选单 , 可供用户定义屏幕设计中的各种细节。根据上面的描述 , 不妨用图
6 .2 来表示屏幕生成器的组成。

屏幕设计窗口 ( 包含屏幕工具箱 )
屏幕构造器 Objed t 选单
屏幕生成器 Screen 选单
程序生成器

图 6 .2   屏幕生成器的组成

6 .1 .2   屏幕生 成的基本 步骤

屏幕生成器生成屏幕程序的基本步骤包括 : 打开屏幕设计窗口 →进行屏 幕设计→ 保


存屏幕定义→生成屏幕程序→运行屏幕程序。现分述如下。
一、打开屏幕设计窗口
屏幕设计窗口可为用户设计屏幕画面提供一 个直 观的 交互界 面 , 该窗 口能以 命令 和
选单两种方式来打开。
1 . 命令方式打开
可使用命令 CREAT E SCRE EN < 屏幕文件 名 > 或 MODIFY SCREE N < 屏 幕文 件
名 > , 屏幕 文 件 的 扩 展 名 为 .SCX, 但 允 许 在 命 令 中 缺 省。 例 如 往 命 令 窗 口 键 入 命 令
MODIFY SCRE EN SB , 将出现标题为 SB .SCX 的屏幕设计窗口 ( 参阅图 6 .1) 。如果是新
建屏幕文件则该窗口内部是空的。
用户可用 UN TIT L ED 来表示屏幕文件的临时名 字 , 但退 出屏幕 设计 时必须 正式 取
名方能存盘。
2 . 选单方式打开
(1 ) 建立屏幕文件
选定 File 选单的 New 选项→选定 New 对话框中的 Screen 单选钮→选定 New 按钮。
或者 :
选定 File 选单的 Open 选项→选定 List Files of Type 弹出控制中的 Screen 选项→ 在
Open 对话框中选定 New 按钮。
(2 ) 修改屏幕文件
选定 File 选单的 Open 选项→选定 List Files of Type 弹出控制中的 Screen 选项→ 在
Open 对话框中选定 < 屏幕文件名 > .scx→选定 Open 按钮。
二、屏幕设计
屏幕设计窗口打开后 , 系统选 单中 自动 增加 了 Screen 和 Object 两 个选 单项 , 用户 即
可利用这一个窗口的工具箱和两个子选单来进行屏幕设计了。屏幕设计是五个基本步骤
中最重要的一步 , 下文将结合例题介绍屏幕设计的常用方法。
三、保存屏幕定义
屏幕设计 ( 无论新建或 修改 ) 的结 果 , 应 作为 屏幕 定义 保存 在 扩展 名为 .SCX 的屏 幕
・ 1 89 ・
文件和扩展名为 .SCT 的 屏 幕备 注文 件中。 当屏 幕定 义 结束 但屏 幕设 计窗 口 未关 闭时 ,
可用以下四种方法之一来保存屏幕定义。
(1 ) 双击屏幕设计窗口的控 制选 单 框 , 系统 会询 问 要否 保存 .SCX 文件 , 若 回 答 Yes
则屏幕定义被保存且屏幕设计窗口被关闭。屏幕设计窗口一旦关闭即表示从屏幕生成器
退出。
(2 ) 按组合键 Ctrl + W , 此时屏幕定义存盘且屏幕设计窗口被关闭。
(3 ) 选择系统选单中 File 选单的 Save 选项 , 系统即保存 当前的 屏幕定义 但屏幕设 计
窗口不关闭。
(4 ) 如果还没有保存过屏幕定义 , 用 Generate 命令生成 屏幕程 序时系统 将询问要 否
保存 .SCX, 此时回答 Yes。
四、生成屏幕程序
这一步的目的 , 是根据屏幕定义文件生成用 Fox Pro 写成的屏幕程序。用户可在屏 幕
设计窗口处于打开状态时选定 Program 选单的 Generate 选项。此时如果屏幕设计尚未存
过盘将会弹出一个保存文件确认框 , 若要生成 屏幕 程序必 须选 定确 认框的 Yes 按 钮保 存
屏幕定义 ; 对于新建的屏幕还会弹出保存环境信息确认框 , 等用户回答该确认框的问题后
才会出现 Generate Screen 对话框 ( 参阅 图 6 .5) 。该对 话框 中有 一个文 本框 , 其中 显示 系
统默认的屏幕程序路径及程序名 , 请用户 确认 或修 改 ; 选定此 对话 框中 的 Generate 按 钮
就会生成屏幕程序 。
屏幕生成器生成的屏幕 程序 主名 与屏 幕 文件 相同 , 而 扩 展名 为 .SP R。 例如 屏幕 文
件名为 SB .SCX, 则屏幕程序名就为 SB .SP R。屏幕程序可用文 本编辑 程序修改 , 但若 重
新生成同名屏幕程序 , 则原来的程序会被覆 盖。所以 为了 充分 利用程 序生 成工具 来减 少
编程的工作量 , 一般不采取直接修改屏幕程 序的作 法 , 代之 以“ 修改 屏幕 设计→ 重新 生
成”的步骤。
如果未保存环境信息 , 运行屏幕程序前须进行打开数据库文件等有关操作 , 方能运行
屏幕程序。
五、运行屏幕程序
程序生成后应运行一遍 , 检 验屏幕 设计 是否符 合需 求。执行 DO 命 令可 以运 行屏 幕
程序 , 但屏幕程序扩展名 .SP R 不可缺省 , 例如 DO SB .SPR。
运行屏幕程序时 , FoxPro 会自动对新建或修改后 的 .SPR 文件进 行编 译并产 生目 标
程序 .SPX, 而且对于主名相同的 .SPR 和 .SPX 程序总是运行后者。

6 .1 .3   快速屏 幕生成

前已谈到 , 屏幕设计窗口一旦打开 , 系统选单中就会增加两个临时 的选单 , 其中之 一


是 Screen 选单。该选单共有 7 个选项 , 由图 6 .1 可 见。其中 的 Q uick Screen 选项 用于 建
立屏幕 , 它能为当前库文件迅速产生一个包含除通用型字段以外所 有字段变 量的记录 编
辑屏幕。由于这种方法用户干预少 , 屏幕 设计 快 , 故简 称快速 屏幕 ( Q uick Screen ) 。实 际
应用中常常先快速建立一个屏幕 , 再把它修改为符合需要的更复杂的屏幕 , 这比从头设计
省事得多。
・ 1 90 ・
下例说明快速建立屏幕的方法 , 并且包括屏幕程序生成的全过程 , 可帮助读者加深对
屏幕生成基本步骤的理解。顺便 提一 下 , 本书为 了减 少相似 的图 形重 复出现 从而 节省 篇
幅 , 同一图形可能在多处引用 , 有些引用的文字离图较远。
[ 例 6-1]   请为 SB .DBF 快速建立一个记录编辑屏幕 , 然后生成屏幕程序并运行之。
(1 ) 打开屏幕设 计窗口 : 往 命令 窗口键 入命 令
MODIFY SCREE N SB , 即 出 现 标 题 为 SB .SCX 的
屏幕设计窗口 ( 参阅图 6 .1 ) 。
(2 ) 启动快 速屏 幕 : 选 定 Screen 选 单的 Quick
Screen 选项。
(3 ) 打 开 库文 件 : 在 Open 对 话 框 中 选 定 SB .
DBF , 然后 选定 Open 按钮 , 即 出现 如图 6 .3 所示 的
Q uick Screen 对话框。如果 事先 已打 开了库 文件 则
可省去本步骤。
(4 ) 设 置快 速 屏 幕属 性 : Q uick Screen 对 话 框
用来设置 快 速 屏 幕 属 性 , 其 内 容 以 后 将 详 细 介 绍。
这里只需直 接选 定 OK 按 钮认 可各 选 项的 默 认值 ,
图 6 .3   快速屏幕对话框
选定 OK 按钮后 , 就 会出 现如 图 6 .4 所 示的 快速 定
义后的屏幕设计窗口。
该窗口左上方依次列出了 SB .DBF 的 字段标 题和 字段区 , 字 段标 题取 自 字段 名 , 字
段区将来可以输入数据。与 SB 库文件相比图中缺少商标字段 , 可见快速屏幕不包括通 用

图 6 .4   定义 SB .DBF 快速屏幕后的屏幕设计窗口

型字段 , 需要时可另外建立。
(5 ) 生成屏幕程序 : 选定 Program 选单的 Generate 选项→选定 SB .SCX 文件存 盘确

・ 1 91 ・
认框的 Yes 按钮 , 将屏幕定 义存 入 SB .SCX 和 SB .SCT →选 定保 存环 境信 息 ( Save envi-
ronmen t information ) 确认 框的 Yes 按 钮→ 选定 如 图 6 .5 所示 Generate Screen 对话 框 的
Generate 按钮 , 生成屏幕程序 SB .SPR。

图 6 .5   生成屏幕程序对话框

如果在生成屏幕程序前保存过屏幕定义 , 例如曾 选定 File 选 单的 Save 选项 , 本步 中


就不会出现 SB .SCX 文件存盘确认框。所 谓保 存环境 信息 , 即 把打 开 SB .DB F 的 相应 命
令 USE SB 列入屏幕程序中。
(6 ) 运行屏幕程序
往命令窗口键入命令 DO SB .SP R 。
程序运行后的屏幕显示情况与屏幕设计窗口 的最 后状 态相同 , 但 其字 段区已 可编 辑
数据。这一按照快速屏幕生 成的 屏幕 程序 , 具有 编辑 SB .DBF 当 前记 录 的功 能 , 且 能 按
Esc 键退出运行。
本例包含了打开屏幕设计窗口、打开库文件、快速定义屏幕、保存屏幕定义、保存环境
信息、生成屏幕程序、运行屏幕程序等操作 , 概括了从屏幕定义到运行屏幕程序的全过程。
需要注意的是 , Quick Screen 选项仅在屏幕设计窗口为 空时才 允许选择 , 否则 它以 淡
色显示。
为掌握产生快速屏幕的方法 , 必 须全 面了解 Q uick Screen 对话 框的 用法。下 面再 对
该对话框包含的 Field Layou t 区 , Max Field Widt h 区 和 Titles 等 四个 复选 框 作一 补充 说
明。
( 1) Field Layout 区 : 含有两个按钮 , 用来确定字段布局。左按钮表示字段排成行 , 右
按钮表示字段排成列 , 默认右按钮有效。
(2 ) Max Field Widt h 区 : 含有一个数码器 , 其中的数字表示字段最大长度。
(3 ) Titles 复选框 : 选定该复选框表示将字段名作为字 段标题 , 图 6 .4 中 编号字段 区
左侧的“编号”两字就是以字段名作为字段标 题的例 子 , 程序 生成 时将产 生一 条 @ …SAY
命令。
(4 ) Fields 复选框 : 用于选取字段。选定该复选框将出现 一个 Field Picker 对话框 供
・ 1 92 ・
挑选字段。
(5 ) Add Alias 复选框 : 选定该复选框 在屏幕 设计 时字 段变量 将自 动冠以 别名 , 例 如
SB .编号。
(6 ) Memory Variables 复选框 : 选定 该复 选框将 建立 内存 变量 , 例 如 M .编号 , 但 不
再建立字段变量。

6 .2   屏幕工具箱

屏幕工具箱位于屏幕设计窗口的左侧 , 由 14 个按钮组成 , 其中 13 个是屏幕对象定义


工具 , 见图 6 .6。众所周知 , 对象是 屏幕 设计中 独立 的 可编 辑单 位。所 谓屏 幕设 计 , 其 实
就是确定各种对象在屏幕上的位置和其它属 性。在快 速屏 幕生成 中 , 屏幕 对象是 成批 产
生的 , 其特点是速度快 , 但不能包含控制类对象 , 生成的屏幕也比较简单 ; 当利用工具箱设
计屏幕时 , 对象是由定义工具逐个建立的 , 虽然速度较慢 , 但允许用户定义各种对象 , 完全
按自己的需要进行安排。本节将首先简叙定义 屏幕对 象的 一般方 法 , 然后 按 3 类 不同 的
对象分别说明它们的定义步骤。

图 6 .6   屏幕工具箱

6 .2 .1   定义屏 幕对象的 一般方法

在屏幕设计中 , 用户不 仅可 在屏 幕设 计窗 口 建立 新对 象 , 还可 对 已 建的 对 象进 行 移
动、删除、改变大小和属性等操作。
一、建立新对象的操作方法
在屏幕设计窗口建立一个新对象 , 一般要经历三步操作 :
(1 ) 选择定义工具 : 单击工具箱中某一工具 , 其颜色将由深变浅 , 表示已经选中。
(2 ) 确定对象位置 : 将鼠标 指针 移 至屏 幕设 计窗 口中 准 备建 立新 对象 的位 置 , 然 后
单击该处 , 系统会弹出相应的对话框 , 供用户定义对象的属性。
・ 1 93 ・
(3 ) 定义对象属性 : 在对话框中定义对象的属性 , 完成后单击对话框的 OK 按钮 , 新
建的对象即在窗口出现。
注意 : 如果建立文本或线框等对象 , 选定相应定义工具后便可直接 到窗口内 操作 ; 要
结束文本操作须单击文本定义工具 , 使其颜色恢复为深色。
还须说明 , 在工具箱顶部有一个“ 选择对象指示器”, 窗口初启时指 示器呈浅 色 , 表 示
还没有选择过对象定义工具 , 不能在窗内建立新对象。单击任一对象定义工具后 , 指示器
颜色会自动由浅变深 , 表示允许建立对象。
二、对已建对象的操作
对于窗口中已经建立的对象 , 用户可根据需要进行下列操作。
(1 ) 选定单个对象 : 单击对象 , 该对象的四 角及每边 的中间 就出现控 制点符 号“■”,
表示对象已被选定。
(2 ) 选定多个对象 : 按下 Shift 键 , 逐 个单 击要 选 定的 对象。 或者 , 按 下 鼠标 按键 拖
曳 , 屏幕上将出现虚线框 , 放开鼠标按键后圈在其中的对象就被选定。
(3 ) 取消选定 : 单击已选定对象区的外部某处。
(4 ) 移动对象 : 选定对象并拖曳到合适的位置。 如果选定 的是多 个对象则 将同时 移
动。
(5 ) 改变对象区大小 : 选定对象后 , 拖曳某控制点即可使对象区放大或缩小。
(6 ) 修改对象属性 : 双击对象 , 将 会出 现 对象 属性 对话 框 , 供 用户 修改 对象 属 性 , 也
可利用 Screen 或 Object 选单进行各种设置。
注意 : 修改文本对象须选定文 本定义 工具 后方 能到窗 口内 操作 ; 而修 改 线或 框等 对
象则可直接到窗口内操作。
(7 ) 删除对象 : 选定对象 , 按 Del 键或选定 Edit 选单的 Clear 选项。
(8 ) 剪贴对象 : 选定对象 , 利用 Edit 选单 关 于剪 贴 板的 选 项 来复 制、移 动 或删 除 对
象。

6 .2 .2   数据类 对象的定 义

定义数据类对象要用到工具箱中第 2~4 个按钮。


一、文本定义工具
该工具用来建立、修改字符串 , 也即在屏幕设计窗口中写入文本 ( 参阅例 6-2( 6) ) 。
二、字段定义工具
该工具用来建立或修改字段对 象 , 也 可用 来定 义内存 变量 或输出 表达 式 , 对 应于 程
序中的 @ …SAY/ GE T 命令。在屏幕设 计窗 口中 选定 该工 具 后单 击窗 口内 某处 , 或双 击
用此工具定义的对象 , 都会出现 Field 对话框 ( 参阅图 6 .9) 。 下面介 绍该对话 框各部分 的
功能。
1 . Field 区
该区的作用是设置本对象为输入或输出对象 , 它有两个单选钮。
单选钮 Inpu t Field( Get) 指定本对象为输入对象 , 即数据可编辑。
单选钮 Output Field( Say) 指定本对象数据只可输出。
・ 1 94 ・
2 . Input ( 或 Out put ) 按钮
该按钮显示的字样取决于选择了 Field 区的哪一个单选钮。若选定 Get 单选钮 , 本按
钮显示字样为 Input , 选定它将 出现 Choose Field/ Variable 对话 框 ( 参 阅图 6 .14 ) ; 若选 定
Say 单选钮 , 则本按钮显示字样为 Output , 选定它将出现 Expression Builder 对话框。
Choose Field/ Variable 对话框含有两个滚动列表和一个文本框 , 滚动列表 分别供用 户
选择字段和内存变量 ; 文本框可以键入字段名或内存变量名。
利用 Inpu t( 或 Output ) 按钮设置过数 据后 , Format 按 钮就成 为可 选按钮。 Format 按
钮用来设定对象的输入/ 输出格式 , 相当于为 GE T/ SAY 变量设置格式符。选定该按钮 后
将出现一个 Format 对话框 ( 参阅图 6 .11 ) , 其中的 Format 文本框用来 键入模式符及插 入
性字符 , 复选框用 来 设 置 功能 符 , 图 中 对 字 段 SB .价 格 进 行 的 设 置 相 当 于“ @ B 999999
元”。
3 . Option 区
该区的作用是设置对象的初始状态 , 它有三个复选框。
复选框 Select Field on Ent ry 在变量设置为输入时为 可选 , 选定 该框能使 本对象的 变
量值被选定 , 即颜色变深。此时变量值已是文本块 , 可以剪切或复制 , 但开始 打键后变 量
值会自动删去然后显示键入的数据。
复选框 Refresh Ou tput Field 在对象设置为输出时成为 可选 , 它能根 据当前记 录指 针
或计算结果 , 用本输出对象数据来更 新屏幕 , 但 事先 还须把 SHOW GE TS E NABLE 命 令
加入到 Valid 代码片段中。
复选框 Initially Disable Field 在变量设置为输入时成为可选 , 它 使变量的 初始状态 成
为不可选 , 即 以 淡 色 显 示。若 要 改 为 可 选 , 必 须 在 其 他 对 象 的 某 代 码 片 段 中 加 入 命 令
SHOW GE T < 变量名 > ENABLE 或 SHOW GE TS ENABL E。
4 . Range 区
该区的作用是为输入对象设置允许值范围 , 相当于 为 @ …… GE T 命令设 置 Range 子
句。区内有 Lower 和 Upper 两个按钮 , 分别用来为本输 入对象设 置最小 允许值和 最大 允
许值 , 选定按钮后将出现代码片段 ( Code Snippet ) 对 话框 , 其 中有 Procedure 和 Expression
两个单选钮 , 前者用来键入用户定义函数 命令段 , 例如 命令 RE T URN 20 , 后者则 用来 直
接键入表达式 , 例如表达式 20。
5 . Clause 区
该区的作用是为输入对象设置 When , Valid , Message, Error , Comment 等子句。
选定前四个按钮之一将出现代 码片 段对 话框 : 利用 When 按 钮键 入的 代码 片 段 , 执
行后返回 .T .方能进行本对象编辑。利用 Valid 按钮 键入的 代码 片段 , 执行 后返 回 .T .方
可使控制离开本对象。利用 Message 按钮应键入字符串代码片段 , 执行本输入对 象时 , 它
显示在状态条中。利用 Error 按钮 也应 键入 字符 串代 码片 段 , 当 本对 象输 入 非法 时作 为
报错信息显示。
选定 Comment 按 钮 将 出 现 Commen t 对 话 框 , 可 用 来 键 入 本 对 象 的 注 解 , 加 入 到
.SPR程序中。
[ 例 6-2]   计算 SB .DBF 中第一个设备一年后的现值。要求屏幕输出如图 6 .7 所示 ;
・ 1 95 ・
输出金额忽略角分。 ( 假定设备年折旧率为 : (1 - 4 % ) ÷使用年数 , 其中使用 年数规定 为
15 年。)

图 6 .7   设备折旧 (SBZJ) 输出屏幕

(1 ) 复制例 6-1 中快速屏幕产生的屏幕文件和 屏幕备注 文件 , 并打开 屏幕设计 窗口 :


往命令窗口键入下述命令序列

COPY FI LE SB .SCX TO SBZJ .SCX


COPY FI LE SB .SC T TO SBZJ .SCT
MODIF Y SCR EEN SBZJ

打开的屏幕设计窗口与图 6 .4 一致。
(2 ) 删除对象 : 按住 Shift 键 , 逐个 单 击启 用 日 期等 与 输出 无 关 的 对 象 , 然 后 按 Del
键。
(3 ) 移动对象 : 分别选定编号等对象并拖曳到如图 6 .8 所示位置。

图 6 .8   设备折旧屏幕设计窗口
(4 ) 将输入字段 修改 为 输出 字 段 : 双 击编 号 字段 区 屏 幕就 会 出现 如 图 6 .9 所 示 的
Field 输入对话框 , 单击 Say 单选钮 , 将编号字段 由输入 字段 改为 输出字 段。接着 用同 样
的办法分别将名称字段和价格字段改变为输出字段。
・ 1 96 ・
图 6 .9   用字段对话框设置输入字段

(5 ) 设置价格字段格式 : 双击价格字段区→在如图 6 .10 所示的 Field 输 出对话框 中


单击 Format 按钮→ 在如图 6 .11 所示 的 Format 对 话框的 文本框中 键入模式 符“ 999999”
及插入性字符“元”→为使输出数据左对齐 , 选定 复选框 Left Justify→单击 OK 按钮返 回
屏幕设计窗口。

图 6 .10   用字段对话框设置输出字段

(6 ) 建立“ 现值 :”标题 : 单击文本定义工具 →单击价 格标题 的下方→ 键入“现值 : ”字


样。
(7 ) 建 立 扣 除折 旧 的 表 达 式 : 单 击 字 段 定义 工 具 → 单 击“ 现 值 : ”标 题 的 右 方 → 在
Field 对话框中单击 Say 单选钮→ 在 Expression Builder 对话框的 Say What 滚动列表中键
入扣除折旧表达式 Sb .价格 * (1 - ( 1 - 4/ 100 )/ 15 ) , 单 击 OK 按钮 返回 Field 对 话框 →
在 Format 按钮右侧的文本框中键入格式符及插 入性字符“ @B 999999 元”→单 击 OK 按
钮返回屏幕设计窗口。
(8 ) 为标题加冒号 : 单击文本定义工具→单击 编号标 题的右方 →键入冒 号。然后 用
・ 1 97 ・
图 6 .11   设置格式对话框

同样的办法分别为名称标题和价格标题加上冒号。
生成屏幕程序后运行一遍 , 其结果如图 6 .7 所示。
三、编辑区定义工具
该工具用来为字符型的字段、变量或备注型字段定义文本编辑窗口 , 以便键入较长的
文本。
建立或修改编辑区对象时将 出现如 图 6 .12 所示的 Edit Region 对话框 , 下面 对该 对
话框进行简要说明。
Input 按钮 : 用于设定被编辑的字段、变量或备注型字段的名字。

图 6 .12   编辑区定义对话框

Scroll Bar on Edit Region 复选框 : 用于在编辑区右端设置滚动条。


Allow Tabs in Edit Region 复 选框 : 允许用 Tab 键代替键 入空格 , 而切换到下一对 象
的作用改由组合键 Ct rl + Tab 来实现。
Character Leng th 数码器 : 用于设定被编辑文本的长度 , 但不能超过字段定义宽度。
例 6-3 图 6 .13 中的备注字段区就是一个编辑区对象。

・ 1 98 ・
6 .2 .3   控制类 对象的定 义

这类对象共有 6 种定义工具 , 包括图 6 .6 中第 5~ 10 个按钮。其功能如下。


一、按钮定义工具
该工具用来定义按钮 , 其对话框为 P ush Button 对话框 ( 参阅图 6 .1 5) 。
1 . Type 区
Type 区有三个单选钮 , 用来在下列按钮类型中任选一种。
Normal 单选钮 : 设定按钮为常规类型 , 按钮面板上可定义文字。
Invisible 单选钮 : 设定按钮为不可见类型 , 当生成的程序执行时屏幕上将不显示该按
钮 , 但是单击按钮区域仍可选定它。
Picture 单选钮 : 设定按钮为图形类型。选定此该钮后 , 其右方的 Each Picture File 按
钮便成为可选。再选 Each Picture File 按钮便出 现 Pict ure 对话框 , 用 户可 从中选 定一 个
.BMP图形显示于所定义按钮的面板上。
2 . Push Bu tton P rompts 滚动列表
该列表用来设定所定义按钮的面板文字 , 若定义一个按钮只要键入一行文字 , 若键入
多行文字则一次可定义多个按钮。
3 . Variable 按钮
选定该按钮将出现 Choose Field/ Variable 对话框。由 于所 定义按 钮在 生成的 程序 中
是一条 @ …GE T 命令 , 该对话框用来设定 GE T 变量。
4 . Options 区
Vertical 单选钮 : 若一次定义一组按钮 , 各按钮排成一列。
Horizontal 单选钮 : 若一次定义一组按钮 , 各按钮排成一行。
Terminate Read on Selection 复选框 : 选 定 该框 将使 所定 义的 按 钮具 有“退 出 READ
命令并执行下一命令”的功能。例 6-3( 7) 即定义了一个这样的退出屏幕程序执行按钮。
Space Between Bu ttons 数码器 : 为一次定义一组按钮设定按钮间距。
[ 例 6-3]   设计一个用于修改记录的多页屏幕 , 要求具有翻页和退出按钮 , 并能显 示
页号。试按照如图 6 .13 所示画面来设计。
(1 ) 打开屏幕设计 窗口 并 定义 快速 屏幕 : 往命 令 窗口 键 入命 令 MODIFY SCRE EN
SBDY , 利用 Quick Screen 选项生成 SB .DBF 的快速屏幕 , 如图 6 .4 所示。
( 2) 按图 6 .13 的要求参照第 6 .2 .1 节的操作方法移动对象位置 : 分别选定对象并拖
曳到合适的位置。
(3 ) 放大备注区 : 选定备注区 , 拖曳某个控 制点将该 区放大 , 根据 它的形状 便知这 是
一个编辑区。
(4 ) 增 加“商 标”标题 : 单 击 文本 定义 工具 → 单 击备 注标 题的 下方 → 键 入“商 标”字
样。
(5 ) 增加商标字段区 : 单击字段定义 工具 → 单击“ 商 标”标 题的 右方 → 单击 Field 对
话框中的 Input 按钮→双击 Choose Field/ Variable 对话框 ( 参阅图 6 .14 ) 中 Field 滚动列表
的商标字段 , 使屏幕上出现商标字段区→选定该区 , 拖曳某控制点将它适当放大。
・ 1 99 ・
图 6 .13   用于修改记录的多页屏幕的屏幕设计窗口

图 6 .14   选字段或变量对话框

注意 , 因为快速屏幕不能产生通用型字段 , 所以需要 (4 ) 、(5 ) 两个步骤。


(6 ) 建立下页、上页按钮 : 单击 按钮 定义 工具 → 单击 屏幕 设 计窗 口内 左下 方某 处 →
在 Push But ton 对话框的 Push Button Prompts 滚动列表中键入按钮面板提示“下页”字样
( 参阅图 6 .15 ) → 在“下 页”字 样的 下一 行键 入第 二 个按 钮的 面板 提示“ 上页”字样 → 将
Space Between Bu ttons 数码 器 所 示 按 钮 间 隔 调 整 为 70 → 单 击 Variable 按 钮 , 在 Choose
Field/ Variable 对话框的文本框中键入变量名 M - ANN→单击 Valid 按钮 , 在 Code Snippet
对话框 ( 见图 6 .16) 中键入如下代码片段 :

DO CASE                                
CASE m - ann = 1

・ 2 00 ・
I F R ECN O( ) < RECCOU NT ( ) & & 防止记录下翻出界
SKIP
SHOW GETS
ENDIF
CASE m - ann = 2
I F R ECN O( ) > 1 & & 防止记录上翻出界
SKIP   -1
SHOW GETS
ENDIF
ENDCASE

图 6 .15   按钮定义对话框

图 6 .16   代码片段对话框

代码片段输入结束 后 , 选定 OK 按钮返 回 Push Button 对话框 , 再选 定 OK 按钮返 回


屏幕设计窗口。

・ 2 01 ・
上述代码片段中的函数 RECCOU N T( ) 能返回当前库文件记录数 ; 条 件 RECNO( ) <
RECCOUN T( ) 用来防止记录下翻 出界 ; 命 令 SHOW GE TS 能根 据当 前记 录 指针 的位 置
显示 GE T 变量的值 , 并重新显示所有对象。
(7 ) 定义退出按钮 : 单击按钮定义工具→在 Push Bu tton Promp ts 滚动列表键入按钮
面板提示“退出”→单击 Variable 按钮 , 在 Choose Field/ Variable 对话框的文本框中键入变
量名 M - TC→为退出 READ , 选定 T erminate READ on Selection 复选框→选定 OK 按钮。
(8 ) 定义页号 : 单击文本 定义工具→ 在窗口右上角键 入汉字“ 页”→单击对象区 外某
处取消选定→单击文本定义工具→在“ 页”的 左面 空开一 段键 入“ 第”字→ 单击字 段定 义
工具→在 Field 对话框选定 Say 单选钮和 Refresh Out put Field 复选框→单击 Out put 按钮
→在 Expression Builder 对话框的文本框中键入表达式 RECNO ( ) →选定 OK 按 钮→选 定
OK 按钮。
由于翻页 按钮 中已 设置移 动记 录指针 和更 新 GE TS 的命 令 , 翻页后 将能 根据 REC-
NO ( ) 显示第几页。
(9 ) 保存屏幕定义 : 按 Ct rl + W , 屏幕定义文件存盘并关闭屏幕设计窗口。
二、单选钮定义工具
该工具用来定义单选钮 , 其对话框为 Radio Button 对话框 ( 参阅图 6 .1 8) 。
系统默认单选钮面板为圆圈 , 选定后圆 圈中 会出现 一个 点。单选 钮面 板也可 被定 义
为图形 , 若选定 Pict ure Button 复 选框 , 单击 其右 的 Pict ure File 按 钮 , 会出 现 一个 Picture
对话框 , 供用户选取位图文件 ( .BMP ) 、图标文件 ( .ICO ) 等图形文件。
Radio Bu tton P rompts 滚动列表中可键入多个表项 , 每一表项在一个单选 钮面板的 右
侧显示 , 也就是说 , 一个 Radio Button 对话框可 定义一 组单 选钮。 Initial 弹 出控制 可用 来
为这组单选钮设置初始选定按钮。
Options 区的单选钮 Vertical 可 使 定义 的 一 组单 选 钮垂 直 排列 , 而单 选 钮 Horizon tal
则使定义的一组单选钮水平排列。
某单选钮被选定后 , 所设变量的值将等于会获得该单选钮在组内的序号 , 判别变量值
就可决定动作。
单选钮对话框不含 Terminate Read on Selection 复选框 , 所以不能终止 READ 命令的
执行 , 这也是它与按钮的区别之一。
三、复选框定义工具
该工具用来定义复选框 , 其对话框为 Check Box 对话框 ( 参阅图 6 .1 9) 。
系统默认复选框面板 为 方框 , 选定 它 后框 中 会出 现“ ×”号 ; 也 可 利用 Pict ure Check
Box 复选框把它定义为图形区。如果选定 Initially Checked 复选框 , 则所定义复选框的初
始状态被设置为“已选”( 即带“ ×”号 ) 。
凡被选定的复选框 , 其所设变量值均为 1 , 判别变量值就可决定动作。
[ 例 6-4]   设计一个维护设备数据库的对话框 , 画面要求如图 6 .17 所示。
(1 ) 打开屏幕设计窗口 : 往命令窗口键入命令 MODI FY SCREE N SBKWH。
(2 ) 建立单选钮组 : 单击单选钮定义工具→单击屏幕设计窗口的左部 , 在 Radio But-
ton 对话框的 Radio Button Prompts 滚动列表中键入“设 备表”等 4 个表 项 ( 参 阅图 6 .18)
・ 2 02 ・
图 6 .17   设备数据库维护对话框

图 6 .18   单选钮对话框

→在 Variable 按钮右边的文本框中键入变 量名 M - DX→ 单击 When 按钮 , 在 Code Snip-


pet 对话框中键入如下代码片段 :

DO CASE
CASE M - DX = 1
USE SB
CASE M - DX = 2
USE BMDM
CASE M - DX = 3
USE DX
OTHERW ISE
    U SE ZZ
ENDCASE

・ 2 03 ・
(3 ) 建立复选框 : 单击 复选 框 定义 工具 → 单击 屏幕 设计 窗口 右 下部 , 在 Check Box
对话框的 Check Box Promp ts 滚动列表中键入“编辑”字样 ( 参 阅图 6 .19 ) → 在 Variable 按
钮右边的文本框中键入变量名 M - BJ→选定 Options 区的 Initially Checked 复选 框 , 使 所
定义复选框的初始状态为已选。

图 6 .19   复选框对话框

(4 ) 定义“ 确定”按钮 : 单击按钮 定义 工 具→ 在 Push Button 对话 框的 面 板提 示列 表


中键入“确定”→变量名键入 M - QD→选定 Valid 按 钮后 , 在 Code Snippet 对话框中键 入
如下代码片段 :

IF M - BJ = 1
BROWSE & & 打开可编辑的 BROWSE 窗口
ELSE
BROWSE N OMODIF Y NOA PPEND NODELE TE & & 打开只读的 BROWSE 窗口
ENDIF

为使选定确定按钮才产生动作 , 故复选框中定义的变量 M - BJ 留待此处判别。


(5 ) 定义“ 退出”按钮 : 单击按钮 定义 工 具→ 在 Push Button 对话 框的 面 板提 示列 表
中键入“退出”→变量名键入 M - TC→为 退出 READ , 选定 Terminate READ on Selection
复选框。
定义“设备数据库维护”文本较为简单 , 不再赘述。本例生成的 程序在运 行以前须 关
闭所有已打开的库文件 , 后文将通过设置屏幕初始化代码来解决这类问题。
四、弹出控制定义工具
该工具用来定义弹出控制 , 其对话框为 Popup 对话框 ( 参阅图 6 .2 5) 。
弹出控制有列表型和数组型两种类型 , 分别由对话框中的下列单选钮来选择。
List Popup 单选钮 : 用来设定弹出控制为列表型 , 其弹出项 须由 Popup Prompts 滚 动
列表输入 , 将来仅可选用这些弹出项。
Array Popup 单选钮 : 用来设定弹出控制为数组型 , 其弹出项 由数组提 供。数组可 在
・ 2 04 ・
Set up 编辑 窗 口 中 定 义 , 依 次 选 定 如 下 对 象“ Screen 选 单 → Layout 选 项 → Code 按 钮 →
Screen Set up Code 按钮”后 , 便可在 Set up 编辑窗口中键入代码片段 , 详见下节。
Initial 弹出控制 : 用来选择初始弹出项。
1st Element 按钮 : 选定该按钮 将出 现一 个 Code Snippet 对话 框 , 允许 写 入代 码片 段
来指定数组的第一个元素。
# Elemen ts 按钮 : 允许写入代码片段来指定数组元素数。
五、滚动列表定义工具
滚动列表和弹出控制的区别之一是后者初始 时只 显示 一个弹 出项 , 滚 动列表 则可 显
示多个表项。滚动列表内的数据可由数组、弹 出式 选单、文 件名集 合、库文 件字段 或库 文
件结构提供 , 它们可分别通过 List 对话框 ( 参阅图 6 .2 7) 中的五个单选钮来定义。
From Array 单选钮 : 选定该钮表示以 数组来 提供 数据 , 其 右的文 本框 用来键 入数 组
名 ; 此时 1st Ele men t 和 # of Elements 两个按钮成为可选按钮 , 分别用来设定第一个数 组
元素的下标及所选元素个数。
From Popup 单选钮 : 选定该钮表示以弹出式选 单来提供 数据 , 此时需 将弹出 式选 单
名键入其右的文本框。弹出式选单可在 Set up 编 辑窗口 中用 DE FI NE POPU P 命 令来 定
义。
From Files 单选钮 : 选定该钮表示以文件名集合 来提 供数 据 , 可将含 有通 配符 * 和 ?
的文件名键入其右的文本框 , 文件名集合默认为“ * . * ”。
From Field 单选钮 : 选定该 钮表 示以数 据库 文件 的字段 来提 供数据 , 滚动列 表内 的
数据将是选定字段在 各记 录 的值。 选定 其右 的 Field 按 钮 , 即 可在 Expression Builder 对
话框内选定所需字段或 字段 表达 式。字 段或 字段 表 达式 也可 直接 键入 到 右边 的文 本 框
内。
From DBF St ructure 单选钮 : 选定该钮表示以数据库文件的结构来提供数据。
与按钮对象一样 , 滚动列表对象也可设定退出 READ 命令执 行的功能。 只须选定 复
选框 T erminate When Choice is Made, 则当列表操作 处理完 毕后 , 控制就 会转 移到 READ
命令的下一条命令。
六、数码器定义工具
数码器具有一个文本框 , 它的右边有上 下两 个箭头 按钮。 用户可 以利 用箭头 按钮 来
改变文本框内的数字 , 也可在文本框内输入数字。数码器定义工具用来定义数码器对象 ,
其对话框为 Spinner 对话框 ( 参阅图 6 .26 ) 。
Display 区有 Minimum , Maximum 和 Incremen ts by 三 个文 本框 , 分 别 用来 键入 利 用
数码器箭头按钮操作时显示数字的下限、上限和改变的步长。
Range 区有 Lower 和 Upper 两个按钮 , 分别用于设定数码器允许数的下限和上限 , 此
区间应不小于 Display 区设定的区间。将来用户可在数码器文本框里键入此区间中的数。

6 .2 .4   图形类 对象的定 义

工具箱的最后 4 个按钮 ( 第 11~14 个 ) 用于定义图形类对象 , 其中前 3 个适用于直接


绘图 , 后一个适用于引用现成的图形。
・ 2 05 ・
一、直线、矩形框、圆角矩形框定义工具
直线定义工具用来画竖线或横 线。画 线方法 是 : 先单 击直线 定义 工具 , 再选 择屏 幕
设计窗口内某处按下鼠标并拖曳到合适的地方放开 , 就会出现一个直线。
矩形框定义工具用来画矩形框。 画矩 形框方 法是 : 先 单击矩 形框 定义 工 具 , 再选 择
屏幕设计窗口内某处 按下 鼠 标拖 曳 , 屏幕 上会 出现 矩 形框 , 直 到框 的大 小 合适 时放 开 即
可。
圆角矩形框定义工具用来画具有弧形角 的矩形 框 , 画法 同上。双 击圆 角矩形 框对 象
将出现如图 6 .35 所示的 Round Rectangle 对话框 , 供用户选择圆角类型。
二、图形定义工具
图形定义工具用来在屏幕上 某处定 义图 形对象 , 这 些图 形可以 来 自 .BM P, .ICO 等
图形文件或通用型 ( General) 字 段。建立 或修改 图形 对象 时 会弹 出一 个 Screen Pict ure 对
话框 ( 参阅图 6 .28) , 现将该对话框用法简释如下。
File 单选钮 : 表 示图 形取 自位图 文件。选 定其 右的 File 按钮 , 会 出现 用来选 取位 图
文件的 Pict ure 对话框 ; 也可直 接在 右边 的 文本 框内 键入 位图 文 件名。 下述 路径 中有 20
多个位图文件 : \ foxprow \ sample \ organize \ bmps。
Field 单选钮 : 表示图形取自通用型字段。选定其右 的 File 按钮 , 就会 出现用 来选 取
通用型字段的 Choose Field/ Variable 对话 框 ; 也可 直 接在 右边 的文 本 框 内键 入 通用 型 字
段名。
Clip Picture 单选钮 : 当图形区小于图形时仅显示图形的左上部分。当图形来自位 图
文件时 , 图形区最大可达到显示完整图形。
Scale Picture - Retain Shape 单选钮 : 能使图形横向和纵向同时放大或缩小。
Scale Picture - Fill the Frame 单选钮 : 能使图形横向或纵向分别放大或缩小。
下面两个复选框当图形来自通用型字段时成为可选。
Cen ter Pict ure 复选框 : 若图形小于图形对象区 , 图形将置于其中间。
Refresh Output Field 复选框 : 使图形能随当前记录的不同而改变。

6 .3   屏幕生成器的选单

工具箱是屏幕设计的有力工具 , 但从上节的讨论可见 , 它的作用主要是对屏幕对象单


个地进行定义。为了进一步美化屏幕 , 从总体上对它的布局、配色和代码片段进行设置或
调整 , 屏幕生成器还在选单中增 加了 Screen 和 Object 两个 临 时选 单 , 可分 别 对屏 幕和 对
象进行补充定义 , 用户应充分利用这两个选单来设计屏幕。

6 .3 .1   Screen 选单

由图 6 .1 可知 Screen 选单包括 7 个选项。其中的 Q uick Screen 选项早在第 6 .1 .2 节


已经介绍 , 这里讨论其余 6 个选项。
一、Layout 选项
选定 Layout 选项将出现由图 6 .22 所示的 Screen Layout 对话框 , 可供用户设置代码
・ 2 06 ・
片段、颜色等屏幕属性。
对话框左部有一个矩形框。它是 FoxP ro 主窗口的缩影 , 既可显示所设计屏幕的当 前
布局 , 又示意了该屏幕在 Fox Pro 主窗口的 位置。用 鼠标 拖曳“屏 幕”右 下角的 方块 , 它 将
会放大或缩小 ; 也可直接改变 Size 区数码器数字 来改变其 大小 , 区中的 Widt h 表示 宽度 ,
Heigh t 表示高度。
所设计的屏幕与 FoxPro 主窗口的相对 位置也 可以 用两 种方法 改变。 用鼠标 拖曳 屏
幕的任一边在主窗口中移动 , 此时 Position 区 数 码器 的数 字将 会变 化。也 可 直接 改变 数
码器数字来移动 屏 幕 , 此 时 Horizontal 表 示 被设 计 屏 幕 左 边与 FoxPro 主 窗口 左 边 的 距
离 , Ver tical 表示 屏幕 上边与 Fox Pro 主窗 口上 边的距 离。若选 定了 复选 框 Cen ter , 则 所
设计屏幕将定位于 FoxP ro 主窗口的中间。
文本框 Title 用来键入窗口标题 , 文本框 Name 用来键入 窗口名 , 如果 缺省则 系统 会
分配一个名字。
Options 区有五个按钮 , 用于设置屏幕级代码片段等属性。
1 . Code 按钮
选定该按钮会出现如 图 6 .23 所 示的 Screen Code 对 话 框 , 供 定义 屏 幕级 代 码 片段。
由图可见屏幕代码共有七种 , 每 选定 某一 按钮 , Screen Code 窗口 后面 就会 出 现一 个用 来
编辑代码的文本编辑窗口。
(1 ) Screen Setup Code 按钮 : 设置屏幕程序的初始化代码 , 可包含 SE T 命令 设置、初
始化内存变量、选择工作区、打开数据文件、设置索引和关联、调用用户选单等内容。
(2 ) Cleanup and Procedures 按钮 : 设置屏幕程序的清除 代码程 序段和 过程或 自定 义
函数。清除代码程序段可包含关闭文件、释放 窗口、恢 复环 境设置 等内 容 , 该程序 段之 后
是自定义函数和过程 , 它们处于程序的尾部。
(3 ) O n Screen Ent ry( When ) 按钮 : 这里设置进入屏幕时执行的代码片段。代码片 段
执行结果返回 .T .则执行 READ, 否则终止其执行。
( 4) On Screen Exit ( Valid) 按钮 : 这里设置退出屏幕时执行的代码片段。代码片段执
行结果返回 .T .则退出 READ, 否则不能终止其执行。
( 5 ) On Window Activate 按钮 : 这里设置执行 READ 命令时或当前 Read 窗口改变时
执行的代码片段。
(6 ) On Window Deactivate 按钮 : 这里 设置 非当 前窗口 变为 当前 窗口 时 执行 的代 码
片段。
( 7) On Refresh ( SHOW GE TS) 按钮 : 这里设置执行 SHOW GE T 命令时运行的代码
片段。
2 . Color 按钮
选定此按钮会出现如图 6 .34 所 示的 Screen Color 对 话框 , 其 中共 有 16 个颜 色按 钮
供用户选择窗口内的背景色。按钮 Au tomatic 表示使用 Windows 已设置的颜色模式作 为
背景颜色 ; 选定 Wallpaper 按钮会 出现 一个 Pict ure 对话 框 , 供 选择 .BMP 或 .ICO 等图 形
文件作为壁纸。
3 . Fon t 按钮
・ 2 07 ・
选定此按钮会出现 Fon t 对话框 , 用来设定文本对象的字体、字形和字号。
4 . Window Style 按钮
选定此按钮会出现如图 6 .24 所示的 Window St yle 对话框 , 用来设定窗口的属性。
复选框 Close, Moveable , Half Ht Title Bar , Minimize 分别 可用 来设 置窗 口 的可 关闭、
可移动、具有半高标题栏、可最小化等属性。
在弹出控制 Type 中共 有 Desktop , User , System , Dialog , Alert 等五 个弹 出项 , 代表 五
种类型的窗口风格 : 选 Desktop 型窗 口则 开在桌 面上 ; 其 余四种 类 型的 窗口 都开 在 Fox-
Pro 主 窗口 中 , 但它们 允许 的复 选框可 选数 有所不 同。对 于 User 型 窗口 , 上 述四 个复 选
框都可选用。
设置窗口边框的单选钮有五个 , 但能产 生的 边框只 有粗 细之 分。设置 细边框 可用 单
选钮 Single , 设置粗边框则可用单选钮 Double。
按钮 Icon File 用来设置窗口 最小 化后 的 图标。选 定该 按 钮就 会 出现 Icon File 对 话
框 , 用户可从中选用 .ICO 文件可作为窗口最小化后的图标。
5 . Environment 按钮
选定此 按钮 会出 现 Environment 对话 框 , 其中包 含 Save, Restore, Clear , Cancel 等 按
钮 , 前三个按钮分别用来保存、恢复或清除环境。
(1 ) Save 按钮 : 用于保存当前环境。保存环境后生成的 屏幕程 序在运行 时该环境 会
自动恢复。如果不保存环境 , 则应在屏幕代码片段中设置环境 , 否则只得在屏幕程序运行
前先设置环境了。此外 , 保存环境前最好打开 View 窗口看 一下当前 环境 , 并将无 关的 库
文件关掉。
(2 ) Restore 按钮 : 若屏幕设计时改变 了环境 设置 , 该 按钮 可用来 恢复 先前保 存的 环
境。
(3 ) Clear 按钮 : 用于清除先前保存的环境。
(4 ) Cancel 按钮 : 用 于 关闭 Environmen t 对 话 框 , 但 不保 存 通过 该 对 话框 进 行 的 设
置。
[ 例 6-5]   修改由例 6-3 产生的如图 6 .13 所示的屏幕设计窗口 , 使运行 .SPR 程序 时
能在 FoxP ro 主窗口中开出如图 6 .20 所示的窗口。具体要求如下 :
(1 ) 屏幕属性设置 : 以“设备维护”字样作为窗 口标题、窗口 可关闭、设置窗 口最小 化
的图标等。
(2 ) 设备名称既可输入又可利用弹出控制选择。
(3 ) 设备价格改为输出字段 , 输出值由数码器选定。
(4 ) 设备部门改为输出字段 , 输出值由滚动 列表 确定 , 滚 动列表 包含 部门代 码和 名
称。
(5 ) 建立图形、画直线。
下面分 8 个部分来说明修改步骤。
(1 ) 打开屏幕设计窗口 : 往命令窗口键入命令 MODI FY SCRE EN SBDY→选 定 File
选单的 Save As 选项→在 Save As 对话框的 Save Screen As 文本框内键入 SBWH .SCX 作
为新的屏幕文件名→选定 Save 按钮将出现标题为 SBWH .SCX 的屏幕设计窗口。
・ 2 08 ・
图 6 .20   设备维护窗口

图 6 .21 显示了完成所有操作后的屏幕设计窗口。

图 6 .21   例 6-5 屏幕设计窗口

(2 ) 屏幕属性设置 : 选定 Screen 选单的 Layout 选项便出现 Screen Layou t 对话框 , 图


6 .22 显示了完成所有操作后的情况。操作步骤如下。
① 向 Title 文本框内键入“ 设备维护”字串作为窗口标题 ; 选定复选框 Center , 使所设
计的窗口定位于 FoxP ro 主窗口的中间。
② 选定 Code 按钮→在 Screen Code 对话 框 ( 参阅 图 6 .23 ) 中选 定 Screen Set up Code
・ 2 09 ・
图 6 .22   屏幕布局对话框

按钮→在 Sbw h-Setup 对话框中键入如下屏幕程序初始化代码片段 :

CLEAR
SE T SA FE TY OF F
CLOSE DATABASE                     & & 预防运行本屏幕程序前在同一工作区打开过相 ;
同的库文件
SELEC T 0 & & 选未用过的最小号工作区
U SE bmdm
INDEX ON 代码 TAG dm & & 为建立关联作准备
SELEC T 0
U SE sb
DIMENSION ar(7 , 1) & & 建立 7 行 1 列二维数组 , 为建立设备名弹出控制
COPY TO ARRAY ar FI ELDS 名称 & & 各名称值复制到二维数组
SE T RELAT ION TO 部门 INTO b mdm & & 为同时使用 SB .DBF 的部门和 BMDM .DBF 字 ;
段滚动列表
GO 1

③ 选定 Code 按钮 →在 Screen Code 对话框 中选定 Cleanup and Procedures 按钮→ 在


Sb wh-Cleanup 对话框中键入如下屏幕程序结束代码片段 : CL EAR AL L。
④ 选定 Window Style 按钮便出现 Window St yle 对话框 ( 参阅图 6 .2 4) 。选定其中的
复选框 Close, 使窗口可关闭 ; 选定单选钮 Double 使 窗口具 有粗边 框 ; 选定 Icon File 按 钮
便出现 Icon File 对话框 , 从中选用图形文件激光盘作为窗口最 小化后 的图标 , 其路径 为
“C: \ foxprow \ sample \ laser \ crosplat \ bmpsprgs \ laserdsk .ico”。
(3 ) 在名称区下方建立关于设备名称的弹 出控制 : 单击 弹出控制 定义工具 后再单 击
名称区下方 , 就会出现 Popup 对话框 ( 参阅图 6 .2 5) 。后续操作步骤如下。
① 选定单选钮 Array Popup 并在其右的文本框内键入数组名 AR , 表示弹出项由数组
提供。该数组已在本例 (2 ) 中定义。
・ 2 10 ・
图 6 .23   屏幕代码对话框

图 6 .24   窗口风格对话框

② 在 # Elemen ts 按钮 的代码片 段键入 RE T URN 7 , 表示弹 出控制可 显示 7 个弹 出


项。
③ 选定 Variable 按钮并选用字段变量“名称”, 以便将选定的弹出项存入该字段。
④ 选定 When 按钮键入代码片段 :

jlh = RECNO( )                       & & 保留当前记录号


COPY TO ARRAY ar FI ELDS 名称 & & 把 SB .DBF 当前所有的设备名称复制到数组 AR
GO jlh & & 恢复记录指针位置

因为名称区可能由用户输入了设备名称 , 把当前 设备 名称 复制到 数组 能使弹 出控 制


更新 ; 又因执行命令 COPY T O ARRAY 时 SB .DBF 的记录指针 将会移动 , 所以复制前 保
留了当前记录号 , 其后再恢复它。
⑤ 选定 Valid 按钮键入代码片段 SHOW GE TS, 将能使选定弹出项后立即更新名 称
输入区。
(4 ) 将价格输入区、部门输入区修改为输出区。两者修改方法相同 , 例如 修改价格 的
・ 2 11 ・
图 6 .25   弹出控制对话框

步骤为 : 双击 价格 区→ 在 Field 对话 框中 选定 Say 单 选钮 → 选定 复 选框 Refresh Output


Field。
(5 ) 在价格区下方建立修改价格的数码器 : 单击 数码器 定义工具 后再单击 价格区 下
方 , 就会出现 Spinner 对话框 ( 参阅图 6 .26) 。后续操作步骤如下。

图 6 .26   数码器对话框

① 选定 Variable 按钮并选用字段变量 SB .价格 , 将 能使数 码器中 修改 后的数 字存 入


该字段。
② 选定 Valid 按 钮 键 入 代 码 片 段 SHOW GE TS, 使 数 码 器 的 数 字 能 更 新 价 格 输
出区。
(6 ) 在部门区右方建立 BMDM .DBF 字段滚 动列表 : 单击 滚动列 表定 义工具 后再 单
击部门区右方 , 就会出现 List 对话框 ( 参阅图 6 .2 7) 。后续操作步骤如下。

・ 2 12 ・
图 6 .27   滚动列表对话框

① 选定 From Field 单 选钮 → 选定 Field 按钮 → 在 Expression Builder 对 话 框的 Say


What 文本框中键入 BMDM .代 码 + SPACE ( 2 ) + BMDM .名 称 , 滚 动 列 表的 表 项将 包 含
BMDM .DBF 的代码和名称字段的值。
② 选定 Variable 按钮 , 通过 Choose Field/ Variable 对话 框确定字 段 SB .部门为 变量 ,
这将能使在所定义滚动列表中选定的表项存入该字段变量。
③ 选定 Valid 按钮并键入代码片段 SHOW GE TS, 使滚动列表中选定的表项能更 新
部门输出区。
(7 ) 建立多页档案图形 : 单击图形定义工具 →单 击屏 幕上方 的中 间→在 Screen Pic-
ture 对话框 ( 参阅图 6 .28 ) File 按钮 右边的文本框内 键入位图文件路 径与名字 : c∶ \ fox-
prow \ sample \ organize \ bmps \ rolladex .bmp。

图 6 .28   屏幕图形对话框
(8 ) 画垂直线 : 单击直线定义工具→在多页档案 图形的 下方按下 鼠标键并 向下拖 曳
到适当地方释放。
为使键盘操作时光标能合理移动还需改变对象序号 , 这将在 本节第六 部分讲述。 还

・ 2 13 ・
有适当移动字段位置、放大字段区、按 OK 按钮返回等细节 , 不再一一列出。
本例通过设置屏幕初始化代码来对 SB .DBF 和 BMDM .DBF 进行 关联 , 但也可改 用
View 窗口设置环境来关联 , 后一方法留作习题。
二、Open All Snippets 选项
选定该选项将打开所有已设置代码片段的窗口 , 供用户修改代码 , 这既可节省寻找代
码片段的时间 , 也能避免遗漏修改。
三、Show Position 选项
选定该选项将在 FoxP ro 主窗口的状态行中显示鼠标当前位置 , 其数值单位 由 Ruler/
Grid 对话框中定义的标尺单位来决定。图 6 .29 所示鼠标当前位置的单位是字符。

图 6 .29   显示鼠标当前位置的 FoxPro 主窗口状态行

四、Ruler/ Grid 选项
在图 6 .30 所示的 Ruler/ Grid 对话框中有三个功能定义区 , 可用于设置标尺和网格。
(1 ) Ruler 区 : Ruler 区 有 5 个单 选 钮 , 其 中 Inches , Centimeters , Pixels , Characters 分
别表示标尺单位 为英寸、厘米、像 素和字符 ; No Rulers 表示不 要标尺。 例如在 图 6 .21 中
用户定义对象区的左方和上方显示了标尺。
(2 ) Ruler Lines 区 : 单选钮 Yes 表示根据标尺单位来显示网格 , No 表示不显示网格。
(3 ) Grid 区 : 用数码器来定义移 动对 象的 距离 单位。 H 表 示 水平 距离 单位 , V 表 示
垂直距离单位 , 例如图 6 .30 中水平距离 和垂 直距 离单位 都是 12 个像素。 如果设 置的 距
离单位较大 , 就不能将对象移动较小距离 , 但 是各个 对象 却易于 对齐。 但须注 意 , 要使 格
线起作用还要选定 Snap to Grid 选项。
五、Snap to Grid 选项
该选项表示对象移动时须遵照 Grid 区的格线设置 , 否则认为没有格线。
六、Object Order 选项
该选项用来改变对象序号。字段区、按钮 等对象 都具 有序号 , 图 6 .21 中字段 区内 显
示的数字就是对象序号。对象序号与该对象在屏 幕上 的位 置无关 , 仅 决定 程序运 行期 间
对象变亮的次序。对象初始序号由建立对象的次 序决 定 , 为使 光标能 按对 象位置 依次 移
动 , 就需将对象序号改变成与位置次序一致。
选定 Object Order 选项后将出现 Object Order 对话框 ( 参阅图 6 .31 ) , 改变框中左 列
按钮的相互位置就能改变对象序号。按钮 By Row 将对象按行编号 , By Column 则按列编
号。图 6 .31 表示了例 6-5 屏幕设计窗口在对象理顺后的次序。

6 .3 .2   Object 选 单

Object 选单如图 6 .32 所示。 它有 13 个 选项 , 具 有确 定 对象 位置、组 合 对象 和设 置


文本对象字体等功能 , 还能为文本、直线和边框 等对象 着色 , 起 到提高 屏幕 设计操 作效 率
・ 2 14 ・
图 6 .30   标尺与网格对话框 图 6 .31   改变对象序号对话框

和美化屏幕的作用。
一、Align to Grid 选项
选定对象 后 , 若 其 位 置不 符 合不 可 见
网格 , 只须按 该选 项 的热 键 Ctrl + T , 对 象
就会移动到符合网格的位置。这常用来使
若干对象行或列对齐。
二、Bring to Front 和 Send to Back 选

若某对象 被 其 它对 象 遮去 一 部分 , 选
定此对象后选用 Bring to F ront 选项 , 遮 去
的部分就会显 示出 来。Send to Back 选 项
的作用正好相 反 , 它使 选 定的 对 象藏 到 后

图 6 .32   Object 选单的选项 面。


三、Center 选项
该选项能使选定的对象水平移动到窗
口中间。
四、Group 和 Ungroup 选项
先通过“Shift + 单击”分别选定对象 , 再选定 Group 选项 , 已选定的若干对象就组合成
一个对象 , 以便统一进行移动、缩小放大等操 作。对象 组合 前 , 选定的 每个 对象各 围有 一
组控制点“■”, 组合好后只看到一组大范围的控制点了。
U ngroup 选项将组合起来的对象分开 , 起复原作用。
五、Font 选项
先设定文本对象 , 再选定此选项 , 就会出现用来定义所选对象字体、字形、大小的对话
框。

・ 2 15 ・
六、Text Alignment 选项
该选项用来调整文本的位置、大小及间距。
七、Fill 选项
该选项用来为选定的边框对象 充填 背景 , 可选 背景 为以 下 8 种 : 白 , 黑 , 横 线 , 竖线 ,
右斜线 , 左斜线 , 方格线和菱形格线。
八、Pen 选项
用于设置选定的直线或边 框对 象的 显示模 式 , 可选 模式为 以下 10 种 : 细 线 , 粗细 分
别为 1 , 2 , 4 , 6 点的线 , 无线 , 短划虚线 , 长划虚线 , 点划线和两点一划的点划线。
九、Mode 选项
选定文本对象后 , 再选 Mode 选项 就会 出现 两 个选 项 : Opaque ( 不 透明 ) 选 项使 文 本
区遮去背景 , Transparent ( 透 明 ) 选项 表示 不遮 去 背景。 例 如 , 黑 字文 本 区通 过 Fill Color
选项填了绿色 , 该区便成了有文有色的区 域 , 此 区域必 居于 某个背 景上。若 选定 Opaque
显示为绿底黑字 , 背景不再显示 ; 若选定 Transparent 就能看到背景 , 但此时取消了绿底。
十、Fill Color 选项
选定文本或边框对象后 , 该选项可提供 16 种颜色之一作为选定对象的区域颜色。区
域是指文本区域或边框内部。
十一、Pen Color 选项
选定文本、直线或边框对象后 , 该选项可提供 16 种颜色之一作为选定对象的颜色。
[ 例 6-6]   设计如图 6 .3 3 所示的应用程序封面。

图 6 .33   汽车修理管理系统封面

设计步骤如下 :
(1 ) 打开屏幕设计窗口 : 往命令窗口键入命令 MODI FY SCREE N QCXLF M。
(2 ) 把窗口设置在桌 面上 : 选定 Screen 选单 的 Layout 选项 → 设 置 Size 区 的 Widt h
数码器为 640 , Weight 数码器为 500 使窗口 占据 整个 屏幕 →选 定 Position 区 的 Center 复
选框使窗口居中 → 选 定 屏幕 布 局 窗 口 的 Window Style 按钮 , 在 Type 弹 出控 制 中 选 定
desktop。

・ 2 16 ・
( 3) 贴壁纸 : 选定 Screen Layou t 窗口的 Color 按钮→在如图 6 .3 4 所示的 Screen Col-
or 对话框中选定 Wallpaper 按钮 →在 Picture 对话 框中 选 定如 下位 图文 件 : c∶ \ windows
\ cars .bmp。

图 6 .34   屏幕颜色对话框

(4 ) 画椭圆 : 单击圆角 矩形框定义工具 →单击屏幕 设计窗口左上方 →双击圆角矩 形


框对象 , 在如图 6 .35 所示的 Round Rectangle 对话 框中选 定椭 圆类 型 , 选 定 OK 按钮 →
将椭圆放大到适当大小→选定 Object 选单的 Pen Color 选项 , 选取黄色勾边。

图 6 .35   圆角类型对话框

(5 ) 写文本 : 单击文本定义工具 →单击椭圆 内左部→选 定 Object 选单的 Font 选项 ,


选取宋体、粗体 形、大 小为 36 点 →在文 本区内 键入“ 汽车 修理管理 系统”字样 →选 定 Ob-
ject 选单的 Pen Color 选项 , 选取棕色涂抹文字。
(6 ) 取消光标 : 选定 Screen Layout 窗口的 Code 按钮→选定 O n Screen Ent ry( When)
按钮 , 键入代码片段“ = INK EY (″
H″) ”。
函数 I NKEY (″H″) 起 暂停作 用 , 此 时光标 被隐藏 , 但鼠 标指针仍 显示 ; 按任一 键或 鼠
标左键程序就能继续执行。 = 号后跟随函数的形式 , 可以用作命令 , 其功能由函数表达。
本例生成的屏幕文件投入运行后屏幕即呈现封面 , 按任一键便可结束运行。

6 .4   组合查询窗口设计 : 用屏幕生成器
修改现有屏幕文件一例
    从以上讨论可见 , 由于屏幕生成器将屏幕定义和程序生成分为两步走 , 用它来辅助设
・ 2 17 ・
计各种窗口 , 确实十分方便。在例题中 , 读者已多 次看 到通 过修改 屏幕 定义 , 怎样 把一 个
简单的屏幕窗口修改为符合要求的屏幕窗口。事实上 , 这种推陈出新、通过已有屏幕来定
义新屏幕的方法 , 已为许多程序员所采 用。鉴 于 FoxPro 拥 有许多 屏幕 文件样 例 , 更为 我
们将旧屏幕翻新、减轻软件开发工作量创造了良好的机会。
在应用系统中数据查询是重点功能之一 , 以一个关系式为条件 的单项查 询编程较 为
简单 , 但要通过编程来实现组合查询难度大得多。读者也许会想到 , RQBE 范例关系查 询
能够进行组合查询。但是 , RQBE 查询 窗口含 有英 文 , 选项 也过于 庞杂 , 供 最终用 户来 操
作会有困难。 FoxP ro 系统 提供 了一 个屏 幕 文件 样 例 BROWSER .SCX, 只要 对 它进 行 修
改便可得到用户界面友好的组合查询程序。本节 将以 此为 例 , 向读者 介绍 一个可 供借 鉴
的实例。
[ 例 6-7]   按照图 6 .3 6 的屏幕设计一个通用的组合查询窗口。

图 6 .36   查询设置

(1 ) 复制组合查询屏幕文件
Fox Pro for Windows 安装好以后 , 在路 径 C: \ FOXPROW \ SAMP LE \ ORGAN IZE
\ SCRE ENS 中含有不少屏幕文件 , 其中的 BROWSER .SCX 是系统 提供的一 个组合查 询
屏幕文件。为将它修改成所需的文件 , 先为它复制一个副本 :

! COPY C∶ \ FOXPROW \ SAMPLE \ ORGANIZE \ SCR EENS \ BROWSER .S C ?

Fox Pro 允许以感叹号开头使用 DOS 命令 , 这里是调用 DOS 命令进行复制 , 结果得到


BROW SER .SCX 和 BROWSER .SCT 两个文件。若目标文件取新的名字不影响使用。
(2 ) 打开屏幕设计窗口
由于 原 BROWSER 屏 幕 设 计 窗 口 含 有 两 个 图 形 按 钮 , 若 执 行 命 令 MODIFY
SCRE EN BROWSER 将会出现 Open 对话框 , 即要求打开图形文 件。但 图 6 .36 中无图 形
・ 2 18 ・
按钮 , 不必选用图形文件 , 故可分别选定 Cancel 按钮退出 两个 Open 对 话框 , 于是 显示 出
如图 6 .37 所示的 BROWSER .SCX 屏幕设计窗口。

图 6 .37   BROWSER 屏幕设计窗口

(3 ) 修改屏幕定义和生成新查询程序
按照图 6 .36 的要求 , 对 BROWSER 屏幕设计窗口应作如下修改 : 删去 Delete 按钮和
两个狐狸头按钮 ; 将对象汉化 , 即在相应位置将英文改成中文 ; 改变按钮大小 , 适当移动对
象的位置 , 并增加“ 输入子条件”文本标题 ; 加宽线框突出部分以容纳“子条件组合”文本标
题 ; 把窗口标题改为“ 设备数据库组合查询”。
屏幕 定 义 修 改 后 , 就 可 用 Program 选 单 的 Generate 选 项 生 成 新 的 组 合 查 询 程 序
( BROWSER .SP R) 了 , 方法如前 , 不再赘述。
(4 ) 运行组合查询程序
生成 BROWSER .SP R 程序后 , 还须 在执 行 查询 前 设置 环 境。BROWSER .SPR 程 序
能对环境包含的各个库文件进行查询 , 并可 按指 定的索 引输 出记 录。如果 未设置 环境 就
执行 BROWSER .SP R 程序 , 系统将弹出一个 Open 对 话框 让用户 打开 库文 件 , 但 此时 只
可打开一个库文件。本程序对于不同的环境都可进行查询体现了程序的通用性。
和以前一样 , 环境可以通过 View 窗口或直接往 命令窗口 键入命 令来设 置 , 例 如分 别
打开 SB .DBF, BMDM .DBF , DX .DBF 和 ZZ .DBF。索 引需 处于打 开状 态 , 但不必 事先 确
定控制索引 ; 一个库文件允许使用多个索引。
执行命令 DO BROWSER .SP R 就会出现组合查询窗口 ( 参阅图 6 .36 ) , 以下对该窗口
中部分对象的作用说明如下 :“ 选表”弹出控制框包含所有打开的库 文件名 “
; 确定输出 次
序”弹出控制框包含当前库文件的索引标识以供选用 “
; 输入子条件”标题所在行可以输入
一个关系表达式 , 若选定“ 增加”按钮 , 可将当前子条件增入子条件组合的滚动列表中。两
・ 2 19 ・
个子条件的运算默认为逻辑与 , 选用“ 或”按钮表示 逻辑 或。“ 删除”按 钮可 用来去 掉子 条
件组合滚动列表的所有内容。“取消”按钮表示不查询即退出。选定“确定”按钮查询结果
则显示在 Browse 窗口中。
对于图 6 .36 中的设置 , 选定“确定”按钮后的查询结果如图 6 .38 所示。

图 6 .38   组合查询结果

习   题
1 . 屏幕设计窗口工具箱共有几种对象定义工具 , 哪几种是定义控制对象的工具 ?
2 . 在例 6-3 的屏幕设计窗口中增加一个按钮 , 其功 能是显 示本页设 备价格占 全部 设
备价格的百分比。
3 . 利用屏幕生成器设计一个只包括四个图形大按钮的屏幕 , 其 中一个按 钮用来使 屏
幕程序退出运行。其它三个按钮的功能分别是为 SB .DBF, BMDM .DBF , ZZ .DBF 打开 一
个 Browse 窗口。
4 . 利用屏幕生成器设计一个如图所示的数据备份确认框 , 选定 确认按钮 能将当前 目
录所有 .DBF 文件复制到 A 盘 , 选定取消按钮则不复制。

( 第 4 题图)

5 . 根据例 6-3 设计一个按记录维护 SB .DBF 的屏幕 , 要求增加以下按钮。


首页 : 翻到第一个记录。
末页 : 翻到最后一个记录。
寻页 : 出现一个对话框供用户键入设备编号 , 若查到立即显示该记录。
修改 : 选定此按钮可以修改字段值 , 否则只能显示而不可修改。
插入 : 在当前记录后插入记录。
删除 : 删除当前记录。
・ 2 20 ・
6 . 设计一个“设备数据维护封面”并产生一个屏幕程序 , 该程序 运行后打 任一键可 用
例 6-3 的屏幕程序进行记录维护。
7 . 例 6-5 通过设置屏幕初始化代码来对 SB .DBF 和 BMDM .DBF 进行关联 , 现要 通
过 View 窗口设置环境来关联。试写出用后一方 法关 联的 过程和 屏幕 初始化 代码 , 然 后
说明该方法的优点。
8 . 修改例 6-3 的屏幕设计窗口 , 要求运行 .SP R 程序 时能 将部门 名显 示在部 门代 码
右侧。
9 . 在例 6-3 的屏幕设计窗口 中增 加一 个 帮助 按钮 , 其 功 能是 : 光 标在 名 称字 段时 显
示“请输入汉字”, 光标在部门字段时显示部门名。 ( 提示 : 利用函 数 SYS (18 ) , 该函数 能
返回光标所在字段的名字。)
10 . 利用屏幕生成器生成一个如图所示窗口的对话框。

( 第 10 题图)

11 . 利用屏幕生成器为 SB .DBF 设计 一个选 字段 对话 框 , 可 以用 按钮 将 字段 从字 段


滚动列表增入到字段选取结果滚动列表 , 也可 以用另一 个按钮 移回 ; 选定确定 按钮后 根
据选取结果显示所有记录。

・ 2 21 ・
第七章   报 表 设 计

    在数据库应用系统中 , 常需把数据处理结果以 报表形式 打印出 来。FoxPro 为处理 报


表提供了专用的报表书写器 ( Report Writer) , 它兼有设计、显示和 打印报表 的功能。但 报
表书写器也非万能 , 某些特殊报表还须直接 编程 方能达 到要 求。本章 首先 介绍必 需打 印
知识 , 然后简介报表编程方法 , 最后重点讨论报表书写器。

7 .1   打 印 基 础

有了打印机并不能马上打印 , 一般在打印前要经历设置打印机驱动程序、准备好打印
机和设置打印选项等准备步骤 , 其中前两步是打印的必要条件。

7 .1 .1   打印准 备

一、设置打印驱动程序
Fox Pro for Windows 的打印有赖于 Windows 中打印机驱动程序的设置。如果要与某
种型号的打印机联机 , 只要在 Windows 中把它设置为默认打印机便可。
例如将 EPSON L Q-1600 K 设置为默认打印机 , 其步骤如下 : 双 击主群组 图标→双 击
主群组窗口中的控制面板图标→双击控制面板窗口中的打印机图标→在打印机对话框中
设置 EPSON L Q-1600 K 为默认打印机 , 并且选定使用打印管理器复选框。
二、准备好打印机
准备打印机包括以下工作 :
(1 ) 用打印电缆连接主机与打印机 , 将打印机电源插头与电源插座连接起来。
(2 ) 打开打印机电源开关。
(3 ) 装好打印纸。
上述工作虽然无须每次打印都做一遍 , 但其中任何一项未做好打印机就无法打印 , 也
即所谓打印机未准备好。通常打印机上有一个联机 ( ON LINE ) 指示灯 , 该指 示灯亮表 示
打印机已准备好。
三、设置打印选项
选定 File 选单的 Print Setup 选项 , 就会 出现如图 7 .1 所示的 打印设置 ( Print Setup)
对话框 , 该对话框包括打印机、纸张和打印方向等三个区和一个选项按钮。
1 . 打印机区 : 该区包括默认打印机单选钮、特殊打印机单选钮及其弹出控制。
选定默认打印机单选钮就是把 Windows 的默认打印 机作为 FoxP ro 打 印机。选定 特
殊打印机表示可从弹出控制中 选择一 个打 印机作 为 FoxPro 打 印机 , 此弹 出 控制 的选 项
可在 Windows 的打印机对话框中安装。
2 . 纸张区 : 该区包括大小和来源两个弹出 控制。前者 用于指定 打印纸 的规格 ; 后 者
・ 2 22 ・
图 7 .1   打印设置对话框

则用于指定送纸方式。
3 . 打印方向区 : 该区中的 纵向 和横 向单 选 钮分 别用 于指 定打 印 方向。 默认 打印 方
向为纵向打印 , 即根据纸张宽度按行打印 ; 若指定横向打印 , 则打印内容将自动转置 90 度
沿纸张长度方向按行打印。对于要打印的图文或报表 , 如果所选纸张宽度不够 , 可以设置
横向打印。
4 . 选项按钮 : 选定 该按 钮 将出 现 选项 对 话 框 , 提 供 控 制打 印 浓 度 和 打印 质 量 等 功
能。

7 .1 .2   打印方 法

第 3 .4 .3 节已经介绍过打印统计图的方法。 FoxPro 的打印方法还有以下几种 : 利用


File 选单的 Prin t 选项打印、利用带 TO PRI N T 子句的命令 打印、把数据 定向到打 印机 打
印和利用报表书写器打印等。本小 节先 讨论前 三种 打印方 法 , 报表 书 写器 留待 第 7 .3 ~
7 .4节介绍。
一、利用选单打印
选定 File 选单的 Print 选项 , 就会出现 如图 7 .2 所 示的 Print 对话 框 , 在该框 的 Win-
dows 弹出控制中提 供了包 括 Command , File, ASCII file 和 Clipboard 等多个 选项 , 可用 来
打印各种内容。现说明如下。
(1 ) 选定 Command 选项可打印 Command 窗口中的内容。
(2 ) 选定 File 选项可打印 ASCII 字符文件或 .DBF 文 件 , 其中 .DBF 文件 将按文本 格
式打印。文件名可在单击 File 按钮后弹出的 P rin t File 对话框中指定 , 也可直接向 File 按
钮下方的文本框键入。
(3 ) 选定 ASCII file 选项可打印 ASCII 字符文件。
(4 ) 选定 Clipboard 选项可打印剪贴板上的内容。
此外 , 如果编辑窗口有一个文 件正 在编 辑 , 则 该文 件名 会 自动 加入 Windows 弹出 控
制 , 该文件也可被选来打印。
・ 2 23 ・
图 7 .2   Prin t 对话框

二、带 TO PRINTER 子句的命令


Fox Pro 的部分命令带有 TO P RIN T ER 子 句 , 该子 句能 使送 到屏 幕的 内 容同 时送 往
打印机打印。例如 :

(1 ) DIR TO PRINT ER & & 打印当前目录中库文件的名字


(2 ) LIST STR UCTUR E TO PRINT ER & & 打印当前库文件的结构
(3 ) LIST TO PRINT ER & & 打印当前库文件的内容
(4 ) TY PE < 文件名 .扩展名 > TO PRI NTE R & & 打印 ASCII 字符文件的内容

三、通过输出定向来打印
?, ??, @ …SAY 等命 令都可 输出数据 , 对 于这类命 令 , Fox Pro 默认数据 输出到 屏幕 ;
若进行打印 , 须先将数据定向输出到打印机 , 然后再将它送到打印端口方能打印。
1 . 输出定向命令
(1 ) 命令格式 :

SE T DEVICE TO SCR EEN | TO PRINT ER | TO FI LE < 文件名 >

该命 令 取 T O P RIN T ER 后 , 能 将 @ … SAY 命 令 的 输 出 定 向 到 打 印 机 ; 取 TO
SCRE EN 则输出定向到屏幕 ; 取 TO F IL E < 文件名 > 则输出定向到指定的文件。例如 :

SE T DEVICE TO PRINT ER       & & @ …SAY 命令的输出定向到打印机


< @ … SAY 命令序列 >
SE T DEVICE TO SCR EEN & & @ …SAY 命令的输出定向到屏幕

(2 ) 命令格式 :

SE T PRINT ER ON | OFF

该命令取 ON 后能将除 @ …SAY 命令以 外的输出 ( 例 如 ? 或 ?? 命 令的输 出 ) 同时 定


向到屏幕和打 印机 ; 取 OFF 后这些 命令的输 出仅定向 到屏幕 , 后 者是 FoxPro 默认 状态。
例如 :
・ 2 24 ・
SE T PRINT ER ON           & & ? 或 ?? 命令的输出定向到屏幕和打印机
< ?、? ? 命令序列 >
SE T PRINT ER OF F & & ? 或 ?? 命令的输出定向到屏幕

为简化输出定向 , FoxPro 提供了 一种 ? ?? 命令 , 它具 有 ?? 命 令的 功能 , 但是 把输 出


定向到打印机。
2 . 打印数据发送命令
命令格式 :

SE T PRINT ER TO [ < 文件名 > [ ADDI TI VE ]   | < 打印端口 > ]

功能 : 将打印数据发送到文件或打印端口。
说明 :
(1 ) 主机有多个连接外部 设备的 端口 , 打 印以前 打印 机须 与某端 口连 接好。 如果 打
印机接在第一个并行口 , 端口 名应 取 PRN , L PT1 或 L PT1 .DOS。定 向输 出 到打 印机 的
数据一旦发送到该端口 , 打印机即开始打印。
(2 ) 命令中的 < 文件名 > 表示文本文件 , 必须 带扩展 名 , 但 扩展名 不一定 要 .TXT 来
表示。将打印数据存入文件的步骤正与打印相反 , 即应该先指定数据发送到某文本文件 ,
然后才进行数据定向到打印机输出的操作。例如 :

U SE sb
SE T PRINT ER TO sbjg .t xt     & & 指定数据发送到文本文件 SBJG .TXT
SE T PRINT ER ON & & 数据定向到打印机输出
L IST ST RUCT URE & & SB .DBF 的结构存入 SBJG .TXT
SE T PRINT ER OF F
SE T PRINT ER TO & & 恢复 P RN 打印状态

ADDITI VE 子句能使数据添入文本文件已有内容 之后 , 无此子句 则进 行覆盖 文件 的


原有内容。
[ 例 7-1]   打印如图 7 .3 所示的非主要设备的价格。

钻床 5275 .00 元
复印机 10305 .01 元

轿车 151000 .00 元

图 7 .3   非主要设备的价格

* E7-1 .PRG
U SE sb
SE T PRINT ER ON             & & 其后 ? 命令的输出定向到屏幕和打印机
SCA N F OR NOT 主要设备
  ? SUBS(名称 , 1 , 6 ) + ′
∶′+ ST R( 价格 , 11 , 2) + ′元′
  ? REPL ICAT E (′
-′, 20) & & 函数 R EPL ICAT E 返回具有 20 个′
-′的字符串
ENDSCAN
SE T PRINT ER OF F & & 其后 ? 命令的输出只定向到屏幕

・ 2 25 ・
SE T PRINT ER TO LPT 1 .DOS & & 开始打印

7 .2   传统的报表打印设计

常见的报表都具有表格线 , 其打印流程如图 7 .4 所示 , 一般可 分为 初始处 理、打印 表


头、打印标题栏、打印表体、打印 表尾和 结束 处理六 个步 骤 , 其中的 表体 指标 题栏 以下 到
底线的部分。

图 7 .4   传统的报表打印流程

[ 例 7-2]   打印如图 7 .5 所示的主要设备价格表。

主要设备价格表

编 号 名 称 价 格


016-1 车床 62044 .61

016-2 车床 27132 .73


037-2 磨床 241292 .12
100-1 微机 8810 .00

制表部门 : 设备科

图 7 .5   主要设备的价格

* E7-2 .PRG
SE T DEVICE TO PRINT & & 初始处理
@0 , 7 SAY ′
主要设备价格表′FONT ′黑体′, 16 & & 设置表头
@2 , 0 SAY ′                   ′F ONT ′宋体′, 11 & & 设置顶线
@3 , 0 SAY ′ 编 号 名 称 价 格 ′FONT ′
宋体′, 11 & & 设置标题栏

・ 2 26 ・
U SE sb
i=4
SCA N F OR 主要设备
  @ i , 0 SAY ′ ′FON T ′宋体′, 11 & & 设置行间隔线
  @ i + 1 , 0 SAY ′ ′+ SPACE (1 ) + 编号 + ′ ′+ 名称 + ′ ′+ STR (价格 , 10 , 2 ) + ′ ′;
              FONT ′
宋体′, 11 & & 设置一行内容
 i=i+2
ENDSCAN
@i , 0 SAY   ′                     ′FONT ′
宋体′, 11 & & 设置底线
@i + 1 , 16 SAY ′制表部门 : 设备科′FO NT ′宋体′, 10 & & 设置表尾
SE T DEVICE TO SCR EEN & & 结束处理
SE T PRINT ER TO LPT 1 .DOS

对本程序作三点说明 :
(1 ) 表格线由制表符组成 , 表 7 .1 列出了一部分制表符 , 利用它们可组成细线表格。
表 7 .1   部分制表符的区位码

0904 0906 0916 0920 0924 0928 0932 0940 0948 0956 0964

— | 皃 皅 +

    (2 ) 表体的行间隔线与相应的行内容一起常用循环结构处理。 在标题栏 和行内容 中


应插入列间隔符“ | ”。
为使表格竖线上下对齐 , 相邻行的对应列 制表 符能接 合 , 相邻 行格 宽必须 一致 , 本 例
编号列格宽均为 6 个字符 , 否则打印时列制 表符 就会错 位。上 下列能 否对 齐还受 中文 平
台及中文大小 的影 响 , 在 Windows 3 .2 下 , 采用宋 体 11 点 或 12 点 大小 竖线 能够 上下 对
齐。
(3 ) @ …SAY 命令将根据行、列坐标在纸上定 位打印 , 故 程序 中所有 @ … SAY 命 令
的行坐标取值依次增加。必须注意 , 一旦行坐标由大变小将引起走纸换页。例如 :
@5 , 0 SAY …         & & 在当前页第 5 行输出
@4 , 0 SAY… & & 换页后在第 4 行输出

7 .3   报表书写器的基本操作
报表书写器是 FoxP ro 提供的一种制表辅助工具 , 具有报表设计、显示和打印等功能。
与屏幕生成器不同 , 它不需要生成报表程序便可打印 , 故称为报表书写器而不叫做报表生
成器。本章将用两节介绍这一工具的用法。本节 先讲 它的 基本操 作 , 下节 说明它 的高 级
操作。报表书写器的基本操作包 括 : 打 开报 表设 计窗口、快 速建 立报表、报 表 页面 预览、
保存报表定义和打印报表等内容。

7 .3 .1   打开报 表设计窗 口

报表设计窗口打开后 , 在 FoxP ro 系 统选 单中 将临 时增 加 Report 和 Object 两 个选 单


・ 2 27 ・
项 , 它们与报表设计窗口相互配合 , 组成设计与打印报表的方便的工具。
与屏幕设计窗口相似 , 报表设计窗口能以命令和选单两种方式来打开。
一、命令方式打开
通常使用命令 MODI FY RE PORT < 报 表文 件名 > , 报 表文 件 的扩 展名 为 .F RX , 但
命令中允许缺省。例如往命令窗口键 入命 令 MODIFY RE PORT SBJGB , 就会出 现标 题
为 sbjgb .frx 的报表设计窗口 ( 参 阅图 7 .8 ) 。如 果是 新 建的 报表 文件 则该 窗 口内 部是 空
的。
二、选单方式打开
方法与打开屏幕设计窗口相似 ( 见第 6 .1 .2 节 ) , 只 须把有 关步骤中 的 Screen 单选 钮
改为 Report 单选钮就可以了 , 这里不再细述。
如图 7 .8 所示报表设计窗口中含有一个工具箱和若干个报表分区。工具箱在报表设
计窗口的左侧 , 其中包含用于建立与编辑报表对象的六种工具 , 详见第 7 .4 .3 节。报表设
计窗口常分成 若 干 部 分 来 安 置 报 表 对 象 , 每 一 部 分 称 为 一 个 报 表 分 区 , 图 7 .8 中 包 含
Page Header, Detail 和 Page Footer 等三个报表分区 , 最多时可有七种报表分区 , 详见第 7 .
4 .2 节。
在 Report 和 Object 两个临时选单中 , Object 选 单的 用法 与 第 6 .3 .2 节 一致 , 因此 不
再说明。Report 选单如图 7 .6 所示 , 它共 有 9 个 选项 , 其 中 Show Position , Ruler/ Grid 和
Snap to Grid 等三个选项的用法请参阅第 6 .3 .1 节 , 其余选项将在以下各节陆续讨论。

图 7 .6   Repor t 选单的选项

7 .3 .2   快速制 表

类似于快速屏幕生成 , 设计一个报表一般也从快速制表开始 , 然后按实际需要来修改


报表定义。从图 7 .6 可见 , Quick Repor t 是 Repor t 选单的 最后一 个选项 , 如果 选定 Quick
Repor t 前未打开库文件 , 系统将出现一个 Open 对话框 , 供用户指定要打开的库文件。
[ 例 7-3]   利用 快速 制表 功能为 SB .DBF 设 计一 张包括 编号、名 称和 价格三 栏的 报
表。
・ 2 28 ・
(1 ) 打开报表设计窗口 : 往命令窗口键入命令 MODI FY RE PORT SBJGB , 使屏幕 上
出现报表设计窗口 ( 参阅图 7 .8 ) 。
( 2) 启 动 快 速 制 表 : 在 Repor t 选 单 中 选 定
Q uick Report 选项。如果事 先已打 开 库文 件 SB .
DBF , 即会出 现 如图 7 .7 所示 的 Q uick Report 对
话框 ; 否则将先出 现 Open 对 话框 , 待 用户 打开 库
文件后再出现快速制表对话框。
(3 ) 设 置快 速 报表 属 性 : 选 定 Quick Report
对话 框 的 Fields 复 选 框→ 在 Field Picker 对 话 框
中依次挑选编号、名称 和价 格 等三 个字 段→ 选 定
OK 按钮返回 Quick Report 对话 框→ 选定 OK 按
钮返回报表设计窗口。

图 7 .7   快速报表对话框 定义快速报表后的报表设计窗口如图 7 .8 所
示。在该窗口的 Page Header 分区 依 次列 出了 编
号、名称和价格等三个字段标题 ; Detail 分区对应上 述三个 字段标题 依次列 出的每 个字 段
区 , 用来代表不同记录的字 段值 ; 而 Page Footer 分区 则分 别产 生了 表示 日期 的 DA T E( )
区、表示页号的 page 标题和 PAGE NO 区。DAT E ( ) 区定义 了输出 表达 式日 期函数 ; 关 于
页号的两个对象在分区的右端 , 可使用水平滚动条来观察。 PAGENO 区定义 了输出表 达
式系统内存变量 - PAGENO。

图 7 .8   设备价格表报表设计窗口

注意 : 快速制表 仅 当 报 表 设 计 窗 口 中 的 Detail 区 是 空 的 时 候 才 能 进 行 , 因 为 此 时
Q uick Report 选项方允许被选择 , 否则它将以淡色显示。
(4 ) 保存报表定义 : 选定 File 选单 的 Save 选项 , 再 选定 保存 环境 信息 确 认框 的 Yes
按钮 , 将产生报表文件 SBJGB .F RX 及其备注文件 SBJGB .FR T。备注文件与 其报表文 件
的主名相同 , 扩展名为 .F RT。保存报表定义也有多种方法 , 情况与保存屏幕定义相同 , 此
不赘述。
至此 , 本例要求的报表已设计完毕 , 接下来就可进行页面预览和报表打印了。详见第
7 .3 .3 节和第 7 .3 .4 节两个小节。
・ 2 29 ・
7 .3 .3   页面预 览

报表书写器通过 Report 选单提供了报表页面预览功能 , 使用户 可在屏幕 上观察报 表


的设计效果。页面预览的屏幕显示与打印结 果完全 一致 , 具 有所 见即所 得的 特点。制 作
报表时常需在报表设计和页面预览这两个步骤 间多次 反复 , 直 至将报 表修 改到完 全符 合
要求后才去打印。
例如 , 当例 7-3 的第 (3 ) 步 完成 后 , 只 须选 定 Report 选 单 的 Page P review 选项 ( 见 图
7 .6) , 就会出现如图 7 .9 所示的 Page Preview 对话框 , 其中显示了例 7-3 所设计的报表页
面。
由图可见 , 页面预览对话框含有一个滚动 列表、五 个功 能按钮 和一 个数码 器 , 现说 明
如下。
(1 ) 滚动列表 : 用于显示报表页面。
(2 ) Next 按钮 : 显示下一页。
(3 ) Preview 按钮 : 显示前一页。
(4 ) Page 按钮和数码器 : 数码器用于确定要显示 页的页号 , 按 Page 按钮 将显示数 码
器指定的页。
(5 ) Zoom In 按钮 : 用于将页面拉近 , 起放大作用 , 以便 看清细节。 图 7 .9 就是选 定
Zoom In 按钮后的情形。
(6 ) Zoom Out 按钮 : 用于将页面推远 , 以便观察整个页面。

图 7 .9   页面预览对话框

・ 2 30 ・
7 .3 .4   报表打 印

在屏幕生成器中 , 屏幕设计好后还须生成程序 , 待运行程序时才出现所需的屏幕。报


表书写器则不同 , 它在报表设计好后即可打印 , 没有生成程序的步骤。
Fox Pro 提供命令和选单两种方式来打印报表。
一、命令方式打印报表
命令格式 :

REPOR T [ FORM < 报表文件名 > ] [ ENVIRON MENT ] [ < 范围 > ] [ FOR < 逻辑表达式 > ]
  [ HEADIN G < 字符表达式 > ] [ NOEJECT ] [ NOCONSOLE ] [ PLAIN]
  [ PREVI EW] [ TO PRINT ER [ PROMPT ] ] [ S UM MARY ]

功能 : 打印或显示报表。
说明 :
(1) FORM 子 句 : 该 子 句 的 < 报 表 文 件 名 > 指 出 要 打 印 的 报 表 , 默 认 扩 展 名 为
.FRX。
(2 ) EN VIRON ME N T 子句 : 用于恢复储存在报表文件中的环境信息 , 供打印使用。
(3 ) HEADI NG 子句 : 该子句 < 字符表达式 > 的值作为页标题打印在报表的每一 页
上。
(4 ) NOEJECT 子句 : 使打 印 机从 当 前位 置 开始 打 印 , 无 此子 句 则 在新 页 上开 始 打
印。
(5 ) NOCONSOLE 子句 : 在打印报表时禁止报表内容在屏幕上显示。
(6 ) PLAIN 子句 : 限制用 HEADI NG 子句设置的页标题仅在报表第一页中出现。
(7 ) PREV IEW 子句 : 报表输出目的是页面预览 , 不进行打印。
(8 ) TO PRI NT ER 子 句 : 指定报 表输 出到 打印机。 若带有 P ROMP T 选 项 , 打印 前
将出现打印对话框 , 供用户指定打印份数、打印页号等要求。
(9 ) SU MMARY 子句 : 指定打印 Summary 分区的内容 , 此时不打印 Detail 分区的 内
容。
例如 , 在例 7-3 中所定义的报表便可用下面的命令进行打印或页面预览 :

REPOR T F OR M sbjgb ENV IRON MENT TO PRINTE R     & & 打印


REPOR T F OR M sbjgb ENV IRON MENT PREVI EW & & 页面预览

二、选单方式打印报表
1 . 利用 Run 选单的 Report 选项打印
选定 Run 选单的 Report 选项后 , 在 Open 对话框中选择一个报表文件 , 然后便可在如
图 7 .10 所示的 Run Report 对话框中确定预览或打印从而输出报表。
如果打印例 7-3 所定义的报表 , 则操作步骤如下 :
选定 Run 选单的 Report 选 项→ 在 Open 对 话 框中 选 定报 表 文 件 SBJGB→ 选 定 Run
按钮→在 Run Report 对话框中选定 To Prin t 单选钮 ( 参阅图 7 .10 ) →选定 Run 按钮。
2 . 利用 Database 选单的 Repor t 选项打印
・ 2 31 ・
选定 Database 选 单 的 Report 选 项 即 出
现 Report 对话框 ( 参阅图 7 .1 1) 。
系统默 认 Page Preview 复 选 框 被选 定 ,
若要打印报 表 可先 取消 该复 选框 的 选定 , 然
后选定 To Print 复选框。如果报表设计窗口
事先已打开 , 选定 OK 按钮就可输出 报表 , 否
则须在 Form 按 钮右侧 的文本框 中键入报 表
文件名。
图 7 .10   输出报表对话框
Repor t 对 话 框 初 始 时 没 有 Out put Op-
tions 和 Criteria 区 , 选定其中的 More 按钮后才出现这两个区。因为该对话框 的多数选 项
与 RE PORT 命令的子句具有对应关系 , 这里不再一一解释这些选项。

图 7 .11   报表对话框

7 .4   报表书写器的高级操作
上节的内容已经覆盖了报表打印过程中各个环节的操作。但由于 Quick Report 的功
能比较简单 , 所设计的报表其形式也比较 单调。为 了设 计更复 杂的 报表 , 美 化报表 外观 ,
报表书写器还提供了一组高级功能 , 用于改进报表的设计 , 本节将择要介绍。

7 .4 .1   设置页 面布局

页面布局功能由 Report 选单的 Page Layout 选项提供 , 用于对纸张 打印区域、多栏 打


印、打印选项、报表环境信息和报表文本字体等多种要求进行定义。选定该选项会出现如
图 7 .12 所示的 Page Layout 对话框 , 现说明如下。
1 . Page layout 矩形域
・ 2 32 ・
图 7 .12   页面布局对话框

用来显示页面布局 , 其外周为深色边框 , 内部的白色区域表示一页纸张。


2 . Print Area 区
Printable Page 单选钮 : 表示“纸 张”留 出一 定的 边 距后 打印 , 范围 由 打印 设 置 ( Print
Set up) 确定。
Whole Page 单选钮 : 用来表示将整个“纸张”作为报表打印区域。
3 . Columns 数码器区
Columns 数码器用于设定每页报表的栏数。若数码器取值为 2 “
, 纸张”打印范围中间
会出现竖线 , 表示页面分二栏打印。
Columns 数码器下面还有三个数码器 , 分别用于调整左边距、栏宽和栏距。
Dimensions 区中有两个单选钮 Inches( 英寸 ) 和 Cm( 厘米 ) , 用于选择以上 3 个数码 器
的单位长度。
4 . Print Order 区
本区包含左右两个图形按钮 , 用来在多 栏打 印时确 定打 印内 容排列 的方 向。选定 左
按钮打印内容将按纵向逐栏排列 , 而选定右 按钮 打印内 容则 按横 向逐行 排列。系 统默 认
左按钮有效 , 假如此时一页设置两栏 , 报表在第一栏打印不完的记录将在第二栏打印。
5 . Print Setup 按钮
用来设置打印选项 ( 参阅第 7 .1 .1 节第三点 ) 。
6 . Environment 按钮
选定此 按钮 会出 现 Environment 对话 框 , 其中包 含 Save, Restore, Clear , Cancel 等 按
钮 , 前三个按钮分别用来保存 , 恢复或清 除环 境。该对 话框 已在第 6 .3 .1 节 介绍 , 那时 保
存环境是执行屏幕程 序的 需 要 , 报表 书写 器虽 不生 成 程序 , 但 页面 预览 或 打印 均与 环 境
・ 2 33 ・
有关。
7 . Fon t 按钮
用于打开 Fon t 对话框 , 为增加的报表对象设置缺省的字体、字形和大小。

7 .4 .2   设计报 表分区

报表书写器支持多页报表 , 一页中可包括一个或多个数据组 , 而且每页可有页头和页


脚 ; 每组可有组头和组脚 ; 整套报表还可有一个标题和一个摘要。这些要求将通过报表分
区设计来实现。报表设计窗口中允许有七种类型 的报 表分 区 , 相同的 报表 对象安 置在 不
同的分区其输出效果不一样。表 7 .2 列出了分区的产生方法及作用。

表 7 .2   报表分区的建立及作用

分区名称 分区产生与删除 对象打印周期 对象打印位置

Title( 标题 ) Repor t 选单的 Title/ Summary 选项 整套报表一次 最先 , 可占一页

Page Header (页头 ) 默认存在 每页一次 标题后 , 页初

Group Header(组头 ) Repor t 选单的 Group 选项 每组一次 页头、组头或组脚后

Detail (细节 ) 默认存在 每记录一次 页头或组头后

Group Footer(组脚 ) 默认存在 每组一次 细节后

Page Footer( 页脚 ) Repor t 选单的 Group 选项 每页一次 页末

Summary( 摘要 ) Repor t 选单的 Title/ Summary 选项 整套报表一次 页脚前 , 可占一页

一、基本分区
报表设计窗口一旦打开 , 窗内 已含 有 Page Header , Detail 和 Page Footer 等三 个基 本
分区。
(1 ) Page Header 分区 : 该分区位于 Page Header 标 题行上方 , 可用 于设 置报表 名称、
字段标题以及需要的图形。
(2 ) Detail 分区 : 该分区包括从 Detail 标题行 到在它上 方的相邻 标题行 之间的 区域。
设置在该区的对象能多次打印。若列入字段对象 , 就能依次打印库文件的记录 , 这相当于
用循环程序打印循环体中的数据。
当记录较多或 Detail 分区高度较大 以至 一个 页面容 纳不 下时系 统会 输出 多个 页面 ,
即能自动产生多页报表。此时可以系统内存 变量 - PAGENO 作为 报表 对象 , 自动 计数 来
表示页号。
( 3) Page Footer 分区 : 包括从 Page Footer 标题行到在它上方的相邻标题行之间的区
域。该分区的内容打印在所设定纸 张的 最后 , 用于 打印 每页 的一般 信息 , 系 统默 认在 该
处打印制表日期、页号等信息。如果不想在页末打印任何内容 , 可将对象移走或删除。
二、调整分区高度
快速制表产生的报表分区 , 其 高度仅 能容 纳一 个对象 , 报 表书 写器允 许 调整 分区 的
高度 , 从而进行增减对象、放大缩小对象或留出空行等操作。
・ 2 34 ・
(1) 粗调法 : 将 鼠 标移 至 某分 区 标题 行 左 端的 按 钮处 , 会 出 现一 个 上 下 双 向箭 头。
此时向上或向下拖曳按钮 , 分区高度就会随之变化。
(2) 微调法 : 双 击 某标 题 行左 端 按钮 , 可打 开 一 个供 用 户 调 整分 区 高 度 的 对话 框。
例如双击 Detail 标题行左端的按钮就能打 开 Detail 对话 框 ( 参阅 图 7 .13 ) , 其中 的 Heigh t
数码器用于指定细节分区 的高 度。 In 和 Cm 两 个单 选 钮分 别表 示高 度单 位 为英 寸或 厘
米。

图 7 .13   细节对话框

[ 例 7-4]   在例 7-3 所制报表的基础 上 , 设计 如图 7 .14 所 示具有 表格 线的设 备价 格


表。
设备价格表

编 号 名 称 价 格

016-1 车床 62044 .61

016-2 车床 27132 .73

037-2 磨床 241292 .12

038-1 钻床 5275 .00

100-1 微机 8810 .00

101-1 复印机 10305 .01

210-1 轿车 151000 .00

图 7 .14   设备价格表

(1 ) 复制报表文件 : 往命 令窗 口键 入命令 MODIFY RE PORT SBJGB→ 选定 File 选


单的 Save As 选项→在 Save As 对 话框 的 Save Report As 文 本框 中键 入 SBJGB1 .F RX→
选定 Save 按钮 , 报表文件 SBJGB1 .F RX 即被复制并打开。
用该方法来复制 , 在复制 .F RX 文件的同时也复制了 .F RT 文件 ; 如果 用 COPY F IL E
命令来复制则须分别复制这两个文件。
(2 ) 调整各报表分区的高度 : 通过粗调或微调将各分区调整至如图 7 .15 所示高度。
(3 ) 移动报表对象 : 首先减小垂直跳格距离 , 即 , 选定 REPOR T 选单的 Ruler/ Grid 选
项→将 Ruler/ Grid 对话框 ( 参阅图 6 .3 0) 中 V 数码器的值减小到 3 ; 然后将标 题和字段 区
移到如图 7 .15 所示位置。
(4 ) 建立表名 : 选定文本对象定义工具 ( 参阅下节表 7 .3) →在 Page Header 分区选定
・ 2 35 ・
图 7 .15   报表设计之一

起始位置后键入文本“ 设 备 价 格 表”→选定 Object 选单的 Fon t 选项→在 Font 对话框中


选定宋体、大小为 18 点。
(5 ) 画表格线 : 选定直线对象定义工具 ( 参阅 下节 表 7 .3 ) , 然后 按图 7 .15 所 示位 置
画出水平线和垂直线。为使读 者看 清所 画的 线 , 图 中故 意使 用 了粗 线条 ( 在 O bject 选 单
Pen 选项的弹出选单中选定“4 Point”) , 实际制作时可为细线。
注意 , 这里在 Detail 分区用矩形框来表示表格行间隔线 , 循环打印时仅当 上一矩形 框
的下水平线与下一矩形框的上水平线恰巧重 合 , 方能得 到合 格的 表格。若 页面预 览时 发
现间隔线未 完全重 合 , 须 对 Detail 分区的 高度进行 微调。这 种方法不 妨称为行 间隔线 重
合法。
(6 ) 保存报表定义 : 选定 File 选单 的 Save 选项 , 再 选定 保存 环境 信息 确 认框 的 Yes
按钮 , 即可产生报表文件 SBJGB1 .F RX 及其备注文件 SBJGB1 .FR T。
(7 ) 报表输出 : 可通过页面预览或报表打印来 获得如图 7 .14 所示的 设备价格 表 , 步
骤从略。
若要按条件输出记录 , 不必改动报表设计 , 通过编程就可达到目的。例如打印只含主
要设备的价格表 , 可在下面两组命令中任选一种 :

(1 ) R EPORT FORM sbjgb1 ENVIRON MENT FOR 主要设备 TO PRINT


(2 ) USE sb
SET FIL TER TO 主要设备
R EPORT FORM sbjgb1 TO PRINT
SET FIL TER TO

三、Title 与 Summary 分区
选定 Report 选单 的 Title / Summary 选 项 , 将 出 现如 图 7 .16 所 示 的 Title/ Summary
・ 2 36 ・
对话框 , 利用此框可在报表设计窗口增删 Title 分区或 Summary 分区。
1 . Title 分区
若选定 Title/ Summary 对 话 框中 Re-
por t Title 区 的 Title Band 复 选 框 , Page
Header 分 区 上 方 就 会 增 添 一 个 Title 分
区。对于任何 报表 文件 , Title 分区 的内 容
最先打印且仅 打印 一次 , 一般 用 来设 置 报
表的总标题或设计报表封面。
选定 Report Title 区的 New Page 复选
框 , 则 在 打 印 Title 分 区 内 容 后 将 换 打 新
页。
2 . Summary 分区
图 7 .16   标题与摘要对话框
若选定 Report Summary 区中的 Sum-
mary Band 复选框 , 会在 Page Footer 分区下方添加一个 Summary 分区。对于任何报表 文
件 , 该分区的 内容也仅 打印一 次 , 并且在 Page Footer 分 区打印之 前 , 紧接在 Detail 分 区
的输出之后打印。该分区一般用来打印统计数据 , 也可用于打印单页表格的底线。
选定 Report Summary 区的 New Page 复选框将换用新页打印 Summary 分区的内容。
若要从报表设计窗口取消 Title 分区或 Summary 分区 , 只需取消对 Title Band 复选框
或 Summary Band 复选框的选定即可。
[ 例 7-5]   在例 7-3 所制报表的基础上 , 利用 Summary 分区制作具有表格线的表格。
制作步骤与例 7-4 基本一致 , 以下仅列出不同之处 :
(1) 复制 报 表 文 件 : 从 SBJGB .F RX 复 制 报 表 文 件 , 新 报 表 文 件 取 名 为 SBJGB2
.FRX; 同时还应复制 .F RT 文件。复制好后打开 SBJGB2 .F RX。
(2 ) 增加 Summary 分 区 : 选定 Report 选 单的 Title / Summary 选 项→ 在 Title/ Sum-
mary 对话框中选定 Summary Band 复选框。
(3 ) 画制表格线 : 如图 7 .17 所示。
本例利用 Summary 分 区 打 印 表 格 底 线 , 其 制 作 原 理 与 编 程打 印 报 表 一 致 ( 参 阅 图
7 .4) 。这种方法避免了行间隔线 重合法 中微 调 Detail 分区 高度的 麻烦 , 但 是它只 适用 于
制作单页报表 , 而行间隔线重合法则可用来制作多页报表。
四、数据分组与 Group Header/ Group Footer 分区
打印分类表、汇总表等报表 ( 如考生按成绩分 类 , 企事 业单 位按部 门或 按小组 来打 印
工资单等 ) 需先将数据分组 , 然后设计报 表。数 据分组 必须 定义组 表达 式 , 组表达 式为 字
段表达式。表达式 确 定 后 , 报 表 设 计 窗 口 中 将 同 时 增 添 用 来 定 义 组 头 和 组 脚 的 Group
Header 分区和 Group Footer 分 区。组 表达 式能 按表 达 式值 相同 的原 则 把库 文 件的 记 录
分成几类 , 每一类数据将根据 Detail 分区安置的对象来打印 , 并在打印前加上组头 , 打印
后加上组脚。但须注意 , 通 常组 表 达式 需要 进行 索引 或 排序 , 否 则不 能 保证 正 确分 组 打
印。
1 . Data Grouping 对话框
・ 2 37 ・
图 7 .17   报表设计之二

数据分组由 Repor t 选 单 的 Data Grouping 选 项 来 支 持 , 选 定 该 选 项 就 会 出 现 Data


Grouping 对话框 ( 参阅图 7 .20 ) , 现说明如下。
(1 ) Add 按钮 : 用于添加组表达式 , 选定 它后会 弹出一个 Group Info 对话 框 ( 参阅 图
7 .19 ) , 利用该对话框的 Group 按钮及其文本框即可定义组表达式。
定义好表达式返回 Data Grouping 对话 框后 , 该 表达式 已显 示在 Group 滚动列 表中。
选定 OK 按钮关闭 Data Grouping 对话框后 , 报表设计窗口中就添入了 Group Header 分区
和 Group Footer 分区 ( 参阅图 7 .21) , 并在分区标题行上标出了所定义的表达式。
(2 ) Group 滚动列表 : 用于显示已定义的组表达式和改变组间嵌套的次序。
一个组表达式定义了一个组 , 一个报表文件最多可定义 20 个组。这些组以嵌套方式
组织 , 即某组的下一组是它的子组。嵌套次序与 Group 滚动列表中组表达式 的排列顺 序
一致 , 滚动列表中第一个 组位 于 嵌套 的最 外层 , 拖 曳 组表 达式 左边 的按 钮 可改 变排 列 次
序。
(3 ) Change 按钮 : 选定它后将弹出一 个 Group Info 对 话框 , 以便 修改 Group 滚动 列
表中选定的组。
(4 ) Delete 按钮 : 用于删除 Group 滚动列表中已选定的组。
2 . Group Info 对话框
Group Info 对话框可通过选定 Data Grouping 对话框的 Add 按钮或 Change 按钮来打
开 ; 在报表设计窗口双击组头分区或组脚分区标题行左边的按钮也能打开该对话框 , 而且
其中增加了关于组分区高度的选项。
前已提到 , 该对话框的 Group 按钮及其文本框都可用于定义组表达式 , 现再对该对话
框中 When Group Changes , Begin 区的三个复选框的作用说明如下。
(1 ) New Column 复选框 : 选定该复选框能使不同的组表达式值在不同的栏打印。
・ 2 38 ・
( 2) New Page 复选框 : 选定该复选框能使不同的组表达式值在不同的页打印。如果
有 N 种组表达式值则将打印 N 页 , 这为用户提供了一种设计多页报表的方法。
(3 ) New Page ( Page No . = 1) 复选框 : 组表达式的值改变时将页号置为 1。
[ 例 7-6]   打印如图 7 .1 8 所示的设备大修分类表。
    (1 ) 为了 DX .DBF 能以编号分组 , 先建立其索引标识 : 设备大修分类表
设备编号 : 016-1
U SE C∶ \ F OXPROW \ DX
INDE ON 编号 TAG 编号 年月 费用

8911 2763 .5
(2 ) 定 义 快 速 报 表 : 往 命 令 窗 口 键 入 命 令 MODIFY
REPORT DXFLB 打开报表设计窗口→在 Report 选单中选 9112 3520 .0

定 Quick Report 选项→选定 Q uick Report 对话框的 OK 按


设备编号 : 037-2
钮后 , 报表设计窗口中 就出现 编号、年月、费 用 等标 题及 字
年月 费用
段区。
9206 6204 .4
(3 ) 按 编 号 来 分 组 : 选 定 Report 选 单 中 的 Data
Grouping 选项→在 Data Grouping 对话框 ( 参 阅图 7 .20 ) 中 设备编号 : 038-1
选定 Add 按钮→在如图 7 .19 所示 Group Info 对话框 的文 年月 费用
本框中键入 DX .编号 作为 组表达 式→ 选定 OK 按钮 后 , 在 8911 2850 .0
如图 7 .20 所示 Data Grouping 对话框的 Group 滚动列表中
图   7 .18
就添入了组表达式“DX .编号”→选定 OK 按钮关闭
Data Grouping 对话框后 , 报表设计窗口中就添入了编 号组的 Group Header 分区 和 Group
Footer 分区 ( 参阅图 7 .21 ) 。

图 7 .19   组信息对话框

    (4 ) 调整报表分区高度 : 对照图 7 .21 先调整好报表设计窗口中各报表分区所需的高


度 , Group Footer 分区留空一段作为各类设备内容的打印间距。
( 5) 建立、调整报表对象 : 将 Page Header 分区的年月、费用两个字段标题移到 Group

・ 2 39 ・
图 7 .20   数据分组对话框

图 7 .21   设备大修分类表报表设计窗口

Header 分区→编号字段 区从 Detail 分区移 到 Group Header 分区→ 在 Group Header 分 区


键入文本“设备编号 : ”→在 Page Header 分区键入文本“ 设备 大修分类 表”, 并 设置字体 为
宋体、字形为黑体、大小为 12 点。
(6 ) 画表格线 : 用行间隔线重合法来画表格线。

7 .4 .3   定义报 表对象

快速报表能成批产生报表对象 , 利用 工具 箱则 能逐个 建立 报表对 象。定 义报 表对 象


与定义屏幕对象 ( 参阅第 6 .2 .1 小节 ) 的方法 是一 样的 , 但所 用的 对话框 有所 不同。本 小
・ 2 40 ・
节介绍报表对象定义工具及具有代表性的对话框。
一、报表定义工具
工具箱中包含六个报表对象定义工具 , 表 7 .3 列出了它们的名称与作用。

表 7 .3   报表定义工具一览表

对象定义工具 对象的作用 对象属性对话框

文本定义工具 定义各种标题 , 如页头、字段标题等 Text 对话框

字段定义工具 定义输出表达式 , 如字段 Report Expression 对话框

直线定义工具 定义直线 , 如表格线 Rectangle/ Line 对话框

矩形框定义工具 定义矩形框 Rectangle/ Line 对话框

圆角矩形框定义工具 定义画圆角矩形框 Round Rectangle 对话框

图形定义工具 获取图形 Report Picture 对话框

    从表 7 .3 可见 , 报表工 具箱 共有六 种对 话框 , 下 面 只选 Report Expression 对 话框 进


行说明。
二、Report Expression 对话框
该对话框 ( 参阅图 7 .24) 在建 立或 编辑 表达式 对象 时出 现 , 主 要用 于定 义表 达 式 , 为
计算对象指定运算的要求和范围 , 以及确定打印条件等。
(1 ) Expression 按钮 : 用于打开 表达 式构 造器以 设置 一个 表达 式。也 可 直接 在其 右
侧的文本框内键入表达式。
(2 ) Format 按钮 : 用于打开 Format Dialog 对话框以指定表达式的输出格式符。
(3 ) Calculate 复选框 : 用于打开 Calculate Field 对 话框 , 以 便对计 算对 象指定 计算 的
要求和范围 , 下文第三点将详细说明。
(4 ) P rin t When 复选框 : 用于打开 Print When 对话框 , 以指定报表对象打印条件 , 下
文第四点将详细说明。
(5 ) Position Relative To 区的 Top-Field Can Stretch 单选钮 : 用于数据折行打印。当
数据长于字段对象宽度时 , 多余部分将在垂直方向延伸打印。
(6 ) Comment 按钮 : 用于打开 Comment 对话框 , 以便键入注释。
三、Calculate Field 对话框
该对话框 ( 见图 7 .25) 主要由下面两部分组成。
1 . Reset 弹出控制
分组汇总前 , 应先将计算对象的初值恢 复为 零。本弹 出控 制用于 选定 计算对 象的 复
零时刻。
(1 ) End of Repor t 选项 : 表示在报表打印结束时将计算对象复零。
(2 ) End of Page 选项 : 表示在报表每页打印结束时将计算对象复零。
对于一个多页报表 , 假定在 Page Footer 分区已设置了价格字段区。如果 要求每页 价
格分别小计 , 应选择 End of Page, 如要求价格累计到底则应选 End of Report。
・ 2 41 ・
(3 ) End of Column 选项 : 在多栏打印中 , 表示每一栏打印结束时将计算对象复零。
数据分组后组表达式会自动 添入 Reset 弹出 控制 中 , 本 选项 将使 计算 对 象在 组表 达
式值变化时复零。
2 . Calculate 区的各单选钮
这些单选钮用于对当前对象指定数学运算的要求
(1 ) Nothing 单选钮 : 对当前对象不进行计算 , 直接打印表达式值。此为默认选项。
(2 ) Count 单选钮 : 用于计数 , 此时不管当前是什么对象 , 总是返回记录号。拿 例 7-5
来说 , 若价格对象选用此单选钮将依次打印 1~ 7 , 如果将 它安置在 Page Footer 分 区则 打
印 7。表达式 DAT E( ) 在 Page Footer 分区打印 7 , 而安置到 Detail 分区将依次打印 1~ 7。
(3 ) Sum 单选钮 : 用于求和。
(4 ) Average 单选钮 : 用于求平均值。
(5 ) Lowest 单选钮 : 用于求最小值。
(6 ) Highest 单选钮 : 用于求最大值。
(7 ) Std .Deviation 单选钮 : 用于计算标准差 , 标准差也称均方差。
(8 ) Variance 单选钮 : 用于计算方差。
四、Print When 对话框
该对话框 ( 见图 7 .26) 用于指定报表对象的打印条件。现说明如下。
1 . Print Repeated Values 区
选定 Yes 单选钮表示对象总是打印 , 此为默认状态。
选定 No 单选钮仅当能使对象值改变时才打印 , 即禁止打印重复值。在例 7-5 中若对
名称对象选定此单选钮 , 则打印设备名称时第二个设备的名称位置将留空。
2 . Also Print 区
(1 ) In First Whole Band of New Page/ Column 复选框 : 用 于指定 在新 页或新 栏的 第
一个区域里打印。
(2 ) When This Group Changes 复选框 : 选定该复选框 后 , 再在其 右边 的弹出 控制 中
选出一个组 , 则当该组表达式值改变时报表对象才会打印。
(3 ) When Detail Overflows to New Page/ Column 复选框 : 选定该复选框后 , 当 Detail
分区中打印内容已满一页或一栏而换到另一页或另一栏打印时 , 报表对象就会被打印。
3 . Print Only When Expression is True 复 选框 : 选定该 复选框 会出现一 个表达式 构
造器 , 当所构造表达式的值为真时对象才被打印 , 否则不打印。
4 . Remove Line If Blank 复选框 : 如果设置的条件使对象不被打印 , 并且该行又无其
它对象 , 那么选定该复选框就不打印该行 ; 不选定该复选框则打印一个空行。
[ 例 7-7]   打印如图 7 .2 2 所示带有费用合计 的设备大 修表 , 要求 相同 的设备 编号 仅
显示第一个。

・ 2 42 ・
设备大修表

设备编号 年 月 费 用

016-1 8911 2763 .5

9112 3520 .0

037-2 9206 6204 .4

038-1 8911 2850 .0

合 计 15337 .9

图 7 .22   带有费用合计的设备大修表

下面列出操作的主要步骤 , 请读者对照图 7 .23 阅看。

图 7 .23   带有费用合计的设备大修报表设计

(1 ) 定义快速报表 : 往命令窗口键入命令 USE DX 来打开 库文件 DX .DBF→键入 命


令 MODI FY RE PORT DXB 来打 开 报表 设计 窗口 → 在 Report 选 单中 选定 Q uick Report
选项→选定 Quick Repor t 对话框的 OK 按 钮后 , 报 表设计 窗口 中将 出现编 号、年月、费 用
等字段标题及字段区。
(2 ) 增加 Summary 分 区 : 选定 Report 选 单的 Title / Summary 选 项→ 在 Title/ Sum-
mary 对话框中选定 Summary Band 复选框。
(3 ) 调整各报表分区的高度 : 将各分区调整至如图 7 .23 所示高度。
(4 ) 在 Summary 分区建立费用 对象 : 选定 字段 定义工 具→ 单击 Summary 分 区中 间
→在 Repor t Expression 对话框 ( 参阅图 7 .2 4) 中 Expression 按钮右侧的文本框内键入表达
式 DX .费用→选定 Calculate 复选框→ 在 如图 7 .25 所示 的 Calculate Field 对 话框 中选 定
Sum 单选钮→选定 OK 按钮费用对象就出现在 Summary 分区之中。
・ 2 43 ・
图 7 .24   报表表达式对话框

图 7 .25   计算字段对话框

(5 ) 修 改 编 号 字 段 区 : 双 击 编 号 字 段 → 在 Report Expression 对 话 框 中 选 定 Print


When 复选框→在如图 7 .2 6 所示 Print When 对话框中 选定 No 按钮 , 使编 号字段 不打 印
重复的值。

7 .4 .4   报表变 量的应用

报表工具箱的字段定义工具既可以定义 字段 , 也能 定义 表达 式和变 量对 象。快速 报


表产生的 Date ( ) 对象就是一个表达式。定义表达式很简单 , 只要用字段 定义工具 , 在 Re-
por t Expression 对话框中 Expression 按钮右侧的文 本框 内键 入所需 的表 达式就 可。定 义
变量对象时须选用已有的变量 , 包 括可 选用系 统变 量 ( 例 如 - PAGE NO ) 和 事 先由 用户 定
义的变量。本小节主要介绍定义报表变量对象的 方法 , 在 例子 中也串 入了 表达式 对象 的
・ 2 44 ・
图 7 .26   打印条件对话框

定义。
一、用户定义报表变量
Repor t 选单的 Variables 选项用于定义与编辑报表变量。
1 . Repor t Variable 对话框
此框在选定 Report 选单的 Variables 选项时出现 ( 参阅图 7 .2 9) 。现说明如下。
(1 ) Variable 滚动列表 : 用于显示报 表中 已定 义的变 量。拖 曳列 表中 变 量名 左边 的
按钮可改变变量排列的次序。
(2 ) Add 按钮 : 选定该按钮会弹出如图 7 .30 所示的 Variable Definition 对话 框 , 用 来
增加一个变量。
(3 ) Change 按钮 : 选定该按钮也会弹出 Variable Definition 对话框 , 用 来修改 变量 列
表中选定的变量。
(4 ) Delete 按钮 : 用于删除变量列表中选定的变量。
2 . Variable Definition 对话框
选定 Report Variable 对话框中的 Add 按钮或 Change 按钮 都可打开 该对 话框。现 说
明如下。
(1 ) Variable Name 文本框 : 用于键入所定义变量的名字。
(2 ) Value to Store 按钮及文本框 : 用于为变量 赋值 , 可通过 Value to Store 按钮或 直
接在其下方的文本框内键入表达式。
选定 Value to Store 按钮会出 现 Expression Builder 对 话框 ( 参阅 图 7 .31 ) , 若 变量 已
赋值 , 它就会被列入该对话框的 Variables 滚动列表中 , 以供将来构造表达式选用。
(3 ) Initial Value 按钮及文本框 : 用于为变量赋初值 , 初值也可是表达式。
(4 ) Release After Report 复选框 : 报表 变量实 际上 是内 存变量。 该复 选框表 示报 表
打印后报表变量即清除。
Reset 弹出控制和 Calculate 区中的选项前已介绍 , 这里不再重复。

・ 2 45 ・
二、变量对象的定义
变量对象通过字段定义 工具 来 定义 , 定 义时 须调 用 已定 义 的 报表 变 量。步 骤 如下 :
单击字段定义工具→单击报表设计窗口内某处→在 Repor t Expression 对话 框中选定 Ex-
pression 按钮→双击 Expression Builder 对话框 Variables 滚动列表中 某变量→ 选定 OK 按
钮退出 Expression Builder 对话框→选定 OK 按钮 退出 Report Expression 对话 框 , 变量 对
象就出现在报表设计窗口先前单击的地方。
也可将一般的字段对象修改为变 量对象 , 双 击字 段区 就会出 现 Report Expression 对
话框 , 然后便可通过 Expression Builder 对话框选用变量。
[ 例 7-8]   打印如图 7 .27 所示的设备役龄表 , 该表按是否主要设备来分页 , 部门要打
印汉字 ; 左端还要加上序号列。

非主要设备役龄表

97/ 09/ 07 第1页


序号 编号 名称 部门 役龄
1 038-1 钻床 三车间 10
2 101-1 复印机 设备科 8
3 210-1 轿车 办公室 5

主要设备役龄表

97/ 09/ 07 第2页


序号 编号 名称 部门 役龄
4 016-1 车床 一车间 10
5 016-2 车床 一车间 8
6 037-2 磨床 二车间 10
7 100-1 微机 设备科 3

图 7 .27   设备役龄表

下面列出操作的主要步骤 , 请读者对照图 7 .28 阅看。


( 1) 设置 环境 : 往 命 令 窗 口 键 入 命 令 SE T V IEW TO SBBM 来 打 开 V IEW 窗 口 ,
SBBM .V U E 由例 3-10 产生 , 它保存了 SB .DBF 与 BMDM .DBF 的关联。由 于第 ( 6 ) 步 要
按主要设备分组 , 还须为主要设备字段建立索引。
(2 ) 定义快速报表 : 键入命令 MODI FY RE PORT SBYLB 来打开报表设计窗口→ 在
Repor t 选单中选定 Q uick Report 选项→选定 Quick Report 对话框中的 Fields 复选框→在
Fields Picker 对话框中挑选编号、名称、部门三个字段。
( 3) 定义报表变量 XH: 选定 Repor t 选单的 Variables 选项→选定如图 7 .2 9 所示 Re-
por t Variable 对话框的 Add 按钮→在如图 7 .3 0 所示 Variable Definition 对话框的 Variable
Name 文本框中键入 变量名 XH , 在 Value to Store 下方 的文本框 中键入表 达式 XH + 1 →
选定 OK 按 钮 , 再 选 定 OK 按 钮 返 回 报 表 设 计 窗 口 后 , 报 表 变 量 XH 将 在 Expression
Builder 对话框的 Variable 滚动列表中出现。
(4 ) 建立 XH 变 量 对 象 : 选 定 字 段 定 义 工 具 → 单 击 Detail 分 区 左 部 → 选 定 Report
・ 2 46 ・
图 7 .28   设备役龄表报表设计窗口

图 7 .29   报表变量对话框

Expression 对话框中的 Expression 按 钮 → 在如 图 7 .31 所 示 Expression Builder 对话 框 的


Variable 滚动列表中双击报表变量 XH→选定 OK 按钮 , 再选 定 OK 按钮返回 报表设计 窗
口后 , XH 变量对象已建立。
(5 ) 建立计算役龄 的 表 达式 对 象 : 选 定字 段 定 义 工 具 → 单 击 Detail 分 区 右 部 → 在
Repor t Expression 对话框中 Expression 按钮右侧的文本框内键入表 达式 ( DA TE ( )-SB .启
用日期 )/ 365→在 Format 按钮右侧的文本框内键入模式符 99。
(6 ) 按 主 要 设 备字 段 来 分 组 : 选 定 Report 选 单 中 的 Data Grouping 选 项 → 在 Data
Grouping 对话框中选定 Add 按钮→ 在 Group Info 对 话框的 文本 框中 键入 主 要设 备作 为
组表达式 , 并选定 New Page 复选框→选定 OK 按钮 , 再选定 OK 按钮返回报表设计窗口 ,
其中已增添了主要设备组的 Group Header 分区和 Group Footer 分区。
(7 ) 建立表名 : 在 Page Header 分 区键 入文本“ 主要设 备役 龄表”→选 定 字段 定义 工
具→单击“主要设备役龄表”左方→在 Report Expression 对话框中 Expression 按钮右侧 的
・ 2 47 ・
图 7 .30   变量定义对话框

图 7 .31   含有用户定义变量的表达式构造器

文本框内键入表达式 II F( 主要设备 ,″″,″非″) →选定 OK 按钮返 回报表设 计窗口 后 , 建 立


了能打印空字符或文本“非”的表达式对象→设 置关于 表名 的两个 对象 的字 体为宋 体、字
形为粗体形、大小为 18。
( 8) 处理日期和页号 : 将 Date( ) 对象和 - PAGE NO 对象移到 Page Header 分区→在 -
PAGE NO 对象左方键入文本“第”, 右方键入文本“ 页”。
建立序号、役龄字段标题等操作不再叙述 , 读者可自行补充完整。
・ 2 48 ・
顺便提一下 , FoxPro 不仅支持设计和打印报表 , 也 支持设 计和打印 标签。例 如 , 使 用
MODIFY LABE L 命令可打开标 签设 计窗 口 , 使 用 LABE L FORM 命 令 可显 示 或打 印 标
签 , 等等。标签形式简单 , 应用灵活 , 通常用交互操作的方法生成 , 但在应用程序中很少使
用。为节省篇幅 , 本书不再介绍。

习   题
1 . 将 ZZ .DBF 的所有记录插入已存在的文本文件 SBJG .TXT 的内容之前。
2 . 修改程序 E7 - 2 .P RG , 要求表头自动居中。
3 . 以第 7 .3 .4 节指出的 Report 命 令格式 为准 , 列 出其中 的 子句 与图 7 .11 所 示 Re-
por t 对话框中对象的对应关系。
4 . 如果用 Environmen t 对话框的 Clear 按钮 清除 了先 前 保存 的环 境 , 怎 样才 能运 行
屏幕程序 ? 怎样才能打印报表 ?
5 . 如果仅有少数记录要打印 , 又要使打印内容在所选纸张上居中 , 应如何设计报表 ?
6 . 根据 SB .DBF 设计并打印报表 , 要求 :
(1 ) 包括编号、名称两个字段。
(2 ) 报表应有两个栏 , 打印内容按横向排列。
7 . 用以下两种方法打印有表格线的设备增值表。
(1 ) 编程序。
(2 ) 用报表书写器来实现上述要求。
8 . 先后以主要设备和部门建立组 , 以设备编号为组标题 , 并在组标 题旁设置 页号 , 试
设计设备价格表。
9 . 根据 SB .DBF 和 ZZ .DBF 打印如下表格 , 并要求
(1 ) 若某设备无增值在增值位置应为空白。
(2 ) 每页打印三行 , 若最后页不满三行则以空行补足。

设 备 现 值 表
年  月   日 第   页    共   页
编 号 名 称 价 格 增 值 现 值

累   计

( 第 9 题图)

・ 2 49 ・
第八章   选 单 设 计

    Fox Pro 支持设计多种选单 , 第四 章已经 讨论 了光 带选 单 和全 屏幕 选单 的设 计 , 本 章


将继续介绍当前流行的下拉式选单和弹出式 选单的 设计 方法。下 拉式 选单应 用很 多 , 用
命令编制程序又比较麻烦 , 为此 Fox Pro 提供了选单生成器 , 通过交 互操作就 可方便地 生
成下拉式选单。
弹出式选单可以是下拉式选单 的一部 分 , 但也 可独立 显示 , 本 章将介 绍 用命 令设 计
独立的弹出式选单的方法。

8 .1   下拉式选单设计

8 .1 .1   选单生 成器组成 和基本操作 步骤

    与屏幕 生 成 器 类 似 , 选单 生 成 器 也 包 括 选 单 构 造 器 ( Menu Builder ) 和 程 序 生 成 器


( Generate ) 两个部分 , 前者用来设 计下 拉式选 单 , 后者 则根 据构 造好 的选 单 来生 成下 拉
式选单程序。为讨论方便 , 以下对这两个部分一律称为选单生成器。
使用选单生成器生成选单程序的基本步骤包括 : 打开选单设计 窗口→进 行选单设 计
→保存选单定义→生成选单程序→运行选单程序。
一、打开选单设计窗口
选单设计窗口能以命令和选单两种方式来打开。
1 . 命令方式打开
通常使用命令 MODI FY ME NU < 选单 文件 名 > 来打 开选单 设计 窗口 , 选单 文件 的
扩展名为 .M NX, 但命 令中 允 许缺 省。例如 往 命令 窗 口键 入 命令 M ODIFY M EN U XT ,
将出现标题为 XT .MNX 的选单设计窗口 ( 参 阅图 8 .2 ) 。 如果 是新建 选单 文件则 该窗 口
内部是空的。
2 . 选单方式打开
这种方式与打开屏幕设计窗口 ( 见第 6 .1 .2 节 ) 相似 , 只须 把有关步 骤中的 Screen 单
选钮改作 Menu 单选钮就可以了 , 这里不再细述。
二、选单设计
选单设计窗口打开后 , 系统选单中自动增加一个 Menu 选单 , 用 户可利用 这一个窗 口
和 Menu 选单进行设计。
三、保存选单定义
选单定义修改后 , 在选单设计窗口未关闭时 , 可用与保存屏幕定义相同的四种方法之
一来保存选单定义 , 此不赘述。选单定义保存 在扩展名 为 .M NX 的选 单文 件和扩 展名 为
.MN T的选单备注文件中。
・ 2 50 ・
四、生成选单程序
选单设计窗口处于打开状态时允许选 定 P rogram 选 单的 Generate 选项 , 选定 该选 项
将会出现 Generate Menu 对话框 ( 参阅图 8 .3) 。对话框中有一个文本框 , 其中显示系统默
认的选单程序路径及程序名 , 用户 可以按 需改 变 ; 选定 对话框 中的 Generate 按钮 就会 生
成选单程序。
选单生成器生成的选单程序其主名与 选单文 件相 同 , 而扩 展名为 .MP R。例 如选 单
文件名为 XT .MNX , 则选单程序名就为 XT .M PR。
五、运行选单程序
执行 DO 命 令可 以运行 选单 程序 , 但 选单程 序扩 展名 .MP R 不可 缺 省 , 例如 DO X T
.MP R。
运行选单程序时 , FoxPro 会自动对新建或修改后的 .MP R 文件进行编译并产生目标
程序 .MPX, 而且对于主名相同的 .M PR 和 .M PX 程序总是运行后者。

8 .1 .2   快速选 单生成

前已谈到 , 选单设计窗口一旦打开 , 系统选单中就会增加一个名为 Menu 的选单。该


选单如图 8 .1 所 示 , 它 共有 6 个 选 项 , 这 里 先 介 绍 Q uick Menu 选 项 , 其 余 选 项 将 在 第
8 .1 .4节讨论。

图 8 .1   Menu 选单及其选项

Quick Menu 选项用来定义快速选 单。选 择此 选项 后 , 它 会自 动把 Fox Pro 的 系统 选


单复制入选单设计窗口 , 供用户把它修改成符合自己需要的选单。应注意 Quick Menu 选
项在选单设计窗口为空时才允许选择 , 否则它是淡色的。
[ 例 8-1]   利用 Quick Menu 功能快速建立一个下拉式选单。
(1 ) 打开选单设计窗口 : 往命令窗口键入命令 MODI FY M EN U XT , 就 会出现选 单
设计窗口 ( 参阅图 8 .2 ) 。
(2 ) 建立快速选单 : 选定 Menu 选单的 Q uick Menu 选项 , FoxPro 系统选 单就自动 填
入如图 8 .2 所示的选单设计窗口。
(3 ) 生成选单程序 : 选定 Program 选单的 Generate 选项 →在保 存文件确 认框中选 定
Yes 按钮 保存 选单 文件 XT .MNX 和 选单 备注 文件 M N T→ 选 定如 图 8 .3 所 示 Generate
Menu 对话框中的 Generate 按钮将生成选单程序 XT .MPR。
・ 2 51 ・
图 8 .2   建立快速选单后的选单设计窗口

图 8 .3   Generate Menu 对话框

(4 ) 运行选单程序 : 往命令窗口键入命令 DO XT .MP R 就 会显示所 定义的 选单 , 它


比系统水平选单仅少一个 Run 选单 , 各弹出选单的功能也与系统选单一致。要从该选单
退出可往命令窗口键入命令 SE T SYSM EN U TO DE FAU L T , 此命令能恢复系统选单 的
缺省配置。
建立快速选单后 , 用户便可在此基础上对选单项进行修改、增删、改变功能等操作 , 操
作方法请阅第 8 .1 .3 和第 8 .1 .4 节。

8 .1 .3   选单设 计窗口

选单设计窗口用来定义选单的功能。窗口 ( 参阅图 8 .2 ) 左边有一个滚动列表 , 列表中


的 Prompt , Result , Options 等三列表示选单项属性 , 一行定 义一个 选单项。水 平选单或 每
个弹出式选单占选单设计窗口中的一页 ( 参阅图 8 .5、图 8 .6) 。窗口右边有一个弹出控制
和三个按钮 , Menu Level 弹出 控制 用 于从 下级 选单 页切 换 到上 级选 单 页 ; Try It , Inser t,
Delete 等按钮分别用于选单模拟显示、插入空白选单项与删除选单项。下面分别说明。

・ 2 52 ・
一、Prompt 列
Promp t 列用来输入选单项的名称 , 该名字只用于显示 , 并非程序中的选单名。
在选单项名中的字符允许定义为热键 , 其 方法是 在要 定义的 字符 之前 加上“ \ < ”两
个字符。在图 8 .2 中“
, \ < File ”表 示字 母 F 为 File 选 单项的 热键。 又如若 要定 义“ In-
pu t”中的 P 为热键 , 只 要表 示成“ In \ < pu t”即可。如 果 有两 个选 单项 定义 了 相同 的 热
键 , 则第一个热键有效。
二、Result 列
Result 列定义选单项的动作 , 可以从弹出控制中选择 , 其中包括 Command, PadName/
Bar # , Submenu, P rocedure 等四个选项。
(1 ) Command 选项
选单项的动作是执行一条命令 , 定义时只须将命令输入到弹出控制右方的文本框内。
(2 ) Procedure 选项
选单项的动作是执行用户定义的一个过程。选定 Procedure 后 , 弹出控制右边会出现
一个 Create 或 Edit 按钮 , 当建立选单项时显示 Create, 而修改选单项时则显示 Edit。选定
需要这一按钮后将出现一个文本编辑窗口 , 供用户编辑所需的过程。
(3 ) Pad Name/ Bar # 选项
让用户定义水平选单的选单项名或弹出式选单选项的序号。若当前是水平选单页就
显示 Pad Name, 表示让用户定义选单项名 ; 若当前是 弹出式选 单页则 显示 Bar # ( 参阅 图
8 .7) , 表示让用户定义选单项序号。定义时可将名字或序号输入到它右边的文本框内。
若用户未对选单定义名字或序号 , 系统 会将 自动为 它设 定一 个名字 或序 号。但系 统
所取名字往往难以记忆 , 不利于阅读程序。
(4 ) Submenu 选项
Submenu 供用户定义当前选 单项的子选单。选 定 Submenu 后 , 弹出控制的右边 出现
一个 Create 或 Edit 按钮 , 当建立子选单时显示 Create, 而修改子选单时则显示 Edit。选定
这一按钮 , 选单设计窗口就切换到子选单页 , 供用户建立或修改弹出式选单。
三、Options 列
每个选单行的 Options 列含有一个无符号按钮 , 选定该钮就会出现 P rompt Options 对
话框 ( 参阅图 8 .6) , 供定义 选单项 的附 加属 性。如果 已定义 过属 性按 钮面 板 上会 显示 符
号 。
Promp t O ptions 对话框中有一个文本编辑框和四个复选框 , 作用如下 :
(1 ) Comment 文本编辑框 : 用于输入注解 , 注解对程序执行没有影响。
( 2) Shortcut 复选框 : 用于为选单项设置快捷键 , 选定该复选框后即会出现 Key Defi-
nition 对话框 , 供用户定义快捷键。
快捷键必须是组合键 , 定义时不 是按 字符逐 个输 入。例 如把 Ctrl + X 定 义为 快捷 键
只要按 Ct rl + X 键 , 字串 Ctrl + X 就会自动填入上述对话 框的 Key Label 文 本框中。要 消
去它只要按空格键便可。
(3 ) Skip For 复选框 : 用于设置条件 , 以决定选单项是否不可选。选择该复选框将出
现一个表达式构造器 ( Expression Builder) 对 话框 , 用户 可在 其 Skip For < expL > 滚动 列
・ 2 53 ・
表中输入表达式。若在选单程序运行 期 间表 达式 值为 .T .则 该选 单项 不可 选用 , 并以 淡
色显示。
(4 ) Message 复选框 : 用于为选 单项 设置在 状态 条中 的提 示信 息。选 择 该复 选框 会
出现一个表达式构造器对话框 , 供用户在其 Message < expr > 滚动列表中输入提示信息。
(5 ) Pad Name/ Bar # 复选框 : 用于定义水平选单的选单 项名或 弹出式选 单选项的 序
号 , 作用类似于 Result 的 Pad Name/ Bar # 。
四、Menu Level 弹出控制
Menu Level 弹出控制用于从下级选单页切换 到上级选 单页 , 它含 有当 前可切 换到 的
所有选单项。英文 Menu Bar 表示水 平选单 , 例如 若在图 8 .6 所 示 Menu Level 弹 出控 制
中选定 Menu Bar, 将会显示如图 8 .5 所示的选单设计窗口。
五、Try It 按钮
该按钮供用户随时进行选单模拟显示。在选 单设 计期 间选定 它 , 屏幕 上会立 即显 示
当前建立或修改的选单 , 用户选定某选单项后就会显示相应信息。
六、Insert 按钮
选定该按钮 , 系统会在当前选单行之前插入一个空行。
七、Delete 按钮
选定该按钮 , 系统即删除当前的选单行。

8 .1 .4   Menu 选 单

如图 8 .1 所 示 Menu 选单 有 6 个 选项 , 其中 的 Quick Menu 选项 已 在第 8 .1 .2 节 介


绍 , 而 Try It , Insert I tem , Delete I tem 三 个选项的功能分 别与选单设计窗口 的 Try I t, In-
sert , Delete 按钮相同 , 下面仅补述 General Options 和 Menu Bar Options 二个选项的功能。
一、General Options 选项
选定 General Options 选项将出现 General Options 对话 框 ( 参 阅图 8 .9 ) , 该对 话框 内
有一个文本编辑框、四个单选钮和两个复选框。
1 . Procedure 文本编辑框
Procedure 编辑框用来为所有 Result 类型为 Pad Name 的选单项定义过程 , 也就是说 ,
该编辑框能为 具 有 如 下 特 点 的 选 单 项 设 置 共 用 的 过 程 , 它 们 既 无 子 选 单 , 也 未 设 置 过
Command 或 Procedure 动作。
用户可以直接在 Procedure 编辑框内键入代码片段 , 也可以将代码片段键入选定 Edit
按钮后出现的文本编辑窗口中。
2 . Location 区
Location 区的单选钮用来设置用户定义的选单与系统选单的关系。
Replace 单选钮为缺省按钮 , 选定它表示以用户定义的选单替换系统选单。
Append 单选钮能将用户定义的选单添加到当前选单系统的右面。
Before 单选钮表示用户定义的选单插在某选 单项前面 , 选定 它后其 右将会出 现一 个
用来指定选单项的弹出控制。
After 单选钮表示用户定义的选单将插在某选单项后面。
・ 2 54 ・
3 . Menu Code 区
选定 Set up 或 Cleanup 复选框将出现一个文本编辑窗口 , 供用户键入代码片段。
Set up 复选框可供用户设置选单程序的初始化 代码 , 该 代码段 位于 选单 程序的 首部 ,
主要用来进行全局性设置。例如设置全局变量、开辟数组、设置环境等。
Cleanup 复选框可供用户设 置选 单程 序 的清 除代 码 , 清 除 代码 在 选 单显 示 出来 后 执
行。
二、Menu Bar Options 选项
Menu Bar Options 选项用来为 Result 类型 为 Bar # 的 选 单项 定义 共用 过程 , 选项 名
Menu Bar Options 中的“ Menu Bar”会被当前选单项的选单名替代。
选定 Menu Bar Options 选项后将出现 Menu Options 文本 编辑 窗口 ( 参 阅图 8 .8 ) , 窗
口内有一个 Procedure 文本编辑框和一个 Edit 按钮 , 用户可 以直接在 Procedure 编辑框 内
键入代码片段 , 也可以将代码片段键入选定 Edit 按钮后出现的文本编辑窗口中。
[ 例 8-2]   利用选单生成器建立如 图 8 .4 所 示的 下拉 式选单 , 要 求生 成的选 单程 序
可用于设备管理应用程序。

图 8 .4   设备管理系统的下拉式选单

(1 ) 打开选单设计窗口 : 往命令窗口键入命令 MODI FY M EN U SB。


(2 ) 建立水平选单页 : 在选单设计窗口填入如图 8 .5 所示的四个选单项。

图 8 .5   水平选单页

(3 ) 为“ 数据维护”子选单建立选项 : 选 定“ 数据 维护”选单 项的 Create 按钮后 便切 换


到子选单页 , 建立两个选单项如图 8 .6 所示。
・ 2 55 ・
图 8 .6   数据维护选单的弹出式选单页

(4 ) 定 义“ 修 改 记 录”选 单 项 的 快 捷 键 : 选 定“ 修 改 记 录”的 Options 按 钮 → 选 定


Promp t Options 对话框的 Shortcut 复选框→出 现 Key Definition 对话 框后 , 按 组合键 Ctrl
+ X →选定 OK 按钮返回 P rompt Options 对话框→选定 OK 按钮返回弹出式选单页→ 选
定 Menu Level 弹出控制的 Menu Bar 选项 , 返回水平选单页。
(5 ) 为“ 打印”子选单建立两个选项 , 然后设置共用过程 : 选定“ 打印”选单项的 Create
按钮→在子选单页建立两个选单项如 图 8 .7 所示 , 其中 Result 列弹 出控 制选 用 Bar # →
选定 Menu 选单的“ 打印 Op tions”选项→在 Menu Op tions 对话框的 Procedure 编辑框内键
入如图 8 .8 所示的代码片段。

图 8 .7  “打印”选单的弹出式选单页

选单程序执行后 , 无论选定“ 打印”子选单的哪一选项都会显示“ 尚未完成”字样。


(6 ) 设置选单程序的初 始化 代码 : 选定 Menu 选 单的 General Options 选项 → 选定 如

・ 2 56 ・
图 8 .8   Menu Options 对话框

图 8 .9 所示 General Op tions 对话框中的 Setup 复选框→在 sb-Setup 文本编辑 窗口键入 如


下的初始化代码片段 :

CLEAR ALL
CLEAR
KEYBOARD ′
{Ctrl + F4}′ & & 关闭 COMMA ND 窗口
MODIF Y W INDOW SCR EEN T I TLE ′设 备 管 理 系 统′ & & 设置选单窗口标题
U SE SB

图 8 .9   General Op tions 对话框

(7 ) 定义“退出”选单项的功能 : 选定“ 退出”选 单项 的 Create 或 Edit 按钮 , 在 随后 出


现的过程编辑窗口中键入如下代码片段 :

U SE

・ 2 57 ・
MODIF Y W INDOW SCR EEN           & & 恢复 FoxPro 主窗口的标题
SE T SYSMEN U TO DEFA ULT & & 恢复 FoxPro 系统选单
AC TI VAT E WI NDOW COMMAND & & 恢复 Command 窗口

(8 ) 保存选单定义 : 双击选单定 义窗 口的 控制选 单框 , 当 回答 系统询 问时 选 Yes , 选


单定义即被保存在选单文件 SB .MNX 和选单备注文件 SB .MN T 中。
(9 ) 生成选 单程序 : 选定 Program 选单的 Generate 选项 →选定 Generate Menu 对 话
框的 Generate 按钮 , 便生成选单程序 SB .MP R。
(10) 运行选单程序 : 执行命令 DO SB .MP R。

8 .2   弹出式选单设计
下拉式选单程序既可用选单生成器来生成 , 也可用直接通过编程产生 , 但是用选单生
成器来生成更加便利。有时在应用系统中需要临时弹出一个选单 , 选单生成 器不能单 独
生成这样的弹出式选单 , 此时必须用弹出式选单命令进行编程。
弹出式选单包括四种命令 : 弹出式选单定义、选项定义、选项动 作定义和 弹出式选 单
激活。
一、定义弹出式选单
命令格式 :

DEFINE P OPU P < 弹出式选单名 >


[ FROM < 行坐标 1 , 列坐标 1 > ] [ TO < 行坐标 2 , 列坐标 2 > ]
[ IN [ WINDOW] < 窗口名 > | IN SCR EEN] [ KEY < 键标号 > ]
[ MARGIN ] [ MESSAGE < 字符表达式 1 > ] [ MOVER ] [ M ULT ISELECT ]
[ PROMPT FIELD < 表达式 > | PROM PT FI LES [ LI KE < 通配符表达式 > ] |
PROM PT ST R UC TUR E ]
[ R ELATI VE ] [ SCROLL ] [ T I TLE < 字符表达式 2 > ]
[ COLOR SCHEME < 数值表达式 > | COLOR < 颜色对表 > ]

功能 : 定义弹出式选单的名称及总体属性。
说明 :
(1 ) < 弹出式选单名 > 表示所定义弹出式选单的名字。
(2 ) FORM 子句的 < 行坐标 1 , 列坐标 1 > 指 定弹出 式选 单左上 角的 坐标 ; T O 子 句
的 < 行坐标 2 , 列坐标 2 > 指定其右下角的坐标。若缺省这两个子句 , 弹出式 选单左上 角
坐标为第 0 行第 0 列。
(3 ) MOVER 子句能使第一个选 项的左 边出 现双 向箭 头 , 供 用户 改变 选 项的 显示 位
置。用鼠标上下拖动双向 箭 头 可重 新 安排 选 项的 位 置 ; 若 使 用键 盘 , 可 以 按 Ctrl + ↓ 或
Ctrl + ↑来进行移动。
(4 ) M UL TISEL ECT 子句使用户可在 弹出式选单中选 定多个选项 , 每个选中选 项的
左边将包含一个 标记 , MARG IN 子句可为选项的标记留出位置 ( 参阅例 8-4 ) 。注意 这
里选定某个选项须通过“Shift + 回车”或“Shift + 单 击”操作 来实现 , 允 许如 此操作 的条 件
・ 2 58 ・
是预 先 为 FoxPro 设 置 DOS 击 键 风 格。 设 置 DOS 击 键 风 格 可 在 FoxP ro 的 配 置 文 件
CONF IG .FP W 中设置命令 : KEYCOM P = DOS, 或在命令窗口 键入命令 SE T KE YCOMP
TO DOS。若要取 WINDOWS 击键风格只需将上述命令中的 DOS 改为 WINDOWS。
(5 ) P ROM PT FIE LD 子句用来定义以 库文件 字段 值为 内容的 滚动 列表。子 句中 的
< 表达式 > 代表字段名 , 它能使库文件各个记 录中由 该字 段名 所指定 的内 容成为 列表 的
可选项。该子句不可和 M UL TISE LECT 或 MOVER 子句一起使用。
P ROMP T F IL E 子句用来定义磁盘文件名 列表 , 允 许文 件名用 < 通配符 表达 式 > 来
指定。
P ROMP T STRUCT URE 子句用来定义组成库文件结构的字段名列表 ( 参阅例8-5) 。
(6 ) 不带 RELAT IVE 子句时 , 如果一 个弹 出式 选单所 有选 项的 BAR 数 值序 列不 连
续 , 则缺项显示为空行 , 有此子句则不空行。
(7 ) SCROLL 子句用来在弹出控 制中 增加滚 动条 , 当 选项众 多以 致当 前窗口 中容 纳
不下时滚动条就被激活。
二、定义弹出式选单的选项
命令格式 :

DEFINE BAR < 数值表达式 1 > OF < 弹出式选单名 >


PROM PT < 字符表达式 1 > [BEFORE < 数值表达式 2 > | AFT ER < 数值表达式 3 > ]
[ KEY < 键标号 > [ , < 字符表达式 2 > ] ] [ MESSAGE < 字符表达式 3 > ]
[ SKIP [ FOR < 逻辑表达式 > ] ]
[ COLOR SCHEME < 数值表达式 4 > | COLOR < 颜色对表 > ]

功能 : 定义弹出式选单的一个选项及其属性。
说明 :
( 1) < 数值表达式 1 > 表示由 < 弹出式选单名 > 指定的弹出式选单的选项序号 , 各选
项将按此序号依次显示。
(2 ) PROMPT 子句的 < 字符表达式 1 > 表示选项的显示名。
(3 ) 在指定的弹出式选单中 , BEFORE 子句 把选 项 放在 由 < 数 值表 达式 2 > 指定 的
选项之前 ; AF T ER 子句把选项放在由 < 数值表达式 3 > 指定的选项之后。
三、定义弹出式选单选项的动作
定义选项动作的命令有三种格式。
命令格式 1:

ON BAR < 数值表达式 > OF < 弹出式选单名 1 > [ AC T IVATE PO PU P < 弹出式选单名 2 > ]

功能 : 把选项的动作定义为激活另一个弹出式选单。
< 数值表达式 > 表示要定义动作 的选 项的 序号 , < 弹 出式 选单 名 1 > 是 选项 所在 弹
出式选单的名字。 < 弹出式选单名 2 > 表示被激活的弹出式选单的名字。
命令格式 2:

ON SELECT ION BAR < 数值表达式 > OF < 弹出式选单名 > [ < 命令 > ]

・ 2 59 ・
功能 : 选择 < 数 值表达式 > 表示 的选项 后就执行 指定的 < 命令 > , 此 < 命令 > 可 为
DO 命令或其它命令。
命令格式 3:

ON SELECT ION POP U P < 弹出式选单名 > | ALL [ < 命令 > ]

功能 : 选择由 < 弹出式选单名 > 所代表的选单中的任一选项 后均执行 < 命令 > 。 如


果用 AL L 子句代替 < 弹出式选单名 > , 则当所有已激活的弹出式选单中的任一选项被 选
定时将均执行指定的 < 命令 > 。
四、激活弹出式选单
命令格式 :

AC TI VAT E POP U P < 弹出式选单名 > [ AT < 行坐标 , 列坐标 > ]


[ BAR < 数值表达式 > ] [ NOWAI T ] [ R EST ]

功能 : 激活由 < 弹出式选单名 > 指定的选单。


说明 :
(1 ) AT 子句的 < 行 坐 标 , 列 坐 标 > 表 示 弹出 式 选 单 左 上 角 的 位 置 , 此 子 句 比 DE-
FI NE POPU P 命令的 F ROM 子句优先级高。
(2 ) BAR 子句的 < 数值表达式 > 表示所激活选单当前选项的序号。
(3 ) 若不带 NOWAIT 子句 , 弹出式选单激活 时程 序会 暂停执 行 , 等待 用户选 择选 单
选项或用 Esc 键退出。使用 NOWAIT 子句将使程序在弹出式选单激活后继续往下执行 ,
当程序等待任何输入时 , 用户均可在弹出式选单中选择选单选项。
(4) 如果 弹 出 式 选 单 定 义 中 的 P ROM PT F IE LD 子 句 定 义 了 字 段 内 容 弹 出 控 制 ,
REST 子句使库文件当前记录的字段内容成为当前可选项。
[ 例 8-3]   一个简单的弹出式选单程序。

* e8-3 .prg
CLEAR
DEFINE P OPU P BB MARGIN R ELAT IVE T I TLE DTOC(DATE ( ) ) from 10 , 30
DEFINE BAR 1 OF BB PROMPT ′月报表 ′KEY C TR L + Y , ′
^Y′
DEFINE BAR 2 OF BB PROMPT ′季报表 ′KEY C TR L + J , ′
^J′
DEFINE BAR 3 OF BB PROMPT ′年报表 ′KEY C TR L + N , ′
^N′
    ON SELECT ION BAR 1 OF BB ?′
DO p1′
ON SELECT ION BAR 2 OF BB ?′
DO p2′
ON SELECT ION BAR 3 OF BB ?′
DO p3′
AC TI VAT E POP U P BB

程序运行后 FoxPro 主窗口中即出现如图 8 .1 0 所示的弹


出式选单 , 由图可见 程序为 每个 选项都 设置 了快 捷键。退 出 图 8 .10   简单的弹出式选单
该选单的方法是按系统默认的 Esc 键。
[ 例 8-4]   多选型弹出式选单示例。

* e8-4 .prg
・ 2 60 ・
CLEAR
m = ′′ & & 用来存储选项序列
DEFINE P OPU P jj FROM 5 , 5 M UL T ISELECT MARGIN T I TLE ′四季月份′;
& & 定义多选型弹出选单选项
DEFINE BAR 1 OF jj PROM PT ′春′
DEFINE BAR 2 OF jj PROM PT ′夏′
DEFINE BAR 3 OF jj PROM PT ′秋′
DEFINE BAR 4 OF jj PROM PT ′冬′
ON SELECT ION POP U P jj DO xz & & 过程 xz 被所有选项共用
AC TI VAT E POP U P jj
F OR i = 1 TO LEN( m) - 1 & & 消除重复选项
IF LEFT ( m , 1) $RIGHT ( m , LEN( m ) - 1) & & 选项序列的最左项号是否在其余项号中
    m = RIGHT ( m , LEN ( m ) - 1 ) & & 消除最左重复选项
ENDIF
NEXT
F OR j = 1 TO LEN( m)
DO CASE
CASE S UBS( m , j , 1) = ′
1′
    ?′3 - 5 月 ′
CASE S UBS( m , j , 1) = ′
2′
    ?′6 - 8 月′
CASE S UBS( m , j , 1) = ′
3′
    ?′9 - 11 月′
CASE S UBS( m , j , 1) = ′
4′
    ?′12 - 2 月′
ENDCASE
NEXT
PROCEDUR E xz
F OR i = 1 TO 4 & & 产生选项序列
IF MRKBAR (′
JJ′, i) = .T . & & I 表示所选选单选项的序号
    m = m + ST R( i , 1) & & 选项号添入选项序列后
ENDI
NEXT

命令 DE FI NE POPUP 中的 M UL TISE LECT 子 句 允许 用户 在弹 出式 选 单中 选定 多


个选单选项 , 图 8 .11 表示了 程序 运行 后用户 通过 按 Shift + 回 车选 择了“ 夏”和“ 冬”两 个
选项的情况 , 每个选中的选项的左边包含了 标记。 MARGIN 子句用来为选 项标记留 出
位置。
函数 MRKBAR 用来测试选项是 否被选 定 , 其格 式为 : MRKBAR ( < 字 符 表达 式 > ,
< 数值表达式 > ) 。其 中的 < 字符表 达式 > 表 示弹出 式选单名 , < 数值表 达式 > 表示 选
项的序号 , 如果选项被选定函数值就为真 , 否则为假。
过程 XZ 被所有选项共用 , 用来测试有哪些选项已被 选定 , 并将 被选定选 项的若干 序
・ 2 61 ・
号依次存储在变量 M 中。当按 Esc 键退 出选单选 择后 , 所执行 的
第一个循环语句用来 除去 重复 选项 , 第二 个循 环语句 表现 了所 选
定选单选项的 动 作 : Fox Pro 主 窗 口 中 将分 两 行 显 示 68 月和 122
月。
[ 例 8-5]   为 SB .DBF 制作一个字段名滚动列表。

* e8-5 .prg
图 8 .11   多选型弹出式
U SE SB
选单
DEFINE P OPU P sbzd FROM 5 , 5 TO 11 , 22 SCROLL PROMPT
STR UCTUR E
ON SELECT ION POP U P sbzd DO ts
AC TI VAT E POP U P sbzd
PROCEDUR E ts
DO CASE
CASE BAR( ) = 1
? PRMBAR(′
sbzd′, 1)
CASE BAR( ) = 2
? PRMBAR(′
sbzd′, 2)
OTHERW ISE
    ?′其余′
ENDCASE

程序 定 义 了 弹 出 式 选 单 SBZD, 选 单 定 义 命 令 中 的 PROMP T S TRUCT U RE 和


SCROLL 子句 使 选 单 激 活 后 即 显 示 如 图 8 .12 所 示 的
SB .DBF 字 段名 滚动 列 表。由 此可 见 , 用 弹出 式选 单 命
令建立滚动列表也很方便。
过程 T S 被所有选项共用。函数 BAR( ) 的功能是 返
回当前弹出式选单 选项 的序 号 , 用来 测试 某 选项 是否 被
选定。判 别 出 某 选 项 被 选 定 后 , 将 通 过 函 数 PRMBAR
来返回它的选项显示名 , 例 如选定“ 名称”选 项后 将显 示 图 8 .12   字段名滚动列表
“名称”字样。函数 P RMBAR 的格 式为 : P RMBAR ( < 字
符表达式 > , < 数值表 达式 > ) , 其中 的 < 字 符表达 式 > 表 示弹出式 选单名 , < 数值表 达
式 > 表示选项的序号。

习   题
1 . 若利用选单生成器建立了名 为 SB .MNX 的 选单 文件 , 现 要复 制出 可 用选 单生 成
器打开的选单文件 , 共有几种方法 ? 试分别写出复制步骤。
2 . 利用 Q uick Menu 快速 定义选 单 , 然 后将此 选单汉化。 即运行 选单程序 时显示 的
选单项应是中文 , 例如“ File”显示为“文件”两字。
3 . 在例 8-2 的选单中增加用具和剪贴板。
・ 2 62 ・
(1 ) 用具 : 计算器 ( Calculator ) 、台历日记本 (Calendar/ Diary) 、文件夹 ( Filer) 。
(2 ) 剪贴板 : 剪切 ( Cu t ) 、复制 (Copy) 、粘贴 ( Paste ) 。
4 . 修改例 8-2 , 要求如下 :
(1 ) 下拉式选单设置在某个窗口内。
(2 ) 使“ 打印”选单的选项能打印出相应的报表。
(3 ) 如果 SB .DBF 的记录数超过 10 则“ 打印”选单以淡色显示。
5 . 设计一个通信录管理程序 , 用选单生成器生成选单 , 要求如下 :
(1 ) 包括输入、修改、查询、打印、退出等功能。
(2 ) 为通信录管理系统设 计一个 封面。 程序执 行后 先显 示封面 , 打 任一 键就 出现 下
拉式选单。
6 . 为 SB .DBF 制作字段名滚动列表 , 选定某字段名后应会弹出一个可修 改该字段 内
容的窗口。
7 . 根据例 8-2 的选单修改 , 要求将选单改为 图形 按钮 , 选 定某图 形按 钮会出 现弹 出
式选单。

・ 2 63 ・
下 篇

系统 开 发
第九章   系统开发实例

    初学者面对一个课题常不知如何着 手。有 的人刚 接触 课题就 急于 编制 程序 , 这种 将


开发软件等同于编程的做法 , 往往事倍功半 , 软件质量也难以保证。其实数据库应用系统
的开发是相当复杂的 , 必须按照一定的规范 有步 骤地进 行。本 书早在 第四 章已经 介绍 过
一种“积木式编程”方法供初学者模仿 ; 其后的四章又通过屏幕生成器等工具 , 展示了这类
工具隐含的“给定一种输出 ( 屏幕或打印 ) 布局、自动生成一个模块”的面向对象设计思想。
本章将通过一个模拟实例来介绍应用系统的整个开发过程 , 并将某些软件工程、数据库设
计和开发工具使用等知识融入其中。除系统开发外 , 本章还介绍了项目管理器、文档生成
器及系统安装与运行设计等内容。

9 .1   数据库应用系统的开发步骤

数据库应用系统可分为以数据为中心和以处理为中心根据的两类。前者以提供数据
为目的 , 重点在数据采集、建库及数据库维护 等工作。 后者 虽然也 包含 这些内 容 , 但重 点
是使用数据 , 即进行查询、统计、打印报表等工作 , 其数据量比前者小得多。以处理为中心
的数据库应用系统适用于一般企事业单位 , 本书介绍这类系统的开发方法 , 其开发过程如
图 9 .1 所示。

图 9 .1   以处理为中心的数据库应用系统开发示意图

由图可知 , 整个开发活动从对系统的需求分析开始 , 系统需求包括对数据的需求和对


应用功能的需求两方面内容。图中把前者称为数据分析 , 后者称为功能分析 , 它们分别是
数据库设计和应用程序设计的依据。实际上在以 处理 为中 心的应 用系 统中 , 这两 方面 的
・ 2 67 ・
需求是相互制约的。具体地说 , 应用程序设计时将受到数据库当前结构的约束 ; 而在设计
数据库的时候 , 也必须考虑为实现功能所进行的数据处理的需要。
确定需求必须建立在调查研究的基础上 , 包括 访问用 户 , 了解 人工 系统模 型 , 采集 和
分析有关资料等工作。需求分析结束后 , 就可分别进行数据库设计和应用程序设计 , 后者
通常包括“确定总体结构→模块设计→编码调试”等内容。
这两项工作完成后系统应投入试运行 , 即 把数据 库文 件连 同有关 的应 用程序 一起 装
入计算机 , 从而考察它们在各种应用中能否 达到 预定的 功能 和性 能需求。 若不能 满足 要
求 , 还需返回前面的步骤再次进行需求分析 或修 改设计。 试运 行阶段 一般 只装入 少量 数
据 , 待确认没有重大问题后再正式装入大批数据 , 以免导致较大的返工。
试运行的结束标志着系统开发的基本完成 , 但是只要系统还在使用 , 就可能常需要调
整和修改。也即还须做好系统的“维护”工作 , 这包括纠正错误和系统改进等。

9 .2  “汽车修理管理系统”的开发

本节简明地描述开发一个“汽车修理管理系统”的全过程。

9 .2 .1   需求分 析

某汽车修理厂根据业务发展的需要 , 决定建立一个“ 汽车修理管理系统”, 以取代人工


管理。开发目的如下 :
(1 ) 能对汽车修理有关的各类数据进行输入、修改与查询。
(2 ) 编制季度零件订货计划。
(3 ) 打印修理汽车发票和工资月报表。
用户提出开发应用系统的要求后 , 软件开 发者应 通过 调查 研究归 纳出 目标系 统的 数
据需求和功能需求。
一、数据需求
在调研的过程中 , 用 户提 供了 该系 统所 需 的输 入、输出 单据 ( 参阅 图 9 .2 ~ 图 9 .8 ) 。
输入单据包括修车登记单、汽车修理单、零件入 库单和 零件 出库单 等 4 种 ; 输出单 据包 括
季度零件订货计划、修理汽车发票和工资月报表等三种。不少单据都填写过数据 , 这为数
据库设计提供了数据样例。
修 车 登 记 单

编号 : 5001 日期 : 97/ 01/ 12


修理项目 点火线圈

汽车牌号 A2020203 型 号 S130 生产厂 南方汽车厂

车 主 名 李符 地 址 岭分路 18 号 电 话 8787878

图 9 .2   修车登记单

2 68 ・
汽 车 修 理 单

登记单编号 : 5005 汽车牌号 : A2312318

修理项目 大修 送修日期 97/ 06/ 28

零件号 100001 100004 100005

数 量 2 5 2

修理小时 98 .0

完工日期 : 97/ 07/ 27 修理工 : 李平

图 9 .3   汽车修理单

零 件 入 库 单
日期 :

零件号 零件名 成本 数量 价格 最低库存 订货量

验收人 :

图 9 .4   零件入库单

零 件 出 库 单

编号 : 日期 :

零件号

数量

修理工 :

图 9 .5   零件出库单

第 1 季度零件订货计划

零件号 零件名 库存量 最低库存 订货量

100003 离合器 3 4 2

图 9 .6   零件订货计划

・ 2 69 ・
修 理 汽 车 发 票

日期 : 97/ 07/ 27

顾客姓名 施志秋 地 址 东方一路 1005 号

汽车牌号 A2312318 修理项目 大修

送修日期 97/ 06/ 28

零件费 894 .00 备


修理费 2352 .00 注

总金额 3246 .00

图 9 .7   修理汽车发票

工 资 月 报 表

工 号 姓 名 修理小时 小时工资 月工资

0001 李平   6 .0 8 .00 48 .00

0005 凌意扬 3 .2 7 .00 22 .40

图 9 .8   工资月报表

二、功能需求
功能分析的任务 , 是弄清用户对目标系 统数 据处理 功能 所提 出的需 求。根据 系统 目
标和数据需求并与用户充分讨论后 , 本例的功能需求可归纳为以下 5 个方面。
1 . 数据登记
登记功能用于把各种手填单据中的数据及 时登记 到系 统将要 定义 的数 据库文 件中 ,
还要求能进行修改。这些单据包括修车登记单、汽车修理单、零件入库单和零件出库单。
2 . 查询
能查询登记单、修理单、汽车、车主、修理工、零件库存的有关数据。
3 . 编制并显示季报零件订货计划
编制零件订货计划需要找出要订货的零件 , 订货条件为 : 零件库存量 < 最低库存量。
订货量可由用户输入或修改。
4 . 打印发票
发票中除包含顾客、汽车及修理项目等数 据外 , 还 要计 算出修 车费 , 修 车费包 括修 理
费和零件费 , 按下列各式计算 :
零件费 = ∑ ( 零件价格 × 耗用数量 )
修理费 = 小时工资×修理工时×3
总计 = 零件费 + 修理费
不难看出 , 发票包含的信息来自修车登 记单、汽车 修理 单和零 件出 库单 等各种 单据 ,
这是一项涉及面很广的功能。
5 . 打印修理工工资月报表
・ 2 70 ・
某修理工的月工资 = ∑ 修理小时 × 小时工资
9 .2 .2   数据库 设计

数据库设计的任务是确定系统所需的数 据库。数 据库 是数据 库文 件的集 合 , 通常 一


个系统只需一个数据库。简 单 而言 , 数 据库 设 计可 分为 逻辑 设计 与 物理 设计 两 个 步骤。
第一步确定数据库所包含的库文件及其字段。第 二步 确定 库文件 的具 体结构 , 即 确定 字
段的名称、类型及宽度 ; 此外还要确定索引 , 为建立库文件的关联准备条件。
一、逻辑设计
设计从分析输入数据着手 , 输入数据中 的某 类相关 数据 可以 归纳为 一个 库文件。 对
需要同时调用数据的若干库文件 , 应使它们符合关联要求 , 其中有的库文件要补充关键字
段。数据库设计好后 , 可通过分析输出数据来验证其可用性 , 若有输出数据不能从输入数
据导出 , 须继续向用户征集数据。
本例根据季度零件订货计划、修理汽车发票和工资月报表等输出单据的数据需求 , 从
修车登记单、汽车修理单、零件入库单和零件出库单等输入单据中归纳出包含 6 个库文件
的数据库。现将这些库文件列出如下 :
(1 ) 修理单 : XLD ( 编号 , 牌号 , 工号 , 修理项目 , 修理小时 , 送修日期 , 完工日期 )
(2 ) 汽车 : QC( 牌号 , 型号 , 生产厂 , 车主名 )
(3 ) 车主 : CZ( 车主名 , 地址 , 电话 )
(4 ) 修理工 : XLG( 工号 , 姓名 , 地址 , 电话 , 出生日期 , 进厂日期 , 小时工资 )
(5 ) 零件用量 : LJY L( 编号 , 零件号 , 数量 )
(6 ) 零件库存 : LJKC( 零件号 , 零件名 , 成本 , 价格 , 库存量 , 最低库存 , 订货量 )
以上括号外的字母串 是库 文 件名 , 括 号内 为 字段 名表 , 有 下划 线 的 字段 为 关联 关 键
字。根据系统数据处理的需要 , 这些库文件的 关联 情况如 图 9 .9 所示。图 中用矩 形框 表
示库文件 , 需要关联的两个库文件用线段连接 , 连线旁标出了关联关键字。

图 9 .9   库文件关联示意图

下面对上述设计说明两点 :
(1 ) 为同时调用不同库文件 中的 数据须 将它 们关 联 , 故 而有 的库 文件要 补充 关键 字
字段。例如 QC .DBF 包含 牌 号、型号 和 生 产 厂 3 个 字 段 已 很 完 整 , 但 为 使 QC .DBF 与
CZ .DBF能以车主名关联 , 在 QC .DBF 增入了车主名字段。
(2 ) 数据库设计须注意合 理性。若 将不 同类的 数据 放进 同一个 库文 件中 , 可 能会 产
生数据冗余。例如若将 QC .DBF 与 CZ .DBF 的字段合并为一个库文件 , 由于 一个车主 可
拥有多辆汽车 , 在登记这些汽车的牌号、型号和 生产厂 的同 时也要 登记 车主 的车主 名、地
・ 2 71 ・
址和电话 , 那么这些记录中的车主信息将重复记载。数据冗余会多占存储容量 , 这是易于
理解的 , 更糟糕的是还会破坏数据的一致 性。如果 车主易 名 , 只要 有一 处忘记 修改 , 将 来
查询或打印时可能会输出不一样的数据。库文件 的分 拆往 往能减 少数 据冗余 , 但 库文 件
个数的增多又会增加程序的复杂性 , 因为须在不同的工作区打开这些库文件 , 而且为了联
用数据还要对库文件进行关联。
二、物理设计
下面列出汽车修理管理系统所有库文件的结构及索引 , 为便于读者理解本例系统 , 顺
便也列出库文件的部分记录。
1 . 修理单

St ructure for table/ dbf∶ XLD .DBF


Number of data records∶        7
          Last updated∶97/ 08/ 17

Field Field name Type Widt h Dec


1 编号 Character 4 0
2 牌号 Character 8 0
3 修理项目 Character 12 0
4 送修日期 Date 8 0
5 完工日期 Date 8 0
6 工号 Character 4 0 (索引字段 )
7 修理小时 Numeric 4 1
    * * Total * * 49

Record # 编号 牌号 修理项目 送修日期 完工日期 工号 修理小时


1 5001 A2020203 点火线圈 97/ 01/ 12 97/ 01/ 15 0003 2 .0
2 5002 R1212123 刹车 97/ 02/ 05 97/ 02/ 10 0005 3 .2
3 5003 H210-100 喷漆 97/ 02/ 06 97/ 02/ 13 0001 6 .0
4 5004 K333-667 换转动轴 97/ 05/ 08 97/ 05/ 15 0003 18 .0
5 5005 A2312318 大修 97/ 06/ 28 97/ 07/ 27 0001 98 .0

    2 . 汽车

St ructure for table/ dbf∶ QC .DBF


Number of data records∶      5
          Last updated∶97/ 08/ 17

Field Field name Type Widt h Dec


1 牌号 Character 8 0 (索引字段 )
2 型号 Character 6 0
3 生产厂 Character 20 0
4 车主名 Character 8 0
* * Total * * 43

R ecord # 牌号 型号 生产厂 车主名

・ 2 72 ・
1 A2020203 S130 南方汽车厂 李符
2 R1212123 760 东环汽车制造厂 马一鼎
3 H210-100 C12-5 国光轿车厂 孔力
4 K333-667 FG323 福铃货车总厂 贾嘉丁
5 A2312318 NA122 全球汽车厂 施志秋

    3 . 车主

St ructure for table/ dbf∶ CZ .DBF


Number of data records∶      5
          Last updated∶97/ 08/ 10

Field Field name Type Widt h Dec


1 车主名 Character 8 0 (索引字段 )
2 地址 Character 16 0
3 电话 Character 7 0
* * Total * * 32

R ecord # 车主名 地址 电话
1 李符 岭分路 18 号 8787878
2 马一鼎 鸿飞路 10 号 5656555
3 孔力 虎山路 15 弄 15 号 3456789
4 贾嘉丁 法平路 213 号 3344556
5 施志秋 东方一路 1005 号 6665578

    4 . 修理工

St ructure for table/ dbf∶ XLG .DBF


Number of data records∶      5
          Last updated∶97/ 08/ 13

Field Field name Type Widt h Dec


1 工号 Character 4 0 (索引字段 )
2 姓名 Character 8 0
3 地址 Character 16 0
4 电话 Character 7 0
5 出生日期 Date 8 0
6 进厂日期 Date 8 0
7 小时工资 Numeric 5 2
* * Total * * 57

Record # 工号 姓名 地址 电话 出生日期 进厂日期 小时工资


1 0002 赵小红 虹桥路 202 号 15 室 1234567 60/ 06/ 05 83/ 05/ 02 7 .50
2 0003 韩将 荣光路 71 弄 1 号 5 室 2222333 72/ 11/ 08 92/ 03/ 02 6 .50
3 0004 宋若雪 高峰路 21 号 4343434 56/ 08/ 03 80/ 06/ 02 9 .00
4 0005 凌意扬 杨高路 12 号 2401 7070707 69/ 04/ 24 90/ 03/ 20 7 .00
5 0001 李平 南京路 1617 弄 53 号 8765432 53/ 12/ 12 73/ 08/ 01 8 .00

・ 2 73 ・
    5 . 零件用量

St ructure for table/ dbf∶ LJYL .DBF


Number of data records∶        5
          Last updated∶97/ 08/ 17

Field Field name Type Widt h Dec


1 编号 Character 4 0 (索引字段 )
2 零件号 Character 6 0
3 数量 Numeric 2 0
* * Total * * 13

R ecord # 编号 零件号 数量
1 5002 100003 1
2 5005 100001 2
3 5005 100004 5
4 5005 100005 2

    6 . 零件库存

St ructure for table/ dbf∶ LJKC .DBF


Number of data records∶        5
          Last updated∶97/ 08/ 17

Field Field name Type Widt h Dec


1 零件号 Character 6 0 (索引字段 )
2 零件名 Character 10 0
3 成本 Numeric 8 2
4 价格 Numeric 8 2
5 库存量 Numeric 3 0
6 最低库存 Numeric 3 0
7 订货量 Numeric 3 0
* * Total * * 42

R ecord # 零件号 零件名 成本 价格 库存量 最低库存 订货量


1 100001 前灯   35 .00 40 .00 42 20 12
2 100002 方向盘 77 .70 80 .00 15 5 2
3 100003 离合器 598 .00 650 .00 3 4 2
4 100004 活塞环 143 .00 156 .00 60 25 4
5 100005 反光镜 15 .00 17 .00 100 30 14

    除 上 述 6 个 库 文 件 外 , 零 件 入 库、出 库 时 还 需 有 暂 存 库 文 件。零件 入 库 库 文 件 为
LJRK .DBF, 其结构与 LJKC .DBF 相同。零件出库库文件的结构如下 :

St ructure for table/ dbf∶ LJCK .DBF


Number of data records∶        1
          Last updated∶97/ 08/ 17

・ 2 74 ・
Field Field name Type Widt h Dec
1 零件号 Character 6 0
2 数量 Numeric 2 0
* * Total * * 9

9 .2 .3   应用程 序设计

一、总体设计
    按照功能分类是总体设计中常用的方 法。程 序的总 体结 构则可 用层 次图 ( Hierarchy
Chart , 简称 HC 图 ) 来表示 ( 参阅图 9 .10 ) , 这种图自上而下进行分层 , 第一层为系 统层 , 第
二层为子系统层 , 第三层为功能层 , 第四 层为 操作 层。例如 本例的 系统 功能 可分类 如下 :
修车登记单、汽车修理单和修理工数据管理 归入登 记一 类 , 零件订 货计 划、零件入 库和 出
库归入零件管理一类 , 查询与打印各成一 类。如图 9 .10 所 示 , 该系 统分 为 3 个层次。 子
系统层一般起分类控制作用 , 例如零件管理控制了 3 种零件管理功能 , 如果它没有下一层
次也可直接表达功能 , 例如查询功能。图中未画出操作层 , 该层次的程序模块将在编码时
列出。

图 9 .10   总体结构图

二、选单设计
总体结构图与选单具有明显的对应关系。系统层对应下拉式选单名“
, 汽车修理管理
系统”的选单 名 定 为 QCXLGL .MNX; 子 系统 层 对 应 系 统选 单 ; 功能 层 对 应 子 选 单。 图
9 .11 表示了系统的下拉式选单 , 在括号中还标出了所调用程序的名字或程序段。

登 记 零件管理 查 询 打 印 退 出


(CX.SPR) ( 代码片段)

修车登记 零件订货计划 发票
( XCDJ.SPR ) ( LJDH. PRG) (代码片段 )

汽车修理 零件入库管理 修理工工资月报


( QCXL.SPR) ( LJRK. PRG) (代码片段 )

修理工数据管理 零件出库管理
(程序略 ) ( LJCK. PRG)

图 9 .11   汽车修理管理系统的选单

・ 2 75 ・
9 .2 .4   编码

往命令窗口键入命令 MODI M EN U QCXLGL , 就会出现选 单设计 窗口 , 此时 可按 图


9 .11 建立选单。本小节列出选单中功能选项的程序和代码片段。
一、选单程序 QCXLGL .MPR 的 SETUP 代码片段

SE T DEFA TO \ foxprow \ qcxl     & & 假定本例所有的文件都装在该路径的子目录中


DO qcxlfm .spr & & 显示封面 ( 参阅例 6-6)
KEYB ′
{C T RL + F4}′ & & 关闭 Command 窗口
MODI W IND SCREEN T I TL ′汽 车 修 理 管 理 系 统′  & & 打开主窗口 , 设置标题栏
SET VI EW TO qcxl & & 自动关闭所有的工作区后打开 QCXL .VUE

    不难看出 , 上述代码片段起系统初 始化作用。 QCXL .V UE 设 置的 环境 如图 9 .12 所


示 , 符合图 9 .9 中对库文 件关联 的要 求 , 另外 还打 开 了 LJRK .DBF 和 LJCK .DBF。还 有
一点要说明 , 即通过 On | Off 面板设置的 TALK 和 SAFE T Y 的状态均为 OFF。
SE T U P 代码片段设置的环境在选单程序运行期间有效 , 除非打开另一环境。还应 注
意所有的屏幕设计都不要保存环境 , 因为如果保存了环境 , 则屏幕程序退出运行时当前环
境就会被清除 , 连 QCXL .V U E 设置的环境也不再存在。

图 9.12   QCXL.V UE 的 View 窗口

二、修车登记屏幕程序 XCDJ .SPR


修车登记屏幕程序用于输入、修改或添加修车登记单。程序特点是 :
(1 ) 将多库文件的输入、修改、添加 等多 种功能 维护 集于 一体 , 使用 户屏 幕与 修车 登
记单格式一致 , 方便用户操作。这种风格在本系统中将始终保持。
(2 ) 提供翻页和寻页两种方式来查找 修车登记 单。寻页 按钮 供用 户按 XLD .编号 来
查找。
(3 ) 增页按钮用于增加新的修车登记单 , 登记单 编号自 动加 1 , 并 可增 加新的 汽车 与
・ 2 76 ・
车主。
(4 ) 若输入汽车牌号在 QC .DBF 已有 , 则 汽车与 车主的 数据 会自动 填入 表格。这 不
仅可减少输入击键 , 而且减少了输入出错机会。自动填入的数据还允许立即修改 , 系统会
更新有关库文件 , 即具有实时维护汽车与车主数据的能力。
(5 ) 设有专用按钮可当场临时维护汽车与车主数据。

图 9 .13   修车登记屏幕设计窗口

屏幕文件 XCDJ .SCX 的屏幕设计窗口如图 9 .1 3 所示。


1 . Screen Layou t 窗口的设置
选定 Screen 选单的 Layout 选项 , 在 Screen Layou t 窗口中作如下设置 :
在 Title 文本框中键入修车登记 ; 在 Name 文本框中键入 XCDJ; 选定 Center 复选框。
2 . 字段设置
屏幕设计窗口中的字段均为输入对象 ( Input Field) , 它 们是 : XLD .编 号 , XLD .送 修
日期 , XLD .修理项目 , XLD .牌号 , QC .型号 , QC .生产厂 , QC .车 主名 , CZ .地 址 , CZ .
电话。这些字段中仅 XLD .牌号和 QC .车主名设有代码 , 下面列出代码。
(1 ) 字段 XLD .牌号的 Valid 代码片段 :

SELE qc
LOCA FOR 牌号 = xld .牌号
IF NOT FOU N( )
    APPE BLA N & & QC .DBF 添记录
    REPL 牌号 WI TH xld .牌号
ENDI
SHOW GETS

    (2 ) 字段 QC .车主名的 Valid 代码片段 :

SELE cz
LOCA FOR 车主名 = qc .车主名
・ 2 77 ・
IF NOT FOU N( )
    APPE BLA N & & CZ .DBF 添记录
    REPL 车主名 WI TH qc .车主名
ENDI
SHOW GETS

    3 . 按钮设置
屏幕设计窗口中有两组按钮 , 分别说明如下。
( 1)“ 确定”按钮 : 在 Push Button 对话框中 , 通过 Variable 按钮键入变量 M-QD , 并选
定 Terminate READ on Selection 复选框。
(2 ) 下页、上页等按钮的 Valid 代码片段 :

SELE xld
DO CASE
    CASE m - an = 1                 & & 下页。 M - AN 是按钮变量
        IF R ECN( ) < R ECC( )
            SKI P
        ENDI
    CASE m - an = 2 & & 上页
        IF R ECN( ) > 1
            SKI P - 1
        ENDI
    CASE m - an = 3 & & 首页
        GO TOP
    CASE m - an = 4 & & 末页
        GO BOT T
    CASE m - an = 5 & & 寻页
        DO DJDH1 & & 调用子程序 DJDH1 .PRG
    CASE m - an = 6 & & 增页
        DEFI WIND zy FROM 10 , 25 TO 14 , 50 T I TLE ′增加登记单确认′;
            CLOS FLOA SYST
        ACT I WIND zy
        jlh = RECN( )
        @ 1 , 3 SAY ′是要增页吗 ?′GE T mzy DEFA ′
N′
        READ
        IF mzy$′Yy′
            GO BOT T
            mbh = 编号
            A PPE BLAN
            R EPL 编号 WI TH ST R( VAL ( mbh) + 1 , 4)
        ENDI
        RELE W IND

・ 2 78 ・
    CASE m - an = 7 & & 汽车
        SELE qc
        DEFI WIND brs F RO M 10 , 5 TO 22 , 75 CLOS FLOA SYST ;
            FONT ″
宋体″, 10 STYLE ′
b′
        ACT I WIND brs
        BROW T I TL ′汽 车 修 改′+ SPAC(25) + ′单击行首∶删除标记 ESC∶退出′NO MEN U
        RELE W IND brs
        PACK
    CASE m - an = 8 & & 车主
        SELE cz
        DEFI WIND brs F RO M 10 , 10 TO 22 , 70 CLOS FLOA SYST ;
            FONT ″
宋体″, 10 STYLE ′
b′
        ACT I WIND brs
        BROW T I TL ′车 主 修 改′+ SPAC(25) + ′单击行首∶删除标记 ESC∶退出′NO MEN U
        PACK
        RELE W IND brs
ENDC
SHOW GETS

    (3 ) 子程序 DJDH1 .PRG

* 功能 : 输入登记单号并查找。受 XCDJ .S PR 和 QCXL .SPR 调用。


DEFI WI ND xy FROM 10 , 25 TO 14 , 50 T I TLE ′查找修车登记单′CLOS FLOA SYST
AC TI WI ND xy
jlh = RECN ( )
@1 , 3 SAY ′
请输入编号∶′GET mbh1 DEFA 编号
READ
LOCA FOR 编号 = mbh1           & & 查到就指向该记录
IF NOT FOU N( )
    WAI T WI ND ′
无此登记单 !′
    GO jlh & & 查不到则指向原记录
ENDI
RELE WIND xy

三、汽车修理屏幕程序 QCXL .SPR


汽车修理屏幕程序的功能是输入或修改 修理小 时、完工 日期 和修理 工工 号。程序 特
点是 :
(1 ) 对选定的汽车修理单 , 除能输入或修改修理信息外 , 同时能 显示修车 登记单主 要
信息及零件用量。
这里说明一下 : 汽车修理程序 的功能 应该 包括 登记耗 用零 件 , 但此处 用 显示 零件 用
量代替进行输入。原因是零件出库时已登记过这些数据 , 这里只须按 XLD .编号来调用。
(2 ) 采用弹出控制选择 XLG .DBF 中现有修理工的工号 , 并即时显示他的名字。
屏幕文件 QCXL .SCX 的屏幕设计窗口如图 9 .14 所示。
・ 2 79 ・
图 9 .14   汽车修理屏幕设计窗口

1 . Screen Layou t 窗口的设置


选定 Screen 选单的 Layout 选项 , 在 Screen Layou t 窗口中作如下设置。
(1 ) 在 Title 文本框中键入 汽车 修理 ; 在 Name 文 本框 中键 入 QCXL ; 选定 Cen ter 复
选框。
(2) 选 定 Code 按 钮 , 然 后选 定 Screen Code 对 话 框 的 Screen Setup Code 按 钮 , 在
QCXL-Setup 文本编辑框中键入如下代码片段 :

P UBL mljh1 , mljh2 , mljh3 , mljh4 , msl1 , msl2 , msl3 , msl4   & & 提供存储 4 对零件号与数量
DIME xlga (10 , 1 )
SELE xlg
COPY TO ARRAY xlga FI EL 工号   & & XLG .DBF 的工号存入数组
LOCA FOR 工号 = xld .工号 & & 移动记录指针 , 为使屏幕出现时立即显示修理工名

    (3 ) 选定 Code 按钮 , 然后选定 Screen Code 对话 框的 On Refresh 按钮 , 在 Code Snip-


pet 文本编辑框中键入如下代码片段 :

* 功能 : 在 Show Gets 刷新屏幕时 , 将符合当前 xld .编号的零件号及数量赋给内存变量 ,


* 否则相应内存变量保持初始值。
STOR SPAC(6) TO mljh1 , mljh2 , mljh3 , mljh4
STOR 0 TO msl1 , msl2 , msl3 , msl4
SELE ljyl
LOCA FOR 编号 = xld .编号
IF FO U N( )
    mljh1 = 零件号

・ 2 80 ・
    msl1 = 数量
ENDI
CONT
IF .NOT . EOF ( )
    mljh2 = 零件号
    msl2 = 数量
ENDI
CONT
IF NOT EOF ( )
    mljh3 = 零件号
    msl3 = 数量
ENDI
CONT
IF .NOT . EOF ( )
    mljh4 = 零件号
    msl4 = 数量
ENDI

    2 . 字段设置
屏幕 设 计 窗 口 中 下 列 字 段 为 输 出 对 象 ( Out put Field ) : XLD .编 号 , XLD .牌 号 ,
XLD .修理项目 , XLD .送修日期 , mljh1 , mljh2 , mljh3 , mljh4 , msl1 , msl2 , msl3 , msl4 ,
XLG .姓名。
输出对象 Field 对话 框的 设 置 : 均须 选定 Refresh Ou tput Field 复 选框 ; 对内 存变 量
mljh1~ mljh4 , 在 Format 文本框中键入 999999 ; 对 内存变 量 msl1~ msl4 , 在 Format 文 本
框中键入“ @Z 99”字样。
下列字段为输入对象 ( Input Field) : XLG .修理小时 , XLD .完工日期。
3 . 工号弹出控制的设置
双击屏幕设计窗口的弹出控制即出现如图 9 .1 5 所示的 Popup 对话框 , 下面说明在该
对话框所进行的设置。
(1 ) 选定 Array Popup 单选钮 , 并在其 右侧 的文 本框中 键入 XLGA, 表 示弹出 控制 的
数据来自数组 XLGA。
( 2) 通过弹出控制选定的 XLG .DBF 中的工号必须存入 XLD .DBF 中 , 才能认定是这
位修理工修理的汽车 , 故 Variable 右侧的文本框中键入 XLD .工号。
(3 ) XLD .工号的 # Elements 代码片段 :

XLG′)         & & 使弹出控制仅包含 XLG .DBF 所有的记录


RE TU RECC(′

    (4 ) XLD .工号的 Valid 代码片段 :

SELE xlg
LOCA FOR 工号 = xld .工号     & & 移动记录指针 , 为选工号后显示修理工姓名
SHOW GETS

・ 2 81 ・
图 9 .15   工号弹出控制的 Popup 对话框

    4 . 按钮设置
屏幕设计窗口中有两组按钮 , 分别说明如下。
(1 “
) 确定”按钮 : 在 Push Button 对话 框中 , 通过 Variable 按钮 键入 变量 M - QD , 并
选定 Terminate READ on Selection 复选框。
(2 ) 下页、上页等按钮的 Valid 代码片段 :

SELE xld
DO CASE
    CASE m - an = 1                   & & 下页。M - AN 是按钮变量
        IF R ECN( ) < R ECC( )
            SKI P
        ENDI
    CASE m - an = 2 & & 上页
        IF R ECN( ) > 1
            SKI P - 1
        ENDI
    CASE m - an = 3 & & 首页
        GO TOP
    CASE m - an = 4 & & 末页
        GO BOT T
    CASE m - an = 5 & & 寻页
        DO DJDH1
ENDC
SHOW GETS

・ 2 82 ・
四、零件订货计划程序 LJDH .PRG
订货计划程序说明 :
(1 ) 程序通 过执 行 XJD .SPR 选季 度 , 其后 显示 LJKC .DBF 中库 存量 小于最 低库 存
的零件信息及其订货量。订货量可当场修改。
(2 ) 季度不作为筛选记录的条件 , 仅在选季度窗口标题栏上显示出来。
一种可能的程序如下 :

DO xjd .spr                     & & 选季度窗口


SE T VI EW TO qcxl
SELE ljkc
COU NT FOR 库存量 < 最低库存 TO jls
IF jls = 0
    bt = ′
库存量均不小于最低库存 , 第 ′+ jd + ′季度不需订货 ′
ELSE
    bt = ′
第 ′+ jd + ′季度零件订货计划′
ENDI
DEFI WI ND brs FROM 5 , 15 TO 15 , 70 T I TL bt CLOSE SYSTEM MINI FONT ″
宋体″, 10
AC TI WI ND brs
IF jls = 0
  BROW FI EL 零件号 , 零件名 , 库存量 , 最低库存 NOMODI NODEL E NOAP;
& & Browse 窗口只读
ELSE
  SE T FI LT TO 库存量 < 最低库存
  BROW FI EL 零件号∶R , 零件名∶R , 库存量∶R , 最低库存∶R , 订货量 ;
& & 仅订货量可修改 , 其余字段为只读
  SE T FI LT TO
ENDI
RELE WIND brs

    程序所调用的选季度屏幕程序 , 其屏幕 文件 XJD .SCX 的屏幕 设计 窗口 如图 9 .16 所


示 , 下面说明其设置。

图 9 .16   选季度屏幕设计窗口

・ 2 83 ・
1 . Screen Layou t 窗口的设置
选定 Screen 选单的 Layout 选项 , 然后便可在 Screen Layou t 窗口中进行设置。
(1 ) 在 Title 文本框中键入“ 确定季度 Esc 退出”; 选定 Center 复选框。
(2) 选 定 Code 按 钮 , 然 后选 定 Screen Code 对 话 框 的 Screen Setup Code 按 钮 , 在
QCXL-Setup 文本编辑框中键入如下代码片段 :

P UBL jd             & & 说明 JD 为全局变量

2 . 季度数弹出控制的设置
双击屏幕设计窗口中的弹出控制即会出现如图 9 .1 7 所示的 Popup 对话框 , 其设置说
明如下。

图 9 .17   季度数弹出控制的 Popup 对话框

(1 ) 选定 List Popup 单选钮 , 并在 Popup Prompts 滚动列表中分行键入 1 ~4 , 用来表


示弹出控制数据的来源。然后在 Initial 弹出控制中选定 1 为初始值。
(2 ) 在 Variable 按钮右侧的文本框中键入 M - JD。
(3 ) When 按钮的代码片段 :

jd = m - jd           & & 滚动列表选定值赋给全局变量 JD

五、零件入库管理程序 LJRK .PRG


零件入库管理程序说明 :
(1 ) 零件信息先输入到暂存文件 LJRK .DBF 中 , Browse 窗口提供 5 个空 白记录供 用
户输入零件信息。
(2 ) 零件号可直接输入或在由 XLJH .SPR 提供的滚动列表中选取。
(3 ) 存盘时暂存文件的 数据才 代入 LJKC .DBF。入库 时空 记录将 被删 除 , 老 零件 须
将库存量加上入库数量 , 而新零件则直接入库。
(4 ) 提供功能键来启动选取零件号或存盘。
・ 2 84 ・
一种可能的程序如下 :

SELE ljrk
ZAP                             & & 清空
F OR i = 1 TO 5 & & 添 5 个空记录 , 即一次最多 5 个零件入库
  AP PE BLAN
ENDF
GO 1
P USH KEY CLEA & & 清除以前 ON KEY LABEL 命令定义的功能键
ON KEY LABEL f2 DO xh & & F2 --- 选零件号
ON KEY LABEL f3 DO cp & & F3 --- 存盘
DEFI WI ND brs FROM 10 , 5 TO 19 , 75 CLOS FLOA SYST
AC TI WI ND brs
BROW FI EL 零件号∶v = cxllj ( )∶F , 零件名 , 成本 , 库存量∶H = ′
数量′, 价格 ,     最低库存 , ;
订货量 NOMENU F ONT ″宋体″, 10 STYLE ′b′;
T I TL ′零 件 入 库′+ SPAC( 25) + ′
F2∶选号 F3∶存盘 Esc∶取消′
RELE WIND brs
PROC cxllj & & 抄写老零件记录
    SELE ljkc
    LOCA FOR 零件号 = ljrk .零件号
    IF FO UND( )
      SELE ljrk
      REPL 零件名 W IT H ljkc .零件名 , 成本 WI TH ljkc .成本 , 库存量 WI TH 0 , ;
价格 W IT H ljkc .价格 ,     最低库存 W IT H ljkc .最低库存 , ;
订货量 W IT H ljkc .订货量     & & 抄写老零件记录 , 数量记 0
      DELE & & 为老零件设置标志
    ENDI
    SELE ljrk
PROC xh & & 选零件号
    rk = 1 & & 入库 RK 置 1
    DO xljh .s pr & & 在滚动列表中选零件号
    RELE W IND xlih
PROC cp & & 存盘
    SELE ljrk
    INDE ON 零件号 TAG 零件号
    SELE ljkc
    SET RELA TO 零件号 I NTO ljrk
    REPL ALL 库存量 WI TH 库存量 + ljrk .库存量     & & 老零件入库 : 库存量 + 入库数量
    SELE ljrk
    DELE FOR EMPTY (零件号 ) & & 零件号为空或空格串 EM PTY 返回 .T ., 为设置删除标志
    PACK & & LJRK .DBF 中删去老零件和空白记录
    U SE

・ 2 85 ・
    SELE ljkc
    APPE FRO M ljrk & & 新零件入库
    IF USED(′ljrk′)
        SELE ljrk
    ELSE
        USE ljrk I N 0
    ENDI

    屏幕文件的 XLJH .SCX 窗口 如图 9 .18 所 示 , XLJH .SP R 除被 本 程序 调 用 外 , 还 被

图 9 .18   选零件号屏幕设计窗口

LJCK .PRG 调用。下面说明屏幕设计窗口的设置。


1 . Screen Layou t 窗口的设置
选定 Screen 选单的 Layout 选项 , 然后在 Screen Layou t 窗口中 设置 : 在 Title 文本 框
中键入选择零件号 ( 双击 ) ; Name 文本框中键入 XLJH ; 选定 Center 复选框。
2 . 季度滚动列表的设置
双击屏幕设计窗口的滚动列表即会出现如图 9 .19 所示的 List 对话框 , 其设置说明如
下。

图 9 .19   季度数滚动列表的 List 对话框

・ 2 86 ・
(1 ) 选定 F rom Field 单选钮 , 然后在 Field 按钮右侧的文本框内键入表达式

Ljkc .零件号 + ′′+ Ljkc .零件名 + ST R( Ljkc .库存量 , 4)

(2 ) 在 Variable 按钮右侧的文本框中键入 M - XH。


(3 ) Valid 的代码片段 :

IF rk = 1
    REPL ljrk .零件号 WI TH ljkc .零件号
ELSE
    REPL ljck .零件号 WI TH ljkc .零件号
ENDI

    (4 ) 选定 Terminate WHE N choice is MADE 复选框。


六、零件出库管理程序 LJCK .PRG
零件出库管理程序说明 :
(1 ) 出库零件信息先输入到暂存文件 LJCK .DBF 中 , Browse 窗 口提供 4 个空记录 供
用户输入零件信息。
(2 ) 零件号可直接输入或在由 XLJH .SPR 提 供的滚 动列表中 选取 , 还 设有零 件号 校
验和数量校验功能。
(3 ) 存盘时暂存文件数 据才代 入 LJCK .DBF。出 库处 理做 两件事 , 其 一 是在 库存 量
中减去出库数量 ; 其二是登记零 件用量 , 即在 LJCK .DBF 中 删除 空记 录后 将 零件 记录 送
到 LJY L .DBF 中去。
一种可能的程序如下 :

DO djdh                         & & 输入登记单号


SELE ljck
ZAP & & 清空 ljck .dbf
F OR i = 1 TO 4 & & 添 4 个空记录 , 即一次最多 4 个零件出库
    APPE BLA N
ENDF
GO 1
P USH KEY CLEA & & 清除以前 ON KEY LABEL 命令定义的功能键
ON KEY LABEL f2 DO xh & & F2 --- 选零件号
ON KEY LABEL f3 DO cp & & F3 --- 存盘
DEFI WI ND brs FROM 10 , 20 TO 18 , 62 CLOS FLOA SYST
AC TI WI ND brs
BROW FI EL 零件号∶v = ljhxy( ) , 数量∶v = slxy( ) : F∶E = ′数量请改小′NOMEN U ;
    F ONT ″宋体″, 10 STYLE ′b′  T I TL ′零 件 出 库     F2∶选号 F3∶存盘 Esc∶取消′
RELE WIND brs
PROC ljhxy & & 零件号校验
    SELE ljkc
    LOCA FOR ljkc .零件号 = ljck .零件号

・ 2 87 ・
    IF NOT F OU ND( )
        WAI T WIND ′
仓库中无此零件 , 请按 F3 选零件号 !′T IMEOUT 1
    ENDI
    SELE ljck
PROC slxy & & 数量校验
    SELE ljkc
    LOCA FOR 零件号 = ljck .零件号
    IF FO UND( ) AND 库存量 < ljck .数量
        WAI T WIND 零件号 + ′不够 , 缺少′+ ST R( ABS( kcl-ljck .数量 ) , 3) + ′件′TI MEOUT 1
        REPL ljck .数量 W I TH 0
    ENDI
    SELE ljck
PROC xh & & 选零件号
    rk = 0 & & 出库 RK 置 0 , 用于存零件号
    DO xljh .s pr & & 在滚动列表中选零件号
    RELE W IND xlih
PROC cp & & 存盘
    SELE ljck
    INDE ON 零件号 TAG 零件号
    SELE ljkc
    SET RELA TO 零件号 I NTO ljck
    REPL ALL ljkc .库存量 W I TH ljkc .库存量 - ljck .数量   & & 库存更新 : 库存量 - 出库数量
    SET RELA TO
    SELE ljck
    DELE FOR EMPTY (零件号 ) & & 为空白记录设置删除标志
    PACK & & LJCK .DBF 中删去空白记录
    U SE
    SELE ljyl
    APPE FRO M ljck & & 记载零件用量
    REPL 编号 WI TH mbh F OR EMPTY ( ljyl .编号 )
    IF USED(′ljck′)
        SELE ljck
    ELSE
        USE ljck IN 0
    ENDI

    输入登记单号程序 DJDH .PRG 如下 :

* 功能∶ 输入登记单号。被 LJCK .PRG 和发票代码片段调用。


DEFI WI ND xld FROM 10 , 30 TO 14 , 55 T I TLE ′确定登记单号′CLOS FLOA SYST
AC TI WI ND xld
P UBL mbh
m bh = SPAC(4 )

・ 2 88 ・
@1 , 3 SAY ′
请输入编号∶′GET mbh
READ
SELE xld
LOCA FOR 编号 = mbh
IF NOT FOU N( )
    WAI T WI ND ′
无此登记单 !′
    RELE W IND xld
    RE TU TO MAST ER
ENDI
RELE WIND xld

七、查询屏幕程序 CX .SPR
查询程序利用 FoxP ro 提供的屏幕文件 BROWSER 产生 , 可参考例 6-7 来设计。
1 . 复制组合查询屏幕文件

! COPY C∶ \ FOXPROW \ SAMPLE \ ORGANIZE \ SCR EENS \ BROWSER .S C ? CX .SC ?

    2 . 修改屏幕定义
执行命令 MODI FY SCREE N CX 打开屏 幕 设计 窗口 , 如 图 6 .37 所示。 然后 参考 例
6-7 将它修改成如图 6 .36 所示的情形。
3 . 显示中文库文件名
第六章已经介绍 , BROWSER 屏 幕文 件能 查 询当 前 环境 中 的 库文 件 , 现 在 通过 修 改
代码片段来为 CX .SCX 设置环境。即 , 选定 Screen 选单的 Layou t 选项→在 Screen Layout
窗口中选定 Code 按钮→选定 Screen Code 对话框的 Screen Setup Code 按钮 , 在 CX-Setup
文本编辑框中代码片段的头部插入如下命令段 :

CLOSE ALL
U SE xld AL IA 修理单 IN 0       & & 别名用于显示中文库文件名
U SE qc ALIA 汽车 IN 0
U SE cz AL IA 车主 IN 0
U SE xlg AL IA 修理工 IN 0
U SE ljyl AL IA 零件用量 I N 0
U SE ljkc ALIA 零件库存 IN 0

    退出查询程序时必须恢复以前的环境 , 可 通过 Cleanup and Procedures 按 钮键入命 令


“SE T VIEW TO QCXL”。
八、发票代码片段
发票代码片段设置在选单设计窗口的打印选单下 ( 参阅图 9 .11) , 代码如下 :

DO DJDH                 & & 确定登记单号


SELE ljyl
SU M 数量 * ljkc .价格 FOR 编号 = m bh AND 零件号 = ljkc .零件号 TO ljf ;
& & 计算零件费。 LJYL .DBF 与 LJKC .DBF 已在零件号上关联
RELE WIND xld

・ 2 89 ・
REPO FORM fp PR EV & & FP .FRX 中的报表变量 MLJF = LJF

    上述代码片段中的报表文件 FP .F RX, 其报表设计窗口如图 9 .20 所示。 窗口中共 有


9 个报表表达式 , 都用字 段 定义 工 具建 立 , 它 们 是 : XLD .完 工 日期 , QC .车主 名 , CZ .地
址 , XLD .牌号 , XLD .修理项目 , XLD .送修日期 , M LJF , MXLF, MLJF + MXLF。

图 9 .20   发票的报表设计窗口

在定义 MLJF , MXLF 和 MLJF + MXLF 等 3 个报表表达式之前 , 须先定义 MLJF 和


MXLF 两个报表变量。通 过 Report 选单 的 Variables 选项 来 定 义时 , 报表 变 量 MLJF 在
Variable Definition 对话框中填写 的 Value to Store 值 与 Initial Value 值都 是 LJF; MXLF
在这两项填写的值都是 XLD .修理小时 * XLG .小时工资 * 3。
定义报表表达式 M LJF 时 , 可在 Expression Builder 对话 框的 Variable 滚动列 表中 选
用已定义的 报 表 变 量 M LJF ; 定 义 报 表 表 达 式 MXLF 可 用 类 似 的 方 法 选 用 报 表 变 量
MXLF。定 义 报表 表 达 式 MLJF + MXLF 时 , 则 可在 Repor t Expression 对 话框 中 的 Ex-
pression 按钮右方的文本框中直接键入报表变量表达式 M LJF + MXLF。
还须注意 , 对于报表表达式 M LJF 和 MLJF + MXLF, 在 Repor t Expression 对 话框 中
的 Format 值应设为 9999 .9 9。
九、修理工工资月报代码片段
工资月报代码片段也设置在选单设计窗口的打印选单下 ( 参阅图 9 .11) , 代码如下 :

SE T VI EW TO xlggz     & & XLGGZ .VUE : XLG .DBF 与 XLD .DBF 在工号上关联
DO yf

・ 2 90 ・
SELE xld
TOTAL O N 工号 TO xlxshz FOR MONTH (完工日期 ) = myf & & 产生汇总文件 XLXSHZ .DBF
SELE 0
U SE xlxshz
SE T RELA TO 工号 INTO xlg
REPO FORM xlggz PREV
SE T VI EW TO qcxl

    在代码片段开始进行 了 环 境设 置 , 文 件 XLGGZ .VU E 的 视 图窗 口 如 图 9 .21 所示。


图中的 XLG .DBF 与 XLD .DBF 在工 号 上进 行了 关联 ; 该环 境 On | Off 面 板 的 SAF E TY
状态设置为 OFF。

图 9 .21   XLGGZ .VU E 的 View 窗口

上述代码片段中的报表文件 XLGGZ .F RX, 其 报表 设计 窗 口如 图 9 .22 所 示。窗 口



共 有 5 个 报 表 表 达 式 , 都 用 字 段 定 义 工 具 建 立 , 它 们 是 : XLG .工 号 , XLG .姓 名 ,
XLXSHZ .修理小时 , XLG .小时工资 , XLXSHZ .修理小时 * Xlg .小时工资。
其中第三和第五两个报表表达式的定义的有 效性 由代 码片段 中汇 总处理 来保 证 , 如
果汇总 2 月份 XLD .DBF 的数据 , 则 XLXSHZ .DBF 的内容如下 :

Record # 编号 牌号 修理项目 送修日期 完工日期 工号 修理小时


1 5003 H210-100 喷漆 97/ 02/ 06 97/ 02/ 13 0001 6 .0
2 5002 R1212123 刹车 97/ 02/ 05 97/ 02/ 10 0005 3 .2

    还须注意 , 对于 第五个报 表表达 式 , 在 Report Expression 对话 框中的 Format 值应 设


为 9999 .99。
十、
“ 退出”代码片段
SE T TALK ON

SE T SA FE ON

・ 2 91 ・
图 9 .22   工资月报的报表设计窗口
CLEA ALL
MODI WIND SCREEN     & & 恢复主窗口的 FoxPro 系统标题
SE T SYSM TO DEFA & & 恢复 FoxPro 系统选单
AC TI WI ND COMMAND & & 激活命令窗口

    编码结束以后 , 应对系统进行测试。测试一般可分成模块测试和综合测试二个阶段。
其一般方法已在第 4 .5 节介绍 , 这里不再讨论。

9 .2 .5   运行设 计

一、装载数据
    在应用系统投入运行之前 , 通常先要往 数据 库装入 必要 的或 已有的 成批 数据。但 本
系统也可在运行时装载数据 , 例如通过登记、零件入库等功能来装载。在 9 .2 .2 节已经为
本系统列出一批数据 , 但修理工管理程序尚未编写 , 故修理工信息只得打开 XLG .DBF 来
输入。
二、设置应用系统程序项图标
本系统必须在 Windows 下运行。为便于用户操作 , 可在 Windows 的程序管理器中设
置程序项。设置步骤如下 :
(1 ) 进入 Windows;
(2 ) 在程序管理器窗口 双击 FoxP ro for Windows 组图 标 , 该组 窗口就 被 打开 →选 定
“文件”选单的“新建”选项→在“新的程序 对象”对话框 中选定“程 序项”单 选钮 →选 定“ 确
定”按钮 ;
(3 ) 在“ 程序项特性”对话框的文本框 中填写数 据。如下所 示 , 标 题的右边 都是填 入
的数据。
说明 : 汽车修理管理系统
命令行 : \ FOXPROW \ FOXPROW QCXLGL .MPR - T
工作目录 : \ FOXPROW \ QCXL

・ 2 92 ・
选定“确定”按钮后 , 系统的程序项图标 就被建立。“ 命令行”中的参 数“ - T”能屏 蔽
Sign On 屏幕 , 即应用程序启动后跳过显示 FoxPro 系统封面的环节。
三、系统启动方法
启动方 法 与 其 它 Windows 应 用 程 序 相 同 , 即 : 在 程 序 管 理 器 窗 口 双 击 FoxPro for
Windows 组图标→双击汽车修理管理系统程序项图标。

9 .3   项目管理器

用 FoxP ro 开发的应用系 统常包含许多文件 , 例如 .PRG 程序文件、选单文 件、屏幕 文


件、报表文件表、视图文件和数据库文件等。修改 某个 文件 时 , 除必须 确切 了解该 文件 的
名字 , 还要记住这种文件的打开方法 , 比较麻烦。项目 管理器 ( Project Manager) 提供了 一
个维护应用系统的集成环境 , 它能包含应用 系统的 所有 文件 , 允许 编辑 其中 的任一 文件 ,
并且具有生成应用程序的能力。项目管理器不但 是一 个维 护工具 , 即 使在 软件开 发时 使
用它也能省事不少。本节结合“汽车修理管理系统”来介绍它的使用方法。

9 .3 .1   基本操 作

一、打开项目管理器
    为使建立的项目文件能与“汽车修理管 理系统”的 程序 和数据 放在 一起 , 可先 执行 一
条 SE T DEFAU L T T O \ FOXP ROW \ QCXL 命令。
MODIFY P ROJECT 命令 用 于 打 开 项目 管 理 器 , 若在 命 令 窗 口 键 入 命 令 MODIFY
P ROJECT QCXL , 就会出现 QCXL .PJX 项目 管理 窗口 ( 参阅 图 9 .23 ) 。命 令中 的 QCXL

图 9 .23   QCXL .PJX 项目管理窗口与增加文件对话框

是项目文件名 , 其扩展名为 .PJX。项目文件有一个 备注文件 , 其主 名与项 目文件相 同 , 扩


展名为 .PJT。

・ 2 93 ・
利用选单也可打开项目管理器 , 此时文件类型应选择 P roject。
二、项目管理窗口中的主文件
每个项目有一个主文件 , 它是应用系统 中调 用其它 程序 的最 上层程 序。主文 件确 定
后 , 建立项目时被调用文件会自动增入项目管理窗口。
Fox Pro 默认增加到项目管理窗 口中 的第 一 个选 单文 件或 程序 文 件为 主文 件。例 如
将汽车修理管理系统的选 单程序增入项目 管理窗口 , 其步骤为 : 在 QCXL .PJX 项目 管理
窗口中 选 定 Add 按钮 → 在如 图 9 .23 所示 的 Add File 对话 框中 双击 滚 动列 表 中的 程 序
QCXLGL .MP R→项目管 理窗 口 中 就显 示 出 名 为 QCXLGL 的文 件 , 其 类型 为 P rogram。
在 Program 左方有一个圆点 , 表示 QCXLGL .MP R 是主文件 ( 参阅图 9 .24 ) 。
三、Build Option 对话框
Build Option 对话框在选定 Build 按钮后打开 , 该对话 框中 包含 3 个单 选钮和 两个 复
选框 ( 参阅图 9 .24) 。

图 9 .24   增入主文件后的项目管理窗口与建立选择对话框

1 . Rebuild Project 单选钮


该单选钮用于建立一个项目 , 项目建立后生成 .PJX 和 .PJT 文件。
如图 9 .24 所示 , 为主文件 QCXLGL .MP R 建立项目的步骤为 : 在项目管理窗口中选
定 Build 按钮→在 Build Op tion 对话框中选定 Rebuild Project 单选钮→选定 OK 按钮后系
统就开始建立项目。
项目建立后 , 在当前 目录中将 生成文 件 QCXL .PJX 和 QCXL .PJT , 并在项 目管理 窗
口中自动增添由 QCXLGL .MP R 调用的各级各类文 件 , 结 果如图 9 .25 所示。由图 可见 ,
文件 CX 属于屏幕类 ( Screen Set ) , 文件 DJDH 属于 程序 类 ( Program) , 文件 FP 属 于报 表
类 ( Report ) , 等等。
2 . Build Application 单选钮
该单选钮用于从已建的项目建立应用程序 , 应用程序的扩展名为 .APP。 若项目尚 未
建立则先建立项目 , 然后建立应用程序。
为主文件 QCXLGL .M PR 建立应用程序的步骤为 : 在 QCXL .PJX 项目管理窗口中选
定 Build 按钮→在 Build Option 对话框中选定 Build Application 单选钮→选定 OK 按钮 →
・ 2 94 ・
图 9 .25   建立项目后的项目管理对话框

在 Save As 对话框中选定 Build , 就能建立应用程序 QCXL .APP。


.APP 文件可用 DO 命 令运 行。由 于 QCXL .APP 是 以 QCXLGL .M PR 为 主文 件 建
立的“
, DO QCXL .APP”的效果与“DO QCXLGL .MP R”一样。
3 . Build Executable 单选钮
建立 .EXE 执行程序 , 详见 9 .3 .2 节。
4 . Rebuild All 复选框
该复选框用于更新项目中的所有文件。
5 . Display Errors 复选框
该复选框用于在建立目标的过程中显示出错信息。
四、文件编辑
选定项目管理窗口中任一文件 , 然后 选定 Edit 按 钮 , 就 会出 现该 文件 的 编辑 环境 以
供编辑。例如选定 QCXLF M, 将会出现 QCXLF M .SCX 屏幕设计窗口。

9 .3 .2   生成 .EXE 文 件

前已谈到 , 项目管理器中 Build Option 对话框的 Build Execu table 单选钮可用于建立 .


EXE 执行程序。但是 , 该单选钮仅在安装 FoxPro Distribu tion Kit ( 开发工 具包 ) 后才会 发
亮 , 否则不能选用。 FoxPro 有标准版和开发版之分 , 前者不包含这种工具。
一、Distribution Kit 的安装
Fox Pro2 .5b 开发版包含 CK , DK, LCK , MK 和 SYS 等 5 个子目录。
1 . 安装 FoxP ro
如果所用的电脑中尚无 FoxP ro, 须先把它安 装好。安 装步骤 为 : 进入 文件管 理器 →
双击 SYS 目录 下的 SE T U P .EXE→ 确认 默认目 录 C∶ \ FOXP ROW 为存 储 FoxPro 的 目
录。
2 . 安装 Dist ribution Kit
・ 2 95 ・
进入文件管理器→双击 DK 目录下的 SE T U P .EXE→确认默认目录 C∶ \ FOXP ROW
为存储 Dist ribution Kit 的目录。
安装完成后 , Build 程序 Option 对话框中的 Build Executable 单选钮就会变亮。
二、生成 .EXE 程序
为主文件 QCXLGL .MP R 建立 QCXL .EXE 程序的步骤 为 : 在 QCXL .PJX 项 目管 理
窗口中选定 Build 按 钮 → 在 Build Option 对 话框 中 选 定 Build Executable 单 选 钮 → 选 定
OK 按钮→在 Save As 对话框中选定 Build。
三、执行 .EXE 程序的条件
.EXE 程序可以脱离 FoxPro 运行 , 即可在未 装有 FoxPro 的电脑 上运行 , 条件 是下 列
文件须 放 在 同 一 目 录 中 : ( 1 ) .EXE 程 序 ; ( 2 ) 所 有 的 数 据 库 文 件 ; ( 3 ) 支 持 库 文 件
FOXW250B .ESL ; ( 4) 资源文件 FOXUSER .DBF 及 FOXUSER .FPT 。
支持 库 文件 和资 源文 件都 在 FOXPROW 目录 下 , 将 它们 复制 到 规定 的目 录没 有 困
难。但是 , 仅 FOXW250B .ESL 一个文件就约占 2MB, 大于一张软盘的容量 , 如何将这 些
文件存储到软盘上去呢 ? 办法之一 , 用 AR J 等专用软件先将这 些文件 压缩 ( 也称为 打包 )
后复制到软盘 ; 然后将软盘上的压缩文件复 制到 另一电 脑再 释放 出来。这 种方法 的缺 点
是应用系统程序项图标要用户自己制作。办法之二 , 利用 FoxPro 提供的 SE T U P .APP 程
序来生成一套安装盘 , 这套盘 中的 1 号盘 上有 一 个 SE T UP .EXE 文件 , 可 供 用户 在文 件
管理器中安装应用系统。这种方法具有自动生成应用系统程序项图标的优点。
SE T U P .APP 文件在 FOXPROW 目录下 , 用 DO 命 令执 行。该程 序一 开始运 行屏 幕
就会出现 Microsoft Fox Pro Custom Set up Wizard 对 话框 , 用 户根 据提 示逐 页 填入 数据 后
就可在硬盘某目 录 中 生 成 软盘 数 据 , 该 目 录 的 子 目 录 D ISK1 存 储 1 号 盘 数 据 , 子 目 录
DISK2 存储 2 号盘数据 , 等等。将这些数据分别复制到软盘就是一套安装盘。

9 .4   文档生成器
软件必须包含文档 , 但是文档制作费时 很多。特 别是 软件 开发至 维护 的每一 环节 常
有修改 , 于是文档也须不断修改。如果文档不 及时 更新 , 将 使软件 开发 失去依 据 , 甚至 造
成交付使用的应用系统与文档不 符 , 影 响软 件质 量。 FoxPro 提供 了文 档生 成器 , 它能 根
据软件当前状况快速生成各种文档文件 , 具有用法简便的特点。
一、打开文档生成器
选定 Program 选单的 FoxDoc 选项 , 即会出现 FoxDoc 对话框 ( 参阅图 9 .26 ) 。
二、FoxDoc 对话框
1 . 填写 FoxDoc 对话框
根据“汽车修理管理系统”填写的 FoxDoc 对话框如图 9 .26 所示。对话框中有 4 个文
本框是必填项 , 可利用按钮来帮助填写。
(1 ) Main File 按钮 : 用来选择应用系统主程序。
(2 ) Program Dir 按钮 : 用来选择应用系统的程序目录。
(3 ) Data Dir 按钮 : 用来选择应用系统的数据目录。
・ 2 96 ・
图 9 .26   文档对话框

(4 ) Ou tput Dir 按钮 : 用来选择存放文档文件的目录。


必须注意 , 在生成文档前这些目录必须存在。
2 . CONF IG .FDW 文件
系统默认用 CONF IG .FDW 文件保存 FoxDoc 对话框中的信息。
Save 按钮 : 用于将 FoxDoc 信息保存到 CONF IG .FDW 中。
Restore 按钮 : 用于选定 CONF IG .FDW , 从 而显 示以 前填 入的 信 息。这 能免 除重 新
填写 FoxDoc 对话框的手续。
三、文档生成
FoxDoc 对话框右上角的 Generate 按钮用于启动文 档生成。 文档生 成后 将出 现 Doc-
umentation Printing 对话框 , 若此时不要打印文档 , 可选定 Cancel 按钮退出。
文档文件的个数很多 , 其内容根据扩展名分类 :
.DOC   系统概要。表 9 .1 列出了几种常用的文档。
.ACT   PRG 程序
.AC1   屏幕程序
.AC2   选单程序

表 9 .1   .DOC 常用文档

文 档 文 件 内   容

dbfsum ry .doc 表/ .DBF 概要

mnxsumry .doc 选单文件概要

prcsumry .doc 过程和函数概要

・ 2 97 ・
续表

文 档 文 件 内   容

filelist .doc 应用系统包含的过程、函数及所有文件

stats .doc 各类文件的数量、名字和创建的文档文件的名字

t ree .doc 模块调用结构

    文档生成器生成的文件不一定符合 人们 的习 惯 , 可 在修 改后 使用。文 档文件 也可 用


MODIFY COM MAND 命令来编辑。

习   题
1 . 以树形结构画出“汽车 修理管 理系 统”的总 体模块 图 ( 即程 序调 用关 系图 ) 。应 用
程序生成器的内部模块不须列出。
2 . 为“汽车修理管理系统”设计、编写程序 , 并挂入选单。
(1 )“ 修理工管理”程序。
(2 ) 打印“ 修车台帐月报”, 月报中要求包括以下数据 : 编号 , 型号 , 项目 , 修理 小时 , 修
理工工号 , 修理费 , 零件费 , 总计 , 车主 , 送修日期 , 完工日期。
(3 ) 打印“ 零件耗用月报”。
(4 ) 数据备份程序、备份恢复程序。
3 . 为“汽车修理管理系统”编写用户操作手册。

・ 2 98 ・
第十章   多用户应用初步

    早期在 PC 类微机广泛使用的 XBASE 数据库管理系统 , 其数据库在同一 时间只允 许


一个用户使用 , 属于单用户数据库管理系统。它们的特点是数据难于共享 , 一般运行在单
机环境。自从 DBASEIII P LUS 多用户版上市以后 , FOX 公司紧随其后推出 MFOXPL US
和 FoxP ro, 多用户数据库管理系统开始在微机系统上流行。 多用户 数据库应 用系统允 许
多个用户同时使用 , 一般运行于多用户操作系 统管理 下的 多终 端计算 机主 机或计 算机 网
络环境 , 其特点是数据易于共享 , 各用户间传递 数据非 常方 便 , 已成为 现代 信息管 理的 基
本工具。

10 .1   多用户环境
多用户环境可分为两类 : 一类是多用户主机系统 , 另一类是计算机网络。前者是单机
系统 , 后者是多机系统。
早期的多用户数据库管理系统大多运行在 带终端 的大、中、小 型计 算机上 , 称 为多 用
户主机 ( HOST) 系统。它们允许用户 在 各自 的终 端上 调用 主 机的 部分 程序 和数 据 , 组 成
了相对集中的数据库管理系统。随着微机性能不断提高 , 很多微机已能承担原中、小型计
算机一样的主机职能 , 在前些时间 , 国内就有一些 用户在 XE NIX 多用户操 作系统 下运 行
M FOXP LUS 等多用户数据库管 理系 统 , 在信 息 管理 中发 挥了 一定 的 作用。 近几 年网 络
应用迅速扩大 , 已有更多的多用户数据库管理 系统被 移植 到计 算机网 络特 别是微 机局 域
网上。目前流行最广、最为 国内 用户 熟悉 的 局域 网要 数 Novell 公 司 的 Netware 386。 其
次 , Microsoft 公司的 Windows 组网方案 也正在 崛起。 它们的 共同 特点 是 , 不 仅能 支持 数
十乃至数百本地的局域网用户 , 同时也支持远程用户入网 ; 它们都支持异种机器乃至异种
操作系统共网 , 都有有效的系统安全控制 , 网络 扩展也 比较 容易 ; 最主 要的 是这些 网络 组
网方便而投资不大 , 可以使用廉价的网卡组 成性 能不错 的微 机局 域网。就 目前国 内市 场
价格而言 , 一台微机工作站入网所增加的网卡连同电缆的成本可低至 200 元以下 , 而网卡
的通讯速率一般能达到 10Mb/ s。通讯速率达 100Mb/ s 的 网卡也 正在普及 之中。相信 要
不了多长时间 , 我们在局域网使用共享数据库时的感觉就会像现在在本机上运行一样。
Novell 和 Windows 两种网络 都 可以 用来 安 装 FoxPro for Windows , 本 节将 以 Novell
为例 , 讲述在 Novell Netware 386 V3 .11 局域 网 上安 装多 用户 Fox Pro for Windows 的 过
程。

10 .1 .1   Novell 网的结构

Novell 网采用服务器/ 工作 站的结构 形式 , 图 10 .1 给出了总 线型 Novell 网 的一个 简


单例子。由图可见 , Novell 网通常包括的硬件主要有 :
・ 2 99 ・
一、服务器 (Server )
服务器是网络中参与系统管理的设备 , 一般 由性能 较高 的计 算机担 任。其主 要职 能
是管理网络的共享软件 ( 如程序和文件 ) 与设备 ( 如 打印机 和大 容量 硬盘 ) , 控制服 务器 与
网络用户的通信。一个 Novell 网可以拥有多台 服务器 , 其中包 括文件 服务 器和打 印服 务
器。
Novell 网运行 Netware 网络操作系统。上文提 到的 Netware 386 V3 .11 就是 目前 常
用的一种版本。Netware 一般包括内核与外壳两 部分。内核 由调度 程序和一 组处理程 序
组成 , 常配置在文件服务器上 , 外壳为服务器与 工作站 之间 的接口 程序 和通 信协议 程序 ,
常运行在工作站 DOS 的外层。

图 10 .1   总线型 Novell 网一例

二、工作站 ( Workstation)
工作站是网络用户使用的计算机。它上网后 与文 件服 务器相 连 , 成为 网络的 一个 节
点 , 通过对服务 器的 访 问 与 服 务器 交 换 信 息。 Netware 操 作 系 统的 外 壳 程 序 例如 IPX .
COM 和 NE T X .COM 都是在工作站上运行的。存放在服务器硬盘上的网络共享软件 , 也
都要下载到工作站的内存中才能运行 , 可见网 络系统 的信 息处 理任务 主要 是由工 作站 来
承担的。
工作站可分普通工作站和无盘工作站两种 , 前者 退网 后可 作为独 立的 个人计 算机 使
用 , 后者因不带磁盘驱动器 , 退网后独立工作能力受到极大的限制。
三、网卡 ( Net Interface Card)
网卡是网络接口卡的简称 , 它为服务器、工作 站通 过介 质互连 提供 了硬件 接口 , 故 也
可看成是网络的通信处 理机。 Netware386 支 持 使用 多种 类型 的网 卡。网 络 中的 所有 工
作站、服务器都必须配置网卡。文件服务器或 工作站 有时 配置 多块同 型号 或不同 型号 的
网卡 , 是为了连接多个网段 , 延伸电缆的距离或 连接不 同类 型的网 络 , 这种 服务器 或工 作
站称为网桥。
四、传输介质 ( Transmission Medium)
传输介质是用于网络各个结点之间的物理 连接 , 常用 的介 质有 光缆、同轴 电缆、双 绞
线等。各种介质对信号的衰减程度不同 , 每一段允许的最大长度也不同 , 为了弥补传输过
程中的信号衰减 , 可在传输途中插入各种中继设备 , 实现信号放大、连接形式变换等功能 ,
图 10 .1 中的集线器 , 就是这类中继设备的一例。
五、终端器 ( Terminator)
总线型网络的每一干线电缆的两端必须各安装一个终端器 , 吸收介质中的反射电波 ,
・ 3 00 ・
防止反射波对信号的 干扰 , 终 端 器的 阻抗 必须 与同 轴 电缆 特性 阻抗 一致 , 所以 又称 匹 配
器。

10 .1 .2   在 Novell 网上 安装和启 动 FoxPro

在网络上安装多用户 FoxP ro for Windows , 首先要安装 Windows , 然后才 能安装多 用


户 FoxPro。这些工作 一般 应 该 由对 网 络熟 悉 的 系 统管 理 员 来 承 担。在 Novell Netware
386 V3 .11 环境中可以安装各 种版本 的 Windows( 包括 各种西 文和 汉化 的版 本 ) , 其步 骤
如下。
一、在网络上安装 Windows
在安装 Windows 之前 , 必须 了 解 网 络的 配 置。 服务 器 至 少 是 一个 386 或 更 高 的 系
统。服务器硬盘容量要大 , 它不仅要容纳网络 操作 系统、共 享资源 和用 户子目 录 , 还必 须
具有安装 Windows、存 放 各 类 应 用 程 序 的 空 间。 硬 盘 驱 动 器 的 访 问 时 间 最 好 不 大 于
18ms。
服务器最好有 8M 字节以上的 RAM 磁盘高速缓存 ( cache) 。使用户在 90 % 95 % 的时
间里能从 RAM ( 而不是从硬盘 ) 中获取数据 , 借以保证快速访问。
网络系统管理员必须定义安装的类型和 存放资 源的 位置。例 如 , 通常 将与用 户有 关
的专用文件保存在用户各自的子目录中 , 而把 裁剪图 像和 字形 文件等 保存 在服务 器共 享
目录上 , 使所有用户既可以共享信息又保留了各自硬件有关的特性。
1 . 三种安装方法
把 Windows 安装到网络上可以有以下三种方法。
第一种方法是让每个工作站共享服务器 上 Windows 的 一个 副本。几 乎所有 的 Win-
dows 文件 ( 除了用户专用的以外 ) 都保存在服务器上 , 由全 体用户 共享。用户 专用文件 则
保存在工作站本地的外存上。这种做法对工作站的本地外存占用量很小 , 用于 下载 Win-
dows 的时间损失也不大。服务 器上 Windows 的共 享副 本大 约 占硬 盘 l6M 字 节 ( 这里 指
Windows V3 .1 , 不同版本的 Windows 所占空 间稍 有不 同 ) 。工 作站 只 需要 大约 300 K 字
节。
第二种方法适用于无盘工作站。在这种情况下 , 所 有工作站 共享一 个 Windows 的 副
本 , 用户专用文件则保存在服务器上的用户个人目录里。这对用户的速度会有些影响 , 但
在使用无盘工作站的情况下 , 这是唯一的方法。
第三种方法是在每个工作站上分别安装 Windows 的一个拷贝 , 所有 Windows 文件都
存放在个人工作站上。这是访问速度最快的方法 , 但由于文件的大量重复安装 , 对本地工
作站硬盘容量的要求也急剧 增 加。每 个工 作站 大约 需要 l0M 字 节甚 至更 多 的外 存来 存
放 Windows 文件。
以上三种方法 , 对 Windows 共享程 度不同 , 但 使用 Windows 的 方式 仍是相 似的。 用
户入网后 , 系统和用户为共享目录建立的所有连接 ( 也就是网络驱动器与网络中目录的映
射 ) , Windows 全部都能识别 , 在文件管理器中 , 用户能看到本地驱动器和所有连接的网络
驱动器 , 所有这些驱动器都可以被应用程序和文档使用。
注意 : 为了使用 Windows 的网络功能 , 用户必须先进入网络 , 再启动 Windows 的本地
・ 3 01 ・
专用程序。
2 . Windows 的安装步骤
在第一、二两种方法中 , 网络管理员 必须先 用 SE T UP / A 将 Windows 安装到 服务 器
共享目录 ( 例如 : SYS∶ \ PUBLIC \ Windows ) 上。待这一 步完成后 , 再 把服务器 共享目 录
中部分用户专用文件安装到工作站本地硬盘或服务器上的用户个人目录中。
要将用户 专 用 Windows 文 件 安 装 到 工 作 站 本 地 盘 上 , 必 须 先 进 人 服 务 器 中 包 含
Windows 的共享 目录 ( 例 如 SYS∶ \ PUBLIC \ Windows ) 。然 后在 这个 目 录下 输入 命 令
SE T U P / N , 使它自动完成安装。在 安装 过程中 , 用 户必 须在 本地 硬盘 上指 定 一个 目录 ,
存放工作站上与 Windows 有关的文件。 一般 地说 , 只 有 那些 支持 本地 工作 站 特殊 的硬、
软件所必需的文件才被拷贝到这个目录中 ( 比如各 用户 使用 的显示 器、鼠标、网卡 等可 能
是各不相同的 ) , 其它文件仍保存在服务器上 , 由所有工作站共享。在安装过程中 , 用户将
被问及所使用设备的类型、网络类型以及打印机类型等。
在无盘工作站上安装 Windows 工作站副本时 , 当进入服务器中包含 Windows 的共享
目录后 , 也用 SE T U P / N 安装用户专用文件。 在 SE TU P 程序 要求输 入存 放用户 专用 文
件的位置时 , 用户应输入自己在服务器硬盘上的个人专用目录名。
注意 : 使用 SE T U P / N 时 , 不应 在 软 盘 上 运行 SE T UP。应 该 在 进 入 服务 器 上 包 含
Windows 文件的目录 , 再执行 SE T UP。
第三种方法是将 Windows 完全安装到工作站本地硬盘上。 跟前面一 样 , 网络管理 员
应首先登录到服务器 , 并把 Windows 安装盘所在的驱 动器设为 当前驱动 器 , 键入 SE T UP
/ A 将 Windows 安 装 到 服 务 器 共 享 目 录 下 面。为 了 全 部 下 载 Windows , 继 续 在 服 务 器
Windows 目 录下键 入 SE T UP , 但不 要使用 参数“/ N”! Windows 将把 网络 当成正 常安 装
过程的一部分。如果用户使用快速安装 , Windows 将会自动识别网络 , 并在网络上自动安
装。
其实 , 所有三种方法的前半部分安装过程和命令是完全相同的 , 它们都需要网络管理
员把 Windows 系统安装程序装到服务器共享目录 ( 例如 : SYS∶ \ PUBLIC \ Windows ) 上。
后半部分也仅是在为各个用户安装专用文件时 , 根据 不同 要求 从服务 器共 享目录 中下 载
不同数量的文件到不同的子目录。
二、在网络上安装 FoxPro for Windows
在网络上安装 FoxP ro for Windows 与在网络 上安装 Windows 类似 , FoxPro for Win-
dows 一般也分为两步安装 : 第一步在 Windows 中先执行 FoxP ro for Windows 安装盘中的
SE T U P / A, 将 FoxP ro for Windows 安装到服务器的共享目录下面 ( 例如 SYS∶ \ PUBLIC
\ FOXP ROW ) ; 这一 步完成之 后 , 再把用户 专用文 件安装到 工作站 本地硬盘 或服务器 相
应用 户 子 目 录 上。 其 方 法 是 进 入 上 述包 含 FoxP ro 的 服 务 器 共 享 目 录 之 后 , 键 入 命 令
SE T U P / N , 让 SE T UP 程序自动为工作站完成安装。用户需要在本地硬盘或服务器硬盘
的用户子目录上指定一个目录 , 使那些与本地工作站有关的 Fox Pro 文件被拷贝到这个 目
录中。
说明几点 :
(1 ) 把 Windows, FoxPro 安装 到 网络 服 务 器共 享 目录 中 , 只 需 使用 一 次 SE T UP / A
・ 3 02 ・
已经足够 , 但要为各个工作站安装各自的专用 文件必 须在 不同 的工作 站上 根据不 同硬 件
分别进行安装。
(2 ) 当多个网络工作站具有 完全 相同的 硬件 时 , 可以在 一个 工作 站的专 用文 件安 装
完毕后 , 把这些专用文件拷贝到其它工作站的专用目录中。
(3 ) 为了系统管理的安全和方便 , 应该把 Windows、FoxPro 的共享文件放在服务器的
SYS: \ PUBLIC 共享目录下 ( 系 统已 经为 EV ERYONE———所 有网络 用户 对 该目 录设 置
了只读权限 ) , 可有效防止非法操作或误删。
(4 ) 共享数据库是需要经 常添 加和修 改的 , 应 该与 FoxPro 系 统目 录分 离 , 网 络管 理
员可以 在 服务 器上 建立 共享 数 据库 子目 录 SYS∶ \ FOXDATA , 并为 该 目录 设 置读 写 属
性 , 为了数据安全保密 , 一般要为不同用户设置不同的访问权限。
三、在网络上启动 FoxPro for Windows
在 Novell 网上启动 Fox Pro for Windows , 当使用 WI N FOX 命令调用 Fox Pro 前 , 首先
要运行“工作站上网”和“用户登录”等一组命令。
为了简化用户的操作 , 可以为网络用户先编 制一个批 命令文 件 FOXPW .BAT。该 批
文件可包含如下命令 ( 假设用户专用文件在本地硬盘的 C∶ \ FOXW 子目录下 )

    IPX                               ( 设置网络通信协议 )
    NETX
    F∶ ( 在网络驱动器上使用登录命令 )
    LOGIN
    MAP S3∶= SYS∶ \ P UBLIC \ Windows ( 设置共享 Windows 搜索路径 )
    MAP S4∶= SYS∶ \ P UBLIC \ FoxProW ( 设置共享 FoxPro 搜索路径 )
    C∶ ( 进入本地用户专用目录 )
    CD \ FOXW
    WIN FOX

10 .2   多用户操作和程序设计

Fox Pro 能在多用户环境下工作。它不仅允许用户共 享库文 件或程序 , 也 允许多个 用


户同时对一个库文件进行处理 , 并具有单用户环境下 FoxPro 的一切特征。
本节主要说明 FoxP ro 多用户环境下操作、编程和常用的命令。

10 .2 .1   多用户操 作的基本概 念

一、数据库文件的独占使用
    当某个数据库文件以独占方式被打开使用时 , 只能有一个用户对数据有访问权 , 其它
用户都不能打开该库文件进行读或写。独占方式 是单 用户 系统最 明显 的特征 , 但 是它 破
坏了在网络上共享数据的优点 , 因此只有在必要时才使用。
以独占方式打开库文件是防止其它用户对该库文件获得读访问权的唯一方法。因为
用 FLOCK( ) 锁定库文件只能防止其它用户写文件 , 而不能防止其它用户读文件。尽管多
・ 3 03 ・
用户环境要尽量避免以独占方式使用库文件 , 但某些 Fox Pro 命令仍要求用户必须以独 占
方式打开库文件 ( 例如涉及数据库文件整体写操作的命令 ) , 表 10 .1 列出了这些命令。.
当用户试图在共享的库文件上执行表 10 .1 中 所列 的命令 时 , 系统 将返 回错误 信息 :
“要求以独占方式打开文件”。

表 10 .1   必须以独占方式工作的命令

命   令 说    明

INDEX 当创建、增加或删除一个复合索引标志时

REI NDEX

MODIFY ST RUCT URE 当文件不是以独占方式打开时 , 在只读方式下也能工作

PACK

INSE RT [BLA NK]

ZAP

    在多用户环境下 , 有两种方法可以用独占方式打开数据库文件 :
(1 ) SE T EXCL USIVE ON
USE < 数据库文件名 >
(2 ) USE < 数据库文件名 > EXCLUSI VE
由于 SE T EXCL USIV E 的默认状态是 ON , 所以 在单 用户 环境下 开发 的程序 在多 用
户环境中使用表 10 .1 中所列的命令时 , 不必特 意增加 独占 命令 , 除非 在此 以前已 经使 用
过 SE T EXCL USIV E OFF 设定了共享方式。
由于独占方式使用库文件会限制其它用户对数据库的访问 , 表 10 .1 中的命令在多用
户环境中的使用受到了极大的限制。一般地说 , 在多 用户 环境 中用户 使用 这些命 令的 时
间应选在有关用户全部退网以后 , 所以经常把这些操作放在系统维护模块中。
二、数据库文件的共享使用
当库文件以共享方式打开时 , 允许多个用 户在同 一时 间从 不同的 工作 站使用 同一 个
库文件。对共享库文件的读操作命令是不受限制的 , 而写命令却是互斥的 , 在多个用户同
时对同一个记录或库文件的写操作将产生不 可预料 的结 果。因此 在写 命令执 行之 前 , 相
应库文件中的记录或整个文件都必须是锁定的。
用下面的方法锁定打开的库文件或记录 , 可保证共享使用中的安全 :
・ 使用对记录或文件自动进行锁定的命令。
・ 用记录或文件锁定函数为一个或多个记录乃至整个库文件进行手动上锁。
对应的备注文件和索引文件在打开时 , 与它们的库文件有着相同的共享状态。
如果某个应用中建立一个库文件的目的仅仅 是供其 它用 户读 ( 查 询 ) , 可用网 络的 文
件属性 命令 或 MS-DOS 的 A T TR IB 命 令将 该库 文件 标志 为 只读 , 这 样既 保 证文 件的 安
全 , 又可以更快得到执行结果。
一个单用户应用程序要移植到多用户环境下 共享 使用 , 至 少应该 在程 序的开 始部 分
增加一条 SE T EXCL USIV E OFF 语句 , 以便使随后打开的库文件可以为多用户共享。
・ 3 04 ・
三、写访问权与只读访问权
修改库文件的命令要求对库文件具有写 访问权。 在这 类命令 执行 之前 , 记录 或整 个
库文件必须被锁定。大多数写命令的上锁是自动处理的 , 但 Fox Pro 仍然提供了对记录 或
库文件进行上锁的测试函数 , 以便用户在写操 作之前 了解 当前 记录或 数据 库文件 是否 已
经被其它用户上锁 , 避免无谓的等待。
如果只读但不修改数据 , 不要求锁定库 文件。即 使另 一个 用户将 记录 或整个 文件 锁
定了 , 对库文件的只读命令依然可以工作。但是 , 如果某库文件被别的用户以独占方式打
开 , 则无论是写访问权还是只读访问权就都不可用了。
例如 , RE PORT FORM 对库 文件只 进行读操 作 , 故除被其 它用户 以独占方 式打开 的
以外 , 可以 在 任 何 一 个 库 文 件 上 工 作。 这 对 于 诸 如 T OTAL , SU M , SQL .SE LECT 和
SOR T 等只进行读访问的命令也同样适用。
四、记录和文件的锁定
执行写命令必须先锁定记录或整个库文件 , 以防 止两 个用 户在同 一时 间修改 同一 个
记录或库文件。由于文件或记录锁定禁止了其它 用户 对库 文件中 的记 录进行 更新 , 所 以
不应长时间使用。
五、自动锁定与手动锁定
不少 FoxPro 命令能在命令执行前自动 对记录 或库 文件 上锁。如 果记 录或库 文件 被
成功上锁 , 命令将被执行 , 并在执行后 , 把锁 自动 打开。这 种过 程称为 自动 上锁和 自动 解
锁。自动锁定无法阻止其它用户对该对象的写操 作企 图 , 因而 仍有可 能使 其它用 户在 执
行写操作命令时陷入出错或等待。
手动锁定函数 RLOCK ( ) , LOCK ( ) , FLOCK ( ) 首先对记录或库文件进行测试 , 若发
现对象尚未上锁 , 便锁 定该 对 象并 返 回逻 辑 值″.T .″表示 加 锁成 功。 否则 返 回 逻辑 值“ .
F .”, 告诉用户该对象已经被其它用户锁定或 独占。一旦 记录或库 文件 被手 动锁定 , 要 尽
快地完成有关的操作后解锁。使其它用户减少等待的时间。
如果锁定记录或 文件的 意图失败 了 , 可用 SE T RE PROCESS 或 ON ER ROR 命令 决
定是否试行再次上锁。

10 .2 .2   多用户命 令和函数

一、对记录和数据库文件解锁
    下面的命令可以解开以自动或手动方式为记录和文件上的锁 :
命令格式 :

U NLOCK     [ IN < 数字表达式 > | < 字符表达式 > | ALL ]

    功能 :
(1 ) U NLOCK                     为当前工作区的记录和文件解锁
(2 ) U NLOCK   IN < 数字表达式 > 为由 < 数字表达式 > 指定的工作区上的库文
件解锁
(3 ) U NLOCK   < 字符表达式 > 为由 < 字符表达式 > 指定的数据库文件解锁
・ 3 05 ・
(4 ) U NLOCK   ALL 为所有工作区的库文件解锁
说明 :
(1 ) 如果 M U LT ILOCKS 处于 SE T OF F 状态下 , 锁 定另 外一条 记录 ( 无论是 自动 还
是手动 ) 将自动解开原来上锁的记录。
(2 ) 将 M UL TILOCKS 从 ON 转换到 OF F 或从 OFF 转换到 ON 时 , 将隐式地执行一
条 U N LOCK AL L 命令 , 解开所有工作区上的所有锁。
(3 ) 为文件上锁将解开该文件中的所有记录的锁定。
(4 ) 用 USE , CLOSE ALL , CLOSE 或 QU IT 命令关闭库文件时将解开所有记录和 文
件锁定。
二、具有自动加锁功能的命令
Fox Pro for Windows 中有许多命令涉及 库文 件或 记录 的 写操 作 , 在多 用 户环 境中 执
行这些命令前 , 系统将自动地对 库文件 或记 录加 锁 , 在命 令执 行后 会 自行 解锁。 表 10 .2
列出了能自动锁定记录和库文件的命令及其锁定范围。
如果在使用这些命令前记录或库文件已被另 一个 用户 锁定 , 或库 文件 是被其 它用 户
以独占方式打开的 , 那 么这 次记 录 或文 件的 锁定 将 失败。 如 果记 录 不能 被 锁 定 , FoxPro
命令返回错误信息“
: 文件不能被锁定 , 文件已被其它用户使用。”
需要指出 :BROWSE , CHANGE , EDIT , MODFY M EMO 等命令在进入全屏幕显示 时
不会立即为记录上锁。仅在实际编辑记录时才试图对记录加锁 , 如果成功 , 相关记录将被
锁定 , 同时本次编辑生效 , 直到指针移动到另外 一条记 录或 把其它 窗口 调到 前面时 , 锁 定
才自动解除。如果当前记录或任何相关记录已经被其它用户锁定了 , 那么上锁将会失败 ,
编辑不能生效。
执行 APPE ND BLANK 添加记录时 , 会自动锁定文 件头。两个 或更多 用户同 时执 行
APP END BLAN K 命令时 , 返回的错误是“文件被其它用户使用”。

表 10 .2   具有自动加解锁功能的命令

命   令 加   锁   范  围

    A PPEND BLAN K     数据库文件头

    A PPEND FROM < 库文件名 >     整个数据库文件

    A PPEND FROM ARRAY     数据库文件头

    A PPEND MEM O     当前记录


    一旦某一字段的编辑开始 , 当 前记录 和所有 与之关 联
    BROWSE
的库文件 ( 由别名指定 ) 中的记录
    CHANGE     同上

    EDI T     同上

    DELET E     当前记录

    DELET E NEXT 1     当前记录的下一记录

    DELET E R ECORD( N)     第 N 号记录

・ 3 06 ・
续表

命   令 加   锁   范  围

DELET E < SCOPE BEYOND ONE >     整个数据库文件

    DISPLAY < W I TH A SCOPE >     整个数据库文件

    GATHER     当前记录

    I NDEX     整个数据库文件

    I NSER T —SQL     数据库文件头

    MODI FY MEMO     当编辑开始时 , 当前记录

    R EAD     当前记录和所有别名字段中的记录

    R ECALL     当前记录

    R ECALL NEXT 1     当前记录的下一记录

    R ECALL RECORD( N)     第 N 号记录

RECALL < SCOPE BEYO ND ONE >     整个数据库文件

    R EPLACE     当前记录和所有别名字段中的记录

    R EPLACE NEXT 1     当前记录的下一记录和所有别名字段中的记录

    R EPLACE RECORD( N )     第 N 号记录和所有别名字段中的记录

REPLACE < SCOPE BEYOND ONE >     整个数据库文件和所有别名字段中的记录

    SH OW GE TS     当前记录和所有别名字段中的记录

    U PDAT E     整个数据库文件

三、SET REPROCESS( 重新加锁控制 ) 命令


命令格式 :

SE T REPROCESS TO < 数字表达式 > [ SECONDS] | TO AUTO MAT IC

功能 :
用于设置加锁状态 , 以便在加锁命令 ( 自动或手动 ) 失败后 , 能自动控制继续锁定的次
数或持续时间 , 在尝试 加锁 的过 程 中 给出 提 示“Attempting to lock . . .Press ESC to can-
cel”, 在尝试锁定的努力失败后提示“File is in use by another”。
说明 :
(1 ) < 数字表达式 > 的数值范围为 - 13600 ; 默认值为 0。
(2 ) SE T REP ROCESS TO < 数字表达式 > 当 数字 表达式 在 13600 时 , 用在 加锁 失
败后 , 控制重新加锁的次数为 < 数字表达式 > 指定的次数 。
(3 ) SE T REP ROCESS TO < 数字表 达式 > SECONDS 用在 加锁 失败 后 , 控 制继 续
尝试锁定的时间长度为 < 数字表达式 > 指定的秒数。
(4 ) SE T REP ROCESS TO AU TOMA TIC 或 SE T REP ROCESS TO 0 用在加锁失败
后 , 无限 次 继 续 尝试 加 锁 , 直 至成 功。 在 系统 提 示“ Attempting to lock . . .Press ESC to
・ 3 07 ・
cancel”期间 , 如果按 < ESC > 键 , 可以用错误处理 ( ERROR ) 子程序捕捉到出错信息。
(5 ) 如果设置 SE T REP ROCESS TO - 1 命令 , 则加锁失败后系统将自动地无限次继
续尝试加锁 , 直至成功。此时系统提示“Waiting for lock . . . ”, 且不能用 < ESC > 键解脱。
也不能用 ERROR 子程序捕捉到出错信息。
举例 :

SE T EXCLUSIVE OFF
U SE testdbf
SE T REPROCESS TO AU TOMATIC
REPLAC E ALL d1 WI TH′
AA′

    上例表明当其它用户锁住了数据库文件 TEST DBF 时 , 系统可无限次继续尝 试加锁 ,


直至 RE PLACE ALL 把 全 部 字 段 替 换 成 功。 但 如 果 其 它 用 户 长 时 间 锁 住 了 库 文 件
T ESTDBF , 将会无效地等待 , 为能在 20 秒后自动解脱 , 可以 把第三行 改为“ SE T REP RO-
CESS TO 20 SECONDS”。当然用户也可按 < ESC > 键提前解脱的。
四、手动加锁函数
Fox Pro 有三种手动锁定函数 F LOCK ( ) , RLOCK ( ) 和 LOCK ( ) , 格式如下 :

LOCK ( [ < 数字表达式 > | < 字符表达式 1 > ] | [ < 字 符表达式 2 > , < 数字 表达式 > | < 字 符
表达式 1 > ] )
RLOCK ( [ < 数字表达式 > | < 字符表达式 1 > ] | [ < 字符表达式 2 > , < 数字表达式 > | < 字符
表达式 1 > ] )
FLOCK ( [ < 数字表达式 > | < 字符表达式 > ] )

其中 : < 数字表达式 > 表明欲锁定的库文件所在的区号 ( 数值型 )


< 字符表达式 1 > 表明欲锁定的库文件的别名 ( 字符型 )
< 字符表达式 2 > 表明欲锁定的多记录号列表 (2 , 3 , 4 等 ) , 但 锁定多个 记录的条 件
是 M U L TILOCKS 必须被设置成有效状态 ( 即执行 SE T MU L TILOCKS ON ) 。
RLOCK ( ) 与 LOCK ( ) 相同 , 可用 于锁定 一条 或多 条记录 , 默 认当 前工 作 区的 当前 记
录。
FLOCK ( ) 锁定一个文件 , 默认当前工作区中的库文件。
这三个函数都按照下面的步骤进行工作 :
・ 检验记录或文件的锁定状态 ;
・ 如果记录或文件没有上锁 , 就对其进行锁定并返回一个逻辑真值 ( .T .) ;
・ 如果记录或文件不 能被 上锁 , 根据 SE T REP ROCESS 当 前 的设 置 , 可 能 会再 次 试
图对记录或文件上锁。
SE T REPROCESS 决定了尝试锁 定是 进行 一定 的 次数 或 时间 还 是 无限 制 地进 行 下
去 ( 直至锁定成功或用户取消了锁定努力 ) 。最 后一次 试锁 后 , 将返回 一个 逻辑真 值或 假
值以指明锁定是否成功了。
如果不想锁定记录 , 仅检查该记录的锁定状态 , 可使用 SYS (2011) 函数。
例 : 在下面的例子中 , 库文件 T ESTDBF 以共享方式打开。 FLOCK ( ) 用于锁定文件。
・ 3 08 ・
如果 库 文 件 锁 定 成 功 , 就 用 RE PLACE ALL 更 新 库 文 件 中 的 每 个 记 录。 然 后 用 U N-
LOCK 命令为库文件解锁。如果其它用户在此前已经锁住了文件或文件中的记录而使 上
锁失败时 , 将显示相应的消息。

SE T EXCLUSIVE OFF
SE T REPROCESS TO 100
U SE testdbf
IF FLOCK ( )
  REPLACE ALL d1 WI TH ″
BB″
  U NL OCK
ELSE
  WAIT″文件正被别的用户使用 !″
ENDIF

五、共享打印机命令
由于网络共享打印的 引 入 , 使网 络用 户 可以 根据 实际 情况 经 济合 理 地配 置 打 印机。
网络工作站除了像单机用户一样使用本地打印机外 , 还可以使用两类打印机 , 一类是连在
文件服务器上的共享打印机 ; 另一类是连接在 附近工 作站 ( 兼 做打 印服务 器 ) 的共 享打 印
机。用户可以使用打印控制命令方便地切换。
命令格式 :

1. SE T PRINT ER O N [ PROMPT ] | OFF


2. SE T PRINT ER TO [ < 文件名 > [ ADDI T IVE ] | < LP Tn > ]
3. SE T PRINT ER TO [ \ \ < 打印机服务器机器名 > \ < 打印机名 > = < LPT n > ]
4. SET PRINT ER TO [ \ \ SP OOLER [ \ N ] [ \ F = < 数 字表达 式 > ] [ \ B = < 标题 页打印 的
字符 > ] [ \ C = < 数字表达式 > ] [ \ P = < 数字表达式 > ] ] [ \ S = < 打印服 务器名 > ] [ \ Q
= < 队列名 > ]

    功能与说明 :
上述命令 1 , 2 的主要功能同单用户打印命 令 , 不 过它 们的 作用范 围已 经从本 地打 印
机扩展到了网络共享打印机。
命令 3 中“ \ \ < 打印机服务器机器名 > \ < 打印机名 > = < L PTn > ”是把工作站
打印机的端口号与网络中的打印服务器上的一台 打印 机实 现“ 联结”, 使随 后输出 到端 口
L PTn 的打印内容转向网络共享打印机。
例 :若用 户 要 把 本 机 # 1 打 印 机 端 口 ( LP T1 )“ 联 结”到 打 印 服 务 器 ( 机 器 名 为
SAICPS ) 的打印机名 E PSON1600 上 , 可以使用命令

SE T PRINT ER TO \ \ SAICPS \ EPSON1600 = LPT1

这样 , 用户一旦使用 LP T1 时 , 系 统会 自 动把 打 印的 内 容送 到 上述 指 定 的网 络 共享 打 印
机。
命令 4 主要用于处理多用户共享一台打印机 时出 现的 一些特 殊问 题 , 它在把 工作 站
打印机端口号与网络打印服务器上的一个打印队列实现“联结”的同时可指定一些具体的
・ 3 09 ・
打印要求 :
\ \ SPOOL ER: 是为兼容网络操作系统中多服务器打印命令而加 , 可以省略。
\ N : 为了区分不同用户的打印内容 , 网络打印一般在用 户打印 的内容前 加上与用 户
名有关的标题页。本参数指定不要打印标题页。
\ B = < 标题页打印的字符 > : 表 示用户 指定 标题 页打 印的 字符 , 包 含 的字 符数 不
大于 12 个 , 缺省时系统默认标题页打印的字符为用户名。
\ F = < 数字表达 式 > : 表 示 用 户 指 定打 印 格 式 , < 数 字 表 达 式 > 的数 值 范 围 是
0255 。只有用户指定格式与打印机当前设置格式一致的内容被打印 , 其它格式的内容仅被
存储在打印缓冲区中而不会打印 , 直至打印管 理员从 新设 置共 享打印 机格 式值与 其格 式
值一致。
\ C = < 数字表达式 > : 用户指定打印份数 , < 数字表达式 > 的数值范围是 1255 , 缺
省时系统默认 1。
\ P = < 数字表达式 > : 用户指定假脱机映象号 , < 数字表达式 > 系统默认 0。
\ S = < 打印服务器名 > : 用户指定打印服务器。
\ Q = < 队列名 > : 用户指定网络已有的打印队列名。
需要特别指出 , 在 Fox Pro for Windows 中不管使用哪一种打印方式 , 都是先把打印内
容放入打印缓冲区 , 直到用户退出 Fox Pro for Windows 后才启动打印 , 这样做可以使各个
用户断断续续的打印请求在最 后连 成一 篇。有 时用 户为 了 调试 , 希 望不 退 出 FoxPro for
Windows 立即启动打印 , 可先执行 SE T PRI NT ER TO ( 不附加参数 !) , 再运行打印命令。
六、常用多用户命令和函数汇总
表 10 .3 汇集了与单用户操作有不同要求的常用多用户命令和函数 , 供用户在多用户
编程时参考。

表 10 .3   常用多用户命令和函数汇总

命   令 功   能

BROWSE/ CHAN GE/ EDIT 显示、编辑或添加数据库文件记录

DISPLAY STATUS 或 LIST STATUS 显示出 FoxPro 环境的状态

E RROR( ) 返回最近一个 ON ERROR 语句错误编号

FLOCK ( ) 试图锁定数据库文件 , 如果成功将返回 .T ., 否则返回 .F .

MESSAGE ( ) 返回当前错误消息或引起错误的那行内容

NETWORK( ) 如果用户在网络上使用 FoxPro 就返回 .T .

RET RY 重新执行前面的命令
RLOCK ( )或 LOCK( ) 试图锁定 数据 库 文 件 中一 个 或 多 个 记 录 , 如 果 成 功 将 返
  回 .T ., 否则返回 .F .
SET EXCLUSIVE ON | Off 指定此后打开的数据库文件以独占方式或是共享方式

SET LOCK ON | Off 允许或禁止自动记录、文件锁定

・ 3 10 ・
续表

命   令 功   能

SET MUL TI LOCKS ON | Off 允许或禁止多重记录锁定

SET NOTI FY ON | Off 允许或禁止系统消息的显示

SET PRINTE R ON | Off 允许或禁止输出到打印机或指定输出瑞口


SET PRI NTER TO \ \ < 打印 服务 器 使本地 LPT n 与网络中的打印服务器上的一个共享打印机
名 > < 打印机名 > = < LPTN > 实现“联结”。
SET PRINTE R TO 在 FoxPro for Windows 中立即启动打印

SET R EFRESH 更新显示其它用户对记录所做的改动


SET R EPROCESS TO < 数字表 达式 >
指定在记录或文件锁定不成功后的处理方法
[ SECONDS]
SET STATUS ON | Off 允许或禁止显示状态

SYS ( O) 返回机器号

SYS (2011) 返回当前记录或文件锁定状态

U NLOCK 解开记录或文件的锁

USE < 数据库名 > EXCLUSIVE 在网络上以独占方式打开并使用数据库文件

10 .2 .3   多用户编 程

在网络环境中的编程与单机环境有一定的区 别 , 因为 在网 络环境 中必 须考虑 多个 用


户同时访问一个库文件时可能出现的冲突以及解决的方法。
一、
“ 死锁”及其避免方法
当两个用户同时分别锁定了文件 A 和 B , 并继续向对方已上锁的文件试行加锁时 , 将
陷入“死锁”, 结果是两个用户都无法继续操作。记录或文件锁定的时间越长 , 陷入死锁的
机会也就越多。严重时还会使网络其它用户受到牵连 , 令许多用户无奈地等待 , 系统的效
率会大大降低。
为了避免“死锁”发生 , 在开发多用户应用程序时可采取以下的措施 :
1 . 应用程序使用具有自动加锁 功能的 命令 时 , 尽可能 先用 加锁函 数测 定 后 , 再根 据
当前情况安排不同的出路 ;
2 . 不同的程序模块尽量使用相同的次序给数据库文件加锁 ;
3 . 在长时间加锁失败后 , 干脆关闭全部文件以免相互等待 ;
4 . 尽量避免长时间地对一个文件加锁 ;
5 . 尽量少用交互命令方式 , 多用批命令 ;
6 . 需用较长时间的输入、编辑、修改等命令 , 可以使用临时库、内存 变量、数组进行 过
渡;
7 . 设置错误陷阱捕捉出错 , 使用错误处理程序处理意外。

・ 3 11 ・
二、错误处理程序
在多用户应用程序中 , 常用 SE T REP ROCESS 命令来处理不 成功的锁 定尝试。这 个
命令与 ON ERROR 语句、RE TRY 等命 令结 合起来 , 可 以让 用户 选择 继续 或 取消 加锁 努
力。下面试举一例 , 读者可由此窥见一斑。

ON E RROR DO e - relief WI TH E RROR( ) , MESSAGE ( )


SE T EXCLUSIVE OFF
SE T REPROCESS TO 10 SECOND
U SE TESTDBF
REPLAC E ALL 本月结余 WI TH 上月结余 + 入库数 - 发货数
ON E RROR
RE TURN
PROCEDUR E e - relief
PARAMET ERS errnum , msg
DEFINE WINDOW Err - win FROM 21 , 00 TO 24 , 79 COLOR SCHEME 7
DO CASE
    CASE errnum = 108
      err - msg1 = ″
文件不能上锁 !″
      err - msg2 = ″
再试试 . . .″
    CASE errnum = 109 .OR .errnum = 130
      err - msg1 = ″
记录不能上锁 !″
      err - msg2 = ″
再试试 . . .″
    OTHERW ISE
      err - msg1 = msg
      err - msg2 = ″
请查资料 !″
ENDCASE
AC TI VAT E WI NDOW Err - win
@ 0 , ( WCOLS( )-LEN ( err - msg1 ) )/ 2 SAY err - msg1
@ 1 , ( WCOLS( )-LEN ( err - msg2 ) )/ 2 SAY err - msg2
WAIT W INDOW
RELEASE WI NDOW Err-win
RE TURN

    上述程序中的几个错误号的含义是 , 108 : 表示库文件已被其它用户打开 ; 109 : 表示记


录正被其它用户使用 ; 130 : 表示记录不能锁定。

10 .3   多用户系统的性能优化

在多用户环境下 , FoxPro 用户可以通 过“ 缩短 文件 锁 定时 间”和“ 减少 对 网络 驱动 器


的访问”等措施 , 使系统获得较佳的性能。
一、缩短文件锁定时间
1. 减少交互命令方式使用数据库文件
・ 3 12 ・
在网络环境下用交互命令方式输入、编辑、修改或添加数据库文件 , 延长了记录/ 库文
件的加锁时间 , 造成其它用户的等待。而程序 方式的 成批 添加 可减少 其它 用户的 等待 时
间 , 所以对网络上的共享库文件操作时 , 应尽可能采用程序方式。
2. 充分利用内存变量和过渡文件
对库文件记录直接输入、编辑、修改、添加时 , 人机交互所需的锁定时间累计较长。如
果先向内存变量、数组或过渡文件赋值 , 然后一 次性地 替换 到目标 记录 中 , 可以有 效压 缩
总的锁定时间。
3. 独占使用库文件
当其它用户对数据没有共享要求时 , 以 独占 方式打 开库 文件 可以有 很多 好处。此 时
Fox Pro 不需要检查记录或文件的锁定状态 , 所以操作速度可得到提高。
总之 , 减少记录或文件的锁定次数和时间 , 就可减少用户之间对记录或文件进行访问
的冲突 , 最终减少了用户等待的时间。
二、减少对网络驱动器的访问
访问本地驱动器或“RAM 驱动器”所需时间短 , 访问网络驱动器所需时间长。通过减
少对网络驱动器的访问不仅能减轻网络负荷 , 而且可提高网络用户的工作效率。
1. 临时工作文件
Fox Pro 在 运 行 过程 中 , 经 常 要 创建 临 时工 作 文件。 这些 文 件 通常 用 .TM P 为 扩 展
名。临时工作文件共有三类 :
(1 ) 程序高速缓冲区工作文件 : 用作程序运 行时 的高 速缓冲 区。FoxPro 将这 个文 件
的长度默认设置为 256 K , 也可以设置得 更大。为 了提 高访 问该文 件的 速度 , 最好 将此 文
件放在本地工作站上 , 而不放在文件服务器上 , RAM 盘对程序高速缓冲区特别适合。
(2 ) 文本编辑器工作文件 : 在进行编辑中 , 文本编辑器会创建一 个与所编 辑的文档 一
样大的工作文件。为了加快正在编辑的所有文档 拷贝 的速 度 , 此文件 最好 不要放 在网 络
服务器上 , 而应放在本地工作站上。
(3 ) 排序和索引工作文件 : 这些文件在数据库文件被排序和索引时 创建 , 它们可能 达
到被排序或索引的库文件的两倍大小。为了得到 最快 的存 取速度 , 最 好不 要把它 们放 在
网络服务器上 , 而是放在本地工作站上 ( 同时要有足够的磁盘空间 !) 。
如果本地驱动器容纳不了所有临时工作文件 , 也可以通过配置文件适当地安排 , 把它
们独立地置于不同的目录之下。
2. CONF IG .FP W 配置文件
Fox Pro 有一个 CONF IG .FP W 系统 配置 文件 , 用户 可 以通 过 它重 新 定向 临 时 文件 ,
用 SE T 命令为临时工作文件指定存储的位置 , 改变系统默认设置以改善网 络的性能。 此
外 , 不同的工作站可能还会有颜色设置等不同的要求 ; 特定的用户在启动时也可能要求自
动执行某一特定程序。要处理这些问题 , 需要使用独立的 CON FIG .FPW 配置文件。
如果网络上的所有用 户在 启动 时都 要 求相 同的 设置 , 可 以 创建 一个 CON FIG .FP W
文件 , 并把它放在文件服务器上包含 FoxPro 的目录下。Fox Pro 首先到这里查找。
如果 FoxP ro 找不到 CONF IG .FP W 文件 , 就使用 FoxPro 默认设置。
3. 用 CONHG .FP W 指定临时工作文件的位置
・ 3 13 ・
在 CONF IG .FP W 文 件 中 允 许 使 用 EDITWORK , SORTWORK , PROGWORK 和
T MPWORK 等语句 , 来指定安放各种临时工作文件的目录。
(1 ) EDITWORK = 目录名
该语句指定文本编辑器安放临时工作文 件的目 录。在 一些情 况下 , 这 些临时 工作 文
件可以变得和原文件一样大 , 所以要确认包含该目录的磁盘有足够的空间。
(2 ) SORTWORK = 目录名
该语句指定诸如 SORT 和 INDEX 等使用临时工作文件 的命令 在哪里放 置它们的 工
作文件。SOR T 和 I NDEX 要求两倍于所排序 的文件 大小 或正 在构造 的索 引大小 的磁 盘
空间 , 所以 , 要确认包含该目录的磁盘有足够的空间。
(3 ) PROGWORK = 目录名
该语句指定在哪里 放置 临 时的 程序 高速 缓冲 区 文件。用 户应 该 把 该文 件 放在 一 个
RAM 盘上或本地工作站的驱动器上。Fox Pro 默认该文 件的长度 为 256 K, 但 可以变得 更
大。
(4 ) T MP WORK = 驱动器符
凡未被 EDITWORK, SOR TWORK 和 PROGWORK 等语句指定的 临时文件 , 均存 放
在本语句指明的那个驱动器上。

习   题
1. 多用户程序设计中是否还要用到独占方式 ? 为什么 ?
2. 多用户数据库共享的原则是什么 ?
3. 既然涉及写操作的命 令 具 有自 动 加锁 或 解锁 的 功能 , 为什 么 还 要手 动 加锁 或 解
锁?
4. 编写多用户数据库应用程序主要应该注意哪些问题 ?
5. 试编一个多用户数据库应用 程序。 要求多 个用 户可“同 时”对一 个数 据库 进行 添
加、编辑、查询、统计。

・ 3 14 ・
附录一   FoxPro for Windows命令概要

    Fox Pro 的命令子句较多 , 在附录 中未将 它的 格式 完全 列 出 , 本附 录列 出 命令 内容 的


概要 , 为读者查看系统 H EL P 提供线索。

命  令 功   能

= 计算一个或多个表达式的值并删除返回值

\ 输出文本行

? 显示其后所跟表达式的值

?? 在当前行当前位置处显示指定表达式的值

@ …BOX 根据指定坐标画一个框

@ …CLEAR 清除活动窗口或屏幕的一部分

@ … FILL 改变一个窗口或屏幕上指定区域的颜色

@ … GET 建立一个编辑区

@ … GET-Check Boxes 建立复选框

@ … GET-Invisible But tons 建立不可见按钮

@ … GET-Lists 建立滚动列表

@ … GET-Popups 建立弹出式选单

@ … GET-Push But tons 建立下推按钮

@ … GET-Radio Bu ttons 建立单选钮

@ … GET-Spinners 建立数码器

@ … GET-Tex t Edit Regions 建立正文编辑区

@ … MEN U 建立一个弹出式选单

@ … PROMPT 建立一个选单条

@ …SAY 将表达式的值按指定格式输出
@ …SAY…BMPs &OLE 显示 BM P 和 OLE 对象 , 或 调用 OLE 服务 器 以执 行 OLE
  对象谓词
ACCEPT 从显示屏接受字符串数据

ACT IVAT E MEN U 显示并激活一个选单条


ACT IVAT E POP UP 显示并激活 一个 由 DEF INE P OPU P 创 建的 弹出 式 选单 ,
  或一个 FoxPro 选单系统的弹出式选单
ACT IVAT E WINDOW 显示并激活一个或多个用户定义窗口或 FoxPro 系统窗口

・ 3 15 ・
续表
命  令 功   能

ACT IVAT E SCREEN 将随后的输出都送到屏幕

APPEND 向一个数据库文件尾部追加记录

APPEND FROM 从另一个文件中向数据库文件末尾追加记录


APPEND FROM ARRAY 向当前数据库文件中增加记录 , 并 用指定 数组的 数据填 充
  这些记录
APPEND GENERAL 将 OLE 对象输入到一个通用字段中

APPEND MEMO 将一个文件的内容拷贝到一个备注字段中

AVE RAGE 计算数值型表达式或字段的算术平均值


BROWSE 打开一个可在 其中 查看 和编辑 数据 库文 件 记录 的 Browse
  窗口
BUI LD APP 根据一个项目文件创建一个应用程序 ( .APP 文件 )

BUI LD EXE 根据一个项目文件创建一个可执行文件 ( .EXE 文件 )

BUI LD PROJECT 建立一个项目文件


CALCULATE 对数据库文件的 字段 或包 含字 段的 表达 式 执行 计算 或 统
  计
CALL 执行一个已用 LOAD 命令调入内存的二进制文件

CA NCEL 取消当前程序的执行

CHANGE 或 EDI T 显示字段值 , 以便编辑

CLEAR 清除屏幕或当前输出窗口的内容

CLEAR ALL 从内存中释放所有内存和所有用户 定义选 单条、弹出式 选


  单和窗口 , 并 关闭 所 有 的数 据 库 和相 关 文 件 , 然 后选 择 1
  号工作区

CLEAR FIELDS 释放所有由 SE T FI ELDS TO 创建的字段

CLEAR GETS 释放所有以前的 GE T 语句

CLEAR MACROS 从内存中释放所有的宏 , 包括所有功能键定义

CLEAR MEMORY 清除内存中所有的全局和局部内存变量


CLEAR MEN US 从内存中释 放所 有的 选 单条 , 并 将 其 从 FoxPro 主 窗 口 或
  一个用户自定义窗口中清除
CLEAR POP UP S 从内存中释放所有的弹出式选单 , 并从屏 幕上清 除处于 活
  动状态的弹出式选单
CLEAR PROGRAM 清除已编译程序的缓冲区

CLEAR R EAD 退出活动 READ

CLEAR TY PEAHEAD 清除键盘缓冲区

・ 3 16 ・
续表
命  令 功   能
CLEAR Windows 从内存中释放所有用户自定义窗口 的定义 , 并从 屏幕上 擦
  除这些窗口
CLOSE ALL 关闭所有工作区中的所有文件 , 然后选择 1 号工作区

CLOSE ALTE RNATE 关闭一个打开的 ALT ERNAT E 文件

CLOSE DATABASE 关闭所有正打开的数据库文件、索引、备注和格式文件

CLOSE FORMAT 关闭在当前工作区中打开的格式文件

CLOSE I NDEX 关闭所选择的工作区中所有打开的索引文件

CLOSE MEMO 关闭备注编辑窗口

CLOSE PROCED URE 关闭用 SE T PROCEDUR E 命令打开的文件


COMPI LE 编译一个或多个程序文件 , 并为每 个源文 件生成 一个目 标
  文件
CONT INUE 继续执行前面的 LOCAT E 语句

COPY FILE 复制任意类型的文件

COPY I NDEX 将单项索引文件拷贝到一个复合索引文件中

COPY MEMO 将备注字段的内容拷贝到一个文本文件中

COPY ST RUCT URE 将一个数据库文件的结构拷贝给另一个 .DBF


将一个数据库文 件结 构信 息拷 贝到 另一 个 新数 据库 文 件
COPY ST RUCT URE EXTENDED
的记录中
COPY TAG 根据复合索引文件的一个标识创建一个单项索引文件

COPY TO 将当前数据库文件的内容拷贝到一个新文件中

COPY TO ARRAY 从当前数据库文件中拷贝数据到一个数组中

COU NT 计算数据库文件的记录数

CR EAT E 生成一个新 FoxPro 数据库文件

CR EAT E COLOR SE T 从当前颜色集合中生成一个新的颜色集


CR EAT E FROM 从一个 COP Y ST RUCTU RE EXTENDED 文 件 中 生 成 一
  个数据库文件
CR EAT E LABEL 在 FoxPro for MS-MOS 中打 开 一 个 Label Design 窗口 ; 在
  FoxPro for Windows 中打开 New Label 对话框
CR EAT E MEN U 打开一个 Menu Design 窗口

CR EAT E QUE RY 打开 RQBE 窗口

CR EAT E R EP OR T 打开在 Report Design 窗口中的一个报表

CR EAT E R EP OR T —Quick Report 快速生成一个报表

CR EAT E SCREEN 打开一个 Screen Design 窗口

・ 3 17 ・
续表
命  令 功   能

CR EAT E SCREEN—Quick Screen 快速生成一个屏幕

CR EAT E TABLE—SQL 生成一个带指定字段的数据库文件

CR EAT E VIEW 从 FoxPro 环境中生成一个视图文件

CR EAT E PROJECT 打开 Project 窗口 , 以便生成一个项目


DEACT IVATE MENU 释放一个用户定 义选 单 , 并将 其 从屏 幕上 清 除 , 但并 不 清
  除内存中的该选单条定义
DEACT IVATE PO PU P 将弹出式选单从屏幕上清除 , 但并 不清除 其在内 存中的 定
  义
DEACT IVATE W INDOW 释放用户定 义窗 口或 FoxPro 系 统窗 口 , 并 将 这些 窗 口 从
  屏幕上擦除 , 但保留这些窗口在内存中的定义
DECLARE 生成一个或多个数组

# DEFINE… # UNDEF 建立和释放编译时常量


DEFINE BAR 在一个由 DEFINE POP U P 定义 的 或 者 FoxPro 选 单 系 统
  的弹出式选单上创建一个选单选择项
DEFINE BOX 在打印出的正文周围画一个框

DEFINE MEN U 创建一个选单条


DEFINE PAD 在一个用户定义的或 FoxPro 系统 的选单 条上创 建一个 选
  单笺
DEFINE POP U P 创建一个弹出式选单

DEFINE W INDOW 创建一个窗口并指定其属性

DELET E 在当前数据库文件中 , 给指定记录作上删除标记

DELET E FILE 从磁盘上删除一个文件

DELET E TAG 从一个 .CDX 复合索引文件中删除一个或多个标识

DIMENSION 建立一维或二维数组

DIR 或 DIRECTORY 显示磁盘目录的内容

DISPALY 或 LIST 显示当前数据库文件记录的内容和表达式的结果

DISPLAY 或 LIST F ILES 显示有关指定文件的信息

DISPLAY 或 LIST MEMORY 显示当前内存变量的内容

DISPLAY STATUS 或 LIST STATUS 显示 FoxPro 环境的状态

DISPLAY ST RUCT URE 显示数据库文件的结构

DO 执行一个命令文件或过程
DO CASE… ENDCASE 执行 DOCASE 之 后 , ENDCASE 之前 , 相应 条 件 计 算 结 果
  为真的第一个语句块
DO WHILE… ENDDO 执行一个条件循环内的语句块

・ 3 18 ・
续表
命  令 功   能

EJEC T 将一个换页符送到打印机

EJEC T PAGE 有条件地向前走一页打印机纸

E RASE 从磁盘上删除一个文件

EXI T 退出 DO WHI LE , F OR 或 SCAN 循环


EXPOR T 将数据从一个 FoxPro 数据 库文件 中拷贝 到一个 格式不 同
  的文件中
EXT ERNAL 提醒项目管理员有一未定义的引用

FI LER 引用 FoxPro Filer 磁盘文件维护实用程序

FIN D 搜索一个索引的数据库

FLUSH 将对数据库文件和索引文件所作出的改动存入磁盘

FOR…ENDF OR 执行中指定次数的循环

F UNCT ION 识别用户自定义函数定义的开始


GATHER 将内存变量或数 组元 素的 内容 存到 当前 数 据库 文件 的 当
  前记录中
GE TEX PR 显示 Expression Builder 对话框 , 将用户 定义的 表达 式存 入
  一个内存变量中
GO 或 GOTO 移动记录指针到指定的记录号上

HELP 打开 HELP 窗口

HIDE MENU 隐藏一个或多个活动的用户定义选单条

HIDE PO PU P 隐藏一个或多个用 Define Popup 定义的有效弹出式选单


HIDE WINDOW 隐藏一个处于活动状态 的用户 定义窗 口或 FoxPro 系统 窗
  口
# IF… # ENDIF 在编译时有条件地包含源代码

IF… ENDIF 根据逻辑表达式的结果有条件地执行一组命令


IMPOR T 从外部文件格式输入数 据来创 建一个 新的 FoxPro 数据 库
  文件
INDEX 创建一个索引文件 , 以便按逻辑顺序显示一个数据库文件

INP UT 从键盘向内存变量输入数据
INSE RT 向数据库文件中插入一个新记录 , 并显示 新记录 以进行 编
  辑
INSE RT FROM ARRAY 在当前数据库文件中所选择的记录 后插入 记录 , 并用指 定
  数组中的数据填充这些记录
INSE RT-SQL 向数据库文件尾部追加一个记录

JOIN 将两个数据库文件连接成一个新的数据库文件

・ 3 19 ・
续表
命  令 功   能

KEYBOARD 把指定字符表达式放到键盘缓冲区中
LABEL 根据一个数据库 文件 和一 个标 签定 义文 件 的内 容输 出 标
  签
LOAD 将二进制文件调入内存 , 以备 CALL 命令执行
LOCAT E 在指定数据库文 件中 顺序 寻找 同给 定表 达 式相 匹配 的 第
  一个记录
MAC 如果正使用 FoxPro for Macin tosh 则为真值

MODIFY CO MMAND/ FILE 打开一个文本编辑窗口 , 建立或修改一个程序或文本文件

MODIFY GENERAL 打开一个编辑窗口 , 以便编辑通用字段

MODIFY LABEL 建立或修改标签 , 并将其存入一个标签定义文件中

MODIFY MEMO 打开一个编辑窗口 , 以便编辑备注字段

MODIFY MEN U 显示 Menu Design 窗口 , 创建或修改一个选单系统

MODIFY PROJEC T 打开 Project 窗口 , 修改或建立一个项目文件

MODIFY QUE RY 打开 RQBE 窗口 , 以便建立或修改一个查询


MODIFY R EPORT 打开报表设计窗 口 , 建立 或编 辑 一个 报表 , 并将 其存 入 一
  个报表定义文件
MODIFY SCRE EN 显示屏幕设计窗口 , 修改或建立一个屏幕

MODIFY ST RUCT URE 修改当前数据库文件的结构

MODIFY WI NDOW 修改一个已定义的窗口

MOVE POP U P 移动一个弹出式选单到一个新位置

MOVE W INDOW 将一个窗口移动到指定的屏幕位置

NOTE 或 * 指出程序文件中注释行的开始

&& 在命令后指出其后跟的是注释
ON BAR 当选择了弹出式选单上的一个选择 项时 , 激活一 个弹出 式
  选单或选单条
ON ERROR 指定当错误出现时应执行的命令
ON ESCAPE 指定一条在程序和命令执行期间按下 Esc 键时应执行的命
  令
ON KEY 指定一条在程序执行期间按下任意键时应执行的命令
ON KEY = 在 R EAD 过程中当按 下指 定的 键或 组合 键时执 行一 个 命
  令
ON KEY LABEL 指定当按下某键或组合键或鼠标时应执行的命令

ON PAD 当选择一个选单笺时激活一个弹出式选单或选单条

・ 3 20 ・
续表
命  令 功   能
ON PAGE 当打印输出到达报表指定行时 , 或当使用 Eject Page 时 , 执
  行一个命令
ON R EADERROR 指定当数据输入错误时应执行的命令
ON SELEC T ION BAR 指定一条命令 , 它在选择了一个弹 出式选 单的选 单条时 执
  行
ON SELEC T ION MEN U 指定一条在一个 用 DEFINE MENU 定义的 选单条中选 择
  了选单笺时应执行的命令
ON SELEC T ION OP U P 指定一个出现下述 情况时 执行的 命令 : 在一 个用 DEF INE
  POP UP 定义的或 FoxPro 选单系统的弹出式选择了任一选
  单条
ON SELEC T ION PAD 指定一个出现下述情况时执行的命 令 : 在 一个用 户定义 选
  单或 FoxPro 的系统选单条中选择了某个指定选单笺
ON SH UTDOWN 指定试图退出 FoxPro for Windows 或 Microsoft Windows 时
  执行一个命令
PACK 将所有作了删除标记的记录真正地 删除 , 并减小 备注文 件
  的大小
PARAME TE RS 将主调程序传来的数据赋给局部内存变量

PLAY MACRO 执行一个键盘宏

POP KEY 恢复用 P USH KEY 命令放在栈中的 ON KEY LABEL


POP MENU 恢复由 P USH MENU 压入堆栈的用户 定义选单 条或 Fox-
  Pro 系统选单条
POP PO PU P 恢复由 P USH PO PU P 放入堆栈的一个弹出式选单

PRINT JOB… ENDPRINT JOB 激活打印作业的系统内存中变量的设置

PRIVATE 使以前定义的同名内存变量在当前程序中不可用

PROCEDUR E 在一个程序文件中标出一个过程开端

P UBL IC 定义全局内存变量或数组

P USH KEY 将所有 ON KEY LABEL 命令的设置放入内存的堆栈中

P USH MEN U 将一个选单条的定义入栈

P USH POP U P 将一个弹出式选单定义入栈

Q UI T 退出 FoxPro, 返回 Windows 环境

READ 激活 @… GE T 和 @ … EDI T 的对象 , 以便编辑

READ MENU 激活一个弹出式选单

RECALL 去掉指定记录的删除标记

REGIONAL 定义局部内存变量或数组

REI NDEX 重建已打开的索引文件

・ 3 21 ・
续表
命  令 功   能
RELEASE 释放内存变量、库、用 户定 义选 单、弹 出式 选 单、弹出 式 选
  择项和窗口等等
RELEASE BAR 释放一个弹出式选单上的一个或所有的选单条

RELEASE MEN US 从内存中释放所有的或指定的用户定义选单条的定义

RELEASE MOD UL E 从内存中释放一个已装入的二进制文件


RELEASE PAD 从一个用户定义的或 FoxPro 系统 的选单 中删除 指定的 选
  单笺
RELEASE POP UPS 从内存中释放所有的或用 DEFINE POP UP 建立的弹出 式
  选单定义
RELEASE Windows 从内存中释放指定窗口的定义 , 并将其从屏幕上清除

RENAME 给一个文件改名

REPLACE 根据一个或多个表达式数据修改一个或多个字段
REPOR T 根据若干数据库 文件 和一 个报 表定 义的 内 容输 出一 个 报
  表
RESTORE FROM 从一个内存变量文件或备注字段中恢复内存变量的内容
RESTORE MACROS 从一个磁盘文件 或一 个备 注字 段中 将一 组 键盘 宏恢 复 到
  内存里
RESTORE SCR EEN 恢复 FoxPro 主窗口或用户自定义窗口
RESTORE W INDOW 从一个窗口文件 或一 个备 注字 段向 内存 恢 复所 有的 或 指
  定的窗口定义
RES UME 继续执行一个被挂起的程序
RET RY 将控制权返回主调程序 , 并重新执 行该程 序中最 近一次 发
  出的命令
RET URN 将控制返回主调程序

RU N 或 ! 在 FoxPro 环境中运行一个外部命令或应用程序

SAVE MACROS 将一组键盘宏存到一个键盘宏文件或一个备注字段中

SAVE TO 将内存变量存入一个内存变量文件或一个备注字段中
SAVE W INDOW 将所有的或指定 的窗 口定 义存 到一 个窗 口 文件 或一 个 备
  注字段中
SCAT TER 将数据从当前记录拷贝到数组或内存变量集中
SCROLL 将用户定义窗口 , 或 FoxPro 主窗口 的一个 区域、向上、下、
  左或右滚动
SCAN… ENDSCAN 用记录指针遍历当前数据库文件 , 并对符 合指定 条件的 每
  个记录执行一系列命令

・ 3 22 ・
续表
命  令 功   能

SEEK 在当前已索引的 数据 库文 件中 寻找 索引 键 表达 式同 给 定
  表达式相匹配的 第一 个记 录 , 若 找到 , 则 将 记录 指针 移 到
  该记录上

SELECT 激活指定的工作区

SELECT-SQL 从一个或多个数据库文件中检索数据

SET 打开 View 窗口

SET ALTE RNATE 将送往屏幕或窗口的输入内容定向到一个文本文件中


SET A NSI 指定 FoxPro 在 SQL 命令中 遇到“ = ”操作 符时 , 如 何比 较
  不等长的字符串
SET A UTOSAVE 确定在结束一个 READ 命令或返回 Command 窗口时是 否
  将缓冲区中更新的数据存到磁盘上
SET BELL 打开或关闭计算机响铃状态和设置响铃属性

SET BLINK 使屏幕元素闪烁

SET BLOCKSIZE 指定 FoxPro 如何为备注字段的存储分配磁盘空间


SET BORDER 为用 DEF INE POP U P 命 令 建立 的 弹 出 式 选 单 或 用 DE-
  FI NE Windows 建立的窗口定义边框
SET BRSTATU S 允许或禁止在 Browse 窗口显示状态条
SET CARRY 设置 FoxPro 是否 将 数 据 从 当 前 记 录传 给 由 AP PEND 或
  INSER T 新增的记录

SET CENTURY 指定 FoxPro 在显示日期表达式时是否显示世纪部分

SET CLEAR 设置 SE T F OR MAT TO 命令和 QU IT 命令是否清除屏幕

决定 FoxPro 是否 显 示系 统时 钟 , 并 指定 屏 幕 上的 时 钟 位
SET CLOCK

SET COLOR OF 指定用户自定义系统和窗口的颜色
SET COLOR OF SCHEME 指定一个色彩模式中的色彩 , 或将 色彩模 式拷贝 给另一 个
  色彩模式
SET COLOR SE T 装入先前定义的色彩集

SET COLOR TO 指定用户定义选单和窗口各部分的颜色

SET CO MPAT IBLE 控制 FoxPro 同 FoxBASE + 的兼容性

SET CO NFIRM 设置结束一个输入字段时是否需要按回车或 TAB 键

SET CO NSOLE 允许或禁止输出到屏幕或窗口

SET CURRENCY 定义货币符号及其显示位置


SET CURSOR 决定在 @ … GET , INKEY( ) 或 WAI T 等命令执行期间是 否
  需要显示光标

・ 3 23 ・
续表
命  令 功   能

SET DATE 设置日期表达式显示时的格式

SET DEBU G 激活或取消对 Debug 和 Trace 窗口的访问

SET DECIMALS 指定某些输出操作的数值结果显示时的小数位数

SET DEF AULT 指定缺省驱动器和目录

SET DELETED 指定 FoxPro 是否处理带有删除标记的记录

SET DELIMI T ED 指定 @… GE T 输入字段是否被定界


SET DEVELOPMENT 使得 FoxPro 运行 一 个程 序时 , 比较 程序 文 件 的生 成 日 期
  及时间和所对应的编译目标文件的生成日期及时间
SET DEV ICE 指定 @… SAY 命令的输出送到屏幕、打印机或文件中

SET DISPLAY 在支持多种显示模式的监视器上改变当前显示模式

SET DOHISTORY 决定程序中的命令是否要放入 Command 窗口

SET ECHO 激活 T race 窗口 , 以调试程序

SET ESCAPE 确定在按下 Esc 键时是否中断程序和命令的执行


SET EXAC T 指定在字符串比较时 , 两个不同长 度字符 串是否 可以认 为
  相同
SET EXCLUSIVE 指定 FoxPro 以独占方式还 是以共 享方式 在网络 上打开 数
  据库文件
SET FI ELDS 指定是存取所有 字段 还是 仅存 取包 含在 一 个字 段列 表 中
  的那些字段
SET FIL TE R 为指定数据库文件中的记录设定一 个条件 , 使得 只有符 合
  该条件的记录能够被访问
SET FIXED 指定是否确定数值型数据显示中小数的位数

SET FORMAT 打开一个格式文件


SET F ULLPATH 指定 CDX( ) , DBF ( ) , IDX ( ) 和 NDX ( ) 在 返回 文件 名时 是
  否返回整个路径
SET F UNCT ION 为一个表达式或键盘宏分配一个功能键
SET HEADIN GS 设置在 DISPLAY , LIST , SU M 和 AVERAGE 等命令中 是
  否显示每个字段的列标题
SET HELP 激活或取消 Fox Pro 的联 机帮 助 功能 , 或 指 定 一个 帮 助 文
  件
SET HELP FIL TER 激活 Help 窗口 , 显示出一组帮助主题

SET HOU RS 将系统时钟设置成 12 或 24 小时格式

SET I NDEX 打开当前数据库的一个或多个数据文件

SET I NTENSITY 决定 FoxPro 显示编辑字段时是否使用加强屏幕颜色属性

SET KEYCOM P 指定 DOS 风格或 Windows 风格击键操作

・ 3 24 ・
续表
命  令 功   能

SET LIBRARY 打开一个外部库文件

SET LOCK 允许或禁止在某些命令中的自动锁定文件

SET LOGERRORS 确定 FoxPro 是否将编译错误消息送到一个文本文件中

SET MACKEY 指定显示宏对话框的键或组合键

SET MARGIN 指定打印输出时页左边留下的空白大小


SET MAR K OF 为用户定义的选 单笺 或弹 出式 选单 的一 个 选单 条指 定 一
  个标志字符
SET MAR K TO 指定日期表达式显示时的定界符

SET MEMOWIDT H 指定备注字段和字符表达式的显示宽度

SET MESSAGE 定义一条提示信息 , 它 显示 在 FoxPro for Windows 的状 态


  条 , 该命令也指定在选单条或弹出 式选单 命令中 提示信 息
  的显示位置

SET MUL TI LOCKS 指定能否用 LOCK( )或 RLOCK( ) 锁住多个记录


SET NEAR 确定当 F IND 或 SEEK 命令不能成功地找到符合条件的记
  录时 , 记录指针应移至何处
SET NOTI FY 允许或禁止显示某些系统信息

SET ODOMET ER 为处理记录的命令设置计数器的报告间隔

SET O PT IMIZE 允许或禁止 Rush more 优化

SET ORDE R 指定当前数据库文件的控制索引文件或标识

SET PALE TT E 设置是否使用 FoxPro 调色板

SET PATH 指定一个文件搜索路径


SET PDSETU P 装入打印机驱动 程序 的设 置或 清除 当前 打 印机 驱动 程 序
  设置
SET POINT 确定在显示数值表达式时使用的十进制小数点字符
SET PRINTE R 允许或禁止输出到打印机 , 或将打 印机输 出导向 一个文 件
  或端口
SET PROCED URE 打开一个过程文件

SET R EADBORDER 决定用@ … GE T 建立的编辑区是否有编辑框

SET R EFRESH 确定使用 BROWSE , CHANGE , EDI T , MODI FY MEM O 命


  令时 , 如果网络 用户 对有 关记 录 进行 了修 改 , 本 地屏 幕 显
  示内容是否要随之更新

SET R ELAT ION 连接两个或多个已打开的数据库文件或解除它们的连接


SET R ELAT ION OF F 断开在当前数据 库文 件同 另一 个已 打开 的 数据 库文 件 之
  间建立的关系

・ 3 25 ・
续表
命  令 功   能
SET R EPROCESS 指定文件上锁或记录上锁不成功后 还要反 复尝试 多少次 ,
  或多长时间
SET R ESOU RCE 指定或修改一个资源文件
SET SAFETY 指定在覆盖一个 已存 在文 件之 前是 否要 先 显示 一条 警 告
  信息
SET SEPARATOR 指定在小数点左边用什么分隔符将数字分为每三位一组

SET SKI P 在两个相关的数据库文件间建立一对多的关系


SET SKI P OF 设置一个用户定义选单 或 FoxPro 系统选 单能否 使用选 单
  条、选单笺、弹出式选单或弹出式选单条
设置当使用 ? 或 ?? 命令时字段或 表达式 之间是 否要显 示
SET SP ACE
一个空格
SET STATUS 显示或清除 Windows 型的状态条

SET STATUS BAR 显示一个 Windows 型的状态条

SET STEP 打开 T race 窗口 , 并中断程序执行进行调试

SET SYSMENU 允许或禁止在程序执行期间对 FoxPro 系统选单条的访问

SET TALK 确定 FoxPro 是否显示某些命令的处理信息


SET T EXTMERGE 激活或取消用定 界符 括住 的 数据 库文 件 字段、内 存 变量、
  函数和表达式等的计算
SET T EXTMERGE DEL IMETE RS 指定文本拼接定界符

SET TOP IC 指定调用 FoxPro 帮助系统时将首先出现的帮助标题

SET T RBE TWEEN 激活或取消 T race 窗口中的断点跟踪

SET TY PEAHEAD 指定键盘输入缓冲区可存字符的最大数

SET UDF PARMS 指定 FoxPro 把参数值或关系传递到用户自定义函数

SET U NIQ UE 指定相同索引键值的记录是否被保持在索引文件中


SET VIEW 打开或关闭 View 窗口 , 或 从一 个视 图文 件中 恢复 Fox Pro
  环境
SET WI NDOW O F MEMO 指定编辑备注字段的窗口

SHOW GE T 重新显示单个的所指定的 @ …GET 对象

SHOW GE TS 重新显示所有的 @ …GET 对象

SHOW MENU 显示一个选单而不激活该选单

SHOW OBJECT 重新显示指定了对象号的 @ …GET 对象

SHOW PO PU P 显示一个弹出式选单而不激活它

SHOW W INDOW 显示一个窗口而不激活它

SIZE POP U P 改变一个弹出式选单的大小

・ 3 26 ・
续表
命  令 功   能

SKIP 在当前或指定的数据库文件中将记录指针向前或向后移
SOR T 对当前数据库文件的记录排序 , 并 将排序 后的数 据输出 到
  一个新数据库文件中
STORE 或 = 给一个内存变量赋值或初始化一个数组

SUM 对当前数据库文件中所有的或指定的数值字段求和

SUSPEND 暂停一个程序的执行 , 将其挂起

TEXT … ENDTEXT 显示文本块

TOTAL 对当前数据库文件按关键字进行分类小计

TYPE 显示一个 ASCII 文件的内容

U NLOCK 从当前或指定的数据库文件中释放 一个记 录锁定 , 多个 记


  录锁定或文件锁定 , 或者从所有打 开的数 据库文 件中释 放
  所有记录和文件锁定
U PDAT E 用另一工作区已 打开 的数 据库 文件 的数 据 更新 当前 数 据
  库文件的数据
USE 打开或关闭一个数据库文件以及相应的索引文件

WAI T 暂停 FoxPro 的操作 , 直到按下任意键或鼠标按钮

ZAP 真正删除一个数据库文件中的所有记录
ZOOM WINDOW 改变一个用户定义窗口 或一个 Fox Pro 系 统窗口 的大小 及
  位置

・ 3 27 ・
附录二   FoxPro for Windows主要函数

函 数 功   能

& 执行宏代换

$ 确定一个字符串是否包含在另一个字符串或备注字段中

ABS( ) 返回指定数值表达式的绝对值

ACO PY( ) 将数组元素从一个数组拷贝到另一个数组中

ADEL( ) 从一个一维数组中删除一行或从一个二维数组中删除一行或一列

AELEMENT ( ) 返回指定行和列下标的数组元素号

AFI ELDS ( ) 将数据库文件结构信息送入一个数组中

AFONT ( ) 将有关可用字体的信息存入一个数组中

AI NS( ) 插入一个元素到一维数组中 , 或者插入一行或一列到二维数组中

ALEN( ) 返回一个数组中的行数、列数或元素数

ALIAS( ) 返回当前或指定工作区的别名

ALLT RIM( ) 去掉指定字符表达式开头和结尾的空格后将其返回


将一个字符表达式中的 每一 个字 符都 转化 成 MS-DOS( OEM ) 字 符集 中的 字
ANSI TOOEM ( )

APPEND( ) 在数据库文件的末尾追加记录

ASC( ) 返回一个字符串中最左字符的 ASCII 码

ASCAN ( ) 在数组中查找一个表达式

ASIN ( ) 返回指定数值表达式的反正弦值

ASOR T ( ) 按升序或降序给一个数组中的元素排序

AS UBSCRIPT ( ) 从一个数组元素的元素号返回其行或列的下标
返回一个字符表达式在另一个字符表达式 或备注字段 中首次出现 时的位置 ,
AT ( )
从左部开始计算 , 位置是一个整数
返回一个字符表达式或备 注字段 在另 一个 字符表 达式 或备 注字 段中 首次 出
AT CLINE ( )
现时的行号 , 字母不区分大小写
AT LINE ( ) 功能类似于 AT CLINE ( ) , 不同的是字母要区分大小写

AVE RAGE ( ) 计算数值表达式或字段的算术平均值


返回一个由 DEFI NE POP U P 定 义的 弹出 式选 单或 一个 FoxPro 系 统弹 出 式
BAR( )
选单的最新选项号
BET WEEN ( ) 确定一个表达式的值是否在另两个相同数据类型的表达式的值之间

・ 3 28 ・
续表
函 数 功   能

BO F( ) 如果记录指针指向数据库文件的开头位置 , 则返回真值

CDOW( ) 返回根据给定日期表达式算出的星期值 , 即那一天是星期几

CDX( ) 返回打开的 .CDX 索引文件名

CE ILI NG( ) 返回大于或等于指定数值表达式值的最小整数

CHR( ) 返回指定 ASCII 码所对应的字符

CMONTH ( ) 返回给定日期的月份值

COL ( ) 返回光标当前位置的列数

COS ( ) 返回一个数值表达式的余弦值

CTOD( ) 将字符型日期转换成日期型日期

DATE ( ) 返回当前系统日期

DAY ( ) 返回根据给定日期算出的日期值 , 即那一天是该月中的第几天

DBF ( ) 返回在当前工作区或指定工作区中打开的数据库文件名

DISKSPACE( ) 以字节为单位返回缺省磁盘驱动器上的剩余空间

DMY( ) 返回一个以日、月、年格式表示的日期表达式

DOW( ) 返回根据给定日期算出的数值型星期值 , 即用数字来表示那一天是星期几

DTOC( ) 将日期型日期转换成字符型日期

DTOR( ) 根据度数返回弧度

DTOS( ) 从一个指定日期表达式中返回用格式 YYYY MMDD 表示的一个字符串日期

EMP TY( ) 确定一个表达式是否为空

EOF ( ) 如果记录指针指向数据库文件的尾部 , 则返回真值

E RROR( ) 返回在 ON ERROR 中引起的错误信息代码

EVALU AT E ( ) 计算字符表达值并返回结果

EXP( ) 返回 ex 值 , x 值即指定的数值表达式的值

FCO UNT ( ) 返回当前的或者指定的数据库文件的字段数

FEO F( ) 确定文件指针是否指问文件尾部

FI ELD( ) 返回当前或者指定数据库文件中对应于字段号的字段名

FI LE ( ) 如果可在磁盘上找到指定文件则返回真值

FKLABEL ( ) 返回对应于一个数值表达式的功能键名

FK MAX( ) 返回键盘上可用的可编程功能键或组合功能键的代号

FLOCK ( ) 试图锁住一个数据库文件 , 如果成功则返回真值

FLOOR( ) 返回小于或等于指定的数值表达式的最接近的整数

・ 3 29 ・
续表
函 数 功   能

FO NTME TRIC( ) 返回 Windows 下安装的当前字体的字体属性


如果最近一次 命令 LOCAT E , CONT IN UE , FI ND 或 SEEK 查找成功 , 返回 真
FO UND( )

FSIZE( ) 返回指定字段大小的字节数

GATHER ( ) 将内存变量或数组元素的内容存到当前数据库的当前记录中

GE TDIR( ) 显示 Select Directory 对话框 , 可从中挑选一个目录

GE TFILE ( ) 显示 Open 对话框并返回所选择的文件名

GE TFONT ( ) 显示 FoxPro for Windows Fon t 对话框 , 并返回所选择的字体名

GOMONTH ( ) 返回在给定日期之前或之后指定月数的日期

II F( ) 根据逻辑表达式的取值返回真假所指的二个表达式值之一

INKEY( ) 返回键盘缓冲区中键入的第一个键或鼠标键的数值

INL IST ( ) 确定一个表达式是否同相同类型的一系列表达式中的某一个相匹配

INT ( ) 返回数值表达式的整数部分

ISALP HA( ) 如果指定字符表达式的最左字符是一个字母 , 则返回真值

ISDIGIT ( ) 如果指定字符表达式的最左字符是 0~9 之间的一个数字 , 则返回真值

ISLOWER( ) 如果指定字符表达式的最左字符是小写字母则返回真值

IS UP PER( ) 如果指定字符表达式的最左字符是大写字母则返回真值

KEY ( ) 返回控制索引文件的关键索引表达式

LASTKEY ( ) 返回对应于最后一个按键的值

LEFT ( ) 返回字符串中从最左字符开始的指定数目的字符

LEN( ) 返回字符表达式中字符的个数

L IKE ( ) 确定一个可以含有通配符的字符表达式是否同另一个字符表达式相匹配

LOCK( ) 试图锁住当前或指定数据库文件中的一个或多个记录 , 如果成功则返回真值

LOG( ) 返回指定数值表达式的自然对数值

LOG10 ( ) 返回指定数值表达式的常用对数值
在库文件中寻找字段和指定表达式匹配的 第一个记录 , 如找到 则记录指针 移
LOOKU P( )
至这一记录 , 并返回该记录中指定字段的值
LOWER ( ) 以小写字母形式返回指定的字符表达式

LT RIM ( ) 返回去掉了前导空格的指定字符表达式

LU PDAT E( ) 返回最后一次修改数据库文件的日期
返回字符串、数值或日期表达式中 ASCII 码值最 大或数值最大 或日期最晚 的
MAX( )
表达式的值

・ 3 30 ・
续表
函 数 功   能

MCOL ( ) 返回鼠标指针在屏幕或一个窗口中的列位置

MDOWN( ) 判断是否按了鼠标左键

MDX( ) 返回打开的复合索引文件名

MEMLI NES( ) 返回一个备注字段的行数

MEM ORY ( ) 返回可运行外部程序的内存数量

MESSAGE ( ) 返回当前错误信息或程序引起错误的那一行的内容
返回字符串、数值或日期表达式中 ASCII 码值最 小或数值最小 或日期最早 的
MIN ( )
表达式的值
MLINE ( ) 以字符串形式返回一个备注字段中所指定的那一行

MOD( ) 返回一个除法操作的余数

MONTH ( ) 返回给定日期的数字月份

确定一个选单条是否被 SE T MARK OF 作过标记 , 该选单条或 者属于一个 用


MRKBAR ( ) DEFINE POP U P 定义的弹出式选 单条 , 或者 属于 FoxPro 选单系 统的 弹出 式
选单条
确定一个选单笺是否被 SE T MARK OF 作过标记 , 该选单笺或 者属于一个 用
MRKP AD( )
户定义的选单条 , 或者属于 FoxPro 系统的选单条
MROW ( ) 返回鼠标指针在屏幕或一个窗口中的行位置

MWINDOW ( ) 指出鼠标指针位于哪一个窗口

NDX( ) 返回当前或指定数据库中打开的数据库索引文件名

OBJ NU M( ) 返回指定 @ …GET 对象的对象号

OEMTOANSI ( ) 将字符表达式中的每一个字符转换成相应的 A NSI 字符集中的字符

ORDER( ) 返回当前指定数据库文件的控制索引文件名或标识名

PAD( ) 返回在一个选单条中最后选择的选单笺名

PARAME TE RS( ) 返回传入最近刚调用的程序、过程或用户自定义函数的参数个数

PCOL ( ) 返回打印机输出的当前列位置

PI( ) 返回 π值

PRINTSTATU S( ) 如果打印机已准备好 , 则返回真值 , 否则返回假值

PROGRAM ( ) 返回最近刚执行或执行过程中出现错误的程序的名称

PROM PT ( ) 返回在活动选单条或弹出式选单中选择的选择项

PROW ( ) 返回打印输出的当前行位置

P UTFI LE ( ) 打开 Save As 对话框 , 并返回所指定的文件名

RAN D( ) 返回一个介于 0 和 1 之间的随机数

・ 3 31 ・
续表
函 数 功   能
返回一个字符串或备注字段在另一个字符 串中出现的 起始位置 , 从其最右 的
RAT ( )
字符开始计数
寻找一个字符串或备注字段在另一个字符 串中出现的 位置 , 从 最后一行开 始
RATL INE ( )
计数 , 返回值与 MEMOW IDTH 命令所指定的值有关
RDLEVEL ( ) 返回当前 READ 的嵌套数

READKEY ( ) 返回在退出某一个编辑命令时所按键的对应值

RECCO UNT ( ) 返回一个数据库文件中的记录总数

RECNO( ) 返回当前记录号

RECSIZE( ) 返回数据库文件的记录长度

RELAT ION( ) 返回为数据库文件指定的关系表达式

REPL ICAT E ( ) 返回指定的字符表达式重复指定次数之后形成的字符表达式

RIGH T ( ) 返回字符串中从最右字符开始算起的指定数目的字符

RLOCK ( ) 试图锁住当前或指定数据库文件中的一个或多个记录 , 如果成功返回真值

RO UN D( ) 返回数值表达式四舍五入的结果

ROW ( ) 返回光标的当前行位置

RTOD( ) 将弧度转换为角度

RT RIM ( ) 返回已去掉尾部空格的指定字符表达式

SCHEME ( ) 从一个彩色模式中返回一个颜色对或颜色对列表

SCOLS( ) 返回显示屏幕上可用的列数

SECO NDS( ) 返回以秒、千分之一秒格式表示的从午夜开始已过去的秒数

SEEK( ) 在当前已索引的数据库文件中按索引表达式查找记录

SELECT ( ) 返回工作区号

SIGN ( ) 在数值表达式值为负数时返回 - 1 , 为正数时返回 1 , 为零时返回 0

SI N( ) 返回指定角度的正弦值

SQRT ( ) 返回指定数值表达式的平方根

SPACE ( ) 返回一个由指定数目空格组成的字符串

SROWS( ) 返回屏幕可用的行数

ST R( ) 把一个数值表达式转换为字符表达式

ST R TRAN ( ) 在第一个字符表达式出现的第二个表达式值 , 用第三个字符表达式值来替换

ST UF F ( ) 在字符串的任何部分插入或删除字符串

SUBST R( ) 返回给定字符表达式或备注字段中指定数目的字符串

SYS (1) 返回对应于当前系统日期的 Julian 天数

・ 3 32 ・
续表
函 数 功   能

SYS (2) 返回午夜过后的秒数

SYS (3) 返回一个唯一的合法文件名

SYS (5) 返回 SET DEFAULT 命令的当前设置

SYS (6) 返回 SET PRINT ER TO 的当前设置

SYS (11 ) 返回对应于给定日期的 Julian 天数

SYS (12 ) 返回可用于 RU N 命令的内存空间字节数

SYS (13 ) 返回打印机状态

SYS (14 ) 返回索引文件或索引标识的关键字表达式

SYS (18 ) 返回触发 ON KEY 命令时正在编辑的字段

SYS (21 ) 返回当前数据库文件的控制索引的索引位置数

SYS (100) 返回 SET CONSOLE 命令的当前设置

SYS (101) 返回 SET DEVICE 命令的当前设置

SYS (102) 返回 SET PRINT ER 命令的当前设置

SYS (103) 返回 SET TALK 命令的当前设置

SYS (1001) 返回 FoxPro 内存管理程序可以使用的内存空间数量


返回用户自定义对象、打开的数据库文件、低 级文件、内 存变量等所 占用的 内
SYS (1016)
存空间数量
SYS (2000) 返回同指定要求相匹配的第一个文件名

SYS (2001) 返回 SET 命令的状态

SYS (2002) 激活或取消光标显示

SYS (2005) 返回处于活动状态的资源文件名

SYS (2010) 以字符串形式返回 MS-DOS 的配置文件 CONF IG .SYS 中的文件设置

SYS (2011) 返回当前工作区记录或数据库文件的锁定状态

SYS (2012) 返回数据库文件备注型字段的块大小

SYS (2013) 返回下列名称 : 系统选单的选单笺、选单系统弹出式选单名以及选择项

SYS (2015) 返回一个唯一的过程名

SYS (2016) 返回由最近一次 SH OW GE TS WIN DOW 命令指定的窗口名

SYS (2017) 清屏幕 , 显示 FoxPro 的注册屏幕

SYS (2018) 返回最近产生的错误的错误信息参数

SYS (2019) 在 FoxPro for Windows 中 , 返回配置文件 CON FIG .F PW 的名称和路径

SYS (2021) 返回当前或指定数据库文件单项索引文件或标识的索引过滤器表达式

・ 3 33 ・
续表
函 数 功   能

SYS (2022) 返回指定磁盘的盘簇大小 (以字节为单位)

SYS (2023) 返回 FoxPro 用来存储临时文件的驱动器

SYSME TRIC( ) 在 FoxPro for Windows 中 , 返回一个 Windows 显示元素的大小

TAG( ) 返回 .CDX 复合索引文件标识名 , 或返回 .IDX 单项索引文件名

TAN ( ) 返回指定角度的正切值

TARGE T ( ) 返回作为一个关系目标的数据库文件的别名

TI ME ( ) 返回当前系统时间

TRANSF OR M( ) 利用 PICTU RE 和 F U NC TIO N 代码格式化一个字符或数值表达式

TRIM ( ) 返回已删除了尾部空格的指定字符表达式

TXTW IDTH ( ) 返回字符表达式在 Fox Pro for Windows 中用特定字体表示时的长度

TYPE ( ) 返回表达式的数据类型

U PDAT ED( ) 如果在最近的 R EAD 命令执行期间改变了数据 , 则值为真

U PPER ( ) 把字符表达式的值从小写转换成大写

USED( ) 如果数据库文件已在指定工作区中 , 则值为真

VAL ( ) 将字符串转换成数值

VARREAD( ) 返回当前正在编辑的字段或变量的名称

WBORDER ( ) 如果一个窗口有边框则返回真值

WCHILD( ) 返回当前或指定的父窗口的子窗口数或子窗口名

WCOLS( ) 返回一个窗口的列数

WEXIST ( ) 如果指定的窗口已经存在则返回真值

WFONT ( ) 在 FoxPro for Windows 中 , 返回一个窗口当前字体的名称、大小及类型

WLAST ( ) 返回当前活动窗口的前一活动窗口名或确认一窗口是否为前一活动窗口

WLCOL ( ) 返回当前或指定窗口的左上角的列坐标

WLROW( ) 返回当前或指定窗口的左上角的行坐标

WMAXI MU M( ) 如果指定窗口已最大 , 则返回真值

WMINIM U M( ) 如果指定窗口已最小 , 则返回真值

WONTOP( ) 确认当前窗口或指定窗口是否在其它激活窗口前面

WOUTP UT ( ) 确认是否输出到当前窗口或指定窗口

WPARENT ( ) 返回当前或指定子窗口的父窗口名

W READ( ) 如果指定窗口与当前 R EAD 命令有关 , 则返回真值

W ROWS( ) 返回当前指定窗口的行数

・ 3 34 ・
续表
函 数 功   能

W TI TL E( ) 返回当前或指定窗口的标题

WVISIBLE( ) 如果指定的窗口没有被隐藏 , 则返回真值

YEAR( ) 返回对应于指定日期表达式的年份值

・ 3 35 ・
附录三   ON KEY LABEL键标号一览表

键 标 识 键 标 号

左箭头 ←

右箭头 →

上箭头 ↑

下箭头 ↓

Home HOME

End END

PgUp PGU P

PgDn PGDN

Del DEL

退格 BACKSPACE

空格 SPACEBAR

Ins I NS

Tab TAB

Shift Tab BACKTAB

Enter ENTE R

F1 到 F12 F1 , F2 , . . ., F12

C trl + F1 到 Ctrl + F12 Ctrl + F1 , Ct rl + F2 , . . ., Ct rl + F12

Shift + F1 到 Shift + F12 Shif t + F1 ,Shift + F2 , . . ., Shif t + F12

Alt + F1 到 Alt + F12 Alt + F1 , Alt + F2 , . . ., Alt + F12

Alt + 0 到 Alt + 9 Alt + 0 , Alt + 1 , Alt + 2 , . . .,Alt + 9

Alt + A 到 Alt + Z Alt + A , Alt + B , Alt + C , . . .,Alt + Z

C trl + 左箭头 Ctrl + ←

C trl + 右箭头 Ctrl + →

C trl + Home Ctrl + HOME

C trl + End Ctrl + END

C trl + PgUp Ctrl + PGU P

C trl + PgDn Ctrl + PGDN

・ 3 36 ・
续表

键 标 识 键 标 号

C trl + A 到 C trl + Z Ctrl + A , Ctrl + B , Ct rl + C , . . ., Ctrl + Z

鼠标右键 RIGHTMO USE

鼠标左键 LEFTMOU SE

Mouse MOUSE

Escape ESC

・ 3 37 ・
主要参考文献

1. 张之超等 .FoxPro for Windows 实用基础教程 .北京 : 人民邮电出版社 , 1996


2. 梁杰等 .最新 FoxPro 2 .6 for Windows 使用详解 .西安 : 西安电子科技大学出版社 , 1996
3. 丁凯等 .Visual Fox Pro 3 .0 使用技巧 .北京 : 电子工业出版社 , 1996
4. 汤观全等 .FoxPro for Windows 数据库应用教程 .上海 : 华东理工大学出版社 , 1997
5. Kalman D .M . Fox Pro 2 .5 Developer’s Handbook . Random House Electronic Publish-
ing , 1993

・ 3 38 ・

You might also like