ABAP内表

本文深入探讨ABAP中的内表概念,包括内表的创建、数据类型、操作语句如APPEND、INSERT、MODIFY及DELETE,以及内表的排序和格式化输出等关键操作。同时,文章对比了LIKELINEOF与LIKETABLEOF的区别,详细讲解了如何使用这些内表进行数据管理和处理。

1、内表

ABAP中的内表相当于其他程序设计语言中的二维数组,存储多行结构相同的数据。不同于二维数组,内表在创建后,列结构于列数是固定不变的,而行数是动态增长的。内表支持循环对每行数据进行操作,也支持整体操作。内行是具有行和列的结构,不同于数据库表,内表仅在程序运行期间在内存中存储数据。ABAP中有三种内表类型:标准表、哈希表、排序表。

2、可以使用的内表数据类型:structure、数据库表、用户自定义数据类型。

3、创建内表

        DATA语句用于声明一个内部表。 程序必须告知表的开始和结束位置。 所以使用BEGIN OF语句,然后声明表名。 之后,使用OCCURS添加,后跟一个数字,这里为0. OCCURS告诉SAP正在创建一个内部表,0表示它最初不包含任何记录。 它将随着它填充数据而扩展。

DATA: BEGIN OF <internal_tab> Occurs 0,

            name LIKE ZCUSTOMERS1-name,

            dob LIKE ZCUSTOMERS1-dob,

END OF itab01.

4、LIKE LINE OF和LIKE TABLE OF 的区别

LIKE LINE OF后面接一个内表,表示一个DATA参数具有和内表一样的结构(structure),例如有一个TABLES:Z_USER,Z_USER有两个字段,一个ID,一个NAME,那么

DATA:WA LIKE LINE OF Z_USER 表示WA和Z_USER的STRUCTURE一样,可以吧WA当做Z_USER的WORK AREA来用。

LIKE TABLE OF 后面接一个STRUCTURE,表示一个DATA参数是一个内表,这个内表的结构和后面接的那个结构一样,例:

DATA:BEGIN OF WA,

       ID TYPE I,

       NAME(10) TYPE C,

END OF WA.

DATA: ITAB LIKE TABLE OF WA.

这里的ITAB直接就是一个内表了,WA是它的WORK AREA。

5、APPEND语句用于向现有内部表添加单个行或行。 此语句从工作区复制单个行,并将其插入内部表中的最后一个现有行之后。 工作区可以是标题行或与内部表的行具有相同结构的任何其他字段字符串。要将部分或 全部内表附 加到另一个 内表中,请 使用 APPEND 语句,用法 如下

APPEND MAN TO MAN1."将MAN附加到MAN1中.

INSERT语句用于将单个行或一组行插入内部表。

insert man into table man1.

6、move....to... 直接把源的值附到目标MOVE语句,将数据从一个表的字段移动到另一个表的字段

MOVE MAN1[] TO MAN2.       将MAN1的值附加到MAN2.

7.带标题行的内表

REPORT YTEST001.

DATA: BEGIN OF MAN,

NAME(20) TYPE C,

HIGH TYPE P DECIMALS 2,

WEIGHT TYPE P DECIMALS 2,

END OF MAN.

DATA: MAN1 LIKE TABLE OF MAN WITH HEADER LINE,

MAN2 LIKE TABLE OF MAN.

MAN-NAME = '张参'.

MAN-HIGH = '1.68'.

MAN-WEIGHT = 120.

APPEND MAN TO MAN1.

MAN-NAME = '刘志'.

MAN-HIGH = '1.78'.

MAN-WEIGHT = 160.

APPEND MAN TO MAN1.

MOVE MAN1[] TO MAN2.

LOOP AT MAN2 INTO MAN.

WRITE: / MAN-NAME,MAN-HIGH, MAN-WEIGHT.

ENDLOOP.

LOOP AT MAN1.

WRITE: / MAN1-NAME,MAN1-HIGH,MAN1-WEIGHT.

ENDLOOP.

 

8、内表排序(按体重升序排列)

sort man1 descending by high ascending.

9、修改内表数据

modify table MAN1 from MAN.

