SWX_GET_MANAGER vs. RH_GET_ACTORS
Hi All,
Since someone deleted my inquiry yesterday, I am posting a new one now.
Basically my requirement is that I need to determine the manager of the wf_initiator so that they can be used as a recipient in the send mail step. The very kind Richard Bakker (sorry mate, wasn't able to award the points) mentioned that the strategy I am leaning towards is correct; i.e. inserting a step which will determine the manager before the actual send mail task.
Now, after further reading, I also came across the FM SWX_GET_MANAGER which basically does the same thing at a much simpler process. From a totally ABAP newbie, can you please enlighten us the differences (pros and cons) of using SWX_GET_MANAGER vs. RH_GET_ACTORS.
<<Text removed>>
Regards,
DeLo
Edited by: Matt on Jul 30, 2011 7:15 AM
Hi,
SWX_GET_MANAGER is standard FM which used to get the superior/manager of a org unit.
RH_GET_ACTORS is used to get the agents form a rule ( which is created through PFAC ). Suppose you have many custom rule to find the agents. Now if you need to use this rule to get agents within a Function Module then you can use RH_GET_ACTORS to get agents form the rule.
CALL FUNCTION 'RH_GET_ACTORS'
EXPORTING
act_object = 'AC90000137'
tables
ACTOR_CONTAINER = l_it_actor_container
actor_tab = l_it_actor_tab
EXCEPTIONS
NO_ACTIVE_PLVAR = 1
NO_ACTOR_FOUND = 2
EXCEPTION_OF_ROLE_RAISED = 3
NO_VALID_AGENT_DETERMINED = 4
NO_CONTAINER = 5
OTHERS = 6
Thanks and regards,
SNJY
Similar Messages
-
How to use SWX_GET_MANAGER
Hi Friends,
Can you please give an example of how to use FM 'SWX_GET_MANAGER'... i really appriciate if you give some examples..
John.Just a small code sample, but will solve your problem.
DATA : ls_ac_container type swcont,
lt_ac_container TYPE TABLE OF swcont,
lt_approver TYPE TABLE OF swhactor.
lv_creator TYPE swp_agent.
CONCATENATE 'US' <User Id> INTO lv_creator.
clear ls_ac_container.
MOVE : 'ORG_OBJECT' TO ls_ac_container-element ,
'000000' TO ls_ac_container-tab_index ,
'014' TO ls_ac_container-elemlength ,
'C' TO ls_ac_container-type ,
lv_creator TO ls_ac_container-value .
APPEND ls_ac_container to lt_ac_container.
REFRESH lt_approver.
CALL FUNCTION 'SWX_GET_MANAGER'
TABLES
actor_tab = lt_approver
ac_container = lt_ac_container
EXCEPTIONS
nobody_found = 1
OTHERS = 2.
Regards
Kathirvel -
Get Manager - SWX_GET_MANAGER
Hello
I'm using SWX_GET_MANAGER FM to determine the Manager in the workflow but I'm using this in another report too. I'm sending to FM the employee user but I need to send PERNR. Is this possible with this FM?
Thanks!Hi,
You can send
AC_CONTAINER-ELEMENT = 'OBJID'.
AC_CONTAINER-ELEMLENGTH = '012'.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-VALUE = PERNR-PERNR.
APPEND AC_CONTAINER.
CLEAR AC_CONTAINER.
AC_CONTAINER-ELEMENT = 'OTYPE'.
AC_CONTAINER-ELEMLENGTH = '002'.
AC_CONTAINER-TYPE = 'C'.
AC_CONTAINER-VALUE = 'P'.
APPEND AC_CONTAINER.
CLEAR AC_CONTAINER.
CALL FUNCTION 'SWX_GET_MANAGER'
TABLES
ACTOR_TAB = ACTOR_TAB
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NOBODY_FOUND = 1
OTHERS = 2.
you can also use Macro SWC_SET_ELEMENT to populate AC_CONTAINER.
Regards,
Ramu N. -
SWX_GET_MANAGER and Vacant position
Hi All,
I am working on a approval workflow for Budget Distribution Request. When a person requests for a budge, it has to go to the Manager and his superiors of that department who will either approve or reject it. (I have employee SAP USER ID).
I am using the Rule 00000168 but when the superior is on vacation or the position is vacant the FM attached to this rule will not fetch me the details there by stopping my approval process.
So how to proceed in this scenario.
Any inputs in this regard are welcome.
Thank you,
Lakshmi Narayana.SHi Lakshmi Narayana.S,
another option to use the function RH_ACT_LEADING_POSITION or SWX_GET_MANAGER as implemented in rule 157 or in 168.
But:
- in the previous node you call this function to evaluate the manager
- if there is no manager/result you can throw an exception which is implemented in your method - then in the workflow as a new outcome
- react to your exception as you wish in the outcome
Regards
Tibor -
SWX_GET_MANAGER - read of future data
Hello!
I´m looking for a solution to get the manager of an employee who moves from one unit to an other in the future. The problem is that swx_get_manager seems to works with sy-datum and not with flexible dates. So I can´t read the manager out of OM for the next month e.g..
How can I read the managers out of OM in the future?
Best reguards
MartinHi Martin,
This is achievable, SWX_GET_MANAGER internally calls another F.M RH_GET_LEADING_POSITION to read the leading position of the user based on sy-datum.
Make use of the above function to read based on future dates instead of system date and read the corresponding Person from HRP1001.
Thank you,
Krishna kishore T. -
Question in getting Superior agent using FM 'SWX_GET_MANAGER'
Hi Guy ,
I have problem in get the initiator's superior . can someone help me ,thanks in advance .
my scenairo is as follow :
when assigned the user to position ,I use the standard rule 168 (FM:swx_get_manager) , I can get the correct result .but when assigned the Business Partner to postion , it is show me no found data . I have already the user id to the business partner in bp's profile'BUP003 employee' , and also I can see the user located below the position in the OM .
whether I miss certain operation ? how can I get the correct superior ?
Jialiang.QiuHi,
Well,The output of SWX_GET_MANAGER can only be User or Position.
As per the assignment where the Business Partner is assigned to the Position, this FM gets the BP as an agent and in the final stage of this FM, this BP Agent entry gets deleted due to the following statement.
DELETE actor_tab WHERE otype <> 'P' AND
otype <> 'US'.
So, by this we can infer that you cannot determine the Person attached to that BP(that was attached to the Position) using 168 rule. You may have to create a custom Rule in these regards if you insist to go with Position-BP-Employee strategy.
Hope this clears your doubt.
Regards,
<i><b>Raja Sekhar</b></i> -
FM - SWX_GET_MANAGER
I am creating a report for Terminated & Suspended Employees. These are Action Types T1 & SE on Infotype P0000. The report must include the Manager's details. I am using the FM SWX_GET_MANAGER to get the Manager's User ID and it is successful for Suspended Employees (Action SE) (because they are still active) but not Terminated Employees (T1) because they are Withdrawn.
How can I get the Manager's User ID for Withdrawn employees?
Kind regards,
YolandeHi Mike,
Thanks! I tried using position as well, but the problem is that the client has maintained two org structures in the organisation management. Can we restrict the FM 'SWX_GET_MANAGER' to look into only one of them, we have the Org structure ID from the HR infotype 1000 table (HRP1000).
Please advice.
Regards,
Ashu Arora -
Using Function Module SWX_GET_MANAGER
Hello,
I want to use the function module SWX_GET_MANAGER. I want to know how should I pass parameters to this function module.hi please check the usage of the FM. we used it one FM.
FUNCTION Z00_MM_MGR_OR_USER_GET.
*"*"Local interface:
*" TABLES
*" ACTOR_TAB STRUCTURE SWHACTOR
*" AC_CONTAINER STRUCTURE SWCONT
*" EXCEPTIONS
*" NOBODY_FOUND
DATA: MATERIAL_TYPE LIKE MARA-MTART. " type of changed material
DATA: WF_INITIATOR LIKE SWHACTOR. " workflow initiator
DATA: COUNTER TYPE I.
REFRESH ACTOR_TAB. CLEAR ACTOR_TAB.
* get type of material under consideration
SWC_GET_ELEMENT AC_CONTAINER 'MaterialType' MATERIAL_TYPE.
SWC_GET_ELEMENT AC_CONTAINER 'WorkflowInitiator' WF_INITIATOR.
CASE MATERIAL_TYPE.
WHEN 'ROH'. " get manager of wf_initiator from role
SWC_SET_ELEMENT AC_CONTAINER 'ORG_OBJECT' WF_INITIATOR.
CALL FUNCTION 'SWX_GET_MANAGER'
TABLES
ACTOR_TAB = ACTOR_TAB
AC_CONTAINER = AC_CONTAINER
EXCEPTIONS
NOBODY_FOUND = 1.
IF SY-SUBRC NE 0.
RAISE NOBODY_FOUND.
ENDIF.
WHEN OTHERS.
ACTOR_TAB = WF_INITIATOR.
APPEND ACTOR_TAB.
ENDCASE.
* check if we have found any agents at all
DESCRIBE TABLE ACTOR_TAB LINES COUNTER.
IF COUNTER = 0.
RAISE NOBODY_FOUND.
ENDIF.
ENDFUNCTION. -
FM RH_GET_ACTORS
Hi,
I'm using the function RH_GET_ACTORS to get responsibles from a rule.
The container rule is defined by three parameters, and when i call the function it is doen't get me nothing however when I simulate the rule from the pfac yes is getting me values.
My code is this, could you help me thanks
Add parameters to get responsibles from the rule
MOVE: 'MTART' TO i_swcont-element,
'C' TO i_swcont-type,
v_MTART TO i_swcont-value.
APPEND i_swcont.
MOVE: 'WERKS' TO i_swcont-element,
'C' TO i_swcont-type,
space TO i_swcont-value.
APPEND i_swcont.
MOVE: 'MATKL' TO i_swcont-element,
'N' TO i_swcont-type,
v_MATKL TO i_swcont-value.
APPEND i_swcont.
Get Responsibles from rule 90000054
CALL FUNCTION 'RH_GET_ACTORS'
EXPORTING
act_object = 'AC90000054'
search_date = sy-datum
TABLES
actor_container = i_swcont
actor_tab = i_swhactor
EXCEPTIONS
no_active_plvar = 1
no_actor_found = 2
exception_of_role_raised = 3
no_valid_agent_determined = 4
no_container = 5
OTHERS = 6.i solved this
-
Example- SWX_GET_MANAGER
Hii,
please tell me how to pass parameters to swx_get_manager.
We can use PERNR also to find next level manager na?
I was passing like this, But im not getting any result.
DATA: LT_ACTOR_TAB type TABLE OF SWHACTOR,
LW_ACTOR_TAB TYPE SWHACTOR,
LT_AC_CONTAINER type TABLE OF SWCONT,
LW_AC_CONTAINER TYPE SWCONT.
LW_AC_CONTAINER-element = 'ORG_OBJECT'.
LW_AC_CONTAINER-ELEMLENGTH = '025'.
LW_AC_CONTAINER-type = 'C'.
concatenate 'P' WA_PA0001-pernr into LW_AC_CONTAINER-value separated by space.
APPEND LW_AC_CONTAINER TO LT_AC_CONTAINER.
CALL FUNCTION 'SWX_GET_MANAGER'
TABLES
ACTOR_TAB = LT_ACTOR_TAB
AC_CONTAINER = LT_AC_CONTAINER
EXCEPTIONS
NOBODY_FOUND = 1.
IF SY-SUBRC <> 0.Hi,
In case of this post is still up-to-date
I did it almost the same way, the only difference is that I concatenated 'P' and pernr in additional variable (lv_value) and than transfered this variable to appropriate field (lw_ac_containter-value). It works fine in our system.
Bellow is the example.
Best regards, Ana
DATA: LT_ACTOR_TAB type TABLE OF SWHACTOR,
LW_ACTOR_TAB TYPE SWHACTOR,
LT_AC_CONTAINER type TABLE OF SWCONT,
LW_AC_CONTAINER TYPE SWCONT,
lv_value type string.
clear: lv_value, LW_AC_CONTAINER, lw_actor_tab.
refresh: lt_actor_tab, Lt_AC_CONTAINER.
concatenate 'P' pernr into lv_value separated by space .
LW_AC_CONTAINER-element = 'ORG_OBJECT'.
LW_AC_CONTAINER-ELEMLENGTH = '025'.
LW_AC_CONTAINER-type = 'C'.
LW_AC_CONTAINER-value = lv_value.
APPEND LW_AC_CONTAINER TO LT_AC_CONTAINER.
CALL FUNCTION 'SWX_GET_MANAGER'
TABLES
actor_tab = lt_actor_tab
ac_container = lt_ac_container
EXCEPTIONS
NOBODY_FOUND = 1
OTHERS = 2
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF. -
Using Rule 168, SWX_GET_MANAGER and Chief Position
We have enabled standard SAP Travel Workflow WS20000040 - Approve Trip. We are not currently using OM relationships A002 (Reports Line to) or B002 (Is Line Supervisor of). We currently identify the Line Manager of the employee using the Chief Position designation A 012 and would like to use this for Trip approvals in lieu of building all of these additional relationships.
Rule 168 is bound to the workflow. According to the documentation associated with the rule, it seems that the rule should work with either the A002 or A012 relationship. However, we only seem to be getting a superior identified when relationship A002/B002 exists.
Are there additional configuration or parameter settings that we might need to consider to make the manager (agent) determined properly exclusively with the Chief Position assignment?
Thanks for any guidance you can provide.
Regards,
Edited by: Bruce Hull on Jul 24, 2008 5:37 PM
Edited by: Bruce Hull on Jul 24, 2008 5:37 PM
Edited by: Bruce Hull on Jul 24, 2008 7:29 PMWhat I found through trial and error is that rule 168 does indeed evaluate the A012 relationship by default with no change in the standard evaluation path. In our testing system, the "Chief" postion was not properly assigned. Once this was resolved, the workflow works properly.
As a side note, I also learned that you must have the parameter WFLOW VAPOS set for the rule to properly look up the organizational structure when a position (and chief) are vacant. -
Dear Experts,
In std rule 00000168 to find Superior of an employee FM SWX_GET_MANAGER is used. In that FM code for getting is given as below.
SWC_GET_ELEMENT AC_CONTAINER 'OTYPE' ORG_TYPE.
SWC_GET_ELEMENT AC_CONTAINER 'OBJID' ORG_ID.
When I simulate the rule in PFAC I get the output. From SE37 I populate AC_CONTAINER with values that I gave in PFAC as below.
ELEMENT - OTYPE VALUE - US
ELEMENT - OBJID VALUE - ABAPER
But I see that these values are not set for ORG_TYPE AND ORG_ID. Can you please tell me how to pass values correctly to this FM. I have employee OTYPE & OBJID as input. I need to find the Superior of this employee.
KR,
BharathDear All,
Thanks a lot for all your inputs.
I have solved the problem. FM RH_GET_ACTORS is used to call any rule. Find the code of my solution below.
FUNCTION ZGETMGR.
*"*"Local Interface:
*" TABLES
*" ACTOR_TAB STRUCTURE SWHACTOR
INCLUDE <cntn01>.
DATA: lt_agents type standard table of swhactor.
swc_container lt_container.
swc_set_element lt_container 'OTYPE' 'US'.
swc_set_element lt_container 'OBJID' 'ABAPER'.
CALL FUNCTION 'RH_GET_ACTORS'
EXPORTING
ACT_OBJECT = 'AC00000168'
TABLES
ACTOR_CONTAINER = lt_container
ACTOR_TAB = lt_agents
EXCEPTIONS
NO_ACTIVE_PLVAR = 01
NO_ACTOR_FOUND = 02
EXCEPTION_OF_ROLE_RAISED = 03
NO_VALID_AGENT_DETERMINED = 04
NO_CONTAINER = 05
OTHERS = 06.
actor_tab[] = lt_agents[].
ENDFUNCTION.
In above FM ACTOR_CONTAINER is the input where we give the employee for whom we want to find the supervisor and
ACTOR_TAB is the output which contains the OTYPE & OBJID of Supervisor. ACT_OBJECT is the name of the rule.
KR,
Bharath -
Hi all,
I'm having problems in defining an Organizational structure with 3 levels to release PRs. Plant manager(PM) level, below this, Manager(M) and then Requisitioner(R).
Saying that PM is the boss of M, PM must be Head of an Org. unit and M must be Head of another Org. unit below PM's Org. unit. Then R belongs to M Org. unit and consequently, M is his boss.
In PR release strategy (SPRO), I say that the 1st level of release is position M. and the 2nd is position PM.
So far, so good, but if I want the 3rd level of release (M1, between M and R), in the release strategy, it shouldn't be a fixed position because it will goes always to M instead of M1 (when M1 is the direct boss of R).
Is there any way of saying that M and M1 are Managers to release and use this in release strategy, and then find the direct boss of R with a rule or something?
I know it sounds confusing, but it's hard to expose hierarchies...
ThanksHi Nuno,
Actually its not hard at all! The Release Codes: Purchase Requisition table has an option to call a user-exit to find the person represented by the group/code - just set this to 9 to use user-exit M06B0001.
This is an old-style user-exit - i.e. you use transactions SMOD/CMOD to find the enhancement and fill in the user exit.
In the user-exit you could then call function module RH_GET_ACTORS to call a workflow rule such as rule 168 to find the manager, or call RH_GET_STRUCTURE to read up the appropriate evaluation path e.g. A002, or SWX_GET_MANAGER directly to find the manager.
Regards,
Jocelyn -
Rule with SELFITEM-SENDTASKDESCRITION task's workitem goes error
Dear all,
I have created a workflow with an activity step that uses business object SELFITEM and method SENDTASKDESCRIPTION with rule AC00000168.
On executing the WF, the workitem successfully goes to right agent.
But, when the agent executes the workitem, it goes to error state.
In the workflow log, I get the error message as "Exception occurred Error handling for work item 000000968991 eeom division 09.07.2010 - 11:28:52 " with exception 0,error type 1 and message 0.
Following is binding details between workflow and task container.
&MANAGER& -> &ADDRESSSTRINGS&
&_ATTACH_OBJECTS& -> &ATTACHMENTS&
&ATTENDANCEINSTANCE& -> &ATTENDANCE&
&EXPRESS& -> &EXPRESS&
&LANGUAGE& -> &LANGUAGE&
&LINEWIDTH& -> &LINEWIDTH&
&TYPEID& -> &TYPEID&
&SELFITEM& -> &_WI_OBJECT_ID&
In the above binding parameter,MANAGER. is a workflow container of ABAP data dictionary type WFSYST-AGENT where the rule's agent is collected.
Please suggest why the work item at agent inbox on execution goes error for which I will be grateful.
Thanks and regards,
S.SureshHello Rick !
Thank you so much for your fruitful solution.
Also, I am deeply sorry for delayed reply.
I used the function module 'SWX_GET_MANAGER' in the custom method as you suggested.
BEGIN_METHOD FINDMANAGER CHANGING CONTAINER.
DATA:
EXTENDEDOBJECTID TYPE OBJEC-REALO,
addresstype like soxna-type,
RECIPIENTADDRESS TYPE SOXNA-FULLNAME.
DATA:
ac_container like swcont occurs 0 with
addressstrings like soxna-fullname occu
SWC_GET_ELEMENT CONTAINER 'ExtendedObjectID
addresstype = 'G'.
ac_container-element = 'OBJID'.
ac_container-tab_index = '000001'.
ac_container-elemlength = '008'.
ac_container-type = 'N'.
ac_container-value = EXTENDEDOBJECTID.
append ac_container.
ac_container-element = 'OTYPE'.
ac_container-tab_index = '000001'.
ac_container-elemlength = '002'.
ac_container-type = 'C'.
ac_container-value = 'P '.
append ac_container.
CALL FUNCTION 'SWX_GET_MANAGER'
TABLES
ACTOR_TAB = addressstrings
AC_CONTAINER = ac_container
EXCEPTIONS
NOBODY_FOUND = 01
OTHERS = 02.
CASE SY-SUBRC.
WHEN 0. " OK
WHEN 01. " to be implemented
WHEN OTHERS. " to be implemented
ENDCASE.
loop at addressstrings.
if addressstrings(2) = 'P '.
delete addressstrings.
endif.
endloop.
move addressstrings to recipientaddress.
SWC_SET_ELEMENT CONTAINER 'RecipientAddress' RECIPIENTADDRESS.
END_METHOD.
Therafter, the values accumulated at RECIPIENTADDRESS is passed to the workflow container(SOXNA-FULLNAME) of SENDMAIL step.
Also, I thank every one who contributed fruitful suggestions to solve my problem.
Thanks and regards,
S.Suresh -
WS14500015 is not working for Multilevel approval
We are trying to Implement the Workflow Template Ws14500015. We have implemented the BADI BBP_WFL_APPROVE_BADI. The workflow works perfectly for 1st level approval. We have checked that the ApproverList Container element gets pouplated with 3 levels of approval when 1 st level approver has not approved it. But as soon as the first level approver approves it this container element is updated with one entry. Please review the code I am attaching. Any help will be highly appreciated.
METHOD if_ex_bbp_wfl_approv_badi~get_remaing_approvers .
Interface parameters:
OBJECT_ID TYPE CRMT_OBJECT_ID "Import
OBJECT_TYPE TYPE CRMT_SUBOBJECT_CATEGORY "Import
GUID TYPE BBP_GUID_32 "Import
ACTUAL_APPROVAL_INDEX TYPE SWH_NUMC10 "Import
APPROVAL_HISTORY_TABLE TYPE BBP_WFL_APPROVAL_HISTORY_BADI "Import
ITEM_APPROVAL_HISTORY_TABLE TYPE BBPT_WFL_ITEM_APPROVAL_BADI "Import
APPROVAL_TABLE TYPE BBPT_WFL_APPROVAL_TABLE_BADI "Export
ITEM_APPROVAL_TABLE TYPE BBPT_WFL_ITEM_APPROVAL_BADI "Export
NO_FURTHER_APPROVAL_NEEDED TYPE BOOLEAN "Export
ITEM_APPROVAL_OBJ TYPE BBPT_WFL_ITEM_APPROVAL_OBJ "Changing
This a default implementation that gives idea about of how line item
approval should work as well to find the number of approval required
and to find the approvers.
Global data---------------------------------------------------------*
TYPES---------------------------------------------------------------*
TYPES : ty_item_info TYPE STANDARD TABLE OF /fir/rmm0bgst001.
"to have the necessary values of custom table .
DATA----------------------------------------------------------------*
DATA : it_item_info TYPE ty_item_info,"to store the approval values.
wa_item_info TYPE /fir/rmm0bgst001. " work area for item_info.
DATA : v_value_per_cctr TYPE bbp_value, " contain value per account
" type in line item of SC
v_value_per TYPE bbp_value. " value for v_value_per_cctr
" in USD
DATA : v_apprv_value TYPE bbp_value. " amount of first level.
DATA: v_call_value1 TYPE bbp_wfl_app_property,"have cost_ctr,
"asset_no or order_no value.
v_co_code TYPE bbp_wfl_app_property," have company code
v_plant_value TYPE bbp_wfl_app_property," have plant value
v_account_type TYPE bbp_wfl_app_criterion ," Account type
" ie COST_CTR, ASSET_NO or ORDER_NO.
v_comp_code TYPE bbp_wfl_app_criterion ,"COMP_CODE
v_plant TYPE bbp_wfl_app_criterion ," PLANT
v_acc_desc TYPE bbp_step_description ." approval desc.
WORKAREA------------------------------------------------------------*
DATA: wa_header TYPE bbp_pds_sc_header_d, " header of line
" item
tables and work area.
it_item TYPE TABLE OF bbp_pds_sc_item_d,
" line item details
wa_item TYPE bbp_pds_sc_item_d,
" have one line item detail.
accounting structures
it_account TYPE TABLE OF bbp_pds_acc,
" account details
wa_account TYPE bbp_pds_acc .
" one account details.
DATA: v_req TYPE bbp_wfl_app_criterion. " for creator.
CONSTANTS-----------------------------------------------------------*
Business objects
CONSTANTS:
c_po TYPE crmt_subobject_category_db VALUE 'BUS2201',
c_shop TYPE crmt_subobject_category_db VALUE 'BUS2121',
c_contract TYPE crmt_subobject_category_db VALUE 'BUS2000113'.
Approval Criteria and properties used
CONSTANTS:
c_cost_centre TYPE bbp_wfl_app_criterion VALUE 'COST_CTR',
c_order_no TYPE bbp_wfl_app_criterion VALUE 'ORDER_NO',
c_asset_no TYPE bbp_wfl_app_criterion VALUE 'ASSET_NO',
c_comp_code TYPE bbp_wfl_app_criterion VALUE 'COMP_CODE',
c_plant TYPE bbp_wfl_app_criterion VALUE 'PLANT',
c_cc_desc TYPE bbp_step_description VALUE
'Cost center approval',
c_io_desc TYPE bbp_step_description VALUE
'Order type approval',
c_as_desc TYPE bbp_step_description VALUE
'Asset Num approval',
c_usd TYPE char3 VALUE 'USD',
c_m TYPE char1 VALUE 'M',
c_x TYPE char1 VALUE 'X',
c_apprv_times TYPE char1 VALUE 3,
c_1 TYPE char2 VALUE '1',
c_as TYPE BBP_ACC_CAT VALUE 'AS',
c_or TYPE BBP_ACC_CAT VALUE 'OR',
c_cc TYPE BBP_ACC_CAT VALUE 'CC',
c_us TYPE char2 VALUE 'US'.
Case when the object type bus212...---------------------------------*
CASE object_type.
WHEN c_shop.
----------- shopping cart --------------------------------------- *
IF NOT approval_table[] IS INITIAL.
approval_history_table[] = approval_table[].
item_approval_history_table[] = item_approval_table[].
REFRESH : approval_table, item_approval_table,
item_approval_obj .
ENDIF.
REFRESH : it_item,it_account.
Get the details of the shopping cart
CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
EXPORTING
i_object_id = object_id
IMPORTING
e_header = wa_header
TABLES
e_item = it_item
e_account = it_account.
Proceed if it_item is not initial.
IF NOT it_item IS INITIAL AND NOT it_account IS INITIAL.
*read the lt_item for plant
READ TABLE it_item INTO wa_item INDEX 1.
CHANGE FOR REQEUSTOR.
CONCATENATE c_us wa_item-created_by INTO v_req.
now read the table with wa_item-be_plant.
SELECT *
FROM /fir/rmm0bgst001
INTO TABLE it_item_info
WHERE zplant = wa_item-be_plant.
SORT it_item BY guid .
SORT it_account BY p_guid .
IF actual_approval_index LE c_apprv_times AND
actual_approval_index GE c_1.
looping at it_item is done to fetch the approver for every
line item
CLEAR: wa_item, wa_account.
LOOP AT it_item INTO wa_item WHERE del_ind IS INITIAL.
LOOP AT it_account INTO wa_account
WHERE p_guid = wa_item-guid.
to calculate the amount before calling the funciton module for
approval table.value respective to account type
v_value_per_cctr =
wa_account-distr_perc * wa_item-value / 100.
read the table respective to account type and for level 1 approval
such that if the value is less than zvalue then no approval required.
CLEAR: wa_item_info.
CASE wa_account-acc_cat .
WHEN c_or.
READ TABLE it_item_info INTO wa_item_info
WITH KEY zlevel = c_1 " 1
zorder_no = wa_account-order_no
zplant = wa_item-be_plant.
WHEN c_as.
READ TABLE it_item_info INTO wa_item_info
WITH KEY zlevel = c_1 " 1
zasset_no = wa_account-asset_no
zplant = wa_item-be_plant.
WHEN c_cc.
READ TABLE it_item_info INTO wa_item_info
WITH KEY zlevel = c_1 " 1
zcost_ctr = wa_account-cost_ctr
zplant = wa_item-be_plant.
ENDCASE.
IF sy-subrc = 0.
v_apprv_value = wa_item_info-zvalue.
ENDIF.
now convert the amount to local currency ie usd
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
CLIENT = SY-MANDT
date = sy-datum
foreign_amount = v_value_per_cctr
foreign_currency = wa_item-currency
local_currency = c_usd
type_of_rate = c_m
read_tcurr = c_x
IMPORTING
local_amount = v_value_per
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
no_spread_found = 4
derived_2_times = 5
OTHERS = 6
IF v_value_per GE v_apprv_value AND sy-subrc = 0.
To Find out Account id of what type ie cost center/IO/Asset.
IF wa_account-acc_cat eq c_cc.
v_call_value1 = wa_account-cost_ctr.
v_account_type = c_cost_centre.
v_acc_desc = c_cc_desc. "'Cost center approval'.
ELSEIF wa_account-acc_cat eq c_or.
v_call_value1 = wa_account-order_no.
v_account_type = c_order_no.
v_acc_desc = c_io_desc. "'Internal Order approval'.
ELSE.
IF NOT wa_account-asset_no IS INITIAL.
v_call_value1 = wa_account-asset_no.
v_account_type = c_asset_no..
v_acc_desc = c_as_desc. "'Asset Number approval'.
ENDIF.
ENDIF.
Defining the PLANT and plant value.
v_plant = c_plant.
v_plant_value = wa_item-be_plant.
defining the COMPNAY CODE and company value.
v_comp_code = c_comp_code.
v_co_code = wa_item-be_co_code.
Calling the Custom function to find the approvers.
CALL FUNCTION '/FIR/RP2P0BGS_ITEM_APPRV_GET'
EXPORTING
sc_guid = wa_header-guid
item_guid = wa_item-guid
approval_description = v_acc_desc
hide_items_not_responsible = c_x "'X'
each cost center approver should see only items he is responsible
criterion1 = v_account_type
criterion2 = v_comp_code
criterion3 = v_plant
value1 = v_call_value1
value2 = v_co_code
value3 = v_plant_value
approval_index = actual_approval_index
TABLES
it_item_info = it_item_info
CHANGING
approval_table = approval_table
item_approval_table = item_approval_table
item_approval_obj = item_approval_obj.
ENDIF." end if if value per cost center is more than
" level one price.
CLEAR wa_account.
ENDLOOP. " end of loop of account.
CLEAR: wa_account,wa_item, wa_item_info.
ENDLOOP. " end of loop at item
CHANGE FOR REQUESTOR.----
DELETE approval_table WHERE approval_agent = v_req.
IF approval_table IS INITIAL.
no_further_approval_needed = c_x. " 'X'.
ENDIF.
ELSE. " end of if actual_approval_index le 3.
this BADI-implementation defines 3 steps
no_further_approval_needed = c_x. "'X'.
ENDIF.
ENDIF. " end of if the it_item is not initial.
ENDCASE. "end of case if bus type is 2121
ENDMETHOD.
Function Module
FUNCTION /fir/rp2p0bgs_item_apprv_get .
""Local Interface:
*" IMPORTING
*" REFERENCE(SC_GUID) TYPE BBP_GUID OPTIONAL
*" REFERENCE(ITEM_GUID) TYPE BBP_GUID OPTIONAL
*" REFERENCE(APPROVAL_DESCRIPTION) TYPE BBP_STEP_DESCRIPTION
*" OPTIONAL
*" REFERENCE(HIDE_ITEMS_NOT_RESPONSIBLE) TYPE BOOLEAN OPTIONAL
*" REFERENCE(CRITERION1) TYPE BBP_WFL_APP_CRITERION OPTIONAL
*" REFERENCE(CRITERION2) TYPE BBP_WFL_APP_CRITERION DEFAULT ''
*" REFERENCE(CRITERION3) TYPE BBP_WFL_APP_CRITERION DEFAULT ''
*" REFERENCE(VALUE1) TYPE BBP_WFL_APP_PROPERTY DEFAULT ''
*" REFERENCE(VALUE2) TYPE BBP_WFL_APP_PROPERTY DEFAULT ''
*" REFERENCE(VALUE3) TYPE BBP_WFL_APP_PROPERTY DEFAULT ''
*" REFERENCE(APPROVAL_INDEX) TYPE SWH_NUMC10 OPTIONAL
*" TABLES
*" IT_ITEM_INFO STRUCTURE /FIR/RMM0BGST001
*" CHANGING
*" REFERENCE(APPROVAL_TABLE) TYPE BBPT_WFL_APPROVAL_TABLE_BADI
*" REFERENCE(ITEM_APPROVAL_TABLE) TYPE BBPT_WFL_ITEM_APPROVAL_BADI
*" REFERENCE(ITEM_APPROVAL_OBJ) TYPE BBPT_WFL_ITEM_APPROVAL_OBJ
*" OPTIONAL
Local data-----------------------------------------------------------*
TYPES: ty_option TYPE STANDARD TABLE OF rfc_db_opt,
ty_fields TYPE STANDARD TABLE OF rfc_db_fld,
ty_data TYPE STANDARD TABLE OF tab512.
DATA:
wa_approval_table TYPE bbp_wfl_approval_table_badi,
wa_item_approval_table TYPE bbps_wfl_item_approval,
wa_approval_def TYPE /fir/rmm0bgst001.
DATA:
v_app_obj_guid TYPE bbp_guid_32,
v_is_new_approval_object TYPE boolean.
DATA : it_update_tab TYPE STANDARD TABLE OF /fir/rmm0bgst001,
it_approval_def TYPE STANDARD TABLE OF /fir/rmm0bgst001,
wa_update_tab TYPE /fir/rmm0bgst001.
DATA : it_actor_tab TYPE STANDARD TABLE OF swhactor,
wa_actor_tab TYPE swhactor,
it_ac_container TYPE STANDARD TABLE OF swcont,
wa_ac_container TYPE swcont.
DATA : it_options TYPE ty_option,
it_fields TYPE ty_fields,
it_data TYPE ty_data.
DATA : wa_options TYPE rfc_db_opt,
wa_fields TYPE rfc_db_fld,
wa_data TYPE tab512.
DATA : v_apprv_io TYPE aufuser2,
v_apprv_cc TYPE verak.
DATA : v_cost_ctr TYPE bbp_wfl_app_property ,
v_order_no TYPE bbp_wfl_app_property ,
v_asset_no TYPE bbp_wfl_app_property ,
v_as_value TYPE bbp_wfl_app_property .
DATA : v_query_table TYPE dd02l-tabname.
DATA : v_apprv_count TYPE char1 VALUE '0'.
to find the number of lines in the table it_update_tab.
DATA : v_lines TYPE i.
DATA : v_app_ind TYPE swh_numc10 VALUE '0'.
DATA : v_destination TYPE char10,
v_system TYPE sysysid,
v_mandt TYPE symandt.
Constants-----------------------------------------------------------*
CONSTANTS:
c_clnt TYPE char4 VALUE 'CLNT',
c_agent_is_user TYPE otype VALUE 'US',
c_x TYPE char1 VALUE 'X',
c_cost_centre TYPE bbp_wfl_app_criterion VALUE 'COST_CTR',
c_order_no TYPE bbp_wfl_app_criterion VALUE 'ORDER_NO',
c_asset_no TYPE bbp_wfl_app_criterion VALUE 'ASSET_NO',
c_csks TYPE char4 VALUE 'CSKS',
c_anlz TYPE char4 VALUE 'ANLZ',
c_coas TYPE char4 VALUE 'COAS',
c_verak TYPE char5 VALUE 'VERAK',
c_user2 TYPE char5 VALUE 'USER2',
c_kostl TYPE char5 VALUE 'KOSTL',
c_aufnr TYPE char5 VALUE 'AUFNR',
c_bukrs TYPE char5 VALUE 'BUKRS',
c_anln1 TYPE char5 VALUE 'ANLN1',
c_c TYPE char1 VALUE 'C',
c_and TYPE char3 VALUE 'AND',
c_eq TYPE char1 VALUE '=',
c_org_object TYPE swc_elem VALUE 'ORG_OBJECT',
c_deli TYPE char1 VALUE '|',
c_l12 TYPE ddleng VALUE '000012',
c_off0 TYPE doffset VALUE '000000',
c_l10 TYPE ddleng VALUE '000010',
c_l20 TYPE ddleng VALUE '000020',
c_l04 TYPE ddleng VALUE '000004',
c_ind01 TYPE swc_index VALUE '000001',
c_el06 TYPE swc_length VALUE '006',
c_tab_name TYPE tabname VALUE '/fir/rmm0bgst001',
c_r10 TYPE sysysid VALUE 'R10',
c_r15 TYPE sysysid VALUE 'R15',
c_r20 TYPE sysysid VALUE 'R20',
c_r40 TYPE sysysid VALUE 'R40',
c_e10 TYPE sysysid VALUE 'E10',
c_e15 TYPE sysysid VALUE 'E15',
c_e20 TYPE sysysid VALUE 'E20',
c_e40 TYPE sysysid VALUE 'E40',
c_121 TYPE symandt VALUE '121',
c_300 TYPE symandt VALUE '300',
c_100 TYPE symandt VALUE '100',
c_120 TYPE symandt VALUE '120',
begin of change for generic entry 06-06-2007----
c_cc TYPE kostl VALUE 'CC',
c_as TYPE anln1 VALUE 'AS',
c_or TYPE aufnr VALUE 'OR'.
end of change for generic entry 06-06-2007----
-perpare the system and client for RFC----
CASE sy-sysid .
WHEN c_r10. "' R10'.
IF sy-mandt = c_120. " '120'.
CONCATENATE c_e10 c_clnt c_121 INTO v_destination.
ENDIF.
WHEN c_r15. " 'R15'.
IF sy-mandt = c_120. " '120'.
CONCATENATE c_e15 c_clnt c_300 INTO v_destination.
ENDIF.
WHEN c_r20. " 'R20'.
IF sy-mandt = c_300. " '300'.
CONCATENATE c_e20 c_clnt c_300 INTO v_destination.
ENDIF.
WHEN c_r40. " 'R40'.
IF sy-mandt = c_100. " '100'.
CONCATENATE c_e40 c_clnt c_100 INTO v_destination.
ENDIF.
ENDCASE.
Comment on logic ---------------------------------------------------*
First find the right approval object the item belongs to.
All items of an approval object are approved together in
this approval step, and therefore only one workitem is
created for this items.
CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET'
EXPORTING
sc_guid = sc_guid
criterion1 = criterion1
value1 = value1
IMPORTING
If 2 items of the same shopping cart have the same
values for the criterias, this function returns the
same (!!!) approval object guid
approval_obj_guid = v_app_obj_guid
TABLES
item_app_obj = item_approval_obj
Check what type of account is ie Order no/Internal order/ASSET.
if the account type is asset_no then responsible cost center is
found.
CLEAR: it_update_tab, wa_update_tab.
CASE criterion1 .
WHEN c_asset_no. " 'ASSET_NO'.
v_asset_no = value1.
CONCATENATE c_anln1 c_eq value1 " 'ANLN1' '=' value1
c_and c_bukrs c_eq value2 INTO wa_options-text
SEPARATED BY space.
APPEND wa_options TO it_options.
wa_fields-fieldname = c_anln1. " 'ANLN1'.
wa_fields-length = c_l12. " '000012'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
wa_fields-fieldname = c_kostl. " 'KOSTL'.
wa_fields-length = c_l10. " '000010'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
wa_fields-fieldname = c_bukrs. " 'BUKRS'.
wa_fields-length = c_l04. " '000004'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
CALL FUNCTION 'RFC_READ_TABLE' DESTINATION v_destination
EXPORTING
query_table = c_anlz " 'ANLZ'
delimiter = c_deli " '|'
TABLES
OPTIONS = it_options
fields = it_fields
data = it_data
EXCEPTIONS
table_not_available = 1
table_without_data = 2
option_not_valid = 3
field_not_valid = 4
not_authorized = 5
data_buffer_exceeded = 6
OTHERS = 7.
IF sy-subrc = 0.
as it_data table contains only one record
so no sorting required.
READ TABLE it_data INTO wa_data INDEX 1.
v_as_value = wa_data-wa+13(10).
ENDIF.
at the end of this if asset is passed its responsible
cost is obtained and is placed in value1 field.
CLEAR : wa_data , wa_options , wa_fields .
REFRESH: it_data , it_options , it_fields .
v_cost_ctr = v_as_value.
CONCATENATE c_kostl c_eq v_cost_ctr INTO wa_options-text
SEPARATED BY space.
APPEND wa_options TO it_options.
CLEAR: wa_fields.
wa_fields-fieldname = c_verak. " 'VERAK'.
wa_fields-length = c_l20. " '000020'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
CLEAR: wa_fields.
wa_fields-fieldname = c_kostl. " 'KOSTL'.
wa_fields-length = c_l10. " '000010'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
v_query_table = c_csks. " 'CSKS'.
set the initial value of v_asset_no by value1.
CLEAR: v_cost_ctr .
v_asset_no = value1.
WHEN c_cost_centre . " 'COST_CTR' or 'ASSET_NO'.
v_cost_ctr = value1.
CONCATENATE c_kostl c_eq v_cost_ctr INTO wa_options-text
SEPARATED BY space.
APPEND wa_options TO it_options.
CLEAR: wa_fields.
wa_fields-fieldname = c_verak. " 'VERAK'.
wa_fields-length = c_l20. " '000020'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
CLEAR: wa_fields.
wa_fields-fieldname = c_kostl. " 'KOSTL'.
wa_fields-length = c_l10. " '000010'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
v_query_table = c_csks. " 'CSKS'.
WHEN c_order_no. " 'ORDER_NO'.
v_order_no = value1.
CONCATENATE c_aufnr c_eq value1 INTO wa_options-text
SEPARATED BY space.
APPEND wa_options TO it_options.
CLEAR: wa_fields.
wa_fields-fieldname = c_user2. " 'USER2'.
wa_fields-length = c_l20. " '000020'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
CLEAR: wa_fields.
wa_fields-fieldname = c_aufnr. " 'AUFNR'.
wa_fields-length = c_l12. " '000012'.
wa_fields-offset = c_off0. " '000000'.
wa_fields-type = c_c. " 'C'.
APPEND wa_fields TO it_fields.
v_query_table = c_coas. " 'COAS'.
ENDCASE.
LOOP AT it_item_info INTO wa_update_tab
WHERE
zplant = value3 AND
zcost_ctr = v_cost_ctr AND
zorder_no = v_order_no AND
zasset_no = v_asset_no.
APPEND wa_update_tab TO it_update_tab .
ENDLOOP.
-begin of change for generic entry 06-06-2007----
it_update_tab may or may not contain the value as the per the data
maintainted. if initial then only generic value is maintained and the
the record need to be appended.
so the record which need to be appended shud be appended to
it_update_tab appropiatly with the amt of generic entry.
CLEAR : wa_update_tab.
CASE criterion1 .
WHEN c_asset_no.
READ TABLE it_item_info INTO wa_update_tab WITH KEY
zplant = value3
zasset_no = c_as."'AS'
IF sy-subrc = 0.
wa_update_tab-zasset_no = v_asset_no .
wa_update_tab-zlevel = 1.
APPEND wa_update_tab TO it_update_tab.
ENDIF.
WHEN c_cost_centre.
READ TABLE it_item_info INTO wa_update_tab WITH KEY
zplant = value3
zcost_ctr = c_cc."'CC'
IF sy-subrc = 0.
wa_update_tab-zcost_ctr = v_cost_ctr .
wa_update_tab-zlevel = 1.
APPEND wa_update_tab TO it_update_tab.
ENDIF.
WHEN c_order_no.
READ TABLE it_item_info INTO wa_update_tab WITH KEY
zplant = value3
zorder_no = c_or."'OR'
IF sy-subrc = 0.
wa_update_tab-zorder_no = v_order_no .
wa_update_tab-zlevel = 1.
APPEND wa_update_tab TO it_update_tab.
ENDIF.
ENDCASE.
end of change for generic entry 06-06-2007----
RFC to read table for finding the person responsible for the
cost center / order ie approver.
CALL FUNCTION 'RFC_READ_TABLE' DESTINATION v_destination
EXPORTING
query_table = v_query_table
delimiter = c_deli "'|'
TABLES
OPTIONS = it_options
fields = it_fields
data = it_data
EXCEPTIONS
table_not_available = 1
table_without_data = 2
option_not_valid = 3
field_not_valid = 4
not_authorized = 5
data_buffer_exceeded = 6
OTHERS = 7.
IF sy-subrc = 0.
CLEAR :wa_approval_def.
READ TABLE it_data INTO wa_data INDEX 1.
IF v_query_table = c_csks. " 'CSKS'.
v_apprv_cc = wa_data-wa+0(20).
wa_approval_def-zapprover = v_apprv_cc.
ELSE.
v_apprv_io = wa_data-wa+0(20).
wa_approval_def-zapprover = v_apprv_io.
ENDIF.
ENDIF.
find the number of record in the update table.
DESCRIBE TABLE it_update_tab LINES v_lines.
The updation of table runs only for the number of records
avaiable in the update table ie v_lines.
DO v_lines TIMES. " begin of do to approval index times.
CLEAR: it_approval_def.
v_apprv_count = v_apprv_count + 1.
wa_approval_def-zlevel = v_apprv_count .
if the count is more than one then next level of approver
is found using the rfc call swx_get_manager and stored as per.
IF v_apprv_count > 1.
v_apprv_count = v_apprv_count - 1.
READ TABLE it_update_tab INTO wa_update_tab
WITH KEY zlevel = v_apprv_count .
IF sy-subrc = 0 .
NOW FOR FINDING THE SECOND LEVEL OF APPROVER
1ST LEVEL OF APPROVER IS FOUND USING ABOVE READ.
THE FIRST LEVEL OF APPROVER IS USED TO FIND THE SECOND
LEVEL OF APPROVER USING THE SWX_GET_MANAGER.
PREPARE THE TABLES FOR SWX_GET_MANAGER
REFRESH : it_ac_container.
wa_ac_container-element = c_org_object. " 'ORG_OBJECT'.
wa_ac_container-tab_index = c_ind01. " '000001'.
wa_ac_container-elemlength = c_el06. " '006'.
wa_ac_container-type = c_c. " 'C'.
CONCATENATE c_agent_is_user wa_update_tab-zapprover
INTO wa_ac_container-value .
APPEND wa_ac_container TO it_ac_container.
CALL FUNCTION 'SWX_GET_MANAGER' DESTINATION v_destination
TABLES
actor_tab = it_actor_tab
ac_container = it_ac_container
EXCEPTIONS
nobody_found = 1
OTHERS = 2.
IF sy-subrc = 0.
READ TABLE it_actor_tab INTO wa_actor_tab WITH KEY
otype = c_agent_is_user.
wa_approval_def-zapprover = wa_actor_tab-objid.
ENDIF.
ENDIF.
v_apprv_count = v_apprv_count + 1.
ENDIF.
before updating populate the table it_approval_def
it_update_tab is read based on next v_apprv_count and
updates the approver and its value.
READ TABLE it_update_tab INTO wa_update_tab
WITH KEY zlevel = v_apprv_count .
IF sy-subrc = 0.
wa_approval_def-zplant = wa_update_tab-zplant.
wa_approval_def-zcost_ctr = wa_update_tab-zcost_ctr.
wa_approval_def-zorder_no = wa_update_tab-zorder_no.
wa_approval_def-zasset_no = wa_update_tab-zasset_no.
wa_approval_def-zvalue = wa_update_tab-zvalue.
APPEND wa_approval_def TO it_approval_def.
modify the table it_update_tab so that along with the custom
database table the table in use in this function module ie
it_update_tab also remain updated.
benefit is that if the modify to dtab fails. the process works fine.
MODIFY it_update_tab FROM wa_approval_def
TRANSPORTING zapprover
WHERE zlevel = wa_approval_def-zlevel AND
zvalue = wa_approval_def-zvalue.
now enqueue the table for modification.
CALL FUNCTION 'ENQUEUE_E_TABLE'
EXPORTING
tabname = c_tab_name " '/fir/rmm0bgst001'
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
now modify the table, for updation of approver.
IF sy-subrc = 0.
MODIFY /fir/rmm0bgst001 FROM wa_approval_def.
if sy-subrc goes 0 commit work is called.
also the it_update_tab need to be updated.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
ENDIF.
now dequeue the table after the updation.
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
tabname = c_tab_name. " '/fir/rmm0bgst001'.
ENDIF.
once all done clear the work areas.
CLEAR : wa_approval_def-zlevel , wa_approval_def-zapprover.
ENDDO. " END OF DO STATEMENT.
SORT it_approval_def BY zlevel ASCENDING.
as per the logic for the different level of approval.
for second level of approval only records above 2 should be
present in the apprval table.
so for approval index = 2 delete the first record ie for zlevel = 1.
and for approval index = 3 delete first two records ie zlevel = 1 and
zlevel = 2. thus only one approval of zlevel 3 is left in the table
which is used to update the approval table.
IF approval_index = 2 .
DELETE it_approval_def INDEX 1.
ELSEIF approval_index = 3.
DELETE it_approval_def INDEX 1.
DELETE it_approval_def INDEX 1.
ELSEIF approval_index GT 3.
REFRESH : it_approval_def .
ENDIF.
for above 3 as approval index there shud be no enteries in the table.
so the table is refreshed and thus the approval table will not
contain anything.
approval_index is assigned to a varaiable
v_app_ind = approval_index.
v_app_ind is incremented for every next record so that approver is
assigned to next approval index.
beign of change 28th may 2007----
clear : v_app_ind .
v_app_ind = v_app_ind + 1.
LOOP AT it_approval_def INTO wa_approval_def.
wa_approval_table-approval_index = v_app_ind.
CONCATENATE c_agent_is_user wa_approval_def-zapprover
INTO wa_approval_table-approval_agent.
wa_approval_table-approval_description = approval_description.
wa_approval_table-approval_object_guid = v_app_obj_guid.
wa_approval_table-hide_items_not_responsible =
hide_items_not_responsible.
APPEND wa_approval_table TO approval_table.
v_app_ind = v_app_ind + 1 .
CLEAR: wa_approval_def.
ENDLOOP.
sort the approval table so that approvers come in sequence.
SORT approval_table BY approval_index.
ENDIF.
fill item table (which items belongs to which approval object)
wa_item_approval_table-approval_object_guid = v_app_obj_guid.
wa_item_approval_table-approval_item_guid = item_guid.
APPEND wa_item_approval_table TO item_approval_table.
CLEAR :wa_item_approval_table,wa_approval_table,it_update_tab.
ENDFUNCTION.
Thanks
Arghadip
[email protected]Hi,
You have to debug the entire system behaviour , the approval process using the second approver.
As first step , please check the security level of the second approver. Restart of workflow is based on the security level of the approver.
you can find the parameter for security level in the personalization tab of the user .
there is one function module which determines wether the workflow should be restarted (or) not.
i do not remember the exact name of the function module.
1)start transaction se37
2)enter bbpwflrestart*.
3) system will return a number of function modules , of them one function module determines wether to restart the workflow (or) not.
Please check what does the above function module return for the user and the shopping cart , there will be one parameter 'restart' which triggers the start
Maybe you are looking for
-
Objects and text cannot be moved from top left
I just merged my website from some other drag and drop editor to DW. I am determined to learn how to work everything (Or at least enough to get by). But I have hit a snag along my learning path, and am hoping it is something simple. I am trying to ad
-
[SOLVED]multiply-claimed blocks, files don't seem broken, fsck differs
In this laptop there's a 1TB hdd(mechanical, not SSD) with all kinds of multimedia files. Lots of files that have been added after a certain point in time seem to have a problem, as I found out by running "e2fsck -n /dev/sdX1" on that partition. It g
-
I'm programming in Visual Basic 6 to communicate between a computer and HP Measurement Devices (BER-Meter) with GPIB. I have already read information and code for this. My platform is W98. The NI488.2 commands can be sent without any problem between
-
Hello, Can someone suggest an idea to rewrite this query? this query is taking longer time as expected probably they way the query is formed is not right? Thanks in advance! I use 11g SELECT brand_id, region_id,
-
Kia ora Y'all, Advice please, is it appropriate and necessary to assign a static ip address to the server which runs the dhcp service, for example if I have manually assigned my server 192.168.1.1, do I also have to give it a static ip address of 192