计算机技术基础B

Download Report

Transcript 计算机技术基础B

Visual FoxPro 6.0程序设计










第一章 Visual FoxPro 6.0概述
第二章 数据库的创建与维护
第三章 数据记录的维护操作
第四章 索引与查询
第五章 基本程序设计
第六章 数组变量
第七章 数据的查询与统计
第八章 如何制作报表与标签
第九章 表单设计
第十章 菜单设计
第一章 Visual FoxPro 6.0概述

1-1
1-2
1-3
1-4
1-5
1-6
1-7
1-8
1-9
1-10
启动与关闭Visual FoxPro
菜单及快捷键的使用
工具栏的使用
使用易学易用的向导
使用各种各样的设计器
爱不释手的生成器
交互式模式 (命令窗口的使用)
【Esc】键的中断使用
系统信息
帮助系统的使用

1-1 启动与关闭Visual FoxPro

1-1-1 启动 Visual FoxPro

1-1-2 关闭 Visual FoxPro

1-2 菜单及快捷键的使用

1-2-1 菜单的使用

1-2-2 快捷键的使用

1-3 工具栏的使用

1-3-1 打开及移动工具栏

1-3-2 关闭工具栏

1-4 使用易学易用的向导

1-4-1 启动向导

1-4-2 向导的使用法则

1-5 使用各种各样的设计器
Visual FoxPro提供了各种各样的设计器 (Designer),用于建立数据库、
数据表格、表单、报表、标签或查询等。
表1-1 常用设计器名称以及功能用途
设计工具
功能用途
数据库设计器
建立或修改一个数据库以及定义数据表间的关联性连接
数据表设计器
建立或修改数据表以及替数据表编制索引
表单设计器
建立一个用来显示与编辑数据表中数据的表单
报表设计器
定义报表的格式,以便将数据表中的数据按所需的格式打
印报表
标签设计器
定义标签的格式,以便将数据表中的数据按所需的格式打
印标签
查询设计器
设定查询数据需要满足的各项条件,并快速将数据资料查
询出来

1-5 使用各种各样的设计器
打开设计器 (Designer)的方法:
2
1
3

1-6 爱不释手的生成器
Visual FoxPro 在某些设计器中加入生成器 (Builder)。通过对生成器
的交互操作,它将自动替您完成表达式、程序过程的创建。
用
生成器
途
组合框生成器(ComboBox Builder)
辅助设计组合框
命令组生成器(CommandGroup Builder)
辅助设计命令按钮组
编辑框生成器(EditBox Builder)
辅助设计文本编辑框
表达式生成器(Expression Builder)
辅助设计表达式
表单生成器 (Form Builder)
辅助设计表单
网格生成器(Grid Builder)
辅助设计网格
列表框生成器(ListBox Builder)
辅助设计列表框
选项组生成器(OptionGroup Builder)
辅助设计选项按钮组
文本框生成器(TextBox Builder)
辅助设计文本输入框
自动格式生成器(AutoFormat Builder)
格式化多个被选定的控件
参照完整性生成器(Referential Integrity Builder)
建立数据库表间的参照完整性规则

1-7 交互式模式 (命令窗口的使用)
Visual FoxPro提供了命令窗口(Command Window),您可以在命令
窗口中输入命令,然后按回车键执行。每一道命令的执行结果会立即反应在
Visual FoxPro主窗口的编辑区。
关 闭 交
互 式 模
式
恢复交互式模
式

1-8 【Esc】键的中断使用
按【Esc】键可以中断执行中的命令或程序。
忽略【Esc】
键的中断请求
而继续执行
完全终止程序
暂时停止执行程序
输入RESUME命令恢复
关闭【Esc】键
的中断功能
恢复【Esc】键
的中断功能

1-9 系统信息
错误提示

1-10 帮助系统的使用

1-10-1 一般帮助信息

1-10-2 从网络中取得帮助

1-1-1 启动 Visual FoxPro
2
1
3

1-1-2 关闭 Visual FoxPro
单击此按钮关闭
Visual FoxPro

1-2-1 菜单的使用
菜单选项
下拉菜单

1-2-2 快捷键的使用
访问键
快捷键

1-3-1 打开及移动工具栏
1
2
3

1-3-2 关闭工具栏
单击此按钮关
闭工具栏

1-4-1 启动向导
Visual FoxPro提供了24 种交互式的向导(Wizard),可以帮助用户快
速制作出各种应用程序对象。包括:数据表格、表单、报表、标签、查询等。
选择要启动的向导

1-4-2 向导的使用法则
预览效果
联机帮助信息
回到前一
个步骤
进入下
一个步骤

1-10-1 一般帮助信息
Visual FoxPro的帮助系统是一种在线帮助系统。按下【F1】键,便
会立即显示目前所在环境的联机帮助。

1-10-2 从网络中取得帮助
Visual FoxPro还具有直接从Microsoft网站得到联机帮助信息的功能。
1
2
第二章 数据库的创建与维护








2-1
2-2
2-3
2-4
2-5
2-6
2-7
2-8
数据库的先期规划与设计
开始创建数据库与表
修改表的结构
使用浏览窗口新增、修改与删除数据记录
浏览窗口的操作技巧
设置数据字典信息
用命令方式创建表
如何删除数据库文件与表文件

2-1 数据库的先期规划与设计




2-1-1
2-1-2
2-1-3
2-1-4
数据库的结构
表的结构
设置默认磁盘目录
设置搜索路径

2-2 开始创建数据库与表




2-2-1
2-2-2
2-2-3
2-2-4
创建一个新的数据库
创建一个新的表
输入新数据记录
关闭数据库设计器与数据库

2-4 使用浏览窗口新增、修改与删除数据记录




2-4-1
2-4-2
2-4-3
2-4-4
打开浏览窗口
修改数据记录
新增数据记录
删除数据记录

2-6 设置数据字典信息








2-6-1
2-6-2
2-6-3
2-6-4
2-6-5
2-6-6
2-6-7
2-6-8
字段标题
字段注释
格式化输入输出
字段的默认值
设置字段与类别的对应关系
字段的验证规则与错误信息
数据记录的验证规则与错误信息
表的说明

2-8 如何删除数据库文件与表文件


2-8-1 删除表文件
2-8-2 删除数据库文件

2-1-1 数据库的结构
数据库文件
(由.dbc、.dcx 与.dct 三个文件组成)
数据表文件
连接定义
(.dbf)
(Connection)
数据字典信息
(DataDictionary)
本地视图
存储过程
(Local View)
远程视图
(Stored Procedure)
(Remote View)

2-1-2 表的结构
表的数据结构
(Structure)
字段(Field)
表的数据记录
(Record)

2-1-2 表的结构
1.字段名称
一个表最多可以有128个字段,这些字段分别用以存储不同性
质的数据。
•
数据库表的字段名称最长可达128个字符。其中可以是汉
字、英文字母、数字与下划线,但是数字与下划线绝对不
能是第一个字符。
•
一个表中的字段名不能重复。

2-1-2 表的结构
数据类型
代表字母
数据范围
字符类型 (Character)
C
任何字符。最多可存储 254 个字符
数值类型 (Numeric)
N
-0.9999999999E+19~0.9999999999E+20
浮点数类型 (Float)
F
-0.9999999999E+19~0.9999999999E+20
货币类型 (Currency)
Y
字段的数据类型决定此
字段所存储数据的特性。
-922337203685477.5807~
922337203685477.5807
整型类型 (Integer)
I
-2,147,483,647~2,147,483,647
双精度类型 (Double)
B
+/-4.94065645841247-324~+/1.79769313486232E308
Visual FoxPro 总共提
供13种数据类型。
日期类型 (Date)
D
01/01/100~12/31/9999
日期时间类型
(DateTime)
T
01/01/100 00:00:00 AM~12/31/9999
11:59:59 PM
逻辑类型(Logical)
L
Ture(.T.) 或 False(.F.)
备注类型(Memo)
M
仅受限于可使用的内存容量
通用类型(General)
G
仅受限于可使用的内存容量
2. 字段的数据类型
字符类型 (二进制)
任何字符
备注类型 (二进制)
仅受限于可使用的内存容量

2-1-2 表的结构
3. 字段的宽度与小数位数
固定宽度为 8的字段类型
1
日期类型
日期时间类型
货币值类型
固定宽度为 1的字段类型
逻辑类型
固定宽度为 4的字段类型
整型类型
2
双精度数类型
备注类型
3
通用类型

2-1-2 表的结构
4. 字段能否接收NULL值
是否选定字段为NULL值,可以决定该字段中的数据能否是未知的。
•
可以接收NULL值,代表此字段中的数据可以是未知的;
•
不能接收NULL值,代表此字段中的数据不可以是未知的。
注意最容易犯的错误有以下几项:
1.
2.
3.
4.
将差距很大的数据主题集合在一个表内。
表中拥有一些无意义的字段。
表中拥有一些多余的字段。
表中存在大量冗余数据。

2-1-3 设置默认磁盘目录
Visual FoxPro的默认磁盘目录为安装目录。改变默认磁盘目录的方法有三种:
1. 利用”选项”对话框
2. 使用设置命令
3. 使用磁盘目录选择命令

2-1-3 设置默认磁盘目录
1. 利用”选项”对话框
1
打开”文件
位置“选项
卡
选中”默
认目录
“选项
单击”修
改“按钮
2
3

2-1-3 设置默认磁盘目录
2. 使用设置命令
您希望的默
认磁盘目录

2-1-3 设置默认磁盘目录
3. 使用磁盘目录选择命令
您希望的默
认磁盘目录
Visual FoxPro 所提
供的 MD、RD和CD 命令
可让您直接在 Visual
FoxPro 中创建目录、删
除目录和选择目录。使用
方式与MS-DOS模式下的
用法基本相同。

2-1-4 设置搜索路径
所谓的搜索路径也就是说可以事先定义一系列的目录,当 Visual
FoxPro在默认磁盘目录中无法找到所要的文件时,便会自动到这些目
录中搜索。
1. 利用”选项”对话框
2. 用设置命令

2-1-4 设置搜索路径
1. 利用”选项”对话框
1
打开”文件
位置“选项
卡
选中”搜
索目录
“选项
单击”修
改“按钮
2
3
搜索路径。 各磁盘
目录名称间必须以
分号分隔

2-1-4 设置默认磁盘目录
2. 使用设置命令
您希望的搜
索路径

2-2-1 创建一个新的数据库
单击”新
建文件
“按钮
新建文件名
1
2
3

2-2-1 创建一个新的数据库
新数据库
文件名
4

2-2-1 创建一个新的数据库
数据库文件包括3个文件
.dbc数据库文件
.dct数据库备注文件
.dcx数据库索引文件

2-2-2 创建一个新的表
1. 设计
表
Student
的结构
字段编号
字段名称
字段类型
字段宽度
1
身份证号码
字符型
15
2
学生姓名
字符型
12
3
性别
逻辑型
1
4
家长姓名
字符型
12
5
家庭住址
字符型
41
6
邮政编码
字符型
6
7
电话号码
字符型
10
8
出生日期
日期型
8
9
身高
数值型
5
10
体重
数值型
5
11
血型
字符型
3
12
照片
通用型
4
13
自传
备注型
4

2-2-2 创建一个新的表
新建表文
件名程
2. 打开表设计器
1
单击”新
建表“按
钮
3
2

2-2-2 创建一个新的表
3.
定
义
表
结
构
字
段
信
息
能够接收
NULL值标记

2-2-3 输入新数据记录
输入数据
选中该项
后才能输
入汉字

2-2-3 输入新数据记录
记录号
身份证号码
学生姓名
性别
家长姓名
家庭住址
邮政编码
1
110102123456781
许建仁
.T.
许一强
北京市永安门126号
100027
2
110192145889992
杨宏茂
.T.
杨大为
北京市亚运村 7楼1单元605
100039
3
110236856488550
林惠如
.F.
林荣发
北京市花园路5号
100112
4
110120188556668
张欲丰
.T.
张修为
北京市广安门路2 巷 45 号
100086
5
120129123654988
陈一年
.T.
陈甘霖
天津市春日路 52 号
300128
6
110198478255657
白东铭
.T.
白东进
北京市成府路路 170 号
100206
7
233455211584226
黄忆凤
.F.
黄三元
上海浦东新兴路 7号
200318
8
121212223654985
林永晁
.T.
林家邦
广州市南海路12号东
072216
9
232223321554484
许昌仁
.T.
许达夫
北京市东四十条116 号
100119
10
121672174360253
邓一如
.F.
邓桂林
北京市中关园5号 4 楼
100234

2-2-3 输入新数据记录
双击编
辑照片
电话号码
出生日期
身高
体重
血型
照片 (位图文件)
自 传
010 4445555
73/03/13
168.5
60.0
A
alex1.bmp
memo
010 1234564
74/02/08
175.0
65.0
A
alex2.bmp
memo
010 2222222
010 5558866
022 5551212
010 5432111
031 5876543
070 5554545
010 8445454
010 2543232
75/06/25
73/02/07
74/02/14
74/05/15
74/11/10
75/05/10
74/12/24
73/08/02
167.0
170.5
165.0
178.0
170.0
180.0
168.5
159.0
59.0
74.0
60.0
80.0
65.0
70.0
64.0
49.0
B
AB
O
O
RH+
RHO
B
alex3.bmp
alex4.bmp
alex5.bmp
alex6.bmp
alex7.bmp
alex8.bmp
alex9.bmp
alex10.bmp
memo
memo
memo
memo
memo
memo
memo
memo
双击编
辑自传

2-2-3 输入新数据记录
打开图像文
件后将它复
制下来
3
1
在Visual
FoxPro中粘
贴该图像
2
按【Ctrl + W】
键该图像

2-2-3 输入新数据记录
我属牛,性格也像牛
备注字段
编辑窗口

2-2-4 关闭数据库设计器与数据库
2
数据库仍然
打开
关闭数据设
计器
1
3
输入命令关
闭数据库

2-3 修改表结构
选择要
修改的
表
1
2

2-3 修改表结构
修改表
结构
1
选择”修
改“菜单
项
2

2-4-1 打开浏览窗口
表Student的
浏览窗口结构
1
选择”浏
览“菜单
项
2

2-4-2 修改数据记录
双击照片后打开图
像编辑软件
1
双击第二项记录的”
照片“字段后打开
通用字段编辑窗口
2

2-4-3 新增数据记录
2
1
新增的空数据记录

2-4-4 删除数据记录
选中后下次打开浏
览窗口带删除记号
的记录将隐藏
按【Ctrl + T】键
记录删除框变黑

2-5 浏览窗口的操作技巧
1. 调整字段显示的位置顺
序
3
1
移动后
的字段
选中要移动
的字段标题
移动到目
标位置
2

2-5 浏览窗口的操作技巧
2. 改变字段的显示宽度
拖动分隔线
改变字段的
显示宽度

2-5 浏览窗口的操作技巧
3. 打开或关闭浏览窗口中的分隔线
不显示分
隔线

2-5 浏览窗口的操作技巧
4. 浏览模式与编辑模式的切换
2
1
3
浏览模式
编辑模式

2-5 浏览窗口的操作技巧
5. 将浏览窗口分割成两个窗口
分割为
两个窗
口
1
2

2-5 浏览窗口的操作技巧
切换编
辑窗口
5. 将浏览窗口分割成两个窗口
3
1
选中要切
换的窗口
2

2-6 设置数据字典信息
字段属性
表的属性

2-6-1 字段标题
英文字段名称
中文字段标题
中文字段标题

2-6-2 字段注释
要添加注释
的字段
添加字段注释

2-6-3 格式化输入输出
指定输入
输出格式

2-6-3 格式化输入输出
!
!!!!!!!!!!
格式化后,将只
能输入10个字
母,且输入的字
母会被自动转
换为大写字母

2-6-4 字段的默认值
某些字段设置默认值,默认值可以节省数据输入时间。设置字段默认值,
应当注意:
1. 所设置默认值的类型必须与该字段的数据类型相同。
2. 字段的默认值不可与验证规则相违背。
默认值

2-6-5 设置字段与类别的对应关系
创建用来编辑与显示字段数据的控件,最快速的方法便是直接将数
据环境数据表中的字段直接拖放至表单上。而控件的类型是由该字段的
数据类型来决定的。

