Need Help in SRM Workflow WS145000015(Item Based approval For shopping Cart)

arghadip kar arghadipkar at yahoo.com
Fri May 4 12:30:32 EDT 2007


Hi All
   
  I am Arghadip. I was implementing SRM Workflow WS145000015(Item Based approval For shopping Cart). I am facing the issue of Workitem getting Logically Deleted as soon as a Approver is approving a Line Item. I have also checked and found that the Restart event is getting triggered which is Logically deleting the Workitem and starting the approval Step all to over again. Can anyone tell me what is wrong in my programming in BADI.Please get back to me as it is urgent. Thanks in advance
   
  I am attaching my Code here Please reiew:
  METHOD
   
  *-----------------------------------------------------------------------
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 : BEGIN OF ty_account.
  INCLUDE TYPE bbp_pds_acc.
  TYPES:  app_crit_name  TYPE bbp_wfl_app_criterion,
          app_crit_value TYPE char32.
  TYPES:  END OF ty_account.
    TYPES :
      BEGIN OF ty_item_copy,
       app_crit_value1 TYPE bbp_wfl_app_property,
      END OF ty_item_copy.
    TYPES : ty_item_info    TYPE STANDARD TABLE OF zrp2p0bgst001,
          ty_account_copy TYPE STANDARD TABLE OF ty_account.
  * FIELD-SYMBOLS-------------------------------------------------------*
  FIELD-SYMBOLS :
            <l_fs_account>    TYPE ty_account.
  * DATA----------------------------------------------------------------*
  DATA : it_item_info TYPE ty_item_info,
         wa_item_info TYPE zrp2p0bgst001.
    DATA : v_tabix         TYPE sytabix,
         v_num_apprv     TYPE swh_numc10 VALUE '0',
         v_value_per_con TYPE bbp_value  VALUE '0',
         v_value_per     TYPE bbp_value.
  DATA : v_temp_value TYPE bbp_value   VALUE '0',
         v_temp_level TYPE swh_numc10  VALUE '0'.
  DATA:  v_call_crit1     TYPE bbp_wfl_app_criterion,
         v_call_value1    TYPE bbp_wfl_app_property,
         v_co_code        TYPE bbp_wfl_app_property,
         v_plant_value    TYPE bbp_wfl_app_property,
         v_account_type   TYPE bbp_wfl_app_criterion ,
         v_comp_code      TYPE bbp_wfl_app_criterion ,
         v_plant          TYPE bbp_wfl_app_criterion ,
         v_acc_desc       TYPE bbp_step_description .
    DATA:   v_guid           TYPE crmt_object_guid.
  * WORKAREA------------------------------------------------------------*
  DATA:  wa_header         TYPE bbp_pds_sc_header_d,
* tables and work area.
         it_item           TYPE TABLE OF bbp_pds_sc_item_d,
         wa_item           TYPE bbp_pds_sc_item_d,
         it_item_copy      TYPE TABLE OF bbp_pds_sc_item_d,
         wa_item_copy      TYPE bbp_pds_sc_item_d,
* accounting structures
         it_account        TYPE TABLE OF bbp_pds_acc,
         wa_account        TYPE bbp_pds_acc,
         wa_account_copy   TYPE ty_account,
         wa_approver       TYPE bbp_wfl_approval_table_badi.
  * 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_prod_categ   TYPE bbp_wfl_app_criterion  VALUE 'PROD_CAT'.
  * Case when the object type bus212...---------------------------------*
    CASE object_type.
      WHEN c_shop.
* -----------   shopping cart --------------------------------------- *
*     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.
*       Keep the copy the it_item into it_item_copy
*       and keep the unique be_plant.
        it_item_copy[] = it_item[].
        SORT it_item_copy BY be_plant.
        DELETE ADJACENT DUPLICATES FROM it_item_copy
        COMPARING be_plant.
          SELECT  mandt
                zplant
                zcost_ctr
                zorder_no
                zasset_no
                zlevel
                zvalue
                zapprover
        FROM zrp2p0bgst001
        INTO TABLE it_item_info
        FOR ALL ENTRIES IN it_item
        WHERE
              zplant = it_item-be_plant.
*       No sy-subrc check is required as this method is called only
*       if the table contains some value such checks done before this.
        SORT it_item_info BY zplant zcost_ctr
              zorder_no zasset_no zlevel zvalue.
          SORT it_item BY guid.
        SORT it_account BY p_guid.
  *       looping at it_item is done to fetch the approver for every
