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:创建程序
- 执行SE38交易代码
- 输入程序名称(如ZINTERNAL_DEMO)
- 选择”可执行程序”类型
- 保存程序
步骤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. 键设计
- 选择合适的键字段
- 考虑键的唯一性需求
- 避免过大的键