ABAP 创建内表

ABAP 创建内表

📋 内部表创建概述

DATA语句声明

DATA语句用于声明一个内部表。程序必须告知表的开始和结束位置。

OCCURS子句

使用OCCURS子句告诉SAP正在创建一个内部表:

  • OCCURS 0:最初不包含任何记录,将随着填充数据而扩展
  • OCCURS n:预分配n行内存

🛠️ 传统创建方法

基本语法

1
2
3
4
DATA: BEGIN OF <internal_tab> Occurs 0,
<field1> LIKE <table_field>,
<field2> LIKE <table_field>,
END OF <internal_tab>.

示例

1
2
3
4
DATA: BEGIN OF itab01 Occurs 0,
name LIKE ZCUSTOMERS1-name,
dob LIKE ZCUSTOMERS1-dob,
END OF itab01.

说明

  • 'itab01'是创建临时表时常用的缩写
  • OCCURS子句用于定义内部表的主体
  • OCCUR 0使用的默认内存大小为8 KB

带标题行的内表

1
2
3
4
5
6
7
8
* 创建带标题行的内表
DATA: BEGIN OF itab_header OCCURS 0,
name LIKE ZCUSTOMERS1-name,
dob LIKE ZCUSTOMERS1-dob,
END OF itab_header.

* 或者使用WITH HEADER LINE
DATA itab_with_header LIKE SCUSTOM OCCURS 0 WITH HEADER LINE.

不带标题行的内表

1
2
* 创建不带标题行的内表
DATA itab_no_header LIKE TABLE OF SCUSTOM.

🔧 TYPES语句创建方法

定义本地数据类型

TYPES语句创建内部表作为本地数据类型(仅在当前程序的上下文中使用的数据类型)。

语法

1
2
TYPES <internal_tab> TYPE|LIKE <internal_tab_type> OF
<line_type_itab> WITH <key> INITIAL SIZE <size_number>.

参数说明

参数 说明 示例
内部表名称 mytable
表类型 STANDARD TABLE, SORTED TABLE, HASHED TABLE
行类型 CustomerLine, SCUSTOM
键定义 WITH UNIQUE KEY, WITH NON-UNIQUE KEY
INITIAL SIZE 初始大小 INITIAL SIZE 10

完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
REPORT zinternal_demo.

* 定义行结构
TYPES: BEGIN OF CustomerLine,
Cust_ID TYPE c,
Cust_Name(20) TYPE c,
END OF CustomerLine.

* 创建排序表,定义唯一键
TYPES mytable TYPE SORTED TABLE OF CustomerLine
WITH UNIQUE KEY Cust_ID.

* 输出信息
WRITE: / 'The mytable is an Internal Table'.

💡 不同类型的内表创建

1. 标准表

1
2
3
4
5
6
* 方法1:使用DATA语句
DATA: lt_standard LIKE STANDARD TABLE OF SCUSTOM.

* 方法2:使用TYPES
TYPES: lt_standard_type TYPE STANDARD TABLE OF SCUSTOM.
DATA lt_standard TYPE lt_standard_type.

2. 排序表

1
2
3
4
5
6
7
8
* 方法1:使用DATA语句
DATA: lt_sorted LIKE SORTED TABLE OF SCUSTOM
WITH UNIQUE KEY id.

* 方法2:使用TYPES
TYPES: lt_sorted_type TYPE SORTED TABLE OF SCUSTOM
WITH UNIQUE KEY id.
DATA lt_sorted TYPE lt_sorted_type.

3. 哈希表

1
2
3
4
5
6
7
8
* 方法1:使用DATA语句
DATA: lt_hashed LIKE HASHED TABLE OF SCUSTOM
WITH UNIQUE KEY id.

* 方法2:使用TYPES
TYPES: lt_hashed_type TYPE HASHED TABLE OF SCUSTOM
WITH UNIQUE KEY id.
DATA lt_hashed TYPE lt_hashed_type.

🔑 键定义

键类型

键类型 语法 特点
唯一键 WITH UNIQUE KEY 不允许重复值
非唯一键 WITH NON-UNIQUE KEY 允许重复值
默认键 无关键字 系统自动确定

键定义示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* 单个唯一键
TYPES lt_single_key TYPE HASHED TABLE OF SCUSTOM
WITH UNIQUE KEY id.

* 多个字段唯一键
TYPES lt_multi_key TYPE SORTED TABLE OF SCUSTOM
WITH UNIQUE KEY carrid connid.

* 非唯一键
TYPES lt_non_unique TYPE STANDARD TABLE OF SCUSTOM
WITH NON-UNIQUE KEY name.

* 多字段非唯一键
TYPES lt_multi_non_unique TYPE STANDARD TABLE OF SCUSTOM
WITH NON-UNIQUE KEY carrid connid.

📊 INITIAL SIZE选项

作用

INITIAL SIZE子句通过向其分配初始量的内存来创建内部表对象。

示例

1
2
3
4
5
6
7
* 预分配10行的内存
TYPES: lt_with_init SIZE TYPE HASHED TABLE OF SCUSTOM
WITH UNIQUE KEY id
INITIAL SIZE 10.

* 创建内表对象
DATA lt_data TYPE lt_with_init SIZE.

注意事项

  • 首次填充内部表时消耗的内存大大减少
  • 表的大小不属于表的数据类型,而是属于对象

💡 完整创建流程

步骤1:创建程序

  1. 执行SE38交易代码
  2. 输入程序名称(如ZINTERNAL_DEMO)
  3. 选择”可执行程序”类型
  4. 保存程序

步骤2:定义结构

1
2
3
4
5
6
7
8
9
10
11
12
REPORT zinternal_demo.

* 定义行类型
TYPES: BEGIN OF ty_scustomer,
id TYPE scustom-id,
name TYPE scustom-name,
city TYPE scustom-city,
END OF ty_scustomer.

* 定义表类型
TYPES: tt_scustomer TYPE HASHED TABLE OF ty_scustomer
WITH UNIQUE KEY id.

步骤3:创建内表

1
2
3
* 声明内表
DATA: lt_customers TYPE tt_scustomer,
wa_customer TYPE ty_scustomer.

步骤4:使用内表

1
2
3
4
5
6
7
8
9
* 填充数据
wa_customer-id = '100001'.
wa_customer-name = '张三'.
wa_customer-city = '北京'.
INSERT wa_customer INTO TABLE lt_customers.

* 读取数据
READ TABLE lt_customers INTO wa_customer
WITH TABLE KEY id = '100001'.

⚠️ 注意事项

1. 内存管理

  • 合理设置INITIAL SIZE
  • 避免过度预分配
  • 及时清理不再需要的数据

2. 性能考虑

  • 根据访问模式选择表类型
  • 为频繁查找操作使用哈希表
  • 为有序操作使用排序表

3. 键设计

  • 选择合适的键字段
  • 考虑键的唯一性需求
  • 避免过大的键