Need Help in Item-based Approval SC

Mohan Babu K J mohanbabusap at yahoo.com
Fri Oct 31 01:28:36 EDT 2008


Hi,

I'm Mohan Babu. I have made a copy of WS14500015 and making changes in my custom workflow based on my requirement. I'm implementing the BADI to get all the approvers. There are three set of approvers like Financial Approvers, Functional Approvers and Operational Approvers. 
Financial Approvers will have maximum of 3 level which is based on company code, cost centre and value of line item. Functional will be 1 level approval which is based on company code, product category and value of line item. Operational will be maximum of 4 levels which is based on product category and value of line item. 
As of now, it picks the agent properly and displays the different approvers for different line items. But when I execute the SC from one user, it disappears from other userid but he is approver for another line item. 
I'm attaching my code here. Please review and suggest me what should I need to do.
***********************************************************************
METHOD if_ex_bbp_wfl_approv_badi~get_remaing_approvers.
  INCLUDE <swfcntn01>.
  DATA:
     ls_header         TYPE bbp_pds_sc_header_d,
     ls_con_hd         TYPE bbp_pds_ctr_header_d,
* approval object related structures
     ls_approver       TYPE bbp_wfl_approval_table_badi,
     ls_approver_a     TYPE bbp_wfl_approval_table_badi,
     ls_approver_b     TYPE bbp_wfl_approval_table_badi,
     lt_approver       TYPE TABLE OF bbp_wfl_approval_table_badi,
     ls_item_app_obj   TYPE bbps_wfl_item_approval_obj,
     lt_item_app_obj   TYPE TABLE OF bbps_wfl_item_approval_obj,
     ls_approval_def   TYPE bbpt_wfl_lia_def,
* tables for different approval criteria
     lt_appr_def       TYPE TABLE OF bbpt_wfl_lia_def,
     lv_call_crit1     TYPE bbp_wfl_app_criterion,
     lv_call_value1    TYPE bbp_wfl_app_property,
* approval item fields and structures
     ls_approval_item  TYPE bbps_wfl_item_approval,
     lt_approval_items TYPE TABLE OF bbps_wfl_item_approval,
     lv_approval_index TYPE bbp_wfl_approval_table_badi-approval_index,
     lv_guid           TYPE crmt_object_guid,
     ev_app_obj_guid   TYPE bbp_guid_32,
     lv_object_value   TYPE bbp_wfl_lia_value,
     lv_def_value      TYPE bbp_wfl_lia_value,
     lv_object_found   LIKE syst-subrc,
     lv_ob_tbx         LIKE syst-tabix,
* item fields and structures
     ls_item           TYPE bbp_pds_sc_item_d,
     lt_item           TYPE STANDARD TABLE OF bbp_pds_sc_item_d,
     ls_account        TYPE bbp_pds_acc,
     lt_account        TYPE TABLE OF bbp_pds_acc,
     ls_con_item       TYPE bbp_pds_ctr_item_d,
     lt_con_item       TYPE STANDARD TABLE OF bbp_pds_ctr_item_d.

*  CONSTANTS:
*      c_agent_is_user TYPE otype VALUE 'US'.

