cancel
Showing results for 
Search instead for 
Did you mean: 

WF question

Former Member
0 Kudos

Hi,

We use the BADI "Determination of Approver for n-Step Dynamic Approval Workflow" (i.e. <b>BBP_WFL_APPROV_BADI</b>) to create our workflow.

We have 4 levels of approval... for example :

(1) Level "buyer" --> <b>USER1</b>

(2) Level "controller" --> USER2

(3) Level "manager1" --> <b>USER1</b>

(4) Level "manager2" --> USER3

Normally, for each level of approval, there is a distinct and different user.

But in the case (as seen above) if the same user appears more than once in the workflow for a shopping basket, we want to automatically set it to "approved" so that the user doesn't have to do it manually (excpet the first time).

How can I accomplish this?? It seems in the BADI there's no possibility to force an approval state....

Thanks,

Tim

Accepted Solutions (0)

Answers (3)

Answers (3)

Former Member
0 Kudos

Thanks for your insight,

Actually I want to keep this step in my WorkFlow and set it as "approved" automatically, so that this USER1 will not have to approve twice... just the first time. You see what I mean?

Thanks,

Tim

Former Member
0 Kudos

Hi

As i have already provide with the sample code .. Do you need anything else. ?

As I told you earlier, You can do the same by implementing the final Apporver table as per your need. The Approver once have approved, will not be allowed to approve the Shopping cart again.

I am still not sure, What exactly you are looking for now ?

Please elaborate.

Hope this will help.

Please reward suitable points.

Regards

- Atul

Former Member
0 Kudos

Hi

<b>Here is one sample code for your reference</b>.

METHOD if_ex_bbp_wfl_approv_badi~get_remaing_approvers.
* -------------------------------------------------------------------- *
* Interface parameters:
* -------------------------------------------------------------------- *
* OBJECT_ID                  TYPE  CRMT_OBJECT_ID                "Import
* OBJECT_TYPE                TYPE  CRMT_SUBOBJECT_CATEGORY       "Import
* GUID                       TYPE  BBP_GUID_32                   "Import
* ACTUAL_APPROVAL_INDEX      TYPE  SWH_NUMC10                    "Import
* APPROVAL_HISTORY_TABLE     TYPE  BBP_WFL_APPROVAL_HISTORY_BADI "Import
* ITEM_APPROVAL_HISTORY_TABLE TYPE BBPT_WFL_ITEM_APPROVAL_BADI   "Import
* APPROVAL_TABLE             TYPE  BBPT_WFL_APPROVAL_TABLE_BADI  "Export
* ITEM_APPROVAL_TABLE        TYPE  BBPT_WFL_ITEM_APPROVAL_BADI   "Export
* NO_FURTHER_APPROVAL_NEEDED TYPE  BOOLEAN                       "Export
* ITEM_APPROVAL_OBJ          TYPE  BBPT_WFL_ITEM_APPROVAL_OBJ  "Changing
* -------------------------------------------------------------------- *

* This is the 2nd example of the BADI implementation that includes
* dynamic spending limit approval for PO

  INCLUDE <swfcntn01>.                  "Workflow

  DATA:
   ls_header                   TYPE bbp_pds_sc_header_d,
   ls_approver                 TYPE bbp_wfl_approval_table_badi,
   lv_approval_index           TYPE swh_numc10,
   lv_guid                     TYPE crmt_object_guid,
   lo_new_instance             TYPE swf_bor_object,
   lt_approval_agent_obj       TYPE TABLE OF swf_bor_object,
   ls_wa_agent_obj             TYPE swf_bor_object,
   lo_user                     TYPE swf_bor_object,
   ls_approval_agent           TYPE bbp_wfl_approval_table,
   lv_index                    TYPE syindex,
   lv_usr01_name               TYPE ad_namtext,
   lt_approval_init_agents     TYPE TABLE OF bbp_wfl_approval_table,
   ls_wa_approval_init_agents  TYPE bbp_wfl_approval_table,
   ls_wa_approval_history      TYPE bbps_wfl_history_line_badi.

* Business objects type (local constants)
  CONSTANTS:
   c_po            TYPE crmt_subobject_category_db VALUE 'BUS2201',
   c_biddingdoc    TYPE crmt_subobject_category_db VALUE 'BUS2200',
   c_quotation     TYPE crmt_subobject_category_db VALUE 'BUS2202',
   c_grse          TYPE crmt_subobject_category_db VALUE 'BUS2203',
   c_invoice       TYPE crmt_subobject_category_db VALUE 'BUS2205',
   c_shop          TYPE crmt_subobject_category_db VALUE 'BUS2121',
   c_contract      TYPE crmt_subobject_category_db VALUE 'BUS2000113',
   c_salescontract TYPE crmt_subobject_category_db VALUE 'BUS2000114',
   c_avl           TYPE crmt_subobject_category_db VALUE 'BUS2206',
   c_invoicegrp    TYPE crmt_subobject_category_db VALUE 'BUS2207',
   c_vendor_obj    TYPE crmt_subobject_category_db VALUE 'BUS1006200'.

