41
上上——上上上上 1. 初初 Visual FoxPro 2. 初初初初初初 3. 初初初

上篇 —— 语言基础

  • Upload
    eagan

  • View
    90

  • Download
    3

Embed Size (px)

DESCRIPTION

上篇 —— 语言基础. 1. 初识 Visual FoxPro 2. 表的基本操作 3. 查询与统计. 本篇描述了“以界面操作为主、命令方式为辅的” VFP 交互操作方式。第 1 章概述了设计器、项目管理器等辅助工具,展示了 VFP 的环境特色;第 2 章侧重介绍表的建立与维护;第 3 章主要讨论对表数据的查询与统计。 VFP 支持交互操作与程序执行两类工作方式,前者是后者的基础。学好本篇的内容,对初学者有重要意义。. 第 1 章 初识 Visual FoxPro. Visual FoxPro 的发展与特点 Visual FoxPro 的产生 - PowerPoint PPT Presentation

Citation preview

Page 1: 上篇 —— 语言基础

上篇——语言基础1. 初识 Visual FoxPro2. 表的基本操作3. 查询与统计

Page 2: 上篇 —— 语言基础

本篇描述了“以界面操作为主、命令方式为辅的” VFP 交互操作方式。第 1 章概述了设计器、项目管理器等辅助工具,展示了 VFP 的环境特色;第 2 章侧重介绍表的建立与维护;第 3 章主要讨论对表数据的查询与统计。

VFP 支持交互操作与程序执行两类工作方式,前者是后者的基础。学好本篇的内容,对初学者有重要意义。

Page 3: 上篇 —— 语言基础

第 1 章 初识 Visual FoxPro Visual FoxPro 的发展与特点

Visual FoxPro 的产生Visual FoxPro 的新版本Visual FoxPro 的特点

功能强大的自含型命令式开发语言 支持面向对象的程序设计 通过 COM 组件实现应用集成 支持网络应用 大量使用可视化的辅助设计工具

Page 4: 上篇 —— 语言基础

1.2~ 1.3 VFP 的界面组成、命令与工作方式 VFP 的窗口

程序窗口 命令窗口 工具窗口 窗口中的图标

菜单 对话框 命令格式

use SB && 打开名称为 SB (设备)的表文件 list && 列表显示当前表(即 SB )的所有记录 list for 价格 <10000 && 只显示价格低于 1 万元的设备

交互操作方式与程序执行方式

Page 5: 上篇 —— 语言基础

1.4 Visual FoxPro 的设计与管理工具 向导

表向导 报表向导

设计器 表设计器 表单设计器

生成器 表单生成器 文本框生成器

项目管理器

Page 6: 上篇 —— 语言基础

项目管理器: VFP 的控制中心

集中管理项目中的数据、对象 目录树结构 多种功能按钮 支持项目建立数据词典

Page 7: 上篇 —— 语言基础

第 2 章 表的基本操作2.1 表的建立与修改设备表

编号 名称 启用日期 价格 部门 主要设备 备注 商标016-1 车床 03/05/90 62044.61 21 .T. Mem

ogen

016-2 车床 01/15/92 27132.73 21 .T. memo

gen037-2 磨床 07/21/90 241292.12 22 .T. mem

ogen

038-1 钻床 10/12/89 5275.00 23 .F. Memo

gen100-1 微机 08/12/97 8810.00 12 .T. mem

oGen

101-1 复印机 06/01/92 10305.01 12 .F. memo

gen210-1 轿车 05/08/95 151000.00 11 .F. mem

oGen有关命令

创建设备表 create sb 打开设备表 Use sb 浏览、修改记录 browse 修改结构 Modify structure 关闭当前表 use

设备表的结构

Page 8: 上篇 —— 语言基础

Browse 命令的 浏览窗口 “SB. ”商标 通用型字段窗口

Page 9: 上篇 —— 语言基础

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 节 )? 名称 系统变量

Page 10: 上篇 —— 语言基础

表 2.6 VFP 算术、关系、逻辑运算符运算 优先级 运 算 符 意 义 运算举例 ( 注解表示显示结果 )算术 8 ( ) 圆括号

7 ^ 或 ** 乘方 ?3^2 &&96 × 乘

/ 除% 取模:取两数相除的余数 ?15%4 &&3

5 + 加- 减

关系 4 < 小于 ?63<54 &&.F.<= 小于等于 ?{01/01/92}<={01/01/92} &.T.> 大于 ?"ABC">"AAAA" &&.T.

>= 大于等于 ?" 大专 ">=" 大学 " &&.T.= 相等:串比较时串首同就得真 ?"ABC"="AB" &&.T.

