on 02-06-2007 12:51 PM
Hi,
We use the BADI "Determination of Approver for n-Step Dynamic Approval Workflow" (i.e. <b>BBP_WFL_APPROV_BADI</b>) to create our workflow.
We have 4 levels of approval... for example :
(1) Level "buyer" --> <b>USER1</b>
(2) Level "controller" --> USER2
(3) Level "manager1" --> <b>USER1</b>
(4) Level "manager2" --> USER3
Normally, for each level of approval, there is a distinct and different user.
But in the case (as seen above) if the same user appears more than once in the workflow for a shopping basket, we want to automatically set it to "approved" so that the user doesn't have to do it manually (excpet the first time).
How can I accomplish this?? It seems in the BADI there's no possibility to force an approval state....
Thanks,
Tim
Thanks for your insight,
Actually I want to keep this step in my WorkFlow and set it as "approved" automatically, so that this USER1 will not have to approve twice... just the first time. You see what I mean?
Thanks,
Tim
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi
As i have already provide with the sample code .. Do you need anything else. ?
As I told you earlier, You can do the same by implementing the final Apporver table as per your need. The Approver once have approved, will not be allowed to approve the Shopping cart again.
I am still not sure, What exactly you are looking for now ?
Please elaborate.
Hope this will help.
Please reward suitable points.
Regards
- Atul
Hi
<b>Here is one sample code for your reference</b>.
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 is the 2nd example of the BADI implementation that includes
* dynamic spending limit approval for PO
INCLUDE <swfcntn01>. "Workflow
DATA:
ls_header TYPE bbp_pds_sc_header_d,
ls_approver TYPE bbp_wfl_approval_table_badi,
lv_approval_index TYPE swh_numc10,
lv_guid TYPE crmt_object_guid,
lo_new_instance TYPE swf_bor_object,
lt_approval_agent_obj TYPE TABLE OF swf_bor_object,
ls_wa_agent_obj TYPE swf_bor_object,
lo_user TYPE swf_bor_object,
ls_approval_agent TYPE bbp_wfl_approval_table,
lv_index TYPE syindex,
lv_usr01_name TYPE ad_namtext,
lt_approval_init_agents TYPE TABLE OF bbp_wfl_approval_table,
ls_wa_approval_init_agents TYPE bbp_wfl_approval_table,
ls_wa_approval_history TYPE bbps_wfl_history_line_badi.
* Business objects type (local constants)
CONSTANTS:
c_po TYPE crmt_subobject_category_db VALUE 'BUS2201',
c_biddingdoc TYPE crmt_subobject_category_db VALUE 'BUS2200',
c_quotation TYPE crmt_subobject_category_db VALUE 'BUS2202',
c_grse TYPE crmt_subobject_category_db VALUE 'BUS2203',
c_invoice TYPE crmt_subobject_category_db VALUE 'BUS2205',
c_shop TYPE crmt_subobject_category_db VALUE 'BUS2121',
c_contract TYPE crmt_subobject_category_db VALUE 'BUS2000113',
c_salescontract TYPE crmt_subobject_category_db VALUE 'BUS2000114',
c_avl TYPE crmt_subobject_category_db VALUE 'BUS2206',
c_invoicegrp TYPE crmt_subobject_category_db VALUE 'BUS2207',
c_vendor_obj TYPE crmt_subobject_category_db VALUE 'BUS1006200'.
*** workflow approval states
CONSTANTS:
c_wf_approved TYPE bbp_wfl_approvalstate VALUE '0',
c_wf_rejected TYPE bbp_wfl_approvalstate VALUE '1',
c_wf_not_instanced TYPE bbp_wfl_approvalstate VALUE '2',
c_wf_changed TYPE bbp_wfl_approvalstate VALUE '3',
c_wf_partialapproved TYPE bbp_wfl_approvalstate VALUE '4',
c_wf_step_in_process TYPE bbp_wfl_approvalstate VALUE '5'.
CLEAR: lt_approval_init_agents[], lt_approval_agent_obj[],
ls_wa_agent_obj, ls_approval_agent, ls_wa_approval_init_agents,
ls_wa_approval_history.
* -------------------------------------------------------------------- *
* map input data to local data
* map char32 to raw16
MOVE guid TO lv_guid.
CASE object_type.
* ====================== shopping cart =========================== *
WHEN c_shop.
*** get the details of the shopping cart
CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
EXPORTING
i_guid = lv_guid
i_object_id = object_id
IMPORTING
e_header = ls_header.
IF ls_header-total_value < 490000000.
*** 2 step approval
CASE actual_approval_index.
WHEN 0.
ls_approver-approval_index = 1.
ls_approver-approval_agent = 'USMANAGER1'.
ls_approver-name = 'Arthur Manager1'.
ls_approver-approval_description = 'First approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER2'.
ls_approver-name = 'Arnold Manager2'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER4'.
ls_approver-name = 'Thomas Manager4'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
WHEN 1.
ls_approver-approval_index = 1.
ls_approver-approval_agent = 'USMANAGER1'.
ls_approver-name = 'Arthur Manager1'.
ls_approver-approval_description = 'First approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER2'.
ls_approver-name = 'Arnold Manager2'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER4'.
ls_approver-name = 'Thomas Manager4'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
WHEN 2.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER2'.
ls_approver-name = 'Arnold Manager2'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER4'.
ls_approver-name = 'Thomas Manager4'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
WHEN OTHERS.
no_further_approval_needed = 'X'.
ENDCASE.
ELSE.
CASE actual_approval_index.
*** 3 step approval
WHEN 0.
ls_approver-approval_index = 1.
ls_approver-approval_agent = 'USMANAGER1'.
ls_approver-name = 'Arthur Manager1'.
ls_approver-approval_description = 'First approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER2'.
ls_approver-name = 'Arnold Manager2'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER4'.
ls_approver-name = 'Thomas Manager4'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 3.
ls_approver-approval_agent = 'USMANAGER3'.
ls_approver-name = 'Peter Manager3'.
ls_approver-approval_description = 'Third approval step'.
APPEND ls_approver TO approval_table.
WHEN 1.
ls_approver-approval_index = 1.
ls_approver-approval_agent = 'USMANAGER1'.
ls_approver-name = 'Arthur Manager1'.
ls_approver-approval_description = 'First approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER2'.
ls_approver-name = 'Arnold Manager2'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER4'.
ls_approver-name = 'Thomas Manager4'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 3.
ls_approver-approval_agent = 'USMANAGER3'.
ls_approver-name = 'Peter Manager3'.
ls_approver-approval_description = 'Third approval step'.
APPEND ls_approver TO approval_table.
WHEN 2.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER2'.
ls_approver-name = 'Arnold Manager2'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 2.
ls_approver-approval_agent = 'USMANAGER4'.
ls_approver-name = 'Thomas Manager4'.
ls_approver-approval_description = 'Second approval step'.
APPEND ls_approver TO approval_table.
ls_approver-approval_index = 3.
ls_approver-approval_agent = 'USMANAGER3'.
ls_approver-name = 'Peter Manager3'.
ls_approver-approval_description = 'Third approval step'.
APPEND ls_approver TO approval_table.
WHEN 3.
ls_approver-approval_index = 3.
ls_approver-approval_agent = 'USMANAGER3'.
ls_approver-name = 'Peter Manager3'.
ls_approver-approval_description = 'Third approval step'.
APPEND ls_approver TO approval_table.
WHEN OTHERS.
no_further_approval_needed = 'X'.
ENDCASE.
ENDIF.
* ====================== purchase order ============================= *
WHEN c_po.
*** 1) Evaluate the list of spending limit approvers from BOR attributes
swf_create_object lo_new_instance object_type guid.
swf_get_property lo_new_instance 'SLManagerUserList'
lt_approval_agent_obj[].
lv_index = 1.
LOOP AT lt_approval_agent_obj INTO ls_wa_agent_obj.
swf_get_property ls_wa_agent_obj 'User' lo_user.
swf_get_property lo_user 'NameWithLeadingUS'
ls_approval_agent-approval_agent.
swf_get_property lo_user 'Name' lv_usr01_name.
MOVE lv_usr01_name TO ls_approval_agent-name.
ls_approval_agent-approval_index = lv_index.
ls_approval_agent-approval_branch = 1.
ls_approval_agent-initial_index = lv_index.
ls_approval_agent-initial_agent =
ls_approval_agent-approval_agent.
ls_approval_agent-approval_state = c_wf_not_instanced.
APPEND ls_approval_agent TO lt_approval_init_agents.
lv_index = lv_index + 1.
ENDLOOP.
*** 2) Evaluate the list of remaining approvers. The actual approver
*** belongs to the list as well.
LOOP AT approval_history_table INTO
ls_wa_approval_history WHERE type <> 'I'.
LOOP AT lt_approval_init_agents INTO
ls_wa_approval_init_agents.
IF ls_wa_approval_init_agents-approval_index LT
ls_wa_approval_history-approval_index.
DELETE lt_approval_init_agents.
ENDIF.
ENDLOOP.
ENDLOOP.
* fill the import table
CLEAR ls_wa_approval_init_agents.
LOOP AT lt_approval_init_agents INTO
ls_wa_approval_init_agents.
CLEAR ls_wa_approval_history.
MOVE-CORRESPONDING ls_wa_approval_init_agents TO
ls_wa_approval_history.
APPEND ls_wa_approval_history TO approval_table.
ENDLOOP.
IF approval_table[] IS INITIAL.
no_further_approval_needed = 'X'.
ENDIF.
* ======================== contract ================================ *
WHEN c_quotation.
IF lv_index LT 2.
ls_approval_agent-approval_description = '1st Approval'.
ls_approval_agent-approval_index = 1.
ls_approval_agent-approval_branch = 1.
ls_approval_agent-initial_index = 1.
ls_approval_agent-name = 'Hennes Kaempfer'.
ls_approval_agent-approval_agent = 'USMANAGER4'.
ls_approval_agent-approval_state = c_wf_not_instanced.
APPEND ls_approval_agent TO approval_table.
ls_approval_agent-approval_index = 1.
ls_approval_agent-approval_branch = 1.
ls_approval_agent-initial_index = 1.
ls_approval_agent-name = 'Paul Reiter'.
ls_approval_agent-approval_agent = 'USMANAGER5'.
ls_approval_agent-approval_state = c_wf_not_instanced.
APPEND ls_approval_agent TO approval_table.
ls_approval_agent-approval_description = '2nd Approval'.
ls_approval_agent-approval_index = 2.
ls_approval_agent-approval_branch = 1.
ls_approval_agent-initial_index = 2.
ls_approval_agent-name = 'Dieter Mueller'.
ls_approval_agent-approval_agent = 'USMANAGER33'.
ls_approval_agent-approval_state = c_wf_not_instanced.
APPEND ls_approval_agent TO approval_table.
ELSE.
no_further_approval_needed = 'X'.
ENDIF.
ENDCASE.
ENDMETHOD.
Hope this will help.
<b>Please reward suitable points.</b>
Regards
- Atul
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi
This is very much possible. We have done the same quite a times.
In the final <b>approval_table</b> table created in this BADI, you sort the approvers based on their ID and then delete the adjacent duplicates comparing the Id.
*---- Delet the duplicate approvers
SORT approver_table BY APPROVAL_AGENT.
DELETE ADJACENT DUPLICATES FROM approver_table COMPARING APPROVAL_AGENT.
Hope this will help.
Regards
- Atul
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.