READ语句学习

转载 2011年10月13日 09:17:04

转帖自:http://blog.csdn.net/animalbe/article/details/5514490

 

用自定义关键字读取单行

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

ABAP 筑基宝典(5) -- 关于使用READ TABLE语句的几点注意事项

转载自:http://www.dlsap.com/thread-34-1-1.html 向原作者 莫怀远 致谢   1.  如果使用READ TABLE语句来读取内部表数据,而不是简单看返回值判...
  • foxeatapple
  • foxeatapple
  • 2011-10-13 12:00:08
  • 20446

【转载】SAP ABAP中读取项目文本 READ_TEXT 的方法

在SAP系统里面很多地方都用到了长文本,这些长文本的值以其他字符的形式存在表STXL和STXH里面,不能直接去这两个表里面去取值,而是要通过函数READ_TEXT去取,很多新手不了解的地方可能就是怎么...
  • hubaichun
  • hubaichun
  • 2016-09-08 15:18:52
  • 2408

ABAP SY-SUBRC的含义解析

ABAP SY-SUBRC的含义解析
  • SAPmatinal
  • SAPmatinal
  • 2016-07-03 17:56:31
  • 1850

SAP ABAP编程 用LOOP READ TABLE的方法代替双LOOP内表的方法

用双LOOP的方法实现两个内表匹配筛选性能不高,可以换成下面LOOP READ TABLE的方法...
  • qinyuezhan
  • qinyuezhan
  • 2014-10-11 15:23:49
  • 5130

关于使用READ TABLE语句的几点注意事项

转载自:http://www.dlsap.com/thread-34-1-1.html 向原作者 莫怀远 致谢   1.  如果使用READ TABLE语句来读取内部表数据,而不是简...
  • yuqinying112
  • yuqinying112
  • 2012-09-11 11:52:03
  • 2441

ABAP:Read_Text(SAVE_TEXT)函数的使用方法

在SAP系统中,有时候会有大段文本内容需要保存,例如:销售发货(VL03N),在单据的概览中,有一个[文本]项,在此处可以填写单据的大段文本描述,那么该内容保存在哪里呢? 第一反应是找对应表的字...
  • zhongguomao
  • zhongguomao
  • 2012-03-21 09:32:13
  • 1016

READ语句学习

转帖自:http://blog.csdn.net/animalbe/article/details/5514490   用自定义关键字读取单行 要从有自定义关键字的内表中读取单行,请使用READ...
  • foxeatapple
  • foxeatapple
  • 2011-10-13 09:17:04
  • 1765

linux_read命令

  • 2015年10月17日 22:20
  • 2KB
  • 下载

Opencv-python学习笔记

自己学习opencv时的小笔记
  • u013036896
  • u013036896
  • 2015-09-07 14:47:56
  • 1238

SAP: Read_Text()函数的使用方法

首先引用一下http://blog.sina.com.cn/s/blog_537fde6301008ymp.html文章中方法,感谢lin998 ! 以下为引用内容 ***************...
  • foxeatapple
  • foxeatapple
  • 2011-11-30 10:25:15
  • 6365
收藏助手
不良信息举报
您举报文章:READ语句学习
举报原因:
原因补充:

(最多只允许输入30个字)