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 最小)。结果:



如果你把第一行的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(num2itab[ ]-col2[ ][ ]-col1.  itab[ 2 ]就是取itab3第二行,

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

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




  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值