on 01-16-2009 5:49 PM
Hi :
How can lock and unlock planning area .
My jobs fail becuase users dont come out of planning area so i was thinking if we can automatically kick user out , lock planning area , run the job and then unlock planning area .
I am sure there should be sthing standard fot this . Please suggest
Hello Shyam,
We had a similar requirement. But i suppose we did not find any standard to suit our functionality. Hence we wrote a small z program to lock and unlock users.
rgds, Sandeep
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hello Shyam,
We also had faced this same problem and have implemented a z program to lock and unlock users when DP batch processes are running in background.
For this we proceeded as follows:
1. Develop z program (Code is given below) for locking and unlocking users. This program has a selection screen in which user groups are maintained that need to be locked. Also, we have a functionality that will give message to users who are locing the planning area to save thier data and comeout of the planning books. If the users donot come out within stipulated time, the sessions are killed.
2. Include this program in process chains.
3. After batch processes are over, users are unlocked.
REPORT zbxb_lock_planning_books.
TABLES: /sapapo/tsareako, usgrp.
INCLUDE /sapapo/ts_constants_iobjnm.
*----
GLOBAL DATA
DATA: BEGIN OF gt_planning_areas OCCURS 0,
pareaid LIKE /sapapo/tsversio-pareaid,
END OF gt_planning_areas,
BEGIN OF gt_usgrp OCCURS 0,
usergroup LIKE usgrp-usergroup,
END OF gt_usgrp,
gv_success TYPE char01.
*----
SELECTION-SCREEN
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME title text-t04.
SELECT-OPTIONS:
s_area FOR /sapapo/tsareako-pareaid OBLIGATORY,
s_class FOR usgrp-usergroup OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t01.
PARAMETERS: p_lck RADIOBUTTON GROUP g1,
p_unlck RADIOBUTTON GROUP g1.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_log AS CHECKBOX DEFAULT 'X',
p_sendm AS CHECKBOX DEFAULT 'X',
p_time TYPE i DEFAULT '300',
p_tkill TYPE i DEFAULT '60'.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK m1 WITH FRAME TITLE text-t02.
PARAMETERS: p_m11 TYPE objrtxt,
p_m12 TYPE objrtxt.
SELECTION-SCREEN END OF BLOCK m1.
SELECTION-SCREEN BEGIN OF BLOCK m2 WITH FRAME TITLE text-t03.
PARAMETERS: p_m21 TYPE objrtxt,
p_m22 TYPE objrtxt.
SELECTION-SCREEN END OF BLOCK m2.
*----
START-OF-SELECTION
START-OF-SELECTION.
CLEAR gt_planning_areas. REFRESH gt_planning_areas.
SELECT pareaid INTO CORRESPONDING FIELDS OF TABLE gt_planning_areas
FROM /sapapo/tsareako
WHERE pareaid IN s_area.
CLEAR gt_usgrp. REFRESH gt_usgrp.
SELECT usergroup INTO TABLE gt_usgrp
FROM usgrp
WHERE usergroup IN s_class.
CASE p_lck.
WHEN ''.
PERFORM unlock.
WHEN 'X'.
PERFORM lock.
ENDCASE.
END-OF-SELECTION.
&----
*& Form unlock
&----
FORM unlock .
*------- REMOVE external lock
LOOP AT gt_usgrp.
LOOP AT gt_planning_areas.
PERFORM remove_lock USING gt_planning_areas-pareaid
gt_usgrp-usergroup.
ENDLOOP.
ENDLOOP.
ENDFORM. " unlock
&----
*& Form lock
&----
FORM lock .
*------- Send message to all ACTIVE Users
PERFORM send_message_to_active_users.
LOOP AT gt_usgrp.
LOOP AT gt_planning_areas.
*------- set external lock
PERFORM set_lock USING gt_planning_areas-pareaid
gt_usgrp-usergroup
CHANGING gv_success.
IF gv_success = ''.
EXIT.
ENDIF.
ENDLOOP.
ENDLOOP.
IF gv_success = 'X'.
WAIT UP TO p_time SECONDS.
LOOP AT gt_usgrp.
LOOP AT gt_planning_areas.
*------- try to lock in, remove standard locks
PERFORM unlock_planning_area USING gt_planning_areas-pareaid
gt_usgrp-usergroup.
ENDLOOP.
ENDLOOP.
ENDIF.
ENDFORM. " lock
&----
*& Form unlock_planning_area
&----
FORM unlock_planning_area USING
p_planning_area TYPE /sapapo/ts_pareaid
p_usergroup TYPE xuclass.
DATA: lv_success_lock TYPE as4flag,
lt_selection TYPE /sapapo/ts_iobj_selection_tab,
ls_selection TYPE /sapapo/ts_iobj_selection,
lv_message2(128),
lv_user TYPE eqeuname,
lv_user_again TYPE eqeuname,
ls_lock_str TYPE /sapapo/ts_lc_lock_str,
BEGIN OF lt_area_versions OCCURS 0,
pareaid LIKE /sapapo/tsversio-pareaid,
vrsioid LIKE /sapapo/tsversio-vrsioid,
END OF lt_area_versions.
message text
CONCATENATE p_m21 p_m22 INTO lv_message2
SEPARATED BY space.
All all active planning versions
SELECT pareaid vrsioid
INTO CORRESPONDING FIELDS OF TABLE lt_area_versions
FROM /sapapo/tsversio
WHERE pareaid = p_planning_area.
LOOP AT lt_area_versions.
ls_selection-iobjnm = gs_c_iobjnm-version.
ls_selection-sign = 'I'.
ls_selection-option = 'EQ'.
ls_selection-low = lt_area_versions-vrsioid.
APPEND ls_selection TO lt_selection.
ENDLOOP.
WHILE lv_success_lock IS INITIAL.
CALL FUNCTION '/SAPAPO/TS_DM_LOCK'
EXPORTING
iv_pareaid = p_planning_area
it_selection = lt_selection
IMPORTING
ev_success = lv_success_lock
ev_user = lv_user
es_lock_str = ls_lock_str
EXCEPTIONS
pareaid_invalid = 1
communication_failure = 2
system_failure = 3
foreign_lock = 4
lc_lock_error = 5
OTHERS = 6.
IF lv_user = sy-uname.
*------- User & cannot be deleted. Batch user and locking
user are the same.
PERFORM write_log USING
'ZBXB_DP' 'E' '008'
lv_user '' '' ''.
MESSAGE e008(zbxb_dp) WITH lv_user.
ENDIF.
IF sy-subrc = 0.
IF lv_success_lock <> 'X'.
Send message to user
CALL FUNCTION 'TH_POPUP'
EXPORTING
client = sy-mandt
user = lv_user
MESSAGE = lv_message2
EXCEPTIONS
user_not_found = 1
OTHERS = 2.
WAIT UP TO p_tkill SECONDS.
Check if he still locks
CALL FUNCTION '/SAPAPO/TS_DM_LOCK'
EXPORTING
iv_pareaid = p_planning_area
it_selection = lt_selection
IMPORTING
ev_success = lv_success_lock
ev_user = lv_user_again
es_lock_str = ls_lock_str
EXCEPTIONS
pareaid_invalid = 1
communication_failure = 2
system_failure = 3
foreign_lock = 4
lc_lock_error = 5
OTHERS = 6.
IF sy-subrc = 0.
IF ( lv_success_lock <> 'X' ) AND ( lv_user = lv_user_again ).
Kill sessions
CALL FUNCTION 'TH_DELETE_USER'
EXPORTING
user = lv_user
client = sy-mandt
EXCEPTIONS
authority_error = 1
OTHERS = 2.
*------- User &1 has been locking area &2. We was LOGOFF
PERFORM write_log USING
'ZBXB_DP' 'E' '001'
lv_user p_planning_area '' ''.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDWHILE.
*------- Planning area &1 has been locked
PERFORM write_log USING
'ZBXB_DP' 'S' '006'
p_planning_area p_usergroup '' ''.
CALL FUNCTION '/SAPAPO/TS_DM_UNLOCK'
EXPORTING
iv_pareaid = p_planning_area
it_selection = lt_selection
EXCEPTIONS
pareaid_invalid = 1
lc_unlock_error = 2
OTHERS = 3.
ENDFORM. " unlock_planning_area
&----
*& Form remove_lock
&----
FORM remove_lock USING p_planning_area TYPE /sapapo/ts_pareaid
p_usergroup TYPE xuclass.
CALL FUNCTION 'ZBXB_DP_UPDATE_AREA_LOCK'
EXPORTING
i_pareaid = p_planning_area
i_class = p_usergroup
i_unlock = 'X'
EXCEPTIONS
already_locked = 1
nothing_happend = 2
OTHERS = 3.
IF sy-subrc = 0.
*------- Planning area &1 has been unlocked
PERFORM write_log USING 'ZBXB_DP' 'S' '004'
p_planning_area p_usergroup '' ''.
WRITE: / p_planning_area, 20 p_usergroup.
FORMAT COLOR COL_POSITIVE.
WRITE: 40 'UNLOCKED'.
FORMAT COLOR OFF.
ENDIF.
ENDFORM. " remove_lock
&----
*& Form set_lock
&----
FORM set_lock USING p_planning_area TYPE /sapapo/ts_pareaid
p_usergroup TYPE xuclass
CHANGING p_success TYPE char01.
CLEAR p_success.
CALL FUNCTION 'ZBXB_DP_UPDATE_AREA_LOCK'
EXPORTING
i_pareaid = p_planning_area
i_class = p_usergroup
i_lock = 'X'
EXCEPTIONS
already_locked = 1
nothing_happend = 2
OTHERS = 3.
WRITE: / p_planning_area, 20 p_usergroup.
IF sy-subrc = 0.
p_success = 'X'.
*------- External lock for planning area &1
created (switch to DISPLAY mode)
PERFORM write_log USING 'ZBXB_DP' 'S' '002'
p_planning_area p_usergroup '' ''.
FORMAT COLOR COL_POSITIVE.
WRITE: 40 'LOCKED'(001).
ELSEIF sy-subrc = 0.
*------- External lock for planning area &1 already exists
PERFORM write_log USING 'ZBXB_DP' 'E' '005'
p_planning_area p_usergroup '' ''.
FORMAT COLOR COL_NEGATIVE.
WRITE: 40 'Already locked'(002).
ELSE.
*------- Error during creation of external lock for planning area &1
PERFORM write_log USING 'ZBXB_DP' 'E' '003'
p_planning_area p_usergroup '' ''.
FORMAT COLOR COL_NEGATIVE.
WRITE: 40 'Error during lock creation'(003).
ENDIF.
FORMAT COLOR OFF.
ENDFORM. " set_lock
&----
*& Form send_message_to_active_users
&----
FORM send_message_to_active_users .
DATA: lt_usr_tabl LIKE uinfo OCCURS 0,
ls_usr_tabl LIKE uinfo.
DATA: lv_message1(128),
lv_user TYPE eqeuname,
BEGIN OF lt_usr02 OCCURS 0,
bname LIKE usr02-bname,
class LIKE usr02-class,
END OF lt_usr02.
*------- Get all active users
CALL FUNCTION 'THUSRINFO'
TABLES
usr_tabl = lt_usr_tabl.
CLEAR lt_usr02. REFRESH lt_usr02.
SELECT bname class INTO TABLE lt_usr02
FROM usr02
WHERE class IN s_class. "#EC CI_SGLSELECT
SORT lt_usr02 BY bname.
CONCATENATE p_m11 p_m12 INTO lv_message1
SEPARATED BY space.
IF p_sendm = 'X'.
*------- Send message to user
LOOP AT lt_usr_tabl INTO ls_usr_tabl .
READ TABLE lt_usr02 WITH KEY bname = ls_usr_tabl-bname
TRANSPORTING NO FIELDS BINARY SEARCH.
IF sy-subrc = 0.
lv_user = ls_usr_tabl-bname.
CALL FUNCTION 'TH_POPUP'
EXPORTING
client = sy-mandt
user = lv_user
MESSAGE = lv_message1
EXCEPTIONS
user_not_found = 1
OTHERS = 2.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " send_message_to_active_users
&----
*& Form write_log
&----
FORM write_log USING p_msgid p_msgty p_msgno
p_msgv1 p_msgv2 p_msgv3 p_msgv4.
DATA:
ls_log TYPE bal_s_log,
lt_handle TYPE bal_t_logh,
lf_handle TYPE balloghndl,
ls_msg TYPE bal_s_msg.
IF p_log = 'X'.
we use production order / operation log objects
ls_log-object = 'ZBXB_LOAD_MSG'.
ls_log-subobject = 'ZBXB_LOCK'.
ls_log-aluser = sy-uname.
ls_log-alprog = sy-repid.
ls_log-aldate_del = sy-datum + 30. "keep for one month
ls_log-del_before = 'X'.
create a log
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = ls_log
IMPORTING
e_log_handle = lf_handle
EXCEPTIONS
OTHERS = 1.
define data of message for Application Log
Use generic message template with & & & &
ls_msg-msgty = p_msgty.
ls_msg-msgid = p_msgid.
ls_msg-msgno = p_msgno.
ls_msg-msgv1 = p_msgv1.
ls_msg-msgv2 = p_msgv2.
ls_msg-msgv3 = p_msgv3.
ls_msg-msgv4 = p_msgv4.
add this message to log
this function can be called several times to have one log entry
store several different messages
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_log_handle = lf_handle
i_s_msg = ls_msg
EXCEPTIONS
OTHERS = 1.
save the log
APPEND lf_handle TO lt_handle.
CALL FUNCTION 'BAL_DB_SAVE'
EXPORTING
i_save_all = 'X'
i_t_log_handle = lt_handle
EXCEPTIONS
OTHERS = 1.
ENDIF.
ENDFORM. " write_log
-
*Z function module:
ZBXB_DP_UPDATE_AREA_LOCK*
FUNCTION zbxb_dp_update_area_lock.
*"----
""Update Function Module:
*"
""Local Interface:
*" IMPORTING
*" VALUE(I_PAREAID) TYPE /SAPAPO/TS_PAREAID
*" VALUE(I_CLASS) TYPE XUCLASS
*" VALUE(I_LOCK) TYPE /OSP/DT_FLAG OPTIONAL
*" VALUE(I_UNLOCK) TYPE /OSP/DT_FLAG OPTIONAL
*" EXCEPTIONS
*" ALREADY_LOCKED
*" NOTHING_HAPPEND
*"----
DATA: ls_planarea_lc LIKE zbxb_planarea_lc.
IF i_lock = 'X'.
ls_planarea_lc-pareaid = i_pareaid.
ls_planarea_lc-class = i_class.
ls_planarea_lc-cdat = sy-datum.
ls_planarea_lc-ctime = sy-uzeit.
ls_planarea_lc-autor = sy-uname.
INSERT into zbxb_planarea_lc values ls_planarea_lc.
IF sy-subrc <> 0.
RAISE already_locked.
ENDIF.
ELSEIF i_unlock = 'X'.
DELETE FROM zbxb_planarea_lc
WHERE pareaid = i_pareaid AND
class = i_class.
ENDIF.
ENDFUNCTION.
-
In this Function module, we are calling a table wherein assignment for user group and planning area is maintained.
Table is ZBXB_PLANAREA_LC
with following feilds
Feild Data element Data type
MANDT MANDT CLNT
PAREAID /SAPAPO/TS_PAREAID CHAR
CLASS XUCLASS CHAR
CDAT /SAPAPO/CDAT DATS
CTIME /SAPAPO/CTME TIMS
AUTOR /SAPAPO/AUTOR CHAR
-
Hope this helps.
Ashutosh
User | Count |
---|---|
7 | |
4 | |
3 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.