sap 鎖機制實現

通過對SAP鎖機制的瞭解,相信大家都比較關心這鎖機制是如何運用的,下面是週末研究的過程,現在記錄下來方便大家,也方便自己了!
1) SE11 創建鎖,鎖對象名必須以EZ或者EY開始:

2)點擊創建進入鎖對象維護,並設置相關信息如下:




以上就基本設置完,下面通過編寫程序測試,代碼如下:

*&---------------------------------------------------------------------*
*& Report  ZTEST_LOCK
*&
*&---------------------------------------------------------------------*
*& CREATE BY   :  FLYING
*& CREATE DATE :  2009-11-14
*& DECRIPTIONS :  測試SAP的鎖機制
*&---------------------------------------------------------------------*

REPORT  ztest_lock.

TABLES: sscrfields.
*----------------------------------------------------------------------*
*   define internal table
*   定義內表
*
*----------------------------------------------------------------------*
DATA: t_eban TYPE zteban OCCURS 0 WITH HEADER LINE,
w_eban LIKE t_eban.

*----------------------------------------------------------------------*
*  defin avirable
*  定義變量
*
*----------------------------------------------------------------------*
DATA: ok_code TYPE sy-ucomm,            "獲得按鈕功能碼
save_ok TYPE sy-ucomm.                  "臨時存儲功能碼

DATA: flag  TYPE i.                                  "用於標記處理模式是修改還是顯示
*----------------------------------------------------------------------*
*  selection-screen
*  選擇屏幕
*
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.
PARAMETERS: p_banfn LIKE eban-banfn.
SELECTION-SCREEN END   OF BLOCK blk.

SELECTION-SCREEN FUNCTION KEY 1.      "添加屏幕按鈕
SELECTION-SCREEN FUNCTION KEY 2.      "添加屏幕按鈕

*---------------------------------------------------------------------*
*  initialization
*  初始化選擇屏幕
*
*---------------------------------------------------------------------*
INITIALIZATION.
sscrfields-functxt_01 = '修改'.    "設置屏幕顯示文本
sscrfields-functxt_02 = '顯示'.
CLEAR flag.

*---------------------------------------------------------------------*
*  at selection-screen
*  處理選擇屏幕的按鈕
*
*---------------------------------------------------------------------*
AT SELECTION-SCREEN.
CASE sy-ucomm.                    "選擇屏幕按鈕
WHEN 'FC01'.
flag = 1.
PERFORM frm_get_data.
WHEN 'FC02'.
flag = 0.
PERFORM frm_get_data.
ENDCASE.

*---------------------------------------------------------------------*
*  frm_get_data
*  根據選擇條件取數據
*
*---------------------------------------------------------------------*
FORM frm_get_data.
SELECT banfn
bnfpo
matnr
ekgrp
INTO CORRESPONDING FIELDS OF TABLE t_eban
FROM eban
WHERE banfn = p_banfn.

IF t_eban[] IS INITIAL.
MESSAGE '沒有可查詢的數據' TYPE 'I'.
STOP.
ELSE.
IF flag = 1.
PERFORM frm_set_lock.
ENDIF.
CALL SCREEN 1001.
ENDIF.

ENDFORM.                    "frm_get_data
*---------------------------------------------------------------------*
*  frm_set_lock
*  設置鎖
*
*--------------------------------------------------------------------*
FORM frm_set_lock.
CALL FUNCTION 'ENQUEUE_EZEBAN'
EXPORTING
mode_zteban = 'E'
mandt       = sy-mandt
banfn       = p_banfn.
IF sy-subrc <> 0.
STOP.
ENDIF.

ENDFORM.                    "frm_set_lock

*----------------------------------------------------------*
*  frm_delete_lock
*  刪除鎖
*
*----------------------------------------------------------*
FORM frm_delete_lock.
CALL FUNCTION 'DEQUEUE_EZEBAN'
EXPORTING
mode_zteban       = 'E'
mandt             = sy-mandt
banfn             = p_banfn
x_banfn           = ' '
.
ENDFORM.                    "frm_delete_lock




*&SPWIZARD: DECLARATION OF TABLECONTROL 'TAB1' ITSELF
CONTROLS: tab1 TYPE TABLEVIEW USING SCREEN 1001.

*&SPWIZARD: OUTPUT MODULE FOR TC 'TAB1'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE tab1_change_tc_attr OUTPUT.
DESCRIBE TABLE t_eban LINES tab1-lines.
ENDMODULE.                    "TAB1_CHANGE_TC_ATTR OUTPUT

*&SPWIZARD: INPUT MODULE FOR TC 'TAB1'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MODIFY TABLE
MODULE tab1_modify INPUT.
MODIFY t_eban
INDEX tab1-current_line.
ENDMODULE.                    "TAB1_MODIFY INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.
SET PF-STATUS 'STAT_1001'.
ENDMODULE.                 " STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
save_ok = ok_code.
CLEAR ok_code.

CASE save_ok.
WHEN 'BACK'.
perform frm_delete_lock.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
PERFORM frm_delete_lock.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.                 " USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*&      Module  SET_READ_LINE  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE set_read_line OUTPUT.                       "設置表格的行項目不可編輯
IF flag = 0.
LOOP AT SCREEN.
IF screen-name = 'T_EBAN-BANFN'.
screen-input = '0'.        
ENDIF.
IF screen-name = 'T_EBAN-BNFPO'.
screen-input = '0'.
ENDIF.
IF screen-name = 'T_EBAN-MATNR'.
screen-input = '0'.
ENDIF.
IF screen-name = 'T_EBAN-EKGRP'.
screen-input = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE.                 " SET_READ_LINE  OUTPUT

測試效果如下所示:








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章