2-6-6 字段的验证规则与错误信息
设定的验
证规则
基本工资必须大于 1000
错误提示信息
设定的错误提
示许信息

2-6-7 数据记录的验证规则与错误信息
数据记录验证
与字段验证的用途
是一样的,惟一的
差别是数据记录的
验证规则是针对一
项记录中某些字段
的运算结果来进行
检查,而字段的验
证规则是针对一个
字段来进行检查。
验证规则和错
误提示信息

2-6-8 表的说明
验证规则和错
误提示信息
内部员工信息表

2-7 用命令方式创建表
CREATE TABLE 命令
语法
表名
自由表
CREATE TABLE|DBF TableName [FREE]
(FieldName1 FieldType[(nFieldWidth[,nPrecision])] [,FieldName2 ...])
字段名
范例
字段类型
字段长度
小数点位
数

2-7 用命令方式创建表
ADD TABLE 命令
自由表通常是在程序中作为暂时保存数据之用利用 ADD TABLE
命令可以将一个自由表加至活动数据库中。
范例
要将自由表加
至数据库中,
必须先将它关
闭

2-8-1 删除数据表
1. 删除数据库
直接使用“Windows 资源管理器”或 MS-DOS 模式的 DEL 命
令删除表文件,将导致数据库中对此表文件的参考数据无效,使数据库
无法使用。因此在删除数据库表的同时,必须将数据库中相应的参考数
据一并删除。
将表移出数
据库之外成
为自由表
彻底删除表及其 .dbf 文件、
相关的备注文件 .fpt与索
引文件 .cdx 。

2-8-1 删除数据表
1. 删除数据库
范例
用REMOVE TABLE 命令移出数据库。
表 MyTable 被移出数
据库而成为自由表
范例
用 DROP TABLE 命令,或加入关键字 DELETE 的 REMOVE
TABLE 命令将数据库表从磁盘上删除。

2-8-1 删除数据表
1. 删除数据库
范例
在 DROP TABLE 或 REMOVE TABLE ... DELETE 命令
中再加入关键字 RECYCLE,可将表移至回收站 。
将表移到
回收站

2-8-1 删除数据表
2. 删除自由表
由于自由表文件是一个完全独立的文件,因此您可以使用任何您所知道的
文件删除方式来删除它,我们通常采用下列两种方式:
•
•
使用“Windows 资源管理器”或 MS-DOS 模式的 DEL 命令来删除。
在 Visual FoxPro 中使用 ERASE 命令来删除。
范例
在使用上述两种方式删除自由表文件时,必须注意下列事项:
1.在删除表文件前,必须先将它关闭。
2.如果此表文件拥有相关的备注文件与索引文件,切记将这些文件一并删除。

2-8-2 删除数据表文件
使用 DELETE DATABASE 命令来删除数据库文件,才是最正确且快速的方法。
将 LocalPub 的数据库文件
.dbc、.dcx 与 .dct 从磁盘
上删除并自动将内含的数据库
表移出成为自由表。
将 LocalPub数据库的各类文
件 .dbc、.dcx 与 .dct 及隶属此
数据库的各个表的.dbf文件、备注
文件.fpt、索引文件.cdx等一并删
除。
第三章 数据记录的维护操作




3-1
3-2
3-3
3-4
数据表的打开与选用
数据表的显示
数据记录的查询
数据表的维护与编辑

3-1 数据表的打开与选用





3-1-1
3-1-2
3-1-3
3-1-4
3-1-5
数据表的打开和关闭
工作区的概念与多表的使用
表的别名
直接操作非当前工作区的字段
重复打开同一个表

3-2 数据表的显示


3-2-1 显示表的结构
3-2-2 显示表的记录

3-3 数据记录的查询


3-3-1 记录指针的操作
3-3-2 数据记录的搜索

3-4 数据表的维护与编辑


3-4-1 数据替换操作
3-4-2 记录的删除

3-1 数据表的打开和关闭
OPEN 命令 和 USE命令
语法
OPEN DATABASE <FileName>[EXCLUSIVE][SHARED]
USE [[DatabaseName.]TableName][IN WorkArea][ALIAS
TableAlias][EXCLUSIVE][SHARED] [NOUPDATE]
OPEN命令用于打开数据库,USE命令用于打开数据表。
数据库
文件名
范例
表的
名称

3-1-1 数据表的打开和关闭
没有打开
数据库文
件时
已经打开
数据库文
件时

3-1-1 数据表的打开和关闭
关闭数
据库

3-1-2 工作区的概念与多表的使用
Visual FoxPro最多可以同时打开32767个数据表,每个打开的表
都要在存储器中开辟一个存储区域,我们把这个存储区域叫做工作区。
SELECT 命令
语法
SELECT nWorkArea|cTableAlias | cWorkArea
工作区
编号
工作区
别名
工作
区名

3-1-2 工作区的概念与多表的使用
范例
同时打开表student及scores。
用SELECT命令
用USE命令

3-1-2 工作区的概念与多表的使用
范例
同时打开表student及scores。
用SELECT命令
用USE命令

3-1-2 工作区的概念与多表的使用
若当前工作区是1号工作区,如果希望工作区2位于当前
工作区,可以用SELECT命令实现。
用SELECT命令

3-1-2 工作区的概念与多表的使用
选择未被占用的最小号工作区可以使用下列两种方法:
用 SELECT 0 命令
用 IN 选项

3-1-3 表的别名
SELECT命令可用工作区中已打开表的别名(Alias)来选择工作区。
而表的别名可以在用USE命令打开表时指定,若不指定则默认为表原名
就是别名。

3-1-4 直接操作非当前工作区的字段
Visual FoxPro也允许您在当前工作区,直接操作其他工作区中已
打开表的字段。但是请使用下面的引导格式:
别名.字段名称 或 别名—>字段名
制定字段出处

3-1-5 重复打开一个表
Visual FoxPro允许您在不同的工作区中,同时打开同一个表文件。
这种操作必须在USE命令中增加选项AGAIN。
同时在三个
工作区中打
开表
student

3-2-1 显示表的结构
在命令窗口中键入命令:
LIST STRUCTURE 或 DISPLAY STRUCTURE
可以查阅当前表的结构,LIST命令以连续输出方式显示表结构,DISPLAY
命令以分页方式显示表结构。
列出表
student 的
结构

3-2-1 显示表的结构
要将表的结构用打印机打印出来,只需在 LIST STRUCTURE 命令中
加入 TO PRINTER 关键字即可。
打印表
STUDENT

3-2-1 显示表的结构
要将表的结构存储到一个文本文件中,在LIST STRUCTURE 命令中
加入 TO FILE FileName 参数。
将表student的
结构复制到文本
文件test.TXT中

