Professional Documents
Culture Documents
FoxP ro 及 其 应 用 系 统 开 发
清 华 大 学 出 版 社
( 京 ) 新登字 158 号
内 容 简 介
+
本书是谭浩强教授最新主编的《计算机基础教育丛 书》中 的一本 , 是 电视教材《FoxBASE 及其应 用
系统开发》一书的姐妹篇。全书从应用出发 , 遵循“语 言基础—程 序设计—系统 开发”三 阶段教 学法 , 全
面介绍了 FoxPro 的语言基础、窗口环境和辅助开发工具及其应用系统开发方法。
本书实例丰富 , 各章配有习题 , 适合于高校或电视教育 及培训 班用作 教材 , 也可供 计算机 应用人 员
自学或参考。
版权所有 , 翻印 必究。
本书封面 贴有清华 大学出版社 激光防伪 标签 , 无标签者不 得销售。
图书在版编目 ( CIP) 数据
《计算机基础教育丛书》主编
全国高等学校计算机基础教育研究会理事长
谭浩强
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 应用 系
统的开发。通过“设定一个屏幕、生成一个模块”及样例 , 引导读者对面向对象的程序设计
新思想和新方法获得初步的感性认识。
如果说第四章为引入程序设计开了一个头 , 则第 五章 到第 八章分 别讨 论了程 序设 计
的若干类专题 , 然后通过第九章归结为数据库应用系统的完整开发过程 , 在第四章的基础
上达到新的提高。
・Ⅴ・
第十章“多用户应用”引入了多用户应用的 基本概 念 , 简述 了与多 用户 操作有 关的 命
令和函数 , 以及设计多用户应用程序的注意事项。
综上可见 , 本教材概括 了 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
・Ⅶ・
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
中篇 程 序 设 计
・Ⅷ・
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
・Ⅸ・
6 .3 屏幕生成器的选单 …………………………………………………………………………… 206
6 .3 .1 Screen 选单 …………………………………………………………………………… 206
6 .3 .2 Object 选单 …………………………………………………………………………… 215
6 .4 组合查询窗口设计 : 用屏幕生成器修改现有屏幕文件一例 ……………………………… 218
习题 …………………………………………………………………………………………………… 220
下篇 系 统 开 发
・Ⅹ・
9 .3 项目管理器 …………………………………………………………………………………… 293
9 .3 .1 基本操作 ……………………………………………………………………………… 293
9 .3 .2 生成 .EXE 文件 ……………………………………………………………………… 295
9 .4 文档生成器 …………………………………………………………………………………… 296
习题 …………………………………………………………………………………………………… 298
・Ⅺ・
上 篇
语 言 基 础
第一章 绪 论
+
FoxPro 是继 dBASE , FoxBASE 之后又一流行的微机数据库管理系统。本章将概述
Fox Pro 数据库的特点、语言成分、界面风格和工作方式。 作为先 导 , 首先讲一 点数据库 的
一般知识。
1.1 数据库的基本概念
数据库技 术 是 在 60 年 代 末 期 兴 起 的 一 种 数 据 管 理 技 术。 数 据 库 在 英 语 中 称 为
Database。拆开来看 , Data 是数据 , Base 可 译为 基地。 所以 在 通俗 的意 义上 , 数据 库不 妨
理解为存储数据的基地或仓库。
・3・
表 1.1 数据库系统与一般文件应用系统性能对照表
序号 文 件 应 用 系 统 数 据 库 系 统
1 文件中的数据由特定的用户专用 库内数据由多个用户共享
原则上可消除重复。为方便查询允许 少
2 每个用户拥有自己的数据 , 导致数据重复存储
量数据重复存储 , 但冗余度可以控制
各文件的数据互相联系 , 从总体看是“有
4 各数据文件彼此独立 , 从整体看为“无结构”的
结构”的
图 1.2 网状模型数据库
图 1.1 层次模型数据库
二、第二代 : 关系型数据库系统
70 年代中期 , 商品化 的关 系型 数 据库 ( Relational Database System , 简称 RDBS ) 开 始
问世。80 年代后 , 许多 RDBS 在微型机 上实 现 , 现在 微 机上 使用 的数 据库 系 统几 乎都 是
RDBS。
RDBS 采用人们常用的二维表为基 本的 数据 结构 , 通过 公共 的关 键字 段 实现 不同 二
维表 ( 或“关系”) 之 间 的 数据 联 系。 二维 表 形 式 简 单 , 直 观 明 , 学习 与 使 用 均 甚方 便。
RDBS 允许一次访问整个关系 , 其 效率 远比 第一代 数据 库系统 ( 一次 仅能 访 问一 个记 录 )
为高 , 因而受到用户的普遍欢迎。
・4・
三、第三代 : 对象-关系数据库系统
随着多媒体应用的扩大 , 人们希望新一代数据库系统除存储传统的文本信息外 , 还能
存储和处理图形、声音等多媒体对象 , 于是第三代数据库便应运而生。将数据库技术与面
向对象技术相结合 , 自然地成为第三代数据库系统的发展方向。
80 年代中期以来 , 对新 一代 数据 库 系统 的研 究日 趋活 跃 , 并 出现 了包 括“对 象-关 系
型数据库系统”( 简称 ORDBS ) 和“面向 对象 型数据 库系 统”( 简 称 OODBS ) 在内的 多个 分
支。由于 ORDBS 是建立在关系型数 据 库技 术之 上的 , 可以 直接 利用 第二 代 数据 库系 统
的原有基础 , 所以发展迅速 , 正在形成第三代数据库系统的主流。少数厂商现已推出了可
供实用的 ORDBS 产品 , 显示了光明的发展前景。
数据库系统可按照以下几种方法来分类。
一、单用户数据库和多用户数据库
早期的微机数据库都是单用户系统 , 在 同一 时间只 能供 一人 使用。随 着网络 应用 的
扩大 , 供网络用户共享的多用户数据库开始流行 , 它们由多用户数据库管理系统管理和支
持。本书讨论的 FoxPro 2 .5 就 是 一种 多用 户 数据 库 管 理系 统。在 此 以 前 , 已 有 dBASE
+ +
Ⅲ , FoxBASE 等多用户数据库管理系统供微机用户使用。
多用户数据库的关键是保证“并行 存取”( Concurren t Access ) 的 正确 执行。例 如飞 机
订票系统通常是多用户系统 , 它允许乘客在 多个 售票点 预订 机票。当 两位 乘客从 不同 的
售票点同时向某个航班订票时 , 如果缺乏应有的措施 ( 参阅本书第十章 ) , 在数据库系统中
可能仅反映出一位乘客的订票 , 从而发生一票两订的错误。
二、集中式数据库和分布式数据库
集中和分布首先是对数据存储场地而言的 , 同时也反映了对数据库应用方式的差别。
例如 , 一个银行有多个储蓄所 , 每个储蓄所都有许多储户。如果将他们的数据全部存储在
一个集中式数据库中 , 任何储户存取款时都要访问这个数据库 , 网络通信量必然很大。但
若改用分布式数据库 , 把储户的数据分散存储在各自的开户储蓄所 , 则大多数情况下数据
可就近存取 ( 称为“ 局部应用”) , 仅当银 行转 帐 ( 例如 把储 户 A 的 一笔 款子 从 甲储 蓄所 转
到乙储蓄所储户 B 的帐上 ) 或统计全行储户的数 据时 , 才需要把 数据通 过网络 来传 送 ( 称
为“分布应用”或“全局应用”) , 通信量可大大 减小。分 布式 数据库 的目 标 , 是存取 数据 时
不要求用户指明数据的存储场地 , 换言之 , 应使用户像对集中式数据库访问时一样方便。
分布式数据库和多用户数据库都是在网络上使用的。但多用户数据库通常为集中式
数据库。例如上述的飞机订票系统 , 其票房数据一般是集中存放的 , 并不分散存储在各个
售票点上。
三、传统数据库和智能数据库
传统数据库存储的数据都代表已知的“ 事实”。智 能数 据库则 在存 储事实 外 , 也存 储
用于逻辑推理的“规则”。所以后者也称为“基于规则的数据库”( Rules Based Database) 。
例如 , 某智能数据库 存储 有“ 处长 领导 科长”的规 则。如 果它 同时 存有“甲 是 处长”、
“乙是科长”等数据 , 它就能推理出“ 甲领导乙”的新事实。
・5・
随着人工智能日益走向实用化 , 对智能数据库的研究日趋活跃。演 绎数据库 ( Deduc-
tive Database ) 、专家数据库 ( Expert Database ) , 都带有一 定的 智能。这 类数 据库的 关键 是
逻辑推理。如果推理模式出了问题 , 就可能出现荒诞的结果。
本书不讨论分布式数据库和智能数据库 , 有兴趣的读者请参阅其它书籍。
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
表 1.2 ××工厂设备登记表
试用 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 .
・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 中只需要一条命令。这也是关系数据语言受到用户欢迎的一个重要原因。
< 命令字 > < 操作对象 > < 操作结果 > < 操作条件 >
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
.IDX 只有一个索引标识符的单索引文件
3 索引文件 3.1.2
.CDX 具有若干个索引标识符的复合索引文件
用于保存通过 RQBE 窗 口设 置的 查 询条 件 和对 查 询输
4 查询文件 .Q PR 3 .4 .1
出的要求
.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 保存标签定义的备注文件
一、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 文件关联个数 不受限制
一、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 (存放用户文件的目录 , 用户建立)
三、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 组窗口
・ 15 ・
1.3.1 鼠标器 及其操作
・ 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.12 搜索对话框
(2 ) 在命令窗口键入以下命令
也可在屏幕上直接显示出指定主题的帮助信息。情况与 (1 ) 相似 , 不再细述。
(3 ) 再一种常见的情形 是 , 用户 在操 作中 遇 到了 需要 查询 的问 题。例 如 在与 SOR T
对话框交互时 , 用户对框中某些对象的用法 可能 不太了 解。此 时用户 可直 接将鼠 标指 针
移至对话框中 , 按下 F1 功能键查询帮助信息。由于 Fox Pro 的帮助系统具有“ 上下文敏感
性”( Context Sensitivity) , 系统在此时给 出的帮 助信 息将 与用 户的 当前 操作 直接 相 关 , 比
通过总目录逐级向下查找更为直截了当。
习 题
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 ・
第二章 数据库的基本操作
2 .1 建立数据库文件
数据库以文件的形式储存在磁盘中 , 这就是数据库文件 ( 下面简称为库文件 ) 。通常 ,
一个数据库 由 多 个 库 文 件 组 成。 若数 据 关 系 简 单 , 一 个 数 据 库 也 可 只 有 一 个 库 文 件。
Fox Pro 所管理的库文件都是形如表 2 .1 的二维表。
表 2 .1 设 备 清 单
编号 名称 启用日期 价格 部门 主要设备 备注 商标
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 中的数据组成一个库文件 , 参照上述规定 , 库文件的结构可设计如下 :
图 2 .3 表结构窗口
图 2 .4 Save As 窗口
2 .1 .2 库文件 数据的输 入
图 2 .8 插入对象对话框
2 .1 .3 库文件 内容的查 看
库文件建立后 , 常需要对文件进行查看内容、编辑修改等操作。为此必须先把库文件
打开 , 操作结束后又必须及时关上 , 以防止数据丢失。
一、在 Open 窗口中打开库文件
操作 :
在 File 中选择 Open , 再在 Open 窗口 ( 如图 2 .9 所示 ) 中选择待打开的文件 , 随后单击
Open 按钮。
说明 :
( 1) 选择待打开的文件有两种方法 , 其一是在 File Name 下面的文本框中直接键入文
件名 , 其二是在文件列表框中进行选择。
(2 ) 窗口左侧下方 List Files of Type 的下拉式 列表框可 以对文 件列表框 中显示的 文
件类型进行选择 , 系统默认扩展名为 DB F 的库文件。
・ 35 ・
图 2 .9 Open 窗口
图 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 中示出了两种不同方式显示库文件内容的两个窗口。
・ 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 的命令和命令子句、表达式、数组和函数等 , 然后对命令窗口的使用作简要 的
说明。
一、建立和查看库文件的 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
执行的结果没有变化。
(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 折
处理 :
( 注 : 函数 YEAR( ) 能从启动日期中求出公元年历值。详见 2 .2 .2 节 )
2 . 预设过滤器与字段表
在命令中使用可选项来实现选择显示只能在执行该命令时生效一次。本节所介绍的
过滤器与字段表一旦设置后 , 便能对有关库文件随后执行的任何操作命令都生效 , 从而为
数据处理带来更大的方便。
(1 ) 预设过滤器
命令格式 :
功能 :
用于预设过滤条件或过滤器。使命令只对 当前库 文件 中满足 条件 的记 录进行 操作 ,
似乎文件中只包含了满足条件的记录一样。
说明 :
① 命令中缺省可选项表示取消已设置的过滤条件。
② 对当前库文件只能设置一个过滤器 , 若连设两个 , 前一个过滤条件被自动取消。
例如 , 执行下列命令
USE sb
SE T F ILT ER TO 价格 > 10000
LIST
功能 :
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
SE T F IELDS TO
LIST FOR 价格 > 10000
图 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 种类 型 , 其中屏 幕型 可用于 储存 整幅 屏幕的 信息。
内存变量在使用之前必须先定义 , 即给它们赋以初值。
② 内存变量的赋值命令
命令格式 :
内存变量的取名规则与字段取名规则相同。
功能 :
计算表达式的值 , 并把该值赋给指定的一个或几个内存变量。
例如 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
R EL EASE [ < 内存变量表 > ] [ ALL [ L IKE| EXCEPT < 通配符 > ] ]
功能 :
清除当前内存中指定的内存变量。例如 ,
R EL EASE a , b
R EL EASE ALL
⑤ 内存变量的显示
命令格式 :
功能 :
显示当前已定义的内存变量名、值、类型及其 作用 范围 , 并 同时显 示当 前内存 变量 总
的个数、字节数等。可选项 [ TO P RIN T] 能把屏幕显示信息输出到打印机。例如 ,
y1 = 25 * 4
y2 = ″
abc″
y3 = .t .
LIST MEM ORY LI KE y ?
此时在屏幕主窗口中显示下列内容 :
SAVE TO f ALL LI KE y ?
・ 46 ・
R EL EASE y1 , y2 , y3
LIST MEM ORY LI KE y ?
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 . 表达式
表达式是由常量、变量、函数用运算符与圆括号连接起来的用于描述数据之间运算关
系的一种形式。特别地 , 单个常量、变量与函数都是表达式。
表达式的运算结果是一个值 , 其类型由表达式值的类型确定 , 可分成字符型、数值型、
逻辑型与日期型四种。例如 :
为能构成合法的表达式 , 需注意 :
(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)
功能 :
依次计算并显示各表达式的值。? 与 ?? 的 区别 在于 ? 在显示 表达 式内容 之前 , 先 发
送出一个回车换行符 ; 而 ? ? 则不发出回车换行符。
例如 , 键入下列命令 :
・ 49 ・
? 169 ,″efgh″, 68 * 3 .6
USE sb
?″名称∶″, 名称
则在 FoxP ro 的主窗口中将出现下面的输出结果
输出命令不但能把常量以原样显示出来 , 还能显示内存变量、当前记录字段变量和表
达式的值。
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 个 参 数 则 一直 截 取 到 最 后一 位。 例
如:
输出结果应是陈 , 小英与小。
(2 ) 字符串查找函数
命令格式 :
功能 :
当 < 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″
功能 :
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 )
输出值将依次为
(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 的命令 窗口
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 便结束修改。
二、用命令方式进行修改
命令格式 :
功能 :
屏幕上出现表结构窗口 , 修改方法同上。
2 .3 .2 记录的 插入、删除与添 加
功能 :
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 .
USE sb
・ 55 ・
SE T F ILT ER TO 价格 < 10000
GO TOP
? RECNO( ) & & 4
GO 2
? RECNO( ) && 2
2 . 记录的插入
命令格式 :
功能 :
用于在库文件的指定位置上插入一个新记录。
说明 :
(1 ) 新记录的插入 位置 与可 选 项 BEFORE 有关。 I NSER T BEFORE 将 新记 录插 在
当前记录之前 , 而 INSERT 则将新记录插在当前记录之后。
(2 ) 命令中有 BLANK 选项 , 将在指定位置插入一个空记录。如果缺省 BLANK 则在
屏幕上出现 Change 窗口 , 以单记录方式等待用户输入新记录。插入后的存盘处理方法同
前。
(3 ) 选单中的 Append 只能在当前 库文 件的末 尾添 加新 记录。至 于在 指定位 置上 插
入记录的功能 , 并没有相应的选单操作。
(4 ) 插入新记录后 , 库文件原有 的记 录都 会相应 地移 动位置 , 需 要花 费一 定的 时间 ,
若非必要 , 还是使用 Append 来添加记录为好。
二、记录的删除与恢复
随着库文件中记录的不断更新 , 必然会 出现 一些无 用的 记录。为 要删 除库文 件的 记
录 , 一般需经过两个步骤 : 第一步是在待删除记录 上加 一个 删除标 记“ * ”; 第二步 是将 带
有删除标记的记录从库文件中抹去。如果需要 , 作了删除标记的记录还允许恢复。
1 . 记录删除的有关命令
(1 ) 加上删除标记
命令格式 :
功能 :
对当前库文件中指定范围内满足一定条件的 记录加 上删 除标记“ * ”, 若所有 可选 项
缺省 , 则仅将当前记录加上删除标记。
(2 ) 取消删除标记
命令格式 :
功能 :
取消当前库文件中指定记录上的删除标 记。若所 有可 选项缺 省 , 仅将 当前记 录取 消
・ 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 ) , 这种格式是
把库文件中的数据按系统的储存格式进行组织。若把一个合适的文本文件中全部数据添
加到当前库文件中来 , 只须使用命令
便可。
在上面删除记录的操作练习中已把 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 记录数 据的替换
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
② 可从一个记录的若干字段值得到同一记录的某一字段值。例如 ,
③ 在库文件中添加一个新记录
AP PEND BLANK
R EPLACE 姓名 WI TH ″陈丽红″, 基本工资 WI TH 360 , 岗贴 wit h 400 , 奖金 WI TH ;
250 , 职称 W I TH ″工程师″
功能 :
将当 前库 文件 当前记 录的 数据按 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 命令。
操作练习 :
・ 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 命令除能以数组为中介对库文件的记录进行添加与修改外 ,
还能通过一组内存变量来达到相同的目的。命令的形式如下所示 :
USE sb1
GO 5
SCAT T ER MEMVER
? m .编号 , m .名称 , m .价格
2 .4 复制数据库文件
一、同时复制结构与记录数据
命令格式 :
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 库文件 的结构文 件
功能 :
把当前库文件的结构参数作为记录复制到新生成的结构文件中去。
说明 :
(1 ) 结构文件的结构具固定模式 , 它包括 4 个字段 , 各字段的有关参数如下所示 :
字段名 类型 宽度 小数位数
FIELD - NAME C 10
FIELD - TY PE C 1
FIELD - LEN N 3 0
FIELD - DEC N 3 0
USE sb
COP Y TO jg ST RU EXTENDED & & 生成 sb 的结构文件 jg
USE jg
LIST ST RU & & 请注意观察由系统自动生成的 jg .dbf 的文件结构
LIST & & 源文件 sb 各字段的有关参数已依次成为 jg 的记录数据
二、由结构文件生成新库文件的结构
命令格式 :
功能 :
把结构文件的记录翻制成一个新库文件的结构 , 并同时打开新库文件。
说明 :
(1 ) 翻制所得的库 文件 只有 结构 而无 数 据。为能 实 现以 命 令方 式 来修 改 库文 件 sb
的结构又不丢失其原有数据需先把 sb 的数据单独复制成文本文件保存 起来 , 待修改结 束
后再把文本文件的数据添加进去。操作步骤如下所示 :
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 磁盘文件操作
2 .5 .1 文件维 护窗口
图 2 .17 文件维护窗口
图 2 .18 磁盘树型目录结构
功能 :
・ 67 ・
打开文件维护窗口。
说明 :
(1 ) 可选项 LI KE 可限定在文件维护窗口中只列示某些特定类型的文件 , 例如
2 .5 .2 磁盘文 件操作命 令
命令格式 功能
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 ・
第三章 查询与统计
3 .1 排序与索引
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 使用。
由于非结构复合索引文件不常使用 , 以下仅讨论结构复合索引文件和单索引文件。
二、索引的建立
命令格式 :
功能 : 建立索引文件或增加索引标识。
说明 :
(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
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 ) 库文件关闭时索引文件就随之关闭。
命令格式 :
功能 : 打开当前库文件的一个或多个索引文件并确定控制索引文件。
说明 :
(1 ) < 索引文件表 > 可包含多个索引文件 , 索引文件名之间以逗号 分隔 , 表中第一 个
索引文件为控制索引文件。该命令常用于打开单索引文件 , 例如 :
USE sb
SE T INDEX TO jgidx , mcidx & & 打开 JGIDX .IDX 和 MCIDX .IDX , JGIDX .IDX 为控制索引 ;
文件
LIST & & 记录按价格降序排列
说明 :
(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 ) 删除索引标识
命令格式 :
功能 : 删除打开的结构复合索引文件的索引标识。
说明 : ALL 子句用于删除结构复合索引文件的所有索引标识。如果某索引文件的所
有索引标识都被删除 , 则该索引文件也就被删除了。
例如删除例 3-3 建立的结构复合索引文件中的索引标识 BMJG1 :
USE sb
DELE TE TAG bmjg1
四、索引的更新
1 . 自动更新
当库文件中的数据发生变化时 ( 例如对它 进行 插入、删 除、添加或 更新 操作之 后 ) , 所
有当时打开的索引文件都会随数据的改变自动 改变记 录的 逻辑顺 序 , 实现 索引文 件的 自
动更新。例如 :
USE sb
SE T ORDER TO TAG jg & & 指定索引标识 JG 为控制索引
BROWSE & & 记录按价格降序排列
3 .2 查 询 命 令
所谓查询 , 即按照某些条件在数据库中查找所需的记录。本节将介绍 Fox Pro 支持 的
两种传统的查询方法 : 顺序 查询 和索 引 查询。 与 FoxBASE + 不同 的 是 , Fox Pro 还 支持 在
Fox Pro 环境中直接使用 SQL 型的查询命令———SQL SE LECT 命令。 本章将 在第 3 .4 .4
节介绍这一命令。
3 .2 .1 顺序查 询命令
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 命令。
命令格式 :
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 .
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
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 的结构与内容 :
zz .dbf 的结构与内容 :
功能 : 选定某个工作区 , 用于打开一个数据库文件。
说明 :
( 1) 用 SEL ECT 命令选定的工作区称为当前工作区 , Fox Pro 默认 1 号工作区为当前
工作区。函数 SE LECT( ) 可以返回当前工作区的区号。
引用非当前工作区库文件的字段须冠以别名 , 引用格式为 : 别名 .字段名。例如 :
3 .3 .2 VIEW 窗 口的面板
图 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 所示。
二、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 . 命令方式
命令格式 :
功能 : 为 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 .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 ) 显示结果 : 往命令窗口输入如下命令 :
命令执行结果见图 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 ) 显示结果 : 往命令窗口输入如下命令 :
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 & & 指定部门字段 ; 对子文件设置多一关
系
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 ・
命令格式 :
功 能 : 用 在 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 窗 口
3 .4 .1 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-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 窗口
图 3 .18 分组对话框
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 图形输出选择对话框
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 ) 该命令也能输出位图 文件存 储的 图形 , 但 < 位图 文件 名 > 要 用引 号括 起来。 例
如:
3 .4 .4 SQL SELECT 命令
说明 :
(1 ) SEL ECT 子句 : ALL 表示选出的记录 中包括 重复 记录 , 这是 默认 值 ; DISTINCT
则表示选出的记录中不包括重复记录。
[ < 别名 > .] < SE LECT 表 达式 > [ AS < 列 名 > ] : < SEL ECT 表达式 > 可 以是 字
段名 , 也可以包含用户自定义函数和如表 3 .2 所 示的系 统函 数。 < 别 名 > 是字段 的库 文
件名 , < 列名 > 表示输出时使用的标题名。
函 数 功 能
AVG( < SELEC T 表达式 > ) 求 < SELEC T 表达式 > 值的平均值
MIN ( < SELECT 表达式 > ) 求 < SELEC T 表达式 > 值中的最小值
MAX( < SELECT 表达式 > ) 求 < SELEC T 表达式 > 值中的最大值
当 SE LECT 表达式中包含上述函数时它不再按记录输出。例如 :
・ 1 00 ・
SELEC T 编号 , 价格 * 0 .17 AS 增值税 FROM sb & & BROWSE 窗口按记录显示多行
SELEC T AVG( 价格 ) * 0 .17 AS 增值税均值 FROM sb & & BROWSE 窗口除标 题外只 显示一 个
数据
表 3 .3 目 标 选 项
目 标 输 出 形 式
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 < 数组 > ]
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 < 数组 > ]
3 .5 .4 计算命 令
CALCULAT E < 表达式表 > [ < 范围 > ] [ F OR < 条件 1 > ] [ WHILE < 条件 2 > ]
[ TO < 内存变量表 > | ARRAY < 数组 > ]
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 > ]
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
・ 1 06 ・
中 篇
程序 设 计
第四章 程序设计初步
4 .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 节将对此展开进一步的讨论。
二、程序文件的建立与修改
命令格式 :
功能 :
调用 FoxP ro 提供的编辑器来建立或修改指定的程序文件。
说明 :
(1 ) 可选项 [ < 文件名 > | ?] 用于设定要编辑的文件名。在文件 名中允许 使用通配 符
* 与 ?, 此时 , 屏幕上将开出几个窗口同时编辑与之匹配的各个文件。若使用“ ?”号而不写
文件名 , 系统将打开一个对话框 , 用户可从框中列示的文件名中选择当前编辑的文件。如
果命令中缺省 文 件 名 , 则 系 统自 动 取 名 为 U NT ITL ED .P RG; 如 果 扩 展 名 缺 省 , 则 命 令
MODIFY COM MAND 默 认 为 P RG , 而 命 令 MODIFY FILE 却 默 认 为 空。 可 见 使 用
MODIFY F IL E 建立程序文件时 , 扩展名 P RG 必须写上。
( 2 ) 在 文件名 前可指明 路径 , 若未指 明则默 认为当前 驱动器 的当前目 录。如执行 命
令
表 4 .1 程序编辑中常用的控制操作
控 制 操 作 功 能
↑ 光标上移一行
↓ 光标下移一行
← 光标左移一个字符
→ 光标右移一个字符
PgUp 上移一幅屏幕
PgDn 下移一幅屏幕
Ins 插入或覆盖方式转换开关
Del 删除光标所在位置的字符
Ct rl-W 编辑结果存盘并返回命令窗口
Ct rl-Q 或 Esc 编辑结果不存盘而返回命令窗口
调用并执行指定的程序文件。
说明 :
Fox Pro 允许使用带参数的程序文件。在编写带参数的程序文件时 , 必须把命令
DO e4-1 W IT H 5
而执行下述命令后便可求出矩形面积
p= 3
DO e4-1′WI TH p , 2 * p
* 本程序用于修改库文件的指定记录
SE T DAT E MDY & & 日期格式置为 mm/ dd/ yy
4 .1 .2 状态设 置命令
SE T PRINT on/ OF F
表 4 .2 色彩代码表
黑色 空白 蓝色 棕色 深蓝 绿色 品红 红色 白色 黄色
N X B GR BG G RB R W GR +
SE T COLOR TO GR +/ B , W/ B , GR
图 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
二、键盘输入命令
命令格式 :
功能 :
在 屏幕 上显示 提示 信息 , 等 待用户 从键 盘输入 , 再 把输 入内 容赋值 给指 定的 内存 变
量。
说明 :
(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
?″
a = 8000 b = jg + 200
m = ″微型机″
IN PU T ″输入″+ m + ″价格″TO p
命令执行时 , 屏幕的提示信息为 :
输入微型机价格
功能 :
把字符型内存变量的值替换出来 , 就是以字符型内存变量的值作为函数值。
说明 :
(1 ) 在符号“ &”与字符型内存变量名之间不可有空格。
(2 ) 宏代换函数能作为字符串的一部分出现 , 此时应以“ .”来标 记该字符 型内存变 量
名的结束 , 避免与后续的字符混淆。例如 ,
・ 1 16 ・
a = ″qr″
?″&a .st″
执行后的输出值为 qrst。
(3 ) 宏代换可以嵌套 , 执行 时由外 向内 逐层进 行 , 直至 将最内 层 & 后的 变量 代换 出
来为止。例如 ,
p1 = ″abc″
q = ″1″
r = ″p & q″
? &r
执行后的输出值为 abc。
在数据处理中 , 宏代换 函数 有着 广 泛的 应用。 对于 程序 中 重 复出 现 的字 符 串、表 达
式、命令等均可使用宏代换函数 , 以减少重复书写并避免命令超长。例如 ,
USE sb
改用下面两条命令代替 :
ACCEPT ″输入库文件名∶″TO s & & 库文件名在执行程序时才从键盘输入
USE &s & & 打开任意指定的库文件
< 行 ,列 >
[ 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 子句中表达式的值以及 GE T 子句中变量的值。GE T
子句必须与 READ 命令配合工作 , 即用 READ 命令来激活当前的所有 GE T 变量。READ
命令的一般格式为 :
说明 :
(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 变量的初值示例。
・ 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 变量激活示例。
表 4 .3 格 式 符
A 只允许字母
L 只允许逻辑型数据
N 允许字母和数字
X 允许任何字符
Y 只允许逻辑值 Y, y , N , n , 并把小写转成大写
9 对于字符型数据只允许代表数字 ; 对数值型数据允许代表数字或数符
# 只允许数字、空格与数符
! 把小写字母转换为大写 , 对其它字符无影响
$ 按 SE T CU RR ENCY 命令所定义的位置来显示货币符号$
* 在数值型数据的前置 0 位置上显示 *
・ 指定小数点位置
, 分隔小数点左边的数字 , 只有在该符号的左边有数据时 , 它才会显示出来
表 4 .4 功 能 符
A 只允许字母、字符
B 数值型数据左对齐
C 正数后显示贷方标记 CR
D 使用 SE T DAT E 设置的日期格式
E 日期型数据按欧洲形式 (DD/ M M/ YY) 显示
I 使输出值位于输出字段的中间
J 使输出值在输出字段中向右对齐
K 当光标移至 GET 变量时 , 便选取 整个字 段进 行编 辑 ; 若 用户 新输 入了 数据 , 先 前的内
容将自动被清除
L 数值数据前面的空格用 0 补满
・ 1 20 ・
$ 按 SE T CU RR ENCY 命令所定义的位置来显示货币符号$
[ 例 4-5] 数据格式编辑示例。
程序执行后显示结果如下所示 :
ABC
m = abc
* 86 .5 86
其中的方框表示变量 n 呈增强显示。
说明 :
(1 ) P ICT URE 子句中若有功能符 , 则必须把它们集中起来写在最前面并以 @ 作为 功
能符部分的前缀 , 还须以一个空格与格式符部分隔 开 ; 而 在 FU NCTION 子句 中只能使 用
功能符 , 无须再冠以 @ 了。它们的一般形式如下 :
@ 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
b1 = t - 01
b2 = t01
它们的一般形式是 :
如果用户输入的密码不是″
abc″便不能输入编号。
4 . 指定显示区域
格式输入输出命令还能通过子句
USE sb
GO 5
@12 , 14 SAY 商标 SIZE 6 , 8
・ 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
4 .1 .4 运行控 制命令
功能 :
暂停程序的执行、显示提示信息等待用户按键。
说明 :
・ 1 24 ・
(1 ) 用户可通过可选项 [ < 提示 信息 > ] 指定 提示 内容 , 否 则将显 示系 统设定 的提 示
信息 :
“按任意键继续……”。
(2 ) 可选项 [ TO < 内存 变量 > ] 用于 指定 一个内 存变 量来存 放操 作过 程 中用 户所 键
入的首字符 , 并自动定义该变量为字符型。如果用户按下的是回车键、非打印字符或组合
键 , 则把空字符存于该变量中。若命令中缺省此可选项 , 用户的按键将自动流失而不再保
存。
(3 ) 可选项 [ WI NDOW ] 能在 Fox Pro 主窗口的 右上角上 开出一 个提示信 息的显示 窗
口 , 避免提示信息对屏幕画 面产生 干扰。 若在其 中再 加入 可选项 NOWA IT , 则命 令执 行
时仅在指定地点显示提示信息而不会暂停程序的执行。提示信息的显示窗口也将在移动
鼠标或按下任意键后自动消失。
(4 ) 可选项 [ TIM EOU T < 数值 表达式 > ] 必 须排列 在 WAIT 命令 的最 后 , 用 于指 定
程序暂停的时间 , 单位为秒。如果在指定时间内用户仍未按键 , 则程序继续执行。
[ 例 4-8] WAIT 命令示例。
二、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″)
CANCEL
Q UI T
功能 :
CANCE L 用于终止 FoxP ro 程序 的运行 , 并清除局部于该 程序的内存变量 , 返回到 命
令窗口。 QU IT 命令则在终止程 序运 行后 , 退 出 FoxP ro 系统 返回 到 Windows , 其 功能 与
在 File 选单中选择 Exit 相同。使用 Q U IT 命令以后再关机 , 既不会丢失数据 或破坏打 开
的文件 , 同时还可将磁盘中的临时文件删掉 , 是一种常用的终止 FoxP ro 系统运行的方法。
4 .2 程序的控制结构
4 .2 .1 顺序结 构
选择结构能根据指定条件的当前值在两条或多条程序路径中选择一条执行。因此在
一个程序中便能处理多种情况的复杂问题。Fox Pro 提供三种格式的选择结构。
一、单边选择
命令格式 :
IF < 条件 >
< 命令序列 >
ENDIF
功能 :
条件取值为“真”, 执行命令序列 ; 条件取值为“假”, 命令序列就不执行。
二、双边选择
命令格式 :
IF < 条件 >
< 命令序列 1 >
ELSE
< 命令序列 2 >
ENDIF
功能 :
根据条件的取值在 < 命令序列 1 > 与 < 命令序列 2 > 这两条路径中选择一条执行。
图 4 .2 单边选择的执行流程 图 4 .3 双边选择的执行流程
[ 例 4-9] 单边选择结构示例。
・ 1 27 ・
ENDIF
三、多边选择
命令格式 :
DO CASE
CASE < 条件 1 >
< 命令序列 1 >
CASE < 条件 2 >
< 命令序列 2 >
…
CASE < 条件 n >
< 命令序列 n >
[ OTHER WISE
< 命令序列 Q > ]
图 4 .4 多边选择的执行流程
ENDCASE
功能 :
依次判断命令中列出的条件 , 只要找到某一条件取值为“ 真”, 就执行与之相关的命令
序列 , 余下的条件便不 再判 断 , 有 关的 命令 当 然亦 不执 行。在 没有 一个 条件 取 值为“ 真”
时 , 若有可选项 , 就执行命令序列 Q , 否则什么也不做。可见在众多的命令序列中 , 多边选
择最多只选择执行其中的一个命令序列 , 也可能一个也不执行。
[ 例 4-11] 多边选择结构示例。
・ 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 循环结 构
功能 :
判断条件的取值 , 若为“ 真”就执行 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 次便可。
二、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 循 环比 用 当循 环 更
为方便。省得用户再自行设置计数器。下面列出的命令序列可说明这一点。
i=i+1
ENDDO
三、库文件扫描循环
命令格式 :
功能 :
对当前库文件的指定记录 , 依次重复执行循环体。
在数 据 库 应 用 程 序 中 , 经 常 要 对 库 文 件 的 指 定 记 录 逐 个 进 行 某 种 处 理 , 以 往 在
FoxBASE 中只能通过当循环来描述 , 现 在使 用 FoxPro 提供 的库 文件 扫描 循 环将 更为 方
便。下面列出它们之间的比较 :
用当循环描述 用库文件扫描循环描述
GO TOP SCAN
・ 1 33 ・
DO WHI LE ! EO F( ) 处理一个记录
处理一个记录
SKI P ENDSCAN
ENDDO
程序运行后结果如下 :
价格 50000 元以上的设备有 : 3 台
价格 1000050000 元的设备有 : 2 台
价格 10000 元以下的设备有 : 2 台
・ 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
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 子程序 、函 数与过程
功能 :
返回到调用该子程序的上级程序。加可选项 [ T O MAST ER] 后 , 则不论前面有多少
级调用 , 都直接返回主程序。可选项 [ TO < 程序文件 名 > ] 可 强制性 地返 回到指 定的 程
・ 1 37 ・
序文件 ; 而 RE T URN < 表达式 > 则表示将指定的表达式值返回给调用程序。
说明 :
(1 ) 本命令通常出现在子程序的末尾 , 但也可出现在程序中间 , 作用是一样的。
(2 ) 返回的具体位置是 : 上级程序中调用该子程序命令的下一条命令处。
(3 ) 若调用子程序命令从命令窗口中发出 , 则执行后仍返回到命 令窗口。可 见 , 如 果
在前面已编制程序的末尾均添加本命令 , 其执行效果不变。
(4 ) 子程序可以嵌套调用。图 4 .7 示出了子程序嵌套调用的示意图。
图 4 .7 子程序嵌套调用示意图
二、自定义函数
Fox Pro 可提供 280 多个函数 , 但还不可能概括用户的 各种需 求。为能满 足某种特 殊
需要 , FoxPro 允许用户按一定的规则 自行 定义 一个 专 用的 函数 , 这 就 是自 定义 函数。 如
是 , 用户就能像调用系统函数那样调用自定义函数 , 带来了很大的方便。
自定义函数与子程序的主要区别仅在于自 定义函 数必 须返回 一个 函数 值 , 而 子程 序
却无此限制。所以自定义函数的建立与修改方法 与程 序文 件编辑 的方 法相同 , 只 是在 最
后一条的返回命令中必须指出函数的返回值 , 而且要把程序文件名改称为函数名。
命令格式 :
说明 :
(1 ) 自定义函数能以一个 独立的 文件 储存 , 也可 包含 在调 用程序 中作 为它的 一部 分
出现。命令中的可选项 [ FU NCTION < 函数名 > ] 若缺省 , 则表明 该自定义 函数是一 个
独立 的文 件 , 仍用 MODIFY COMMAND 命令建 立并 储存 , 此 可选项 标志 自定义 函数 的
开始 , 通常用作定义该函数的语句。
(2 ) 自定义函数名不能与 FoxPro 的系统函数同名 , 也不能与内存变量同名。它最 多
由 10 个字符组成 , 字符可以是字母、数字或下划线 , 但必须以字母或下划线开头。
(3 ) 自定义函数与系统函数的调用方法相同。其形式为 :
由于自定义函数返回的是一个表达式值 , 所以调用符号只能作为表达式的一项出现。
(4 ) FoxPro 允许一个自定义函数的 最后一 条命 令不是 RE T URN < 表 达式 > , 或 者
・ 1 38 ・
虽是 RE T URN , 但其后没有说明返回值 , 此时 FoxPro 在遇到下一个 F UNCTION 语句 ,
或是该程序文件的结束语句时 , 函数会自动执行隐含返回。
[ 例 4-18] 把计算圆面积的程序改写为自定义函数。
[ 例 4-19] 自定义函数的调用示例。
4 .3 .3 全程量 与局部量
功能 :
把指定的变量全部设置为全程量 , 并把这些变量的初值均赋以 .F .。
在 2 .2 .2 节中提到过的 RE LEASE 命令与 CL EAR AL L 命令都可用来清除全程量。
二、局部量
在一个程序内部定义且未被指明为全程量的变量称为局部量。局部量只在定义它的
局部范围中有效 , 该程序执行结束后 , 有关的变量也被自动清除。
对于局部量的使用还须明确 :
1 . 上级程序定义的局部量要到上级程序执行结束后才失效 , 所 以在被调 用的下级 程
序中仍然有效 , 反之不然。
2 . 局部量可以与全程量或上级的局部量同名 , 但需用下面的命令屏蔽。
・ 1 40 ・
命令格式 :
PRI VAT E [ < 内存变量表 > ] [ ALL [ LIKE | EXCEPT < 通配符 > ] ]
功能 :
把指定变量的作用范围限制在所属的程序、过程或自定义函数之中 , 此时在较高层中
的同名变量被隐藏并使其值保持不变 , 直到 所属的 程序、过 程或自 定义 函数 执行结 束后 ,
再恢复先前被隐藏起来的同名变量 , 以供继续使用。
[ 例 4-21] 设已有下列子程序 :
在命令窗口中按顺序键入下列操作命令 :
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 )
4 .4 积木式程序的编制
4 .4 .1 程序中 的功能模 块
・ 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 . 修改记录模块
・ 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. 删除记录模块
・ 1 44 ・
在处理类似删除等带有某种破坏性的工作时 , 往往给用户一个认定的机会 , 就是先把
待删除的记录列出 , 再要求用户表态。
4 . 查询模块
说明 :
(1 ) 每执行本程序时 , 都要按指 定的 关键 字建立 相应 的索引 文件 , 为 避免反 复地“ 声
明”, 程序中对系统提供的保护状态设置为“关闭”。
(2 ) 若 查询 成功 则 函数 FOU ND ( ) 取 值为 .t ., 由 于 经索 引后 相同 关键 字 均排 在 一
起 , 所以使用命令
以后 , 便能把有关的记录全部找出。
(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
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 .4 .2 带选单 的控制模 块
主 选 单
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 命令后 , 则功
能项提示信息的位置将能通过下述命令设定。
命令格式 :
功能 :
提示行的位置由数值表 达式 的 值设 定 , 若该 值 为 0 , 则 提示 信 息 不显 示。而 LEF T、
CEN T ER 和 RIGH T 参数则决定这些提示信息靠左、居中或靠右显示。
(2 ) 光带选单的激活 : 可使用 M EN U TO 命令。
命令格式 :
功能 :
激活光带选单 , 就是能使用光标移动键与回车键在该选单上进行功能选择。
・ 1 49 ・
说明 :
① 若命令中的内存变量是一个已定义的数值型变量 , 且其值介 于 1 与功 能项的总 数
之间 , 则光 带的 初始 位置是 以该 值为序 号的 功能 项 ( 各功 能项 在选单 中的 序号按 先行 后
列 , 同一列上先左后右确定。如返回功能的序号为 5 ) 。否则光带停在第一个功能项上。
② 对于光带选单的功能选择除了移动光带到所需功能项上并按回 车键外 , 还可通 过
直接键入该功能的相应“热键”来实现。
③ 功能选择完成后 , 系统自动把该功能项在选单中的序号存入 M EN U T O 命令中的
内存变量。可见 , 该变量有两个作用 : 一是决定光 带在 选单 中的初 始位 置 , 二是储 存用 户
选择功能项的返回值。若用户在选单激活后未作选择就直接退出 , 则返回值为 0。
[ 例 4-23] 光带式选单示例。
执行下述命令后 , 可激活上述的光带式选单 :
k= 4
MEN U to k
激活后的屏幕形式如下 所示 , 其中 的 方框 表 示光 带 所 在的 位 置 ( 因为 k 的 初 始值 为 4 ) 。
在屏幕第 10 行上同步显示相应的提示信息。
1 . 修改 2 . 删除
3 . 添加 4 . 查询
0 .返回
按记录的关键字值索引查询
功能 :
实现对指定功能模块的调用。例如 , 上节 列出的 选单 中有 5 个 功能 , 它们 是修 改、删
除、添加、查询与返回 , 相应的功能模块名依次是 xg .prg , sc .prg , tj .prg 与 sycx .prg。为 实
现对这些功能的调用 , 就需要组织含选择结构的程序。
1 . 用 DO CASE 命令来控制调用
[ 例 4-24] 用 CASE 命令对由 e4-22 .prg 所示的传统式选单实现功能调用。
例如 , 以字母 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
(2 ) 退出循环的两种方法
退出循环结构有多种处理方法 , 这里提供两种常用方法。并以光带式选单为例说明 :
① 设置永真循环。循环条件的取值恒为 .T ., 只有在 选单 中选择 返回 功能 ( k = 5 ) 后
才执行 EXIT 命令 , 使其跳出循环而转入结束处理。
DO WHI LE .T .
选单显示
MENU TO k
IF k = 5
EXI T
ENDIF
功能模块调用
ENDDO
② 在循环中使用识别器。当内存 变量 k 取值 为 5 时 , 表示 选择退 出 , 所以 可把 k 当
作一个识别器 , 只要其不等于 5 便继续循环过程。
三、控制模块的设计
1 . 控制模块的一般结构
带选单的控制模块通常由五个部分 组成。 它们 是初始 化部 分、选单 显示、选单 选择、
功能模块调用以及结束部分。其结构形式如图 4 .8 所示。
图 4 .8 控制模块的一般结构
2 . 初始化部分
控制模块的初始化工作大致包括三个方面 :
(1 ) 对应用程序的有关说 明 , 例如 , 程序 名称、研 制单位 与研 制日 期等。 也就 是亮 出
应用程序的广告。例如 :
M ODIF Y COMMAND gg
T EXT
欢 迎 使 用
× × 工 厂 设 备 管 理 系 统
ENDT EXT
y = IN KEY( 1)
R ETUR N
为能取得更好的视觉效果 , 还可设计活动字幕式广告。请看下面的例子 :
・ 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
下面就上述各项工作组织一个专用的初始化模块 :
3 . 结束部分
在结束部分中也可安排三方面的工作 , 它们是 : 关 闭所 有打开 的文 件 , 恢复执 行前 的
系统状态 , 以及显示系统的结束语。如 “
, 再 见”、
“ 欢 迎再使 用”等。下 面列 出结束 退出 的
专用模块 :
・ 1 54 ・
MODIF Y COMMA ND jstc
* * 结束退出 * *
CLEAR
CLEAR ALL
TEXT
再 见 !!
欢迎您下次再使用
ENDTEXT
SE T TALK ON
RE TURN
[ 例 4-26] 传统式选单控制模块示例。
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 命令分 隔在两 个控制结 构之中 ,
否则运行时将产生语法错误。
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
・ 1 59 ・
s = ALLT RIM( s)
IF NOT FILE (″&s . .dbf″)
?″
无此库文件″
s = I NKEY (1 .5)
CANCEL
ELSE
U SE & s
ENDIF
RE TURN
再 见 !!
欢迎您下次再使用
ENDTEXT
SE T TALK ON
CANCEL
・ 1 60 ・
* * 宏代换实现功能调用 * *
IF k > = 1 AND k < 5
IF k = 2
DO l2 & & 口令检查
ENDIF
t = STR ( k , 1 )
DO m & t
ENDIF
RE TURN
下面写出用积木式方法装配后的数据库应用程序。
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 调试窗 口与跟踪 窗口
图 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] 调用窗口与跟踪窗口的使用示例。
及
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 窗口定 义与修改
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 。
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 日′ & & 数据输出到活动窗口
* 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 > 表示所用 字
体的大小 , 以点数来计算字体的大小。例如 :
表 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 ・
例如命令
表示了窗口最小化后的图标呈地球形 , 窗口背景由轿车组成。
读者不必为寻找图形 文件 烦心 , 只 要 利用 Windows 文 件管 理器 的 File 选 单搜 索 功
能 , 按所需的扩展名来搜索 , 很快就能看到许多图形文件名及其路径。
(8 ) 颜色
COLOR SCHE ME 子句和 COLOR 子句分别用来指定颜色模式及其颜色 , 详见 第 5 .
2 节。
二、窗口修改命令
命令格式 :
5 .1 .2 窗口管 理
三、窗口显示命令
命令格式 :
DEACT IVAT E WI NDOW < 窗口名 1 > [ , < 窗口名 2 > . . .] | ALL
* 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 & & 程序执行结束时激活命令窗口
表 5 .2 输出窗口和可见窗口管理
定义窗口 Y N N
激活窗口 保持 Y Y
隐藏窗口 保持 可能 Y N
显示窗口 保持 可能 Y Y
挂起窗口 保持 N N
关闭窗口 N N N
5 .1 .3 建立窗 口的控制 对象
@ < 行坐标 , 列坐标 > 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 < 颜色对表 > ]
* e5-4 .prg
USE sb
GO 4
@2 , 2 EDI T 备注 SIZE 5 , 30 SCROLL MESSAGE ′
第′+ ST R( R ECNO ( ) , 1) + ′个记录′
R EAD
・ 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 > ]
5 .2 窗 口 着 色
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 颜色对作用对象
8 阴影 阴影
* 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 ) 的颜色 , 其命令格式也可记为 :
该命令所设定颜色的作用范围是随后出现的各种显示命令 , 请看下例。
[ 例 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
5 .3 BROWSE 窗的设计
打开库文件后发一条 BROWSE 命令 , 就可打开一个标准 的 BROWSE 窗口 , 从而 对
・ 1 81 ・
数据进 行 浏览 与编 辑。但 是在 开发 应 用程 序时 , 用户 可能 希望 由自 己 来设 计 BROWSE
窗 , 使 之更 加 符 合需 要。本 节 将向 读 者 介绍 使 用 BROWSE 命令 定 义 BROW SE 窗 的 方
法。功能键是一种方便的操作工具 , 自定义 的 BROW SE 窗 配上自 定义 的功 能键 , 可以 相
得益彰。本节提供了几个实用的例子 , 可供读者参考。
5 .3 .1 定义 BROWSE 窗
功能 : 浏览或编辑数据库文件。
说明 :
(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
5 .3 .2 定义功 能键
功能 : 设置功能键及其功能 , 包括为鼠标按键设置功能。
说明 :
(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 窗口
* 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
习 题
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 ・
第六章 屏幕生成器
6 .1 屏幕生成的基本概念
6 .1 .1 屏幕生 成器的组 成
图 6 .1 屏幕生成器
・ 1 88 ・
用户设计屏幕画面。窗口左侧为屏幕工具箱 , 用 于定义 构成 屏幕 画面的 各种 对象。与 此
同时 , 在窗口上方的 Fox Pro 系统选单中将自动增 加 Object 和 Screen 两 个选单项 , 它们 各
包含一个下拉子选单 , 可供用户定义屏幕设计中的各种细节。根据上面的描述 , 不妨用图
6 .2 来表示屏幕生成器的组成。
屏幕设计窗口 ( 包含屏幕工具箱 )
屏幕构造器 Objed t 选单
屏幕生成器 Screen 选单
程序生成器
图 6 .2 屏幕生成器的组成
6 .1 .2 屏幕生 成的基本 步骤
6 .1 .3 快速屏 幕生成
图 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 生成屏幕程序对话框
6 .2 屏幕工具箱
图 6 .6 屏幕工具箱
在屏幕设计中 , 用户不 仅可 在屏 幕设 计窗 口 建立 新对 象 , 还可 对 已 建的 对 象进 行 移
动、删除、改变大小和属性等操作。
一、建立新对象的操作方法
在屏幕设计窗口建立一个新对象 , 一般要经历三步操作 :
(1 ) 选择定义工具 : 单击工具箱中某一工具 , 其颜色将由深变浅 , 表示已经选中。
(2 ) 确定对象位置 : 将鼠标 指针 移 至屏 幕设 计窗 口中 准 备建 立新 对象 的位 置 , 然 后
单击该处 , 系统会弹出相应的对话框 , 供用户定义对象的属性。
・ 1 93 ・
(3 ) 定义对象属性 : 在对话框中定义对象的属性 , 完成后单击对话框的 OK 按钮 , 新
建的对象即在窗口出现。
注意 : 如果建立文本或线框等对象 , 选定相应定义工具后便可直接 到窗口内 操作 ; 要
结束文本操作须单击文本定义工具 , 使其颜色恢复为深色。
还须说明 , 在工具箱顶部有一个“ 选择对象指示器”, 窗口初启时指 示器呈浅 色 , 表 示
还没有选择过对象定义工具 , 不能在窗内建立新对象。单击任一对象定义工具后 , 指示器
颜色会自动由浅变深 , 表示允许建立对象。
二、对已建对象的操作
对于窗口中已经建立的对象 , 用户可根据需要进行下列操作。
(1 ) 选定单个对象 : 单击对象 , 该对象的四 角及每边 的中间 就出现控 制点符 号“■”,
表示对象已被选定。
(2 ) 选定多个对象 : 按下 Shift 键 , 逐 个单 击要 选 定的 对象。 或者 , 按 下 鼠标 按键 拖
曳 , 屏幕上将出现虚线框 , 放开鼠标按键后圈在其中的对象就被选定。
(3 ) 取消选定 : 单击已选定对象区的外部某处。
(4 ) 移动对象 : 选定对象并拖曳到合适的位置。 如果选定 的是多 个对象则 将同时 移
动。
(5 ) 改变对象区大小 : 选定对象后 , 拖曳某控制点即可使对象区放大或缩小。
(6 ) 修改对象属性 : 双击对象 , 将 会出 现 对象 属性 对话 框 , 供 用户 修改 对象 属 性 , 也
可利用 Screen 或 Object 选单进行各种设置。
注意 : 修改文本对象须选定文 本定义 工具 后方 能到窗 口内 操作 ; 而修 改 线或 框等 对
象则可直接到窗口内操作。
(7 ) 删除对象 : 选定对象 , 按 Del 键或选定 Edit 选单的 Clear 选项。
(8 ) 剪贴对象 : 选定对象 , 利用 Edit 选单 关 于剪 贴 板的 选 项 来复 制、移 动 或删 除 对
象。
6 .2 .2 数据类 对象的定 义
打开的屏幕设计窗口与图 6 .4 一致。
(2 ) 删除对象 : 按住 Shift 键 , 逐个 单 击启 用 日 期等 与 输出 无 关 的 对 象 , 然 后 按 Del
键。
(3 ) 移动对象 : 分别选定编号等对象并拖曳到如图 6 .8 所示位置。
图 6 .8 设备折旧屏幕设计窗口
(4 ) 将输入字段 修改 为 输出 字 段 : 双 击编 号 字段 区 屏 幕就 会 出现 如 图 6 .9 所 示 的
Field 输入对话框 , 单击 Say 单选钮 , 将编号字段 由输入 字段 改为 输出字 段。接着 用同 样
的办法分别将名称字段和价格字段改变为输出字段。
・ 1 96 ・
图 6 .9 用字段对话框设置输入字段
图 6 .10 用字段对话框设置输出字段
同样的办法分别为名称标题和价格标题加上冒号。
生成屏幕程序后运行一遍 , 其结果如图 6 .7 所示。
三、编辑区定义工具
该工具用来为字符型的字段、变量或备注型字段定义文本编辑窗口 , 以便键入较长的
文本。
建立或修改编辑区对象时将 出现如 图 6 .12 所示的 Edit Region 对话框 , 下面 对该 对
话框进行简要说明。
Input 按钮 : 用于设定被编辑的字段、变量或备注型字段的名字。
图 6 .12 编辑区定义对话框
・ 1 98 ・
6 .2 .3 控制类 对象的定 义
图 6 .14 选字段或变量对话框
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 代码片段对话框
・ 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 单选钮对话框
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 复选框对话框
IF M - BJ = 1
BROWSE & & 打开可编辑的 BROWSE 窗口
ELSE
BROWSE N OMODIF Y NOA PPEND NODELE TE & & 打开只读的 BROWSE 窗口
ENDIF
6 .2 .4 图形类 对象的定 义
6 .3 屏幕生成器的选单
6 .3 .1 Screen 选单
图 6 .21 显示了完成所有操作后的屏幕设计窗口。
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
图 6 .24 窗口风格对话框
图 6 .26 数码器对话框
・ 2 12 ・
图 6 .27 滚动列表对话框
图 6 .28 屏幕图形对话框
(8 ) 画垂直线 : 单击直线定义工具→在多页档案 图形的 下方按下 鼠标键并 向下拖 曳
到适当地方释放。
为使键盘操作时光标能合理移动还需改变对象序号 , 这将在 本节第六 部分讲述。 还
・ 2 13 ・
有适当移动字段位置、放大字段区、按 OK 按钮返回等细节 , 不再一一列出。
本例通过设置屏幕初始化代码来对 SB .DBF 和 BMDM .DBF 进行 关联 , 但也可改 用
View 窗口设置环境来关联 , 后一方法留作习题。
二、Open All Snippets 选项
选定该选项将打开所有已设置代码片段的窗口 , 供用户修改代码 , 这既可节省寻找代
码片段的时间 , 也能避免遗漏修改。
三、Show Position 选项
选定该选项将在 FoxP ro 主窗口的状态行中显示鼠标当前位置 , 其数值单位 由 Ruler/
Grid 对话框中定义的标尺单位来决定。图 6 .29 所示鼠标当前位置的单位是字符。
四、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 选 单
和美化屏幕的作用。
一、Align to Grid 选项
选定对象 后 , 若 其 位 置不 符 合不 可 见
网格 , 只须按 该选 项 的热 键 Ctrl + T , 对 象
就会移动到符合网格的位置。这常用来使
若干对象行或列对齐。
二、Bring to Front 和 Send to Back 选
项
若某对象 被 其 它对 象 遮去 一 部分 , 选
定此对象后选用 Bring to F ront 选项 , 遮 去
的部分就会显 示出 来。Send to Back 选 项
的作用正好相 反 , 它使 选 定的 对 象藏 到 后
・ 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 屏幕颜色对话框
图 6 .35 圆角类型对话框
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 是系统 提供的一 个组合查 询
屏幕文件。为将它修改成所需的文件 , 先为它复制一个副本 :
(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 题图)
( 第 10 题图)
・ 2 21 ・
第七章 报 表 设 计
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 打印方 法
三、通过输出定向来打印
?, ??, @ …SAY 等命 令都可 输出数据 , 对 于这类命 令 , Fox Pro 默认数据 输出到 屏幕 ;
若进行打印 , 须先将数据定向输出到打印机 , 然后再将它送到打印端口方能打印。
1 . 输出定向命令
(1 ) 命令格式 :
该命 令 取 T O P RIN T ER 后 , 能 将 @ … SAY 命 令 的 输 出 定 向 到 打 印 机 ; 取 TO
SCRE EN 则输出定向到屏幕 ; 取 TO F IL E < 文件名 > 则输出定向到指定的文件。例如 :
(2 ) 命令格式 :
SE T PRINT ER ON | OFF
功能 : 将打印数据发送到文件或打印端口。
说明 :
(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 打印状态
钻床 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 .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
— | 皃 皅 +
7 .3 报表书写器的基本操作
报表书写器是 FoxP ro 提供的一种制表辅助工具 , 具有报表设计、显示和打印等功能。
与屏幕生成器不同 , 它不需要生成报表程序便可打印 , 故称为报表书写器而不叫做报表生
成器。本章将用两节介绍这一工具的用法。本节 先讲 它的 基本操 作 , 下节 说明它 的高 级
操作。报表书写器的基本操作包 括 : 打 开报 表设 计窗口、快 速建 立报表、报 表 页面 预览、
保存报表定义和打印报表等内容。
7 .3 .1 打开报 表设计窗 口
图 7 .6 Repor t 选单的选项
7 .3 .2 快速制 表
图 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 页面预 览
图 7 .9 页面预览对话框
・ 2 30 ・
7 .3 .4 报表打 印
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 中所定义的报表便可用下面的命令进行打印或页面预览 :
二、选单方式打印报表
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 设置页 面布局
7 .4 .2 设计报 表分区
表 7 .2 报表分区的建立及作用
一、基本分区
报表设计窗口一旦打开 , 窗内 已含 有 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 .14 设备价格表
三、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 报表设计之二
8911 2763 .5
(2 ) 定 义 快 速 报 表 : 往 命 令 窗 口 键 入 命 令 MODIFY
REPORT DXFLB 打开报表设计窗口→在 Report 选单中选 9112 3520 .0
图 7 .19 组信息对话框
・ 2 39 ・
图 7 .20 数据分组对话框
图 7 .21 设备大修分类表报表设计窗口
7 .4 .3 定义报 表对象
表 7 .3 报表定义工具一览表
・ 2 42 ・
设备大修表
9112 3520 .0
合 计 15337 .9
图 7 .22 带有费用合计的设备大修表
图 7 .23 带有费用合计的设备大修报表设计
图 7 .25 计算字段对话框
7 .4 .4 报表变 量的应用
定义。
一、用户定义报表变量
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 所示的设备役龄表 , 该表按是否主要设备来分页 , 部门要打
印汉字 ; 左端还要加上序号列。
非主要设备役龄表
主要设备役龄表
图 7 .27 设备役龄表
图 7 .29 报表变量对话框
图 7 .31 含有用户定义变量的表达式构造器
习 题
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 ・
第八章 选 单 设 计
8 .1 下拉式选单设计
8 .1 .2 快速选 单生成
图 8 .1 Menu 选单及其选项
8 .1 .3 选单设 计窗口
・ 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 .4 设备管理系统的下拉式选单
图 8 .5 水平选单页
图 8 .7 “打印”选单的弹出式选单页
・ 2 56 ・
图 8 .8 Menu Options 对话框
CLEAR ALL
CLEAR
KEYBOARD ′
{Ctrl + F4}′ & & 关闭 COMMA ND 窗口
MODIF Y W INDOW SCR EEN T I TLE ′设 备 管 理 系 统′ & & 设置选单窗口标题
U SE SB
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 .2 弹出式选单设计
下拉式选单程序既可用选单生成器来生成 , 也可用直接通过编程产生 , 但是用选单生
成器来生成更加便利。有时在应用系统中需要临时弹出一个选单 , 选单生成 器不能单 独
生成这样的弹出式选单 , 此时必须用弹出式选单命令进行编程。
弹出式选单包括四种命令 : 弹出式选单定义、选项定义、选项动 作定义和 弹出式选 单
激活。
一、定义弹出式选单
命令格式 :
功能 : 定义弹出式选单的名称及总体属性。
说明 :
(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 子句用来在弹出控 制中 增加滚 动条 , 当 选项众 多以 致当 前窗口 中容 纳
不下时滚动条就被激活。
二、定义弹出式选单的选项
命令格式 :
功能 : 定义弹出式选单的一个选项及其属性。
说明 :
( 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:
* 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
* 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
* 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
习 题
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 以处理为中心的数据库应用系统开发示意图
9 .2 “汽车修理管理系统”的开发
本节简明地描述开发一个“汽车修理管理系统”的全过程。
9 .2 .1 需求分 析
车 主 名 李符 地 址 岭分路 18 号 电 话 8787878
图 9 .2 修车登记单
2 68 ・
汽 车 修 理 单
数 量 2 5 2
修理小时 98 .0
图 9 .3 汽车修理单
零 件 入 库 单
日期 :
验收人 :
图 9 .4 零件入库单
零 件 出 库 单
编号 : 日期 :
零件号
数量
修理工 :
图 9 .5 零件出库单
第 1 季度零件订货计划
100003 离合器 3 4 2
图 9 .6 零件订货计划
・ 2 69 ・
修 理 汽 车 发 票
日期 : 97/ 07/ 27
图 9 .7 修理汽车发票
工 资 月 报 表
图 9 .8 工资月报表
二、功能需求
功能分析的任务 , 是弄清用户对目标系 统数 据处理 功能 所提 出的需 求。根据 系统 目
标和数据需求并与用户充分讨论后 , 本例的功能需求可归纳为以下 5 个方面。
1 . 数据登记
登记功能用于把各种手填单据中的数据及 时登记 到系 统将要 定义 的数 据库文 件中 ,
还要求能进行修改。这些单据包括修车登记单、汽车修理单、零件入库单和零件出库单。
2 . 查询
能查询登记单、修理单、汽车、车主、修理工、零件库存的有关数据。
3 . 编制并显示季报零件订货计划
编制零件订货计划需要找出要订货的零件 , 订货条件为 : 零件库存量 < 最低库存量。
订货量可由用户输入或修改。
4 . 打印发票
发票中除包含顾客、汽车及修理项目等数 据外 , 还 要计 算出修 车费 , 修 车费包 括修 理
费和零件费 , 按下列各式计算 :
零件费 = ∑ ( 零件价格 × 耗用数量 )
修理费 = 小时工资×修理工时×3
总计 = 零件费 + 修理费
不难看出 , 发票包含的信息来自修车登 记单、汽车 修理 单和零 件出 库单 等各种 单据 ,
这是一项涉及面很广的功能。
5 . 打印修理工工资月报表
・ 2 70 ・
某修理工的月工资 = ∑ 修理小时 × 小时工资
9 .2 .2 数据库 设计
图 9 .9 库文件关联示意图
下面对上述设计说明两点 :
(1 ) 为同时调用不同库文件 中的 数据须 将它 们关 联 , 故 而有 的库 文件要 补充 关键 字
字段。例如 QC .DBF 包含 牌 号、型号 和 生 产 厂 3 个 字 段 已 很 完 整 , 但 为 使 QC .DBF 与
CZ .DBF能以车主名关联 , 在 QC .DBF 增入了车主名字段。
(2 ) 数据库设计须注意合 理性。若 将不 同类的 数据 放进 同一个 库文 件中 , 可 能会 产
生数据冗余。例如若将 QC .DBF 与 CZ .DBF 的字段合并为一个库文件 , 由于 一个车主 可
拥有多辆汽车 , 在登记这些汽车的牌号、型号和 生产厂 的同 时也要 登记 车主 的车主 名、地
・ 2 71 ・
址和电话 , 那么这些记录中的车主信息将重复记载。数据冗余会多占存储容量 , 这是易于
理解的 , 更糟糕的是还会破坏数据的一致 性。如果 车主易 名 , 只要 有一 处忘记 修改 , 将 来
查询或打印时可能会输出不一样的数据。库文件 的分 拆往 往能减 少数 据冗余 , 但 库文 件
个数的增多又会增加程序的复杂性 , 因为须在不同的工作区打开这些库文件 , 而且为了联
用数据还要对库文件进行关联。
二、物理设计
下面列出汽车修理管理系统所有库文件的结构及索引 , 为便于读者理解本例系统 , 顺
便也列出库文件的部分记录。
1 . 修理单
2 . 汽车
・ 2 72 ・
1 A2020203 S130 南方汽车厂 李符
2 R1212123 760 东环汽车制造厂 马一鼎
3 H210-100 C12-5 国光轿车厂 孔力
4 K333-667 FG323 福铃货车总厂 贾嘉丁
5 A2312318 NA122 全球汽车厂 施志秋
3 . 车主
R ecord # 车主名 地址 电话
1 李符 岭分路 18 号 8787878
2 马一鼎 鸿飞路 10 号 5656555
3 孔力 虎山路 15 弄 15 号 3456789
4 贾嘉丁 法平路 213 号 3344556
5 施志秋 东方一路 1005 号 6665578
4 . 修理工
・ 2 73 ・
5 . 零件用量
R ecord # 编号 零件号 数量
1 5002 100003 1
2 5005 100001 2
3 5005 100004 5
4 5005 100005 2
6 . 零件库存
除 上 述 6 个 库 文 件 外 , 零 件 入 库、出 库 时 还 需 有 暂 存 库 文 件。零件 入 库 库 文 件 为
LJRK .DBF, 其结构与 LJKC .DBF 相同。零件出库库文件的结构如下 :
・ 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 表示了系统的下拉式选单 , 在括号中还标出了所调用程序的名字或程序段。
修车登记 零件订货计划 发票
( XCDJ.SPR ) ( LJDH. PRG) (代码片段 )
修理工数据管理 零件出库管理
(程序略 ) ( LJCK. PRG)
图 9 .11 汽车修理管理系统的选单
・ 2 75 ・
9 .2 .4 编码
图 9 .13 修车登记屏幕设计窗口
SELE qc
LOCA FOR 牌号 = xld .牌号
IF NOT FOU N( )
APPE BLA N & & QC .DBF 添记录
REPL 牌号 WI TH xld .牌号
ENDI
SHOW GETS
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
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 .工号 & & 移动记录指针 , 为使屏幕出现时立即显示修理工名
・ 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 代码片段 :
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 ) 季度不作为筛选记录的条件 , 仅在选季度窗口标题栏上显示出来。
一种可能的程序如下 :
图 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 文本编辑框中键入如下代码片段 :
2 . 季度数弹出控制的设置
双击屏幕设计窗口中的弹出控制即会出现如图 9 .1 7 所示的 Popup 对话框 , 其设置说
明如下。
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
图 9 .18 选零件号屏幕设计窗口
・ 2 86 ・
(1 ) 选定 F rom Field 单选钮 , 然后在 Field 按钮右侧的文本框内键入表达式
IF rk = 1
REPL ljrk .零件号 WI TH ljkc .零件号
ELSE
REPL ljck .零件号 WI TH ljkc .零件号
ENDI
・ 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
・ 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 . 复制组合查询屏幕文件
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
・ 2 89 ・
REPO FORM fp PR EV & & FP .FRX 中的报表变量 MLJF = LJF
图 9 .20 发票的报表设计窗口
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
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 项目管理器
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
・ 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 增入主文件后的项目管理窗口与建立选择对话框
9 .3 .2 生成 .EXE 文 件
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 文档对话框
表 9 .1 .DOC 常用文档
文 档 文 件 内 容
・ 2 97 ・
续表
文 档 文 件 内 容
习 题
1 . 以树形结构画出“汽车 修理管 理系 统”的总 体模块 图 ( 即程 序调 用关 系图 ) 。应 用
程序生成器的内部模块不须列出。
2 . 为“汽车修理管理系统”设计、编写程序 , 并挂入选单。
(1 )“ 修理工管理”程序。
(2 ) 打印“ 修车台帐月报”, 月报中要求包括以下数据 : 编号 , 型号 , 项目 , 修理 小时 , 修
理工工号 , 修理费 , 零件费 , 总计 , 车主 , 送修日期 , 完工日期。
(3 ) 打印“ 零件耗用月报”。
(4 ) 数据备份程序、备份恢复程序。
3 . 为“汽车修理管理系统”编写用户操作手册。
・ 2 98 ・
第十章 多用户应用初步
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 网的结构
二、工作站 ( Workstation)
工作站是网络用户使用的计算机。它上网后 与文 件服 务器相 连 , 成为 网络的 一个 节
点 , 通过对服务 器的 访 问 与 服 务器 交 换 信 息。 Netware 操 作 系 统的 外 壳 程 序 例如 IPX .
COM 和 NE T X .COM 都是在工作站上运行的。存放在服务器硬盘上的网络共享软件 , 也
都要下载到工作站的内存中才能运行 , 可见网 络系统 的信 息处 理任务 主要 是由工 作站 来
承担的。
工作站可分普通工作站和无盘工作站两种 , 前者 退网 后可 作为独 立的 个人计 算机 使
用 , 后者因不带磁盘驱动器 , 退网后独立工作能力受到极大的限制。
三、网卡 ( Net Interface Card)
网卡是网络接口卡的简称 , 它为服务器、工作 站通 过介 质互连 提供 了硬件 接口 , 故 也
可看成是网络的通信处 理机。 Netware386 支 持 使用 多种 类型 的网 卡。网 络 中的 所有 工
作站、服务器都必须配置网卡。文件服务器或 工作站 有时 配置 多块同 型号 或不同 型号 的
网卡 , 是为了连接多个网段 , 延伸电缆的距离或 连接不 同类 型的网 络 , 这种 服务器 或工 作
站称为网桥。
四、传输介质 ( Transmission Medium)
传输介质是用于网络各个结点之间的物理 连接 , 常用 的介 质有 光缆、同轴 电缆、双 绞
线等。各种介质对信号的衰减程度不同 , 每一段允许的最大长度也不同 , 为了弥补传输过
程中的信号衰减 , 可在传输途中插入各种中继设备 , 实现信号放大、连接形式变换等功能 ,
图 10 .1 中的集线器 , 就是这类中继设备的一例。
五、终端器 ( Terminator)
总线型网络的每一干线电缆的两端必须各安装一个终端器 , 吸收介质中的反射电波 ,
・ 3 00 ・
防止反射波对信号的 干扰 , 终 端 器的 阻抗 必须 与同 轴 电缆 特性 阻抗 一致 , 所以 又称 匹 配
器。
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 多用户操作和程序设计
10 .2 .1 多用户操 作的基本概 念
一、数据库文件的独占使用
当某个数据库文件以独占方式被打开使用时 , 只能有一个用户对数据有访问权 , 其它
用户都不能打开该库文件进行读或写。独占方式 是单 用户 系统最 明显 的特征 , 但 是它 破
坏了在网络上共享数据的优点 , 因此只有在必要时才使用。
以独占方式打开库文件是防止其它用户对该库文件获得读访问权的唯一方法。因为
用 FLOCK( ) 锁定库文件只能防止其它用户写文件 , 而不能防止其它用户读文件。尽管多
・ 3 03 ・
用户环境要尽量避免以独占方式使用库文件 , 但某些 Fox Pro 命令仍要求用户必须以独 占
方式打开库文件 ( 例如涉及数据库文件整体写操作的命令 ) , 表 10 .1 列出了这些命令。.
当用户试图在共享的库文件上执行表 10 .1 中 所列 的命令 时 , 系统 将返 回错误 信息 :
“要求以独占方式打开文件”。
表 10 .1 必须以独占方式工作的命令
命 令 说 明
INDEX 当创建、增加或删除一个复合索引标志时
REI NDEX
PACK
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 多用户命 令和函数
一、对记录和数据库文件解锁
下面的命令可以解开以自动或手动方式为记录和文件上的锁 :
命令格式 :
功能 :
(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 具有自动加解锁功能的命令
命 令 加 锁 范 围
EDI T 同上
DELET E 当前记录
・ 3 06 ・
续表
命 令 加 锁 范 围
GATHER 当前记录
I NDEX 整个数据库文件
R EAD 当前记录和所有别名字段中的记录
R ECALL 当前记录
R EPLACE 当前记录和所有别名字段中的记录
SH OW GE TS 当前记录和所有别名字段中的记录
U PDAT E 整个数据库文件
功能 :
用于设置加锁状态 , 以便在加锁命令 ( 自动或手动 ) 失败后 , 能自动控制继续锁定的次
数或持续时间 , 在尝试 加锁 的过 程 中 给出 提 示“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′
LOCK ( [ < 数字表达式 > | < 字符表达式 1 > ] | [ < 字 符表达式 2 > , < 数字 表达式 > | < 字 符
表达式 1 > ] )
RLOCK ( [ < 数字表达式 > | < 字符表达式 1 > ] | [ < 字符表达式 2 > , < 数字表达式 > | < 字符
表达式 1 > ] )
FLOCK ( [ < 数字表达式 > | < 字符表达式 > ] )
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 , 2 的主要功能同单用户打印命 令 , 不 过它 们的 作用范 围已 经从本 地打 印
机扩展到了网络共享打印机。
命令 3 中“ \ \ < 打印机服务器机器名 > \ < 打印机名 > = < L PTn > ”是把工作站
打印机的端口号与网络中的打印服务器上的一台 打印 机实 现“ 联结”, 使随 后输出 到端 口
L PTn 的打印内容转向网络共享打印机。
例 :若用 户 要 把 本 机 # 1 打 印 机 端 口 ( LP T1 )“ 联 结”到 打 印 服 务 器 ( 机 器 名 为
SAICPS ) 的打印机名 E PSON1600 上 , 可以使用命令
这样 , 用户一旦使用 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 常用多用户命令和函数汇总
命 令 功 能
MESSAGE ( ) 返回当前错误消息或引起错误的那行内容
RET RY 重新执行前面的命令
RLOCK ( )或 LOCK( ) 试图锁定 数据 库 文 件 中一 个 或 多 个 记 录 , 如 果 成 功 将 返
回 .T ., 否则返回 .F .
SET EXCLUSIVE ON | Off 指定此后打开的数据库文件以独占方式或是共享方式
・ 3 10 ・
续表
命 令 功 能
SYS ( O) 返回机器号
U NLOCK 解开记录或文件的锁
10 .2 .3 多用户编 程
・ 3 11 ・
二、错误处理程序
在多用户应用程序中 , 常用 SE T REP ROCESS 命令来处理不 成功的锁 定尝试。这 个
命令与 ON ERROR 语句、RE TRY 等命 令结 合起来 , 可 以让 用户 选择 继续 或 取消 加锁 努
力。下面试举一例 , 读者可由此窥见一斑。
10 .3 多用户系统的性能优化
习 题
1. 多用户程序设计中是否还要用到独占方式 ? 为什么 ?
2. 多用户数据库共享的原则是什么 ?
3. 既然涉及写操作的命 令 具 有自 动 加锁 或 解锁 的 功能 , 为什 么 还 要手 动 加锁 或 解
锁?
4. 编写多用户数据库应用程序主要应该注意哪些问题 ?
5. 试编一个多用户数据库应用 程序。 要求多 个用 户可“同 时”对一 个数 据库 进行 添
加、编辑、查询、统计。
・ 3 14 ・
附录一 FoxPro for Windows命令概要
命 令 功 能
= 计算一个或多个表达式的值并删除返回值
\ 输出文本行
? 显示其后所跟表达式的值
?? 在当前行当前位置处显示指定表达式的值
@ …BOX 根据指定坐标画一个框
@ …CLEAR 清除活动窗口或屏幕的一部分
@ … FILL 改变一个窗口或屏幕上指定区域的颜色
@ … GET 建立一个编辑区
@ … GET-Lists 建立滚动列表
@ … GET-Popups 建立弹出式选单
@ … GET-Spinners 建立数码器
@ … MEN U 建立一个弹出式选单
@ … PROMPT 建立一个选单条
@ …SAY 将表达式的值按指定格式输出
@ …SAY…BMPs &OLE 显示 BM P 和 OLE 对象 , 或 调用 OLE 服务 器 以执 行 OLE
对象谓词
ACCEPT 从显示屏接受字符串数据
・ 3 15 ・
续表
命 令 功 能
APPEND 向一个数据库文件尾部追加记录
CA NCEL 取消当前程序的执行
CLEAR 清除屏幕或当前输出窗口的内容
・ 3 16 ・
续表
命 令 功 能
CLEAR Windows 从内存中释放所有用户自定义窗口 的定义 , 并从 屏幕上 擦
除这些窗口
CLOSE ALL 关闭所有工作区中的所有文件 , 然后选择 1 号工作区
COPY TO 将当前数据库文件的内容拷贝到一个新文件中
COU NT 计算数据库文件的记录数
・ 3 17 ・
续表
命 令 功 能
DIMENSION 建立一维或二维数组
DO 执行一个命令文件或过程
DO CASE… ENDCASE 执行 DOCASE 之 后 , ENDCASE 之前 , 相应 条 件 计 算 结 果
为真的第一个语句块
DO WHILE… ENDDO 执行一个条件循环内的语句块
・ 3 18 ・
续表
命 令 功 能
EJEC T 将一个换页符送到打印机
E RASE 从磁盘上删除一个文件
FIN D 搜索一个索引的数据库
FLUSH 将对数据库文件和索引文件所作出的改动存入磁盘
FOR…ENDF OR 执行中指定次数的循环
HELP 打开 HELP 窗口
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 则为真值
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 将主调程序传来的数据赋给局部内存变量
PRIVATE 使以前定义的同名内存变量在当前程序中不可用
PROCEDUR E 在一个程序文件中标出一个过程开端
P UBL IC 定义全局内存变量或数组
Q UI T 退出 FoxPro, 返回 Windows 环境
RECALL 去掉指定记录的删除标记
REGIONAL 定义局部内存变量或数组
・ 3 21 ・
续表
命 令 功 能
RELEASE 释放内存变量、库、用 户定 义选 单、弹 出式 选 单、弹出 式 选
择项和窗口等等
RELEASE BAR 释放一个弹出式选单上的一个或所有的选单条
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 TO 将内存变量存入一个内存变量文件或一个备注字段中
SAVE W INDOW 将所有的或指定 的窗 口定 义存 到一 个窗 口 文件 或一 个 备
注字段中
SCAT TER 将数据从当前记录拷贝到数组或内存变量集中
SCROLL 将用户定义窗口 , 或 FoxPro 主窗口 的一个 区域、向上、下、
左或右滚动
SCAN… ENDSCAN 用记录指针遍历当前数据库文件 , 并对符 合指定 条件的 每
个记录执行一系列命令
・ 3 22 ・
续表
命 令 功 能
SEEK 在当前已索引的 数据 库文 件中 寻找 索引 键 表达 式同 给 定
表达式相匹配的 第一 个记 录 , 若 找到 , 则 将 记录 指针 移 到
该记录上
SELECT 激活指定的工作区
SELECT-SQL 从一个或多个数据库文件中检索数据
SET 打开 View 窗口
决定 FoxPro 是否 显 示系 统时 钟 , 并 指定 屏 幕 上的 时 钟 位
SET CLOCK
置
SET COLOR OF 指定用户自定义系统和窗口的颜色
SET COLOR OF SCHEME 指定一个色彩模式中的色彩 , 或将 色彩模 式拷贝 给另一 个
色彩模式
SET COLOR SE T 装入先前定义的色彩集
・ 3 23 ・
续表
命 令 功 能
・ 3 24 ・
续表
命 令 功 能
・ 3 25 ・
续表
命 令 功 能
SET R EPROCESS 指定文件上锁或记录上锁不成功后 还要反 复尝试 多少次 ,
或多长时间
SET R ESOU RCE 指定或修改一个资源文件
SET SAFETY 指定在覆盖一个 已存 在文 件之 前是 否要 先 显示 一条 警 告
信息
SET SEPARATOR 指定在小数点左边用什么分隔符将数字分为每三位一组
SHOW PO PU P 显示一个弹出式选单而不激活它
・ 3 26 ・
续表
命 令 功 能
SKIP 在当前或指定的数据库文件中将记录指针向前或向后移
SOR T 对当前数据库文件的记录排序 , 并 将排序 后的数 据输出 到
一个新数据库文件中
STORE 或 = 给一个内存变量赋值或初始化一个数组
SUM 对当前数据库文件中所有的或指定的数值字段求和
TOTAL 对当前数据库文件按关键字进行分类小计
ZAP 真正删除一个数据库文件中的所有记录
ZOOM WINDOW 改变一个用户定义窗口 或一个 Fox Pro 系 统窗口 的大小 及
位置
・ 3 27 ・
附录二 FoxPro for Windows主要函数
函 数 功 能
& 执行宏代换
$ 确定一个字符串是否包含在另一个字符串或备注字段中
ABS( ) 返回指定数值表达式的绝对值
ADEL( ) 从一个一维数组中删除一行或从一个二维数组中删除一行或一列
AELEMENT ( ) 返回指定行和列下标的数组元素号
AFONT ( ) 将有关可用字体的信息存入一个数组中
ALEN( ) 返回一个数组中的行数、列数或元素数
ALIAS( ) 返回当前或指定工作区的别名
ASCAN ( ) 在数组中查找一个表达式
ASIN ( ) 返回指定数值表达式的反正弦值
ASOR T ( ) 按升序或降序给一个数组中的元素排序
AS UBSCRIPT ( ) 从一个数组元素的元素号返回其行或列的下标
返回一个字符表达式在另一个字符表达式 或备注字段 中首次出现 时的位置 ,
AT ( )
从左部开始计算 , 位置是一个整数
返回一个字符表达式或备 注字段 在另 一个 字符表 达式 或备 注字 段中 首次 出
AT CLINE ( )
现时的行号 , 字母不区分大小写
AT LINE ( ) 功能类似于 AT CLINE ( ) , 不同的是字母要区分大小写
・ 3 28 ・
续表
函 数 功 能
BO F( ) 如果记录指针指向数据库文件的开头位置 , 则返回真值
CMONTH ( ) 返回给定日期的月份值
COL ( ) 返回光标当前位置的列数
COS ( ) 返回一个数值表达式的余弦值
CTOD( ) 将字符型日期转换成日期型日期
DATE ( ) 返回当前系统日期
DBF ( ) 返回在当前工作区或指定工作区中打开的数据库文件名
DISKSPACE( ) 以字节为单位返回缺省磁盘驱动器上的剩余空间
DMY( ) 返回一个以日、月、年格式表示的日期表达式
DTOC( ) 将日期型日期转换成字符型日期
DTOR( ) 根据度数返回弧度
EVALU AT E ( ) 计算字符表达值并返回结果
EXP( ) 返回 ex 值 , x 值即指定的数值表达式的值
FEO F( ) 确定文件指针是否指问文件尾部
FI ELD( ) 返回当前或者指定数据库文件中对应于字段号的字段名
FI LE ( ) 如果可在磁盘上找到指定文件则返回真值
FKLABEL ( ) 返回对应于一个数值表达式的功能键名
FK MAX( ) 返回键盘上可用的可编程功能键或组合功能键的代号
FLOOR( ) 返回小于或等于指定的数值表达式的最接近的整数
・ 3 29 ・
续表
函 数 功 能
GATHER ( ) 将内存变量或数组元素的内容存到当前数据库的当前记录中
GOMONTH ( ) 返回在给定日期之前或之后指定月数的日期
II F( ) 根据逻辑表达式的取值返回真假所指的二个表达式值之一
INKEY( ) 返回键盘缓冲区中键入的第一个键或鼠标键的数值
INT ( ) 返回数值表达式的整数部分
ISLOWER( ) 如果指定字符表达式的最左字符是小写字母则返回真值
IS UP PER( ) 如果指定字符表达式的最左字符是大写字母则返回真值
KEY ( ) 返回控制索引文件的关键索引表达式
LASTKEY ( ) 返回对应于最后一个按键的值
LEFT ( ) 返回字符串中从最左字符开始的指定数目的字符
LEN( ) 返回字符表达式中字符的个数
L IKE ( ) 确定一个可以含有通配符的字符表达式是否同另一个字符表达式相匹配
LOG( ) 返回指定数值表达式的自然对数值
LOG10 ( ) 返回指定数值表达式的常用对数值
在库文件中寻找字段和指定表达式匹配的 第一个记录 , 如找到 则记录指针 移
LOOKU P( )
至这一记录 , 并返回该记录中指定字段的值
LOWER ( ) 以小写字母形式返回指定的字符表达式
LT RIM ( ) 返回去掉了前导空格的指定字符表达式
LU PDAT E( ) 返回最后一次修改数据库文件的日期
返回字符串、数值或日期表达式中 ASCII 码值最 大或数值最大 或日期最晚 的
MAX( )
表达式的值
・ 3 30 ・
续表
函 数 功 能
MCOL ( ) 返回鼠标指针在屏幕或一个窗口中的列位置
MDOWN( ) 判断是否按了鼠标左键
MDX( ) 返回打开的复合索引文件名
MESSAGE ( ) 返回当前错误信息或程序引起错误的那一行的内容
返回字符串、数值或日期表达式中 ASCII 码值最 小或数值最小 或日期最早 的
MIN ( )
表达式的值
MLINE ( ) 以字符串形式返回一个备注字段中所指定的那一行
MOD( ) 返回一个除法操作的余数
MONTH ( ) 返回给定日期的数字月份
MWINDOW ( ) 指出鼠标指针位于哪一个窗口
NDX( ) 返回当前或指定数据库中打开的数据库索引文件名
ORDER( ) 返回当前指定数据库文件的控制索引文件名或标识名
PAD( ) 返回在一个选单条中最后选择的选单笺名
PCOL ( ) 返回打印机输出的当前列位置
PI( ) 返回 π值
PROGRAM ( ) 返回最近刚执行或执行过程中出现错误的程序的名称
PROM PT ( ) 返回在活动选单条或弹出式选单中选择的选择项
PROW ( ) 返回打印输出的当前行位置
・ 3 31 ・
续表
函 数 功 能
返回一个字符串或备注字段在另一个字符 串中出现的 起始位置 , 从其最右 的
RAT ( )
字符开始计数
寻找一个字符串或备注字段在另一个字符 串中出现的 位置 , 从 最后一行开 始
RATL INE ( )
计数 , 返回值与 MEMOW IDTH 命令所指定的值有关
RDLEVEL ( ) 返回当前 READ 的嵌套数
READKEY ( ) 返回在退出某一个编辑命令时所按键的对应值
RECNO( ) 返回当前记录号
RECSIZE( ) 返回数据库文件的记录长度
RIGH T ( ) 返回字符串中从最右字符开始算起的指定数目的字符
RO UN D( ) 返回数值表达式四舍五入的结果
ROW ( ) 返回光标的当前行位置
RTOD( ) 将弧度转换为角度
RT RIM ( ) 返回已去掉尾部空格的指定字符表达式
SCHEME ( ) 从一个彩色模式中返回一个颜色对或颜色对列表
SCOLS( ) 返回显示屏幕上可用的列数
SEEK( ) 在当前已索引的数据库文件中按索引表达式查找记录
SELECT ( ) 返回工作区号
SI N( ) 返回指定角度的正弦值
SQRT ( ) 返回指定数值表达式的平方根
SPACE ( ) 返回一个由指定数目空格组成的字符串
SROWS( ) 返回屏幕可用的行数
ST R( ) 把一个数值表达式转换为字符表达式
ST UF F ( ) 在字符串的任何部分插入或删除字符串
SUBST R( ) 返回给定字符表达式或备注字段中指定数目的字符串
・ 3 32 ・
续表
函 数 功 能
・ 3 33 ・
续表
函 数 功 能
TAN ( ) 返回指定角度的正切值
TARGE T ( ) 返回作为一个关系目标的数据库文件的别名
TI ME ( ) 返回当前系统时间
TRIM ( ) 返回已删除了尾部空格的指定字符表达式
TYPE ( ) 返回表达式的数据类型
U PPER ( ) 把字符表达式的值从小写转换成大写
VAL ( ) 将字符串转换成数值
VARREAD( ) 返回当前正在编辑的字段或变量的名称
WBORDER ( ) 如果一个窗口有边框则返回真值
WCHILD( ) 返回当前或指定的父窗口的子窗口数或子窗口名
WCOLS( ) 返回一个窗口的列数
WEXIST ( ) 如果指定的窗口已经存在则返回真值
WLAST ( ) 返回当前活动窗口的前一活动窗口名或确认一窗口是否为前一活动窗口
WLCOL ( ) 返回当前或指定窗口的左上角的列坐标
WLROW( ) 返回当前或指定窗口的左上角的行坐标
WONTOP( ) 确认当前窗口或指定窗口是否在其它激活窗口前面
WOUTP UT ( ) 确认是否输出到当前窗口或指定窗口
WPARENT ( ) 返回当前或指定子窗口的父窗口名
W ROWS( ) 返回当前指定窗口的行数
・ 3 34 ・
续表
函 数 功 能
W TI TL E( ) 返回当前或指定窗口的标题
YEAR( ) 返回对应于指定日期表达式的年份值
・ 3 35 ・
附录三 ON KEY LABEL键标号一览表
键 标 识 键 标 号
左箭头 ←
右箭头 →
上箭头 ↑
下箭头 ↓
Home HOME
End END
PgUp PGU P
PgDn PGDN
Del DEL
退格 BACKSPACE
空格 SPACEBAR
Ins I NS
Tab TAB
Enter ENTE R
F1 到 F12 F1 , F2 , . . ., F12
・ 3 36 ・
续表
键 标 识 键 标 号
鼠标左键 LEFTMOU SE
Mouse MOUSE
Escape ESC
・ 3 37 ・
主要参考文献
・ 3 38 ・