ABAP Do循环 无条件循环重复执行多个语句,而不指定任何条件。DO语句通过无条件地多次执行一组语句块来实现无条件循环。
📐 语法格式 DO语句的一般格式如下:
1 2 3 DO [n TIMES]. <statement block>. ENDDO.
参数说明
n - 循环次数的数值表达式
TIMES - 可选关键字,指定循环次数
<statement block> - 要重复执行的语句块
“n”的值不应为负或零。如果它为零或为负,则不执行循环中的语句。
🔄 流程图
graph TD
A[开始DO循环] --> B{次数限制?}
B -->|有n次| C{计数器 <= n?}
B -->|无限制| D{循环继续}
C -->|是| E[执行语句块]
C -->|否| F[结束循环]
D --> G[执行语句块]
E --> H{是否继续?}
G --> H
H -->|是| D
H -->|否| F
F --> I[继续执行]
📝 基本示例 固定次数循环 1 2 3 4 REPORT YH_SEP_15. DO 15 TIMES. WRITE: / 'Hello'. ENDDO.
输出 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
无限循环(注意:需要终止条件) 1 2 3 4 5 6 7 8 9 10 11 DATA: lv_count TYPE I VALUE 1. DO. WRITE: / 'Iteration:', lv_count. lv_count = lv_count + 1. " 添加终止条件 IF lv_count > 10. EXIT. ENDIF. ENDDO.
🔧 高级用法 1. 使用VARYING子句 1 2 3 4 5 6 7 REPORT YH_SEP_15. DO 5 TIMES VARYING lv_index FROM 1 THEN 3. WRITE: / 'Index:', lv_index. " 每次循环增加3 " 1, 4, 7, 10, 13 ENDDO.
输出 :
1 2 3 4 5 Index: 1 Index: 4 Index: 7 Index: 10 Index: 13
2. 嵌套DO循环 1 2 3 4 5 6 7 8 REPORT YH_SEP_15. DO 3 TIMES. WRITE: / 'Outer loop:', sy-index. DO 2 TIMES. WRITE: ' Inner loop:', sy-index. ENDDO. ENDDO.
输出 :
1 2 3 4 5 6 7 8 9 Outer loop: 1 Inner loop: 1 Inner loop: 2 Outer loop: 2 Inner loop: 1 Inner loop: 2 Outer loop: 3 Inner loop: 1 Inner loop: 2
⚠️ 注意事项 1. 循环次数验证 1 2 3 4 5 6 7 8 9 10 11 12 13 DATA: lv_times TYPE I VALUE -5. " ❌ 错误:负数次数 DO lv_times TIMES. WRITE: / 'This will not execute'. ENDDO. " ✅ 正确:检查循环次数 IF lv_times > 0. DO lv_times TIMES. WRITE: / 'This will execute', sy-index. ENDDO. ENDIF.
2. 无限循环风险 1 2 3 4 5 " ⚠️ 危险:无限循环示例 DO. WRITE: / 'This will loop forever!'. " 忘记添加EXIT或类似终止条件 ENDDO.
3. 内存使用 1 2 3 4 5 6 7 8 9 10 11 12 " ❌ 错误:大数据量循环可能导致内存问题 DO 1000000 TIMES. DATA: lv_large_string TYPE STRING. lv_large_string = 'Some data'. " 处理数据... ENDDO. " ✅ 正确:考虑内存使用 DO 1000000 TIMES. " 直接处理数据,避免创建大型对象 " 或者分批处理 ENDDO.
💡 使用场景 1. 重复执行固定次数的任务 1 2 3 4 5 " 处理固定数量的记录 DO 100 TIMES. " 处理每个记录 PERFORM process_record USING sy-index. ENDDO.
2. 生成序列数据 1 2 3 4 5 6 7 " 生成编号序列 DATA: lv_number TYPE I VALUE 1. DO 10 TIMES. lv_number = lv_number * 2. WRITE: / 'Power of 2:', sy-index, lv_number. ENDDO.
3. 测试数据生成 1 2 3 4 5 6 7 8 9 " 生成测试数据 DO 1000 TIMES. " 创建测试记录 INSERT test_table FROM VALUE #( id = sy-index name = 'Test User ' && sy-index created_at = sy-datum ). ENDDO.
🔧 与其他循环的比较 Do循环 vs While循环
特性
Do循环
While循环
条件检查
循环体之后执行
循环体之前执行
次数控制
可以指定次数
基于条件判断
适用场景
固定次数重复
条件控制重复
风险
可能无限循环
可能一次都不执行
Do循环 vs Loop循环
特性
Do循环
Loop循环
数据源
不指定数据源
需要数据表/内表
用途
通用循环
遍历数据集合
性能
适合简单循环
适合数据处理
灵活性
更灵活
面向数据
💡 最佳实践 1. 循环设计原则
明确循环的目的和次数
确保循环有明确的终止条件
避免不必要的嵌套
2. 代码质量
使用有意义的循环变量名
在循环内处理逻辑,避免重复计算
添加适当的注释说明循环用途
3. 性能优化
避免在循环中进行复杂的操作
考虑循环次数对性能的影响
使用索引或缓存优化数据访问
4. 错误处理
添加循环异常处理机制
考虑循环超时或资源限制
确保资源正确释放