In SWDD:
Get_Agent_s Activity step(This activity step just for getting agents):-
![screen1.png]()
![screen2.png]()
![screen3.png]()
![screen4.png]()
![screen5.png]()
Get_agent method coding:
BEGIN_METHOD GET_AGENT CHANGING CONTAINER.
data:
E_AGENT TYPE T16FW-OBJID,
I_PRNUMBER TYPE EBAN-BANFN,
E_LAGENT TYPE MARA-LVORM,
E_RELEASELEVEL TYPE EBAN-FRGST,
init_uid type pa0105-usrid,
init_uname type vornamc,
lv_pernr type pernr_d,
lv_nachn type pad_nachn,
lv_vorna type pad_vorna,
lv_uname type cname,
lv_mailid type COMM_ID_LONG,
E_INITNAME TYPE CNAME,
E_USERID TYPE PA0105-USRID OCCURS 0,
E_USRNAME TYPE PA0002-VORNA OCCURS 0,
E_MAILID TYPE PA0105-USRID_LONG OCCURS 0,
E_INITMAILID TYPE PA0105-USRID_LONG.
SWC_GET_ELEMENT CONTAINER 'I_PRNumber' I_PRNUMBER.
SWC_GET_ELEMENT CONTAINER 'init_uid' INIT_UID.
CALL FUNCTION 'ZACINPSFM0000001'
EXPORTING
ipurchase_req = I_PRNUMBER
IMPORTING
EAGENT_ZID = E_AGENT
ELAST_AGENT = E_LAGENT
E_RELEASELEVEL = E_RELEASELEVEL
tables
E_USRID = E_USERID
E_USRNAME = E_USRNAME
E_MAILID = E_MAILID.
*---> getting the name,maild of initiator.
clear lv_pernr.
select single pernr
from pa0105
into lv_pernr
where usrid = init_uid+2.
if sy-subrc = 0.
clear lv_mailid.
select single USRID_LONG
from pa0105
into lv_mailid
where pernr = lv_pernr
and subty = '0010'.
if sy-subrc = 0.
E_INITMAILID = lv_mailid.
endif.
clear lv_uname.
select single nachn
vorna
into (lv_nachn, lv_vorna)
from pa0002
where pernr = lv_pernr.
if sy-subrc = 0.
concatenate lv_nachn lv_vorna into lv_uname.
e_initname = lv_uname.
endif.
endif.
SWC_SET_ELEMENT CONTAINER 'e_agent' E_AGENT.
SWC_SET_ELEMENT CONTAINER 'e_lagent' E_LAGENT.
SWC_SET_ELEMENT CONTAINER 'E_INITMAILID' E_INITMAILID.
SWC_SET_TABLE CONTAINER 'e_userid' E_USERID.
SWC_SET_TABLE CONTAINER 'e_usrname' E_USRNAME.
SWC_SET_TABLE CONTAINER 'e_mailid' E_MAILID.
SWC_SET_ELEMENT CONTAINER 'E_RELEASELEVEL' E_RELEASELEVEL.
SWC_SET_ELEMENT CONTAINER 'e_initname' e_initname.
END_METHOD.
CALL FUNCTION 'ZACINPSFM0000001'.(This is the code inside function module).
CONSTANTS: lv_gr(2) TYPE c VALUE 'G1',
lv_08(2) TYPE c VALUE '08'.
*-----------DECLARING LOCAL VARIABLES
DATA:
lv_frgzu TYPE eban-frgzu,
lv_x(02) TYPE c,
name TYPE vornamc,
lv_fname TYPE pad_vorna,
lv_lname TYPE pad_nachn.
*--------->>>>>>>>>>>
SELECT banfn
frgkz
frgzu
frgst
FROM eban INTO TABLE gi_eban
WHERE banfn = ipurchase_req.
*--->getting the release level
READ TABLE gi_eban INTO gs_eban WITH KEY banfn = ipurchase_req.
IF sy-subrc = 0.
e_releaselevel = gs_eban-frgst.
ENDIF.
SELECT frggr
frgsx
frgc1
frgc2
frgc3
frgc4
frgc5
frgc6
frgc7
frgc8
FROM t16fs INTO TABLE gi_t16fs
FOR ALL ENTRIES IN gi_eban
WHERE frggr = lv_gr
AND frgsx = gi_eban-frgst.
LOOP AT gi_eban INTO gs_eban.
lv_frgzu = gs_eban-frgzu.
IF lv_frgzu = ''.
SELECT frggr
frgco
werks
otype
objid
FROM t16fw INTO TABLE gi_t16fw
FOR ALL ENTRIES IN gi_t16fs
* WHERE frggr = lv_gr
* AND frgco = gi_t16fs-frgc1.
* seetha
WHERE frgco = gi_t16fs-frgc1
and frggr = lv_gr.
**** 23-08-14 seetha determine codes
* seetha changes.
if sy-subrc eq 0.
LOOP AT gi_t16fw INTO gs_t16fw.
eagent_zid = gs_t16fw-objid.
ENDLOOP.
endif.
ELSEIF lv_frgzu = 'X'.
SELECT frggr
frgco
werks
otype
objid
FROM t16fw INTO TABLE gi_t16fw
FOR ALL ENTRIES IN gi_t16fs
* WHERE frggr = lv_gr
* AND frgco = gi_t16fs-frgc2.
WHERE frgco = gi_t16fs-frgc2
and frggr = lv_gr.
**** 23-08-14 seetha determine codes
if sy-subrc = 0.
LOOP AT gi_t16fw INTO gs_t16fw.
eagent_zid = gs_t16fw-objid.
ENDLOOP.
endif.
ELSEIF lv_frgzu = 'XX'.
SELECT frggr
frgco
werks
otype
objid
FROM t16fw INTO TABLE gi_t16fw
FOR ALL ENTRIES IN gi_t16fs
* WHERE frggr = lv_gr
* AND frgco = gi_t16fs-frgc3.
WHERE frgco = gi_t16fs-frgc3
and frggr = lv_gr.
if sy-subrc = 0.
LOOP AT gi_t16fw INTO gs_t16fw.
eagent_zid = gs_t16fw-objid.
ENDLOOP.
endif.
ELSEIF lv_frgzu = 'XXX'.
SELECT frggr
frgco
werks
otype
objid
FROM t16fw INTO TABLE gi_t16fw
FOR ALL ENTRIES IN gi_t16fs
* WHERE frggr = lv_gr
* AND frgco = gi_t16fs-frgc4.
WHERE frgco eq gi_t16fs-frgc4
and frggr eq lv_gr.
if sy-subrc = 0.
LOOP AT gi_t16fw INTO gs_t16fw.
eagent_zid = gs_t16fw-objid.
* elast_agent = 'X'.
ENDLOOP.
endif.
*seetha
ELSEIF lv_frgzu = 'XXXX'.
SELECT frggr
frgco
werks
otype
objid
FROM t16fw INTO TABLE gi_t16fw
FOR ALL ENTRIES IN gi_t16fs
WHERE frggr = lv_gr
AND frgco = gi_t16fs-frgc5.
if sy-subrc = 0.
LOOP AT gi_t16fw INTO gs_t16fw.
eagent_zid = gs_t16fw-objid.
ENDLOOP.
endif.
ELSEIF lv_frgzu = 'XXXXX'.
SELECT frggr
frgco
werks
otype
objid
FROM t16fw INTO TABLE gi_t16fw
FOR ALL ENTRIES IN gi_t16fs
WHERE frggr = lv_gr
AND frgco = gi_t16fs-frgc6.
if sy-subrc = 0.
LOOP AT gi_t16fw INTO gs_t16fw.
eagent_zid = gs_t16fw-objid.
elast_agent = 'X'.
ENDLOOP.
endif.
* ELSEIF lv_frgzu = 'XXXXXX'.
*
* SELECT frggr
* frgco
* werks
* otype
* objid
* FROM t16fw INTO TABLE gi_t16fw
* FOR ALL ENTRIES IN gi_t16fs
* WHERE frggr = lv_gr
* AND frgco = gi_t16fs-frgc7.
*
* LOOP AT gi_t16fw INTO gs_t16fw.
* eagent_zid = gs_t16fw-objid.
* ENDLOOP.
*
* ELSEIF lv_frgzu = 'XXXXXXX'.
*
* SELECT frggr
* frgco
* werks
* otype
* objid
* FROM t16fw INTO TABLE gi_t16fw
* FOR ALL ENTRIES IN gi_t16fs
* WHERE frggr = lv_gr
* AND frgco = gi_t16fs-frgc8.
*
* LOOP AT gi_t16fw INTO gs_t16fw.
* eagent_zid = gs_t16fw-objid.
** elast_agent = 'X'.
* ENDLOOP.
ENDIF.
ENDLOOP.
*---> Fetching pernr correspodingn to the position.uerid
SELECT pernr
plans
FROM pa0001 INTO TABLE gi_pa0001
WHERE plans = eagent_zid.
* kavitha
if sy-subrc eq 0.
SELECT
pernr
usrid
* usrid_long
FROM pa0105 INTO TABLE gi_pa0105
FOR ALL ENTRIES IN gi_pa0001
WHERE pernr = gi_pa0001-pernr.
endif.
LOOP AT gi_pa0105 INTO gs_pa0105.
CONCATENATE 'US' gs_pa0105-usrid INTO gs_pa0105-usrid.
move:gs_pa0105-usrid to gs_t16-objid.
condense gs_t16-objid.
append gs_t16 to gi_t16.
delete ADJACENT DUPLICATES FROM gi_t16.
clear:gs_pa0105-usrid.
MODIFY gi_pa0105 FROM gs_pa0105 .
DELETE gi_pa0105 WHERE usrid = ''.
ENDLOOP.
*---> getting the userid
*e_usrid[] = gi_pa0105[].
e_usrid[] = gi_t16[].
* get user fname and lastname.
IF gi_pa0001 IS NOT INITIAL.
SELECT pernr
nachn
vorna
FROM pa0002 INTO TABLE gi_pa0002
FOR ALL ENTRIES IN gi_pa0001
WHERE pernr = gi_pa0001-pernr.
*
IF sy-subrc EQ 0.
LOOP AT gi_pa0002 INTO gs_pa0002.
CONCATENATE gs_pa0002-vorna gs_pa0002-nachn INTO gs_uname-uname.
APPEND gs_uname TO gi_uname.
ENDLOOP.
e_usrname[] = gi_uname[].
ENDIF.
* to get mail id of the user
SELECT
pernr
usrid
usrid_long
FROM pa0105 INTO TABLE gi_emailid
FOR ALL ENTRIES IN gi_pa0001
WHERE pernr = gi_pa0001-pernr
AND subty = '0010'.
IF sy-subrc EQ 0.
LOOP AT gi_emailid INTO gs_emailid.
gs_email-email_id = gs_emailid-email_id.
APPEND gs_email TO gi_email.
ENDLOOP.
e_mailid[] = gi_email[].
ENDIF.
ENDIF.
clear : gs_emailid,gs_pa0105,gs_eban,gs_pa0002.
ENDFUNCTION.
2. checking agent is found or not? and sending mail to agent:
![screen6.png]()
![screen7.png]()
3.PR_release activity step(here getting workitem to agent):
![screen8.png]()
![screen9.png]()
![screen10.png]()
![screen11.png]()
![screen12.png]()
Release_pr method coding:
BEGIN_METHOD RELEASE_PR CHANGING CONTAINER.
DATA:
PR_NUMBER TYPE EBAN-BANFN,
E_USER_AP_REJ TYPE SY-UNAME,
E_PAPRVR TYPE PA0105-USRID,
lv_pernr type pernr_d,
lv_mailid type COMM_ID_LONG,
E_APPMAILID type COMM_ID_LONG,
IM_USRID TYPE PA0105-USRID OCCURS 0,
WA_USRID LIKE LINE OF IM_USRID,
lin type i.
SWC_GET_ELEMENT CONTAINER 'IM_USRID' IM_USRID.
set PARAMETER ID 'BAN' field object-key.
call transaction 'ME54N'.
E_USER_AP_REJ = SY-UNAME.
CONCATENATE 'US' E_USER_AP_REJ INTO E_USER_AP_REJ.
*---> getting the agent id & mail id of the parallel approver
clear lin.
DESCRIBE TABLE IM_USRID lines lin.
if lin > 1.
clear wa_usrid.
loop at im_usrid into wa_usrid.
if wa_usrid NE E_USER_AP_REJ.
E_PAPRVR = wa_usrid.
*---> getting mail id
select single pernr
from pa0105
into lv_pernr
where usrid = E_PAPRVR+2.
if sy-subrc = 0.
clear lv_mailid.
select single USRID_LONG
from pa0105
into lv_mailid
where pernr = lv_pernr
and subty = '0010'.
if sy-subrc = 0.
E_APPMAILID = lv_mailid.
endif.
ENDIF.
ENDIF.
endloop.
SWC_SET_ELEMENT CONTAINER 'E_PAPRVR' E_PAPRVR.
SWC_SET_ELEMENT CONTAINER 'E_APPMAILID' E_APPMAILID.
endif.
SWC_SET_ELEMENT CONTAINER 'E_USER_AP_REJ' E_USER_AP_REJ.
END_METHOD.
4. update status in EBAN table activity step(here we ubdating status as X (or) XX(or) XXX(or)XXXX(or)XXXXX(or)XXXXXX(or)etc..
X means 1st level released
XX means 2nd level released
ETC………….
![screen13.png]()
![screen14.png]()
![screen15.png]()
![screen16.png]()
![screen17.png]()
UPDATE_EBAN method coding:
BEGIN_METHOD UPDATE_EBAN CHANGING CONTAINER.
DATA:
PR_NUMBER TYPE EBAN-BANFN,
i type char1.
SWC_GET_ELEMENT CONTAINER 'pr_number' PR_NUMBER.
CALL FUNCTION 'ZACINPSFM_UPDATE'
EXPORTING
im_prnumber = PR_NUMBER.
END_METHOD.
CALL FUNCTION 'ZACINPSFM_UPDATE'. This is the code used in this function module:
* ------>>>>>local varible declaration-->>.
DATA:
lv_frgzu TYPE eban-frgzu,
gi_eban TYPE TABLE OF eban,
gs_eban TYPE eban.
*-------->>>>>>>fetch current pr release status
if IM_PRNUMBER is NOT INITIAL.
SELECT SINGLE frgzu
FROM eban INTO lv_frgzu
WHERE banfn = im_prnumber.
*----->>>>>update eban with next level of release status.
CASE lv_frgzu.
when ''.
UPDATE eban SET FRGZU = 'X' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
when 'X'.
UPDATE eban SET FRGZU = 'XX' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
when 'XX'.
UPDATE eban SET FRGZU = 'XXX' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
when 'XXX'.
UPDATE eban SET FRGZU = 'XXXX' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
when 'XXXX'.
UPDATE eban SET FRGZU = 'XXXXX' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
when 'XXXXX'.
UPDATE eban SET FRGZU = 'XXXXXX' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
when 'XXXXXX'.
UPDATE eban SET FRGZU = 'XXXXXXX' WHERE BANFN = IM_PRNUMBER.
CLEAR LV_FRGZU.
ENDCASE.
CLEAR LV_FRGZU.
ENDIF.
ENDFUNCTION.
Workflow log:-
Pls check it.
PR Release 2nd level Automatically approved issue:
Loop1—1st level at workflow log :
Based on configuration is picking e_agent = 50000001(position in HR tables)
Which agent is maintained in HR tables for particular position(50000001) work item is going that Agent only.(first level is perfect)
![screen18.png]()
Loop2---3rd level:
Based on configuration(see SPRO screen shots below) here e_agent = 50000003(position in HR tables).
But in the below screen shot please observe e_agent = 50000004.
Which agent is maintained in HR tables for particular position(50000004) work item is going that Agent only.(third level is perfect)
![screen19.png]()
SPRO—configration
![screen20.png]()
![screen21.png]()
![screen22.png]()
![screen23.png]()
![screen25.png]()
![screen24.png]()