美文网首页
如何对SAP数据库表进行增删改查操作

如何对SAP数据库表进行增删改查操作

作者: Stone0823 | 来源:发表于2020-07-20 21:36 被阅读0次

本文介绍如何对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 进行设置。设置界面如下:

image
设置了表维护生成器的 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 请参考我之前写的系列博文

参考

相关文章

  • 如何对SAP数据库表进行增删改查操作

    本文介绍如何对SAP数据库表进行增删改查操作,重点是说明如何为数据的增删改查提供编辑界面。假定现在要对 zempl...

  • SQL查询结构总结

    SQL 增删改查 对数据库有修改的操作是:增删改 增 insert into 表名 values(); 删 del...

  • myspl模块化

    什么是关系型数据库 如何进行数据表的增删改查 使用mysql模块操作对数据表进行增删改查 什么是模块化 封装db模...

  • Python

    Python 创建文件 Python 对数据库进行操作--增删改查 Python 对csv进行操作 Python ...

  • Python day24_mysql数据库

    mysql 数据库的操作 数据表的操作 增删改查(curd)

  • 关于python的list的增查删改

    说到增查删改,想起了数据库,我们在关系型数据库当中就会对表进行增查删改。 在python当中我们也可以对list进...

  • 数据库相关

    一、 数据库的操作 二、 数据表的操作 三、 增删改查(curd)

  • Python Mysql操作封装

    本篇文章主要介绍python中如何操作mysql数据库,并进行封装,现在只是对mysql进行增、删、改、查等操作进...

  • python基础-03

    python操作mysql数据库 创建数据表 数据表的 增 删 查 改 增 查 改 删

  • SQL语句

    数据库的增删改查 数据表的增删改查 表内记录的增删改查

网友评论

      本文标题:如何对SAP数据库表进行增删改查操作

      本文链接:https://www.haomeiwen.com/subject/svlukktx.html