ABAP CONTINUE语句

ABAP CONTINUE语句

ℹ️概述
CONTINUE语句用于循环的语句块中,以立即和无条件地终止单个循环。一旦执行CONTINUE语句,当前处理块中剩余语句的执行将停止,并处理下一个循环遍历。

📐 语法格式

1
CONTINUE.

特点

  • 立即执行
  • 无条件跳过
  • 不需要任何参数
  • 只能在循环内部使用

🔄 执行流程



graph TD
    A[开始循环迭代] --> B{执行语句}
    B --> C{遇到CONTINUE?}
    C -->|是| D[跳过剩余语句]
    C -->|否| E{继续执行}
    D --> F[进入下一次迭代]
    E --> G{循环结束?}
    F --> H[开始下一次循环]
    G --> I[结束循环]
    H --> B


📝 基本示例

简单跳过

1
2
3
4
5
6
7
REPORT yh_sep_15.
DO 5 TIMES.
IF sy-index = 3.
CONTINUE. " 跳过第3次迭代
ENDIF.
WRITE / sy-index.
ENDDO.

输出

1
2
3
4
1
2
4
5

跳过特定条件

1
2
3
4
5
6
7
8
REPORT yh_sep_15.
DO 10 TIMES.
" 跳过偶数
IF sy-index MOD 2 = 0.
CONTINUE.
ENDIF.
WRITE: / 'Odd number:', sy-index.
ENDDO.

输出

1
2
3
4
5
Odd number: 1
Odd number: 3
Odd number: 5
Odd number: 7
Odd number: 9

🔧 高级用法

1. 在嵌套循环中使用

1
2
3
4
5
6
7
8
9
10
11
12
REPORT yh_sep_15.
DO 3 TIMES.
WRITE: / 'Outer loop:', sy-index.

DO 5 TIMES.
IF sy-index = 2.
WRITE: ' Skipping inner iteration'.
CONTINUE.
ENDIF.
WRITE: ' Processing:', sy-index.
ENDDO.
ENDDO.

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Outer loop: 1
Processing: 1
Skipping inner iteration
Processing: 3
Processing: 4
Processing: 5
Outer loop: 2
Processing: 1
Skipping inner iteration
Processing: 3
Processing: 4
Processing: 5
Outer loop: 3
Processing: 1
Skipping inner iteration
Processing: 3
Processing: 4
Processing: 5

2. 结合系统变量

1
2
3
4
5
6
7
8
9
REPORT yh_sep_15.
DO 10 TIMES.
" 跳过周末(假设1-7是周一到周日)
IF sy-index = 6 OR sy-index = 7.
WRITE: / 'Weekend - Skipping'.
CONTINUE.
ENDIF.
WRITE: / 'Working day:', sy-index.
ENDDO.

输出

1
2
3
4
5
6
7
8
9
10
Working day: 1
Working day: 2
Working day: 3
Working day: 4
Working day: 5
Weekend - Skipping
Weekend - Skipping
Working day: 8
Working day: 9
Working day: 10

3. 数据处理中的CONTINUE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
REPORT yh_sep_15.
DATA: lt_numbers TYPE TABLE OF i,
lv_sum TYPE I.

" 填充测试数据
DO 10 TIMES.
APPEND sy-index TO lt_numbers.
ENDDO.

" 计算总和,跳过特定值
LOOP AT lt_numbers INTO DATA(lv_number).
IF lv_number MOD 3 = 0. " 跳过3的倍数
CONTINUE.
ENDIF.
lv_sum = lv_sum + lv_number.
ENDLOOP.

WRITE: / 'Sum (excluding multiples of 3):', lv_sum.

⚠️ 注意事项

1. CONTINUE vs EXIT

语句 作用 区别
CONTINUE 跳过当前迭代,进入下一次 循环继续
EXIT 完全退出循环 循环结束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
REPORT yh_sep_15.
DO 5 TIMES.
IF sy-index = 3.
" CONTINUE - 跳过第3次,继续第4次
CONTINUE.
ENDIF.
WRITE: / 'CONTINUE - Index:', sy-index.
ENDDO.

DO 5 TIMES.
IF sy-index = 3.
" EXIT - 完全退出循环
EXIT.
ENDIF.
WRITE: / 'EXIT - Index:', sy-index.
ENDDO.

输出

1
2
3
4
5
6
CONTINUE - Index: 1
CONTINUE - Index: 2
CONTINUE - Index: 4
CONTINUE - Index: 5
EXIT - Index: 1
EXIT - Index: 2

