Need Help in Item-based Approval SC

Imthiaz ahmed simthiaz at hotmail.com
Fri Oct 31 10:04:22 EDT 2008


I think you are missing a check after calling FM "BBP_WFL_DIN_APP_OBJ_GET", you need to add this part

*** Check if this approval object already exists in the approval
*** table
  READ TABLE approval_table INTO ls_approval_table
          WITH KEY approval_object_guid = lv_app_obj_guid
                   approval_index       = approval_index.
  IF sy-subrc EQ 4.
    lv_is_new_approval_object = 'X'.
  ENDIF.

Refer to the sample BADI implementation.
Imthiaz Ahmed
'Putting things right between two people is charity' - Hadith

> From: sap-wug-request at mit.edu
> Subject: SAP-WUG Digest, Vol 47, Issue 38
> To: sap-wug at mit.edu
> Date: Fri, 31 Oct 2008 01:29:18 -0400
> 
> Send SAP-WUG mailing list submissions to
> 	sap-wug at mit.edu
> 
> To subscribe or unsubscribe via the World Wide Web, visit
> 	http://mailman.mit.edu/mailman/listinfo/sap-wug
> or, via email, send a message with subject or body 'help' to
> 	sap-wug-request at mit.edu
> 
> You can reach the person managing the list at
> 	sap-wug-owner at mit.edu
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of SAP-WUG digest..."
> 
> 
> Today's Topics:
> 
>    1. Need Help in Item-based Approval SC (Mohan Babu K J)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Fri, 31 Oct 2008 10:58:36 +0530 (IST)
> From: Mohan Babu K J <mohanbabusap at yahoo.com>
> Subject: Need Help in Item-based Approval SC
> To: sap-wug at mit.edu
> Message-ID: <369414.55281.qm at web94702.mail.in2.yahoo.com>
> Content-Type: text/plain; charset="utf-8"
> 
> 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/GETREMAININGAPPROVERS.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/GETREMAININGAPPROVERS-0001.txt
> 
> ------------------------------
> 
> _______________________________________________
> SAP-WUG mailing list
> SAP-WUG at mit.edu
> http://mailman.mit.edu/mailman/listinfo/sap-wug
> 
> 
> End of SAP-WUG Digest, Vol 47, Issue 38
> ***************************************

_________________________________________________________________
Stay organized with simple drag and drop from Windows Live Hotmail.
http://windowslive.com/Explore/hotmail?ocid=TXT_TAGLM_WL_hotmail_102008
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.mit.edu/pipermail/sap-wug/attachments/20081031/5c52f183/attachment.htm


More information about the SAP-WUG mailing list