ABAP 复制内表

ABAP 复制内表

📊 内表复制概述

标题行概念

当我们从带有标题行的内部表中读取记录时,该记录将从表本身移动到标题行。这是程序工作的标题行。同样适用于创建新记录 - 使用标题行将新记录发送到表体本身。

复制方式



graph TD
    A[内表复制] --> B[字段级复制]
    A --> C[结构化复制]
    
    B --> B1[MOVE语句]
    B --> B2[单个字段移动]
    
    C --> C1[MOVE-CORRESPONDING]
    C --> C2[自动匹配字段]

🔧 MOVE语句

功能

MOVE语句用于复制记录,将数据从源字段移动到目标字段。

语法

1
MOVE <table_field> TO <internal_tab_field>.

执行逻辑

选择循环每次填充一个字段,使用MOVE语句将数据从一个表的字段移动到另一个表的字段。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
REPORT  zcuslist1.
TABLES: zcustomers1.

DATA:
BEGIN OF itab01 OCCURS 0,
name LIKE zcustomers1-name,
dob LIKE zcustomers1-dob,
END OF itab01.

* 使用SELECT循环和MOVE语句复制数据
SELECT * FROM zcustomers1.
MOVE zcustomers1-name TO itab01-name.
MOVE zcustomers1-dob TO itab01-dob.
ENDSELECT.

* 输出结果
WRITE: / itab01-name, itab01-dob.

输出示例

1
MARGARET     02.11.1994

MOVE语句特点

  1. 显式控制:需要明确指定每个字段的移动
  2. 灵活性:可以只移动部分字段
  3. 安全性:确保数据类型匹配

🔧 MOVE-CORRESPONDING语句

功能

MOVE-CORRESPONDING语句自动将数据从源结构的字段移动到目标结构中名称对应的字段。

语法

1
MOVE-CORRESPONDING <table_name> TO <internal_tab>.

执行逻辑

系统将数据从CUSTOMERS的字段移动到itab01中的相应字段,前提是两者具有匹配的字段名称。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
REPORT  zcustomerlist.
TABLES: zcustomers1.

DATA:
BEGIN OF itab01 OCCURS 0,
customer LIKE zcustomers1-customer,
name LIKE zcustomers1-name,
title LIKE zcustomers1-title,
dob LIKE zcustomers1-dob,
END OF itab01.

* 使用MOVE-CORRESPONDING自动复制
SELECT * FROM zcustomers1.
MOVE-CORRESPONDING zcustomers1 TO itab01.
APPEND itab01.
ENDSELECT.

* 输出结果
LOOP AT itab01.
WRITE: / itab01-name, itab01-dob.
ENDLOOP.

输出示例

1
2
3
4
5
MARK           21.05.1981
JAMES 14.08.1977
AURIELE 19.06.1990
STEPHEN 22.07.1985
MARGARET 02.11.1994

MOVE-CORRESPONDING特点

  1. 自动匹配:自动匹配同名字段
  2. 简洁高效:只需一个语句完成所有匹配字段的移动
  3. 类型安全:要求两个字段具有匹配的数据类型和长度

⚠️ 重要注意事项

字段匹配要求

  • 使用MOVE-CORRESPONDING时,需要确保两个字段都具有匹配的数据类型和长度
  • 在示例中,这已经用LIKE语句预先完成

字段名称影响



graph LR
    A[源表字段] --> B[名称匹配]
    B --> C[数据复制]
    B --> D[跳过不匹配]
    
    C --> C1[成功复制]
    D --> D1[保持原值]

错误预防

1
2
3
4
5
6
7
8
* 检查字段是否存在
IF line_exists( itab01 WITH TABLE KEY name = 'Test' ).
" 字段存在,可以复制
MOVE-CORRESPONDING source TO itab01.
ELSE.
" 字段不存在,处理错误
WRITE: / '字段不存在'.
ENDIF.

💡 复制方法对比

特性 MOVE MOVE-CORRESPONDING
控制粒度 字段级 结构级
代码量 多(每个字段都要写) 少(一个语句)
灵活性 高(可选择部分字段) 低(只能匹配字段)
性能 中等 高(批量操作)
适用场景 精确控制字段移动 批量复制结构数据

🎯 最佳实践

1. 使用MOVE进行选择性复制

1
2
3
4
5
6
* 只复制需要的字段
SELECT * FROM zcustomers1.
MOVE zcustomers1-name TO itab01-name.
MOVE zcustomers1-dob TO itab01-dob.
APPEND itab01.
ENDSELECT.

2. 使用MOVE-CORRESPONDING进行批量复制

1
2
3
4
5
6
* 自动复制所有匹配字段
SELECT * FROM zcustomers1
UP TO 10 ROWS.
MOVE-CORRESPONDING zcustomers1 TO itab01.
APPEND itab01.
ENDSELECT.

3. 错误处理

1
2
3
4
5
6
7
8
9
10
11
12
13
* 复制前检查数据类型
DATA: lv_name TYPE string,
lv_dob TYPE d.

SELECT SINGLE name dob FROM zcustomers1
INTO (lv_name, lv_dob)
WHERE customer = '100001'.

IF sy-subrc = 0.
MOVE lv_name TO itab01-name.
MOVE lv_dob TO itab01-dob.
APPEND itab01.
ENDIF.

4. 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
* 使用批量复制而不是循环内复制
DATA: lt_source TYPE TABLE OF zcustomers1,
lt_target LIKE itab01.

* 批量读取
SELECT * FROM zcustomers1 INTO TABLE lt_source.

* 批量复制
LOOP AT lt_source INTO DATA(wa_source).
MOVE-CORRESPONDING wa_source TO wa_target.
APPEND wa_target TO lt_target.
ENDLOOP.

🔗 高级复制技术

1. 使用ASSIGN进行动态复制

1
2
3
4
5
6
7
8
9
FIELD-SYMBOLS: <fs_source> ANY,
<fs_target> ANY.

ASSIGN COMPONENT 'NAME' OF STRUCTURE zcustomers1 TO <fs_source>.
ASSIGN COMPONENT 'NAME' OF STRUCTURE itab01 TO <fs_target>.

IF <fs_source> IS ASSIGNED AND <fs_target> IS ASSIGNED.
MOVE <fs_source> TO <fs_target>.
ENDIF.

2. 使用CORRESPONDING关键字(ABAP 7.4+)

1
2
3
4
5
* 更简洁的写法(ABAP 7.4+)
SELECT * FROM zcustomers1
INTO TABLE @DATA(lt_temp).

lt_target = CORRESPONDING #( lt_temp ).

⚠️ 常见错误

1. 字段不匹配

1
2
* 错误示例:字段名称不匹配
MOVE zcustomers1-full_name TO itab01-name. * 字段名不匹配

2. 数据类型不兼容

1
2
* 错误示例:数据类型不匹配
MOVE zcustomers1-amount TO itab01-name. * 金额不能赋值给姓名

3. 目标表未初始化

1
2
* 错误示例:目标表未定义
MOVE-CORRESPONDING zcustomers1 TO itab01. * itab01未定义