*** 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'.

  CONSTANTS: c_cctype TYPE zobjtyp VALUE 'K',
             c_shop TYPE crmt_subobject_category_db VALUE 'BUS2121',
             c_contract TYPE crmt_subobject_category_db VALUE 'BUS2000113',
             c_item_value_desc  TYPE bbp_step_description
                       VALUE 'Item Value Approval',
             c_crit_cocd   TYPE bbp_wfl_app_criterion VALUE 'Company',
             c_crit_cat    TYPE bbp_wfl_app_criterion VALUE 'Category',
             c_crit_cstc   TYPE bbp_wfl_app_criterion VALUE 'CostCentre',
             c_item_value  TYPE bbp_wfl_app_criterion  VALUE 'ITEM_VALUE',
             c_hide_items_flag(1) TYPE c VALUE 'X'.
  TYPES: BEGIN OF x_pos,
          guid  TYPE crmt_object_guid,
          objid TYPE hrp1001-objid,
         END OF x_pos.
  TYPES: BEGIN OF x_objid,
          otype TYPE otype,
          objid TYPE hrobjid,
          sclas TYPE sclas,
          sobid TYPE sobid,
         END OF x_objid.
  TYPES: BEGIN OF x_objid1,
          otype TYPE otype,
          objid TYPE hrobjid,
          sclas TYPE sclas,
          sobid TYPE but000-partner,
         END OF x_objid1.
  TYPES: BEGIN OF x_pernr,
          partner TYPE bu_partner,
          persnumber TYPE but000-persnumber,
         END OF x_pernr.
  TYPES: BEGIN OF x_user,
          persnumber TYPE usr21-persnumber,
          bname TYPE sy-uname,
         END OF x_user.
  DATA: lo_new_instance TYPE swf_bor_object,
        lo_user         TYPE swf_bor_object.
  DATA: l_index TYPE sy-index,
        l_itm_val     TYPE BBP_WFL_APP_PROPERTY,
        l_cnt TYPE i,
        l_cnt1 TYPE i,
        l_cnt2 TYPE i,
        l_ccode TYPE bukrs,
        l_ccentre TYPE kostl,
        l_prodcat TYPE bbp_category_id,
        l_partner TYPE hrobjid,
        l_flag(1),
        l_value1 type BBP_WFL_APP_PROPERTY,
        l_value2 type BBP_WFL_APP_PROPERTY,
        l_value3 type BBP_WFL_APP_PROPERTY,
        l_total TYPE zvlow,
        l_guid TYPE crmt_object_guid,
        lv_app_guid   TYPE bbp_guid_32,
        lf_new_guid   TYPE boolean,
        l_branch_ind TYPE swh_numc10,
        l_fin_index TYPE swh_numc10,
        l_func_index TYPE swh_numc10,
        l_oper_index TYPE swh_numc10.
  DATA: lt_pos TYPE TABLE OF x_pos,
        ls_pos TYPE x_pos.
  DATA: lt_pos1 TYPE TABLE OF x_pos.
  DATA: lt_objid TYPE TABLE OF x_objid,
        ls_objid TYPE x_objid.
  DATA: lt_objid1 TYPE TABLE OF x_objid1,
        ls_objid1 TYPE x_objid1.
  DATA: lt_pernr TYPE TABLE OF x_pernr,
        ls_pernr TYPE x_pernr,
        lt_user  TYPE TABLE OF x_user,
        ls_user  TYPE x_user.
  DATA: lt_fd TYPE TABLE OF zsrm_mt_fd,
        ls_fd TYPE zsrm_mt_fd.
  DATA: lt_od TYPE TABLE OF zsrm_mt_od,
        ls_od TYPE zsrm_mt_od.
  DATA: lt_cont TYPE TABLE OF zsrm_mt_cont_od,
        ls_cont TYPE zsrm_mt_cont_od,
        ls_fun TYPE zsrm_mt_function.
  DATA: lt_1001 TYPE TABLE OF p1001,
        ls_1001 TYPE p1001.
  DATA: lt_1001t TYPE TABLE OF p1001,
        ls_1001t TYPE p1001.
* map char32 to raw16
  MOVE guid TO lv_guid.
  IF object_type = c_shop.
    CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
      EXPORTING
        i_guid      = lv_guid
        i_object_id = object_id
      IMPORTING
        e_header    = ls_header
      TABLES
        e_item      = lt_item
        e_account   = lt_account.

    LOOP AT lt_item INTO ls_item WHERE del_ind IS INITIAL.
      REFRESH: lt_fd, lt_od.
      l_index = l_index + 1.
      IF ls_item-value GE 1000.
        MOVE ls_item-be_co_code TO l_ccode.
        MOVE ls_item-category_id TO l_prodcat.
        READ TABLE lt_account INTO ls_account WITH KEY p_guid = ls_item-guid.
        IF sy-subrc = 0.
          MOVE ls_account-cost_ctr TO l_ccentre.
        ENDIF.
        SELECT * FROM zsrm_mt_fd INTO TABLE lt_fd
                              WHERE ccode  = l_ccode
                              AND   objtyp = c_cctype
                              AND   objid  = l_ccentre.
        SELECT SINGLE * FROM zsrm_mt_function INTO ls_fun
                              WHERE ccode   = l_ccode
                              AND   prodcat = l_prodcat.
        SELECT * FROM zsrm_mt_od INTO TABLE lt_od
                              WHERE prodcat = l_prodcat.
        SORT lt_fd BY ccode objtyp objid vlow vhigh.
        DELETE lt_fd WHERE vlow > ls_item-value.
        DESCRIBE TABLE lt_fd LINES l_cnt.
        IF l_cnt > 3.
          DELETE lt_fd FROM 4.
          l_cnt = 3.
        ENDIF.
        SORT lt_od BY prodcat vlow vhigh.
        DELETE lt_od WHERE vlow > ls_item-value.
        DESCRIBE TABLE lt_od LINES l_cnt2.
        IF l_cnt2 > 4.
          DELETE lt_od FROM 5.
          l_cnt2 = 4.
        ENDIF.
        IF NOT ls_fun IS INITIAL.
          l_cnt1 = 1.
        ENDIF.

