內表?
作用:
內表是 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.