*       line item
        LOOP AT it_item INTO wa_item WHERE del_ind IS INITIAL.
          READ TABLE it_account INTO wa_account
                                  WITH KEY p_guid = wa_item-guid.
            IF sy-subrc = 0.
            v_tabix = sy-tabix.
*         looping is done at every account so that every approver is
*         found for every acc corresponding to each line item.
            LOOP AT it_account  INTO wa_account FROM v_tabix.
              IF wa_account-p_guid <> wa_item-guid.
                EXIT.
              ELSE.
* Comments for process -----------------------------------------------*
*  CALCULATING THE VALUE PER COST CENTER /INTERNAL ORDER OR ASSET.
*  ALONG WITH ,CALCULATING THE VALUE THE AMT NEED TO BE CONVERTED
*  IN USD AS THE VALUES ARE MAINTAINED IN USD.
*  SO FUNCTION MODULE IS CALLED TO CONVERT THE WA_ITEM-CURRENCY
*  INTO USD USING CONVERT_TO_LOCAL_CURRENCY.
*---------------------------------------------------------------------*
          v_value_per_con = wa_account-distr_perc * wa_item-value / 100.
  *                CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
*                  EXPORTING
**                 CLIENT                  = SY-MANDT
*                    date                    = sy-datum
*                    foreign_amount          = v_value_per_con
*                    foreign_currency        = wa_item-currency
*                    local_currency          = 'USD'
*                   type_of_rate            = 'M'
*                   read_tcurr              = '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 error occurs system generated message is displayed.
*                IF sy-subrc <> 0.
*                  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*                          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*                ENDIF.
*--------------------------------------------------------------------*
                v_value_per = v_value_per_con.
*--------------------------------------------------------------------*
                  READ TABLE it_item_info INTO wa_item_info WITH KEY
                           zplant    = wa_item-be_plant
                           zcost_ctr = wa_account-cost_ctr
                           zorder_no = wa_account-order_no
                           zasset_no = wa_account-asset_no.
  * Comment on logic----------------------------------------------------*
* AS THE TABLE ZRP2P0BGST001, ONLY ONE OUT OF COST CENTER,
* INTERNAL ORDER AND ASSET NUMBER
* WILL BE FILLED AND REST WILL BE EMPTY, CORRSOPONDING TO COMPANY CODE,
* SO ABOVE WILL FETCH FIRST RECORD AS THE it_ITEM_INFO IS SORTED.
* FIRST RECORD WITH THE REQUIRED VALUE IS READ.
*---------------------------------------------------------------------*
*--------------------------------------------------------------------*
* begin of modification.--
*                IF sy-subrc = 0.
*                  v_temp_value = wa_item_info-zvalue.
*                  v_temp_level = wa_item_info-zlevel.
*
*                  IF v_value_per < v_temp_value.
*                    v_num_apprv = -1.          " NO APPROVER REQUIRED.
*
*                  ELSE.
*                    LOOP AT it_item_info INTO wa_item_info
*                            WHERE
*                               zplant    = wa_item-be_plant      AND
*                               zcost_ctr = wa_account-cost_ctr   AND
*                               zorder_no = wa_account-order_no   AND
*                               zasset_no = wa_account-asset_no .
*
*                      IF wa_item_info-zvalue  GE v_value_per
*                            AND v_value_per GT v_temp_value  .
*                        v_num_apprv  =  v_temp_level.
*                        EXIT.
*                      ELSE.
*                        v_temp_value = wa_item_info-zvalue.
*                        v_temp_level = wa_item_info-zlevel.
*                      ENDIF.
*
*                    ENDLOOP.
*                  ENDIF.
*
*                  IF v_num_apprv IS INITIAL.
*                    v_num_apprv = v_temp_level.
*                  ENDIF.
*                ELSE.
*                  CLEAR:  v_temp_value,v_temp_level.
*                ENDIF.
* end of modification.--
*--------------------------------------------------------------------*
*               As the v_num_apprv is assigned some value other than 0.
*               and for all values v_num_apprv <> -1 it shud proceed.
*-begin of modification ++-------------------------------------------*
                v_num_apprv = actual_approval_index .
*-end of modification ++-------------------------------------------*
                  IF v_num_apprv <> -1.