*** workflow approval states
  CONSTANTS:
   c_wf_approved           TYPE  bbp_wfl_approvalstate VALUE '0',
   c_wf_rejected           TYPE  bbp_wfl_approvalstate VALUE '1',
   c_wf_not_instanced      TYPE  bbp_wfl_approvalstate VALUE '2',
   c_wf_changed            TYPE  bbp_wfl_approvalstate VALUE '3',
   c_wf_partialapproved    TYPE  bbp_wfl_approvalstate VALUE '4',
   c_wf_step_in_process    TYPE  bbp_wfl_approvalstate VALUE '5'.


  CLEAR: lt_approval_init_agents[], lt_approval_agent_obj[],
         ls_wa_agent_obj, ls_approval_agent, ls_wa_approval_init_agents,
         ls_wa_approval_history.

* -------------------------------------------------------------------- *
* map input data to local data
* map char32 to raw16
  MOVE guid TO lv_guid.


  CASE object_type.

* ======================   shopping cart  =========================== *
    WHEN c_shop.
*** get the details of the shopping cart
      CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
        EXPORTING
          i_guid      = lv_guid
          i_object_id = object_id
        IMPORTING
          e_header    = ls_header.

      IF ls_header-total_value < 490000000.
*** 2 step approval
        CASE actual_approval_index.
          WHEN 0.
            ls_approver-approval_index = 1.
            ls_approver-approval_agent = 'USMANAGER1'.
            ls_approver-name = 'Arthur Manager1'.
            ls_approver-approval_description = 'First approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER2'.
            ls_approver-name = 'Arnold Manager2'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER4'.
            ls_approver-name = 'Thomas Manager4'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.

          WHEN 1.
            ls_approver-approval_index = 1.
            ls_approver-approval_agent = 'USMANAGER1'.
            ls_approver-name = 'Arthur Manager1'.
            ls_approver-approval_description = 'First approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER2'.
            ls_approver-name = 'Arnold Manager2'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER4'.
            ls_approver-name = 'Thomas Manager4'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
          WHEN 2.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER2'.
            ls_approver-name = 'Arnold Manager2'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER4'.
            ls_approver-name = 'Thomas Manager4'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
          WHEN OTHERS.
            no_further_approval_needed = 'X'.
        ENDCASE.
      ELSE.
        CASE actual_approval_index.
*** 3 step approval
          WHEN 0.
            ls_approver-approval_index = 1.
            ls_approver-approval_agent = 'USMANAGER1'.
            ls_approver-name = 'Arthur Manager1'.
            ls_approver-approval_description = 'First approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER2'.
            ls_approver-name = 'Arnold Manager2'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER4'.
            ls_approver-name = 'Thomas Manager4'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 3.
            ls_approver-approval_agent = 'USMANAGER3'.
            ls_approver-name = 'Peter Manager3'.
            ls_approver-approval_description = 'Third approval step'.
            APPEND ls_approver TO approval_table.
          WHEN 1.
            ls_approver-approval_index = 1.
            ls_approver-approval_agent = 'USMANAGER1'.
            ls_approver-name = 'Arthur Manager1'.
            ls_approver-approval_description = 'First approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER2'.
            ls_approver-name = 'Arnold Manager2'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER4'.
            ls_approver-name = 'Thomas Manager4'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 3.
            ls_approver-approval_agent = 'USMANAGER3'.
            ls_approver-name = 'Peter Manager3'.
            ls_approver-approval_description = 'Third approval step'.
            APPEND ls_approver TO approval_table.

          WHEN 2.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER2'.
            ls_approver-name = 'Arnold Manager2'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.
            ls_approver-approval_index = 2.
            ls_approver-approval_agent = 'USMANAGER4'.
            ls_approver-name = 'Thomas Manager4'.
            ls_approver-approval_description = 'Second approval step'.
            APPEND ls_approver TO approval_table.

            ls_approver-approval_index = 3.
            ls_approver-approval_agent = 'USMANAGER3'.
            ls_approver-name = 'Peter Manager3'.
            ls_approver-approval_description = 'Third approval step'.
            APPEND ls_approver TO approval_table.
          WHEN 3.
            ls_approver-approval_index = 3.
            ls_approver-approval_agent = 'USMANAGER3'.
            ls_approver-name = 'Peter Manager3'.
            ls_approver-approval_description = 'Third approval step'.
            APPEND ls_approver TO approval_table.
          WHEN OTHERS.
            no_further_approval_needed = 'X'.
        ENDCASE.
      ENDIF.