3-2-2 显示表的记录
如果您想要列出当前表的数据记录,可以使用下列两个命令:
1. LIST 命令
语法
LIST
[[FIELDS] FieldList]
[Scope][FOR lExpression1][WHILE lExpression2]
[OFF]
[NOCONSOLE]
[NOOPTIMIZE]
[TO PRINTER[PROMPT]|TO FILE FileName

3-2-2 显示表的记录
2. LIST 命令
语法
DISPLAY
[[FIELDS] FieldList]
[Scope][FOR lExpression1][WHILE lExpression2]
[OFF]
[NOCONSOLE]
[NOOPTIMIZE]
[TO PRINTER[PROMPT]|TO FILE FileName

3-2-2 显示表的记录
1. 显示指定字段内容
LIST命令的FIELDS FieldList 参数(关键字FIELDS可省略),其中
FieldList 即为字段名称系列,而各个字段名称之间请使用逗号分隔。
以逗
点分
隔

3-2-2 显示表的记录
2. 指定记录显示范围
LIST命令的Scope参数可以限定显示记录的范围。
Scope 参数的可设定值
显示范围
RECORD nExpr
表示指定仅显示第nExpr条记录
NEXT nExpr
表示指定仅显示从当前记录开始的nExpr条记录
REST
表示指定从当前记录开始到表结尾的全部记录
ALL
表示指定显示所有的数据记录
显示表
student的
第5条数据
记录。

3-2-2 显示表的记录
2. 指定记录显示范围
显示表
student中第
1条至第3条数
据记录。
显示表student
中第5条数据记录
的“学生姓名”
及“家庭住址”
字段。

3-2-2 显示表的记录
3. 显示满足条件的全部记录
在LIST命令FOR lExpression1的条件,可指定范围内查找符合
lExpression1条件的记录,而且只有这些符合条件记录会被LIST 命
令显示出来。
将表student中,
学生姓名为“陈
一年”的记录显
示出来。

3-2-2 显示表的记录
3. 显示满足条件的全部记录
将表student中,
显示家庭住址字
段中包含“北京
市”的记录显示
出来。
将表scores中,
英文成绩介于
70~80间的记录
显示出来。

3-2-2 显示表的记录
3. 显示满足条件的全部记录
显示表
student中,
出生日期大于
01-01-1976
的记录。
将表student中男
学生的姓名字段
值显示出来。

3-2-2 显示表的记录
4. 显示满足条件的连续记录
在LIST命令中,选项WHILE会从当前记录开始,逐一测试记录是否满足
条件 lExpression2。
使用FOR选
项的程序
使用WHILE
选项的程序

3-2-2 显示表的记录
5. 不显示记录
在LIST命令中加入选项OFF,则记录号将被隐含。
隐藏记录号

3-2-2 显示表的记录
6. 打印输出
在LIST命令中加入选项TO PRINTER,LIST命令将会在把记录
输出到屏幕的同时,也送到打印机打印出来。
打印记录

3-2-2 显示表的记录
7. 建立一个文本文件
在LIST命令中加入TO FILE FileName选项,LIST 命令的输出
将会存储至指定的文本文件内。
输出到
“test.txt”
文本文件

3-2-2 显示表的记录
8. DISPLAY命令的差异
LIST命令默认操作范围是所有数据记录 (即 ALL),而DISPLAY
命令的默认操作范围是当前数据记录 (即 NEXT 1)
当表中的数据记录太多,无法用一屏幕显示完时,DISPLAY ALL命令
会以分页方式显示,并提示用户继续。而LIST命令则会连续显示,直到
最后一行记录在屏幕上显示出来为止。

3-2-2 显示表的记录
9. 用浏览窗口显示记录
执行BROWSE命令可以启动浏览窗口 。
1
2

3-2-2 显示表的记录
9. 用浏览窗口显示记录
仅浏览这些
字段内容
操作符 !
代表否定
的意思

3-3-1 记录指针的操作
当我们输入表记录时,按照记录输入的先后次序,系统自动为每一
条记录赋予了记录号。表中也存在着一个与“记录号”对应的指针。
随着记录操作的变动,记录指针也随之变化。任何时候,记录指针总
是指向某一条记录,这条记录就叫做当前记录。使用USE命令打开表
以后,记录指针指向第一条记录。

3-3-1 记录指针的操作
GO 命令
语法
工作区数
字编号
记录号
GO nRecordNumber [IN nWorkArea|IN cTableAlias]
GO TOP|BOTTOM [IN nWorkArea|IN cTableAlias]
第一条
记录
最后一
条记录
工作区名
或别名

3-3-1 记录指针的操作
GO 命令
转移指针
分别转移
指针至首
尾

3-3-1 记录指针的操作
GO 命令

3-3-1 记录指针的操作
SKIP 命令
语法
记录号
SKIP
[nRecords]
[IN nWorkArea|IN cTableAlias]
工作区数
字编号
选项nRecords为正
数,则记录指针会
从当前记录向下移
动;为负数,则记
录指针会从当前记
录向上移动。
工作区名
或别名

3-3-1 记录指针的操作
SKIP 命令

3-3-1 记录指针的操作
测试函数
RECNO()函数用于查看当前记录号, BOF()函数用于判断记录指针
的位置。如果记录指针已到达起始位,BOF()函数将返回逻辑真值;否则
返回逻辑假值。
范例

3-3-1 记录指针的操作
测试函数
范例

3-3-2 数据记录的搜索
LOCATE 命令
语法
LOCATE FOR lExpression
指定搜
索条件
LOCATE命令找到了满足条件的记录,表示查找操作成功,
执行FOUND()函数将返回真值,而EOF()函数则会返回假值。
反之,FOUND() 函数将返回假值,EOF()函数则会返回真
值。

3-3-2 数据记录的搜索
LOCATE 命令
语法
LOCATE FOR lExpression
指定搜
索条件
LOCATE命令找到了满足条件的记录,表示查找操作成功,
执行FOUND()函数将返回真值,而EOF()函数则会返回假值。
反之,FOUND() 函数将返回假值,EOF()函数则会返回真
值。

3-3-2 数据记录的搜索
LOCATE 命令
将符合条
件的记录
显示在浏
览窗口
将符合条件
的记录一一
显示在编辑
窗口
将符合条件
的记录显示
在浏览窗口

3-4-1 数据替换操作
REPLACE 命令
使替换内容追加到备
注字段中已存在数据
内容的后面
语法
要更新
的字段
名
REPLACE FieldName1 WITH eExpression1 [ADDITIVE]
[,FieldName2 WITH eExpression2 [ADDITIVE]]...
[FOR lExpression]
指定搜
索条件
用来置换对
应字段值的
表达式

3-4-1 数据替换操作
REPLACE 命令
将第5条记录
singer字段的
内容“王大可”
改为“王小可”
REPLACE
命令增加
一条新记
录
REPLACE
命令增加
一条新记
录

3-4-1 数据替换操作
REPLACE 命令
添加新
记录

3-4-2 记录的删除
要删除表中的数据记录有两个步骤:
1. 将所要删除的数据记录标上删除记号“*”。
2. 将那些被标记为“删除”的记录永久地从表中删除。

3-4-2 记录的删除
1. 逻辑删除命令
语法
DELETE
[Scope]
[FOR lExpression]
删除表song中
birthday字段
大于01-011974的记录

3-4-2 记录的删除
2. 彻底删除记录
语法
PACK [MEMO][DBF]
PACK命令可
以将那些被逻
辑删除的记录
实际移出表

3-4-2 记录的删除
3. 恢复逻辑删除记录
利用RECALL命令,我们可以恢复被DELETE命令标示成删除状态的
记录。不过RECALL 命令必须在还没有对表使用PACK命令以前执行,否
则那些被标示为删除的记录早已被实际移出表外。
语法
RECALL
[Scope]
[FOR lExpression]

3-4-2 记录的删除
3. 恢复逻辑删除记录
范例

3-4-2 记录的删除
3. 恢复逻辑删除记录
范例

3-4-2 记录的删除
4. 彻底删除全部记录
使用ZAP命令可一次性将当前表中所有记录彻底删除。数据记
录虽然被删除了,但数据表的结构仍完整地存在。
第四章 索引与查询




4-1
4-2
4-3
4-4
数据表的排序
数据表的索引
数据表记录的搜索
数据表的关系

4-1 数据表的排序



4-1-1 单关键字排序
4-1-2 组合关键字排序
4-1-3 选择性排序

4-2 数据表的索引




4-2-1
4-2-2
4-2-3
4-2-4
索引的类型
索引文件的类型
索引文件的创建
索引的操作

4-3 数据表记录的搜索



4-3-1 SEEK命令
4-3-2 SEEK()函数
4-3-3 完全比较与模糊比较

4-4 数据表的关系




4-4-1
4-4-2
4-4-3
4-4-4
连接方式的分类
创建关系
编辑关系
数据表之间的参照完整性

4-1 数据表的排序
排序(SORT)操作的结果是创建一个新的数据表文件,这个新
文件可以与原来的表文件大小、内容完全一样,但是其中数据记录的
排列顺序经过求重新整理。
索引的目的也是对数据表排序,但是它不会创建一个新的数据表
文件,而是创建一个不能脱离原表独立使用的索引文件。在索引文件
中包含了排序关键字和记录编号字段,系统使索引文件中的关键字值
按要求排序,并通过记录号连接到原表相应记录上。

4-1-1 单关键字排序
SORT 命令
语法
排序
字段
范例
SORT TO TableName
ON FieldName1[/A][/D][/C]
[,FieldName2[/A][/D][/C]...]
[ASCENDING|DESCENDING]
[Scope][FOR lExpression]
[FIELDS FieldNameList]
以“身份证号
码”字段为关
键字段递增排
序后将结果存
入表
test1.dbf中

4-1-1 单关键字排序
SORT 命令
范例
以“性别”为
关键字段进行
递减排序后,
将结果存入表
test2.dbf中。

4-1-2 组合关键字排序
记录以“性别”字段为第一级关键字,按递增排序(即
男性在前女性在后);若遇到性别值相同的记录时,则
以“身高”字段为第二级关键字,按递增排序;若还
有身高值又相同的记录,则以“学生姓名”字段为第
三级关键字,按递增排序(即汉语拼音的顺序)。

4-1-2 组合关键字排序
递减排序
“性别”递减排序 (即
女性在前);“身高”
字段递增排序;“学
生姓名”字段递减排
序

4-1-3 选择性排序
制定排序范
围为前5条记
录
排序条件为身
高大于
170cm的记
录
排序后的新表将只
有这几个字段内容

4-2-1 索引的类型
Visual FoxPro支持4种不同类型的索引
主索引
主索引是能够惟一
地确定数据表中一
条记录的字段,或
字段组合表达式。
候选索引
表中仅能拥有一个
主索引字段,但是
却可以拥有多个候
选索引。其他具备
惟一性验证能力的
字段,就只能指定
为候选索引。
普通索引
惟一索引
普通索引的字段不
要求具有数据的惟
一性;表记录排序
时,会按自然顺序
把关键字段值相同
的记录排列在一起。
惟一索引对关键
字段值的要求与
普通索引一样,
但是在排序时,
它只将相同关键
字值的第一条记
录编入索引中。

4-2-2 索引文件的类型
复合索引文件
结构复合索引文件
独立复合索引文件

4-2-3 索引文件的创建
1. 使用表设计器创建单字段索引
普
通
索
引
设置索引
排序方式

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
普
通
索
引
索引名
称
单击该
按钮

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
普
通
索
引
索引表
达式

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
普
通
索
引
设置筛
选表达
式

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
普
通
索
引
筛选表达
式

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
范例
编号
通过表设计器为数据库Campus的表student创建如下5
个索引项。
索引的名称
索引的类型
关键值表达式
升序或降序
1
身份证号码
主索引
身份证号码
升序
2
学生姓名
普通索引
学生姓名
升序
3
性别
普通索引
性别
降序
4
出生日期
普通索引
出生日期
升序
5
身高
普通索引
身高
降序
6
性别与日期
普通索引
IIF(性别,"T","F")+DTOS(出生日期)
降序

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
单击
输入
索引
名称

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
升序

4-2-3 索引文件的创建
1. 使用表设计器创建字段表达式索引
完成的
索引项
数据表的字段
数据表的索引
标有钥匙符号
的为主索引

4-2-3 索引文件的创建
2. 使用INDEX命令创建字段表达式索引
语法
关键字
表达式
索引的标
识名称
INDEX ON eExpression TAG TagName [OF CDXFileName]
[FOR lExpression]
[ASCENDING|DESCENDING]
[UNIQUE|CANDIDATE]
指明新建索引
[ADDITIVE]
项将存放的独
立复合索引文
件名

4-2-3 索引文件的创建
2. 使用INDEX命令创建字段表达式索引
范例
用INDEX命令为数据库Campus的表student创建下表的6个索
引项,并将这些索引项添加到结构复合索引文件student.cdx中。
索引的名称
索引的类型
表达式
升序或降序
身份证号码
候选索引
身份证号码
升序
学生姓名
普通索引
学生姓名
升序
性别
普通索引
性别
降序
出生日期
普通索引
出生日期
升序
身高
普通索引
身高
降序
性别与日期
普通索引
IIF(性别,"T","F")+DTOS(出生日期)
降序

4-2-3 索引文件的创建
2. 使用INDEX命令创建字段表达式索引
范例一

4-2-3 索引文件的创建
2. 使用INDEX命令创建字段表达式索引
范例二

4-2-3 索引文件的创建
范例三
2. 使用INDEX命令创建字段表达式索引

4-2-4 索引操作
1.打开独立复合索引文件
(1)与数据表同时打开
语法
范例
USE TableNAME INDEX FieldName
独立复合
索引文件
名

4-2-4 索引操作
1.打开独立复合索引文件
(2)单独打开
语法
范例
SET INDEX TO FieldName
独立复合
索引文件
名

4-2-4 索引操作
2.关闭独立复合索引文件
语法
SET INDEX TO
CLOSE INDEXES
范例

4-2-4 索引操作
3.设置当前索引
(1)命令方式
语法
指定当前索引的关
键字 ,TAG可以省
略
格式1:SET ORDER TO [TAG] < TagName>
[OF CDXFileName] [ASCENDING | [DESCEDING]
格式2:USE <TableName> ORDER [TAG] < TagName >
[OF CDXFileName] [ASCENDING | ESCEDING]
指明索引项的来源

4-2-4 索引操作
3.设置当前索引
(1)命令方式
范例一

4-2-4 索引操作
3.设置当前索引
(2)对话框选择方式
范例一

4-2-4 索引操作
3.设置当前索引
范例二
按身高索引

4-2-4 索引操作
3.设置当前索引
范例三
按身份证
号码排序

4-2-4 索引操作
3.设置当前索引
范例三
按学生姓
名的汉语
拼音排序

4-2-4 索引操作
3.设置当前索引
范例三
按性别
排序

4-2-4 索引操作
3.设置当前索引
范例三
按出生
日期排
序

4-2-4 索引操作
3.设置当前索
引
范例三
按身高
排序

4-2-4 索引操作
4.索引项的删
除
(1)取消当前索引设置
语法
范例
SET ORDER TO 0 或
SET ORDER TO

4-2-4 索引操作
4.索引项的删
除
(2)删除索引标识
在打开数据表文件后,
对于结构复合索引文件
或独立复合索引文件,
都可以使用删除命令
DELETE TAG ALL |
< TagName1 >[,<
TagName2>]……删除
索引项
选中索引项后
单击“删除”
按钮

4-2-4 索引操作
5. 重建索引
执行REINDEX命令可以更新已有的索引。
范例一
因为此时仅有结构
化复合索引文件
student.cdx被打
开,所以会更新
student.cdx 的所
有索引

4-2-4 索引操作
5. 重建索引
执行REINDEX命令可以更新已有的索引。
范例二
因为 student.dbf
与 stucdx.cdx 都
被打开,所以会更
新stucdx.cdx 中
所有的索引

4-3-1 SEEK命令
SEEK命令就是速度极快的索引查询命令。
语法
查询表达式
SEEK eExpression
[ORDER nIndexNumber|IDXIndexFileName|[TAG]
TagName [OF CDXFileName]
[ASCENDING|DESCENDING]]
[IN cTableAlias|nWorkArea]
指定工作区

4-3-1 SEEK命令
范例一
范例二
使用SEEK命令搜索表employee中,薪水为38079的记录。
第五章 基本程序设计






5-1
5-2
5-3
5-4
5-5
5-6
程序编辑环境
基本数据元素
程序结构控制命令
预处理语句
过程和用户自定义函数
私有变量、局部变量与全局变量

5-1 程序编辑环境


5-1-1 程序编辑窗口的基本操作
5-1-2 创建良好的程序编写环境

5-2 基本数据元素







5-2-1
5-2-2
5-2-3
5-2-4
5-2-5
5-2-6
5-2-7
常量 (Constants)
变量 (Memory Variables)
表达式 (Expressions)
运算符 (Operators)
函数 (Functions)
函数的执行方式
基本输出命令

5-3 程序结构控制命令






5-3-1
5-3-2
5-3-3
5-3-4
5-3-5
5-3-6
简单条件语句
嵌套式条件语句
多重条件语句
基本循环语句
计数循环语句
数据表扫描循环语句

5-4 预处理语句


5-4-1 编译常量
5-4-2 条件编译

5-5 过程和用户自定义函数







5-5-1
5-5-2
5-5-3
5-5-4
5-5-5
5-5-6
5-5-7
过程与自定义函数的构成
过程与自定义函数的调用
参数接收
参数传递中的传值与传址
过程文件
存储过程
过程或用户自定义函数的快速定位

5-6 私有变量、局部变量与全局变量



5-6-1 私有变量
5-6-2 全局变量
5-6-3 局部变量

5-1-1 程序编辑窗口的基本操作
1. 打开程序编辑窗
口
Visual FoxPro源程序文件是一个以(.PRG)为扩展名的文本文件。
(1)命令方式
格式: MODIFY COMMAND [程序文件名]
忽略此选
项,系统
默认以
“程序1”
为程序文
件名
程序文件名
程序编辑窗口

5-1-1 程序编辑窗口的基本操作
1. 打开程序编辑窗
口
Visual FoxPro源程序文件是一个以(.PRG)为扩展名的文本文件。
(2)可视化方式

5-1-1 程序编辑窗口的基本操作
1.程序文件的运行
独立程序可以用:菜单、工具栏、项目管理器和命令四种方式运行。
(1)菜单方式
编译后产
生目的文
件 (.FXP)
选择扩展
名是.prg
程序文件

5-1-1 程序编辑窗口的基本操作
1.程序文件的运行
独立程序可以用:菜单、工具栏、项目管理器和命令四种方式运行。
(2)在编辑器中执行
编译后产
生目的文
件 (.FXP)
选择扩展
名是.prg
程序文件

5-1-1 程序编辑窗口的基本操作
1.程序文件的运行
独立程序可以用:菜单、工具栏、项目管理器和命令四种方式运行。
(3)在项目管理器中执行
打开项目管理器窗口,选定需要运行的程序文件,单击“运
行”按钮,运行该程序。

5-1-1 程序编辑窗口的基本操作
1.程序文件的运行
独立程序可以用:菜单、工具栏、项目管理器和命令四种方式运行。
(4)命令方式
程序执
行结果
运行程
序命令

5-1-2 创建良好的程序编写环境
1.语句颜色与字体设置
设置
语法
着色
样式

5-1-2 创建良好的程序编写环境
2. 修饰程序代码
所谓修饰程序代码,就是要指
定字母大写及缩进的样式,使
程序层次结构分明,容易看出
程序的逻辑结构。
设置
修饰
样式

5-1-2 创建良好的程序编写环境
3. 设置程序编辑窗口的属性
通过设置程序编辑窗口的属性,可以优化程序编辑窗口,使之
更符合您的使用习惯。
设置
编辑
窗口
样式

5-1-2 创建良好的程序编写环境
3. 设置程序编辑窗口的属性
通过设置程序编辑窗口的属性,可以优化程序编辑窗口,使之
更符合您的使用习惯。
行/列位置和修改状态
设置显
示行列
位置信
息

5-2-1 常量 (Constant)
常量 (Constant) 是一个固定的数据项,或者是在操作过程中
不能改变的数据。
常 量
字符型常量
数值型常量
货币型常量
日期型常量
日期时间型常量
保存字符串
(常量)
保存数值及
小数点
保存小数点
固定为 4
位的货币值
保存按照日
期格式写成
的日期值
保存按照
日期格式
写成的日
保存按照
日期时间
格式写成
的日期时
间值期值
逻辑型常量
逻辑真
值 .T. 或逻
辑非 .F

5-2-2 变量 (Memory Variables)
所谓变量就是允许在操作过程中取不同值的数据元素。变量正
是我们用变量名作为标记,在计算机内存中设置的某个存储区域。所
以这类变量又常常叫做内存变量,它在每次清除内存或退出Visual
FoxPro时自动释放。
Visual FoxPro 的变量的名最长可由254 个字符组成,变量
名可以是字母、数字、符号或汉字,但是绝对不能与命令名、函数
名等系统保留字相同。

5-2-2 变量 (Memory Variables)
变量的赋值方法
语法
1. STORE eExpression TO 变量表名
2. 变量 = eExpression
eExpression表示任
何数据类型的表达式

5-2-2 变量 (Memory Variables)
变量的赋值方法
范例一
用?命令读取并显示
变量mystring的内容
以及使用DISPLAY
MEMORY命令来查看
当前内存变量的概况
将字符串 "I
Love Visual
FoxPro" 赋值变
量 mystring

5-2-2 变量 (Memory Variables)
变量的赋值方法
如果字符串本身就包含单引号 (‘) 或双引号 (“),请以下列三种方式之一来引用此字
符串:
(1)将字符串包含在一对中括弧中。例如:
STORE [He's going to school.] TO mystring1
(2)如果字符串本身包含单引号 ('),可将字符串包含在一对双引号
(") 中;如果字符串本身包含双引号 ("),可将字符串包含在一对单引号(') 中。
例如:
STORE "He's going to school." TO mystring1
(3)如果字符串本身既包含单引号 (') 又包含双引号 ("),则必须将
字符串包含 在一对中括弧中。例如:
STORE [请参阅 "应用实务篇" 中的 '超加速应用程序' 一节] TO mystring3

5-2-2 变量 (Memory Variables)
变量的赋值方法
范例二
将日期
1998/11/07
赋给变量
myday
1、要赋一个空的日期值,请采用下列方式之一:
MyBlankDate1 = {}
MyBlankDate2 = { }
MyBlankDate3 = {/}
MyBlankDate4 = { / / }
2、不论是日期或日期时间类型,下列规则都适用:
·{00:00:00 AM} 与 {12:00:00 AM} 是相同的,都代表午夜。
·{00:00:00 PM} 与 {12:00:00 PM} 是相同的,都代表正午。
·{00:00:00} ~ {11:59:59} 的间隔秒数与 {12:00:00 AM} ~
{11:59:59 AM} 的间隔秒数是相同的。
·{12:00:00} ~ {23:59:59} 的间隔秒数与 {12:00:00 PM} ~
{11:59:59 PM} 的间隔秒数是相同的。

5-2-2 变量 (Memory Variables)
变量的赋值方法
范例三
数值 206 赋给
变量
mynumber
范例四
将逻辑非 .F. 赋
给变量 judge

5-2-2 变量 (Memory Variables)
变量的赋值方法
范例五
将货币值
30000 赋给变
量 curvar
范例六
将日期时间值
{1998/01/12
02:59:01 PM}
赋给变量
mydatetime

5-2-2 变量 (Memory Variables)
清除内存变量的方法
语法
清除内存中所有的变
1. CLEAR ALL
2. RELEASE 变量名表
清除指名的变量
或
RELEASE ALL [LIKE|EXCEPT Skeleton]
清除符合 Skeleton 格式
的变量除指名的变量

5-2-2 变量 (Memory Variables)
清除内存变量的方法
范例

5-2-2 变量 (Memory Variables)
保存变量的方法
如果需要长期保存内存变量,可以将当前内存中的变量作为一个扩展
名为 .MEM 的文件保存在外存储器中,在使用时再调用。
语法
1. SAVE TO FileName|TO MEMO MemoFieldName [ALL LIKE|
EXCEPT Skeleton]
2. RESTORE FROM FileName|FROM MEMO MemoFieldName
[ADDITIVE]

5-2-2 变量 (Memory Variables)
保存变量的方法
范例
1
变量
赋值
2
保存变量
后清除内
存
调用
变量
3

5-2-3 表达式 (Expressions)
表达式是由运算符连接起来的字段名、函数、变量或常量的组合。
在Visual FoxPro中允许有6种类型的表达式:
<expC> 或是以小写字母 c 开头 (例如:cTableAlias),表示字符表达式。
<expN> 或是以小写字母 n 开头 (例如:nWorkArea),表示数值表达式。
<expY> 或是以小写字母 y 开头,表示货币表达式。
<expD> 或是以小写字母 d 开头,表示日期表达式。
<expT> 或是以小写字母 t 开头,表示日期时间表达式。
<expL> 或是以小写字母 l 开头,表示逻辑表达式。
<expr> 或是以小写字母 e 开头,表示任何类型的表达式。

5-2-3 表达式 (Expressions)
范例一
范例二

5-2-4 运算符 (Operators)
运算符的类型
字符串运算符
算术运算符
日期及
日期时间运算符
关系运算符
逻辑运算符

5-2-4 运算符 (Operators)
1. 字符串运算符
符号
+
操 作 功 能
连接两个字符串
-
连接两个字符串,但去除第一个字符串的尾部空格
$
检验第一个字符串是否包含于第二个字符串中
1. 用“+”号连接两个字符串时,会严格保持两个字符串的形式。
2. “-”号连接两个字符串时,系统会删除前一个字符串的尾部空格,
并移到后一个字符串的尾部。

5-2-4 运算符 (Operators)
1. 字符串运算符

5-2-4 运算符 (Operators)
2.算术运算符
进行四则运算用的运算符,称为“算术运算符”,它具有不同的
运算优先级,这些与数学中使用的四则运算符几乎相同。格式或括弧
的使用方法也基本相同。
优先级
4
4
2
2
3
1
运算
加法
减法
乘法
除法
计算余数
指数运算
符号
+
*
/
%
** 或 ^
例子
x+y
x-y
x*y
x/y
x%y
x^3 或 x**3
意义
x 加上 y
x 减去 y
x 乘上y
x 除以 y
x 除以 y 的余数
x 的3次方

5-2-4 运算符 (Operators)
2.算术运算符
范例

5-2-4 运算符 (Operators)
3.关系运算符
关系运算符可以实现同类数据元素的比较运算。比如,字符串与
字符串的比较、日期值与日期值的比较及数字与数字的比较等。
运算符
<
>
=
==
<>, #, 或! =
<=
>=
使用例子
x<y
x>y
x=5
IF x= =5
x<>y
x#y
x !=y
x<=y
x>=y
意
义
x比y小
x比y大
将值5 赋予 x
比较 x 是否等于 5
x 不等于 y
x 比 y 小或等于 y
x 比 y 大或等于 y

5-2-4 运算符 (Operators)
3.关系运算符
范例

5-2-4 运算符 (Operators)
4.逻辑运算符
“逻辑运算符”可以实现两个数据元素之间的逻辑运算。逻辑运算
有AND (与)、OR (或)以及NOT(非)三种。
优先级
运算符
使用例子
意义
2
AND
x AND Y
逻辑与(AND)
3
OR
x OR Y
逻辑或(OR)
1
NOT 或 !
!x
逻辑非(NOT)

5-2-4 运算符 (Operators)
4.逻辑运算符
范例

5-2-4 运算符 (Operators)
5.日期与日期时间运算符
“日期与日期时间运算符”就是针对日期与日期时间类型的数据实
现运算的运算符。
运算符
运算
+
相加
-
相减
范
例
tNewTime = tTime1 + nSeconds ==> {12:30:21} + 10
dNewDate = dDate1 + nDays ==> {^1996/12/31} + 10
nSeconds = tTime1 - tTime2 ==> {12:30:21} - {12:30:10}
tNewTime = tTime1 - nSeconds ==> {12:30:21} - 10
dNewDate = dDate1 - nDays ==> {^1996/01/05} - 5

5-2-5 函数 (Functions)
1.
BOF([cTableAlias|nWorkArea])
BOF() 函数用来测试一个数据表的记录指针是否处在文件的起始位置。
BOF() 函数会返回逻辑真值 .T.或逻辑非.F. 。
范例

5-2-5 函数 (Functions)
2. EOF([cTableAlias|nWorkArea])
EOF()函数用于检测当前数据表的记录指针是否已越过最后一条记录。
范例
此时记录指
针位于表的
最后一条记
录,故返回
逻辑非.F.
表示记录指
针位于文件
的结尾处。

5-2-5 函数 (Functions)
3. DATE()
DATE()函数的值是当前系统日期。 DATE() 函数返回的日期的格式为
MM/DD/YY (即 月/日/年),不过此日期的格式可使用 STE CENTURY、
SET DATE 及 SET MARK 等命令来更改。
范例

5-2-5 函数 (Functions)
4. DATETIME()
DATETIME()函数的值是当前系统日期时间。返回的日期的格式为
MM/DD/YY HH:MM:SS AM|PM(即月/日/年 小时:分钟:秒 上午
或下午),不过此日期时间的格式可使用 STE CENTURY、SET DATE、SET
MARK、SET HOURS 及 SET SECONDS 等命令来更改。
范例

5-2-5 函数 (Functions)
5. TIME()
TIME()函数值是当前系统时间。TIME()固定以24小时制返回目前的时
间,也就是其返回值不受SET HOURS命令的影响。
范例

5-2-5 函数 (Functions)
6.
UPPER(cExpression)
UPPER()函数会将字符表达式 cExpression 里所有的小写字母全部转
换为大写字母。
范例

5-2-5 函数 (Functions)
7. LOWER(cExpression)
LOWER()函数会将字符表达式 cExpression 里所有的大写字母全部转
换成小写字母。
范例

5-2-5 函数 (Functions)
8.
CTOD(cExpression)
CTOD()函数可以将字符表达式 cExpression 转换成日期型的值。但是
此处的 cExpression 有其默认格式 “MM/DD/YY” (即月/日/年),使用
SET DATE 和 SET CENTURY 命令可以改变此默认的格式。
范例
以cExpression 给定的日期必须在1/1/100 ~ 12/31/9999的允许日
期范围内。

5-2-5 函数 (Functions)
9.
DTOC(dExpression[,1]) n)
DTOC()函数是一个将日期转换成字符的函数,可返回日期表达式
dExpression 的日期形式的字符串。
范例

5-2-5 函数 (Functions)
9.
DTOC(dExpression[,1]) n)
当前的日期格式如果是MM/DD/YY形式,在函数中增加可选参数 1 以
后,函数DTOC()会将您所给予的日期表达式 dExpression 转换成一个格式
为 YYYYMMDD 的字符串 (即年月日) 并将其返回。
范例

5-2-5 函数 (Functions)
10.
SPACE(nExpression)
SPACE()函数的值是一串空格,空格的个数由参数nExpression的值决
定。参数nExpression所能指定的空格数仅受可使用内存的限制。
范例

5-2-5 函数 (Functions)
11.
LEN(cExpression)
LEN()函数的结果是其中字符表达式cExpression的长度。此表达式可
以是一个字符串、备注字段或是字符型字段名。假如cExpression是一个备
注字段名,LEN()函数将计算该字段长度,并作为结果输出。如果表达式
cExpression 为空字符串,LEN()函数值为零。
范例

5-2-5 函数 (Functions)
12.
LENC(cExpression)
LENC()函数与LEN()函数类似,但是它计算的是参数表达式
cExpression中所拥有的字数而并非字节数。这对于计算中文字符串非常有
利,因为一个汉字需要占用两个字符位置。
范例

5-2-5 函数 (Functions)
13.
TRIM(cExpression)
TRIM()函数的结果是将参数cExpression 值的尾部空格去除后的值。
如果 cExpression里全部是空格,则TRIM()函数返回空字符串。TRIM()函
数与RTRIM()函数完全相同。
范例

5-2-5 函数 (Functions)
14.
LTRIM(cExpression)
LTRIM()函数会删除指定字符串cExpression 里的前置空格。我们经常
将此函数配合 STR()函数一起使用,删除已转换成字符型的数值数据的前置
空格。
范例

5-2-5 函数 (Functions)
15.
ALLTRIM(cExpression)
ALLTRIM()函数可以删除字符表达式cExpression值的前后空格,然后
再返回。
范例

5-2-5 函数 (Functions)
16.
SUBSTR(cExpression[,<expN1>[,<expN2>]])
SUBSTR()函数的值是字符表达式cExpression值中截取的一串字符。
参数<expN1>指定了截取的起始位置,参数<expN2>指定被截取字符串的
长度。如果省略了这两个参数,则输出结果是整个字符串。如果省略了
<expN2>,则会从起始位置截取字符串直到尽头。如果省略了<expN1>,
则截取从第一个字符开始。
范例

5-2-5 函数 (Functions)
17.
STR(<expN1>[,<expN2>[,<expN3>]])
STR()函数可以将数值表达式转换成字符串。此函数会先计算<expN1>
的值,然后将此值转换成长度为<expN2>(如果指定了<expN2>)的字符串;
参数<expN3>可以决定原数值表达式值的小数位数。长度参数<expN2>应
包括小数点及其小数个数。
范例

5-2-5 函数 (Functions)
18.
VAL(cExpression)
VAL()函数可以把字符表达式cExpression的值转换成数值。转换从最左
边的字符开始,直到出现一个非数字形式的字符为止。假如cExpression值的
第一个字符就不是数字形式,则VAL()函数的结果是零。
范例

5-2-6 函数 的执行方法
Visual FoxPro使用单问号命令 "?" 来执行一个函数。也可以使用
等号命令 "="或直接使用函数。这三种方法的差别在于:
• 由于单问号命令 “?” 本身具有“读取并显示”的特性,因此调用、
执
行一个具有“返回值”的函数时,函数的返回值便会显示在屏幕。
•
等号命令 “=” 虽然具备执行的能力,却不具备显示的功能。因此
即使函数具有“返回值”,也不会显示在屏幕画面上。
•
需要将函数值赋给变量、数组时,当然要使用等号命令。例
如:mDbc = DBC()
•
如果既不想显示函数值,也不想保存函数值时,可直接执行函数。
•
在使用某些命令时,可以直接使用函数,比如:

5-2-6 函数 的执行方法
范例一
用 INSMODE()
函数将光标设
置成插入模式
范例二
用CAPSLOCK()函
数将键盘上的
CAPSLOCK按键模
式设置成大写模式

5-2-7
基本输出命令
控制输出信
息的格式
命令一
?|?? <expr1> [,<expr2>]...
[PICTURE cFormatCodes]| FUNCTION cFormatCodes]
[AT nColumn]
[FONT cFontName [,nFontSize] [STYLE cFontStyle] ]
AT选项可
以控制信
息输出的
屏幕位置
FONT选项可以
制定输出信息的
字体和字号
STYLE选项则可
以为输出信息设
置一种风格

5-2-7
命令一
基本输出命令
?|?? <expr1> [,<expr2>]...
[PICTURE cFormatCodes]| FUNCTION cFormatCodes]
[AT nColumn]
[FONT cFontName [,nFontSize] [STYLE cFontStyle] ]
风格类型
风格
控制符
风格(样式)
控制符
常规
N
阴影
S
黑体
B
删除线
-
斜体
I
透明
T
轮廓
O
下划线
U
不透明
Q

5-2-7
范例
基本输出命令

5-2-7
基本输出命令
1. 显示多个表达式
? 命令是可以读取并显示多个表达式的,而且这些表达式可以是不同
的数据类型的,您所要做的只是利用逗号(,)将这些表达式隔开。
范例

5-2-7
基本输出命令
2. 在打印机上输出
Visual FoxPro允许您通过?命令在打印机上输出信息。只要执行设
置命令SET PRINTER ON,所有运算结果将会同时输出到屏幕画面及打
印机上。
范例

5-2-7
基本输出命令
?? 命令与 ? 命令完全相同
范例

5-2-7
基本输出命令
命令二
WAIT [<expC>] [TO <memvar>] [WINDOW [AT
<row,column>]] [NOWAIT]]
[CLEAR|NOCLEAR] [TIMEOUT <expN>]
WAIT命令可以中断正在执行的操作,直到用户在键盘上
按任一键,或者单击鼠标左键、右键时为止。

5-2-7
命令二
基本输出命令
WAIT [<expC>] [TO <memvar>] [WINDOW [AT
<row,column>]] [NOWAIT]]
[CLEAR|NOCLEAR] [TIMEOUT <expN>]
WAIT命令可以中断正在执行的操作,直到用户在键盘上
按任一键,或者单击鼠标左键、右键时为止。
范例

5-2-7
基本输出命令
程序范例
提示
信息

5-3-1
简单条件语句
语法
IF <expL>
<所要执行的若干语句行1>
[ELSE
<所要执行的若干语句行2>]
ENDIF
IF 命令必须对应
一个ENDIF命令

5-3-1
简单条件语句
程序范例
使用IF...ENDIF命令
语句来判断性别sex
字段的值,当字段值
为.T.时,则以汉字
“男”来显示;否则
就用汉字“女”来显
示

5-3-2
嵌套式条件语句
语法
所谓嵌套式条件
语句就是将一个
IF...ENDIF程序
结构设置在另一
个IF...ENDIF程
序结构内,一层
套着一层,以应
付超过两个条件
以上的情况。
┌━IF <expL1>
┃ ...
┃┌━IF <expL2>
┃┃ ...
┃┃┌━IF <expL3>
┃┃┃ ...
┃┃┃ (条件 <expL3> 成立时所要执行的语句)
┃┃└━ENDIF
┃┃ ...
┃┃ (条件 <expL2> 成立时所要执行的语句)
┃┃ ...
┃└━ENDIF
┃ ...
┃ (条件 <expL1>成立时所要执行的语句)
┃ ...
└━ENDIF

5-3-2
嵌套式条件语句
程序范例1
使用两层IF...ENDIF命令语句
嵌套,外层条件语句用来判断
条件查询语句是否找到给定记
录,如果找到给定记录,函数
FOUND()的值为逻辑真,否则
为逻辑假。

5-3-2
嵌套式条件语句
程序范例2
利用嵌套式IF 条件句来
针对不同的薪水水准做
不同的“评语”,以达
到分类效果。

5-3-3
语法
多重条件语句
DO CASE
CASE <条件 1>
<条件 1 为真时所要执行的命令语句>
CASE <条件 2>
<条件 2 为真时所要执行的命令语句>
CASE <条件 3>
<条件 3 为真时所要执行的命令语句>
...
[OTHERWISE
<以上各条件都不成立时所要执行的命令语句>]
ENDCASE
程序执行时,每当遇到DO CASE命令结构时,系统将会依次检查每一个
CASE的条件,发现第一个满足条件的CASE语句时,便执行其后面若干程序行。
然后便会从ENDCASE语句跳出执行后续语句。

5-3-3
多重条件语句
程序范例

5-3-4
语法
基本循环语句
DO WHILE <expL>
<statements>
[LOOP]
[EXIT]
ENDDO
DO WHILE命令是循环入口语句,它必须对应一个循环出口语句ENDDO;
而位于DO WHILE与ENDDO间的命令语句叫做循环体,也就是要求重复执行的
命令语句。

5-3-4
基本循环语句
程序范例1
DO WHILE
循环语句执行
的条件
指针下移一位,
否则会造成死
循环

5-3-4
基本循环语句
程序范例2
逐张显示
图片

5-3-5 计数循环语句
语法
计数器
计数器
的初值
FOR <memvar> = <expN1> TO <expN2>
[STEP <expN3>]
<statements>
每次循环
[EXIT]
的增量
[LOOP]
ENDFOR|NEXT
计数器
的终值

5-3-5 计数循环语句
程序范例

5-3-6 数据表扫描循环语句
语法
SCAN [NOOPTIMIZE][<scope>][FOR
<expL1>][WHILE <expL2>]
[<statements>]
[LOOP]
[EXIT]
ENDSCAN
SCAN语句的循环次数是由当前数据表中符合条件的所有记录数
决定的,每循环一次记录指针就下移一条记录,当记录指针指向数据
表结束位置时退出循环。

5-3-6 据表扫描循环语句
SCAN...ENDSCAN循环与DO WHILE...ENDDO 循环的对比
DO WHILE...ENDDO
* 程序文件名称: FOX27.PRG
SET TALK OFF
CLEAR
OPEN DATABASE demodbc7
USE foxman
DO WHILE !EOF()
IF 薪水 > 60000
? 员工姓名
ENDIF
SKIP
ENDDO
CLOSE DATABASES
SCAN...ENDSCAN
* 程序文件名称: FOX28.PRG
SET TALK OFF
CLEAR
OPEN DATABASE demodbc7
USE foxman
SCAN FOR 薪水 > 60000
? 员工姓名
ENDSCAN
CLOSE DATABASES

5-3-7 计数循环语句
程序范例

5-4-1 编译常量
在程序中使用常量有两种方法,第一种是如上例所示直接使用;
第二种是通过变量来使用。直接使用常量值简单方便,但是假如某一
个常量在程序内多次出现,而且该常量值偶尔需要改变,还是通过一
个变量来使用比较方便。
Visual FoxPro利用预处理语句 #DEFINE来定义常数。
语法
#DEFINE <constant name> <expr>
一旦您使用 #DEFINE 创建一个编译常量后,仍然可以终止其常
量值的替换。要终止常量值的替换,请利用预处理语句#UNDEF。
语法
#UNDEF <constant name>
要终止替换的
编译常量

5-4-1 编译常量
程序范例
定义
常量
终止
定义

5-4-2 条件编译
Visual FoxPro提供的另外一个预处理语句是#IF...#ENDIF,
它能够根据给定条件选择性地编译某一段源代码。在源程序中的条件
就是语句结构#IF…#ENDIF,可以提高源程序的可读性,减少目标
程序的大小,提高程序的性能。
语法
#IF <expN1>|<expL1>
<statements>
[#ELIF <expN2>|<expL2>
<statements>
...
...
#ELIF <expNn>|<expLn>
<statements>]
[#ELSE
<statements>]
#ENDIF

5-5-1 条件编译
1. 过程的构成
过程与一般程序的最大区别是具有固定的入口语句和出口语句。这样
才便于从含有许多个过程的文件中区分每一个过程。
语法
PROCEDURE ProcedureName
[PARAMETERS|LPARAMETERS MemvarList]
<处理命令语句的序列> ...
RETURN
ENDPROC

5-5-1 条件编译
2.自定义函数的构成
自定义函数与一般过程的区别一是入口语句和出口语句不一样,二是
自定义函数有返回值,过程没有返回值。
语法
FUNCTION FunctionName
[PARAMETERS|LPARAMETERS MemvarList]
<处理命令语句的序列> ...
[RETURN [eExpression]]
ENDFUNC

5-5-1 条件编译
3.返回语句
可以执行RETURN TO MASTER命令语句,将控制权交还给最
高层的调用程序。
语法
RETURN [eExpression|TO MASTER|TO ProcedureName]

5-5-1 条件编译
程序范例

5-5-2 过程与自定义函数的调用
1. 过程的调用
调用过程的命令格式与执行独立程序的命令格式是一样的。只
不过过程调用总是从某个程序段内部执行。
语法
DO <ProcedureName > [WITH <ParameterList>]
过程名
把当前程序中的一
些参数传递到被调
用过程中

5-5-2 过程与自定义函数的调用
2.自定义函数的调用
自定义函数的调用方法与系统函数的调用方法一样。
语法
UDFName(<ParameterList>)
函数名
函数调用时传
递的参数表

5-5-3 参数接收
不管是使用DO 命令还是函数调用的方式来调用、执行一个过程或用户
自定义函数,都可将一个或一个以上的参数传递给过程或用户自定义函数使
用,也就是允许进行参数传递的工作。所传递的参数可以是一个常数值、变
量或数组。
1. 使用专门语句
Visual FoxPro提供了专门接收传递参数的命令语句,可以在过程或自
定义函数中接收来自调用程序的参数。接收参数语句必须是过程或自定义函
数中,紧接着PROCEDURE或 FUNCTION命令语句后的第一条命令。

5-5-3 参数接收
(1)接收私有变量
语法
PARAMETERS <ParameterList>
此命令以私有变量或数组来接收传递进来的数据。
范例

5-5-3 参数接收
(2)接收局部变量
语法
LPARAMETERS <ParameterList>
此命令以局部变量或数组来接收传递进来的数据。
范例

5-5-3 参数接收
2. 不使用专门的语句
可以不使用专门的接收语句,而直接用过程或自定义函数的入口语句
来接收调用传递来的参数。操作的方法是在入口语句的过程名或函数名后面
插入一对小括号,并在括号中顺序写入接收参数的变量名。
范例

5-5-3 参数接收
程序范例一
使用DO 命令
执行子程序
subroute
用WITH选项将
参数变量sele的
值传递给子程序
subroute的接收
变量mychoice

5-5-3 参数接收
程序范例二

5-5-3 参数接收
程序范例三
1

5-5-3 参数接收
程序范例三
2

5-5-4 参数传递中的传值与传址
将简单变量或数组中的下标变量传递给程序、过程或自定义函数时,可
以采用两种参数传递的方式——传值 (By Value) 或传址 (By Reference)。
被调用程序、过程或自定义函数中的接收变量与参数变量一一对应,如
果每一个接收变量也在内存中开辟各自的存储单元,传递仅仅是将参数变量
存储单元的数据值复写到接收变量存储单元中,那么这种参数传递方式就是
所谓的“传值”方式。
如果将接收变量分别与对应的参数变量联系起来,使接收变量名成为参
数变量存储单元的另一个别名,也就是说接收变量和参数变量具有相同的存
储单元地址。那么该存储单元中的数据值既是参数变量的值,又是接收变量
的值,也就相当于将参数变量传递给了接收变量。这种参数传递方式就是所
谓的“传址”方式。

5-5-4 参数传递中的传值与传址
1. 函数调用
如果以函数调用的方式向程序、过程或自定义函数传递参数,系统默认是
以传值的方式进行。若“传址”的方式传递参数,有两种办法实现。
(1) 执行命令
语法
SET UDFPARMS TO VALUE | REFERENCE
这条命令可以设置函数调用时的参数传递方式,使用TO VALUE可以
设置按值传递参数,使用TO REFERENCE可以设置按地址传递参数。

5-5-4 参数传递中的传值与传址
比较“传值”与“传址”两种方式的不同:
使用传值的方式
* 程序文件名称: FOX17.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
Modvar(memvar1,memvar2)
? memvar1,memvar2
*恢复系统原先的设置
SET TALK ON
FUNCTION Modvar
LPARAMETERS new_var1,new_var2
STORE 20 to new_var1,new_var2
RETURN
ENDFUNC
使用传址的方式
* 程序文件名称: FOX18.PRG
SET TALK OFF
CLEAR
SET UDFPARMS TO REFERENCE
STORE 10 TO memvar1,memvar2
Modvar(memvar1,memvar2)
? memvar1,memvar2
*恢复系统原先的设置
SET TALK ON
SET UDFPARMS TO VALUE
FUNCTION Modvar
LPARAMETERS new_var1,new_var2
STORE 20 to new_var1,new_var2
RETURN
ENDFUNC

5-5-4 参数传递中的传值与传址
(2) 强制设置
事实上您也可以不管SET UDFPARMS命令的设置情况,强迫系统按
照传值或传址的方式来传递参数。
如果需要按照传值的方式传递参数,请将此参数包含在一对小括号中。
而假如您要按照传址的方式传递参数,可以此参数前加上符号 "@"。

5-5-4 参数传递中的传值与传址
(2) 强制设置
强制按传值的方式传递
* 程序文件名称: FOX19.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
? "传递前变量的值: "
? memvar1,memvar2将被传递的参数
Modvar((memvar1),(memvar2))。
? "强制按传值方式传递后变量的值: "
? memvar1,memvar2
*恢复系统原先的设置
SET TALK ON
FUNCTION Modvar
LPARAMETERS new_var1,new_var2
STORE 20 to new_var1,new_var2
ENDFUNC
强制按传址的方式传递
* 程序文件名称: FOX20.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
? "传递前变量的值: "
? memvar1,memvar2 在被传递的参数
Modvar (@memvar1,@memvar2)
? "强制按传址方式传递后变量的值: "
? memvar1,memvar2
*恢复系统原先的设置
SET TALK ON
FUNCTION Modvar
LPARAMETERS new_var1,new_var2
STORE 20 to new_var1,new_var2
ENDFUNC

5-5-4 参数传递中的传值与传址
2. 程序执行
如果使用DO命令去执行某个程序、过程或自定义函数,并且以DO命令中
的WITH 字句将参数传递给被调用程序、过程或自定义函数,则系统默认按照
“传址”的方式传递参数。假如您希望这时以“传值”的方式来传递参数,必
须将被传递的参数包含在一对小括号中。

5-5-4 参数传递中的传值与传址
2. 程序执行
使用传值的方式
* 程序文件名称: FOX21.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
? "传递前变量的值: "
? memvar1,memvar2
DO Modvar WITH (memvar1),(memvar2)
? "强制按传值方式传递后变量的值: "?
? memvar1,memvar2
*恢复系统原先的设置
SET TALK ON
FUNCTION Modvar
LPARAMETERS new_var1,new_var2
STORE 20 to new_var1,new_var2
ENDFUNC
使用传址的方式
* 程序文件名称: FOX22.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
? "传递前变量的值: "
? memvar1,memvar2
DO Modvar WITH memvar1,memvar2
"强制按传址方式传递后变量的值: "
? memvar1,memvar2
*恢复系统原先的设置
SET TALK ON
FUNCTION Modvar
LPARAMETERS new_var1,new_var2
STORE 20 to new_var1,new_var2
ENDFUNC

5-5-5 过程文件
将多个相关过程或用户自定义函数放置在一个过程(.PRG)文件里,此文
件即是所谓的过程文件。
在Visual FoxPro中,您可以将过程或用户自定义函数直接放置在主程序
中,从而可直接使用DO命令或函数调用的方式来执行这些过程或用户自定义
函数。然而您也可将过程或用户自定义函数放置在过程文件中,但是此时您必
须先使用SET PROCEDURE TO命令打开此过程文件,才能使用其中的过程
或用户自定义函数。

5-5-6 存储过程
所谓“存储过程”实际上就是一个过程文件,但它不是一个独立的程序
文件,而是保存在数据库中的若干过程的集合。由于它总是内含在数据库之中,
随着数据库的创建而诞生、删除而删除 。
1. 创建存储过程
可以写多个
过程程序

5-5-6 存储过程
2. 存储过程的特点
1. 当您编写完当前过程后保存并退出编辑窗口时,Visual FoxPro会立即编译
这个过程;所以万一您的程序代码有语法上的错误,Visual FoxPro就会立
即测知并发出警告,您也可以立即更正,以避免执行时才发现错误。
2. 由于存储过程是事先编译的,因此调用执行过程时,无须再对它进行编译
处理,因此执行速度较快。
3. 当数据库打开时,存储过程便被装入内存,因此执行速度较快。
4. 由于存储过程是存放在数据库中,所以利用其过程来验证数据表字段或记
录的数据是最适合的。因此您无须担心因为将数据库文件移动至其他磁盘
目录而造成找不到需要的程序的窘况。存储过程无疑简化了管理上的操作。
这实际上正是存储过程的基本作用。

5-5-7 过程或用户自定义函数的快速定位
当某一个程序、过程文件或数据库的存储过程中包含非常多的过程或用
户自定义函数时,如何得知其中究竟拥有哪些过程或用户自定义函数,并能
快速找到某一个过程或用户自定义函数,便成为一个非常重要的问题。

5-5-7 过程或用户自定义函数的快速定位
范例
选择排
列方式

5-6
私有变量、局部变量与全局变量
内存变量
私有变量
局部变量
全局变量

5-6-1
私有变量
“私有变量”的适用范围是定义它的当前程序、过程、用户自定义
函数及被它们调用的下级程序、过程、用户自定义函数,但是却不能
被上级程序所接受。
语法
PRIVATE MemvarList
PRIVATE ALL [LIKE Skeleton|EXCEPT Skeleton]
范例
由于 Private 命令并没有能力创
建变量,因此必须再使用STORE
命令将值设置给各个私有变量以
便创建它们。

5-6-1
私有变量
未在自定义函数中将变量定义成私有变量
* 程序文件名称: FOX25.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
? "调用自定义函数前变量的值: "
? memvar1,memvar2
=RESET()
? "执行用户自定义函数后变量的值: "
? memvar1,memvar2
* 恢复系统原先的设置
SET TALK ON
FUNCTION reset
STORE 20 to memvar1,memvar2
ENDFUNC
执行结果
调用自定义函数前变量的值:
10
执行用户自定义函数后变量的值:
20
20
在自定义函数中将变量定义成私有变量
* 程序文件名称: FOX26.PRG
SET TALK OFF
CLEAR
STORE 10 TO memvar1,memvar2
? "调用自定义函数前变量的值: "
? memvar1,memvar2
=RESET()
? "执行用户自定义函数后变量的值: "
? memvar1,memvar2
* 恢复系统原先的设置
SET TALK ON
FUNCTION reset
PRIVATE memvar1,memvar2
STORE 20 to memvar1,memvar2
ENDFUNC
执行结果
调用自定义函数前变量的值:
10
执行用户自定义函数后变量的值:
10
10

5-6-2
全局变量
“全局变量”是最高级别的内存变量,不论它是在那里产生的,在
Visual FoxPro中的任何一级程序都可调用此变量,也就是说,在任
何程序中都可修改、重设此变量的值。
语法
PUBLIC MemvarList
Public 命令不但
具备设置变量作用
域的能力,而且还
能够为所有的全局
变量初始化,其值
是逻辑非.F.。
全局变量名序列

5-6-3
局部变量
与全局变量一样,局部变量或数组也不允许先为变量赋值,然后再
定义局部变量。必须先使用LOCAL命令定义它们,然后再为它们赋值。
语法
LOCAL MemvarList
局部变量名的序列
范例一

5-6-3
局部变量
范例二
因为变量 mVar 只
能在自定义函数
localtest()内使用,
所以会出现“MVAR
变量没有找到”的
错误信息

5-6-3
局部变量
范例三
x 变成 6,而由于
函数调用的方式默
认以传值 (By
Value) 的方式将变
量传递至函数中,
因此 mVar 的值仍
旧是 5

5-6-3
局部变量
范例四
x变成 6,而由于
以传址方式将局部
变量 mVar 传递至
函数中,并在函数
中更改其值,因此
mVar 也会变成 6
第六章 数组变量


6-1 数组的定义
6-2 数组的基本操作

6-2 数组的基本操作








6-2-1
6-2-2
6-2-3
6-2-4
6-2-5
6-2-6
6-2-7
6-2-8
给数组变量赋值
函数AELEMENT()
函数ASUBSCRIPT()
检测数组的大小
数组元素的复制
数组元素的排序
数组元素值的搜索
使用 FOR EACH ... ENDFOR 命令

6-1 数组的定义
Visual FoxPro要求用户必须先定义然后才能使用数组。可以用
DIMENSION与DECLARE 命令完成定义数组的工作。
语法
一维数组只
有nRows1
一个参数
DIMENSION ArrayName1(nRows1 [,nColumns1])
[,ArrayName2(nRows2 [,nColumns2])] ...
DECLARE ArrayName1(nRows1 [,nColumns1])
[,ArrayName2(nRows2 [,nColumns2])] ...
一维数组只
有nRows1
一个参数二
维数组必须
加入
nRows1和
nColumns
1两个参数,
数组所拥有
的下标变量
个数即为两
个参数值的
乘积。

6-1 数组的定义
范例
定义一个名称
为myarrays,
拥有1 行、10
列的一维数组
表示创建一个名称
为myarray,拥
有12行、5列的二
维数组。其中的下
标变量是60个

6-2-1 给数组变量赋值
使用DIMENSION或DECLARE命令定义了数组以后,系统
默认数组中各下标变量的初值都是逻辑非.F.。您可以随时利用
STORE命令或等号命令为整个数组赋值,或者只为某个下标变
量赋值。
范例
1.
DIMENSION myary1[10]

6-2-1 给数组变量赋值
范例
myary2[1,1]
myary2[1,2]
myary2[1,3]
myary2[1,4]
myary2[2,1]
myary2[2,2]
myary2[2,3]
myary2[2,4]
2.
DIMENSION myary2[2,4]
第1号元素
2
3
4
5
6
7
第 8 号元素
两者
效果
等价

6-2-2 函数AELEMENT()
AELEMENT()函数将返回该下标变量在数组中的位置顺序编号。
语法
AELEMENT(ArrayName,nRowSubscript[,nColumnSubscript])
数组的
行下标
范例
数组的
列下标

6-2-3 函数ASUBSCRIPT()
ASUBSCRIPT()函数能够返回给定数组下标变量的行下标值或
列下标值。
语法
ASUBSCRIPT(ArrayName,nElementNumber,nSubscript)
下标变量
在数组中
的顺序号
范例
1表示函
数结果为
行下标,
2表示函
数结果为
列下标

6-2-4 检测数组的大小
ALEN() 函数不仅能够返回指定数组的元素个数,也可返回数
组的列数与行数。尤其在处理一个未知大小的数组时,此函数便显
得特别有用。
语法
ALEN(ArrayName[,nArrayAttribute])
值为1时,函
数返回数组的
行数;为2时,
函数返回数组
的列数。

6-2-4 检测数组的大小
范例

6-2-5 数组元素的复制
当一个数组已经存在,我们可以利用ACOPY()函数将其中的元素
复制、粘贴到另一个数组中。
语法
ACOPY(SourceArrayName,DestinationArrayName
[,nFirstSourceElement[,nNumberElements[nFirstDestElement]]])
其中:
SourceArrayName
是源数组名
DestinationArrayName 是目标数组名
nFirstSourceElement 源数组中准备复制的起始元素位置,省略为第1个元素
nNumberElements
是被复制的元素个数
nFirstDestElement
是目标数组中被替换元素的起始位置

6-2-5 数组元素的复制
范例
Visual FoxPro 会自动创
建数组 myary2,并将数
组 myary1 中的元素拷贝
至数组 myary2 中。

6-2-6 数组元素的排列
Visual FoxPro提供的ASORT()函数可将数组中的元素按照
升序或降序重新排列。
范例
ASORT(ArrayName[nStartElement[,nNumberSorted[,nSortOrder]]])
其中:
ArrayName
为待排序的数组名称
nStartElement 排序起始元素位置,若未指定则从第一个元素开始
nNumberSorted 待排序元素个数
nSortOrder
当为0,排升序,为1,排降序,忽略时排升序
如果排序成功,ASORT()函数返回数值1;否则返回数值-1。

6-2-6 数组元素的排列
范例
RAND()
函数会返
回介于 0
与 1间的
随机数值

6-2-7 数组元素值的搜索
ASCAN()函数可用来搜索数组中某个元素的特定值,如果找到,
此函数便返回此指定值在数组中的位置编号;如果找不到,ASCAN()
函数便返回数值0。
语法
ASCAN(ArrayName,eExpression[,nStartElement[,nElementsSearched]])
其中:
ArrayName
为待搜索的数组名称
eExpression
为待搜索内容的表达式
nStartElement
为待搜索的起始元素位置。忽略则从第一个元素开始搜索
nElementsSearched 指定要搜索的元素个数

6-2-7 数组元素值的搜索
语法

6-2-8 使用FOR EACH ... ENDFOR 命令
FOR EACH ... ENDFOR也是循环结构语句命令,而其优异之处在
于它会自行判断数组或某类集合中的元素个数而决定循环执行的次数,从
而能够针对其中的每一个元素做特定的处理。
语法
FOR EACH Var IN Group
Statements
[EXIT]
[LOOP]
ENDFOR|NEXT

6-2-8 使用FOR EACH ... ENDFOR 命令
范例一

6-2-8 使用FOR EACH ... ENDFOR 命令
范例二

6-2-8 使用FOR EACH ... ENDFOR 命令
范例三
程序代码略
第七章 数据的查询与统计








7-1
7-2
7-3
7-4
7-5
7-6
7-7
7-8
查询设计器的启动
创建查询
统计和计算
确定查询输出的内容
数据分组小计
查询结果的输出目的地
创建多个表的查询
如何创建交叉表

7-2 创建查询





7-2-1
7-2-2
7-2-3
7-2-4
7-2-5
选择数据表
选择要出现在查询结果中的字段
指定字段出现在查询结果中由左至右的顺序
检查查询设计情况与保存查询文件
显示查询结果

7-3 统计和计算


7-3-1 添加统计计算字段
7-3-2 修改查询结果中列标题

7-4 确定查询输出的内容




7-4-1
7-4-2
7-4-3
7-4-4
限制重复记录
显示名列前茅或垫底者
指定查询条件
排序查询结果

7-5 数据分组小计


7-5-1 一般分组
7-5-2 按条件分组

7-6 查询结果的输出目的地






7-6-1
7-6-2
7-6-3
7-6-4
7-6-5
7-6-6
查询去向对话框
将查询结果保存在数据表中
用图形表现查询结果
在屏幕上输出画面
以报表方式输出查询结果
按邮寄标签形式输出

7-7 创建多个表的查询




7-7-1
7-7-2
7-7-3
7-7-4
多表查询的特点
设置联接条件
编辑联接条件
查询实例

7-1 查询设计器的启动
1.
菜单方式

7-1 查询设计器的启动
1.
菜单方式

7-2-1 选择数据表
创建查询的目的无非是为了进行表的查询处理,因此启动查询
设计器以后的第一件事就是指定所要查询的表。
1. 未打开任何数据库
1. 未打开任何数据库
可以继
续加入
其他的
表

7-2-1 选择数据表
2. 已经打开数据库
选择要
操作的
表

7-2-1 选择数据表
3. 添加与删除数据表
数据表中所
有的字段,
其中“*”号
代表所有的
字段

7-2-2 选择数据表
1.通过字段选项卡
来源表
的所有
字段
将在查
询结果
中出现
的字段

7-2-2 选择数据表
2. 使用鼠标直接拖放
用鼠标
拖到

7-2-3 指定字段出现在查询结果中由左至右的顺序
改变
顺序

7-2-4 检查查询设计情况与保存查询文件
保存查
询文件

7-2-5 显示查询结果
1. 用菜单选项
查询
程序

7-2-5 显示查询结果
2. 用命令
直接在命令窗口中使用DO命令来运行查询文件。
语法
范例
DO QueryFileName
这是查询文件
的名称,您必
须加上文件扩
展名 .qpr

7-2-5 显示查询结果
3. 编辑查询文件
可以随时在查询设计器中打开查询文件,然后在设计器窗口中
编辑修改查询文件。也可以用命令打开查询设计器,编辑一个已经
存在的查询文件;
语法
MODIFY QUERY QueryFileName
这是查询文件
的名称,可不
加文件扩展
名 .qpr

7-2-5 显示查询结果
4. 查看查询程序
可以随时在查询设计器中打开查询文件,然后在设计器窗口中编辑修改查
询文件。也可以用命令打开查询设计器,编辑一个已经存在的查询文件。
查询
程序

7-3-1 添加统计计算字段
1. 操作方法
输入
函数
和表
达式
输入
函数
和表
达式
查询
程序

7-3-1 添加统计计算字段
1. 操作方法
常用查询函数:
MIN()
在表中计算出指定字段值最小的数据项。
MAX()
在表中计算出指定字段值最大的数据项。
COUNT()
计算表中记录数。通常以星号(*)作为参数。
AVG()
计算出所有记录指定字段的数据平均值。
SUM()
计算出所有记录指定字段的数据总和。

7-3-1 添加统计计算字段
从表Foxman.dbf中查询:
1. 总共有多少条记录。
2. 薪水的最大值。
3. 薪水的最小值。
4. 薪水的平均值。
1. 操作实例
查询
内容

7-3-1 添加统计计算字段
1. 操作实例
从表Foxman.dbf中查询:
1. 总共有多少条记录。
2. 薪水的最大值。
3. 薪水的最小值。
4. 薪水的平均值。
查询结果

7-3-2 修改查询结果中列标题
在查询结果的浏览窗口中,新增加字段的列标题是由Visual FoxPro
自动替您决定的,如果希望自行指定列标题,在所键入的表达式中加入AS
参数即可。
语法
1. 操作方式
表达式 AS 列标题
修改统计项的表达式为:
COUNT(*) AS 员工人数
MAX(Foxman.薪水) AS 最高薪
MIN(Foxman.薪水) AS 最低薪
AVG(Foxman.薪水) AS 平均薪水

7-3-2 修改查询结果中列标题
2. 操作实例
检查表Foxman中所有
员工的下列字段内容:
•身份证号码
•姓名
•性别
•婚姻状况
IIF(Foxman.性别,“男”,“女”) AS 性别
IIF(Foxman.婚姻状况,"已婚","未婚") AS 婚姻状况

7-3-2 修改查询结果中列标题
2. 操作实例
检查表Foxman中所有
员工的下列字段内容:
•身份证号码
•姓名
•性别
•婚姻状况
查询
结果

7-4-1 限制重复记录
在输出查询结果时,默认数据表中所有的记录都会显示出来。但如果您
不想计算或显示重复的数据记录,可以在查询设计器的“杂项”选项卡页面
上,选定复选框“无重复记录”。
范例
查询表Foxman中所有
员工是来自哪些部门的 .
1
7-4-1 限制重复记录

范例
查询表Foxman中所有
员工是来自哪些部门的 .
查询结果
2
3

7-4-2 显示名列前茅或垫底者
Visual FoxPro 6.0的查询有一项极为重要但却是经常被人所遗忘或未
发觉的功能,那就是它能够很容易地找出数据表中名列前茅或垫底者。
范例 一
在Foxman表中要求查询:
薪水最高的前10名员工。
1

7-4-2 显示名列前茅或垫底者
在Foxman表中要求查询:
薪水最高的前10名员工。
前10名
记录
2
3
范例一
前10名
查询结
果

7-4-2 显示名列前茅或垫底者
在Foxman表中要求查询:
薪水最高的前3 % 的员工。
1
3
2
范例二
降序
排序
排序
结果

7-4-3 指定查询条件
在查询设计器窗口选择“筛选”选项卡可以指定查询的条件。
条件之
间的逻
辑关系
忽略字
母大小
写
选择查询
条件中的
字段名
相反值
表达式
的操作
性质
筛选操
作的条
件值
条件表
达式

7-4-3 指定查询条件
范例一
查出表Foxman中有哪
些员工住在上海市。
1
查询
条件
2

7-4-3 指定查询条件
范例二
3
查出表Foxman中有哪
些员工住在上海市。
查询
结果

7-4-3 指定查询条件
范例二
查询表 Foxman 中有多
少位员工住在北京市。
3
查询
条件
查询
结果

7-4-3 指定查询条件
范例三
按照下列需求显示表Foxman的数据记录:
1.
字段排列顺序
任职部门、姓名、性别、婚姻状况、薪水、雇用日期
2.
替换汉字
将逻辑型字段性别与婚姻的值替换为汉字显示。
3.
选择满足下列条件的记录
在信息部、财务部或业务部任职。
薪水介于$50000~$55000之间。
1994年1月10号以后才到任。
男性已婚职员。

7-4-3 指定查询条件
IIF(Foxman.性别,“男”,“女”) AS 性别
IIF(Foxman.婚姻状况,"已婚","未婚") AS 婚姻状况
选定
字段
查询
条件
范例三
查询
结果

7-4-4 排序查询结果
为了满足某种查询的需要,往往要求显示结果以一个或几个字段为基准,
重新排列浏览窗口中记录的顺序。有关设置在“排序依据”选项卡。
升降序
选择

7-4-4 排序查询结果
范例
在上一小节实例3中,希望查询结果中的数据记录能够先
按照员工任职部门的降序排列;而同一部门中,男性员工排
列在前,女性员工排列在后;若性别相同时,已婚者排列在
前,未婚者排列在后;如果婚姻状况也相同时,则依据薪水
从高到低的顺序排列记录。

7-4-4 排序查询结果
范例
查询条
件
查询结
果

7-5-1 一般分组
利用函数可以获得查询结果中某一字段“所有”记录的统计值,但是如果
希望分类统计,比方说,您想要计算出各个部门的员工人数,或计算出各个部
门的平均薪水等诸如此类的计算,则必须利用分组小计功能实现。在查询设计
器中的“分组依据”选项卡进行相关设置。

7-5-1 一般分组
检查表 Foxman 中,各
个部门的平均薪水。
范例一
查询
条件
分组
结果

7-5-1 一般分组
范例二
选定
字段
检查表Foxman中,各
个部门的男性与女性员
工的平均薪水。
分组
条件
查询
结果

7-5-1 一般分组
利用查询显示表Foxman
中平均薪水最高的前 3 个
部门。
范例三
字段选
项卡
分组依据
选项卡
排序依据
选项卡
杂
项
选
项
卡
1
2
3
4

7-5-1 一般分组
范例三
利用查询显示表Foxman
中平均薪水最高的前 3 个
部门。
查询
结果

7-5-2 按条件分组
设置组别过滤条件可以限制各分组信息能否输出。有关设置在
分组依据选项卡。
在“分组依据”选项卡中,单击“满足条件”按钮,将打开
“满足条件”对话框。

7-5-2 按条件分组
范例
检查表Foxman中,平均薪水
大于30000的部门,显示它
们的平均薪水是多少。
设置条件
单击此
按钮

7-5-2 按条件分组
范例
检查表Foxman中,平均薪水
大于30000的部门,显示它
们的平均薪水是多少。
查询
结果

7-6-1 查询去向对话框
在前面的所有练习中,查询结果都是输出至浏览窗口,这是系统默认
的输出目的地。事实上您可以自行指定要将查询结果送到何处。
查询去向

7-6-2 将查询结果保存在数据表中
1. 临时表
将查询结果输出至一个由用户命名的虚拟临时只读数据表(Cursor)中。
系统一旦退出,临时表就会消失。
临时表名
称

7-6-2 将查询结果保存在数据表中
2. 表
可将查询结果输出至一个由用户命名,在外存上创建的数据表中;不
同的查询结果放在多个表中。
表名称

7-6-3 用图形表现查询结果
利用Microsoft Graph使查询结果以商业统计分析图的形式显示。只
是在您运行查询时才会提供向导,让您临时生成所需要的图形。
范例
计算出员工表
Foxman中各部门员
工的起薪平均值与薪
水的平均值,并根据
运算结果绘制出一个
垂直方向的立体直方
图。

7-6-3 用图形表现查询结果
范例
计算出员工表Foxman中各部门
员工的起薪平均值与薪水的平均
值,并根据运算结果绘制出一个
垂直方向的立体直方图。
选择图
形

7-6-3 用图形表现查询结果
范例
计算出员工表Foxman中各部门
员工的起薪平均值与薪水的平均
值,并根据运算结果绘制出一个
垂直方向的立体直方图。
图形标
题

7-6-3 用图形表现查询结果
计算出员工表Foxman中各部门
员工的起薪平均值与薪水的平均
值,并根据运算结果绘制出一个
垂直方向的立体直方图。
范例
保存
文件
运行
结果

7-6-4 在屏幕上输出画面
Visual FoxPro允许您在将查询输出至活动窗口或桌面的同时,
也可将查询结果输出至打印机或一个文本文件中。

7-6-5 报表方式输出查询结果
可以将查询结果以报表的形式输出,要实现这一操作,事先必须创建一
个报表格式文件(.FRX),而查询结果仅仅作为报表格式文件的数据源。

7-6-5 按邮寄标签形式输出
将查询结果以邮寄标签的形式输出 。必需注意,您所创建的标签
格式文件中,各数据字段必需与查询结果的输出字段完全匹配,否则将发
生错误。

7-7-1 多表查询的特点
表查询操作最大的特点,一是必须将所要查询的各表依次添加到查询
中,应当是先添加父表,再添加子表。二是必须指定表间的联接类型。

7-7-2 设置联接条件
可以随时通过“联接条件”对话框来创建或修改两个表之间的联接条
件——也就是定义关系表达式。
范例
父表
的联
接字
段
子表
的联
接字
段
指定
连接
的类
型

7-7-2 设置联接条件
两个表之
间创建了
联接
范例

7-7-2 设置联接条件
范例
联接条件

7-7-3 编辑联接条件
修改联接
选中后按
DELETE键删除

7-7-4 查询实例
范例
1
父子
表
从父表student与子表Score中,查
询出每一位学生的考试成绩。

7-7-4 查询实例
范例
从父表student与子表Score中,查
询出每一位学生的考试成绩。
选定
字段
2

7-7-4 查询实例
从父表student与子表Score中,查
询出每一位学生的考试成绩。
范例
3
查询
结果

7-8 如何创建交叉表
利用交叉表能够清楚地分析出不同分类下的统计信息,因此实
际应用很广。
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。
范例
任职部门
男
女
A
1000
800
B
1700
1500
…
…
…

7-8 如何创建交叉表
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。
范例
单击此
按钮

7-8 如何创建交叉表
范例
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。

7-8 如何创建交叉表
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。
范例
列
行
数据

7-8 如何创建交叉表
范例
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。

7-8 如何创建交叉表
范例
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。

7-8 如何创建交叉表
针对表Foxman,利用下表所示的交
叉表来统计出各个部门男性员工与女
性员工的薪水平均值。
范例
19
存
储
文
件
查询
结果
第八章 如何制作报表与标签









8-1
8-2
8-3
8-4
8-5
8-6
8-7
8-8
8-9
概述
用向导创建报表
报表设计器
创建数据环境
在设计器中创建报表
设置报表打印页的格式
添加报表控件
在程序中输出报表
创建邮寄标签

8-3 报表设计器




8-3-1
8-3-2
8-3-3
8-3-4
打开报表设计器
保存、预览及打印报表
报表设计器的带区
带区的调整

8-4 创建数据环境




8-4-1
8-4-2
8-4-3
8-4-4
数据环境对象
数据环境设计器
编辑修改数据环境对象
数据环境各对象的属性

8-5 在设计器中创建报表


8-5-1 利用手工操作
8-5-2 利用快速报表

8-6 设置报表打印页的格式


8-6-1 设置打印页的列
8-6-2 其他参数设置

8-7 添加报表控件









8-7-1
8-7-2
8-7-3
8-7-4
8-7-5
8-7-6
8-7-7
8-7-8
8-7-9
选取与移动对象
对象的操作
添加标签控件
添加线条控件
添加方框控件
添加圆弧框控件
插入图片控件
创建域控件
综合范例

8-9 创建邮寄标签


8-9-1 启动标签设计器
8-9-2 标签的输出

8-1 概述
依据需要与爱好,可以自行选择各种方式将数据打印在报表上。
在设计报表时,需要牢记下面四条基本步骤:
1. 决定输出报表的形式。
2. 创建报表文件。
3. 编辑报表文件使之符合您实际的需求。
4. 预览并打印报表。

8-1 概述
1. 决定输出报表的形式
确定要创建哪种形式的报表,最简单的报表是类似LIST 命令输出形式的
数据列表,最复杂的则是多表且考虑各种条件分组与特定数据摆放位置的报
表。此外像邮寄标签,虽然其形式较为特别,但也是报表的一种。
报表的形式
说
明
实 例
“列布局”,数据字段
水平排列
最简单也最易制作的报表,它将各个字段水平排列,而
每一项数据则往下按序列输出
职员清单、成绩
单
“行布局”,数据字段
垂直排列
一条记录接着一条记录,将各个字段的数据按垂直方向
往下输出。只能作为单纯数据报表
数据报表
“一对多布局”,一对
多报表
先输出父表的一条记录,随即输出子表中与此记录相对
应的各条记录。按此往下类推
客户订单数据、
成绩
“多栏布局”,多列报
表
同一个字段的各记录数据列于一个以上的列中,相当于
水平排列的多个行布局
电话簿
标签
通常将一条记录部分字段的数据紧密排列在一起,一行
有多条记录,采用多列的方式输出。通常直接将标签打
印在特制的标签纸上,而不是打印在报表纸上
邮寄标签

8-1 概述
2.报表文件
报表文件实际上是保存着报表格式(布局)的文件,报表文件中所保存的
信息包括:
1. 版面信息。纸张大小、报表列数、宽度、左边界、打印方向等
2. 所有对象的各项信息。对象的位置、大小、外观等
3. 数据源连接信息
报表文件的扩展名为.FRX,其相关的同名备注文件的扩展名为.FRT。

8-1 概述
3. 创建报表文件
要创建报表文件有下列三种方式:
1. 利用报表向导替单一表或多表创建简单报表文件。
2. 利用报表设计器的快速报表功能替单一表创建简单报表文件。
3. 使用报表设计器创建报表文件。

8-2 用向导创建报表
Visual FoxPro 提供的报表向导
报表向导
一对多报表向导
标签向导
范例
启动
报表
向导
1
2

8-2 用向导创建报表
范例
3
4

8-2 用向导创建报表
范例
选择
样式
5
设置
报表
布局
6

8-2 用向导创建报表
范例
报表
标题
7
8

8-2 用向导创建报表
范例
报表打印
预览
9

8-3-1 打开报表设计器
范例
报表设
计器

8-3-1 打开报表设计器
范例
报表设计
器 和报表
空间

8-3-2 保存、预览及打印报表
打印预览工具栏
按 钮
意 义
说
明
第一页
显示报表的第一页
前一页
显示目前报表的前一页
移至页次
显示跳至第 n 页的对话框
下一页
显示目前报表的下一页
最后一页
显示目前报表的最后一页
缩放
调整预览报表的尺寸比例
关闭预览
关闭打印预览窗口
打印报表
将报表输出至打印机打印

8-3-3 报表设计器
功能
带区

8-3-4 带区的调整
1. 调整带区高度
用鼠标拖
曳调整
精确
调整
双击

8-3-4 带区的调整
2. 打开或关闭新带区
新增标
题/总结
带区

8-3-4 带区的调整
2. 打开或关闭新带区
分组条件
表达式
增加组标
头/组注脚

8-3-4 带区的调整
2. 打开或关闭新带区
设置多
页打印

8-4-1 数据环境对象
事实上在报表中保存数据源信息的是数据环境对象。数据环境对象是一
个复合容器,它内含Cursor(指针)与Relation(关系)两种对象。
1. Cursor对象的CursorSource(指针源)属性记录着表(或视
图)数据源的名称,在数据环境对象中添加几个表(或视图),就会产生多
少个Cursor对象。
2. Relation 对象则记录两个表(或视图)之间的联接信息,每当
您在数据环境对象中创建两个表的关系时,就会产生一个Relation对象。

8-4-2 数据环境设计器
Visual FoxPro提供的数据环境设计器,可以用交互方式将表或
视图添加到数据环境对象中。
范例
将表Student与Scores添加
到报表的数据环境对象中。

8-4-2 数据环境设计器
将表Student与Scores添加
到报表的数据环境对象中。
范例
右键单
击
报表数据源表
Student.dbf已打
开数据库所包含的
表

8-4-2 数据环境设计器
将表Student与Scores添加
到报表的数据环境对象中。
范例
表间
关系
Cursor和
Relation两
个对象

8-4-3 编辑修改数据环境对象
为报表创建了数据环境以后,您还可以随时添加新的表或视图,
当然也可以随时将数据环境对象中的表或视图删除。
范例
删除指
定的表

8-4-3 编辑修改数据环境对象
为报表创建了数据环境以后,您还可以随时添加新的表或视图,
当然也可以随时将数据环境对象中的表或视图删除。
范例
用鼠标
拖曳

8-4-4 数据环境各对象的属性
DataEnvironment(数据环境)属性
DataEnvironment
说
明
AutoOpenTables
此属性的默认值为.T.,表示预览或打印报表时,数据环境对象
中的表或视图会自动被打开。若把属性值设置成逻辑非.F.,则
由用户调用OpenTables方法程序的方式来打开
AutoCloseTables
此属性的默认值为.T.,表示当报表关闭或结束打印时,数据环
境对象中的表或视图会自动关闭。若属性值为逻辑非.F.,则必
须用CloseTables方法程序关闭
InitialSelectedAlias
数据环境对象中可能包含数个Cursor对象,当报表输出时,会
为每个Cursor 对象指定的表分配一个工作区,本属性可指定当
前工作区。在默认情况下,第一个添加到数据环境对象中的表
或视图所在工作区将成为当前工作区

8-4-4 数据环境各对象的属性
Cursor(指针) 属性
说
Curosr
明
Alias
指定 Cursor 对象的来源表或视图打开后的别名
CursorSource
指定 Cursor 对象的来源表或视图
Exclusive
决定是否按照独占方式打开 Cursor 对象的源表
Order
决定 Cursor 对象的主索引
ReadOnly
决定是否以只读方式打开 Cursor 对象的源表或视图

8-4-4 数据环境各对象的属性
Relation(关系) 属性
Relation
说
明
ChildAlias
联接子表的别名
ChildOrder
用以创建联接子表的索引
ParentAlias
联接中父表的别名
RelationalExpr
联接运算表达式

8-4-4 数据环境各对象的属性
确定数据环境设计器中数据源表的主索引,报表中的数据将会按索引
顺序显示输出。
选择用来
控制报表
记录打印
顺序的索
引

8-5-1 利用手工操作
记鼠标
拖动添
加表

8-5-1 利用手工操作
结果

8-5-2 利用快速报表
报表设计器的“快速报表”功能综合了向导和手工操作两种方
式的优点,即快速、方便,又灵活、自由。

8-5-2 利用快速报表
自动创建
的报表布
局结果

8-6-1 设置打印页的列
设置打印
列书
显示列标头
带区 和列
注脚带区

8-6-1 设置打印页的列
各列宽度的默认值公式计算:
(报表打印页的宽度 - (左边界
值 + 右边界值)) / (列数)

8-6-2 其他参数设置
最小
边界
打印
顺序
左页
边距

8-7 添加报表控件
报表控件说明

8-7-1 选取和移动对象
单选
多选
选取后
出现8个
控制点

8-7-2 对象的操作
用鼠标
拖曳调
整对象
的布局
布局功能
按钮

8-7-2 对象的操作
选取所有
对象
2
1
对齐结
果
3

8-7-2 对象的操作
水果在底层效果
水果在顶层效果

8-7-2 对象的操作

8-7-2 对象的操作

8-7-3 添加标签控件
设置标签
对象的相
对位置

8-7-3 添加标签控件
设置打
印条件

8-7-4 添加线条控件
设置线
条的相
关属性

8-7-5 添加方框控件
方框填
充样式

8-7-6 添加圆弧框控件
方框填
充样式
设置圆
弧框相
关属性

8-7-7 插入图片控件
存放在数据表通用字段中的OLE对象以及各种格式的图形文
件,都可以插入报表布局中并最终打印在报表上。系统可以接受
的图形文件格式如下:
•
位图 (.bmp)。
•
图标 (.ico)。
•
JPEG 格式的图形文件 (.jpg)。
•
GIF 格式的图形文件 (.gif)。
•
静态光标文件 (.cur)。
•
动态光标文件 (.ani)。
设置图
片相关
属性

8-7-8 创建域控件
域控
件的
表达
式
域控
件的
输出
格式

8-7-8 创建域控件
溢出现象
自动延伸

8-7-8 创建域控件

最大
化报
表设
计器
8-7-9 综合范例
1
设置
“家庭
住址”
字段的
表达式
2

8-7-9 综合范例
设置
“性别”
字段的
表达式
3

8-7-9 综合范例
设置
“婚姻
状况”
字段的
表达式
4

8-7-9 综合范例
设置
“薪水”
字段的
表达式
5

8-7-9 综合范例
删除页注脚带区中的函数DATE() 。
报表输出显
示形式
完成的布局
效果
6
7

8-7-9 综合范例
8
9
10

8-7-9 综合范例
STR(VAL(SUBSTR(DTOC(DATE()),7))-11,2)+"年
"+SUBSTR(DTOC(DATE()),1,2)+"月"
11

8-7-9 综合范例
增加3个标
签对象
12

8-7-9 综合范例
增加图
片对象
13
14

8-7-9 综合范例
设置总结
带区
15

8-7-9 综合范例
设置表
格线
16

8-7-9 综合范例
打印
预览
17

8-8 在程序中输出报表
语法
REPORT [FORM FileName1|?]
[<scope>][FOR <expL1>][WHILE <expL2>]
[HEADING <expC>]
[NOEJECT]
要在应用系
统中输出报
表,必须使
用REPORT
命令。
[NOCONSOLE]
[NOOPTIMIZE]
[PLAIN]
[RANGE nStartPage [,nEndPage]]
[PREVIEW [WINDOW WindowName] IN SCREEN][NOWAIT]]
[TO PRINTER [PROMPT]|TO FILE FileName2 [ASCII]]
[NAME ObjectName]
[SUMMARY]