= = 完全相等:两串全同才得真 ?"ABC"=="AB“ &&.F.<> 、 # 或 != 不相等 ?.T.<>.F. &&.T.

$ 包含:左串是右串子串才得真 ?"BC"$"ABCD" &&.T.逻辑 3 NOT 或 ! 非:结果是右边逻辑值的反 ?NOT"BC"$"ABCD" &&.F.

2 AND 与:两边都真才得真 ?.T.AND"ABC">"AB" &&.F.1 OR 或:两边有一为真就得真 ?.T.OR4=5 &&.T.

Page 11: 上篇 —— 语言基础

表 2.8 字符处理函数 函 数 功 能 例子 ( 注解表示结果 )

SUBSTR(< 字符表达式 >,< 数值表达式 1>[,< 数值表达式 2>]) 返回 < 字符表达式 > 中第 < 数值表达式 1> 位起的长度为 < 数值表达式 2>的子串?SUBSTR("ABCD",2,2)&&"BC"

LEFT(< 字符表达式 >,< 数值表达式 >) 返回 < 字符表达式 > 左起 < 数值表达式 > 个字符的子串 ?LEFT("ABCD",2) &&"AB"

RIGHT(< 字符表达式 >,< 数值表达式 >) 返回 < 字符表达式 > 右起 < 数值表达式 > 个字符的子串 ?RIGHT("ABCD",2) &&"CD"

LEN(< 字符表达式 >) 返回字符串的长度 ?LEN("ABCD") && 4AT(< 字符表达式 1>,< 字符表达式 2>[,< 数值表达式 >]) 返回字符串 < 字符表达式 1> 在 < 字符表达式 2> 中第 < 数值表达式 > 次出现的位置

?AT("BC","ABCD",1) && 2

ALLTRIM(< 字符表达式 >) 删除字符串前导和末尾的空格 ?ALLTRIM(" ABCD ")&&"ABCD"

SPACE(< 数值表达式 >) 返回 < 数值表达式 > 个空格 ?SPACE(4) &&" "UPPER(< 字符表达式 >) 将小写字母转换为大写 ?UPPER("aBc") &&"ABC"LOWER(< 字符表达式 >) 将大写字母转换为小写 ?LOWER("aBc") &&"abc"VAL(< 字符表达式 >) 将字符串转换为数值 ?VAL("3.14") && 3.14STR(< 数值表达式 1>[,< 数值表达式 2>[,< 数值表达式 3>]]) 将数值 < 数值表达式 1> 转换为长度为< 数值表达式 2> 位 , 具有 < 数值表达式 3> 位小数的字符串

?STR(3.14,5,1) &&" 3.1"

CHR(< 数值表达式 >) 从 < 数值表达式 > 表示的 ASCII 码返回字符 ?CHR(65) &&"A"

ASC(< 字符表达式 >) 返回字符的 ASCII 码值 ?ASC("A") &&65

Page 12: 上篇 —— 语言基础

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)

Page 13: 上篇 —— 语言基础

2.4 表的维护命令1. 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 名称 , 价格 , 编号 , 备注

Page 14: 上篇 —— 语言基础

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< 字段名表 >]

Page 15: 上篇 —— 语言基础

3. 逻辑表的设置 过滤器 SET FILTER TO [< 条件 >]

字段表 SET FIELDS TO [[< 字段名 1>[,< 字段名 2>...]] |ALL[LIKE < 通配字段名 >|EXCEPT < 通配字段名 >]] SET FIELDS ON|OFF

Page 16: 上篇 —— 语言基础

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 摘要

Page 17: 上篇 —— 语言基础

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

Page 18: 上篇 —— 语言基础

第 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

Page 19: 上篇 —— 语言基础

索引结构复合索引文件 .CDX, 主名与表的主名相同 , 自动维护

表 3.1 索引功能分类表索引类型 关键字重复值 说 明 创建修改命令 索引个数普通索引 允许 “ ”可作为一对多永久关系中的 多方 INDEX 允许多个唯一索引 允许 , 但输出无重复值 为与以前版本兼容而设置候选索引 不允许 ,输入重复值将禁止存盘

可用作主关键字 , 可用于在永久关系中建立参照完整性 INDEXCREATE TABLEALTER TABLE

主索引 仅适用数据库表 , 可用于在永久关系中建立参照完整性 CREATE TABLEALTER TABLE

仅可 1 个

建立索引文件或增加索引标识 INDEX ON < 索引关键字 > TO < 单索引文件名 > | TAG < 索引标识名 > [OF < 复合索引文件名 >] [FOR < 条件 >] [COMPACT] [ASCENDING|DESCENDING] [UNIQUE|CANDIDATE] [ADDITIVE]确定主控索引 SET ORDER TO [< 数值表达式 >|< 单索引文件名 >|[TAG] < 索引标识 > [ASCENDING|DESCENDING]]