* ======================  purchase order ============================= *
    WHEN c_po.

*** 1) Evaluate the list of spending limit approvers from BOR attributes
      swf_create_object  lo_new_instance  object_type   guid.
      swf_get_property   lo_new_instance 'SLManagerUserList'
                                          lt_approval_agent_obj[].
      lv_index = 1.
      LOOP AT lt_approval_agent_obj INTO ls_wa_agent_obj.
        swf_get_property ls_wa_agent_obj 'User' lo_user.
        swf_get_property lo_user 'NameWithLeadingUS'
                                ls_approval_agent-approval_agent.

        swf_get_property lo_user 'Name' lv_usr01_name.
        MOVE lv_usr01_name TO ls_approval_agent-name.

        ls_approval_agent-approval_index = lv_index.
        ls_approval_agent-approval_branch = 1.
        ls_approval_agent-initial_index = lv_index.
        ls_approval_agent-initial_agent =
                             ls_approval_agent-approval_agent.
        ls_approval_agent-approval_state = c_wf_not_instanced.
        APPEND ls_approval_agent TO lt_approval_init_agents.
        lv_index = lv_index + 1.
      ENDLOOP.

*** 2) Evaluate the list of remaining approvers. The actual approver
***    belongs to the list as well.
      LOOP AT approval_history_table INTO
                   ls_wa_approval_history WHERE type <> 'I'.
        LOOP AT lt_approval_init_agents INTO
                                  ls_wa_approval_init_agents.
          IF ls_wa_approval_init_agents-approval_index LT
                    ls_wa_approval_history-approval_index.
            DELETE lt_approval_init_agents.
          ENDIF.
        ENDLOOP.
      ENDLOOP.
* fill the import table
      CLEAR ls_wa_approval_init_agents.
      LOOP AT lt_approval_init_agents INTO
                                ls_wa_approval_init_agents.
        CLEAR ls_wa_approval_history.
        MOVE-CORRESPONDING ls_wa_approval_init_agents TO
                                          ls_wa_approval_history.
        APPEND ls_wa_approval_history TO approval_table.
      ENDLOOP.

      IF approval_table[] IS INITIAL.
        no_further_approval_needed = 'X'.
      ENDIF.

* ========================  contract ================================ *
    WHEN c_quotation.

      IF lv_index LT 2.

        ls_approval_agent-approval_description = '1st Approval'.

        ls_approval_agent-approval_index = 1.
        ls_approval_agent-approval_branch = 1.
        ls_approval_agent-initial_index = 1.
        ls_approval_agent-name = 'Hennes Kaempfer'.
        ls_approval_agent-approval_agent = 'USMANAGER4'.
        ls_approval_agent-approval_state = c_wf_not_instanced.
        APPEND ls_approval_agent TO approval_table.

        ls_approval_agent-approval_index = 1.
        ls_approval_agent-approval_branch = 1.
        ls_approval_agent-initial_index = 1.
        ls_approval_agent-name = 'Paul Reiter'.
        ls_approval_agent-approval_agent = 'USMANAGER5'.
        ls_approval_agent-approval_state = c_wf_not_instanced.
        APPEND ls_approval_agent TO approval_table.

        ls_approval_agent-approval_description = '2nd Approval'.

        ls_approval_agent-approval_index = 2.
        ls_approval_agent-approval_branch = 1.
        ls_approval_agent-initial_index = 2.
        ls_approval_agent-name = 'Dieter Mueller'.
        ls_approval_agent-approval_agent = 'USMANAGER33'.
        ls_approval_agent-approval_state = c_wf_not_instanced.
        APPEND ls_approval_agent TO approval_table.

      ELSE.
        no_further_approval_needed = 'X'.
      ENDIF.

  ENDCASE.

ENDMETHOD.

Hope this will help.

<b>Please reward suitable points.</b>

Regards

- Atul

Former Member
0 Kudos

Hi

This is very much possible. We have done the same quite a times.

In the final <b>approval_table</b> table created in this BADI, you sort the approvers based on their ID and then delete the adjacent duplicates comparing the Id.

*---- Delet the duplicate approvers

SORT approver_table BY APPROVAL_AGENT.

DELETE ADJACENT DUPLICATES FROM approver_table COMPARING APPROVAL_AGENT.

Hope this will help.

Regards

- Atul