*** the item guid is set to all 'approval item' entries - this table
*** provides a link between the approval object (defined by its GUID)
*** and the line item in the shopping cart
        ls_approval_item-approval_item_guid = ls_item-guid.
        LOOP AT lt_fd INTO ls_fd.
          ls_pos-objid = ls_fd-posnumb.
          move l_ccode to l_value1.
          move l_ccentre  to l_value2.
          CASE sy-tabix.
            WHEN '0000000001'.
              l_itm_val = 'LOW'.
            WHEN '0000000002'.
              l_itm_val = 'MEDIUM'.
            WHEN '0000000003'.
              l_itm_val = 'HIGH'.
          ENDCASE.
          CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET'
            EXPORTING
             sc_guid                       = ls_header-guid
             criterion1                    = c_crit_cocd
             criterion2                    = c_crit_cstc
             criterion3                    = c_item_value
             value1                        = l_value1
             value2                        = l_value2
             value3                        = l_itm_val
*             IV_ITEM_VALUE                = 0
*             IV_ADD_VALUE                 =
           IMPORTING
             approval_obj_guid             = ls_approval_item-approval_object_guid
*             IS_NEW_APPROVAL_OBJECT       =
            TABLES
              item_app_obj                 = lt_item_app_obj
                    .
          APPEND ls_approval_item TO lt_approval_items.
          ls_pos-guid = ls_approval_item-approval_object_guid.
          APPEND ls_pos TO lt_pos.
          CLEAR: ls_pos,
                 ls_fd.
        ENDLOOP.
        IF NOT ls_fun IS INITIAL.
          ls_pos-objid = ls_fun-posnumb1.
          l_itm_val = ls_item-value.
          move l_ccode to l_value1.
          move l_prodcat to l_value2.
          CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET'
            EXPORTING
              sc_guid                      = ls_header-guid
              criterion1                   = c_crit_cocd
             criterion2                    = c_crit_cat
             criterion3                    = c_item_value
             value1                        = l_value1
             value2                        = l_value2
             value3                        = l_itm_val
*             IV_ITEM_VALUE                = 0
*             IV_ADD_VALUE                 =
           IMPORTING
             approval_obj_guid            = ls_approval_item-approval_object_guid
*             IS_NEW_APPROVAL_OBJECT       =
            TABLES
              item_app_obj                 = lt_item_app_obj
                    .
          APPEND ls_approval_item TO lt_approval_items.
          ls_pos-guid = ls_approval_item-approval_object_guid.
          APPEND ls_pos TO lt_pos.
          CLEAR ls_pos.
        ENDIF.
        LOOP AT lt_od INTO ls_od.
          IF NOT ls_od-posnumb01 IS INITIAL.
            ls_pos-objid = ls_od-posnumb01.
          ELSEIF NOT ls_od-posnumb02 IS INITIAL.
            ls_pos-objid = ls_od-posnumb02.
          ELSEIF NOT ls_od-posnumb03 IS INITIAL.
            ls_pos-objid = ls_od-posnumb03..
          ELSEIF NOT ls_od-posnumb04 IS INITIAL.
            ls_pos-objid = ls_od-posnumb04.
          ENDIF.
          CASE sy-tabix.
            WHEN '0000000001'.
              l_itm_val = 'LOW'.
            WHEN '0000000002'.
              l_itm_val = 'MEDIUM'.
            WHEN '0000000003'.
              l_itm_val = 'HIGH'.
          ENDCASE.
          move l_prodcat to l_value1.
          CALL FUNCTION 'BBP_WFL_DIN_APP_OBJ_GET'
            EXPORTING
              sc_guid                      = ls_header-guid
              criterion1                   = c_crit_cat
             criterion2                    = c_item_value
             value1                        = l_value1
             value2                        = l_itm_val
*             IV_ITEM_VALUE                = 0
*             IV_ADD_VALUE                 =
           IMPORTING
             approval_obj_guid            = ls_approval_item-approval_object_guid