8-8 在程序中输出报表
范例

8-9-1 启动标签设计器
命令
CREATE LABEL FileName
不用填写文
件扩展名

8-9-2 标签的输出
命令
LABEL
[FORM <filel>|?]
[<scope>]
[FOR <expL1]
[WHILE <expL2>]
[NOCONSOLE]
[NOOPTIMIZE]
[PREVIEW [NOWAIT]]
[SAMPLE]
[TO PRINTER[PROMPT]|TO FILE <file2>]
第九章 表单设计






9-1 对象、属性、方法和事件
9-2 基础知识
9-3 容器与表单
9-4 常用表单控件
9-5 创建表单
9-6 在表单中添加控件、把表单添加到项目中、
运行表单
9-1对象、属性、方法和事件

1. 对象
对象是面向对象程序设计的基本单元,是将数据和操作过程结合在一起
的数据结构。
属性是用来表示对象所具有的性质和特点,方法用来描述对象的行为过
程。
表单也
是一个
对象
属性修
改

9-1对象、属性、方法和事件
2.对象、事件和方法间的关系
事件被
激活
能被对象识
别和响应的
动作
对象的
行为动
作

9-1对象、属性、方法和事件
3.类和对象的关系


对象和类(Class)关系密切,简单地说,对象是类的
实体,类是对相似对象的抽象描述,由类产生的这些
对象具有相同的性质。
面向对象程序设计方法的核心就是类的设计和处理。

