SWX_GET_MANAGER vs. RH_GET_ACTORS

Hi All,
Since someone deleted my inquiry yesterday, I am posting a new one now.
Basically my requirement is that I need to determine the manager of the wf_initiator so that they can be used as a recipient in the send mail step. The very kind Richard Bakker (sorry mate, wasn't able to award the points) mentioned that the strategy I am leaning towards is correct; i.e. inserting a step which will determine the manager before the actual send mail task.
Now, after further reading, I also came across the FM SWX_GET_MANAGER which basically does the same thing at a much simpler process. From a totally ABAP newbie, can you please enlighten us the differences (pros and cons) of using SWX_GET_MANAGER vs. RH_GET_ACTORS.
<<Text removed>>
Regards,
DeLo
Edited by: Matt on Jul 30, 2011 7:15 AM

Hi,
SWX_GET_MANAGER is standard FM which used to get the superior/manager of a org unit.
RH_GET_ACTORS is used to get the agents form a rule ( which is created through PFAC ). Suppose you have many custom rule to find the agents. Now if you need to use this rule to get agents within a Function Module then you can use RH_GET_ACTORS to get agents form the rule.
CALL FUNCTION 'RH_GET_ACTORS'
  EXPORTING
    act_object                      = 'AC90000137'
  tables
    ACTOR_CONTAINER                 = l_it_actor_container
    actor_tab                       = l_it_actor_tab
EXCEPTIONS
   NO_ACTIVE_PLVAR                 = 1
   NO_ACTOR_FOUND                  = 2
   EXCEPTION_OF_ROLE_RAISED        = 3
   NO_VALID_AGENT_DETERMINED       = 4
   NO_CONTAINER                    = 5
   OTHERS                          = 6
Thanks and regards,
SNJY

Similar Messages

  • How to use SWX_GET_MANAGER

    Hi Friends,
      Can you please give an example of how to use FM 'SWX_GET_MANAGER'... i really appriciate if you give some examples..
    John.

    Just a small code sample, but will solve your problem.
      DATA : ls_ac_container      type swcont,
             lt_ac_container      TYPE TABLE OF swcont,
             lt_approver          TYPE TABLE OF swhactor.
          lv_creator           TYPE swp_agent.
      CONCATENATE 'US' <User Id> INTO lv_creator.
        clear ls_ac_container.
        MOVE :   'ORG_OBJECT'  TO ls_ac_container-element ,
                 '000000'      TO ls_ac_container-tab_index ,
                 '014'         TO ls_ac_container-elemlength ,
                 'C'           TO ls_ac_container-type ,
                 lv_creator    TO ls_ac_container-value .
        APPEND ls_ac_container to lt_ac_container.
        REFRESH lt_approver.
        CALL FUNCTION 'SWX_GET_MANAGER'
          TABLES
            actor_tab    = lt_approver
            ac_container = lt_ac_container
          EXCEPTIONS
            nobody_found = 1
            OTHERS       = 2.
    Regards
    Kathirvel

  • Get Manager - SWX_GET_MANAGER

    Hello
    I'm using SWX_GET_MANAGER FM to determine the Manager in the workflow but I'm using this in another report too. I'm sending to FM the employee user but I need to send PERNR. Is this possible with this FM?
    Thanks!

    Hi,
    You can send
    AC_CONTAINER-ELEMENT = 'OBJID'.
    AC_CONTAINER-ELEMLENGTH = '012'.
    AC_CONTAINER-TYPE = 'C'.
    AC_CONTAINER-VALUE = PERNR-PERNR.
    APPEND AC_CONTAINER.
    CLEAR AC_CONTAINER.
      AC_CONTAINER-ELEMENT = 'OTYPE'.
      AC_CONTAINER-ELEMLENGTH = '002'.
      AC_CONTAINER-TYPE = 'C'.
      AC_CONTAINER-VALUE = 'P'.
      APPEND AC_CONTAINER.
      CLEAR AC_CONTAINER.
        CALL FUNCTION 'SWX_GET_MANAGER'
          TABLES
            ACTOR_TAB    = ACTOR_TAB
            AC_CONTAINER = AC_CONTAINER
          EXCEPTIONS
            NOBODY_FOUND = 1
            OTHERS       = 2.
    you can also use Macro SWC_SET_ELEMENT to populate AC_CONTAINER.
    Regards,
    Ramu N.

  • SWX_GET_MANAGER and Vacant position

    Hi All,
    I am working on a approval workflow for Budget Distribution Request. When a person requests for a budge, it has to go to the Manager and his superiors of that department who will either approve or reject it. (I have employee SAP USER ID).
    I am using the Rule 00000168 but when the superior is on vacation or the position is vacant the FM attached to this rule will not fetch me the details there by stopping my approval process.
    So how to proceed in this scenario.
    Any inputs in this regard are welcome.
    Thank you,
    Lakshmi Narayana.S

    Hi Lakshmi Narayana.S,
    another option to use the function RH_ACT_LEADING_POSITION or SWX_GET_MANAGER as implemented in rule 157 or in 168.
    But:
    - in the previous node you call this function to evaluate the manager
    - if there is no manager/result you can throw an exception which is implemented in your method - then in the workflow as a new outcome
    - react to your exception as you wish in the outcome
    Regards
    Tibor

  • SWX_GET_MANAGER - read of future data

    Hello!
    I´m looking for a solution to get the manager of an employee who moves from one unit to an other in the future. The problem is that swx_get_manager seems to works with sy-datum and not with flexible dates. So I can´t read the manager out of OM for the next month e.g..
    How can I read the managers out of OM in the future?
    Best reguards
    Martin

    Hi Martin,
    This is achievable, SWX_GET_MANAGER internally calls another F.M RH_GET_LEADING_POSITION to read the leading position of the user based on sy-datum.
    Make use of the above function to read based on future dates instead of system date and read the corresponding Person from HRP1001.
    Thank you,
    Krishna kishore T.

  • Question in getting Superior agent using FM 'SWX_GET_MANAGER'

    Hi Guy ,
       I have problem in get the initiator's superior . can someone help me ,thanks in advance .
       my scenairo is as follow :
       when assigned the user to position ,I use the standard rule 168 (FM:swx_get_manager) , I can get the correct result .but when assigned the Business Partner to postion , it is show me no found data . I have already the user id to the business partner in bp's profile'BUP003 employee' , and also I can see the user located below the position in the OM .
       whether I miss certain operation  ? how can I get the correct superior ?
    Jialiang.Qiu

    Hi,
    Well,The output of SWX_GET_MANAGER can only be User or Position.
    As per the assignment where the Business Partner is assigned to the Position, this FM gets the BP as an agent and in the final stage of this FM, this BP Agent entry gets deleted due to the following statement.
      DELETE actor_tab WHERE otype <> 'P' AND
                             otype <> 'US'.
    So, by this we can infer that you cannot determine the Person attached to that BP(that was attached to the Position) using 168 rule. You may have to create a custom Rule in these regards if you insist to go with Position-BP-Employee strategy.
    Hope this clears your doubt.
    Regards,
    <i><b>Raja Sekhar</b></i>

  • FM - SWX_GET_MANAGER

    I am creating a report for Terminated & Suspended Employees.  These are Action Types T1 & SE on Infotype P0000.  The report must include the Manager's details.  I am using the FM SWX_GET_MANAGER to get the Manager's User ID and it is successful for Suspended Employees (Action SE) (because they are still active) but not Terminated Employees (T1) because they are Withdrawn.
    How can I get the Manager's User ID for Withdrawn employees?
    Kind regards,
    Yolande

    Hi Mike,
    Thanks! I tried using position as well, but the problem is that the client has maintained two org structures in the organisation management. Can we restrict the FM 'SWX_GET_MANAGER' to look into only one of them, we have the Org structure ID from the HR infotype 1000 table (HRP1000).
    Please advice.
    Regards,
    Ashu Arora

  • Using Function Module SWX_GET_MANAGER

    Hello,
    I want to use the function module SWX_GET_MANAGER. I want to know how should I pass parameters to this function module.

    hi please check the usage of the FM. we used it one FM.
    FUNCTION Z00_MM_MGR_OR_USER_GET.
    *"*"Local interface:
    *"       TABLES
    *"              ACTOR_TAB STRUCTURE  SWHACTOR
    *"              AC_CONTAINER STRUCTURE  SWCONT
    *"       EXCEPTIONS
    *"              NOBODY_FOUND
      DATA: MATERIAL_TYPE LIKE MARA-MTART. " type of changed material
      DATA: WF_INITIATOR  LIKE SWHACTOR.   " workflow initiator
      DATA: COUNTER       TYPE I.
      REFRESH ACTOR_TAB. CLEAR ACTOR_TAB.
    * get type of material under consideration
      SWC_GET_ELEMENT AC_CONTAINER 'MaterialType' MATERIAL_TYPE.
      SWC_GET_ELEMENT AC_CONTAINER 'WorkflowInitiator' WF_INITIATOR.
      CASE MATERIAL_TYPE.
        WHEN 'ROH'. " get manager of wf_initiator from role
          SWC_SET_ELEMENT AC_CONTAINER 'ORG_OBJECT' WF_INITIATOR.
          CALL FUNCTION 'SWX_GET_MANAGER'
               TABLES
                    ACTOR_TAB    = ACTOR_TAB
                    AC_CONTAINER = AC_CONTAINER
               EXCEPTIONS
                    NOBODY_FOUND = 1.
          IF SY-SUBRC NE 0.
            RAISE NOBODY_FOUND.
          ENDIF.
        WHEN OTHERS.
          ACTOR_TAB = WF_INITIATOR.
          APPEND ACTOR_TAB.
      ENDCASE.
    * check if we have found any agents at all
      DESCRIBE TABLE ACTOR_TAB LINES COUNTER.
      IF COUNTER = 0.
        RAISE NOBODY_FOUND.
      ENDIF.
    ENDFUNCTION.

  • FM RH_GET_ACTORS

    Hi,
    I'm using the function RH_GET_ACTORS to get responsibles from a rule.
    The container rule is defined by three parameters, and when i call the function it is doen't get me nothing however when I simulate the rule from the pfac yes is getting me values.
    My code is this, could you help me thanks
    Add parameters to get responsibles from the rule
      MOVE: 'MTART'  TO i_swcont-element,
            'C'      TO i_swcont-type,
             v_MTART TO i_swcont-value.
      APPEND i_swcont.
      MOVE: 'WERKS'  TO i_swcont-element,
            'C'      TO i_swcont-type,
             space   TO i_swcont-value.
      APPEND i_swcont.
      MOVE: 'MATKL'  TO i_swcont-element,
            'N'      TO i_swcont-type,
             v_MATKL TO i_swcont-value.
      APPEND i_swcont.
    Get Responsibles from rule 90000054
      CALL FUNCTION 'RH_GET_ACTORS'
        EXPORTING
          act_object                = 'AC90000054'
          search_date               = sy-datum
        TABLES
          actor_container           = i_swcont
          actor_tab                 = i_swhactor
        EXCEPTIONS
          no_active_plvar           = 1
          no_actor_found            = 2
          exception_of_role_raised  = 3
          no_valid_agent_determined = 4
          no_container              = 5
          OTHERS                    = 6.

    i solved this

  • Example- SWX_GET_MANAGER

    Hii,
    please tell me how to pass parameters to swx_get_manager.
    We can use PERNR also to find next level manager na?
    I was passing like this, But im not getting any result.
    DATA:  LT_ACTOR_TAB  type TABLE OF SWHACTOR,
             LW_ACTOR_TAB TYPE SWHACTOR,
             LT_AC_CONTAINER type TABLE OF SWCONT,
             LW_AC_CONTAINER TYPE SWCONT.
      LW_AC_CONTAINER-element    = 'ORG_OBJECT'.
      LW_AC_CONTAINER-ELEMLENGTH = '025'.
      LW_AC_CONTAINER-type       = 'C'.
      concatenate 'P' WA_PA0001-pernr into LW_AC_CONTAINER-value separated by space.
      APPEND LW_AC_CONTAINER TO LT_AC_CONTAINER.
      CALL FUNCTION 'SWX_GET_MANAGER'
        TABLES
          ACTOR_TAB    = LT_ACTOR_TAB
          AC_CONTAINER = LT_AC_CONTAINER
        EXCEPTIONS
          NOBODY_FOUND = 1.
      IF SY-SUBRC <> 0.

    Hi,
    In case of this post is still up-to-date
    I did it almost the same way, the only difference is that I concatenated 'P' and pernr in additional variable (lv_value) and than transfered this variable to appropriate field (lw_ac_containter-value). It works fine in our system.
    Bellow is the example.
    Best regards, Ana
    DATA:  LT_ACTOR_TAB  type TABLE OF SWHACTOR,
               LW_ACTOR_TAB TYPE SWHACTOR,
               LT_AC_CONTAINER type TABLE OF SWCONT,
               LW_AC_CONTAINER TYPE SWCONT,
               lv_value type string.
        clear: lv_value, LW_AC_CONTAINER, lw_actor_tab.
      refresh: lt_actor_tab, Lt_AC_CONTAINER.
      concatenate 'P' pernr into lv_value separated by space .
      LW_AC_CONTAINER-element    = 'ORG_OBJECT'.
      LW_AC_CONTAINER-ELEMLENGTH = '025'.
      LW_AC_CONTAINER-type       = 'C'.
      LW_AC_CONTAINER-value      = lv_value.
      APPEND LW_AC_CONTAINER TO LT_AC_CONTAINER.
        CALL FUNCTION 'SWX_GET_MANAGER'
          TABLES
            actor_tab          = lt_actor_tab
            ac_container       = lt_ac_container
         EXCEPTIONS
           NOBODY_FOUND       = 1
           OTHERS             = 2
        IF sy-subrc <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.

  • Using Rule 168, SWX_GET_MANAGER and Chief Position

    We have enabled standard SAP Travel Workflow WS20000040 - Approve Trip.   We are not currently using OM relationships A002 (Reports Line to) or B002 (Is Line Supervisor of).   We currently identify the Line Manager of the employee using the Chief Position designation A 012 and would like to use this for Trip approvals in lieu of building all of these additional relationships.
    Rule 168 is bound to the workflow.  According to the documentation associated with the rule, it seems that the rule should work with either the A002 or A012 relationship.  However, we only seem to be getting a superior identified when relationship A002/B002 exists.  
    Are there additional configuration or parameter settings that we might need to consider to make the manager (agent) determined properly exclusively with the Chief Position assignment?
    Thanks for  any guidance you can provide.
    Regards,
    Edited by: Bruce Hull on Jul 24, 2008 5:37 PM
    Edited by: Bruce Hull on Jul 24, 2008 5:37 PM
    Edited by: Bruce Hull on Jul 24, 2008 7:29 PM

    What I found through trial and error is that rule 168 does indeed evaluate the A012 relationship by default with no change in the standard evaluation path.  In our testing system, the "Chief" postion was not properly assigned.  Once this was resolved, the workflow works properly.
    As a side note, I also learned that you must have the parameter WFLOW VAPOS set for the rule to properly look up the organizational structure when a position (and chief) are vacant.

  • FM in std rule

    Dear Experts,
    In std rule 00000168 to find Superior of an employee FM SWX_GET_MANAGER is used. In that FM code for getting is given as below.
    SWC_GET_ELEMENT AC_CONTAINER 'OTYPE' ORG_TYPE.
      SWC_GET_ELEMENT AC_CONTAINER 'OBJID' ORG_ID.
    When I simulate the rule in PFAC I get the output. From SE37 I populate AC_CONTAINER with values that I gave in PFAC as below.
    ELEMENT - OTYPE   VALUE  -  US
    ELEMENT - OBJID     VALUE -  ABAPER
    But I see that these values are not set for ORG_TYPE AND ORG_ID. Can you please tell me how to pass values correctly to this FM. I have employee OTYPE & OBJID as input. I need to find the Superior of this employee.
    KR,
    Bharath

    Dear All,
    Thanks a lot for all your inputs.
    I have solved the problem. FM RH_GET_ACTORS is used to call any rule. Find the code of my solution below.
    FUNCTION ZGETMGR.
    *"*"Local Interface:
    *"  TABLES
    *"      ACTOR_TAB STRUCTURE  SWHACTOR
      INCLUDE <cntn01>.
      DATA: lt_agents type standard table of swhactor.
      swc_container lt_container.
      swc_set_element lt_container 'OTYPE' 'US'.
      swc_set_element lt_container 'OBJID' 'ABAPER'.
      CALL FUNCTION 'RH_GET_ACTORS'
        EXPORTING
          ACT_OBJECT                = 'AC00000168'
        TABLES
          ACTOR_CONTAINER           = lt_container
          ACTOR_TAB                 = lt_agents
        EXCEPTIONS
          NO_ACTIVE_PLVAR           = 01
          NO_ACTOR_FOUND            = 02
          EXCEPTION_OF_ROLE_RAISED  = 03
          NO_VALID_AGENT_DETERMINED = 04
          NO_CONTAINER              = 05
          OTHERS                    = 06.
      actor_tab[] = lt_agents[].
    ENDFUNCTION.
    In above FM ACTOR_CONTAINER is the input where we give the employee for whom we want to find the supervisor and
    ACTOR_TAB is the output which contains the OTYPE & OBJID of Supervisor. ACT_OBJECT is the name of the rule.
    KR,
    Bharath

  • Direct boss determination

    Hi all,
    I'm having problems in defining an Organizational structure with 3 levels to release PRs. Plant manager(PM) level, below this, Manager(M) and then Requisitioner(R).
    Saying that PM is the boss of M, PM must be Head of an Org. unit and M must be Head of another Org. unit below PM's Org. unit. Then R belongs to M Org. unit and consequently, M is his boss.
    In PR release strategy (SPRO), I say that the 1st level of release is position M. and the 2nd is position PM.
    So far, so good, but if I want the 3rd level of release (M1, between M and R), in the release strategy, it shouldn't be a fixed position because it will goes always to M instead of M1 (when M1 is the direct boss of R).
    Is there any way of saying that M and M1 are Managers to release and use this in release strategy, and then find the direct boss of R with a rule or something?
    I know it sounds confusing, but it's hard to expose hierarchies...
    Thanks

    Hi Nuno,
    Actually its not hard at all!  The Release Codes: Purchase Requisition table has an option to call a user-exit to find the person represented by the group/code - just set this to 9 to use user-exit M06B0001.  
    This is an old-style user-exit - i.e. you use transactions SMOD/CMOD to find the enhancement and fill in the user exit.
    In the user-exit you could then call function module RH_GET_ACTORS to call a workflow rule such as rule 168 to find the manager, or call RH_GET_STRUCTURE to read up the appropriate evaluation path e.g. A002, or SWX_GET_MANAGER directly to find the manager.
    Regards,
    Jocelyn

  • Rule with SELFITEM-SENDTASKDESCRITION task's workitem goes error

    Dear all,
               I have created a workflow with an activity step that uses business object SELFITEM and method SENDTASKDESCRIPTION  with rule AC00000168.
              On executing the WF, the workitem successfully goes to right agent.
              But, when the agent executes the workitem, it goes to error state.
              In the workflow log, I get the error message as "Exception occurred Error handling for work item 000000968991 eeom division 09.07.2010 - 11:28:52 " with exception 0,error type 1 and message 0.
              Following is binding details between workflow and task container.
    &MANAGER&      ->     &ADDRESSSTRINGS&
    &_ATTACH_OBJECTS&      ->     &ATTACHMENTS&
    &ATTENDANCEINSTANCE&     ->   &ATTENDANCE&
    &EXPRESS&     ->     &EXPRESS&
    &LANGUAGE& ->     &LANGUAGE&
    &LINEWIDTH&     ->     &LINEWIDTH&
    &TYPEID&     ->     &TYPEID&
    &SELFITEM&     ->     &_WI_OBJECT_ID&
            In the above binding parameter,MANAGER. is a workflow container of ABAP data dictionary type WFSYST-AGENT where the rule's agent is collected.
    Please suggest why the work item at agent inbox on execution goes error for which I will be grateful.
    Thanks and regards,
    S.Suresh

    Hello Rick !
            Thank you so much for your fruitful solution.
            Also, I am deeply sorry for delayed reply.
           I used the function module 'SWX_GET_MANAGER' in the custom method  as you suggested.
    BEGIN_METHOD FINDMANAGER CHANGING CONTAINER.
    DATA:
          EXTENDEDOBJECTID TYPE OBJEC-REALO,
          addresstype like soxna-type,
          RECIPIENTADDRESS TYPE SOXNA-FULLNAME.
    DATA:
          ac_container like swcont occurs 0 with
          addressstrings like soxna-fullname occu
      SWC_GET_ELEMENT CONTAINER 'ExtendedObjectID
    addresstype = 'G'.
    ac_container-element = 'OBJID'.
    ac_container-tab_index = '000001'.
    ac_container-elemlength = '008'.
    ac_container-type = 'N'.
    ac_container-value = EXTENDEDOBJECTID.
    append ac_container.
    ac_container-element = 'OTYPE'.
    ac_container-tab_index = '000001'.
    ac_container-elemlength = '002'.
    ac_container-type = 'C'.
    ac_container-value = 'P '.
    append ac_container.
      CALL FUNCTION 'SWX_GET_MANAGER'
        TABLES
          ACTOR_TAB = addressstrings
          AC_CONTAINER = ac_container
        EXCEPTIONS
          NOBODY_FOUND = 01
          OTHERS = 02.
      CASE SY-SUBRC.
       WHEN 0.            " OK
       WHEN 01.    " to be implemented
        WHEN OTHERS.       " to be implemented
      ENDCASE.
      loop at addressstrings.
      if addressstrings(2) = 'P '.
      delete addressstrings.
      endif.
      endloop.
    move addressstrings to recipientaddress.
      SWC_SET_ELEMENT CONTAINER 'RecipientAddress' RECIPIENTADDRESS.
    END_METHOD.
    Therafter, the values accumulated at RECIPIENTADDRESS is passed to the workflow container(SOXNA-FULLNAME) of SENDMAIL step.
    Also, I thank every one who contributed fruitful suggestions to solve my problem.
    Thanks and regards,
    S.Suresh

  • WS14500015 is not working for Multilevel approval

    We are trying to Implement the Workflow Template Ws14500015. We have implemented the BADI BBP_WFL_APPROVE_BADI. The workflow works perfectly for 1st level approval. We have checked that the ApproverList Container element gets pouplated with 3 levels of approval when 1 st level approver has not approved it. But as soon as the first level approver approves it this container element is updated with one entry. Please review the code I am attaching. Any help will be highly appreciated.
    METHOD if_ex_bbp_wfl_approv_badi~get_remaing_approvers .
    Interface parameters:
    OBJECT_ID                  TYPE  CRMT_OBJECT_ID                "Import
    OBJECT_TYPE                TYPE  CRMT_SUBOBJECT_CATEGORY       "Import
    GUID                       TYPE  BBP_GUID_32                   "Import
    ACTUAL_APPROVAL_INDEX      TYPE  SWH_NUMC10                    "Import
    APPROVAL_HISTORY_TABLE     TYPE  BBP_WFL_APPROVAL_HISTORY_BADI "Import
    ITEM_APPROVAL_HISTORY_TABLE TYPE BBPT_WFL_ITEM_APPROVAL_BADI   "Import
    APPROVAL_TABLE             TYPE  BBPT_WFL_APPROVAL_TABLE_BADI  "Export
    ITEM_APPROVAL_TABLE        TYPE  BBPT_WFL_ITEM_APPROVAL_BADI   "Export
    NO_FURTHER_APPROVAL_NEEDED TYPE  BOOLEAN                       "Export
    ITEM_APPROVAL_OBJ          TYPE  BBPT_WFL_ITEM_APPROVAL_OBJ  "Changing
    This a default implementation that gives idea about of how line item
    approval should work as well to find the number of approval required
    and to find the approvers.
    Global data---------------------------------------------------------*
    TYPES---------------------------------------------------------------*
      TYPES : ty_item_info    TYPE STANDARD TABLE OF /fir/rmm0bgst001.
                  "to have the necessary values of custom table .
    DATA----------------------------------------------------------------*
      DATA : it_item_info TYPE ty_item_info,"to store the approval values.
             wa_item_info TYPE /fir/rmm0bgst001. " work area for item_info.
      DATA : v_value_per_cctr TYPE bbp_value, " contain value per account
                                              " type in line item of SC
             v_value_per      TYPE bbp_value. " value for v_value_per_cctr
                                              " in USD
      DATA : v_apprv_value    TYPE bbp_value. " amount of first level.
      DATA:  v_call_value1    TYPE bbp_wfl_app_property,"have cost_ctr,
                              "asset_no or order_no value.
             v_co_code        TYPE bbp_wfl_app_property," have company code
             v_plant_value    TYPE bbp_wfl_app_property," have plant value
             v_account_type   TYPE bbp_wfl_app_criterion ," Account type
                              " ie COST_CTR, ASSET_NO or ORDER_NO.
             v_comp_code      TYPE bbp_wfl_app_criterion ,"COMP_CODE
             v_plant          TYPE bbp_wfl_app_criterion ," PLANT
             v_acc_desc       TYPE bbp_step_description ." approval desc.
    WORKAREA------------------------------------------------------------*
      DATA:  wa_header         TYPE bbp_pds_sc_header_d, " header of line
                                                         " item
    tables and work area.
             it_item           TYPE TABLE OF bbp_pds_sc_item_d,
                                            " line item details
             wa_item           TYPE bbp_pds_sc_item_d,
                                            " have one line item detail.
    accounting structures
             it_account        TYPE TABLE OF bbp_pds_acc,
                                            " account details
             wa_account        TYPE bbp_pds_acc .
                                            " one account details.
      DATA: v_req TYPE bbp_wfl_app_criterion. " for creator.
    CONSTANTS-----------------------------------------------------------*
    Business objects
      CONSTANTS:
       c_po            TYPE crmt_subobject_category_db VALUE 'BUS2201',
       c_shop          TYPE crmt_subobject_category_db VALUE 'BUS2121',
       c_contract      TYPE crmt_subobject_category_db VALUE 'BUS2000113'.
    Approval Criteria and properties used
      CONSTANTS:
        c_cost_centre  TYPE bbp_wfl_app_criterion  VALUE 'COST_CTR',
        c_order_no     TYPE bbp_wfl_app_criterion  VALUE 'ORDER_NO',
        c_asset_no     TYPE bbp_wfl_app_criterion  VALUE 'ASSET_NO',
        c_comp_code    TYPE bbp_wfl_app_criterion  VALUE 'COMP_CODE',
        c_plant        TYPE bbp_wfl_app_criterion  VALUE 'PLANT',
        c_cc_desc      TYPE bbp_step_description   VALUE
                                                 'Cost center approval',
        c_io_desc      TYPE bbp_step_description   VALUE
                                                 'Order type approval',
        c_as_desc      TYPE bbp_step_description   VALUE
                                                 'Asset Num approval',
        c_usd          TYPE char3 VALUE 'USD',
        c_m            TYPE char1 VALUE 'M',
        c_x            TYPE char1 VALUE 'X',
        c_apprv_times  TYPE char1 VALUE 3,
        c_1            TYPE char2 VALUE '1',
        c_as           TYPE BBP_ACC_CAT VALUE 'AS',
        c_or           TYPE BBP_ACC_CAT VALUE 'OR',
        c_cc           TYPE BBP_ACC_CAT VALUE 'CC',
        c_us           TYPE char2       VALUE 'US'.
    Case when the object type bus212...---------------------------------*
      CASE object_type.
        WHEN c_shop.
    -----------   shopping cart --------------------------------------- *
          IF NOT approval_table[] IS INITIAL.
            approval_history_table[] = approval_table[].
            item_approval_history_table[] = item_approval_table[].
            REFRESH  : approval_table, item_approval_table,
                    item_approval_obj   .
          ENDIF.
          REFRESH : it_item,it_account.
        Get the details of the shopping cart
          CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
            EXPORTING
              i_object_id = object_id
            IMPORTING
              e_header    = wa_header
            TABLES
              e_item      = it_item
              e_account   = it_account.
        Proceed if it_item is not initial.
          IF NOT it_item IS INITIAL AND NOT it_account IS INITIAL.
    *read the lt_item for plant
            READ TABLE it_item INTO wa_item INDEX 1.
    CHANGE FOR REQEUSTOR.
            CONCATENATE c_us wa_item-created_by INTO v_req.
          now read the table with wa_item-be_plant.
            SELECT *
              FROM /fir/rmm0bgst001
              INTO TABLE it_item_info
              WHERE zplant = wa_item-be_plant.
            SORT it_item BY guid .
            SORT it_account BY p_guid .
            IF actual_approval_index LE c_apprv_times AND
               actual_approval_index GE c_1.
          looping at it_item is done to fetch the approver for every
          line item
              CLEAR: wa_item, wa_account.
              LOOP AT it_item INTO wa_item WHERE del_ind IS INITIAL.
                LOOP AT it_account  INTO wa_account
                  WHERE p_guid = wa_item-guid.
    to calculate the amount before calling the funciton module for
    approval table.value respective to account type
                  v_value_per_cctr =
                  wa_account-distr_perc * wa_item-value / 100.
    read the table respective to account type and for level 1 approval
    such that if the value is less than zvalue then no approval required.
                  CLEAR: wa_item_info.
                  CASE wa_account-acc_cat .
                    WHEN c_or.
                       READ TABLE it_item_info INTO wa_item_info
                        WITH KEY zlevel = c_1   " 1
                       zorder_no = wa_account-order_no
                       zplant    = wa_item-be_plant.
                    WHEN c_as.
                       READ TABLE it_item_info INTO wa_item_info
                        WITH KEY zlevel = c_1   " 1
                       zasset_no = wa_account-asset_no
                       zplant    = wa_item-be_plant.
                    WHEN c_cc.
                       READ TABLE it_item_info INTO wa_item_info
                        WITH KEY zlevel = c_1     " 1
                       zcost_ctr = wa_account-cost_ctr
                       zplant    = wa_item-be_plant.
                  ENDCASE.
                  IF sy-subrc = 0.
                    v_apprv_value = wa_item_info-zvalue.
                  ENDIF.
                now convert the amount to local currency ie usd
                  CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
                    EXPORTING
                    CLIENT                  = SY-MANDT
                      date                    = sy-datum
                      foreign_amount          = v_value_per_cctr
                      foreign_currency        = wa_item-currency
                      local_currency          = c_usd
                     type_of_rate            = c_m
                     read_tcurr              = c_x
                   IMPORTING
                     local_amount            = v_value_per
                   EXCEPTIONS
                     no_rate_found           = 1
                     overflow                = 2
                     no_factors_found        = 3
                     no_spread_found         = 4
                     derived_2_times         = 5
                     OTHERS                  = 6
                  IF v_value_per GE v_apprv_value AND sy-subrc = 0.
    To Find out Account id of what type ie cost center/IO/Asset.
                    IF wa_account-acc_cat eq c_cc.
                      v_call_value1 = wa_account-cost_ctr.
                      v_account_type = c_cost_centre.
                      v_acc_desc  = c_cc_desc. "'Cost center approval'.
                    ELSEIF wa_account-acc_cat eq c_or.
                      v_call_value1 = wa_account-order_no.
                      v_account_type = c_order_no.
                      v_acc_desc  = c_io_desc. "'Internal Order approval'.
                    ELSE.
                   IF NOT wa_account-asset_no IS INITIAL.
                      v_call_value1 = wa_account-asset_no.
                      v_account_type = c_asset_no..
                      v_acc_desc  = c_as_desc. "'Asset Number approval'.
                   ENDIF.
                    ENDIF.
                  Defining the PLANT and plant value.
                    v_plant = c_plant.
                    v_plant_value = wa_item-be_plant.
                  defining the COMPNAY CODE and company value.
                    v_comp_code = c_comp_code.
                    v_co_code   = wa_item-be_co_code.
                  Calling the Custom function to find the approvers.
                    CALL FUNCTION '/FIR/RP2P0BGS_ITEM_APPRV_GET'
                      EXPORTING
                        sc_guid                    = wa_header-guid
                        item_guid                  = wa_item-guid
                        approval_description       = v_acc_desc
                        hide_items_not_responsible = c_x "'X'
    each cost center approver should see only items he is responsible
                        criterion1                 = v_account_type
                        criterion2                 = v_comp_code
                        criterion3                 = v_plant
                        value1                     = v_call_value1
                        value2                     = v_co_code
                        value3                     = v_plant_value
                        approval_index           = actual_approval_index
                      TABLES
                        it_item_info               = it_item_info
                      CHANGING
                        approval_table             = approval_table
                        item_approval_table        = item_approval_table
                        item_approval_obj          = item_approval_obj.
                  ENDIF." end if if value per cost center is more than
                  " level one price.
                  CLEAR wa_account.
                ENDLOOP. " end of loop of account.
                CLEAR:  wa_account,wa_item, wa_item_info.
              ENDLOOP. " end of loop at item
    CHANGE FOR REQUESTOR.----
              DELETE approval_table WHERE approval_agent = v_req.
              IF approval_table IS INITIAL.
                no_further_approval_needed = c_x. " 'X'.
              ENDIF.
            ELSE. " end of if actual_approval_index le 3.
            this BADI-implementation defines 3 steps
              no_further_approval_needed = c_x. "'X'.
            ENDIF.
          ENDIF. " end of if the it_item is not initial.
      ENDCASE. "end of case if bus type is 2121
    ENDMETHOD.
    Function Module
    FUNCTION /fir/rp2p0bgs_item_apprv_get .
    ""Local Interface:
    *"  IMPORTING
    *"     REFERENCE(SC_GUID) TYPE  BBP_GUID OPTIONAL
    *"     REFERENCE(ITEM_GUID) TYPE  BBP_GUID OPTIONAL
    *"     REFERENCE(APPROVAL_DESCRIPTION) TYPE  BBP_STEP_DESCRIPTION
    *"       OPTIONAL
    *"     REFERENCE(HIDE_ITEMS_NOT_RESPONSIBLE) TYPE  BOOLEAN OPTIONAL
    *"     REFERENCE(CRITERION1) TYPE  BBP_WFL_APP_CRITERION OPTIONAL
    *"     REFERENCE(CRITERION2) TYPE  BBP_WFL_APP_CRITERION DEFAULT ''
    *"     REFERENCE(CRITERION3) TYPE  BBP_WFL_APP_CRITERION DEFAULT ''
    *"     REFERENCE(VALUE1) TYPE  BBP_WFL_APP_PROPERTY DEFAULT ''
    *"     REFERENCE(VALUE2) TYPE  BBP_WFL_APP_PROPERTY DEFAULT ''
    *"     REFERENCE(VALUE3) TYPE  BBP_WFL_APP_PROPERTY DEFAULT ''
    *"     REFERENCE(APPROVAL_INDEX) TYPE  SWH_NUMC10 OPTIONAL
    *"  TABLES
    *"      IT_ITEM_INFO STRUCTURE  /FIR/RMM0BGST001
    *"  CHANGING
    *"     REFERENCE(APPROVAL_TABLE) TYPE  BBPT_WFL_APPROVAL_TABLE_BADI
    *"     REFERENCE(ITEM_APPROVAL_TABLE) TYPE  BBPT_WFL_ITEM_APPROVAL_BADI
    *"     REFERENCE(ITEM_APPROVAL_OBJ) TYPE  BBPT_WFL_ITEM_APPROVAL_OBJ
    *"       OPTIONAL
    Local data-----------------------------------------------------------*
      TYPES: ty_option TYPE STANDARD TABLE OF rfc_db_opt,
             ty_fields TYPE STANDARD TABLE OF rfc_db_fld,
             ty_data   TYPE STANDARD TABLE OF tab512.
      DATA:
        wa_approval_table      TYPE bbp_wfl_approval_table_badi,
        wa_item_approval_table TYPE bbps_wfl_item_approval,
        wa_approval_def        TYPE /fir/rmm0bgst001.
      DATA:
        v_app_obj_guid           TYPE bbp_guid_32,
        v_is_new_approval_object TYPE boolean.
      DATA : it_update_tab   TYPE STANDARD TABLE OF /fir/rmm0bgst001,
             it_approval_def TYPE STANDARD TABLE OF /fir/rmm0bgst001,
             wa_update_tab   TYPE /fir/rmm0bgst001.
      DATA : it_actor_tab    TYPE STANDARD TABLE OF swhactor,
             wa_actor_tab    TYPE swhactor,
             it_ac_container TYPE STANDARD TABLE OF swcont,
             wa_ac_container TYPE swcont.
      DATA : it_options TYPE ty_option,
             it_fields  TYPE ty_fields,
             it_data    TYPE ty_data.
      DATA : wa_options TYPE  rfc_db_opt,
             wa_fields  TYPE  rfc_db_fld,
             wa_data    TYPE  tab512.
      DATA : v_apprv_io TYPE aufuser2,
             v_apprv_cc TYPE verak.
      DATA : v_cost_ctr  TYPE  bbp_wfl_app_property ,
             v_order_no  TYPE  bbp_wfl_app_property ,
             v_asset_no  TYPE  bbp_wfl_app_property ,
             v_as_value  TYPE  bbp_wfl_app_property .
      DATA : v_query_table   TYPE dd02l-tabname.
      DATA : v_apprv_count   TYPE char1 VALUE '0'.
    to find the number of lines in the table it_update_tab.
      DATA : v_lines TYPE i.
      DATA : v_app_ind TYPE swh_numc10 VALUE '0'.
      DATA : v_destination   TYPE char10,
             v_system        TYPE sysysid,
             v_mandt         TYPE symandt.
    Constants-----------------------------------------------------------*
      CONSTANTS:
        c_clnt          TYPE char4 VALUE 'CLNT',
        c_agent_is_user TYPE otype VALUE 'US',
        c_x             TYPE char1 VALUE 'X',
        c_cost_centre   TYPE bbp_wfl_app_criterion  VALUE 'COST_CTR',
        c_order_no      TYPE bbp_wfl_app_criterion  VALUE 'ORDER_NO',
        c_asset_no      TYPE bbp_wfl_app_criterion  VALUE 'ASSET_NO',
        c_csks          TYPE char4 VALUE 'CSKS',
        c_anlz          TYPE char4 VALUE 'ANLZ',
        c_coas          TYPE char4 VALUE 'COAS',
        c_verak         TYPE char5 VALUE 'VERAK',
        c_user2         TYPE char5 VALUE 'USER2',
        c_kostl         TYPE char5 VALUE 'KOSTL',
        c_aufnr         TYPE char5 VALUE 'AUFNR',
        c_bukrs         TYPE char5 VALUE 'BUKRS',
        c_anln1         TYPE char5 VALUE 'ANLN1',
        c_c             TYPE char1 VALUE 'C',
        c_and           TYPE char3 VALUE 'AND',
        c_eq            TYPE char1 VALUE '=',
        c_org_object    TYPE swc_elem VALUE 'ORG_OBJECT',
        c_deli          TYPE char1 VALUE '|',
        c_l12           TYPE ddleng VALUE '000012',
        c_off0          TYPE doffset VALUE '000000',
        c_l10           TYPE ddleng VALUE '000010',
        c_l20           TYPE ddleng VALUE '000020',
        c_l04           TYPE ddleng VALUE '000004',
        c_ind01         TYPE swc_index VALUE '000001',
        c_el06          TYPE swc_length VALUE '006',
        c_tab_name      TYPE tabname  VALUE '/fir/rmm0bgst001',
        c_r10           TYPE sysysid VALUE 'R10',
        c_r15           TYPE sysysid VALUE 'R15',
        c_r20           TYPE sysysid VALUE 'R20',
        c_r40           TYPE sysysid VALUE 'R40',
        c_e10           TYPE sysysid VALUE 'E10',
        c_e15           TYPE sysysid VALUE 'E15',
        c_e20           TYPE sysysid VALUE 'E20',
        c_e40           TYPE sysysid VALUE 'E40',
        c_121           TYPE symandt VALUE '121',
        c_300           TYPE symandt VALUE '300',
        c_100           TYPE symandt VALUE '100',
        c_120           TYPE symandt VALUE '120',
    begin of change for generic entry 06-06-2007----
        c_cc            TYPE kostl   VALUE 'CC',
        c_as            TYPE anln1   VALUE 'AS',
        c_or            TYPE aufnr   VALUE 'OR'.
    end of change for generic entry 06-06-2007----
    -perpare the system and client for RFC----
      CASE sy-sysid .
        WHEN c_r10.                                             "' R10'.
          IF sy-mandt = c_120.                                  " '120'.
            CONCATENATE c_e10 c_clnt c_121 INTO v_destination.
          ENDIF.
        WHEN c_r15.                                             " 'R15'.
          IF sy-mandt = c_120.                                  " '120'.
            CONCATENATE c_e15 c_clnt c_300 INTO v_destination.
          ENDIF.
        WHEN c_r20.                                             " 'R20'.
          IF sy-mandt = c_300.                                  " '300'.
            CONCATENATE c_e20 c_clnt c_300 INTO v_destination.
          ENDIF.
        WHEN c_r40.                                             " 'R40'.
          IF sy-mandt = c_100.                                  " '100'.
            CONCATENATE c_e40 c_clnt c_100 INTO v_destination.
          ENDIF.
      ENDCASE.
    Comment on logic ---------------------------------------------------*
    First find the right approval object the item belongs to.
    All items of an approval object are approved together in
    this approval step, and therefore only one workitem is
    created for this items.
      CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET'
        EXPORTING
          sc_guid                 = sc_guid
          criterion1              = criterion1
          value1                  = value1
       IMPORTING
    If 2 items of the same shopping cart have the same
    values for the criterias, this function returns the
    same (!!!) approval object guid
         approval_obj_guid       = v_app_obj_guid
        TABLES
         item_app_obj            = item_approval_obj
    Check what type of account is ie Order no/Internal order/ASSET.
    if the account type is asset_no then responsible cost center is
    found.
      CLEAR: it_update_tab, wa_update_tab.
      CASE criterion1 .
        WHEN c_asset_no.    " 'ASSET_NO'.
          v_asset_no = value1.
          CONCATENATE c_anln1 c_eq value1 " 'ANLN1' '=' value1
            c_and c_bukrs c_eq value2 INTO wa_options-text
            SEPARATED BY space.
          APPEND wa_options TO it_options.
          wa_fields-fieldname = c_anln1.                        " 'ANLN1'.
          wa_fields-length    = c_l12.                          " '000012'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.      " 'C'.
          APPEND wa_fields TO it_fields.
          wa_fields-fieldname = c_kostl.  " 'KOSTL'.
          wa_fields-length    = c_l10.                          " '000010'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.      " 'C'.
          APPEND wa_fields TO it_fields.
          wa_fields-fieldname = c_bukrs.  " 'BUKRS'.
          wa_fields-length    = c_l04.                          " '000004'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.      " 'C'.
          APPEND wa_fields TO it_fields.
          CALL FUNCTION 'RFC_READ_TABLE' DESTINATION v_destination
            EXPORTING
              query_table          = c_anlz  " 'ANLZ'
              delimiter            = c_deli  " '|'
            TABLES
              OPTIONS              = it_options
              fields               = it_fields
              data                 = it_data
            EXCEPTIONS
              table_not_available  = 1
              table_without_data   = 2
              option_not_valid     = 3
              field_not_valid      = 4
              not_authorized       = 5
              data_buffer_exceeded = 6
              OTHERS               = 7.
          IF sy-subrc = 0.
          as it_data table contains only one record
          so no sorting required.
            READ TABLE it_data INTO wa_data INDEX 1.
            v_as_value = wa_data-wa+13(10).
          ENDIF.
        at the end of this if asset is passed its responsible
        cost is obtained and is placed in value1 field.
          CLEAR : wa_data , wa_options , wa_fields .
          REFRESH: it_data , it_options , it_fields .
          v_cost_ctr = v_as_value.
          CONCATENATE c_kostl c_eq v_cost_ctr INTO wa_options-text
          SEPARATED BY space.
          APPEND wa_options TO it_options.
          CLEAR: wa_fields.
          wa_fields-fieldname = c_verak.   " 'VERAK'.
          wa_fields-length    = c_l20.                          " '000020'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.        " 'C'.
          APPEND wa_fields TO it_fields.
          CLEAR: wa_fields.
          wa_fields-fieldname = c_kostl.    " 'KOSTL'.
          wa_fields-length    = c_l10.                          " '000010'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.        " 'C'.
          APPEND wa_fields TO it_fields.
          v_query_table = c_csks. " 'CSKS'.
        set the initial value of v_asset_no by value1.
          CLEAR: v_cost_ctr .
          v_asset_no = value1.
        WHEN c_cost_centre . " 'COST_CTR' or 'ASSET_NO'.
          v_cost_ctr = value1.
          CONCATENATE c_kostl c_eq v_cost_ctr INTO wa_options-text
          SEPARATED BY space.
          APPEND wa_options TO it_options.
          CLEAR: wa_fields.
          wa_fields-fieldname = c_verak.   " 'VERAK'.
          wa_fields-length    = c_l20.                          " '000020'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.        " 'C'.
          APPEND wa_fields TO it_fields.
          CLEAR: wa_fields.
          wa_fields-fieldname = c_kostl.    " 'KOSTL'.
          wa_fields-length    = c_l10.                          " '000010'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.        " 'C'.
          APPEND wa_fields TO it_fields.
          v_query_table = c_csks. " 'CSKS'.
        WHEN c_order_no.    " 'ORDER_NO'.
          v_order_no = value1.
          CONCATENATE c_aufnr c_eq value1 INTO wa_options-text
          SEPARATED BY space.
          APPEND wa_options TO it_options.
          CLEAR: wa_fields.
          wa_fields-fieldname = c_user2.                        " 'USER2'.
          wa_fields-length    = c_l20.                          " '000020'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.      " 'C'.
          APPEND wa_fields TO it_fields.
          CLEAR: wa_fields.
          wa_fields-fieldname = c_aufnr.   " 'AUFNR'.
          wa_fields-length    = c_l12.                          " '000012'.
          wa_fields-offset    = c_off0.                         " '000000'.
          wa_fields-type      = c_c.        " 'C'.
          APPEND wa_fields TO it_fields.
          v_query_table = c_coas. " 'COAS'.
      ENDCASE.
      LOOP AT it_item_info INTO wa_update_tab
        WHERE
              zplant    = value3       AND
              zcost_ctr = v_cost_ctr AND
              zorder_no = v_order_no AND
              zasset_no = v_asset_no.
        APPEND wa_update_tab TO it_update_tab .
      ENDLOOP.
    -begin of change for generic entry 06-06-2007----
    it_update_tab may or may not contain the value as the per the data
    maintainted. if initial then only generic value is maintained and the
    the record need to be appended.
    so the record which need to be appended shud be appended to
    it_update_tab appropiatly with the amt of generic entry.
      CLEAR : wa_update_tab.
      CASE criterion1 .
        WHEN c_asset_no.
          READ TABLE it_item_info INTO wa_update_tab WITH KEY
          zplant = value3
          zasset_no = c_as."'AS'
          IF sy-subrc = 0.
            wa_update_tab-zasset_no = v_asset_no .
            wa_update_tab-zlevel    = 1.
            APPEND wa_update_tab TO it_update_tab.
          ENDIF.
        WHEN c_cost_centre.
          READ TABLE it_item_info INTO wa_update_tab WITH KEY
          zplant = value3
          zcost_ctr = c_cc."'CC'
          IF sy-subrc = 0.
            wa_update_tab-zcost_ctr = v_cost_ctr .
            wa_update_tab-zlevel    = 1.
            APPEND wa_update_tab TO it_update_tab.
          ENDIF.
        WHEN c_order_no.
          READ TABLE it_item_info INTO wa_update_tab WITH KEY
          zplant = value3
          zorder_no = c_or."'OR'
          IF sy-subrc = 0.
            wa_update_tab-zorder_no = v_order_no .
            wa_update_tab-zlevel    = 1.
            APPEND wa_update_tab TO it_update_tab.
          ENDIF.
      ENDCASE.
    end of change for generic entry 06-06-2007----
    RFC to read table for finding the person responsible for the
    cost center / order ie approver.
      CALL FUNCTION 'RFC_READ_TABLE' DESTINATION v_destination
        EXPORTING
          query_table          = v_query_table
          delimiter            = c_deli   "'|'
        TABLES
          OPTIONS              = it_options
          fields               = it_fields
          data                 = it_data
        EXCEPTIONS
          table_not_available  = 1
          table_without_data   = 2
          option_not_valid     = 3
          field_not_valid      = 4
          not_authorized       = 5
          data_buffer_exceeded = 6
          OTHERS               = 7.
      IF sy-subrc = 0.
        CLEAR :wa_approval_def.
        READ TABLE it_data INTO wa_data INDEX 1.
        IF v_query_table = c_csks.    " 'CSKS'.
          v_apprv_cc = wa_data-wa+0(20).
          wa_approval_def-zapprover = v_apprv_cc.
        ELSE.
          v_apprv_io = wa_data-wa+0(20).
          wa_approval_def-zapprover = v_apprv_io.
        ENDIF.
      ENDIF.
      find the number of record in the update table.
      DESCRIBE TABLE it_update_tab LINES v_lines.
      The updation of table runs only for the number of records
      avaiable in the  update table ie v_lines.
      DO v_lines TIMES.        " begin of do to approval index times.
         CLEAR: it_approval_def.
        v_apprv_count = v_apprv_count + 1.
        wa_approval_def-zlevel    = v_apprv_count .
      if the count is more than one then next level of approver
      is found using the rfc call swx_get_manager and stored as per.
        IF v_apprv_count > 1.
          v_apprv_count = v_apprv_count - 1.
          READ TABLE it_update_tab INTO wa_update_tab
               WITH KEY zlevel = v_apprv_count .
          IF sy-subrc = 0 .
    NOW FOR FINDING THE SECOND LEVEL OF APPROVER
    1ST LEVEL OF APPROVER IS FOUND USING ABOVE READ.
    THE FIRST LEVEL OF APPROVER IS USED TO FIND THE SECOND
    LEVEL OF APPROVER USING THE SWX_GET_MANAGER.
    PREPARE THE TABLES FOR SWX_GET_MANAGER
            REFRESH : it_ac_container.
            wa_ac_container-element = c_org_object. " 'ORG_OBJECT'.
            wa_ac_container-tab_index = c_ind01.                " '000001'.
            wa_ac_container-elemlength = c_el06.                " '006'.
            wa_ac_container-type       = c_c.   " 'C'.
            CONCATENATE c_agent_is_user wa_update_tab-zapprover
            INTO wa_ac_container-value .
            APPEND wa_ac_container TO it_ac_container.
            CALL FUNCTION 'SWX_GET_MANAGER' DESTINATION v_destination
              TABLES
                actor_tab    = it_actor_tab
                ac_container = it_ac_container
              EXCEPTIONS
                nobody_found = 1
                OTHERS       = 2.
            IF sy-subrc = 0.
              READ TABLE it_actor_tab INTO wa_actor_tab WITH KEY
                   otype = c_agent_is_user.
              wa_approval_def-zapprover = wa_actor_tab-objid.
            ENDIF.
          ENDIF.
          v_apprv_count = v_apprv_count + 1.
        ENDIF.
      before updating populate the table it_approval_def
      it_update_tab is read based on next v_apprv_count and
      updates the approver and its value.
        READ TABLE it_update_tab INTO wa_update_tab
               WITH KEY zlevel = v_apprv_count .
        IF sy-subrc = 0.
          wa_approval_def-zplant = wa_update_tab-zplant.
          wa_approval_def-zcost_ctr = wa_update_tab-zcost_ctr.
          wa_approval_def-zorder_no = wa_update_tab-zorder_no.
          wa_approval_def-zasset_no = wa_update_tab-zasset_no.
          wa_approval_def-zvalue = wa_update_tab-zvalue.
          APPEND wa_approval_def TO it_approval_def.
    modify the table it_update_tab so that along with the custom
    database table the table in use in this function module ie
    it_update_tab also remain updated.
    benefit is that if the modify to dtab fails. the process works fine.
          MODIFY it_update_tab FROM wa_approval_def
                   TRANSPORTING zapprover
                   WHERE zlevel = wa_approval_def-zlevel AND
                         zvalue = wa_approval_def-zvalue.
      now enqueue the table for modification.
          CALL FUNCTION 'ENQUEUE_E_TABLE'
            EXPORTING
              tabname        = c_tab_name       " '/fir/rmm0bgst001'
            EXCEPTIONS
              foreign_lock   = 1
              system_failure = 2
              OTHERS         = 3.
          now modify the table, for updation of approver.
          IF sy-subrc = 0.
            MODIFY /fir/rmm0bgst001 FROM wa_approval_def.
            if sy-subrc goes 0 commit work is called.
            also the it_update_tab need to be updated.
            IF sy-subrc = 0.
              COMMIT WORK.
            ENDIF.
          ENDIF.
      now dequeue the table after the updation.
          CALL FUNCTION 'DEQUEUE_E_TABLE'
            EXPORTING
              tabname = c_tab_name.     " '/fir/rmm0bgst001'.
        ENDIF.
        once all done clear the work areas.
        CLEAR : wa_approval_def-zlevel , wa_approval_def-zapprover.
      ENDDO.                               " END OF DO STATEMENT.
      SORT it_approval_def BY zlevel ASCENDING.
    as per the logic for the different level of approval.
    for second level of approval only records above 2 should be
    present in the apprval table.
    so for approval index = 2 delete the first record ie for zlevel  = 1.
    and for approval index = 3 delete first two records ie zlevel = 1 and
    zlevel = 2. thus only one approval of zlevel 3 is left in the table
    which is used to update the approval table.
      IF approval_index = 2 .
        DELETE it_approval_def INDEX 1.
      ELSEIF approval_index = 3.
        DELETE it_approval_def INDEX 1.
        DELETE it_approval_def INDEX 1.
      ELSEIF approval_index GT 3.
        REFRESH : it_approval_def .
      ENDIF.
    for above 3 as approval index there shud be no enteries in the table.
    so the table is refreshed and thus the approval table will not
    contain anything.
    approval_index is assigned to a varaiable
      v_app_ind = approval_index.
    v_app_ind is incremented for every next record so that approver is
    assigned to next approval index.
    beign of change 28th may 2007----
    clear : v_app_ind .
    v_app_ind = v_app_ind + 1.
      LOOP AT it_approval_def INTO wa_approval_def.
        wa_approval_table-approval_index       = v_app_ind.
        CONCATENATE c_agent_is_user wa_approval_def-zapprover
        INTO wa_approval_table-approval_agent.
        wa_approval_table-approval_description = approval_description.
        wa_approval_table-approval_object_guid = v_app_obj_guid.
        wa_approval_table-hide_items_not_responsible =
                                hide_items_not_responsible.
        APPEND wa_approval_table TO approval_table.
        v_app_ind = v_app_ind + 1 .
        CLEAR: wa_approval_def.
      ENDLOOP.
      sort the approval table so that approvers come in sequence.
      SORT approval_table BY approval_index.
    ENDIF.
    fill item table (which items belongs to which approval object)
      wa_item_approval_table-approval_object_guid = v_app_obj_guid.
      wa_item_approval_table-approval_item_guid   = item_guid.
      APPEND wa_item_approval_table TO item_approval_table.
      CLEAR :wa_item_approval_table,wa_approval_table,it_update_tab.
    ENDFUNCTION.
    Thanks
    Arghadip
    [email protected]

    Hi,
    You have to debug the entire system behaviour , the approval process using the second approver.
    As first step , please check the security level of the second approver. Restart of workflow is based on the security level of the approver.
    you can find the parameter for security level in the personalization tab of the user .
    there is one function module  which determines wether the workflow should be restarted (or) not.
    i do not remember the exact name of the function module.
    1)start transaction se37
    2)enter bbpwflrestart*.
    3) system will return a number of function modules , of them one function module determines wether to restart the workflow (or) not.
    Please check what does the above function module return for the user and the shopping cart , there will be one parameter 'restart' which triggers the start

Maybe you are looking for