Page 20: 上篇 —— 语言基础

[ 例 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) 排列

Page 21: 上篇 —— 语言基础

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

Page 22: 上篇 —— 语言基础

3. 工作区和数据工作期

部门代码表和增值表 BMDM.DBF: ZZ.DBF: 结构 : bmdm( 代码 c(2), 名称 c(6)) 结构 : zz( 编号 c(5), 增值 n(8,2)) 记录 : 记录 : 记录号 代码 名称 记录号 编号 增值 1 11 办公室 1 016-1 2510.00 2 12 设备科 2 016-1 1000.00 3 21 一车间 3 038-1 1200.00 4 22 二车间 5 23 三车间 选择工作区命令: SELECT < 工作区号 >|< 别名 > CLOSE ALL && 关闭所有打开的表 , 当前工作区为 1 号工作区 SELECT 0 && 1 号工作区未打开过表 , 选定的工作区即该区 USE sb GO 3 && 移至 3 号记录 , 注意该记录的部门字段值为 22 SELECT 0 && 选定 2 号工作区为当前工作区 USE bmdm INDEX ON 代码 TAG dm SEEK sb. 部门 && 即 SEEK 22 ?sb. 编号 ,a. 名称 , 名称 && 显示“ 037-2 磨床 二车间”。这里“ a. 名称”指 sb. 名称 ,“ 名称”指 bmdm. 名称 SELECT sb && 选定 SB.DBF 所在工作区为当前工作区 ? 编号 , 名称 ,bmdm. 名称 && 显示“ 037-2 磨床 二车间” SELECT() && 显示: 1 SELECT 2 && 选定 2 号工作区为当前工作区

Page 23: 上篇 —— 语言基础

打开数据工作期窗口:选定窗口菜单的数据工作期命令打开数据工作期窗口:选定窗口菜单的数据工作期命令 建立视图文件建立视图文件 (.VUE):(.VUE):

• 文件菜单的另存为命令文件菜单的另存为命令 • CREATE VIEW <CREATE VIEW < 视图文件名视图文件名 >>

打开视图文件打开视图文件 : SET VIEW TO <: SET VIEW TO < 视图文件名视图文件名 >>

Page 24: 上篇 —— 语言基础

3.3 表的关联

关联的多一关系与一多关系

Page 25: 上篇 —— 语言基础

多一关系在数据工作期窗口建立多一关系:

SET STRICTDATE TO 0BROWSE FIELDS BMDM. 名称 :H=' 部门名‘ ; Sb. 编号 , Sb. 名称 :H=‘ 设备名’ ,Sb. 启用日期 ; FOR Sb. 启用日期 >={01/01/92}

浏览结果: 多一关系显示部门名用命令序列实现:SELECT 2USE bmdm && 打开子表INDEX ON 代码 TAG 代码 ADDITIVE && 子表在代码字段建立索引SELECT 1USE sb && 打开父表SET RELATION TO sb. 部门 INTO bmdm ADDITIVE && 指定在部门字段对子表设置多一关系

Page 26: 上篇 —— 语言基础

建立关联命令: 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='部门名 '

一父多子浏览窗口

Page 27: 上篇 —— 语言基础

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 ' 大修费用汇总表 '

Page 28: 上篇 —— 语言基础

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

Page 29: 上篇 —— 语言基础

查询设计器 用查询设计器查询数据的基本步骤 打开查询设计器—进行查询设置 , 即设置被查询的表、联接条件、字段等输出要求

和查询结果的去向—执行查询—保存查询设置。 打开查询设计器窗口 MODIFY QUERY < 文件名 >

查看由查询生成的 SQL 命令 快捷菜单的“查看 SQL 命令” 查询结果的图形处理

查询设计器窗口查询设计器窗口

Page 30: 上篇 —— 语言基础

3.6 数据库表及其数据完整性 数据库表与自由表创建数据库 SBSJ 选定文件菜单的新建命令—选定数据库选项按钮—选定新建文件按钮— 在创建对话框中键入数据库名 :SBSJ( 扩展名允许省略 ) — 选定保存按钮后即产生数据库文件 SBSJ.DBC, 同时出现数据库设计器数据库设计器

数据库 SBSJ 的永久关系 (图 3.34)

Page 31: 上篇 —— 语言基础

表的数据完整性

长名 ( 表名 / 字段名 )

与注释 字段属性 记录规则 永久关系 参照完整性

图 3.32 SB 数据库表的字段选项卡

Page 32: 上篇 —— 语言基础