9-2 基础知识
1. 表单和表单文件
 表单文件的扩展名为.SCX,其相关的同名备注文件的扩展名则为.SCT。
 表单文件中所保存的信息包括:
 表单的属性:高度、宽度、位置、标题文字、颜色、行为模式等
 所含各对象属性:对象位置、大小、外观、颜色等


 数据源
 表单及所含对象的事件及方法程序
创建表单文件方式
使用表单向导
l
利用表单设计器创建、设计新表单或修改已有表单

9-2 基础知识
2. 表单设计器的启动
单击“新
建文件”
按钮
2
1
3

9-2 基础知识
2. 表单设计器的启动

9-2 基础知识
2. 表单设计器的启动

9-3表单的属性、事件和方
法
1.常用的表单属性
2.常用事件与方法
3.创建新表单属性
4.创建新方法
5.编程方法或事件代码
6.编程举例

9-3表单的属性、事件和方法
1.常用的表单属性

9-3表单的属性、事件和方法
2. 常用事件与方法
表单以及控件常用的一些事件和方法:















Init 事件
Destroy事件
Click事件
DblClick事件
RightClick事件
Error事件
Load 事件
Unload事件
GotFocus事件
InteractiveChange事件
Show方法
Hide方法
Refresh方法
SetFocus方法
Release方法

