本文介紹如何對SAP數(shù)據(jù)庫表進行增刪改查操作杈帐,重點是說明如何為數(shù)據(jù)的增刪改查提供編輯界面亡脸。假定現(xiàn)在要對 zemployee 表進行增刪改查操作新思。表的字段如下:
通過ABAP 代碼進行 CRUD 操作
INSERT 語句對 database table 的記錄進行插入操作姜性。語法如下:
INSERT dbtab from wa/itab.
如果至少有一筆記錄插入成功冬筒,sy-subrc = 0恐锣,如果至少有一筆記錄插入失敗, sy-subrc =4舞痰,比如可能由于 primary key 重復(fù)土榴。
DATA: gs_emp LIKE zemployee.
CLEAR gs_emp.
gs_emp-empid = '003'.
gs_emp-empname = 'WANG'.
gs_emp-empaddr = 'Wuhan'.
INSERT zemployee1 FROM gs_emp.
IF sy-subrc IS INITIAL.
WRITE sy-dbcnt.
ELSE.
WRITE 'Error'.
ENDIF.
UPDATE 語句允許對數(shù)據(jù)庫表的記錄進行修改。
DATA: gs_emp LIKE zemployee1.
CLEAR gs_emp.
gs_emp-empid = '003'.
gs_emp-empname = 'Stone Wang'.
gs_emp-empaddr = 'Wuhan'.
UPDATE zemployee1 FROM gs_emp.
IF sy-subrc IS INITIAL.
WRITE sy-dbcnt.
ELSE.
WRITE 'Error'.
ENDIF.
如果因為不知道要插入行的 Primary key 是否已經(jīng)存在 响牛,從而不能確定是否可使用 UPDATE 語句玷禽,那么 赫段,請使用 MODIFY 語句。MODIFY 語句既可以插入矢赁,也可以更新糯笙。
要從數(shù)據(jù)庫表中刪除行 ,請使用 DELETE 語句撩银。DELETE 語句允許刪除單行或多行给涕。個人覺得刪除記錄的操作,沒有必要使用工作區(qū)额获,可以直接通過條件來定位要刪除的行够庙。
DELETE FROM zemployee1 WHERE empid = '003'.
IF sy-subrc IS INITIAL.
WRITE sy-dbcnt.
ELSE.
WRITE 'Error'.
ENDIF.
表維護生成器
為了方便對數(shù)據(jù)表的數(shù)據(jù)維護,最好能提供維護的界面抄邀。表維護生成器 (Table maintenance generator) 是 SAP 對數(shù)據(jù)表提供的一種通用方法耘眨,在 SE1 界面,通過菜單 Utilities -> Table Maintenance Generator 進行設(shè)置撤摸。設(shè)置界面如下:
設(shè)置了表維護生成器的 table毅桃,可以使用事務(wù)碼 SM30 進行數(shù)據(jù)的維護(增刪改查)。SM30 界面可以通過事務(wù)碼 SE93 創(chuàng)建一個事務(wù)碼來維護表准夷。使用 SE93 并結(jié)合 SM30 的功能來創(chuàng)建事務(wù)碼的方法如下:
使用事務(wù)碼 SE93 進入界面钥飞,在 Transaction Code 字段輸入 ZEMP,點擊創(chuàng)建按鈕衫嵌。
選擇 Transaction with parameters
在下一屏幕中读宙,Transaction 輸入 SM30,勾上 Skip initial screen:
在最下面的 Default Values 部分楔绞,給定 VIEWNAME 和 UPDATE 兩個參數(shù):
VIEW_MAINTAINENCE_CALL 函數(shù)
如果某個表設(shè)置了表維護生成器结闸,可以利用函數(shù) VIEW_MAINTAINENCE_CALL
來對表進維護,界面同 SM30 相同酒朵。
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U'
view_name = 'ZEMPLOYEE'.
RS_TABLE_LIST_CREATE 函數(shù)
RS_TABLE_LIST_CREATE
函數(shù)比 VIEW_MAINTENANCE_CALL
更加靈活桦锄,即使表沒有維護“表維護生成器”,也可以通過代碼來進行數(shù)據(jù)維護操作蔫耽。
CALL FUNCTION 'RS_TABLE_LIST_CREATE'
EXPORTING
table_name = 'ZEMPLOYEE'
action = 'ANLE'.
action 參數(shù)有 ANLE 或 ANZE结耀,將使用不同的界面來進行數(shù)據(jù)維護。
通過 ALV 控件
對于簡單的數(shù)據(jù)表匙铡,可以使用 ALV 表格作為界面图甜。下面介紹通過 ALV 控件來維護表數(shù)據(jù)的方法。
第一步鳖眼,編寫一個程序黑毅,將數(shù)據(jù)在 ALV 中顯示。代碼如下:
REPORT z_table_crud.
TYPE-POOLS: slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_zemp TYPE STANDARD TABLE OF zemployee,
gs_zemp LIKE LINE OF gt_zemp.
START-OF-SELECTION.
PERFORM get_data.
PERFORM show_data.
FORM get_data.
SELECT * FROM zemployee
INTO CORRESPONDING FIELDS OF TABLE gt_zemp.
ENDFORM. "get_data
FORM set_fieldcat USING fldname desc editable.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = fldname.
ls_fieldcat-seltext_m = desc.
ls_fieldcat-edit = editable.
APPEND ls_fieldcat TO gt_fieldcat.
ENDFORM. "set_fieldcat
FORM show_data.
PERFORM set_fieldcat USING 'EMPID' 'Employee ID' 'X'.
PERFORM set_fieldcat USING 'EMPNAME' 'Employee Name' 'X'.
PERFORM set_fieldcat USING 'EMPADDR' 'Employee Addr' 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fieldcat[]
TABLES
t_outtab = gt_zemp[] .
ENDFORM. "show_data
第二步:ALV 關(guān)聯(lián)到自定義工具欄
ALV 內(nèi)置的工具欄沒有與保存相關(guān)的按鈕钦讳,解決辦法是拷貝一個工具欄矿瘦,讓 ALV 控件關(guān)聯(lián)拷貝的工具欄枕面。使用事務(wù)碼 SE41 從程序 SAPLKKBL 拷貝 STANDARD 工具欄到本程序。
在程序中添加一個子例程匪凡,設(shè)置 GUI STATUS:
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTANDARD'.
ENDFORM.
添加另外一個子例程膊畴,用于將界面上的變更數(shù)據(jù)保存到數(shù)據(jù)表掘猿,代碼待會再編寫病游。
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
ENDFORM.
將 ALV 關(guān)聯(lián)到 ZSTANDARD GUI Status:
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = gt_fieldcat[]
TABLES
t_outtab = gt_zemp[].
在 ZSTANDARD 工具欄上新建一個 SAVE 按鈕,F(xiàn)unction code 為 SAVE, Function text 為 Save稠通。
第三步衬衬,編寫代碼處理數(shù)據(jù)從 ALV 到內(nèi)表,內(nèi)表到數(shù)據(jù)表:
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: r_ref_grid TYPE REF TO cl_gui_alv_grid.
IF r_ucomm = 'SAVE'.
" 更新的數(shù)據(jù)保存到內(nèi)表
IF r_ref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = r_ref_grid.
ENDIF.
IF NOT r_ref_grid IS INITIAL.
CALL METHOD r_ref_grid->check_changed_data.
ENDIF.
rs_selfield-refresh = 'X'.
" 更新的數(shù)據(jù)從內(nèi)表到數(shù)據(jù)表
UPDATE zemployee FROM TABLE gt_zemp.
MESSAGE 'Data was saved successfully.' TYPE 'S'.
ENDIF.
ENDFORM.
Table Control
使用表格控件 (table control) 對數(shù)據(jù)進行 CRUD 操作改橘,界面的友好性好于 ALV 控件滋尉。本文介紹向?qū)Х绞降氖褂梅椒ā?/p>
第一步,創(chuàng)建一個編號為 2000 的 Screen飞主,創(chuàng)建一個名為 STANDARD 的 GUI Status狮惜, 在 Function Keys 部分,設(shè)置 4 個按鈕如下圖所示:
為了程序能正常退出碌识,激活 Screen 2000 默認的 PBO 和 PAI 事件碾篡,并編寫如下代碼:
REPORT z_table_crud.
DATA: ok_code LIKE sy-ucomm,
save_ok LIKE ok_code.
START-OF-SELECTION.
CALL SCREEN 2000.
MODULE status_2000 OUTPUT.
SET PF-STATUS 'STANDARD'.
ENDMODULE. "STATUS_2000 OUTPUT
MODULE user_command_2000 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. "USER_COMMAND_2000 INPUT
此時,程序能夠運行并且退出筏餐,但程序顯示的是一個空界面开泽。
第二步,在程序中定義兩個內(nèi)表魁瞪,與要維護的數(shù)據(jù)表 zemployee 結(jié)構(gòu)一致穆律,但為了方便 table control 的使用,特意增加一列 chk导俘,后面會用到 chk:
DATA: gs_emp1 LIKE zemployee.
DATA: BEGIN OF gt_emp OCCURS 0,
chk TYPE c.
INCLUDE STRUCTURE gs_emp1.
DATA: END OF gt_emp.
DATA: gt_emp_save LIKE STANDARD TABLE OF zemployee,
gs_emp LIKE LINE OF gt_emp_save.
第三步峦耘,利用向?qū)蓴?shù)據(jù)維護的界面:
將程序所有對象激活之后,進入 Screen 2000 的 Layout 界面旅薄。利用向?qū)砩?zemployee 表的數(shù)據(jù)維護界面辅髓。在向?qū)У牟襟E中,說明幾個要點赋秀。
指定 table control 的名稱:
指定程序用到的內(nèi)表為 gt_emp:
選擇字段利朵,不要包括 chk:
定義字段屬性,按照下圖定義:
- Input control: 表示可以編輯
- With column headers : 定義默認的字段頭
- Line selection column: 選 CHK猎莲,選擇字段必須為 C绍弟,長度為 1
下一屏,按下圖設(shè)置:
下一屏著洼,使用向?qū)J的值:
向?qū)臀覀兩闪撕芏啻a樟遣,激活后而叼,程序可以運行,但數(shù)據(jù)表的數(shù)據(jù)不會加載到界面豹悬。
第四步:加載數(shù)據(jù)
我們只需要將數(shù)據(jù)加載到內(nèi)表 gt_emp葵陵,數(shù)據(jù)即可以在界面中顯示。定義一個子例程:
FORM get_data.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_emp
FROM zemployee.
ENDFORM.
在 start-of-selection 事件中加載:
START-OF-SELECTION.
PERFORM get_data.
CALL SCREEN 2000.
第五步:編寫數(shù)據(jù)保存的代碼
FORM save_data.
LOOP AT gt_emp.
CLEAR gs_emp.
gs_emp-mandt = '001'.
gs_emp-empid = gt_emp-empid.
gs_emp-empname = gt_emp-empname.
gs_emp-empaddr = gt_emp-empaddr.
APPEND gs_emp TO gt_emp_save.
ENDLOOP.
MODIFY zemployee FROM TABLE gt_emp_save.
MESSAGE 'Data was saved.' TYPE 'S'.
ENDFORM.
點擊 SAVE 按鈕運行 save_data:
MODULE user_command_2000 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN 'SAVE'.
PERFORM save_data.
ENDCASE.
ENDMODULE.
ABAP 提供 Restful Service
利用 ABAP 提供 Restful Service瞻佛,這樣可以使用其它編程語言作為數(shù)據(jù)維護界面脱篙,靈活度較高。ABAP 提供 Restful Service 請參考我之前寫的系列博文