中篇——程序设计4. 结构化程序设计 5. 菜单设计6. 表单设计基础 7. 表单控件设计8. 表单高级设计 9. 报表设计

Page 33: 上篇 —— 语言基础

VFP 程序设计包括传统程序设计和面向对象程序设计两方面的内容。 第 4 章简要介绍结构化程序设计的基本概念、方法及初步应用。随后的 5 章介绍基于对象的可视化设计,着重说明各种向导、设计器和控件工具箱等可视化设计工具的用法。 从第 5 至第 9 章每章一个专题,依次讨论“菜单设计”、“表单设计基础”、“表单控件设计”、 “表单高级设计”和“报表设计”等技术与操作。

Page 34: 上篇 —— 语言基础

第四章 程序设计初步4.1 程序文件

程序文件建立与修改命令 : MODIFY COMMAND < 文件名 > 程序的运行命令 : DO < 文件名 > 输入命令: INPUT [< 提示信息 >] TO < 内存变量 > 定位输出命令 @< 行 , 列 > [SAY < 表达式 >]

运行暂停命令 WAIT [< 信息文本 >] [TO < 内存变量 >] [WINDOW [AT < 行 >,< 列 >]] [NOWAIT] [CLEAR | NOCLEAR] [TIMEOUT < 数值表达式 >] [ 例 4-2] WAIT 命令输出信息示例。 WAIT " 请检查输入内容! " WINDOW

Page 35: 上篇 —— 语言基础

4.2 程序的控制结构

分支语句格式: IF < 逻辑表达式 >

< 语句序列 1> [ELSE

< 语句序列 2>]ENDIF例:

USE sb LOCATE FOR NOT 主要设备 IF FOUND() && 若查到 ,FOUND 函数返回 .T. DISPLAY 名称 , 价格 REPLACE 价格 WITH 价格 *(1-0.1) DISPLAY 名称 , 价格 ELSE WAIT " 无此设备! " WINDOW ENDIF USE RETURN

多分枝语句格式:DO CASE CASE < 逻辑表达式 1> < 语句序列 1> CSAE < 逻辑表达式 2> < 语句序列 2> … CASE < 逻辑表达式 n> < 语句序列 n> [OTHERWISE < 语句序列 n+1>]ENDCASE

顺序结构顺序结构 分支结构分支结构 循环结构循环结构

Page 36: 上篇 —— 语言基础

循环语句格式与示例条件循环 步长循环

DO WHILE < 逻辑表达式 > < 语句序列 >ENDDO

FOR < 内存变量 >=< 数值表达式 1> TO < 数值表达式 2> [STEP < 数值表达式 3>] < 语句序列 >ENDFOR NEXT

* e4-7.prg USE sb DO WHILE NOT EOF( ) IF 价格 >10000 ? 名称 ENDIF SKIP ENDDO USE

* e4-9.prg s=0 && s 为累加器 , 初值为 0 FOR i=1 TO 100 && i 为计数器 , 初值为 1

s=s+i && 累加 NEXT ?"s=",s

Page 37: 上篇 —— 语言基础

扫描循环 其他SCAN [< 范围 >] [FOR< 逻辑表达式 1>] [WHILE< 逻辑表达式2>] < 语句序列 >ENDSCAN

循环辅助语句 LOOP 语句 EXIT 语句

多重循环 * e4-10.prg USE sb SCAN FOR 价格 >10000 ? 名称 ENDSCAN USE

Page 38: 上篇 —— 语言基础

4.3 多模块程序 类型 格式 调用命令

子程序 [ PARAMETERS < 参数表 >]

< 命令序列 >

[RETURN]

DO < 程序名 1> [WITH < 参数表>] [IN < 程序名 2>]

自定义函数主要在表达式中调用过程 PROCEDURE < 过程名 >

[PARAMETERS < 参数表>]

< 命令序列 >

[RETURN]

自定义函数

[FUNCTION < 函数名 >]

[PARAMETERS < 参数表 >]

< 语句序列 >

[RETURN < 表达式 >]

Page 39: 上篇 —— 语言基础

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 被恢复

Page 40: 上篇 —— 语言基础

4.4 窗口设计样例 BROWSE 命令 定义功能键 命令格式: ON KEY [LABEL < 键标号 >] [< 命令 >] 窗口关闭命令 RELEASE WINDOWS [< 窗口名表 >]

CLEAR WINDOWS

CLEAR ALL 信息对话框函数 函数格式: MESSAGEBOX(< 字符表达式 1>[,< 数值表达式 >[,< 字符表达式 2>]])

Page 41: 上篇 —— 语言基础

[ 例 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 && 重新打开浏览窗口