ABAP Do循环

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. 错误处理

  • 添加循环异常处理机制
  • 考虑循环超时或资源限制
  • 确保资源正确释放