内表
作用:
内表是 ABAP 程序中一种非常重要的数据结构,它类似于数据库表,用于在程序运行时存储和处理数据。与数据库表不同的是,内表存在于程序的内存中,数据的读写速度比从数据库中读取要快很多。它可以存储多条具有相同结构的数据记录,这些记录就像数据库表中的行一样。例如,当你从数据库中读取一批客户数据时,可以将这些数据存储在内表中,然后在程序中对这些数据进行各种处理,如排序、筛选、计算等。
声明:
直接使用
TYPES
语句定义内表类型,然后再声明内表变量
参照结构体定义内表
* 使用TYPES语句定义结构体类型
TYPES: BEGIN OF ty_person,name TYPE string,age TYPE i,END OF ty_person.* 使用TYPES语句定义基于结构体类型的内表类型
TYPES: tt_people TYPE TABLE OF ty_person.* 声明内表变量
DATA: lt_people TYPE tt_people.
参照数据库定义内表
* 参考MARA表定义内表
DATA: lt_mara TYPE TABLE OF mara.
工作区
- 定义与作用:
工作区是一个数据对象,它的结构与内表的行结构相同。它主要用于在内表操作时临时存储内表中的一行数据。就像你要处理内表中的某一行数据时,不能直接在整个内表上进行复杂操作,而是先把这一行数据取到工作区中,在工作区中处理完后,再将结果写回内表。例如,当你要对一个客户的信息进行格式调整时,先把这个客户的信息从内表读到工作区,调整完后再写回内表。- 声明方式:
可以使用LIKE LINE OF
语句基于内表来声明工作区,使其结构与内表行结构一致。
使用 LIKE LINE OF
基于内表定义
* 基于内表定义工作区
DATA: ls_employee LIKE LINE OF lt_employees.
基于结构体定义
* 定义结构体
TYPES: BEGIN OF ty_employee,emp_id TYPE string,emp_name TYPE string,salary TYPE p LENGTH 10 DECIMALS 2,END OF ty_employee.* 基于结构体定义内表
DATA: lt_employees TYPE TABLE OF ty_employee.* 基于结构体定义工作区
DATA: ls_employee TYPE ty_employee.
内表和工作区
工作区常用于
LOOP
循环中对内表数据进行逐行处理,或者在进行内表数据的增删改操作时作为临时存储数据的地方。CLEAR 语句清空工作区
CLEAR gs_employee.
内表是存储多条相关数据记录的容器,而工作区是与内表行结构相同,用于临时处理数据
案例
1-增
* 定义内表
DATA: lt_employees TYPE TABLE OF
{emp_id TYPE string,emp_name TYPE string,salary TYPE p LENGTH 10 DECIMALS 2
}.
* 定义工作区
DATA: ls_employee LIKE LINE OF lt_employees.* 填充工作区数据并添加到内表
ls_employee - emp_id = '001'.
ls_employee - emp_name = '张三'.
ls_employee - salary = 5000.00.
APPEND ls_employee TO lt_employees.* 展示内表所有数据
LOOP AT lt_employees INTO ls_employee.WRITE: / '员工编号:', ls_employee - emp_id,'姓名:', ls_employee - emp_name,'工资:', ls_employee - salary.
ENDLOOP.
可以将工作区数据插入到内表的指定位置。例如,要将一个新员工数据插入到内表的第二行:* 假设内表已有数据,这里省略定义和已有数据填充
DATA: new_employee LIKE LINE OF lt_employees.
new_employee - emp_id = '002'.
new_employee - emp_name = '李四'.
new_employee - salary = 6000.00.INSERT new_employee INTO TABLE lt_employees INDEX 2.
2-删
* 假设内表已有数据,这里省略定义和已有数据填充
* 删除员工编号为 '001' 的员工数据
DELETE FROM lt_employees WHERE emp_id = '001'.* 展示内表所有数据
LOOP AT lt_employees INTO ls_employee.WRITE: / '员工编号:', ls_employee - emp_id,'姓名:', ls_employee - emp_name,'工资:', ls_employee - salary.
ENDLOOP.
可以通过指定内表行的索引来删除数据。例如,要删除内表的第三行数据:
* 假设内表已有数据,这里省略定义和已有数据填充
DELETE lt_employees INDEX 3.
3-改
* 假设内表已有数据,这里省略定义和已有数据填充
* 修改员工编号为 '001' 的员工工资,增加 1000
MODIFY lt_employeesSET salary = salary + 1000.00WHERE emp_id = '001'.* 展示内表所有数据
LOOP AT lt_employees INTO ls_employee.WRITE: / '员工编号:', ls_employee - emp_id,'姓名:', ls_employee - emp_name,'工资:', ls_employee - salary.
ENDLOOP.
先通过索引或条件找到要修改的行,然后直接修改工作区对应字段的值,再写回内表。
例如,要给员工编号为 001 的员工涨薪 1000:* 假设内表已有数据,这里省略定义和已有数据填充
DATA: modify_employee LIKE LINE OF lt_employees.
READ TABLE lt_employees INTO modify_employee WITH KEY emp_id = '001'.
IF sy - subrc = 0.modify_employee - salary = modify_employee - salary + 1000.00.MODIFY lt_employees FROM modify_employee.
ENDIF.
4-查
* 假设内表已有数据,这里省略定义和已有数据填充
* 定义工作区用于存放查询结果
DATA: found_employee LIKE LINE OF lt_employees.* 根据员工编号查询员工信息
READ TABLE lt_employees INTO found_employee WITH KEY emp_id = '001'.
IF sy - subrc = 0.WRITE: / '找到员工 - 员工编号:', found_employee - emp_id,'姓名:', found_employee - emp_name,'工资:', found_employee - salary.
ELSE.WRITE: / '未找到员工编号为 001 的员工'.
ENDIF.