2. 代码可读性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
" ✅ 好的代码结构
LOOP AT lt_data INTO lwa_data.
" 检查跳过条件
IF lwa_data-status = 'INACTIVE'.
CONTINUE.
ENDIF.

" 处理有效数据
PERFORM process_data USING lwa_data.
ENDLOOP.

" ❌ 避免嵌套过深
LOOP AT lt_data INTO lwa_data.
IF lwa_data-status = 'ACTIVE'.
IF lwa_data-flag = 'YES'.
IF lwa_data-amount > 0.
PERFORM process_data USING lwa_data.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.

3. 性能考虑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
" ✅ 使用CONTINUE减少不必要操作
LOOP AT lt_100000_items INTO lwa_item.
IF lwa_item-deleted = 'X'.
CONTINUE.
ENDIF.

" 只处理有效项目
lwa_item-processed = abap_true.
MODIFY lwa_item.
ENDLOOP.

" ❌ 每个项目都检查标志
LOOP AT lt_100000_items INTO lwa_item.
IF lwa_item-deleted = 'X'.
" 不做任何事
ELSE.
lwa_item-processed = abap_true.
MODIFY lwa_item.
ENDIF.
ENDLOOP.

💡 使用场景

1. 数据过滤

1
2
3
4
5
6
7
8
9
10
11
12
" 过滤无效数据
SELECT * FROM vbak INTO TABLE @DATA(lt_vbak).

LOOP AT lt_vbak INTO DATA(lwa_vbak).
" 跳过无效订单
IF lwa_vbak-vkorg = '9999'. " 测试系统
CONTINUE.
ENDIF.

" 处理有效订单
PERFORM process_order USING lwa_vbak.
ENDLOOP.

2. 条件处理

1
2
3
4
5
6
7
8
9
10
" 处理特定条件
DO 100 TIMES.
" 跳过不需要处理的项
IF sy-index < 10 OR sy-index > 90.
CONTINUE.
ENDIF.

" 处理中间的项
WRITE: / 'Processing:', sy-index.
ENDDO.

3. 错误处理

1
2
3
4
5
6
7
8
9
10
" 处理批量数据
LOOP AT lt_files INTO DATA(lwa_file).
TRY.
" 处理文件
PERFORM process_file USING lwa_file.
CATCH cx_sy_file_open INTO DATA(lx_error).
" 跳过错误文件
CONTINUE.
ENDTRY.
ENDLOOP.

🔧 优化技巧

1. 减少嵌套



graph LR
    A[原始代码] --> B[优化后]
    A --> A1[IF条件]
    A1 --> A2[IF条件]
    A1 --> A3[代码块]
    B --> B1[CONTINUE]
    B --> B2[代码块]

2. 提前返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
" ✅ 使用CONTINUE简化逻辑
METHOD process_items.
LOOP AT me->gt_items INTO DATA(lwa_item).
" 跳过不需要的项
IF lwa_item-type = 'VOID'.
CONTINUE.
ENDIF.

" 处理逻辑
IF lwa_item-quantity <= 0.
CONTINUE.
ENDIF.

" 最终处理
me->process_item( lwa_item ).
ENDLOOP.
ENDMETHOD.

3. 合并条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
" ✅ 合并多个条件
LOOP AT lt_data INTO lwa_data.
IF lwa_data-status = 'INACTIVE' OR
lwa_data-flag = 'DELETED' OR
lwa_data-amount = 0.
CONTINUE.
ENDIF.

" 处理逻辑
ENDLOOP.

" ❌ 分散条件
LOOP AT lt_data INTO lwa_data.
IF lwa_data-status = 'INACTIVE'.
CONTINUE.
ENDIF.

IF lwa_data-flag = 'DELETED'.
CONTINUE.
ENDIF.

IF lwa_data-amount = 0.
CONTINUE.
ENDIF.

" 处理逻辑
ENDLOOP.

💡 最佳实践

1. CONTINUE使用原则

  • 在循环开头放置CONTINUE条件
  • 保持代码逻辑清晰
  • 使用有意义的条件判断

2. 代码可读性

  • 避免过多嵌套的IF语句
  • 使用CONTINUE简化逻辑
  • 添加必要的注释

3. 性能优化

  • 使用CONTINUE跳过不需要的处理
  • 减少不必要的数据操作
  • 考虑循环的整体效率

4. 错误处理

  • 结合异常处理使用CONTINUE
  • 确保资源正确释放
  • 记录跳过的原因(可选)