do while 数量<600 if 数量<400 replace 数量 with 数量*2 loop endif skip enddo
分支语句(do case...endcase)
根据不同的条件执行不同的程序组。
语法:
DO CASE CASE 逻辑表达式1 程序组1 [CASE 逻辑表达式2 程序组2 ... CASE 逻辑表达式n 程序组n] [OTHERWISE 程序组0] ENDCASE 参数: CASE 逻辑表达式 程序组 ... 当程序执行到 do case 时,便检验第一个 case 的逻辑表达式(逻辑表达式1)是否为真,如不为真,接着检验第二个 case 的逻辑表达式,以此类推直到逻辑表达式n。当检测到第一个为真的逻辑表达式时,便执行跟随在其后面的程序组,执行完后跳过后面所有的 case ,接着执行 endcase 后面的语句,也就是说即使后面还有为真的逻辑表达式也不执行了。
如果所有 case 后面的逻辑表达式都为假,则执行 otherwise 后面的程序组(如果有的话, otherwise 及其程序组是可以没有的,如果没有则什么都不做,直接执行 endcase 以后的程序)
备注:
在do case 和 endcase 之间可以有任意多个 case 。
do case 和 endcase 必须配对使用,即有一个 do case 必须有一个 endcase ,否则程序会出错。
do case case 工资<=200 replace 工资 with 工资*1.5 case 工资<=300 replace 工资 with 工资*1.3 case 工资<=500 replace 工资 with 工资*1.2 otherwise replace 工资 with 工资*1.1 endcase
在这里要注意一个问题,不能把300元的 case 放在200元之前,否则一个100元的,按理应加50%,但当遇到小于300元的 case 时,其逻辑表达式为真(小于200元的肯定小于300元),因此就会执行后面的程序,加30%,并且执行完后,就不再执行其它的 case 了,这样就产生了错误的结果,所以应按从小到大的顺序来排列。
很多VFP命令执行后,会显示执行后的结果状态,如 locate for 命令执行,如找到记录的会显示被找到的记录号,否则会显示“已到文件尾”,但一般我们在程序中是不需要这些显示的,比如找到了记录就直接显示出来,没找到一般用一个对话框来给出更清楚的提示,所以在程序一开始往往要将 set talk 关闭。
FOR 变量=初始值 TO 结束值 STEP 步长值 命令组 [EXIT] [LOOP] ENDFOR | NEXT
参数描述
变量:指定一个变量作为计数器,该变量可以不预先存在,FOR 命令会自动创建。
初始值 TO 结束值:即计数器的初始值和结束值,也就是指定循环的次数。
STEP 步长值:设定计数器每次增加或减少的量,如果省略此子句,则每次增加1,比如 for jsq=1 to 10,那么将会循环10次,如果是 for jsq=1 to 10 step 2,那么循环将会是5次,因为每循环1次计数器增加2,从1到10只需增加5次就行了。
可能有人会问了,既然循环5次,那为什么不 for jsq=1 to 5 呢?这往往是为了在某些情况下使程序编起来方便和易于理解,比如要对数据表中的记录进行某项操作,要求每隔一条记录做一次,起始和结束的记录是根据具体情况变化的,也就是初始值和结束值都是变量,那么我们就可以使用步长子句,并将步长设为2,这样就不用具体去计算到底需要多少次循环了,如果再加上步长也是变量,即有时隔一条记录,有时会隔多条记录,则步长子句就更必要了。
go top dqkc=库存数 &&记下第一条记录的库存数 skip &&跳到第2条记录 scan rest &&只需扫描从第2条记录起的所有记录 replace 库存数 with dqkc+入库数-出库数 dqkc=库存数 &&记下当前记录的库存数 endscan
上面这段程序与下面这段程序是等价的:
go top dqkc=库存数 &&记下第一条记录的库存数 skip &&跳到第2条记录 do while .not. eof() replace 库存数 with dqkc+入库数-出库数 dqkc=库存数 &&记下当前记录的库存数 skip endscan
所不同的就是不用每次都 skip,系统自动移动记录指针,这样程序运行的速度快,尤其对于按条件扫描的情况就更快了,因为用 do 的话每次都要用 locate 或 continue 进行查询,速度很受影响。
与这段程序也是等价的:
go top dqkc=库存数 &&记下第一条记录的库存数 skip &&跳到第2条记录 for jsq=2 to reccount() replace 库存数 with dqkc+入库数-出库数 dqkc=库存数 &&记下当前记录的库存数 skip endfor
您喜欢用哪个呢?
注意
上面第三段程序中有个小问题,在 for 语句中用了 reccount() 函数,而函数都要经过运算才能得到结果,比起直接从一个变量中获取值要慢,假如只执行1次,两者相差无几,但上面是用在循环中,for 这一句可能会执行几十万次,那么就会使速度降低很多,为此可改成下面这样: ... jls=reccount() for jsq=2 to jls ...
CXLJ=SYS(16) &&获取当前运行的程序名及其所在路径 FOR JSQ=1 TO LEN(CXLJ) &&用一个循环找出最右边一个反斜线,将其后的程序名去掉,只剩路径 CXZF=LEFT(RIGHT(CXLJ,JSQ),1) &&从 CXLJ 的右边依次取出每个字符 IF CXZF='\' &&查看这个字符是不是反斜线 CXLJ=STUFF(CXLJ,LEN(CXLJ)-JSQ+1,JSQ,'') &&如果是,就将反斜线之后的字符全删掉并退出循环 EXIT ENDIF ENDFOR SET DEFAULT TO "&CXLJ" &&用宏替换设置隐含路径,用引号是为了带空格的路径也能正确设置
SET SKIP TO 命令
在表之间建立一对多关系。
语法
SET SKIP TO [表1 [, 表2] ...] 参数描述
表1 [, 表2] ... 为一对多表中的子表的别名。可以有多个子表,它们之间用逗号隔开。
如省略此参数,则取消一对多关系,但一对一关系仍存在。
说明
我们用 SET RELATION 命令可创建表之间的一对一关系,也就是当我们将父表的记录指针移到某一个记录上时,子表的记录指针也会移到相应的关联记录上,比如我们有一个人事档案(rsda,有字段编号、姓名等),另有一个参加项目表(cjxm,有字段编号和项目,项目中记录该人员所参加过的项目,编号建立了索引),然后用如下程序:
close all use rsda select 0 use cjxm set order to 编号 select rsda set relation to 姓名 into cjxm
SET SYSMENU TO SET SYSMENU AUTOMATIC DEFINE PAD _s950ndhs4 OF _MSYSMENU PROMPT "系统录入及查询" COLOR SCHEME 3 DEFINE PAD _s950ndhs6 OF _MSYSMENU PROMPT "系统维护" COLOR SCHEME 3 DEFINE PAD _s950ndhs7 OF _MSYSMENU PROMPT "统计" COLOR SCHEME 3 DEFINE PAD _s950ndhs8 OF _MSYSMENU PROMPT "备份数据" COLOR SCHEME 3 ON PAD _s950ndhs4 OF _MSYSMENU ACTIVATE POPUP 系统录入及 ON PAD _s950ndhs6 OF _MSYSMENU ACTIVATE POPUP 系统维护 ON PAD _s950ndhs7 OF _MSYSMENU ACTIVATE POPUP 统计 ON PAD _s950ndhs8 OF _MSYSMENU ACTIVATE POPUP 备份数据
*主菜单即为 _MSYSMENU *主菜单中的菜单项分别为 _s950ndhs4, _s950ndhs6 等 *_s950ndhs4 下的子菜单是“系统录入及” *_s950ndhs6 下的子菜单是“系统维护” DEFINE POPUP 系统录入及 MARGIN RELATIVE SHADOW COLOR SCHEME 4 DEFINE BAR 1 OF 系统录入及 PROMPT "数据录入" ; KEY ALT+L, "ALT+L" ; MESSAGE '录入房地产广告信息' DEFINE BAR 2 OF 系统录入及 PROMPT "数据查询" ; KEY ALT+C, "ALT+C" ; MESSAGE '查询和修改录入的房地产广告信息' DEFINE BAR 3 OF 系统录入及 PROMPT "数据整理" ; KEY ALT+Z, "ALT+Z" ; MESSAGE '如发现数据有问题,可调用此命令进行整理,如整理后仍有问题,请与软件供应商联系' DEFINE BAR 4 OF 系统录入及 PROMPT "\-" DEFINE BAR 5 OF 系统录入及 PROMPT "退出系统" ; KEY ALT+E, "ALT+E" ON SELECTION BAR 1 OF 系统录入及 do sjlr ON SELECTION BAR 2 OF 系统录入及 do lrsjcx ON SELECTION BAR 3 OF 系统录入及 do sjzl ON SELECTION BAR 5 OF 系统录入及 clear event