WHILE <logical expression>. <statement block>. ENDWHILE.
参数说明
<logical expression> - 逻辑表达式,决定循环是否继续
<statement block> - 要重复执行的语句块,可以是单个语句或语句块
📌循环执行顺序
WHILE循环执行由WHILE和ENDWHILE命令包围的语句,直到逻辑表达式变为false。
🔁 流程图
graph TD
A[开始WHILE循环] --> B{评估条件}
B -->|条件为真| C[执行语句块]
B -->|条件为假| D[结束循环]
C --> E{继续循环?}
E -->|是| B
E -->|否| D
D --> F[继续执行]
📝 基本示例
简单计数循环
1 2 3 4 5 6 7
REPORT ys_sep_15. DATA: a TYPE i. a = 0. WHILE a <> 8. WRITE: / 'This is the line:', a. a = a + 1. ENDWHILE.
输出:
1 2 3 4 5 6 7 8
This is the line: 0 This is the line: 1 This is the line: 2 This is the line: 3 This is the line: 4 This is the line: 5 This is the line: 6 This is the line: 7
条件控制循环
1 2 3 4 5 6 7 8 9
REPORT ys_sep_15. DATA: lv_counter TYPE I VALUE 1, lv_max TYPE I VALUE 10.
WHILE sy-subrc = 0. " 处理数据直到失败 SELECT SINGLE * FROM mara INTO @DATA(lwa_mara) WHERE matnr = 'TEST'. IF sy-subrc <> 0. EXIT. ENDIF. WRITE: / 'Material:', lwa_mara-matnr. ENDWHILE.
⚠️ 注意事项
1. 避免无限循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
" ❌ 危险:无限循环示例 DATA: lv_count TYPE I VALUE 1.
WHILE lv_count > 0. WRITE: / 'This will loop forever!'. " 忘记修改循环条件 ENDWHILE.
WHILE lv_found = abap_false. WRITE: / 'Searching...'. " 忘记检查或设置lv_found ENDWHILE.
" ✅ 正确:在循环中更新条件 WHILE lv_found = abap_false. PERFORM search_data CHANGING lv_found. IF lv_found = abap_false. WRITE: / 'Not found, retrying...'. " 添加延迟避免过快循环 WAIT UP TO 1 SECONDS. ENDIF. ENDWHILE.
3. 资源管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
" ✅ 正确:注意资源释放 WHILE lv_active = abap_true. " 打开资源 OPEN DATASET lv_file FOR INPUT IN TEXT MODE. WHILE sy-subrc = 0. READ DATASET lv_file INTO lv_data. IF sy-subrc = 0. " 处理数据 ENDIF. ENDWHILE. " 关闭资源 CLOSE DATASET lv_file. lv_active = abap_false. ENDWHILE.
💡 使用场景
1. 数据处理
1 2 3 4 5 6 7 8 9 10 11
" 读取数据直到结束 WHILE sy-subrc = 0. SELECT * FROM vbak INTO TABLE @DATA(lt_vbak) WHERE vkorg = '1000' UP TO 100 ROWS. IF sy-subrc = 0. " 处理数据 PERFORM process_orders USING lt_vbak. ENDIF. ENDWHILE.
2. 用户界面
1 2 3 4
" 保持界面直到用户退出 WHILE sy-ucomm <> 'BACK' AND sy-ucomm <> 'EXIT'. CALL SCREEN 0100. ENDWHILE.
3. 等待条件
1 2 3 4 5 6 7
" 等待某个条件满足 WHILE lv_ready = abap_false. PERFORM check_system_readiness CHANGING lv_ready. IF lv_ready = abap_false. WAIT UP TO 5 SECONDS. ENDIF. ENDWHILE.