*             IS_NEW_APPROVAL_OBJECT       =
            TABLES
              item_app_obj                 = lt_item_app_obj
                    .
          APPEND ls_approval_item TO lt_approval_items.
          ls_pos-guid = ls_approval_item-approval_object_guid.
          APPEND ls_pos TO lt_pos.
          CLEAR: ls_pos, ls_od.
        ENDLOOP.
        APPEND LINES OF lt_pos TO lt_pos1.
      ENDIF.
      CLEAR: ls_approval_item,
             ls_item,
             l_ccode,
             l_ccentre,
             ls_account,
             l_cnt, l_cnt1, l_cnt2.
      REFRESH: lt_pos.
    ENDLOOP.
*passing all the position id in one table so that it will be able to fetch
*user id for those position

    CLEAR: l_index, l_branch_ind..
    l_flag = 'X'.
    lt_pos[] = lt_pos1[].
    LOOP AT lt_approval_items INTO ls_approval_item.
      REFRESH: lt_1001, lt_1001t.
      IF l_flag = 'X'.
        l_flag = ''.
        l_guid = ls_approval_item-approval_item_guid.
        l_branch_ind = l_branch_ind + 1.
      ENDIF.
      IF l_guid <> ls_approval_item-approval_item_guid.
        CLEAR l_index.
        l_flag = 'X'.
      ENDIF.
      ls_approver-approval_description = c_item_value_desc.
      ls_approver-hide_items_not_responsible = c_hide_items_flag.
      ls_approver-approval_object_guid = ls_approval_item-approval_object_guid.
      LOOP AT lt_pos INTO ls_pos WHERE guid = ls_approval_item-approval_object_guid.
        REFRESH: lt_1001.
        CALL FUNCTION 'RH_READ_INFTY'
          EXPORTING
            plvar                = '01'
            otype                = 'S'
            objid                = ls_pos-objid
            infty                = '1001'
            istat                = '1'
            begda                = sy-datum
            endda                = sy-datum
          TABLES
            innnn                = lt_1001
          EXCEPTIONS
            all_infty_with_subty = 1
            nothing_found        = 2
            no_objects           = 3
            wrong_condition      = 4
            wrong_parameters     = 5
            OTHERS               = 6.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
        SORT lt_1001 BY begda.
        DELETE lt_1001 WHERE sclas <> 'CP' AND relat <> '008'.
        LOOP AT lt_1001 INTO ls_1001.
          l_partner = ls_1001-sobid+0(8).
          CALL FUNCTION 'RH_READ_INFTY'
            EXPORTING
              plvar                = '01'
              otype                = 'CP'
              objid                = l_partner
              infty                = '1001'
              istat                = '1'
              begda                = sy-datum
              endda                = sy-datum
            TABLES
              innnn                = lt_1001t
            EXCEPTIONS
              all_infty_with_subty = 1
              nothing_found        = 2
              no_objects           = 3
              wrong_condition      = 4
              wrong_parameters     = 5
              OTHERS               = 6.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.
          SORT lt_1001t BY begda.
          DELETE lt_1001t WHERE sclas <> 'US'.
          LOOP AT lt_1001t INTO ls_1001t.
            l_index = l_index + 1.
            ls_approver-approval_index = l_index.
            ls_approver-approval_branch = l_branch_ind.
            swf_create_object  lo_user  'USR01' ls_1001t-sobid.
            swf_get_property lo_user 'Name' ls_approver-name.
            CONCATENATE 'US' ls_1001t-sobid INTO ls_approver-approval_agent.
            APPEND ls_approver TO lt_approver.
            CLEAR ls_1001t.
          ENDLOOP.
          CLEAR: ls_1001.
        ENDLOOP.
        CLEAR: ls_pos.
      ENDLOOP.
      CLEAR: ls_approver.
    ENDLOOP.
  ELSE.
    no_further_approval_needed = 'X'.
  ENDIF.
  approval_table[] = lt_approver[].
  item_approval_table[] = lt_approval_items[].
  item_approval_obj[] = lt_item_app_obj[].
ENDMETHOD.

 **************************************************************************Regards,
JMB


      Be the first one to try the new Messenger 9 Beta! Go to http://in.messenger.yahoo.com/win/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.mit.edu/pipermail/sap-wug/attachments/20081031/c23a3370/attachment.htm
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: GET REMAINING APPROVERS.txt
Url: http://mailman.mit.edu/pipermail/sap-wug/attachments/20081031/c23a3370/attachment.txt
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: GET REMAINING APPROVERS.txt
Url: http://mailman.mit.edu/pipermail/sap-wug/attachments/20081031/c23a3370/attachment-0001.txt


More information about the SAP-WUG mailing list