* Comment on logic----------------------------------------------------*
* NOW THE NUMBER OF APPROVER IS KNOWN SO THE APPROVER IS
* FOUND USING THE RFC AND THE CUSTOM TABLE ZRP2P0BGST001 IS UPDATED
* WITH LATEST APPROVERS.
*---------------------------------------------------------------------*
* To Find out Account id of what type ie cost center/IO/Asset.
                    IF NOT wa_account-cost_ctr IS INITIAL.
                    v_call_value1 = wa_account-cost_ctr.
                    v_account_type = 'COST_CTR'.
                    v_acc_desc  = 'Cost center approval'.
                  ENDIF.
                  IF NOT wa_account-order_no IS INITIAL.
                    v_call_value1 = wa_account-order_no.
                    v_account_type = 'ORDER_NO'.
                    v_acc_desc  = 'Internal Order approval'.
                  ENDIF.
                  IF NOT wa_account-asset_no IS INITIAL.
                    v_call_value1 = wa_account-asset_no.
                    v_account_type = 'ASSET_NO'.
                    v_acc_desc  = 'Asset Number approval'.
                    v_comp_code = 'COMPANY_CODE'.
                    v_co_code   = wa_item-be_co_code.
                  ENDIF.
  *                 Defining the PLANT and plant value.
                  v_plant = 'PLANT'.
                  v_plant_value = wa_item-be_plant.
  *                 Calling the Custom function to find the approvers.
                  CALL FUNCTION 'ZBBP_WFL_DIN_ITEM_APPROVAL_GET'
                    EXPORTING
                      sc_guid                    = wa_header-guid
                      item_guid                  = wa_item-guid
                      approval_description       = v_acc_desc
                      hide_items_not_responsible = '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             = v_num_apprv
                    CHANGING
                      approval_table             = approval_table
                      item_approval_table        = item_approval_table
                      item_approval_obj          = item_approval_obj.
                  ENDIF.
              ENDIF.
              CLEAR wa_account.
            ENDLOOP.
          ENDIF.
        ENDLOOP.
*       Once done clear the wa_approver
        CLEAR: wa_approver , wa_account,wa_item, wa_item_info.
      ENDIF.
  ENDCASE.
*--------------------------------------------------------------------*
* temporary change adding  one more line to apprv table.
  IF approval_table IS INITIAL.
    no_further_approval_needed = 'X'.
  ENDIF.
  *  DATA:
*      l_wa_approval_table      TYPE bbp_wfl_approval_table_badi.
*
*  READ TABLE approval_table INTO l_wa_approval_table INDEX  1.
*  l_wa_approval_table-approval_agent = 'USARGK'.
*  l_wa_approval_table-approval_index = '0000000003'.
*  APPEND l_wa_approval_table TO approval_table.
*--------------------------------------------------------------------*
  ENDMETHOD.
   
   
  FUNCTION MODULE
   
  FUNCTION zbbp_wfl_din_item_approval_get.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(SC_GUID) TYPE  BBP_GUID
