如何對SAP數(shù)據(jù)庫表進行增刪改查操作

本文介紹如何對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è)置界面如下:

image

設(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


image

在下一屏幕中读宙,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 請參考我之前寫的系列博文

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伤柄,一起剝皮案震驚了整個濱河市绊困,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌适刀,老刑警劉巖秤朗,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笔喉,居然都是意外死亡取视,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門常挚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作谭,“玉大人,你說我怎么就攤上這事待侵《纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵秧倾,是天一觀的道長怨酝。 經(jīng)常有香客問我,道長那先,這世上最難降的妖魔是什么农猬? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮售淡,結(jié)果婚禮上斤葱,老公的妹妹穿的比我還像新娘。我一直安慰自己揖闸,他們只是感情好揍堕,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汤纸,像睡著了一般衩茸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贮泞,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天楞慈,我揣著相機與錄音幔烛,去河邊找鬼。 笑死囊蓝,一個胖子當(dāng)著我的面吹牛饿悬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播聚霜,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼狡恬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俯萎?” 一聲冷哼從身側(cè)響起傲宜,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夫啊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辆憔,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡撇眯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了虱咧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熊榛。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腕巡,靈堂內(nèi)的尸體忽然破棺而出玄坦,到底是詐尸還是另有隱情,我是刑警寧澤绘沉,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布煎楣,位于F島的核電站,受9級特大地震影響车伞,放射性物質(zhì)發(fā)生泄漏择懂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一另玖、第九天 我趴在偏房一處隱蔽的房頂上張望困曙。 院中可真熱鬧,春花似錦谦去、人聲如沸慷丽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽要糊。三九已至,卻和暖如春窃诉,著一層夾襖步出監(jiān)牢的瞬間杨耙,已是汗流浹背赤套。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留珊膜,地道東北人容握。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像车柠,于是被迫代替她去往敵國和親剔氏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345