9-3表单的属性、事件和方法
3.创建新表单属性
属性名称;如是数组,在
“名称”框中不仅要指
明数组名,还要指定数
组维数
1
2

9-3表单的属性、事件和方法
4.创建新方法
输入方法
名
1
2
新建方法
的说明信
息

9-3表单的属性、事件和方法
5. 编辑方法或事件代码
表单或表单
中的控件
1
方法或
事件
编辑区
2

9-3表单的属性、事件和方法
6.编程举例
1
3
打开表单设计器
打开代码编辑窗口
2

9-3表单的属性、事件和方法
6.编程举例
“过程”框
中选择
Load
设置其他Init、Destory、Unload
三个事件代码

9-3表单的属性、事件和方法
6.编程举例
保存表单
文件
关闭表单
设计器窗
口
执行各
个事件

9-4 常用表单控件











9-4-1 控件的通用属性
9-4-2 标签控件
9-4-3 文本框控件
9-4-4 编辑框控件
9-4-5 命令按钮
9-4-6 命令按钮组
9-4-7 复选框控件
9-4-8 选项组控件
9-4-9 列表框控件
9-4-10 组合框控件
9-4-11 表格(GRID)控件

9-5 创建表单

9-5-1 利用快速表单功能

9-5-2 使用表单向导

