@ 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