VFP命令、函数及程序语句大全(1)(2)(3)

更新时间:2024-05-29 02:32:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

VFP命令、函数及程序语句大全(1)

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命令一般由 命令动词 和 控制短语 构成。

一般格式:XXX命令动词 [FROM <源文件>] [TO<目标文件>] [记录范围] [FOR/WHILE<条件>] [FIELDS<字段名表>]

[ ]表示可选,<>表示必选, / 表示或选

例如:

(1)APPEND FROM C:\\RSDA.DBF FOR 基本工资>100 FIELDS 编号,姓名,职称,基本工资。

从C:\\RSDA.DBF 表中把基本工资大于100元的记录添加到当前表添加字段为:编号,姓名,职称,基本工资。

(2)COUNT FOR 职称=\高工\统计高工的记录数到内存变量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

? 命令格式规则

- 命令的行为单位,一行书写不完,在未尾加上“;”第二行接着写。

- 必须以命令动词开头,动词后的短语顺序不限。

- 命令中大小写字母等效。

- 命令动词和关键词可以只写前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) INT(x) ROUND(x) MOD(x,y) MAX(x,y) MIN(x,y)

二.字符中操作函数

函数名 UPPER(S) LOWER(S) LEN(S) AT(S1,S2) SUBSTR(S,I,N) LEFT(S,N) RIGHT(S,N) SPACE(N) TRIM(S) ALLTRI(S) 小写字母 大写字母 求字符串的长度 在字符串S2,找字符串S1 在S字符串中的第I个字符起取N个字符 从字符串S左边取N个字符 从字符串S右边取N个字符 生成N个空格 消除字符串尾部空格 消除字符串中所有空格 操作 UPPER(abc) LOWER(ACD) LEN(\中国1号\) AT(\) SUBSTR('TECHNOLO',3,3) LEFT(“中国人”,4) S=‘12345’ RIGHT(S,3) \合计\SPACE(2)+\TRIM(\姓名 \) 例 结果 ABC acd 7 2 CHN 中国 345 合计123 姓名 求平方根 取整数 四舍五入 求X除以Y的余数 求X,Y中的最大值 求X,Y中的最小值 操作 例 SQRT(9) INT(3.14) ROUND(3.14159,4) MOD(25,4) MAX(7,8) MIN(1,2,3) 结果 3 3 3.1416 1 8 1 ALLTRIM(\李 丽\) 李丽 NEW 用字符串S2替换S1中第N1个字符STUFF(S1,N1,N2,S2) STUFF(\,1,\) 起的N2个字符 & 宏替换 P=“G2” USE &P USE G2 三.日期和时间函数

函数名 DATE() DATETIME() YEAR(D) MONTH(D) CMONTH(D) DAY(D) DOW(D) CDOW(D) TIME(D)

四.数据类型转换函数 函数名 ASC(S) CHR(N) STR(R,L,D) VAL(S) CTOD(S) DTOC(D) DTOS(D) CTOT(C) 操作 求当前日期 DATE() 例 结果 2001/11/12 2001/11/12/0:22:33am 2001 11 Novenber 12 1 sunday 10:20:38am 求当前日期和时间 DATETIME() 求年份 求月份(数值) 求月份(字符) 求日期 YEAR(DATE()) MONTH(DATETIME()) MONTH(DATETIME()) DAY(DATE()) 求星期几(数值) DOW(DATE()) 求星期几(英文) CDOW(DATE()) 求当前时间 TIME(DATE()) 操作 求第一个字符串的ASCII码 求ASCII码的字符 例 ASC(\) CHR(87) 结果 87 w 3.14 123.00 11/01/2002 11/01/2002 20021101 11/01/2002 10:30:50am 11/25/2001 00:00:01am 11/25/2001 00:00:01am 11/25/2001 YES 数值转换成字符,L为长度,D为小数X=3.1415 字数 字符串转换为数值 字符串转日期 日期转换成字符串 把日期转成年月日式的字符串 字符串转成日期时间型 STR(X,6,2) VAL(\) CTOD('11/01/2002') DTOC(DATE()) DTOS(DATE()) CTOT(11/01/2002 10:30:50am) DTOT(DATE()) DTOT(D) 日期型转为日期时间型 TTOC(T) TTOD(T) IIF(LE,E1,E2) 日期时间型转为字符型 日期时间型转为日期型 逻辑判断 TTOC(DATETIME()) TTOD(DATETIME()) IIF(A>0,\)

五.检测函数

函数名 RECNO() RECCOUNT() BOF() EOF() FOUND() ROW() COL() SYS(N)

VFP命令、函数及程序语句大全(3)

VFP提供一些简单的程序设计语言命令, 包括赋值语句、控制语句、设置命令等,我们可根据某种功能的需要,利用这些命令及数据库操作的有关命令构成语句,分行存在文件中(称为命令文件,

操作 检测当前记录号 检测当前记录数 开始记录 最后记录 返回查找结果 返回当前行坐标 返回当前列坐标 返回系统状态 例 RECNO() RECCOUNT() BOF() EOF() FOUND() ROW() COL() SYS(13) 结果 1 12 1 12 .T. 1 1 联机状态

以. 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

@8,4 say '错误代码:'+allt(str(m_num)) colo w+/b

@9,4 say '错误内容:'+iif(len(m_mess)<=28,m_mess,subs(m_mess,1,28)+'...') colo w+/b

@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 <过程名1> <过程体1>

return [to master/to <程序名>] procedure <过程名2> <过程体2>

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??退 出

本文来源:https://www.bwwdw.com/article/dqu7.html

Top