9-5-3 使用一对多表单向导

9-6 在表单中添加控件、把表单
添加到项目中、运行表单

9-6-1 准备工作

9-6-2 实现步骤

9-6-3 总结与提高

9-4 常用表单控件

9-4-1 控件的通用属性
默认值,我们使
用控件,更关注
各个特有的属性

9-4 常用表单控件

9-4-2 标签控件
标签控件
在Caption属
性中指定的文
本,称为标题
文本

9-4 常用表单控件

9-4-3 文本框控件
文本框
控件
接收数据的
输入和输出

9-4 常用表单控件

9-4-4 编辑框控件
编辑框
控件
字符编辑器
垂直滚
动条

9-4 常用表单控件

9-4-5 命令按钮
命令按钮
用来触发事件

9-4 常用表单控件

9-4-6 命令按钮组
命令按钮组
命令按钮的
数目由用户
定义

9-4 常用表单控件

9-4-7 复选框控件
复选框控
件
类似“开
关”,如真
T或假F

9-4 常用表单控件

9-4-8 选项组控件
选项组控件
单项选择

9-4 常用表单控件

9-4-9 列表框控件
列表框控件
提供一组条
目(数据项)

9-4 常用表单控件

9-4-10 组合框控件
组合框控件
兼有列表框和
文本框的功能

