cancel
Showing results for 
Search instead for 
Did you mean: 

WS14500015 is not working for Multilevel approval

Former Member
0 Kudos

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

arghakar@in.ibm.com

Accepted Solutions (1)

Accepted Solutions (1)

khan_voyalpadusman
Active Contributor
0 Kudos

Hi,

can you please check what is the index you are appending for each level?

First level should have index 1 and then next levels should be having incremental value.

Please have a look at the workflow container when the workitem is at the first approver.

if the approvers of all the levels are having same index , system will not send workitem to next level approver.

Former Member
0 Kudos

Hi Khan

The Index is working fine. The ApproverList Container element has all the index poulated perfectly. The problem appears only when we are going for 2nd and 3rd Level approval as it is getting Logically Deleted as the Wairt for Restart Event is getting executed. Please help me in this regard.

Thanks

Arghadip

khan_voyalpadusman
Active Contributor
0 Kudos

Hi,

please let me know the problem .. I am not sure about this

1) is the workitem going to the second approver?

(or)

2)is the workitem not going to the second approver.

let me know if you know how to debug ths approval process

Former Member
0 Kudos

The Workitem is going to the 2nd level. But whenever One of the 2nd level Approver is trying to approve for 1 line item the workitem that was sitting in the inbox of other Mutilevel approver for other Line item is getting Logically Deleted as Restart event of Business object BUS2121 is getting triggered. The Workflow works for 1 line Item. The above behaviour is for Multiple Line item. Can you please check what is the issue. Can you provide me a sample code that you have done for ur Project. Please do not send SAP standard code it does not work ))

Thanks

Arghadip

khan_voyalpadusman
Active Contributor
0 Kudos

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

Answers (2)

Answers (2)

Former Member
0 Kudos

Actually the restart of the workflow is handled in an BADI and not in an fm.

The BADI is BBP_WFL_SECUR_BADI, please check the code here i mean in the implementation of the same.

Former Member
0 Kudos

I am facing the same issue. Please any solution for this?