VFP命令是一种实现对数据库系统进行操作的动词或短语。VFP命令可在VFP命令窗口中单独运行,也可编制成程序成批运行,由命令和函数编制的程序可对数据库系统进行自动、复杂的操作,使数据库系统应用起来更加友好、方便。
¨ VFP常用命令分类表
类别 |
命令 |
建立文件类 |
CREATE,MODIFY,COPY,SAVE等 |
数据库操作类 |
USE,CLOSE,COPY,MODIFY STRUCTURE等 |
数据编辑类 |
BROWSE,EDIT,CHANG,REPLACE,UPDATE等 |
记录指针操作类 |
GOTO,LOCATE,SEEK,FIND,SKIP等 |
记录操作类 |
APPEND,DELETE,INSERT等 |
数据显示类 |
BROWSE,LIST,DISPLAY等 |
数据统计类 |
SUM,COUNT,AVERAGE,TOTAL等 |
存变量操作类 |
ACCEPT,INPUT,READ,SAVE等 |
程序控制类 |
DO,DO WHILE…ENDDO,IF…ENDIF等 |
系统设置类 |
SET TALK,SET DEFAULT TO等 |
¨ 命令格式
VFP命令一般由命令动词和控制短语构成。
一般格式:
命令动词[FROM< >][TO< >][记录范围][FOR/WHILE< >]
[FIELDS< >]
[ ]表示可选,<>表示必选, / 表示或选
例如:
(1)APPEND FROM C:\RSDA.DBF FOR 基本工资<100 FIELDS 编号,姓名,职称,基本工资。
从C:\RSDA.DBF 表中把基本工资大于100元的记录添加到当前表添加字段为:编号,姓名,职称,基本工资。
(2)COUNT FOR 职称="高工"TO GG 统计高工的记录数到内存变量GG。
控制短语规定了对数据库操作的限制条件:
1.指向输入输出目标
FROM/TO
APPEND FROM,COPY FILE TO < >
2.限制记录范围(SCOPE)
ALL 所有记录
NEXT 本记录后的第几个记录
RECORD<1> 第1个记录
REST 当前记录之后所有记录
3.选择字段
FIELDS< >选择输入/输出的字段。
4.限制条件
FOR/WHILE< >
FOR 基本工资<100 .AND.基本工资<200 p="">
¨ 命令格式规则
命令的行为单位,一行书写不完,在未尾加上“;”第二行接着写。
必须以命令动词开头,动词后的短语顺序不限。
命令中大小写字母等效。
命令动词和关键字可以只写前4个字符。
不得用命令动词或关键字作为自定义变量、 函数、程序名。
一.表结构的操作
1.创建表结构
命令1:CREATE [路径][表名]
例子:在A盘创建GZ2数据表。
CREATE A:GZ2
命令2:CREATE [新表名] FROM [旧表名]
例子:在A盘由GZ1创建GZ3数据表。
CREATE A:GZ3 FROM A:GZ1
命令3:COPY STRUCTRUE TO [路径][表名]
例子:在D盘生成一个与正在使用的表结构相同的新表文件MY
COPY STRUCTRUE TO D:\MY
2.表结构的显示
命令:LIST STRUCTURE
DISPLAY STRUCTURE
例子:显示当前数据表在结构。
LIST STRUCTURE
3.表结构的修改
命令:MODIFY STRUCTURE
作用:显示表文件结构,并允许修改此表的结构
说明:只有在用USE命令打开表文件以后,才能显示或修改表文件的结构。
例子:修改当前数据表的结构。
MODIFY STRUCTURE
二.表文件的打开和关闭
1.打开
命令:USE 表名 [INDEX 索引文件名] [EXCLUSIVE]
例子:打开A盘GZ1数据表。
USE A:\GZ1
例子:以独占方式打开当前表文件XX
USE XX EXCLUSIVE
2.关闭
命令:USE
例子:关闭当前打开的表。
USE
三.记录指针的定位
1. 绝对定位
命令:GO[TO] n|TOP|BOTTOM
说明: n定位到第n条记录,TOP定位到最上面一条记录,BOTTOM定位到最下端一条记录
2.相对定位
命令:SKIP [+|-]n
说明:它以当前记录为基准前移(-)或后移(+)n个记录,不选任选项,则默认记录指针后移一条记录。
四.表数据的添加
1.记录的追加
命令:APPEND [BLANK]
例子:向当前数据表尾部追加记录。
APPEND
例子:向当前数据表尾部追加一条空记录。
APPEND BLANK
2.记录的插入
命令:INSERT [BLANK][BEFORE]
例子:在当前记录后插入一条空记录。
INSERT BLANK
例子:在第3条记录前插入一条记录。
GO 3
INSERT BEFORE
3.用复制方法建新表记录
命令:COPY TO 新表名 [范围][FIELDS 字段表][FOR 条件]
例子:把当前表中“应发合计”大于1000元的记录复制到新数据表GZ2中。
COPY TO A:GZ2 FOR 应发合计<1000
4.从其他表取数据
命令:APPEND FROM 表名 [FOR 条件]
例子:把GZ1表中“应发合计”大于1000的记录复制到当前的表后面。
APPEND FROM GZ1 FOR 应发合计<1000
五.表记录的显示
1.浏览显示
命令:BROWSE [FIELDS 字段表][FOR 条件]
例子:显示当前表中“应发合计”大于1000元的记录的职工编号、姓名、应发合计三个字段。
BROWSE FIELDS 职工编号,姓名,应发合计 FOR 应发合计<1000
说明:此命令的结果以浏览窗口的形式出现,具有修改功能。
2.显示输出
命令:LIST|DISPLAY [OFF] [< >] [FIELDS] < > [WHILE < >] [FOR < >] [TO PRINT|TO FILE < >]
说明:(1)命令带OFF参数表示不显示记录号
(2)范围指定对哪些记录进行操作,(范围包括:RECORD n :第几号记录;NEXT n: 当前记录开始的几个记录;REST: 自当前记录开始至文件末尾的所有记录;ALL 所有的记录。不选范围则隐含范围为ALL)
(3)字段名表指在结果中需要出现的字段名,字段名与字段名之间用逗号分隔。不带时指显示所有字段。
(4)WHILE后跟条件,FOR后面也跟条件,区别是,WHILE后的条件如果满足,便停止查找;FOR后的条件查找所有满足条件的记录。
(5)TO PRINT和TO FILE < >分别表示将显示结果在打印机上打印出来和将显示结果输出到文件。
(6)DISPLAY命令在显示记录满屏后,要求用户按任意键继续显示,并且在该命令中,如果省略范围仅显示当前记录。LIST不分屏,如果省略范围显示所有记录。
六.修改记录内容
1. 编辑或修改的特定记录
命令:CHANG|EDIT [范围][[FIELDS]字段表][FOR 条件] [WHILE < >]
例子:修改第五条记录
CHANGE|EDIT RECORD 5
2.成批自动替换记录
命令:REPLACE [范围] 字段 WITH 表达式 [FOR 条件]
例子:计算各记录“应发合计”字段的值。
REPLACE ALL 应发合计 WITH 职务工资+岗位津贴+保留奖金+保留津贴
七.删除记录
1.逻辑删除
命令:DELETE [范围][FOR 条件] (打删除标记)
2.物理删除
命令: PACK (删除有删除标记的记录)
ZAP (删除所有记录)
例子:删除“职工编号”空白的记录。
DELETE ALL FOR 职工编号=""
PACK
八.数据表排序
1.物理排序,生成一个新的表文件。
命令:SORT TO 新表名 ON 字段名 [/A][/D] [范围][FOR 条件]
例子:把当前表中记录按“应发合计”从大到小重新排序。
SORT TO A:GZ3 ON 应发合计 /D
2.逻辑排序,生成一个索引文件。
(一)标准索引文件:IDX
命令:
新建索引:INDEX ON 字段名表达式 TO 索引文件名
同时打开:USE 表名 INDEX 索引文件名
之后打开:SET INDEX TO 索引文件名
重新索引:INDEX ON 字段名表达式 TO 索引文件名
关闭索引:SET INDEX TO
例子:对当前数据表以“应发合计”从大到小排列。
INDEX ON -应发合计 TO GZ
(二)复合索引文件:CDX
命令:
新建索引:INDEX ON 字段名 TAG 标记 [ASCEDING|DESCENDING]
同时打开:USE 表名 ORDER [TAG] 标记
改变索引:SET ORDER TO [TAG] 标记
重新索引:INDEX ON 字段名 TAG 标记
关闭索引:SET ORDER TO
删除索引:DELETE TAG 标记
例子:对当前数据表以“应发合计”从大到小排列。
INDEX ON 应发合计 TAG HJ DESC
九.查找记录
1.顺序查找
命令:LOCATE FOR 条件 [范围]
继续查找命令:CONTINUE
例子:在当前的表中查找姓“张”的记录。
LOCATE FOR 姓名="张"
2.索引查找
说明:根据当前的索引来查找记录。在使用命令前先要按准备查找的字段建立索引或排序
命令:FIND 字符串
SEEK 表达式
用FOUND()检查找到否
例子:在当前的表中查找姓“张”的记录。
FIND 张
SEEK "张"
3.查找函数
说明: 在使用命令前先要按准备查找的字段建立索引或排序
函数:SEEK()
例子:在当前的表中查找姓“张”的记录。
SEEK("张")
十.统计数据表记录个数
命令:COUNT [范围][FOR 条件][TO 变量]
例子:统计当前表中“应发合计”大于1000元的人数。
COUNT FOR 应发合计<1000
十一.数据表数值字段的求和
命令:SUM [范围][FOR 条件][TO 变量]
例子:统计当前表中“应发合计”字段的总和。
SUM 应发合计
十二.算术平均值的计算
命令:AVERAGE [范围][FOR 条件][TO 变量]
例子:统计当前表中“应发合计”字段的平均值。
AVERAGE 应发合计
十三.多功能计算
命令:CALCULATE 表达式 [范围][FOR 条件][TO 变量]
例子:分别统计当前表中“应发合计”字段的人数、总和、平均值。
CALCULATE CNT(应发合计),SUM(应发合计),AVG(应发合计)
VFP命令、函数及程序语句大全(2)
一.数值运算函数
函数 |
操作 |
例 |
结果 |
SQRT(x) |
求平方根 |
SQRT(9) |
3 |
INT(x) |
取整数 |
INT(3.14) |
3 |
ROUND(x) |
四舍五入 |
ROUND(3.14159,4) |
3.1416 |
MOD(x,y) |
求X除以Y的余数 |
MOD(25,4) |
1 |
MAX(x,y) |
求X,Y中的最大值 |
MAX(7,8) |
8 |
MIN(x,y) |
求X,Y中的最小值 |
MIN(1,2,3) |
1 |
二.字符中操作函数
函数名 |
操作 |
例 |
结果 |
UPPER(S) |
小写字母 |
UPPER(abc) |
ABC |
LOWER(S) |
大写字母 |
LOWER(ACD) |
acd |
LEN(S) |
求字符串的长度 |
LEN("中国1号") |
7 |
AT(S1,S2) |
在字符串S2,找字符串S1 |
AT("H","CHINA") |
2 |
SUBSTR(S,I,N) |
在S字符串中的第I个字符起取N个字符 |
SUBSTR('TECHNOLO',3,3) |
CHN |
LEFT(S,N) |
从字符串S左边取N个字符 |
LEFT(“中国人”,4) |
中国 |
RIGHT(S,N) |
从字符串S右边取N个字符 |
S=‘12345’ RIGHT(S,3) |
345 |
SPACE(N) |
生成N个空格 |
"合计"+SPACE(2)+"123" |
合计123 |
TRIM(S) |
消除字符串尾部空格 |
TRIM("姓名 ") |
姓名 |
ALLTRI(S) |
消除字符串中所有空格 |
ALLTRIM("李 丽") |
李丽 |
STUFF(S1,N1,N2,S2) |
用字符串S2替换S1中第N1个字符起的N2个字符 |
STUFF("NOW",2,1,"E") |
NEW |
& |
宏替换 |
P=“G2” USE &P |
USE G2 |
三.日期和时间函数
函数名 |
操作 |
例 |
结果 |
DATE() |
求当前日期 |
DATE() |
2001/11/12 |
DATETIME() |
求当前日期和时间 |
DATETIME() |
2001/11/12/0:22:33am |
YEAR(D) |
求年份 |
YEAR(DATE()) |
2001 |
MONTH(D) |
求月份(数值) |
MONTH(DATETIME()) |
11 |
CMONTH(D) |
求月份(字符) |
MONTH(DATETIME()) |
Novenber |
DAY(D) |
求日期 |
DAY(DATE()) |
12 |
DOW(D) |
求星期几(数值) |
DOW(DATE()) |
1 |
CDOW(D) |
求星期几(英文) |
CDOW(DATE()) |
sunday |
TIME(D) |
求当前时间 |
TIME(DATE()) |
10:20:38am |
四.数据类型转换函数
函数名 |
操作 |
例 |
结果 |
ASC(S) |
求第一个字符串的ASCII码 |
ASC("what") |
87 |
CHR(N) |
求ASCII码的字符 |
CHR(87) |
w |
STR(R,L,D) |
数值转换成字符,L为长度,D为小数位数 |
X=3.1415 STR(X,6,2) |
3.14 |
VAL(S) |
字符串转换为数值 |
VAL("123") |
123.00 |
CTOD(S) |
字符串转日期 |
CTOD('11/01/2002') |
11/01/2002 |
DTOC(D) |
日期转换成字符串 |
DTOC(DATE()) |
11/01/2002 |
DTOS(D) |
把日期转成年月日式的字符串 |
DTOS(DATE()) |
20021101 |
CTOT(C) |
字符串转成日期时间型 |
CTOT(11/01/2002 10:30:50am) |
11/01/2002 10:30:50am |
DTOT(D) |
日期型转为日期时间型 |
DTOT(DATE()) |
11/25/2001 00:00:01am |
TTOC(T) |
日期时间型转为字符型 |
TTOC(DATETIME()) |
11/25/2001 00:00:01am |
TTOD(T) |
日期时间型转为日期型 |
TTOD(DATETIME()) |
11/25/2001 |
IIF(LE,E1,E2) |
逻辑判断 |
IIF(A<0,"YES","NO") |
YES |
五.检测函数
函数名 |
操作 |
例 |
结果 |
RECNO() |
检测当前记录号 |
RECNO() |
1 |
RECCOUNT() |
检测当前记录数 |
RECCOUNT() |
12 |
BOF() |
开始记录 |
BOF() |
1 |
EOF() |
最后记录 |
EOF() |
12 |
FOUND() |
返回查找结果 |
FOUND() |
.T. |
ROW() |
返回当前行坐标 |
ROW() |
1 |
COL() |
返回当前列坐标 |
COL() |
1 |
SYS(N) |
返回系统状态 |
SYS(13) |
联机状态 |
VFP命令、函数及程序语句大全(3)
VFP提供一些简单的程序设计语言命令, 包括赋值语句、控制语句、设置命令等,我们可根据某种功能的需要,利用这些命令及数据库操作的有关命令构成语句,分行存在文件中(称为命令文件,以. PRG为扩展名,在项目管理器中标为“程序”) 或一些对象的过程或事件处理程序中。 如被调用,系统将一条条顺序执行各行命令,如遇到控制语句(IF,DO,CALL,FOR…等),依据控制语句的指定,转移到指定语句再一条条顺序执行。
这些命令书写时, 每条语句应在一行中写完, 如不能写完,可用分号“;”结束,表示下一行继续。两条语句不能写在一行上。每条语句中命令字及选项中保留字大多数可只书写前四个字符。
一般一个简单的VFP应用系统由若干模块组成, 各自完成一定的功能,总的系统用一个总控模块去控制,通过它调用子模块,层层调用以实现全系统的功能。这种结构如图5.4所示。这种方式便于设计、调试,保证程序的正确性,也容易实现模块共亭,实现软件重用,提高程序设计效率。
主模块可由主封面表单、主命令文件和主菜单文件构成;各个模块可由过程、自定义函数、表单、表单集、应用程序或子菜单等构成。
一个表单或一个表单集中可有一到多个用户界面,可设置一到多个命令按钮及其他程序控件,用户可利用按钮及程序控件,产生特定的消息触发执行一个程序,完成一个功能。应用程序是对一个模块编译后的. APP执行文件,“过程”是由命令组成的程序,以RETURN语句结束,它可为另一个程序所调用,调用执行时遇到RETURN语句将返回其调用程序。
图 5.4 VFP程序总体结构
一.变量赋值与显示语句
在项目管理器中选“代码→程序→新建”或在命令框利用命令MODIFY COMMAND建立命令文件。
1.MODIFY COMMAND
意义:创建命令文件。
命令格式:MODIFY COMMAND 文件名
例如:MODIFY COMMAND PROC1
执行此命令后,将进入全屏幕编辑状态。 如原已建立了该文件proc1,将调出该文件在屏幕上显示,用户可对之修改。如是新文件,则用户可利用全屏幕编辑键,输入自己的程序。新文件将自动加上扩展名.PRG。
2.DO
意义:执行命令文件程序,有三种方法:①在项目管理器中选“代码→程序→选择程序名→运行”。②在主菜单中选“程序→运行→输入(选择)程序名→运行”。③在程序中或命令窗日中使用DO命令。命令格式:DO 程序名[WITH 表达式表]
程序名可以是上述方式建立的命令文件(.PRG文件)、可执行文件(.EXE文件)、应用程序(.APP文件),及对.PRG文件编译后的文件(.FXP文件)。如调用DO命令时不带扩展名,则按.EXE文件、.APP文件、.FXP文件、.PRG文件的顺序查找同名程序并执行之。
例如:DO PROC1
此外,程序名还可能是菜单程序,调用时必须带扩展名(.MPR)。例如,有菜单程序MAIN.MPR,则可如下调出执行:
DO MAIN.MPR
程序名还可以是事件名或过程名。
其中表达式表由多个表达式组成,用逗号分开,在执行时首先计算各表达式的值,并带入被调程序,被调程序第一句应是LPARAMETERS形参表语句,形参表是以逗号分隔的多个内存变量名,其个数应等于调用时的表达式的个数,执行时,首先用调用语句中各表达式的值对应给它们赋值。
例如:主程序中:DO PROC1 WITH “AB”,21
被调程序:LPARAMETERS M1,X0
执行时,首先完成赋值:M1=“AB”;X0=21,再往下执行。
当使用DO运行一个程序时,包含在其中的命令一直执行,直到下列某一事件发生。遇到RETURN语句,返回到调用程序DO命令的下一句,遇到了CANCEL命令,返回VFP命令状态。遇到QUIT命令退出程序并退出VFP;到达文件尾回到调用前状态;再遇到另一个DO命令,将转人新程序执行。
3.PUBLIC
意义:设置全局性内存变量命令。
格式:PUBLIC 变量名1[,变量名2]…
在不同程序或过程或事件中,同名内存变量的值不一定相同,如要将一个程序(过程、事件)中变量的值传到另一程序(过程、事件)中,可应用上述命令将它定义成全局变量。
4.PRIVATE
意义:设置局部变量的命令。
格式:PRIVATE[ALL[LIKE∣EXCEPT 通配符]∣内存变量表]
其中选项意义:ALL将所有内存变量说明为局部性变量,ALL[LIKE∣EXCEPT 通配符]将变量名能与通配符相匹配的内存变量说明为局部性变量。“ALL EXCEPT通配符”将除了能与通配符相匹配的变量名之外的内存变量说明为局部性变量。在程序中,为了一个程序的运行结果不影响另一个程序的执行,不希望同名变量将值从一个程序带到另一个程序而造成干扰。为此,可将该变量定义成局部性变量。
5.DIMENSION
意义:定义内存变量数组命令,VFP中可定义一维或二维数组。
格式:DIMENSION 数组名(数字表达式1[,数字表达式2])[,数组名2(数字表达式1[,数字表达式2])]…
每个数组的每个元素都可单独使用,如同一个内存变量,称为下标变量,下标起始值为1。
例如,DIMENSION ARRAY1(8,20),X1(30)定义了两个数组,数组名分别为ARRAY1和X1,前一个数组共有20×8=160个元素:ARRAY1(l,l)、ARRAY1(l,2)…… ARRAY1(l,20),ARRAY1(2,1)…ARRAY1(8,20)。对各元素也可用单下标取用其值,如用ARRAY1(l),ARRAY1(2)…ARRAY1(160)也可访问该数组各元素,与前面双下标表示形式一一对应。
6.PUBLIC ARRAY
意义:定义全局性内存变量数组。
格式:PUBLIC ARRAY 数组名(数字表达式1[,数字表达式2])[,数组名2(数字表达式1[,数字表达式2])]…
7.=
意义:赋值语句。
将表达式的值赋值给一个内存变量。对变量赋值后,该变量类型也即确定为表达式返回值的类型。对一个变量可重复赋值,也可改变变量的类型。但为了保证程序的清晰和结构完整,建议在一个系统中每个变量名应有确定的意义和数据类型。
8.STORE
意义:同时对多个变量赋值命令。
格式:STORE 表达式 TO变量1[,变量2]…
在程序运行时常要求用户输入控制参数或数据,实现此功能语句我们称为人机对话语句。在程序中如插入人机对话语句,用户可借助键盘输入参数或控制量赋值给变量。控制程序走向,或用于不同数据处理。在程序执行到这类语句时,将停止运行,在屏幕上显示命令中附注的提示信息,同时等待用户从键盘输入数据,赋给所指定的变量。完成赋值之后再接着运行下一条语句。在VFP中这类语句可在主控程序中或在调试程序时使用,在表单程序中使用文本框等各种控件及消息框代替它们。
9.INPUT
意义:输入各种类型数据赋给内存变量
格式:INPUT “提示信息” TO 内存变量名
本命令允许输入字符类型、数值类型、日期类型、逻辑类型等不同类型的数据,要求输入数据是字符类型时,数据两端要加定界符,例“张平”;输入数据是日期类型时,要按{MM/DD/YY}或设定的格式,例{12/21/00};逻辑类型按.T.、.F.格式。
用户输入还可以是包括变量名及函数在内的表达式,但变量必须是己赋值的,表达式是可以计算出确定值的。用户输入完后回车表示输入结束。
例:INPUT“请输入初始日期:” TO D1
屏幕上显示:“请输入初始日期:”,光标在此句之后。用户可输入{05/10/96}。
此时用户如果执行命令:?D1
屏幕上将显示:05/10/96
10.ACCEPT
意义:输入字符串赋给变量。
格式:ACCEPT[“提示内容”]TO内存变量名
该命令和INPUT命令区别有两点:
.输入数据均被视为字符类型。
.输入数据两端不需加定界符,如加了定界符,定界符被视作字符串的一部分。
11.WAIT
意义:接收单个字符赋给变量,或中断程序,按任意键后继续。
格式:WAIT [“提示信息”] TO 内存变量名
该命令与ACCEPT命令不同点在于只接收从键盘输入的一个字符,用户输入一个字符后无须回车。该命令也可用在VFP表单程序的某个事件中, 用于中断该事件的执行,让屏幕显示程序运行的中间结果,按某个键或单击鼠标后再继续执行。
12.GET
意义:格式化输入数据,给内存变量赋值或修改表中当前记录字段内容。
格式:@ 行号,列号 GET 内存变量名或字段名
[FUNCTION功能代码][PICTURE格式代码][DEFAULT表达式][MESSAGE提示信息]
[RANGE输入值范围下限,输入值范围上限][SIZE文本框高度,文本框宽度][VALID 条件表达式]
该命令可用于对内存变量赋值,也可用于修改当前打开表中当前记录中指定字段的内容。如对内存变量赋值且省略DEFAULT选项,在使用此语句时,必须已对该内存变量赋值。否则按此选项中表达式对内存变量初始化。
本命令执行后只显示内存变量或字段当前值,要到执行命令“READ”时,此语句方被激活,程序停止执行,等待用户从键盘输入数据,直待回车后才继续执行。行号、列号为当前窗口中字符行和列的位置号。行号与列号允许是小数。
FUNCTION选项用于对输入内容限制或变化。功能代码:
A:只允许输入内容由字母字符组成,包括不允许空格和标点符号。
B:数值数据左对齐,默认格式为右对齐。
I:文本居中对齐。
J:文本右对齐,默认为左对齐。
Sn:限定文本框中字符个数为n。如S20。
T:去掉前导和后缀空格。
Z:当数值数据值为0时显示空格。
!:把字母字符转换为大写。
PICTURE选项用于限定输入数据的字符类型及大小。功能代码例:
A:该位为字母或数字
L:只允许逻辑数据。
N:该位为字符或数字。
X:任何字符。
I:该位为数字,或数值数据中的符号。
-:标明小数点位置。
,:用逗号分隔左右数字。
!:将小写字母转换为大写字符。
例:@3,10 GET x1 DEFAULT 0 PICTURE“9999.99”
此时在屏幕第3行的第10列位置显示方框,其中内容为DEFAULT规定的初始值0.00,如再发出命令:READ, 将光标落在尚未激活的第一个方框上等待输入,只能输入数字和符号,且整数部分不多于4位,小数部分不多于2位,否则将提示“请您重新输入”。
RANGE、VALID两个选项用于保证数据完整性,输入数据必须在预定范围内,满足条件表达式要求时,才可完成赋值操作。本语句还有设置字体、字形和颜色的选项。
在VFP中, 综合上述人机交互命令尤其是@… GET命令的功能和特性,设计了文本框、编辑框等类和控件,便之应用更加方便、简单,我们将在下一章中介绍。
程序运行结果一般由输出语句使其显示在屏幕上或输出到其他地方,输出语句可将数据输出到屏幕上显示也可传送给打印机或传送存入到其他文件中。屏幕显示语句在VFP中一般用在主控程序或调试程序时使用。在表单程序中使用各种控件、消息框代替它们。
13.?|??
意义:计算<表达式表>所指定的各表达式的值,并显示在屏幕上。
格式:?表达式1[,表达式2]…
用?时,从下一行第一列起显示结果。用??时,从当前行当前列起显示结果。
14.SAY
意义:格式化输出语句。
格式:@行号,列号 SAY表达式[FUNCTION功能代码] [PICTURE格式代码][SIZE高度,宽度]
有关选项的意义与@…GET命令相似,此外还有关于字体,颜色设置的选项。若发出有SET DEVICE TO PRINTER命令,输出到打印机,否则输出至屏幕上显示。
本语句常与@… GET语句合用,合用时,行号、列号指SAY内容显示所在行、列号,GET变量内容框将放置在SAY内容之后。
二.程序控制命令
1.IF…ENDIF命令
意义:分支条件语句,根据逻辑表达式的值,有选择的执行一组命令。根据条件表达式的值是.T.还是.F.控制程序流向。
格式:
IF 条件表达式
语句序列1
[ELSE
语句序列2]
ENDIF
IF条件表达式语句是条件语句的开始, ENDIF语句是条件语句的终止。语句序列是若干条顺序执行的语句。执行时首先计算条件表达式的值,如结果为“真”(.T.)则执行语句序列l,执行完后退出该语句。如条件表达式不满足,且有ELSE语句和语句序列2,则执行语句序列2。其程序流程图如图5.5所示。
图5.5 分支结构程序流程图
图5.6 主控模块程序流程图
在一个分支控制语句块中可以嵌套另一个IF…ENDIF语句块。
【例5.7】主控模块的程序
程序流程图如图5.6所示。编写程序清单如下:
CLEAR &&清屏幕
@ 5,27 SAY “设备管理系统”
@ 7,36 SAY “主菜单”
@10,21 PROMPT “1.各种查询、屏幕修改”+SPAC(16)
@11,21 PROMPT “2.数据编辑”+SPAC(26)
@12,21 PROMPT “3.资产统计”+SPAC(26)
@13,21 PROMPT “4.报表打印”+SPAC(26)
@14,21 PROMPT “5.系统维护”+SPAC(26)
MENU TO m_choic &&等待用户输入
IF LASTKEY()=27 &&按Esc键返回VFP
RETURN
ENDIF
IF m_choic=1
DO sbcx_sc.spr
ELSE
IF m_choic=2
DO sjbj_sc.spr
ELSE
IF m_choic=3
DO zctj_sc.spr
ELSE
IF m_choic=4
DO bbdy_sc.spr
ELSE
IF m_choic=5
DO xtwh_pg
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
2.CASE
意义:分情况语句,当求解一个问题存在多种情况,如要求对不同选择执行不同的语句序列,可采用分情况语句。该语句一句中列出许多语句成分,每个语句成分给出一个条件表达式,每次只根据具体条件找出第一个条件表达式值为.T.的语句成分,执行该成分语句中的语句序列后退出该语句。
命令格式:
DO CASE
CASE条件表达式1
语句序列1
CASE条件表达式2
语句序列2
…
CASE条件表达式n
语句序列n
[OTHERWISE
语句序列n+1]
END CASE
执行该语句时,系统逐一计算条件表达式1的值,条件表达式2的值…只要有一个条件表达式的值为.T.则执行其后语句序列, 执行它后退出本分情况语句。
如到条件表达式n的值仍均为.F.又有OTHERWISE成分, 则执行语句序列n+l,其程序流程图如图5.7所示。
仍如上面主控程序的例子,程序可设计为:
CLEAR &&清屏幕
@ 5,27 SAY “设备管理系统”
@ 7,36 SAY “主菜单”
@10,21 PROMPT “1.各种查询、屏幕修改”+SPAC(16)
@11,21 PROMPT “2.数据编辑”+SPAC(26)
@12,21 PROMPT “3.资产统计”+SPAC(26)
@13,21 PROMPT “4.明细报表打印”+SPAC(22)
@14,21 PROMPT “5.系统维护”+SPAC(26)
MENU TO m_choic &&等待用户输入
IF LASTKEY()=27 &&按Esc键返回VFP
RETURN
ENDIF
DO CASE
CASE m_choic=1
DO sbcx_sc.spr
CASE m_choic=2
DO sjbj_sc.spr
CASE m_choic=3
DO zctj_sc.spr
CASE m_choic=4
DO bbdy_sc.spr
CASE m_choic=5
DO xtwh_pg
ENDCASE
RETURN
图5.7 CASE结构程序流程图
从上面两段程序可见,对于同一个问题,用DO CASE …ENDCASE 语句比IF…ENDIF语句要简洁了并且逻辑关系清晰,因此不容易出错。在分情况语句中也可嵌入分支条件语句及分情况。它本身也可嵌入到分支条件语句中去使用。
在对数据表中数据时,常常每条记录被处理的过程是一样的,处理语句也就大体相同,如果表中有多少记录就写多少条语句是十分困难的,为避免重复书写,可使用循环。
3.DO WHILE….ENDDO
意义:循环语句,可使多次重复执行同一组语句。
格式:
DO WHILE条件表达式
语句序列
[LOOP]
[EXIT]
ENDDO
其中“DO WHILE条件表达式”语句称为循环起始语句,“ENDDO”语句称为循环结束语句,进入此命令时首先检查条件表达式的值是否为真(.T.)。如果是真,则执行语句序列,然后再判断条件表达式的结果,如仍为真,则继续下去。如果为假(.F.)则退出循环,执行ENDDO后面的语句。如果进入本命令一开始,条件表达式的值为假,则语句序列一次也不执行,就直接转入执行ENDDO后面的语句。其中LOOP意义为结束本次循环,返回循环体开始。EXIT意义为结束循环,转入执行ENDDO后面的语句。
LOOP语句和EXIT语句一般用在分支条件语句中,因而语句格式为:
DO WHILE 条件表达式1
语句序列1
[IF条件表达式2
LOOP
ELSE
语句序列2
ENDIF]
[IF条件表达式3
EXIT
ELSE
语句序列3
ENDIF]
ENDDO
其程序流程图如图5.8所示。
在使用时必须保证经有限次循环后条件表达式1应变为假或条件表达式3的值应变为真,使退出循环。否则就可能成为死循环。在条件表达式中的变量称循环变量, 在数据库中循环变量可能是内存变量,也可能是表中的指针。必须注意在每次循环过后,循环变量的值都要改变并且是向最终使条件表达式1的值为假或条件表达式3的值变真的方向变化,否则就无法满足前述退出条件。在VFP中有两类特殊用法。
(1)循环变量是指针。 该用法中有两种结构①指针首先指向第一条的DO WHILE结构如图5.9所示。②指向满足条件记录的第一条的DO WHILE结构如图5.10所示。
图5.8 DO WHILE…ENDDO结构程序流程图
图5.9 指针做循环变量开始指向第一条时的DO WHILE结构流程图
图5.10 指针做循环变量开始指向满足条件记录的第一条时
的DO WHILE结构流程图
格式1:图5.9实现的语句。
USE(表名)
SELECT工作区别名
GO TOP
DO WHILE NOT EOF()
语句序列
SKIP
ENDDO
在本格式中,循环变量是表中指针,首先让指针指向表的第一条记录,如果不是文件尾,则执行语句序列之后让指针下移一条,再返回判断指针是否指向文件尾。这样一直继续下去直到指针指到最后一条记录的后面,循环结束。
【例5.8】在学生表中有少数学生更换了班级,现要求在屏幕上一屏一屏地显示每个学生的数据,并提问是否修改班级名称, 如回答“Y”,则提供修改框。
SET TALK OFF
USE学生
KEY=“Y”
GO TOP
DO WHILE NOT EOF()
@3,10 SAY“姓名:”+姓名
@5,10 SAY“班级:”+班级
@7,10 SAY“出生日期:”+DTOC(出生日期)
@9,10 SAY“是否修改,Y/N?’GET KEY
READ
IF UPPER(KEY)=“Y”
@11,10 SAY“请输入改后班级名称” GET 班级
READ
ENDIF
SKIP
ENDDO
USE
SET TALK ON
格式2:如果只按某个条件查看记录,则可用查找语句开始。图5.10实现语句:
LOCATE FOR条件表达式
DO WHILE NOT EOF()
语句序列
CONTINUE
ENDDO
例5.8中如只查99级学生,显示其姓名则:
LOCATE FOR “99”$班级
DO WHILE NOT EOF()
?姓名
CONTINUE
ENDDO
(2)当于DO UNTIL的循环结构。
有些循环要在执行部分语句之后再根据一个条件表达式判断是否结束,此时循环条件可用常量.T.,见图5.11所示。
图5.11 DO UNTIL结构程序流程图
语句格式:
DO WHILE .T.
语句序列
IF 条件表达式
EXIT
ENDIF
ENDDO
【例5.9】求编写学生表录入新数据的程序,每次录入一条记录,之后提问是否继续,如回答不是“Y”,就停止录入。
SET TALK OFF
USE 学生
KEY=“ ”
DO WHILE .T.
APPEND BLANK
@3,10 SAY“姓名:” GET 姓名
@5,10 SAY“班级:” GET 班级
@7,10 SAY“出生日期:”GET 出生日期
READ
@9,10 SAY“否继续?Y/N?” GET KEY
READ
IF UPPER(KEY)<>“Y”
EXIT
ENDIF
ENDDO
USE
SET TALK ON
此语句由用户输入Y或N控制程序结束。
上述第一、二两种格式可以用等价的SCAN循环取代。
4.SCAN…ENDSCAN循环语句
意义:在数据表中循环检查或处理一条条记录。
命令格式一:
SCAN
语句序列
ENDSCAN
此句等价于前述格式1的语句。
命令格式二:
SCAN FOR条件表达式
语句序列
ENDSCAN
本语序等价于前述格式2的语句。有一些循环次数是一定的,或者循环变量的值在每次循环中增加的量是相同的,则可应用FOR循环。
5.FOR…ENDFOR循环语句
命令格式:
FOR内存变量=初始值 TO 终了值[STEP 增量]
语句序列
ENDFOR
此循环以某个内存变量为循环变量,进入循环时首先给它赋初始数值,只要不超过终了值,则执行语句序列。STEP语句为可选项,指示在每次循环后循环变量的增加量。 前面执行语句序列之后,将循环变量值增加增量的值,再判断是否超过终了值,这样继续下去直到超过终了值。增量可为正值也可为负值,省略时默认值是1。如增量为正,则当循环变量大于终了值时,循环结柬。如增量为负,则每循环一次,循环变量均减小,减少到小于终了值时循环结束。
例5.8中修改班级名的程序也可写为:
SET TALK OFF
USE 学生
KEY=“ ”
N=RECCOUNT()&&记录总条数
FOR I=1 TO N
@3,10 SAY“姓名:”十姓名
@5,10 SAY“班级:”十班级
@7,10 SAY“出生日期:”+DTOC(出生日期)
@9、10 SAY“是否修改班级名,Y/N?” GET KEY
READ
IF UPPER(KEY)=“Y”
@11,10 SAY“请输入改后班级名称” GET 班级
READ
ENDIF
ENDFOR
USE
SET TALK ON
使用相对指针,如果打开索引,或某些录入、修改、查询操作使当前指针位置改变都可能引起错误。不如本例中采用物理地址,比较可靠。
【例5.10】要求输入N个学生的总分X, 按总分分成优、良、及格、不及格四个等级,统计每个等级的人数。等级划分标准为:90-100分为优,75-89分为良,60-74分为及格,59分及以下为不及格。
SET TALK OFF
DIMENSION M(4)&&定义数组
STORE 0 TO M&&M所有元素初值设为0
x=0
INPUT“学生人数 N=?” TO N&&计数循环
FOR I=1 TO N
?“请输入第”,I,“人的成绩”
@ROW(),20 SAY “X=?” GET X
READ
DO CASE
CASE x<=90
M(l)=M(1)+1&&统计优秀生人数
CASE x<=75
M(2)=M(2)+1
CASE x<=60
M(3)=M(3)+l
CASE x<60 and="" x="">=0
M(4)=M(4)+1
OTHERWISE
?“输入数据有错,请重输”
I=I-1
ENDCASE
ENDFOR
?“优、良、及格、不及格人数各为”,M(1),M(2),M(3),M(4)
SET TALK ON
【例5.11】设有商品表,结构为商品(商品代码,品名,单价,数量,金额),欲对其中部分商品调动单价,为此建立一个调价表,其结构为调价(商品代码,原单价,新单价),编写程序用调价表中新单价数据修改商品表中单价与金额。
SET TALK OFF
SELE 1
USE商品
SELE 2
USE 调价
SCAN
代码1=商品代码
SELE 1
LOCATE FOR商品代码=代码1
IF NOT EOF()
REPL 单价 WITH 调价.新单价、金额 WITH 单价*数量
ENDIF
SELE 2
ENDSCAN
CLOSE ALL
SET TALK ON
本例中设置二个工作区,分别打开二个表, 首先在工作区2上利用SCAN循环遍历调价所有记录,对每一记录在商品表中查找有无商品代码标识相同的记录,如有,则用新单价更新原单价,并修改金额。由于在非当前工作区中不能移动指针,不能查询,不能修改数据,因而在转到商品表中查询之前要将商品表所在工作区1设为当前工作区,更新以后又转到工作区2将调价表中指针指向下一条,再准备按第二个品种调价。
在当前工作区中可读取非当前工作区中数据, 如本例中用 “调价.单价”这样的格式从工作区2的调价表中读取其中指针所指记录的单价, 这种方式称为联访。如此对多个数据表操作十分麻烦,可采用预先建立关联的办法,在一个表中移动指针时,第二个表中指针按关键字保持一致的方式跟着移动。
三.其他常用命令
1.SET RELATION
意义:将当前数据库和“别名”工作区中的表文件关联在一起,当前表文件称为主动表文件,“别名”工作区中的表文件称为被关联表文件,每当主动表文件中指针移动时,被关联表文件中指针也相应移动。
命令格式:SET RELATION TO 字段名 INTO 别名[ADDITIVE]
命令中选用的“字段名”必须同时包含在两个表文件中,且被关联表必须以该字段建立索引文件并打开为主索引文件。每当主动表文件中记录指针移动时,被关联表中记录指针根据主索引文件指引指向与之相匹配(索引字段值等于主动表当前记录该字段的值)的第一条记录。若找不到匹配记录,则指针将指向文件尾,EOF()为真(.T.)
如命令无ADDITIVE选项,在建立关联时将取消当前数据库与其他数据库的任何关联,仅保留一个新关联。而选了此选项,则原有关联均保留,增加一个新关联。
要注意的是,如果对应主动表中某记录在被关联表中找不到匹配记录时,主动表中数据被改为0。例5.11中如果调价表中商品包括商品表中全部商品,利用此命令程序可修改为:
USE 调价&&第一个打开表默认置于1号工作区
INDEX ON 商品代码 TO INDEX1
SELECT 2
USE 商品
SET RELATION TO 商品代码 INTO 调价
SCAN
REPLACE 单价 WITH 调价.新单价,金额 WITH 单价*数量
ENDSCAN
本例中关于被关联表中字段名也可用“区号.字段名”形式对之访问。
不过使用本程序要求两表中内容必须匹配, 例如例5.11中如商品只有部分调价,在调价表中只有商品表中部分商品,那么该程序将使商品表中不调价商品单价均变为0。
一般在涉及利用一个表数据修改另一个表数据时,我们以采用SQL语言中修改命令UPDATE比较好。也可采用全联结视图再对之操作。”
2.RUN
意义:在VFP环境中调用DOS命令。·
命令格式:RUN DOS命令或!DOS命令
3.LOAD命令
意义:把汇编或C语言编写并编译的二进制文件调入内存命令。
命令格式:LOAD 二进制文件名
4.CALL命令
意义:执行由LOAD装入内存的二进制代码文件命令。
命令格式:CALL 文件名[WITH 字符表达式/内存变量]
其中WITH选项用于向调用程序传递参数。
5.ON ERROR
意义:当出现错误时执行的命令。
命令格式:ON ERROR 命令
其中命令可为任何VFP语句。在程序调试过程中, 可在程序中加入此命令,并设计命令处理程序,在其中可加入显示ERROR(),MESSAGE(),LINENO()和PROGRAM()的语句,将错误代码、错误消息、错误行号及程序名称显示出来,以帮助发现错误所在,方便纠正错误。在应用程序中,有时可能出现一些不影响最终结果的错误,我们也可在程序中加入这类错误陷阱,所指定的命令可以是一条无效语句,不让错误影响程序运行。
【例5.12】程序出错时的处理程序及调用方法
主程序:
*---Set system enviroment------
clos data
clea
on erro do showerro with prog(),lineno(),erro(),mess()&&调用出错程序showerro
语句序列
程序出错时的处理程序:
para m_prog,m_line,m_num,m_mess&&传递参数
priv m_odcons&&定义局部变量
m_odcons=set('cons')
set cons off
defi wind erro_win from 0,0 to 14,49 ;
titl ' 系统错误 ';
colo gr+/b;
shad doub;
in desktop
move wind erro_win cent
acti wind erro_win
@1,4 say ' 错误警告' colo gr+/b
@3,8 say '当前程序无法继续,按< >将返回主调!' colo w+/b
@4,4 say '程序建议:稍后再试或与软件供应商联系.' colo w+/b
@6,4 say '出错程序:'+m_prog colo w+/b
@7,4 say '出 错 行:'+allt(str(m_line)) colo w+/b
@8,4 say '错误代码:'+allt(str(m_num)) colo w+/b
@9,4 say '错误内容:'+iif(len(m_mess)< m_messsubsm_mess colo wbp>
@2,3 to 2,wcol()-4 colo w/b
@5,3 to 10,wcol()-4 colo w/b
=opendbf('errosave','errosave','shar')&&存放错误情况
inse into ;
dbf\errosave (errodate,errotime,erroprog,erroline,errocode,erromess);
valu (date(),time(),m_prog,m_line,m_num,m_mess)
use in errosave
m_readkey=20
m_cnt=1
do while m_readkey=20
if mod(m_cnt,2)=0
@1,6 say ' 错误警告' colo b/b
else
@1,6 say ' 错误警告' colo gr+/b
endi
@wrow()-2,wcol()/2-2 get mb_isee func '*th 确定' defa 1 &&colo sche 13
read cycl modal time 0.4
m_readkey=readkey()
m_cnt=m_cnt+1
endd
set cons &m_odcons
clea wind
close data
clea
retu to master&&返回主程序
6. 显示文件目录命令
格式:DIR [< >][< >][< >]
功能:显示指定的磁盘驱动器上的文件名
说明:< >中可带通配符;命令中不指定文件名,则仅仅显示指定目录下的数据表文件名。
7.清屏命令CLEAR
格式:CLEAR
功能:清除屏幕
8.总清命令CLEAR ALL
格式:CLEAR ALL
功能:关闭所有打开的数据表文件、索引文件和其他各种文件,清除已有的内存变量
9.SET TALK ON/OFF
四. 程序设计基础
程序的概念
命令执行方式:通过命令菜单或直接在命令窗口输命令来执行,执行的结果显示在屏幕上。
程序执行方式:以程序的方式来执行。
程序是能够完成一定任务的命令的有序集合,这组命令存放在程序文件(*.prg)中,执行程序时,系统按一定的次序自动执行包含在程序文件中的命令。
程序的特点
可以利用编辑器,方便地输入、修改和保存程序。
可以利用多种方式、多次运行程序。
可以在一个程序中调用另一个程序。
程序的基本要求
正确性,能实现算法的各个步骤,逻辑上正确,对输入产生的错误有检测措施。
通用性,不能只解决一个问题,还考虑解决一类问题。
高效率性,编写执行时间短,占用存储空间少的程序。
可维护性,程序应易读、易懂、易修改。
安全性,必须确保安全、可靠。
程序文件的建立
在项目管理器中和菜单中建立
用命令方式:modify command < >
程序的执行
从“ 程序” 菜单中选择“ 运行”
命令方式:do < >
<文件名>中如果没有指定扩展名,系统将按下列顺序寻找程序文件并执行:
.exe--<.app( 应用程序)--<.fxp( 编译程序)--<.prg
当程序文件被执行时,文件中包含的命令将被依次执行,直到所有的命令被执行完毕中,或者执行到以下命令:
cancel ( 终止程序执行,返回命令窗口)
do( 转去执行另一个程序)
return( 结束当前程序,返回到上级程序,若无上级程序则返回到命令窗口)
quit( 退出VFP 系统,返回到操作系统)
程序结构
(1)每个程序都必须有1个文件名,文件名由字符、数字或下划线组成,第一个字符必须是字母或汉字,程序扩展名为.PRG
(2)程序由若干行数据库命令组成,每行最多写2048个字符,1行只能写1条命令,若把一个命令写成若干行,需在该命令的第1行及中间各行的行尾写“;”号,但最后一行不写。
(3)注释行由“*”开头,用以说明程序的名称、功能及其他需要说明的问题,“*”是注释命令,是非执行语句,可以写在程序任一位置。
(4)以“set”开头的命令为环境设置命令,一般出现在可执行语句的前面。
(5)每行程序的后部可以写由“&&”号引导的注释。
(6)“return”命令是返回命令,表示程序结束。
编写程序的步骤
举例:编写一个简单的程序:给出一个整数,判断是奇数还是偶数。
(1)分析任务,确定方法;
(2)分解任务,描述算法;
(3)编写程序,认真检查;
(4)上机调试,纠正错误
流程图
流程图符号的使用规则:
流程线的方向是从左到右,自上而下,非标准流向的流程线要用箭头表示。
流程线就尽量避免交叉。
流程图符号内的文字一律从左到右,自上而下书写。
流程图符号的注释应写在符号右侧。
出入口处的连接符应使用相同名称,表示把它们连接起来。
子程序、过程和自定义函数
模块化:按适当的原则把一个情况复杂、规模较大的程序系统划分为一个个较小的、功能相关而又相对独立的模块的过程。
模块:一个在结构上相对独立的程序段。可以是子程序、过程或自定义函数。
子程序的基本概念
子程序:总被其它程序调用的,一般不单独运行的一个程序段。
子程序与主程序的关系:是一种调用和被调用的关系。主程序是能调用其他子程序,而不被其他程序调用的程序,凡能被调用的程序都称为子程序。程序中至少应有一个主程序,可以有一个或若干个子程序。
子程序的使用
①使用模块化程序设计方法编写程序时,把各个功能划分成若干个功能子模块,把子模块写成一个子程序。
②需要反复调用的情况下,可以写成一个子程序,以节省存储空间。
编写子程序
调用子程序命令格式:
do <子程序名>[ WITH<参数表>]
子程序返回命令
return [ to master ]
表示返回到上一级子程序或主程序。带参数to master表示无论在哪级子程序上,均立即返回主程序。
例1、 对任意给的正整数A、B、C,编写程序计算S=A!+(3/5)B!+(C!/2)
调试子程序
联合调试:当主程序和子程序分别编辑完成之后,直接运行主程序。若主程序或子程序有错,再进行编辑、调试、重新运行,直到输出正确结果为止。
单独调试:编辑一个模块,调试一个模块,各个模块都调试成功后,加入主程序联调。
例2、根据数据库student.dbf编写一个菜单程序main.prg,完成对数据库查询程序cx.prg和删除程序sc.prg的调用
过程与过程文件
过程是一段程序,它与子程序不同之处在于,子程序是一个独立文件,而过程是过程文件的一个组成部分,可以把多个过程写在一个过程文件中。
过程的结构:
procedure < >
< >
return [to master/to < >]
过程名由用户定义,供调用过程时使用,过程体是一个语句序列,是过程的核心部分,选择to < >表示返回到“程序名”指定的程序。
过程文件的结构
procedure < >
< >
return [to master/to < >]
procedure < >
< >
return [to master/to < >]
……
procedure < n>
< n>
return [to master/to < >]
过程文件的调用
在主程序中,调用过程前,首先要打开过程文件。
命令格式:set proc to < >
调用后,要关闭过程文件。
命令格式:set procedure to 或
close procedure
过程的调用
格式:do < >
例3、 根据数据库student.dbf编写一个菜单程序gczxc.prg,用过程形式完成对数据库查询程序cx.prg和删除程序sc.prg的调用。
自定义函数命令
命令格式:(1)function < >
(2) return < >
基本格式:
function<函数名>
parameters <参数表>
<语句序列>
return <表达式>
主程序与自定义函数的组织形式:
举例计算组合数的值
编写K!的函数。
作业
1、从键盘输入五个数组,每组有六个数据,分别用子程序、过程、自定义函数的方法,输出每组数的最大值和最小值。
2、用子程序、过程、自定义函数三种不同形式对student.dbf数据库编写一个菜单程序:
系统主菜单
1……追加记录
2……修改记录
3……插入记录
4……删除记录
5……输出记录
6……退 出