*"     VALUE(ITEM_GUID) TYPE  BBP_GUID
*"     VALUE(APPROVAL_DESCRIPTION) TYPE  BBP_STEP_DESCRIPTION OPTIONAL
*"     VALUE(HIDE_ITEMS_NOT_RESPONSIBLE) TYPE  BOOLEAN OPTIONAL
*"     VALUE(CRITERION1) TYPE  BBP_WFL_APP_CRITERION
*"     VALUE(CRITERION2) TYPE  BBP_WFL_APP_CRITERION DEFAULT ''
*"     VALUE(CRITERION3) TYPE  BBP_WFL_APP_CRITERION DEFAULT ''
*"     VALUE(VALUE1) TYPE  BBP_WFL_APP_PROPERTY DEFAULT ''
*"     VALUE(VALUE2) TYPE  BBP_WFL_APP_PROPERTY DEFAULT ''
*"     VALUE(VALUE3) TYPE  BBP_WFL_APP_PROPERTY DEFAULT ''
*"     VALUE(APPROVAL_INDEX) TYPE  SWH_NUMC10
*"  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:
    l_wa_approval_table      TYPE bbp_wfl_approval_table_badi,
    l_wa_item_approval_table TYPE bbps_wfl_item_approval,
    l_wa_approval_def        TYPE zrp2p0bgst001.
    DATA:
    l_v_app_obj_guid           TYPE bbp_guid_32,
    l_v_is_new_approval_object TYPE boolean.
    DATA : l_it_update_tab   TYPE STANDARD TABLE OF zrp2p0bgst001,
         l_it_approval_def TYPE STANDARD TABLE OF zrp2p0bgst001,
         l_wa_update_tab   TYPE zrp2p0bgst001.
    DATA : l_it_actor_tab    TYPE STANDARD TABLE OF swhactor,
         l_wa_actor_tab    TYPE swhactor,
         l_it_ac_container TYPE STANDARD TABLE OF swcont,
         l_wa_ac_container TYPE swcont.
    DATA : l_it_options TYPE ty_option,
         l_it_fields  TYPE ty_fields,
         l_it_data    TYPE ty_data.
    DATA : l_wa_options TYPE  rfc_db_opt,
         l_wa_fields  TYPE  rfc_db_fld,
         l_wa_data    TYPE  tab512.
    DATA : l_v_apprv_asset TYPE usnam,
         l_v_apprv_cc    TYPE verak.
    DATA : l_v_cost_ctr TYPE  bbp_wfl_app_property VALUE '',
         l_v_order_no TYPE  bbp_wfl_app_property VALUE '',
         l_v_asset_no TYPE  bbp_wfl_app_property VALUE ''.
    DATA : l_v_query_table TYPE dd02l-tabname.
  DATA : l_apprv_count   TYPE char1 VALUE '0'.
  * Constants-----------------------------------------------------------*
  CONSTANTS:
    l_c_agent_is_user TYPE otype VALUE 'US'.
  * Comment on login ---------------------------------------------------*
* 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
*   CRITERION2              = ''
*   CRITERION3              = ''
      value1                  = value1
*   VALUE2                  = ''
*   VALUE3                  = ''
   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       = l_v_app_obj_guid
    TABLES
     item_app_obj            = item_approval_obj
           .
* Check what type of account is ie Order no/Internal order/ASSET.
  IF criterion1 = 'ORDER_NO'.
    l_v_order_no = value1.
    CONCATENATE 'AUFNR' '=' value1 INTO l_wa_options-text
    SEPARATED BY space.
    APPEND l_wa_options TO l_it_options.
      l_wa_fields-fieldname = 'AUFNR'.
    l_wa_fields-length    = '000012'.
    l_wa_fields-offset    = '000000'.
    l_wa_fields-type      = 'C'.
    APPEND l_wa_fields TO l_it_fields.
      l_wa_fields-fieldname = 'KOSTV'.
    l_wa_fields-length    = '000010'.
    l_wa_fields-offset    = '000000'.
    l_wa_fields-type      = 'C'.
    APPEND l_wa_fields TO l_it_fields.
      CALL FUNCTION 'RFC_READ_TABLE' DESTINATION 'E10CLNT121'
      EXPORTING
        query_table          = 'COAS'
        delimiter            = '|'
      TABLES
        OPTIONS              = l_it_options
        fields               = l_it_fields
        data                 = l_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 l_it_data table contains only one record
*     so no sorting required.
      READ TABLE l_it_data INTO l_wa_data INDEX 1.
      value1 = l_wa_data-wa+12(10).
      ENDIF.
*   at the end of this if internal order is passed its responsible
*   cost obtained and is placed in value1 field.
      CLEAR : l_wa_data , l_wa_options , l_wa_fields ,
            l_it_data , l_it_options , l_it_fields .
  ENDIF.
  * RFC to read table for finding the person responsible for the
