ABAP RANGE 的使用说明

ABAP RANGE 的使用说明

ABAP RANGE 简述

ABAP中的Range是一种用于处理数据范围的结构,通常与SAP R/3系统的标准内表一起使用。在ABAP编程中,Range可以用于定义和操作数据的范围,以便进行条件筛选、变式判断等操作。使用Range可以提高取数效率和程序性能。

RANGE的结构解析

SIGN

SIGN字段用于指定范围符号,可以取’I’ (include)或’E’ (exclude),分别表示包含在区间内和区间外。

OPTION

OPTION字段用于指定操作选项

  • 等于( EQ )

  • 不等于( NE )

  • 大于( GT )

  • 在范围之间(BT)

  • 小于( LT )

  • 小于等于( LE )

LOW

用于指定范围的上边界

HIGH

用于指定范围的下边界

最简单的使用RANGE的方式

1
2
3
4
DATA: lv_age_range TYPE RANGE OF i.

lv_age_range = '10' TO '20'. " 设置RANGE的上下边界
SELECT * FROM customers WHERE age IN lv_age_range.

RANGE的值为单个值时的使用方式

当一个 RANGE 参数只包含单个值时,可以将该值同时放在 LOW 和 HIGH 字段中,因为 LOW 和 HIGH 字段通常用于表示一个范围的下限和上限,而单个值可以被认为是一个没有范围的点。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
DATA: lv_range TYPE RANGE OF i.

lv_range-sign = 'I'. " 设置为包含的值
lv_range-option = 'EQ'. " 设置操作符为等于
lv_range-low = 10. " 存储单个值
lv_range-high = lv_range-low. " 同样存储单个值

IF lv_range IS SINGLE VALUE.
WRITE: 'RANGE 参数只包含单个值:', lv_range-low.
ELSE.
WRITE: 'RANGE 参数包含多个值或范围'.
ENDIF.

这里把 10 同时赋给 LOW 和 HIGH,再用 IS SINGLE VALUE 判断是否只含单个值。

RANGE TABLE 的使用方式

使用RANGE TABLE的基本步骤如下:

1
DATA: lt_range_table TYPE RANGE OF string.
1
2
APPEND 'Value1' TO lt_range_table.
APPEND 'Value2' TO lt_range_table.
1
2
SELECT * FROM table_name
WHERE field_name IN lt_range_table.

RANGE与OPEN SQL结合的使用方式

示例:

1
2
3
4
5
6
7
8
9
10
11
DATA: lt_table TYPE TABLE OF your_table_type.
DATA: lv_range TYPE RANGE OF your_field_type.

lv_range-sign = 'I'.
lv_range-option = 'BT'.
lv_range-low = 'A'.
lv_range-high = 'G'.

SELECT * FROM your_table
INTO TABLE lt_table
WHERE your_field IN lv_range.

代码里先构造了一个 BT(between)范围 A~G,然后在 WHERE 里用 IN 直接过滤。

对RANGE变量自身的操作

对RANGE的检查操作

IS INITIAL:用于检查 RANGE 参数是否为空或未被设置。例如:

1
2
3
4
5
IF lv_range IS INITIAL.
" RANGE 参数为空
ELSE.
" RANGE 参数已设置
ENDIF.

IS SINGLE VALUE:用于检查 RANGE 参数是否只包含单个值。例如:

1
2
3
4
5
IF lv_range IS SINGLE VALUE.
" RANGE 参数只包含单个值
ELSE.
" RANGE 参数包含多个值或范围
ENDIF.

NUMBER OF INTERVALS:用于获取 RANGE 参数中包含的区间数。例如:

1
2
3
DATA: lv_interval_num TYPE i.

lv_interval_num = lv_range-NUMBER OF INTERVALS.

遍历RANGE 中 的值

使用FOR

可以使用 FOR 子句来迭代处理一个 RANGE 参数的值。FOR 子句可以与 RANGE OF 一起使用,以便逐一访问范围内的值。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
DATA: lv_range TYPE RANGE OF i.
DATA: lv_value TYPE i.

lv_range-sign = 'I'. " 设置为包含的值
lv_range-option = 'BT'. " 设置操作符为介于
lv_range-low = 10. " 设置范围下限
lv_range-high = 20. " 设置范围上限

" 使用 FOR 子句迭代处理 RANGE 参数的值
FOR lv_value IN lv_range
WRITE: / '当前值:', lv_value.
ENDFOR.

范围设为 10 到 20,LOOP 逐行取出打印:

1
2
3
4
5
6
7
8
9
10
11
当前值: 10
当前值: 11
当前值: 12
当前值: 13
当前值: 14
当前值: 15
当前值: 16
当前值: 17
当前值: 18
当前值: 19
当前值: 20

使用LOOP

1
2
3
4
5
6
7
8
9
10
11
12
REPORT ZABAP_RANGE.
DATA: lt_numbers TYPE TABLE OF i,
ls_range TYPE RANGE OF i.

lt_numbers = VALUE #( ( 5 ) ( 15 ) ( 25 ) ( 35 ) ( 45 ) ).

ls_range = VALUE #( FOR wa IN lt_numbers ( sign = 'I' option = 'EQ' low = wa ) ).


LOOP AT ls_range INTO DATA(wa1).
write: / wa1-low.
ENDLOOP.

输出结果

1
2
3
4
5
5
15
25
35
45

内表转换为RANGE

1
2
3
4
5
6
DATA: lt_numbers TYPE TABLE OF i,
ls_range TYPE RANGE OF i.

lt_numbers = VALUE #( ( 5 ) ( 15 ) ( 25 ) ( 35 ) ( 45 ) ).

ls_range = VALUE #( FOR wa IN lt_numbers ( sign = 'I' option = 'EQ' low = wa ) ).
作者

编程咖啡吧

发布于

2026-07-15

更新于

2026-07-15

许可协议

评论