ABAP 内表操作 增删改等,多种读取方式

1.基本的创建方式

DATA: BEGIN OF GS_01,
         col1 TYPE i,
         col2 TYPE ZSTU-CLO2,
      END OF GS_01 . "结构体
DATA:GT_01 TYPE STANDARD TABLE OF GS_01. "创建内表

TABLES: MARA . "结构类型
DATA GT_01 LIKE STANDARD TABLE OF MARA . "直接参照数据库表创建
DATA GS_01 LIKE MARA .
DATA GS_011 LIKE LINE OF GT_01 ."参照表的一行也是一个结构(工作区)

2.用TYPE关键字创建 

TABLES: ZGROUP_2. "结构体
TYPES: BEGIN OF TY_01.
           INCLUDE STRUCTURE ZGROUP_2. "include 透明表
TYPES:
       FIELD_COLOR TYPE LVC_T_SCOL,  
       FIELD_MODIFY TYPE LVC_T_STYL,
       END OF TY_01.
DATA GT_GROUP TYPE TABLE OF TY_01.  "参照TY_01 创建内表
DATA GS_GROUP TYPE TY_01.           "工作区

3.内表相关操作(sy-tabix 返回循环内内表当前行)

3.1 向内表中添加数据  (INSERT,APPEND ,COLLECT三种方式)


  INSERT LINE INTO TABLE ITAB . "添加一条
  INSERT itable INDEX num     . "利用索引追加一条数据
  INSERT LINES OF ITAB1 FROM N RO M INTO TABLE ITAB2 . "利用索引追加多条数据
  INSERT LINES OF ITAB1 INTO TABLE ITAB2 . "利用索引追加多条数据
  标准表
    追加到内表最后一行,与APPEND语句有相同的效果
  排序表
    按内表中排好的顺序追加数据,若按照关键字并非唯一的类型,重复的数据会追加到相同数据的上一行。
  哈希表
    按照关键字的哈希索引顺序追加数据


  APPEND 只能利用索引追加数据
  APPEND LINE TO ITAB . "添加一条
  INSERT LINES OF ITAB1 FROM N RO TO TABLE ITAB2 . "追加多条数据
  INSERT LINES OF ITAB1 TO TABLE ITAB2 . "追加多条数据
  标准表
    追加到内表最后一行
  排序表
    需要按照排好的数据追加数据,否则会dump。
  哈希表
    不能使用APPEND追加数据

  APPEND VALUE #( SIGN = 'I' OPTION = 'BT'
   HIGH = LV_HIGHT ) TO S_DATA.
3.4 COLLECT 合计内表中的数字类型的字段,出关键字以外的其他字段都需要是数字类型(F,I,P),按照关键字合计,未定义关键字的时候,则会吧所有的插入类型的字段视为关键字

     COLLECT WA INTO ITAB .

 3.2 读取内表数据 

3.2.1 READ读取

 
READ TABLE ITAB INTO WA WITH KEY  col1 =  value .

BINARY SEARCH 二分查找,使用前sort

SORT ITAB BY CON1...
READ TABLE 内表 INTO 工作区 WITH KEY  col1 =  value  BINARY SEARCH  .
 

当用到 TRANSPORTING NO FIELDS时只读取不传值  
READ TABLE GT_MAIN INTO GS_MAIN INDEX 1 TRANSPORTING NO FIELDS.

无需另外定义工作区
READ TABLE lt_penam INTO DATA(ls_penam) WITH KEY PENUM = ‘....’ .
 

3.2.2  使用LOOP读取多条数据

 LOOP AT t_list ASSIGNING FIELD-SYMBOL(<FS_LIST>). "无需定义

     <FS_LIST>-lifnr = ...
        ...

  ENDLOOP.

  FIELD-SYMBOLS <fs_fieldcat> TYPE lvc_s_fcat.
  LOOP AT lt_fieldcat ASSIGNING <fs_fieldcat>.

     <FS_LIST>-lifnr = ...
          ...

  ENDLOOP.

 LOOP AT lt_acdoca INTO DATA(ls_acdoca).

      ls_acdoca-lifnr = ...
           ...

  ENDLOOP.

3.2.3 使用try-catch捕捉一下异常,用类似数组的方式获取某一个字段,括号里面是条件

    TRY .
        LS_POHEADER-PURCH_ORG = LT_T001W[ WERKS = LV_WERKS_NEW ]-EKORG.
      CATCH CX_SY_ITAB_LINE_NOT_FOUND.
    ENDTRY.

3.3 modify关键字,修改内表数据  

MODIFY TABLE ITAB FROM WA TRANSPORTING FILED1 ..."参照工作区修改一条数据,TRANSPORTING 指定修改字段

MODIFY ITAB FROM WA TRANSPORTING FILED1 ... WHERE COND "参照工作区修改多条数据

 MODIFY UTAB FROM WA INDEX SY-INDEX . " 利用索引修改一条数据

3.4 DELETE 删除数据

DELETE TABLE ITAB FROM WA ."删除一条
DELETE TABLE ITAB WITH TABLE KEY K1 = '**' . "利用关键字删除一条
DELETE ITAB WHERE COND . "删除多条
DELETE ITAB INDEX SY-INDEX.

DELETE ADJACENT DUMPLICATE FROM ITAB COMPARING CON1... " 删除重复行,使用之间排序

4. RANGE表类型 

         是一种特殊的表类型,用于在ABAP中定义RANGE变量,拥有SIGN,OPTION,LOW,HIGH

         RANGE 变量的构成:

               SIGN: I (INCLUSIVE) ,  E(EXCLUSIVE)

               OPTION : EQ ,BT, GE(大于等于),LE(小于等于),GT(大于),LT(小于),NE,CP(包含)

                LOW :FROM 值

                HIGH : TO值

6.at ...endat语法,()

这里包括: new , first , last , end of . 
使用前提:一般在loop中使用,要提前对内表进行排序sort,排序的主键为统计时用到的节点,Loop不能加where条件,在at 和 endat之间不能再使用loop语法。
loop at gt_main to gs_main .
   AT FIRST
     是内表第一条数据时执行
   AT NEW F1
     与上一条有变化时执行
   AT END OF F1
     与下一条数据有变化时执行
   AT LAST .
     是内表最后一条数据时执行
endloop.
当进入AT … END AT.中的时候,工作区中的值除了key字段,其他字段会全部变为默认值,字符型字段值全变为*,数值全部变为0,而当跳出AT … END AT.语法块后,工作区内容恢复原样.

可以使用field-symbol,避免这种情况的发生

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值