本文介绍如何对SAP数据库表进行增删改查操作,重点是说明如何为数据的增删改查提供编辑界面。假定现在要对 zemployee 表进行增删改查操作。表的字段如下:
通过ABAP 代码进行 CRUD 操作
INSERT 语句对 database table 的记录进行插入操作。语法如下:
INSERT dbtab from wa/itab.
如果至少有一笔记录插入成功,sy-subrc = 0,如果至少有一笔记录插入失败, sy-subrc =4,比如可能由于 primary key 重复。
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 语句允许对数据库表的记录进行修改。
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 是否已经存在 ,从而不能确定是否可使用 UPDATE 语句,那么 ,请使用 MODIFY 语句。MODIFY 语句既可以插入,也可以更新。
要从数据库表中删除行 ,请使用 DELETE 语句。DELETE 语句允许删除单行或多行。个人觉得删除记录的操作,没有必要使用工作区,可以直接通过条件来定位要删除的行。
DELETE FROM zemployee1 WHERE empid = '003'.
IF sy-subrc IS INITIAL.
WRITE sy-dbcnt.
ELSE.
WRITE 'Error'.
ENDIF.
表维护生成器
为了方便对数据表的数据维护,最好能提供维护的界面。表维护生成器 (Table maintenance generator) 是 SAP 对数据表提供的一种通用方法,在 SE1 界面,通过菜单 Utilities -> Table Maintenance Generator 进行设置。设置界面如下:
设置了表维护生成器的 table,可以使用事务码 SM30 进行数据的维护(增删改查)。SM30 界面可以通过事务码 SE93 创建一个事务码来维护表。使用 SE93 并结合 SM30 的功能来创建事务码的方法如下:
使用事务码 SE93 进入界面,在 Transaction Code 字段输入 ZEMP,点击创建按钮。
选择 Transaction with parameters
image
在下一屏幕中,Transaction 输入 SM30,勾上 Skip initial screen:
在最下面的 Default Values 部分,给定 VIEWNAME 和 UPDATE 两个参数:
VIEW_MAINTAINENCE_CALL 函数
如果某个表设置了表维护生成器,可以利用函数 VIEW_MAINTAINENCE_CALL
来对表进维护,界面同 SM30 相同。
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U'
view_name = 'ZEMPLOYEE'.
RS_TABLE_LIST_CREATE 函数
RS_TABLE_LIST_CREATE
函数比 VIEW_MAINTENANCE_CALL
更加灵活,即使表没有维护“表维护生成器”,也可以通过代码来进行数据维护操作。
CALL FUNCTION 'RS_TABLE_LIST_CREATE'
EXPORTING
table_name = 'ZEMPLOYEE'
action = 'ANLE'.
action 参数有 ANLE 或 ANZE,将使用不同的界面来进行数据维护。
通过 ALV 控件
对于简单的数据表,可以使用 ALV 表格作为界面。下面介绍通过 ALV 控件来维护表数据的方法。
第一步,编写一个程序,将数据在 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 关联到自定义工具栏
ALV 内置的工具栏没有与保存相关的按钮,解决办法是拷贝一个工具栏,让 ALV 控件关联拷贝的工具栏。使用事务码 SE41 从程序 SAPLKKBL 拷贝 STANDARD 工具栏到本程序。
在程序中添加一个子例程,设置 GUI STATUS:
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTANDARD'.
ENDFORM.
添加另外一个子例程,用于将界面上的变更数据保存到数据表,代码待会再编写。
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
ENDFORM.
将 ALV 关联到 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 按钮,Function code 为 SAVE, Function text 为 Save。
第三步,编写代码处理数据从 ALV 到内表,内表到数据表:
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'.
" 更新的数据保存到内表
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'.
" 更新的数据从内表到数据表
UPDATE zemployee FROM TABLE gt_zemp.
MESSAGE 'Data was saved successfully.' TYPE 'S'.
ENDIF.
ENDFORM.
Table Control
使用表格控件 (table control) 对数据进行 CRUD 操作,界面的友好性好于 ALV 控件。本文介绍向导方式的使用方法。
第一步,创建一个编号为 2000 的 Screen,创建一个名为 STANDARD 的 GUI Status, 在 Function Keys 部分,设置 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
此时,程序能够运行并且退出,但程序显示的是一个空界面。
第二步,在程序中定义两个内表,与要维护的数据表 zemployee 结构一致,但为了方便 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.
第三步,利用向导生成数据维护的界面:
将程序所有对象激活之后,进入 Screen 2000 的 Layout 界面。利用向导来生成 zemployee 表的数据维护界面。在向导的步骤中,说明几个要点。
指定 table control 的名称:
指定程序用到的内表为 gt_emp:
选择字段,不要包括 chk:
定义字段属性,按照下图定义:
- Input control: 表示可以编辑
- With column headers : 定义默认的字段头
- Line selection column: 选 CHK,选择字段必须为 C,长度为 1
下一屏,按下图设置:
下一屏,使用向导默认的值:
向导帮我们生成了很多代码,激活后,程序可以运行,但数据表的数据不会加载到界面。
第四步:加载数据
我们只需要将数据加载到内表 gt_emp,数据即可以在界面中显示。定义一个子例程:
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.
第五步:编写数据保存的代码
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,这样可以使用其它编程语言作为数据维护界面,灵活度较高。ABAP 提供 Restful Service 请参考我之前写的系列博文
网友评论