cancel
Showing results for 
Search instead for 
Did you mean: 

Planning Area Lock

Former Member
0 Kudos

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

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

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

Former Member
0 Kudos

Can some body give me details of that program that how to lock & iunlock users from entering planning area

Former Member
0 Kudos

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

Answers (0)