用自定义关键字读取单行
要从有自定义关键字的内表中读取单行,请使用READ语句的WITH KEY选项,用法如下:
语法
READ TABLE <itab> [INTO <wa>] WITH KEY <key> [BINARY SEARCH].
用 INTO 选项可以指定目标区域 。如果表格有表头行,则可以忽略 INTO 选项。这样,表格工作区域就成了目标区域。
系统读取 <itab> 中匹配 <key> 中所定义的关键字的第一个条目。关于二分法搜索选项的详细信息,参见二分法搜索。
如果找到有适当关键字的条目,则将系统字段 SY-SUBRC设置为0,并且SY-TABIX包含该行的索引。否则,将 SY-SUBRC设置为非0值 。
如下所述,可以定义多个关键字 <key>:
定义一系列关键字段
要定义自己的一系列关 键字段,请使用 WITH KEY 选项,用法如下:
语法
....WITH KEY <k1> = <f1> ... <kn> = <fn> ...
自定义关键字包含表格组件 <k1>...<kn>。字段 <f1>...<fn> 是关键字段的内容必须匹配的值。
如果 <fi> 的数据类型与数据类型 <ki> 不兼容,则 <fi> 转换为类型 <ki>。
可以用 (<ni>) 代替 <ki> 来实时设置关键字段。关键字段是字段 <ni> 的内容。如果在运行时 <ni> 为空,则系统忽略该关键字段。如果 <ni> 包含无效的组件名称,则发生实时错误。
用户可以为任何在关键字中使用的组件指定偏移量和长度(参见指定数据对象的偏移量)。
将整行定义为关键字
通过使用 WITH KEY 选项可将内表整行定义为其关键字 ,如下所示 :
语法
....WITH KEY = <value> ...
如果 <value> 的数据类型与表格行的数据类型不兼容,则将 <value> 转换为表格 行的数据类 型。
对于此类关键字,也可以选择由某个基本数据类型或内表直接定义的,而不是由 段串直接定义的特定内表行。
将行首定义为关键字
要将内表的行首定义为关键字,请使用 WITH KEY 选项,用法如下:
语法
....WITH KEY <k> ...
系统将(左 对齐)的行首与 <k> 进行比较。 <k> 不能包含内表或包含内表的结构。与上面两个选项不同之处在于用 <k> 的数据类型进行比较。
示例:
DATA: BEGIN OF LINE,
COL1 TYPE C,
COL2 TYPE P DECIMALS 5,
COL3 TYPE I,
COL4 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 10 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SQRT( SY-INDEX ).
LINE-COL3 = SY-INDEX ** 2.
LINE-COL4 = SY-INDEX ** 3.
APPEND LINE TO ITAB.
ENDDO.
READ TABLE ITAB INTO LINE WITH KEY COL3 = 9 COL4 = 36.
WRITE: / SY-SUBRC, SY-TABIX.
READ TABLE ITAB INTO LINE WITH KEY COL3 = 9 COL4 = 27.
WRITE: / SY-SUBRC, SY-TABIX.
READ TABLE ITAB INTO LINE WITH KEY '2'.
WRITE: / SY-SUBRC, SY-TABIX.
其输出为:
4 0
0 3
0 2
在此,创建包含四列的内表。对表格的10行进行填充之后,用自定义关键字读取单行。有关键字段 COL3、COL4 的自定义序列的第一个 READ 语句失败,第二个 READ 语句找到索引为 3 的行。第三 个 READ 语句搜索以 “2”开始的表格行并找到索引为 2的行。下图显示主要步骤:
示例:
DATA ITAB TYPE I OCCURS 10,
DATA SQUARE TYPE I.
DO 30 TIMES.
SQUARE = SY-INDEX ** 2.
APPEND SQUARE TO ITAB.
ENDDO.
READ TABLE ITAB INTO SQUARE WITH KEY = 25.
WRITE: SY-SUBRC, SY-TABIX.
其输出为:
0 5
在此创建包含基本类型 I 行的内表。 填充完表格之后,读取值为 25 且索引为 5 的行。
二分法搜索
用关键字读取单行时,可以执行二分法搜索以代替标准顺序搜索。为此,请使用READ语句的二分法搜索选项。
语法
READ TABLE <itab> ..... BINARY SEARCH.
如果使用二分法搜索选项,则必须按关键字 中指定的次 序对内表进 行排序。
如果系统找 到匹配指定 关键字的多 行,则读取 索引最低的 行。
二分法搜索 比线性搜索 要快。因此 ,应尽可能 将内表排序 并且使用 二分法搜索 选项。
指定数据对象的偏移量
在 ABAP/4 中,可以在 所有处理数 据对象的语句中指定基本数据对象的偏移量值 。
为此,请在语句中指定 数据对象名称,如下所 示:
语法
<f>[+<o>][(<l>)]
对字段 <f> 中从 <o>+1 开始且长度 <l> 的部分执行该语句的操作。
如果未指定长度 <l>,则 对该字段 <o> 和结尾之间的所有位置进行处理。