9-4 常用表单控件

9-4-11 表格(GRID)控件
表格控件
按行和列的形
式显示数据

9-4 常用表单控件
9-4-11 表格(GRID)控件
范例9-2

打开表单设
计器窗口
1
2
3
5
4
右键单击
控件窗口
单击“运
行”按钮
后效果

9-5 创建表单
9-5-1 利用快速表单功能 1. 创建一个简单表单
选择样式
单击,打开
表单设计器
“表单”下拉
菜单中单击
“快速表单”
单击
1
2
5
6
3
4

9-5 创建表单
9-5-1 利用快速表单功能 2.控件生成器的使用方法
创建一个
列表框控
件对象
触发当前
对象事件
选择
字段
单击
1
右键单击列表框,
并在弹出菜单中
单击“生成器” 后
2
3
单击列表框,打开
弹出菜单后,
单击“代码”选项
“运行”后效果

9-5 创建表单
9-5-2 使用表单向导
1.启动“表单向导”
选择
“向
导”
1
3

9-5 创建表单
9-5-2 使用表单向导
按钮类型
单击
选表
选择
“样
式”
2.选择数据源
3. 设置表单的样式

9-5 创建表单
9-5-2 使用表单向导
身份证号
码的升序
排列
4. 设置数据记录的
排列顺序
学生基本
数据维护
系统

9-5 创建表单
9-5-2 使用表单向导
5. 命名、保存、运行或
编辑您的表单
表单运行后

9-5 创建表单
9-5-3 使用一对多表单向导
选择
“向
导”
1. 启动“一对多表单向导”

9-5 创建表单
9-5-3 使用一对多表单向导
2. 选定父表及可用字段
3. 选定子表及可用字段

9-5 创建表单
9-5-3 使用一对多表单向导
4. 设置关系联接
5. 设置表单的样式
6. 设置父表记录排列顺序

9-5 创建表单
9-5-3 使用一对多表单向导
7. 命名、保存、运行或
编辑您的表单

9-6 在表单中添加控件、把表单添加到项目中、运行表单

9-6-1 准备工作
打开要添加控件
的表单
表单添加到项目中的前提
是项目已建立,否则要
通过“文件”菜单中的“新建”
命令或在命令窗口中输入
命令create project <项目文件名>
创建项目文件

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
两种打开已有
表单方式
2
1

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
向表单添加控件
1
向已有的表
单添加“表
格”控件
2
“生成器”
命令

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
向表单添加控件
3
5
4
选择数据
源
建立相关
索引
结果

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
添加标签控件
单击“表单控
件”工具栏上
的
“标签”控件
3
2
1
AutoSize: .T.
Caption: 学 生
考试成绩表
FontName:
黑
体FontSize: 18
结果

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
添加一个命令控件
单击“表单控件”
工具栏上的
“命令按钮”控
件
3
1
退出VFP
系统
按钮
属性
保存添加的控件
2

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
把表单添加到studguanli.pjx项目中
选定stubd表单
文件
4
2
1
1
3
5
stubd表单即被添
加到studguanli项
目中

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-2 实现步骤
方法1
方法2
打开项目管理器,
选择要运行的
工具栏上的“运行”按钮 stubd表单,然后
或选择“表单”菜单中的“ 单击“运行”按
执行表单”命令
钮
运行stubd表单
选择“程序”菜
单中的“运行”
命令,打开“运
行”对话框,选
定studb表单文件,
再单击“运行”
按钮
方法4
方法3
命令窗口中
输入命令

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-3 总结与提高
通过本节的学习,我们可以总结和体会到以下几点。
•
可通过快速表单或表单向导生成一定样式的表单;也可在命令
窗口中输入命令modify form <表单> 建立或编辑修改已有的
表单。
•
在设计表单时,用“表单控件”工具栏添加控件对象,可在
“属性”窗口中根据需要为控件设置属性、选择相应的事件和
方法;可在“代码”窗口中编写或查看控件的事件和方法程序
代码。
•
在设计一对多表单时,要注意创建父表和子表之间关系的联接。
系统默认以两个表的共有字段创建关系联接,如果默认的联接
方式不符合需求,可自行调整。
•
可把表单添加到项目中。
•
可用不同的方法运行表单。

9-6 在表单中添加控件、把表单添加到项目中、运行表单
9-6-3 总结与提高\
删除删除
“退出”
按钮
添加一个
命令按钮
组
修改表格控件
运行表单后,
单击按钮时
执行相应的
操作
第十章 菜单设计


10-1 Visual FoxPro系统菜单
10-2 为自己的程序添加菜单

10-2 为自己的程序添加菜单



10-2-1 准备工作
10-2-2 实现步骤
10-2-3 总结与提高

10-1 Visual FoxPro系统菜单
1. Visual FoxPro菜单结构
Visual FoxPro支持菜单
条形主菜单
每一个条形菜单都有一个
内部名字和一组菜单选项,
每个菜单选项都有一个名
称(显示的菜单项)和内
部名字(程序中用来标识
的对象名)。
弹出式下拉子菜单
每一个弹出式菜单也有一
个内部名字和一组菜单选
项,每个菜单选项则有一
个名称(标题)和选项序
号。

10-1 Visual FoxPro系统菜单
2. Visual FoxPro系统菜单
Visual FoxPro系统菜单也分主菜单和下拉子菜单。主菜单中各项的
名称及内部名如下表所示。
选项名称
文件
编辑
显示
工具
程序
窗口
帮助
内容名
_MSM_FILE
_MSM_EDIT
_MSM_VIEW
_MSM_TOOLS
_MSM_PROG
_MSM_WINDO
_MSM_SYSTEM
主菜单的各个
小项的时候的
内部名

10-1 Visual FoxPro系统菜单
2. Visual FoxPro系统菜单
条形菜单本身的内部名为_MSYSMENU,也可看作是整个菜单系统
的名字。选择条形菜单中的每一个菜单项都会激活一个弹出式下拉菜单,
各弹出式菜单的内部名如下表所示。
下拉子菜单
内部名
“文件”菜单
“编辑”菜单
“显示”菜单
“工具”菜单
“程序”菜单
“窗口”菜单
“帮助”菜单
_MFILE
_MEDIT
_MVIEW
_MTOOLS
_MPROG
_MWINDOW
_MSYSTEM
作为一个下拉
子菜单时候的
名字

10-1 Visual FoxPro系统菜单
2. Visual FoxPro系统菜单
“编辑”子菜单中常用菜单项的选项名称和系统内部名:
菜单项名称
撤消
重做
剪切
复制
粘贴
清除
全部选定
查找
替换
内部名
_MED_UNDO
_MED_REDO
_MED_CUT
_MED_COPY
_MED_PASTE
_MED_CLEAR
_MED_SLCTA
_MED_FIND
_MED_REPL

10-1 Visual FoxPro系统菜单
3. 使用举例
通过SET SYSMENU命令可以允许或者禁止在程序执行时访问系统
菜单,也可以重新配置系统菜单:
语法
SET SYSMENU ON丨OFF丨AUTOMATIC丨TO[<弹出式菜单名表>]
丨TO[<条形菜单项名表>]丨TO[DEFAULT]丨SAVE丨NOSAVE
ON/ OFF:
允许/禁止程序执行时访问系统文件。
AUTOMATIC:
可使系统菜单显示出来,可以访问系统菜单。
TO<弹出式菜单名表>: 重新配置系统菜单,用内部名字列出可用的弹出式菜单。
TO<条形菜单项目表>: 重新配置系统菜单,以条形菜单项内部名列出可用的子菜单。
TO DEFAULT:
SAVE:
NOSAVE:
将系统菜单恢复为缺省配置。
将当前的系统菜单配置指定为缺省配置。
将缺省配置恢复成Visual FoxPro系统菜单的标准配置。

10-1 Visual FoxPro系统菜单
3. 使用举例
VFP的系
统菜单
不带参数的SET SYSMENU
TO命令将屏蔽系统菜单,使系
统菜单不可用。
系统菜单只保留
“文件”、“窗
口”和“格式”

10-2
为自己的程序添加菜单
目标
1. 建立一个新的“学生成绩管理”菜单,不但介绍如何制作,而且利用制
作的菜单项来启动表单,这在我们编程的时候常常使用;
2. 建立一个名为“kjcd..mpr”的快捷菜单文件,包含下图所示的菜单项。
3. 编一个浏览表文件student的程序文件,其文件名为“lnxsmd.prg”,
当浏览表时,单击右键,出现步骤2所建立的快捷菜单。

10-2-1
准备工作
为了能够通过菜单项来启动另一个表单,菜单项设置为命令,来
执行要打开的表单名,并在菜单的命令行中输入要运行菜单的程序。
在设计菜单之前我们就要准备好我们要启动的所有表单和表文件。
本例使用第9章创建的cj.scx和 stubd.scx表单以及student.dbf数据
表文件。

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
2
1

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
命令:表示当前菜单项的功能是执行某条命令。
填充名称:表示为所选的菜单形指定一个内部名称或序号。
子菜单:表示所定义的当前菜单项包含子菜单。
过程:表示菜单被激活时将执行的过程代码。
3

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
设置“学生成
绩 ”菜单
4

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
5

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
完成设置
6

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
输入代码
7

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
9
8
菜单保存
10

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
将程序保存为
“学生成绩管
理.prg”
11
12

10-2-2 实现步骤
1.创建“学生成绩管理”菜单
运行后效果
12

10-2-2 实现步骤
2.创建如图所示的“kjcd.mpr”
1
2
3

10-2-2 实现步骤
2.创建如图所示的“kjcd.mpr”
完成设置
4

10-2-2 实现步骤
2.创建如图所示的“kjcd.mpr”
5
6
保存为
“kjcd.mpr”
菜单

10-2-2 实现步骤
3.创建使用快捷菜单名为“浏览学生名单.prg”的程序文件
编写程序代码,
并将该程序保存
为“lnxsmd.prg”
1

10-2-2 实现步骤
3.创建使用快捷菜单名为“浏览学生名单.prg”的程序文件
程序执
行效果
2

10-2-2 实现步骤
4.用编写程序的方式创建菜单
我们一般都用菜单设计器创建需要的菜单。然而也可以随时用命令的
方式创建菜单。创建或修改菜单可使用modify command 命令。
语法
MODIFY COMMAND <文件名>

10-2-2 实现步骤
4.用编写程序的方式创建菜单
*
************************************************
*
* 05/31/03
*
*
*
************************************************
学生成绩管理.MPR
03:07:04
1
10-2-2 实现步骤

*
* 作者名称
*
*
*
* 版权所有 (C) 2003 公司名称
*
* 地址
*
* 城市,
*
* 国家
*
*
*
* 说明:
*
* 此程序由 GENMENU 自动生成。
*
*
*
2
**************************************************
邮编

10-2-2 实现步骤
*
**************************************************
*
*
*
*
*
*
*
**************************************************
菜单定义
*
SET SYSMENU TO
SET SYSMENU AUTOMATIC
3

10-2-2 实现步骤
DEFINE PAD _0ys06okzc OF _MSYSMENU PROMPT "数据输入" COLOR SCHEME 3
DEFINE PAD _0ys06okzd OF _MSYSMENU PROMPT "数据修改" COLOR SCHEME 3
DEFINE PAD _0ys06okze OF _MSYSMENU PROMPT "查询统计" COLOR SCHEME 3
DEFINE PAD _0ys06okzf OF _MSYSMENU PROMPT "打印输出" COLOR SCHEME 3
DEFINE PAD _0ys06okzg OF _MSYSMENU PROMPT "退出" COLOR SCHEME 3
ON PAD _0ys06okzc OF _MSYSMENU ACTIVATE POPUP 数据输入
ON PAD _0ys06okzd OF _MSYSMENU ACTIVATE POPUP 数据修改
ON PAD _0ys06okze OF _MSYSMENU ACTIVATE POPUP 查询统计
ON PAD _0ys06okzf OF _MSYSMENU ACTIVATE POPUP 打印输出
ON SELECTION PAD _0ys06okzg OF _MSYSMENU ;
DO _0ys06okzh ;
IN LOCFILE("D:\WLYJ\WL\2\学生成绩管理" ,"MPX;MPR|FXP;PRG" ,"WHERE is
学生成绩管理?")
4

10-2-2 实现步骤
DEFINE POPUP 数据输入 MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF 数据输入 PROMPT "学生成绩"
DEFINE BAR 2 OF 数据输入 PROMPT "学生名单"
ON SELECTION BAR 1 OF 数据输入 do form cj
ON SELECTION BAR 2 OF 数据输入 do form stubd
DEFINE POPUP 数据修改 MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF 数据修改 PROMPT "修改数据"
DEFINE POPUP 查询统计 MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF 查询统计 PROMPT "成绩查询"
DEFINE BAR 2 OF 查询统计 PROMPT "成绩统计“
DEFINE POPUP 打印输出 MARGIN RELATIVE SHADOW COLOR SCHEME 4
4
DEFINE BAR 1 OF 打印输出 PROMPT "打印成绩"

10-2-2 实现步骤
*
************************************************
*
* _0YS06OKZH ON SELECTION PAD
*
*
*
* Procedure Origin:
*
*
*
* From Menu: 学生成绩管理.MPR,
*
* Called By: ON SELECTION PAD
*
* Prompt:
退出
*
* Snippet:
1
Record:
17
•*************************************************
PROCEDURE _0ys06okzh
clear events
4

10-2-2 实现步骤
说明:
1.
此程序由GENMENU程序自动生成。
2.
SET SYSMENU命令关闭系统菜单
3.
DEFINE PAD命令定义主菜单项。本例定义了5个主菜单项“数据
输入”、“数据修改”、“查询统计”、“打印输出”和“退出”。
主菜单的关
键字是PAD,ON PAD…表示当单击该菜单项后所执行的操作。
4.
DEFINE POPUP命令定义下拉子菜单。本例分别给4个主菜单定
义下拉菜单。下拉子菜单的关键字是POPUP,下拉子菜单的菜单
项关键字是BAR。ON SELECTION BAR…命令用于执行下拉子
菜单中的菜单项的功能。
5.
代
PROCEDURE命令定义过程。本例定义了“退出”菜单项的过程
码。
4

10-2-3 总结与提高
通过上面的实例,我们可以总结和体会到以下几点。
1.
设计菜单的时候,我们一般需要设置菜单名,然后需要选择用户单击菜单
后的结果,一般有3种:“命令”、“过程”或者子菜单,然后针对不同
的结果
需要做设计或者编写代码。
2.
在设计时,如果要打开其他的表单,只要改变前面步骤中的要调用的表单
的文件名,如实例中“DO FORM cj”即可。
3.
程序中的命令语句“PUSH MENU _MSYSMENU”将系统菜单压入堆栈,
而“POP MENU _MSYSMENU”语句将系统菜单从堆栈中弹出,即恢复
系
统菜单。这两个语句配合在菜单相关程序中使用,是一个非常好的编程习
惯,可以避免自己的程序破坏系统菜单结构。
4.
如果要使用快捷菜单,可在表单设计器窗口中选定需要调用快捷菜单的对
象,在该对象的RightClick事件过程中添加调用快捷菜单程序,或在编写
4
程序时调用快捷菜单程序。