在条件为 TRUE 时执行循环。
[DO] WHILE <lCondition>
<Statements>...
[EXIT]
<Statements>...
[LOOP]
<Statements>...
END[DO]
<lCondition> | DO WHILE 循环的逻辑控制表达式。 |
EXIT | 无条件地跳出 FOR、FOREACH、REPEAT 或 DO WHILE 循环,执行 ENDDO 或 NEXT 语句之后的语句。 |
LOOP | 将控制转移到最近执行的 FOR、FOREACH、REPEAT 或 DO WHILE 语句。 |
当条件评估结果为 TRUE 时,控制权将进入结构,并继续运行,直到遇到 EXIT、LOOP 或 ENDDO。 ENDDO 会将控制权返回给 DO WHILE 语句,然后重复该过程。 如果条件评估结果为 FALSE,则 DO WHILE 结构终止,控制权转到紧跟 ENDDO 之后的语句。
使用 EXIT 可以根据 DO WHILE 条件以外的条件终止 DO WHILE 结构。 相比之下,LOOP 会根据中间条件阻止 DO WHILE 中语句的执行,并返回到最近的 DO WHILE 语句。
控制结构可以嵌套到任意深度。 唯一的要求是每个控制结构都必须正确嵌套。
本例演示了简单分组报告的典型控制结构:
LOCAL cOldSalesman, nTotalAmount
USE sales INDEX salesman NEW
DO WHILE .NOT. EOF()
cOldSalesman := Sales->Salesman
nTotalAmount := 0
DO WHILE cOldSalesman = Sales->Salesman ;
.AND. (.NOT. EOF())
? Sales->Salesman, Sales->Amount
nTotalAmount := nTotalAmount + Sales->Amount
SKIP
ENDDO
? "Total: ", nTotalAmount, "for", cOldSalesman
ENDDO
CLOSE sales
该代码片段演示了如何使用 LOOP 提供中间处理条件:
DO WHILE <lCondition>
<Initial Processing>...
IF <Intermediate Condition>
LOOP
ENDIF
<Continued Processing>...
ENDDO
下一个示例演示了如何使用 DO WHILE 来模拟 "repeat until 循环 "结构:
LOCAL lMore := TRUE
DO WHILE lMore
<Statements>...
lMore := <lCondition>
ENDDO
在这里,DO WHILE 循环按顺序移动数据库文件(的指针):
DO WHILE .NOT. EOF()
<Statements>...
SKIP
ENDDO
BEGIN SEQUENCE, DBEval(), DO CASE, FOR, IF, RETURN, EXIT, LOOP