10.删除内表数据

DELETE MAN1 WHERE NAME = '张参'.

11、使用索引插入内表行

insert man into man1 index 2.

12、格式化输出

select * into wa from sofli.

通过under定位输出位置。

 

 

 

 

<think>我们被要求用中文回答,并且在最后提出3-5个相关问题,以“§§相关问题§§”开头,然后列出问题。 问题:ABAP去重语句 回答: 在ABAP中,内去重有多种方式,以下为常用方法: 1. **使用`DELETE ADJACENT DUPLICATES`语句** 先按关键字段排序,然后删除相邻重复行。 示例: ```abap SORT itab BY key1 key2. " 按关键字段排序 DELETE ADJACENT DUPLICATES FROM itab COMPARING key1 key2. " 如果不指定COMPARING,则比较所有字段 ``` 2. **使用`LOOP AT ... GROUP BY`(适用于复杂去重)** 通过循环分组,仅取每组第一行实现去重。 示例: ```abap DATA(lt_unique) = VALUE ty_itab( ). LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_row>) GROUP BY (key1 = <fs_row>-key1 key2 = <fs_row>-key2) " 按关键字段分组 ASCENDING ASSIGNING FIELD-SYMBOL(<fs_group>). APPEND VALUE #( key1 = <fs_group>-key1 key2 = <fs_group>-key2 ... ) TO lt_unique. ENDLOOP. ``` 3. **使用内复制到新并去重(`SORT`+`DELETE ADJACENT DUPLICATES`的变体)** 先复制内,再对新去重。 示例: ```abap DATA(lt_temp) = itab. " 复制内 SORT lt_temp BY key1 key2. DELETE ADJACENT DUPLICATES FROM lt_temp COMPARING key1 key2. ``` 4. **使用SELECT DISTINCT(从数据库读取时)** 若内数据来自数据库,可直接用SELECT DISTINCT避免重复。 示例: ```abap SELECT DISTINCT key1, key2 FROM dbtable INTO TABLE @itab WHERE ... ``` **注意**: - 使用`DELETE ADJACENT DUPLICATES`前必须排序,且仅删除相邻重复行,故排序字段即去重字段。 - 若需根据部分字段去重,需在`COMPARING`后指定字段。 - 使用`GROUP BY`方式可灵活处理,但代码较长。 下面提出相关问题: §§相关问题§§ 1. 在ABAP中,使用`DELETE ADJACENT DUPLICATES`去重时,为什么必须事先对内进行排序? 2. 除了上述方法,ABAP中还有哪些内去重的技巧或函数? 3. 如何根据内的某个子字段(如结构中的组件)进行去重? 4. 在ABAP CDS视图中,如何实现去重查询? 5. 使用`DELETE ADJACENT DUPLICATES`与`LOOP AT ... GROUP BY`去重,在性能上有何差异?</think>### ABAP去重语句详解 在 ABAP 中,内去重主要通过以下两种方式实现: #### 1. **标准去重方法(需先排序)** ```abap SORT itab BY field1 field2. " 必须先按关键字段排序 DELETE ADJACENT DUPLICATES FROM itab COMPARING field1 field2. " 指定比较字段 ``` - **关键点**: - 必须先用 `SORT` 按去重字段排序 - `COMPARING` 指定比较字段(省略则比较所有字段) - 直接修改原内 #### 2. **新语法去重(无需显式排序)** ```abap DATA(lt_unique) = VALUE #( FOR GROUPS group_key OF <line> IN itab GROUP BY ( key1 = <line>-field1 key2 = <line>-field2 ) WITHOUT MEMBERS ( group_key ) ). ``` - **优势**: - 无需预先排序 - 不修改原内(生成新内) - 支持复杂分组逻辑 #### 3. **特殊场景处理** **部分字段去重**: ```abap DELETE ADJACENT DUPLICATES FROM itab COMPARING field1. ``` **忽略大小写去重**: ```abap SORT itab BY field1 AS TEXT. DELETE ADJACENT DUPLICATES FROM itab COMPARING field1. ``` > **注意**:标准方法要求内必须排序,否则去重结果不可预测!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值