ABAP问题记录--->内表读取,才不用READ TABLE? 试试 [ ]

假设现在有这样一个内表

TYPES: BEGIN OF TY_DATA,
  INDEX TYPE CHAR1,
  DATA  TYPE CHAR2,
  END OF TY_DATA.

DATA LT_DATA TYPE TABLE OF TY_DATA.

LT_DATA = VALUE #(
                   ( INDEX = '1' DATA = 'AA' )
                   ( INDEX = '2' DATA = 'BB' )
                   ( INDEX = '3' DATA = 'CC' )
                   ( INDEX = ''  DATA = ''   )
                  ).

CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).

在这里插入图片描述

现在我们要取得这个内表里面的第二条数据,那么我们需要怎么做呢?

READ TABLE LT_DATA INTO DATA(LW_DATA) WITH KEY DATA = 'BB' .
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

在这里插入图片描述

ABAP新语法中,提供了新的内表访问方式,大概类似于C和java的数组操作
语法格式如下:itab[ index ] itab[KEY = value ]
index可以使用内表行数,注意如果是纵深列表,那么允许使用和数组一样的方式 itab[ index ][index].

需要注意的是C或者JAVA的数组下标从0开始,但是这里内表下标是从1开始

ABAP新语法方式:

DATA(test) =  itab[ index(或者表达式)].

或者

DATA(test) = VALUE #( itab[ index(或者表达式) ] OPTIONAL ).

本例中:

DATA(LW_DATA) = LT_DATA[ 2 ].
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

或者

DATA(LW_DATA) = LT_DATA[ DATA = 'BB' ].
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

或者

DATA(LW_DATA) = VALUE #( LT_DATA[ 2 ] OPTIONAL ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

或者:

DATA(LW_DATA) = VALUE #( LT_DATA[ DATA = 'BB' ] OPTIONAL ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

结果都是一样的
在这里插入图片描述
使用DATA(LW_DATA) = LT_DATA[ 5 ].的时候返回不到会dump,因为没有catch 到异常:cx_sy_itab_line_not_found。而try catch的话就会发现一个问题,那就是我并没有节省工作量啊,甚至好像还多了点。

所以使用第二种VALUE方式DATA(LW_DATA) = VALUE #( LT_DATA[ 5 ] OPTIONAL ).
这样会自动catch到异常。也就是说不会报错,也能读到相应的值,感觉是不是很赞?
但是问题,就这么忽然的来了,不管能不能访问到,sy-subrc的返回值都是0.
1、访问不到的情况:

DATA(LW_DATA) = VALUE #( LT_DATA[ 5 ] OPTIONAL ).
IF SY-SUBRC = 0.
  WRITE: / 'E'.
ENDIF.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

在这里插入图片描述在这里插入图片描述
2、访问到情况

DATA(LW_DATA) = VALUE #( LT_DATA[ 2 ] OPTIONAL ).
IF SY-SUBRC = 0.
  WRITE: / 'E'.
ENDIF.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

在这里插入图片描述在这里插入图片描述

也就是说是忽略错误的。所以我怎么知道是访问不到,还是访问到的就是空呢?要知道内表是允许放置空行的
比如我访问DATA(LW_DATA) = VALUE #( LT_DATA[ DATA = 'DD' ] OPTIONAL ).DATA(LW_DATA) = VALUE #( LT_DATA[ 4 ] OPTIONAL ).这两种的结果都如下图所示:
在这里插入图片描述

经过查阅官方文档(并没有给出什么具体的解决方案),有另一个语法可以近似的进行判定
即加一个DEFAULT

DATA(LW_DATA) = VALUE #( LT_DATA[ DATA = 'DD' ]
                          DEFAULT VALUE #( DATA = 'EE' )
                        ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

在这里插入图片描述

DATA(LW_DATA) = VALUE #( LT_DATA[ 4 ]
                          DEFAULT VALUE #( DATA = 'EE' )
                        ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LW_DATA ).

在这里插入图片描述
相信看到 DEFAULT就已经明白了,如果取不到相关的值,就用一个默认值进行替代,我们可以通过这个默认值来判定是否有相关的行,只能说是一个很粗糙的解决方案了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值