Skip to Content
0
Former Member
Jul 20, 2007 at 04:41 AM

WS14500015 is not working for Multilevel approval

50 Views

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