ABAP-内表与工作区定义、获取数据

2020-06-06  本文已影响0人  矢量演说

关于获取数据

ABAP "FOR ALL ENTRIES IN"用法

READ TABLE itbl_xxx INTO wa_xxx WITH KEY '2'.
READ TABLE itbl_xxx INTO wa_xxx WITH KEY = 25.

前者是读取带关键字2的单行,后者是读取值为25的单行
READ只能读取单行,如果有多行则只匹配第一个条目(疑问)
写法例子:

READ TABLE itbl_xxx INTO wa_xxx WITH KEY COL3 = 9 COL4 = 36.
READ TABLE git_event INTO gwa_event
             WITH KEY name = slis_ev_top_of_page.

注意:尽量使用BINARY SEARCH,并在READ前排序。二分法查找前必须排序。、

若找到则返回sy-subrc = 0.可以通过判断sy-subrc = 0来进行后续操作

IF sy-subrc = 0.
    gwa_event-form = 'ALV_TOP_OF_PAGE'.
    MODIFY git_event INDEX sy-tabix FROM gwa_event.
  ENDIF.

以上面的READ中的MODIFY语句为例,

IF sy-subrc = 0.
    gwa_event-form = 'ALV_TOP_OF_PAGE'.
    MODIFY git_event INDEX sy-tabix FROM gwa_event.
  ENDIF.

注意:
MODIFY可以更新数据库或内表
当MODIFY用于更新内表时,有两种情况:
①在LOOP内:MODIFY作用于更新当前行
②在READ后:要加索引

sy-langu是登陆语言。
skat~spras = sy-langu是查询时按自己的登陆语言进行查询。
多用于取描述的时候添加的查询条件,因为描述字段可能会维护多个语种。
所以还得写在WHERE语句的第一条。

关于内表与工作区的定义

// 判断内表是否不为空的一般写法是
IF itab[] IS NOT INITIAL.
ENDIF.
// 少了中括号就变成判断内表表头是否为空,如果该内表恰好没有表头,那么永远为空。

由此可见,内表加了中括号代表不含表头的表内容,不加只会判断表头是否为空。

ABAP编程中对内表的定义,后面接一个OCCURS (n)是代表什么意思。
例子:

DATA: BEGIN OF itab OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF itab.

SELECT *
FROM makt 
INTO CORRESPONDING FIELDS OF TABLE itab.

LOOP AT itab.
  WRITE:/
  itab-matnr,
  itab-maktx.
END LOOP.

由此可见,带OCCURS的结构不仅有wa原有的输出显示功能,还有it内表的存储功能,可以不用写DATA it_itab LIKE TABLE OF itab.了

例子:

DATA itab1 TYPE TABLE OF char10.
DATA itab2 TYPE TABLE OF char10 WITH HEADER LINE.

Itab1是一个内表
Itab2既是一个内表,又是一个与该内表结构相同的工作区
因为容易混淆,尽量别用,推荐分开建内表和工作区。

如果SELECT后面的字段比into table后面的字段多,程序运行的时候就会Dump掉,这时候你需要用SELECT XXX INTO CORRESPONDING FIELDS OF TABLE YYY。但是这时候你需要select后面的字段名要与table后面的内表中的字段名一一对应。如果用这个语法,字段名不对应的就没有值。
如果SELECT后的字段与into table的内表中的字段数量一样,且table中的字段类型与数据库表中的一样,用select XX into table YYY的时候不会Dump,但字段类型的顺序要一样。
例如:

DATA: BEGIN OF wa_a,
           bname TYPE xubname,
           spdb TYPE xuspdb,
           col TYPE xuspda,
           END OF wa_a,
           it_a LIKE TABLE OF wa_a.

SELECT bname
               spdb
               spda
   FROM usr
INTO TABLE it_a.

这样可以取到个字段的值

DATA: BEGIN OF wa_a,
           bname TYPE xubname,
           spdb TYPE xuspdb,
           col TYPE xuspda,
           END OF wa_a,
           it_a LIKE TABLE OF wa_a.

SELECT bname
               spdb
               spda
   FROM usr
INTO CORRESPONDING FIELDS OF TABLE it_a.

这样可以取到前两个字段的值

DATA: BEGIN OF wa_a,
           bname TYPE xubname,
           spdb TYPE xuspdb,
           END OF wa_a,
           it_a LIKE TABLE OF wa_a.

SELECT bname
               spdb
               spda
   FROM usr
INTO TABLE it_a.

这样程序就会Dump

上一篇 下一篇

猜你喜欢

热点阅读