https://blog.csdn.net/yang362046076/article/details/52042976
现在新语法支持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 1 ]. 这里指定了以二级索引second_key的
方式访问内表aa,那么默认是按照升序排列的,所以index 1 实际上是aa 的第二行(B=22 最小)。结果:
如果你把第一行的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(
- <span style="white-space:pre"> </span>( col1 = 1 col2 = VALUE itab2(
- <span style="white-space:pre"> </span> VALUE itab1(
- <span style="white-space:pre"> </span> col1 = 2 col2 = 3 )
- <span style="white-space:pre"> </span>( col1 = 4 col2 = 5 ) ) )
- <span style="white-space:pre"> </span>( VALUE itab1(
- <span style="white-space:pre"> </span>( col1 = 6 col2 = 7 )
- <span style="white-space:pre"> </span>( col1 = 8 col2 = 9 ) ) ) ) )
- <span style="white-space:pre"> </span>( col1 = 10 col2 = VALUE itab2(
- <span style="white-space:pre"> </span>( VALUE itab1(
- <span style="white-space:pre"> </span>( col1 = 11 col2 = 12 )
- <span style="white-space:pre"> </span>( col1 = 13 col2 = 14 ) ) )
- <span style="white-space:pre"> </span> ( VALUE itab1(
- <span style="white-space:pre"> </span>( col1 = 15 col2 = 16 )
- <span style="white-space:pre"> </span>( 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( ).
这里注意itab1 到3 都是TYPES。重点是DATA(num2) = itab[ 2 ]-col2[ 1 ][ 2 ]-col1. itab[ 2 ]就是取itab3第二行,
然后itab[ 2 ]-col2[ 1 ][ 2 ] 就是取第二行的列col2,因列col2又是个包含了itab1的内表,所以col2[ 1 ][ 2 ] 是第一个
itab1内表的第二行,及13 14 那行。
浙公网安备 33010602011771号