410 likes | 665 Views
上篇 —— 语言基础. 1. 初识 Visual FoxPro 2. 表的基本操作 3. 查询与统计. 本篇描述了“以界面操作为主、命令方式为辅的” VFP 交互操作方式。第 1 章概述了设计器、项目管理器等辅助工具,展示了 VFP 的环境特色;第 2 章侧重介绍表的建立与维护;第 3 章主要讨论对表数据的查询与统计。 VFP 支持交互操作与程序执行两类工作方式,前者是后者的基础。学好本篇的内容,对初学者有重要意义。. 第 1 章 初识 Visual FoxPro. Visual FoxPro 的发展与特点 Visual FoxPro 的产生
E N D
上篇——语言基础 1.初识Visual FoxPro 2.表的基本操作 3.查询与统计
本篇描述了“以界面操作为主、命令方式为辅的”VFP交互操作方式。第1章概述了设计器、项目管理器等辅助工具,展示了VFP的环境特色;第2章侧重介绍表的建立与维护;第3章主要讨论对表数据的查询与统计。本篇描述了“以界面操作为主、命令方式为辅的”VFP交互操作方式。第1章概述了设计器、项目管理器等辅助工具,展示了VFP的环境特色;第2章侧重介绍表的建立与维护;第3章主要讨论对表数据的查询与统计。 VFP支持交互操作与程序执行两类工作方式,前者是后者的基础。学好本篇的内容,对初学者有重要意义。
第1章 初识Visual FoxPro • Visual FoxPro的发展与特点 • Visual FoxPro的产生 • Visual FoxPro的新版本 • Visual FoxPro的特点 • 功能强大的自含型命令式开发语言 • 支持面向对象的程序设计 • 通过COM组件实现应用集成 • 支持网络应用 • 大量使用可视化的辅助设计工具
1.2~ 1.3 VFP的界面组成、命令与工作方式 • VFP的窗口 • 程序窗口 • 命令窗口 • 工具窗口 • 窗口中的图标 • 菜单 • 对话框 • 命令格式 • use SB && 打开名称为SB(设备)的表文件 • list && 列表显示当前表(即SB)的所有记录 • list for 价格<10000 && 只显示价格低于1万元的设备 • 交互操作方式与程序执行方式
1.4 Visual FoxPro的设计与管理工具 • 向导 • 表向导 • 报表向导 • 设计器 • 表设计器 • 表单设计器 • 生成器 • 表单生成器 • 文本框生成器 • 项目管理器
项目管理器:VFP的控制中心 集中管理项目中的数据、对象 • 目录树结构 • 多种功能按钮 • 支持项目建立数据词典
第2章 表的基本操作2.1 表的建立与修改 设备表 设备表的结构 • 有关命令 • 创建设备表 create sb • 打开设备表 Use sb • 浏览、修改记录 browse • 修改结构 Modify structure • 关闭当前表 use
2.2 表达式 • 常量 • 数值型常量 例如10,-100,2.81828, • 字符型常量 例如"微机",'PC机',"3.14159" • 日期型和日期时间型常量 例如{06/30/1999}, {9/15/99 8:45},{^2001/08/30} • 设置通常的日期格式,命令SET STRICTDATE TO 0, • 设置严格的日期格式,命令SET STRICTDATE TO 1 • 逻辑型常量 真和假两种值, .T. . F . • 变量 • 内存变量 s='VFP' STORE 2*4 TO n1,n2,n3 ? 'S=',s && 显示S= VFP DIMENSION x(3),a(2,3) &&定义数组 a(1,3) =5 &&数组元素赋值 • 字段变量 USE sb ?名称 && SB.DBF打开后记录指针指向第1个记录,显示车床 GO 5 && 将记录指针指向第5个记录(GO命令参阅2.3.1节) ?名称 • 系统变量
2.3 VFP命令的常用子句 命令格式: LIST|DISPLAY [[FIELDS] <表达式表>][<范围>][FOR <条件>][WHILE <条件>] [OFF][ TO PRINT [PROMPT]|TO FILE <文件>] 范围子句 : ALL 所有记录 NEXT <N> 从当前记录起的N个记录 RECORD <N> 第N个记录 REST 从当前记录起到最后一个记录止的所有记录 例: USE sb GO 2 && 记录指针指向第2个记录 LIST NEXT 5 FOR 价格>10000 && 显示第2,3,6等3个记录 LIST RECORD 5 FIELDS 编号,名称,价格 USE sb LIST NEXT 3 && (1) LIST 部门,编号,名称,备注 FOR 部门="21" && (2) LIST 编号,名称,价格*0.9,启用日期 FOR YEAR(启用日期)<1995 OFF && (3)
2.4 表的维护命令 1. 表的复制 COPY FILE <文件名1> TO <文件名2> COPY TO <文件名> [<范围>][FOR <条件>][WHILE <条件>] [FIELDS <字段名表>| FIELDS LIKE <通配字段名> | FIELDS EXCEPT <通配字段名>] [[TYPE][SDF|XLS|DELIMITED[WITH <定界符>|WITH BLANK|WITH TAB]]] COPY STRUCTURE TO <文件名> [FIELDS <字段名表>] 例: USE && 若SB.DBF是打开的,则须关闭它 COPY FILE SB.DBF TO SB1.DBF && 复制得SB1.DBF COPY FILE SB.FPT TO SB1.FPT && 复制得SB1.FPT USE sb COPY TO a1 && 对sb.dbf原样复制,同时生成A1.DBF与A1.FPT COPY TO a2 FIELDS 名称,编号 FOR LEFT(部门,1)=“2” LIST && 显示SB.DBF的记录数据 USE a2 LIST && 显示A2.DBF的记录数据 USE sb COPY TO b1 NEXT 3 SDF && 以系统数据格式复制,产生文本文件B1.TXT COPY STRUCTURE TO sb2 FIELDS 名称,价格,编号,备注
2. 表数据的替换 • REPLACE <字段名1> WITH <表达式1> [ADDITIVE][,<字段名2> WITH <表达式2> [ADDITIVE]] ...[<范围>][FOR <条件>][WHILE <条件>] • SCATTER [FIELDS <字段名表>|FIELDS LIKE <通配字段名>|FIELDS EXCEPT <通配字段名>] [MEMO] TO <数组名> [BLANK] | MEMVAR [BLANK] • GATHER FROM <数组名>|MEMVAR [FIELDS <字段名表>|FIELDS LIKE <通配字段名>|FIELDS EXCEPT <通配字段名>][MEMO] • COPY TO ARRAY <数组名> [FIELDS <字段名表>][<范围>][FOR<条件>][WHILE<条件>] • APPEND FROM ARRAY <数组名> [FOR<条件>] [FIELDS<字段名表>]
3. 逻辑表的设置 • 过滤器 SET FILTER TO [<条件>] • 字段表 SET FIELDS TO [[<字段名1>[,<字段名2>...]] |ALL[LIKE <通配字段名>|EXCEPT <通配字段名>]] SET FIELDS ON|OFF
4. 建立或修改表结构的命令 • 命令: • CREATE TABLE <表名> • (<字段名1> <字段类型>[(<字段宽度> [, <小数位数>])][,<字段名2>...]) • ALTER TABLE <表名> • ADD | ALTER [COLUMN] <字段名> <字段类型> [(<字段宽度> [, <小数位数>])] • ALTER TABLE <表名> DROP [COLUMN] <字段名1>|RENAME COLUMN <字段名2> TO <字段名3> • 例: • CREATE TABLE dx(编号 c(5),年月 c(4),费用 n(6,1)) • LIST STRUCTURE && 主屏幕显示DX.DBF的结构 • INSERT INTO dx VALUES("016-1","8911",2763.5) • INSERT INTO dx VALUES("016-1","9112",3520.0) • INSERT INTO dx VALUES("037-2","9206",6204.4) • INSERT INTO dx VALUES("038-1","8911",2850.0) • LIST OFF && 主屏幕显示所有记录 • 主屏幕所显示DX.DBF的记录数据如下: • 编号 年月 费用 • 016-1 8911 2763.5 • 016-1 9112 3520.0 • 037-2 9206 6204.4 • 038-1 8911 2850.0 • ALTER TABLE dx ADD 摘要 m(4) • ALTER TABLE dx DROP 摘要
2.5 记录的维护命令 • 记录的定位与移位 例:USE SB && 当前记录为第1个记录 ?RECNO() && 显示:1 GO BOTTOM && 记录指针指向第7个记录,当前记录为第7个记录 ?RECNO() && 显示:7 GO 4 && 当前记录为第4个记录 SKIP -1 && 当前记录为第3个记录 • 记录的插入与追加 INSERT [BLANK] [BEFORE] INSERT INTO 表名[(字段名1 [,字段名2, ...])] VALUES(表达式1 [, 表达式, ...]) APPEND [BLANK] • 记录的删除与恢复 DELETE [<范围>] [FOR <条件>] [WHILE <条件>] PACK RECALL [<范围>] [FOR <条件>] [WHILE <条件>] ZAP
第3章 查询与统计3.1 排序与索引 排序: USE sb SORT TO bmx ON 部门/D,价格 FOR 主要设备 USE bmx LIST && 主窗口显示如下 记录号 编号 名称 启用日期 价格 部门 主要设备 备注 商标 1 037-2 磨床 07/21/90 241292.12 22 .T. memo gen 2 016-2 车床 01/15/92 27132.73 21 .T. memo gen 3 016-1 车床 03/05/90 62044.61 21 .T. Memo gen 4 100-1 微机 08/12/97 8810.00 12 .T. memo Gen
索引 结构复合索引文件 .CDX,主名与表的主名相同,自动维护 表3.1 索引功能分类表 建立索引文件或增加索引标识 INDEX ON <索引关键字> TO <单索引文件名> | TAG <索引标识名> [OF <复合索引文件名>] [FOR <条件>] [COMPACT] [ASCENDING|DESCENDING] [UNIQUE|CANDIDATE] [ADDITIVE] 确定主控索引 SET ORDER TO [<数值表达式>|<单索引文件名>|[TAG] <索引标识> [ASCENDING|DESCENDING]]
[例3-3] 为SB.DBF建立一个结构复合索引文件,其中包括3个索引: (1) 记录以价格降序排列,索引标识为普通索引型。 (2) 记录以部门升序排列,部门相同时则按价格升序排列,索引标识为普通索引型。 (3) 记录以部门升序排列,部门相同时则按价格降序排列,索引标识为候选索引型。 USE sb INDEX ON 价格 TAG jg DESCENDING && 建立SB.CDX,关键字价格,JG为普通索引型索引标识 LIST && 记录已按价格降序排列 INDEX ON 部门+STR(价格,9,2) TAG bmjg ; && 关键字为字符表达式“部门+STR(价格,9,2)”,索引标识BMJG增入SB.CDX LIST && 索引表达式运算后升序排列,使记录按部门升序、部门相同按价格升序排列 INDEX ON VAL(部门)-价格/1000000 TAG bmjg1 CANDIDATE ; && bmjg1为候选索引型索引标识,索引标识增入SB.CDX LIST && 索引表达式运算后升序排列,使记录按部门升序、部门相同按价格降序排列 SET ORDER TO TAG jg && 指定SB.CDX的索引标识JG为主控索引, JG 索引序号为3 LIST && 记录按价格降序排列 SET ORDER TO TAG bmjg LIST && 记录按(2)排列
3.2 查询命令 1. 顺序查询 LOCATE FOR <条件> [<范围>] [WHILE <条件>] CONTINUE USE sb LOCATE FOR 价格<15000 AND NOT 主要设备 DISPLAY && 显示: 记录号 编号 名称 启用日期 价格 部门 主要设备 备注 商标 4 038-1 钻床 10/12/89 5275.00 23 .F. Memo gen CONTINUE ?RECNO(),名称,价格,主要设备 && 显示: 6 复印机 10305.01 .F. CONTINUE && 状态条显示:已到定位范围末尾。 2. 索引查询 SEEK <表达式> USE sb INDEX ON 编号 TAG bh SEEK "038-1" && 不可写为: SEEK 编号="038-1" ?RECNO() && 显示:4 INDEX ON 启用日期 TAG qyrq SEEK {3/5/90} ?FOUND() &&.显示.T.,表示找到该日期 INDEX ON 价格 TAG jg SEEK 1000.00
打开数据工作期窗口:选定窗口菜单的数据工作期命令打开数据工作期窗口:选定窗口菜单的数据工作期命令 • 建立视图文件(.VUE): • 文件菜单的另存为命令 • CREATE VIEW <视图文件名> • 打开视图文件: SET VIEW TO <视图文件名>
多一关系 用命令序列实现: SELECT 2 USE bmdm && 打开子表 INDEX ON 代码 TAG 代码 ADDITIVE && 子表在代码字段建立索引 SELECT 1 USE sb && 打开父表 SET RELATION TO sb.部门 INTO bmdm ADDITIVE && 指定在部门字段对子表设置多一关系
建立关联命令:SET RELATION TO [<表达式1> INTO <别名1>,…,<表达式N> INTO <别名N>] [ADDITIVE]说明一多关系的命令:SET SKIP TO [<表别名1>[,<表别名2>]…] 一多关系的命令序列示例: CLOSE ALL SELECT 2 USE bmdm && 子表1 SET ORDER TO TAG 代码 SELECT 3 USE zz && 子表2 INDEX ON 编号 TAG bh SELECT 1 USE sb && 父表 SET RELATION TO sb.部门 INTO bmdm SET RELATION TO sb.编号 INTO zz ADDITIVE SET SKIP TO zz && 子表ZZ为多方 BROWSE FIELDS 编号,价格,zz.增值,bmdm.名称:H='部门名'
3.4 统计命令 • 计数命令 COUNT [<范围>] [FOR <条件1>] [WHILE <条件2>] [TO <内存变量>] • 求和命令 SUM [<数值表达式表>][<范围>][FOR <条件1>][WHILE <条件2>] [TO <内存变量表>|ARRAY <数组>] • 求平均值命令 AVERAGE [<数值表达式表>][<范围>][FOR <条件1>][WHILE <条件2>] [TO <内存变量表>|ARRAY <数组>] • 汇总命令 TOTAL TO <文件名> ON <关键字> [FIELDS <数值型字段表>] [<范围>][FOR <条件1>][WHILE <条件2>] [例3-15] 在DX.DBF中按设备的编号来汇总大修费用,试写出命令序列。 USE dx INDEX ON 编号 TAG bh TOTAL ON 编号 TO jghz FIELDS 费用 && 按编号汇总费用,写入新表JGHZ.DBF USE jghz BROWSE FIELDS 编号,费用 TITLE '大修费用汇总表'
3.5 SELECT-SQL查询 SELECT-SQL命令: SELECT [ALL | DISTINCT] [<别名>.]<SELECT表达式> [AS <列名>][,[<别名>.]<SELECT表达式>[AS <列名>]...] FROM [FORCE][<数据库名>!]<表名> [<本地名>] [[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER] JOIN <数据库名>!]<表名> [<本地名>] [ON <联接条件> ...] [[INTO <目标>][TO FILE <文件名> [ADDITIVE]TO PRINTER [PROMPT]TO SCREEN]] [PREFERENCE <名字>] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE <联接条件> [AND <联接条件>...][ANDOR <筛选条件> [ANDOR <筛选条件>...]]] [GROUP BY <组表达式>[,<组表达式>...]] [HAVING <筛选条件>] [UNION [ALL] <SELECT命令>] [ORDER BY <关键字表达式> [ASCDESC] [,<关键字表达式> [ASCDESC]...]] [TOP <数值表达式> [PERCENT]] 例: 查询大修过的设备的编号、名称和部门名: SELECT dx.编号,sb.名称,bmdm.名称 AS 部门名 FROM sb,dx,bmdm; WHERE dx.编号 = sb.编号AND bmdm.代码 = sb.部门 将SB.DBF的记录按部门升序排列,部门相同时按价格降序排列: SELECT 编号,名称,部门,价格 FROM sb ORDER BY 部门,价格 DESC 查找大修过的所有设备: SELECT DISTINCT 编号 FROM dx 求出每一设备的增值金额,并送至打印机打印: SELECT 编号,SUM(增值) FROM zz GROUP BY 编号 TO PRINTER
查询设计器 • 用查询设计器查询数据的基本步骤 打开查询设计器—进行查询设置,即设置被查询的表、联接条件、字段等输出要求和查询结果的去向—执行查询—保存查询设置。 • 打开查询设计器窗口 MODIFY QUERY <文件名> • 查看由查询生成的SQL命令 快捷菜单的“查看SQL命令” • 查询结果的图形处理 查询设计器窗口
3.6 数据库表及其数据完整性 • 数据库表与自由表 • 创建数据库SBSJ 选定文件菜单的新建命令—选定数据库选项按钮—选定新建文件按钮— 在创建对话框中键入数据库名:SBSJ(扩展名允许省略) —选定保存按钮后即产生数据库文件SBSJ.DBC,同时出现数据库设计器 • 数据库设计器
表的数据完整性 • 长名(表名/字段名) 与注释 • 字段属性 • 记录规则 • 永久关系 • 参照完整性
中篇——程序设计 4.结构化程序设计 5.菜单设计 6.表单设计基础 7.表单控件设计 8.表单高级设计 9.报表设计
VFP程序设计包括传统程序设计和面向对象程序设计两方面的内容。VFP程序设计包括传统程序设计和面向对象程序设计两方面的内容。 • 第4章简要介绍结构化程序设计的基本概念、方法及初步应用。随后的5章介绍基于对象的可视化设计,着重说明各种向导、设计器和控件工具箱等可视化设计工具的用法。 • 从第5至第9章每章一个专题,依次讨论“菜单设计”、“表单设计基础”、“表单控件设计”、 “表单高级设计”和“报表设计”等技术与操作。
第四章 程序设计初步4.1 程序文件 • 程序文件建立与修改命令: MODIFY COMMAND <文件名> • 程序的运行命令: DO <文件名> • 输入命令: INPUT [<提示信息>] TO <内存变量> • 定位输出命令 @<行,列> [SAY <表达式>] • 运行暂停命令 WAIT [<信息文本>] [TO <内存变量>] [WINDOW [AT <行>,<列>]] [NOWAIT] [CLEAR | NOCLEAR] [TIMEOUT <数值表达式>] [例4-2] WAIT命令输出信息示例。 WAIT "请检查输入内容!" WINDOW
4.2 程序的控制结构 • 顺序结构 • 分支结构 • 循环结构
4.3.4 变量的作用域 • 建立公共变量命令格式: PUBLIC <内存变量表> • 建立私有变量命令格式: PRIVATE [<内存变量表>][ALL[LIKE | EXCEPT <通配符>]] • 建立本地变量命令格式:LOCAL <内存变量表> [例4-17]变量隐藏与恢复的示例。 (1) 假定已建立了如下的程序: * e4-17.prg PARAMETERS sj && sj为私有变量,程序调用前的bj被隐藏起来 PRIVATE mj && mj为私有变量,程序调用前的同名变量mj被隐藏起来 mj =3.14*sj*sj ?”程序执行时的变量清单:” LIST MEMO LIKE ?j RETURN (2) 在命令窗口键入下列命令: RELEASE ALL && 清除用户定义的所有内存变量 mj=0 && 在命令窗口设置的变量是公共变量 bj=3 ?”程序执行前的变量清单:” LIST MEMO LIKE ?j && 显示变量清单 DO e4-17 WITH bj && bj传入e4-17 ?"程序执行后的变量清单:" && 显示变量清单 LIST MEMO LIKE ?j && 程序执行结束时,被屏蔽的变量mj,bj被恢复
4.4 窗口设计样例 • BROWSE命令 • 定义功能键 命令格式: ON KEY [LABEL <键标号>] [<命令>] • 窗口关闭命令 RELEASE WINDOWS [<窗口名表>] CLEAR WINDOWS CLEAR ALL • 信息对话框函数 函数格式: MESSAGEBOX(<字符表达式1>[,<数值表达式>[,<字符表达式2>]])
[例4-19] 设计一个可利用功能键为SB.DBF添加记录、删除或恢复记录的浏览窗口。 * e4-19.prg PUSH 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 TITLE '设 备 表'+' F4:添加 F5:删除/恢复 F6:清除'" USE sb &bs PROCEDURE tj && 添加记录 APPEND BLANK && 添加一个记录 PROCEDURE schf && 删除/恢复记录处理 IF DELETED() && 记录有删除标记返回.T. RECALL && 当前记录有删除标记则取消它, 即恢复记录 ELSE DELETE && 当前记录无删除标记则打上删除标记 ENDIF PROCEDURE pk && 清除有删除标记的记录 PACK && 清除有删除标记的记录,浏览窗口被关闭 &bs && 重新打开浏览窗口