ABAP 7.4新特性(四):内表访问表达式

现在新语法支持itab[ ] 这种类似数组的形式了,不过注意的是如果内表不含deep struct ,itab[ 1 ][ 2 ] 是不允许的,这是和二维数组区别之一。
只能通过itab[ 1 ]-colname 的形式,也就是说用itab[ ] 一般用来返回某一行的数据,如果你想访问改行的某一列则加上 - 和列名即可。

使用主索引访问内表 
wa = itab[ idx ]. 
相当于 READ TABLE itab INDEX idx INTO wa.
使用次级/二级索引访问内表
wa =  itab[ KEY key INDEX idx ].
相当于 READ TABLE itab INDEX idx USING KEY key INTO wa.这里注意itab必须指定次级索引,key 为次级索引名不是内表字段。举例:

types: BEGIN OF ty,
  a TYPE i,
  b TYPE i,
  c TYPE i,
  END OF ty.
DATA it2 TYPE TABLE OF ty WITH KEY a.
DATA wa  like LINE OF it.
DATA aa TYPE SORTED TABLE OF ty WITH UNIQUE KEY a
                                WITH NON-UNIQUE SORTED KEY second_key
                                COMPONENTS b c.

aa = VALUE #(
              ( a = 11 b = 32 c = 13 )
              ( a = 21 b = 22 c = 23 )
              ( a = 31 b = 42 c = 33 ) ).
*wa = it2[ 1 ].
wa = aa[ KEY second_key INDEX 1 ].
CL_DEMO_OUTPUT=>display( wa ).
这里aa 定义了主索引key a,还定义了二级索引second_key,这个二级索引由字段b c组成。wa  aa[  KEY second_key  INDEX  ] . 这里指定了以二级索引second_key的

方式访问内表aa,那么默认是按照升序排列的,所以index 1 实际上是aa 的第二行(B=22 最小)。结果:

ABAP 7.4新特性(四):内表访问表达式_第1张图片



如果你把第一行的b 改为22 那么wa就是第一行了,应为b 第一、第二行都最小,那么就比较二级所以的C字段,看哪个最小。

使用内表KEY访问内表

类似上面

wa = itab[ KEY key col1 = ... col2 = ...].

wa = itab[ KEY key COMPONENTS col1 = ... col2 = ...].

相当于READ TABLE WITH TABLE KEY key COMPNENTS col1 = .. col2 = .... INTO wa.

注意的是这种方式必须指定完所以构成key的字段。

链/深结构的访问

... itab[ ...]-comp
... struct-comp[ ... ] ...
... itab[ ... ][ ... ] ...

举个例子,上代码和结果图:

TYPES:
    BEGIN OF struc1,
    col1 TYPE i,
    col2 TYPE i,
    END OF struc1,
    itab1 TYPE TABLE OF struc1 WITH EMPTY KEY,
    itab2 TYPE TABLE OF itab1 WITH EMPTY KEY,
    BEGIN OF struc2,
    col1 TYPE i,
    col2 TYPE itab2,
    END OF struc2,
    itab3 TYPE TABLE OF struc2 WITH EMPTY KEY.

DATA(itab) = VALUE itab3(
 						( col1 = 1 col2 = VALUE itab2(
						 VALUE itab1(
									 col1 = 2 col2 = 3 )
									( col1 = 4 col2 = 5 ) ) )
						( VALUE itab1(
									( col1 = 6 col2 = 7 )
									( col1 = 8 col2 = 9 ) ) ) ) )
									( col1 = 10 col2 = VALUE itab2(
						( VALUE itab1(
									( col1 = 11 col2 = 12 )
									( col1 = 13 col2 = 14 ) ) )
					        ( VALUE itab1(
									( col1 = 15 col2 = 16 )
									( col1 = 17 col2 = 18 ) ) ) ) ) ).
* Reading the column with value 13 with READ TABLE statements
READ TABLE itab INTO DATA(wa1) INDEX 2.
READ TABLE wa1-col2 INTO DATA(wa2) INDEX 1.
READ TABLE wa2 INTO DATA(wa3) INDEX 2.
DATA(num1) = wa3-col1.
CL_DEMO_OUTPUT=>write( num1 ).
* Reading the column with value 13 with chained table expressions
DATA(num2) = itab[ 2 ]-col2[ 1 ][ 2 ]-col1.
CL_DEMO_OUTPUT=>write( num2 ).
CL_DEMO_OUTPUT=>display( ).

ABAP 7.4新特性(四):内表访问表达式_第2张图片

这里注意itab1 到3 都是TYPES。重点是DATA(num2itab[ ]-col2[ ][ ]-col1.  itab[ 2 ]就是取itab3第二行,

然后itab[ ]-col2[ ][ ] 就是取第二行的列col2,因列col2又是个包含了itab1的内表,所以col2[ 1 ][ 2 ] 是第一个

itab1内表的第二行,及13 14 那行。 




你可能感兴趣的:(ABAP新语法,ABAP,abap新语法,ABAP,7.4,7.4新特性,内表访问)