* cost center / asset ie approver.
  CASE criterion1 .
      WHEN 'COST_CTR' OR 'ORDER_NO'.
        IF criterion1 = 'COST_CTR'.
        l_v_cost_ctr = value1.
      ENDIF.
        CONCATENATE 'KOSTL' '=' value1 INTO l_wa_options-text
      SEPARATED BY space.
      APPEND l_wa_options TO l_it_options.
        l_wa_fields-fieldname = 'VERAK'.
      l_wa_fields-length    = '000020'.
      l_wa_fields-offset    = '000000'.
      l_wa_fields-type      = 'C'.
      APPEND l_wa_fields TO l_it_fields.
        l_wa_fields-fieldname = 'KOSTL'.
      l_wa_fields-length    = '000010'.
      l_wa_fields-offset    = '000000'.
      l_wa_fields-type      = 'C'.
      APPEND l_wa_fields TO l_it_fields.
        l_v_query_table = 'CSKS'.
      WHEN 'ASSET_NO'      .
        l_v_asset_no = value1.
        CONCATENATE 'ANLN1' '=' value1 'AND' 'BUKRS' '=' value2 INTO
      l_wa_options-text SEPARATED BY space.
      APPEND l_wa_options TO l_it_options.
        l_wa_fields-fieldname = 'XV0NM'.
      l_wa_fields-length    = '000012'.
      l_wa_fields-offset    = '000000'.
      l_wa_fields-type      = 'C'.
      APPEND l_wa_fields TO l_it_fields.
        l_wa_fields-fieldname = 'ANLN1'.
      l_wa_fields-length    = '000012'.
      l_wa_fields-offset    = '000000'.
      l_wa_fields-type      = 'C'.
      APPEND l_wa_fields TO l_it_fields.
        l_wa_fields-fieldname = 'BUKRS'.
      l_wa_fields-length    = '000004'.
      l_wa_fields-offset    = '000000'.
      l_wa_fields-type      = 'C'.
      APPEND l_wa_fields TO l_it_fields.
        l_v_query_table = 'ANLX'.
    ENDCASE.
  * select all the record friom zrp2p0bgst001...
* based on above plant and cost_ctr/io/asset.
  SELECT * FROM zrp2p0bgst001
  INTO TABLE l_it_update_tab
  WHERE
      zplant = value3    AND
      zcost_ctr = l_v_cost_ctr AND
      zorder_no = l_v_order_no AND
      zasset_no = l_v_asset_no.
    IF sy-subrc = 0.
    SORT l_it_update_tab BY zplant zcost_ctr
             zorder_no zasset_no zlevel zvalue.
  *   now prepare the workarea for updating the table zrp2p0bgst001.
    READ TABLE l_it_update_tab INTO l_wa_approval_def WITH
    KEY zplant    = value3
        zcost_ctr = l_v_cost_ctr
        zorder_no = l_v_order_no
        zasset_no = l_v_asset_no
        zlevel    = 1  .
*   sy-subrc check not required as the function module is caled
*   only when the table contains the value and as such abvoe
*   sy-subrc is true so below will fetch atleast one record.
    ENDIF.
    CALL FUNCTION 'RFC_READ_TABLE' DESTINATION 'E10CLNT121'
    EXPORTING
      query_table          = l_v_query_table
      delimiter            = '|'
    TABLES
      OPTIONS              = l_it_options
      fields               = l_it_fields
      data                 = l_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.
    READ TABLE l_it_data INTO l_wa_data INDEX 1.
    IF l_v_query_table = 'CSKS'.
      l_v_apprv_cc = l_wa_data-wa+0(20).
      l_wa_approval_def-zapprover = l_v_apprv_cc.
    ENDIF.
    IF l_v_query_table = 'ANLX'.
      l_v_apprv_asset = l_wa_data-wa+0(12).
      l_wa_approval_def-zapprover = l_v_apprv_asset.
    ENDIF.
  ENDIF.
**********************************************************************
*--BEGING OF CHANGE MAJOR ONE.------------------------------------*
**********************************************************************
*  IF ( approval_index = 0 or approval_index = 1. ).
  * this will pick max three records as per the requirement
  DO 3 TIMES.                  " begin of do.
    l_apprv_count = l_apprv_count + 1.
    l_wa_approval_def-zlevel    = l_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 l_apprv_count > 1.
      l_apprv_count = l_apprv_count - 1.
      READ TABLE l_it_update_tab INTO l_wa_update_tab
           WITH KEY zlevel = l_apprv_count .
      IF sy-subrc = 0 .
* Comment  on login ------------------------------------------------*
* 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 : l_it_ac_container.
        l_wa_ac_container-element = 'ORG_OBJECT'.
        l_wa_ac_container-tab_index = '000001'.
        l_wa_ac_container-elemlength = '006'.
        l_wa_ac_container-type       = 'C'.
        CONCATENATE l_c_agent_is_user l_wa_update_tab-zapprover
        INTO l_wa_ac_container-value .
        APPEND l_wa_ac_container TO l_it_ac_container.
          CALL FUNCTION 'SWX_GET_MANAGER' DESTINATION 'E10CLNT121'
          TABLES
            actor_tab    = l_it_actor_tab
            ac_container = l_it_ac_container
          EXCEPTIONS
            nobody_found = 1
            OTHERS       = 2.
        IF sy-subrc = 0.
          READ TABLE l_it_actor_tab INTO l_wa_actor_tab WITH KEY
               otype = l_c_agent_is_user.
          l_wa_approval_def-zapprover = l_wa_actor_tab-objid.
        ENDIF.
      ENDIF.
      l_apprv_count = l_apprv_count + 1.
    ENDIF.
