[ABAP学习笔记-4.22]READ语句相关

 

用自定义关键字读取单行

 

要从有自定义关键字的内表中读取单行,请使用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> 和结尾之间的所有位置进行处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值