*   before updating populate the table l_it_approval_def
*   l_it_update_tab is read based on next l_apprv_count and
*   updates the approver and its value.
    READ TABLE l_it_update_tab INTO l_wa_update_tab
           WITH KEY zlevel = l_apprv_count .
    IF sy-subrc = 0.
      l_wa_approval_def-zplant = l_wa_update_tab-zplant.
      l_wa_approval_def-zcost_ctr = l_wa_update_tab-zcost_ctr.
      l_wa_approval_def-zorder_no = l_wa_update_tab-zorder_no.
      l_wa_approval_def-zasset_no = l_wa_update_tab-zorder_no.
      l_wa_approval_def-zvalue = l_wa_update_tab-zvalue.
      APPEND l_wa_approval_def TO l_it_approval_def.
    ENDIF.
  *   modify the table l_it_update_tab so that along with the custom
*   database table the table in use in this function module ie
*   l_it_update_tab also remain updated.
*   benefit is that if the modify to dtab fails. the process works fine.
    MODIFY l_it_update_tab FROM l_wa_approval_def
             TRANSPORTING zapprover
             WHERE zlevel = l_wa_approval_def-zlevel AND
                   zvalue = l_wa_approval_def-zvalue.
  *   now enqueue the table for modification.
    CALL FUNCTION 'ENQUEUE_E_TABLE'
      EXPORTING
        tabname        = 'ZRP2P0BGST001'
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.
*   now modify the table, for updation of approver.
    IF sy-subrc = 0.
      MODIFY zrp2p0bgst001 FROM l_wa_approval_def.
*     if sy-subrc goes 0 commit work is called.
*     also the l_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 = 'ZRP2P0BGST001'.
*   once all done clear the work areas.
    CLEAR : l_wa_approval_def-zlevel , l_wa_approval_def-zapprover.
  ENDDO.                               " END OF DO STATEMENT.
  * sort l_it_approval_def table.
  SORT l_it_approval_def BY zlevel ASCENDING.
    IF approval_index = 2 .
    DELETE l_it_approval_def INDEX 1.
  ENDIF.
  IF approval_index = 3.
    DELETE l_it_approval_def INDEX 1.
    DELETE l_it_approval_def INDEX 1.
  ENDIF.
  IF approval_index > 3.
    REFRESH : l_it_approval_def .
  ENDIF.
*ENDIF.
**********************************************************************
*--end of major change.---------------------------------------------*
**********************************************************************
*   fill approval table (who is responsible for which approval
*   object in which approval step)
  SORT l_it_approval_def BY zplant zcost_ctr zorder_no zasset_no
                          zlevel zvalue.
  LOOP AT l_it_approval_def INTO l_wa_approval_def.
    l_wa_approval_table-approval_index       = l_wa_approval_def-zlevel.
    CONCATENATE l_c_agent_is_user l_wa_approval_def-zapprover
                            INTO l_wa_approval_table-approval_agent.
      l_wa_approval_table-approval_description = approval_description.
      l_wa_approval_table-approval_object_guid = l_v_app_obj_guid.
      l_wa_approval_table-hide_items_not_responsible =
                            hide_items_not_responsible.
      APPEND l_wa_approval_table TO approval_table.
  ENDLOOP.
* fill item table (which items belongs to which approval object)
  l_wa_item_approval_table-approval_object_guid = l_v_app_obj_guid.
  l_wa_item_approval_table-approval_item_guid   = item_guid.
  APPEND l_wa_item_approval_table TO item_approval_table.
  ENDFUNCTION.
   
   
   
  Arghadip Kar
  email:dharam015 at gmail.com
  phone no :913325579917

       
---------------------------------
Ahhh...imagining that irresistible "new car" smell?
 Check outnew cars at Yahoo! Autos.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.mit.edu/pipermail/sap-wug/attachments/20070504/9978eb22/attachment.htm


More information about the SAP-WUG mailing list