Spend Management Blogs by Members
Check out community member blog posts about spend management and SAP Ariba, SAP Fieldglass, and SAP Concur solutions. Post or comment about your experiences.
cancel
Showing results for 
Search instead for 
Did you mean: 
konstantin_anikeev
Active Contributor
0 Kudos

Process: purchase requisition sourcing in SRM.

Requirement: requester of shopping cart must be defined via customer logic. In standard SAP solution requester is always an RFC-User (acces from PI System).

Remarks:

  • Following solution was designed and tested for SRM 7.01 SP 5, for tha purchase requisition transfer via SOA. If you use another version of SRM or PR transfer via RFC - you may need another solution.
  • Solution is realized with enhancements and modifications of standard SAP code. So no warranty and support from SAP.

Solution

Utility class

First of all you may need to create a customer utility class for requester determination.

Class will have a public static attribute and one method.

This attribute indicates the process of shopping cart creation from purchase requisition. Before creation attribute is set ot true, at the end - to false.

Value of the attribute will be used during creation process to differentiate shopping cart creation direct in SRM and via SOA.

Method get_requester is served to get user name of requester for shopping cart. Method implements customer logic and has only one returning parameter RV_UNAME type XUBNAME.

METHOD get_requester.
  rv_requestor = 'KANIKEEV'. " Here you should define your customer logic
ENDMETHOD.

Enhancements

For this solution you may need to enhance/modify following methods.

First you need to enhance proxy class, which is responsible for XML processing. You may find this class via SPROXY transaction for Interface PurchaseRequestERPSourcingRequest_In.

/SAPSRM/CL_PUR_REQ_ERP_SRC_REQ->/SAPSRM/II_PUR_REQ_ERP_SRC_REQ~PUR_REQ_ERPSRC_REQ

Here you need to create pre- and post-enhancements

Pre-enhancement: ZKSH_EXT_REQ_UTIL=>MV_EXT_REQ_CREATION = ABAP_TRUE.

Post-enhancement: ZKSH_EXT_REQ_UTIL=>MV_EXT_REQ_CREATION = ABAP_FALSE.

/SAPSRM/CL_PDO_BO_SC->GET_REQUESTER_OF_FIRST_ITEM

Here you need to create a post-enhancement.

IF abap_true = zksh_ext_req_utils=>mv_ext_req_creation.
  rv_uname = zksh_ext_req_utils=>get_requester( ).
ENDIF.

/SAPSRM/CL_CH_SOA_DO_MAP_PARTN->CONSTRUCTOR

Here you need to create a post-enhancement.

  DATA lv_requester TYPE xubname.
  IF iv_create_user_context EQ abap_true.
* Instantiate user context
    TRY.
      lv_requester = zksh_ext_req_utils=>get_requester( ).
      CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_us_context_prov
        EXPORTING
          iv_user            = lv_requester
          iv_application     = iv_application
        RECEIVING
          ro_us_context_prov = mo_user_context.
    CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
    ENDTRY.
  ENDIF.

/SAPSRM/CL_CH_SOA_DO_MAP_PLANT=>CONSTRUCTOR

Here you need to create a post-enhancement.

DATA lv_requester TYPE xubname.
TRY.
  lv_requester = zksh_ext_req_utils=>get_requester( ).
  CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_us_context_prov
    EXPORTING
      iv_user            = lv_requester
      iv_application     = iv_application
    RECEIVING
      ro_us_context_prov = mo_user_context.
CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
   mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
ENDTRY.

/SAPSRM/CL_CH_SOA_DO_MAP_SHTOL->CONSTRUCTOR

Here you need to create a post-enhancement.

DATA lv_requester TYPE xubname.
TRY.
   lv_requester = zksh_ext_req_utils=>get_requester( ).
   CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_user_context
      EXPORTING
        iv_user         = lv_requester
        iv_application  = iv_application
      RECEIVING
        ro_user_context = mo_user_context.
  CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
    mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
ENDTRY.

/SAPSRM/CL_SOA_PUR_REQ->CREATE_PDO_SC_INSTANCE

Here you need to create a overwrite-enhancement.

METHOD iow_zksh_ei_cl_soa_pur_req~create_pdo_sc_instance.
*"------------------------------------------------------------------------*
*" Declaration of Overwrite-method, do not insert any comments here please!
*"
*"methods CREATE_PDO_SC_INSTANCE .
*"------------------------------------------------------------------------*
    DATA:
      lo_pdo_message_handler TYPE REF TO /sapsrm/if_pdo_msg_consumer.
* Exceptions
    DATA:
      lx_pdo_wf_mode_ban      TYPE REF TO /sapsrm/cx_pdo_wf_mode_ban,
      lx_pdo_wrong_bus_type   TYPE REF TO /sapsrm/cx_pdo_wrong_bus_type,
      lx_pdo_pd_read_error    TYPE REF TO /sapsrm/cx_pdo_pd_read_error,
      lx_pdo_lock_failed      TYPE REF TO /sapsrm/cx_pdo_lock_failed,
      lx_pdo_no_authorizatio  TYPE REF TO /sapsrm/cx_pdo_no_authorizatio,
      lx_pdo_parameter_error  TYPE REF TO /sapsrm/cx_pdo_parameter_error,
      lx_pdo_status_error     TYPE REF TO /sapsrm/cx_pdo_status_error,
      lx_pdo_incons_user      TYPE REF TO /sapsrm/cx_pdo_incons_user,
      lx_pdo_error            TYPE REF TO /sapsrm/cx_pdo_error,
      lx_pdo_abort            TYPE REF TO /sapsrm/cx_pdo_abort.
    DATA lv_requester TYPE xubname.
    TRY.
*     Create Shopping Cart instance
        lv_requester = zksh_ext_req_utils=>get_requester( ).
        CALL METHOD /sapsrm/cl_pdo_factory_sc_adv=>create_new_instance
          EXPORTING
            iv_uname           = lv_requester
            iv_bosubtype       = 'ER'
          IMPORTING
            eo_message_handler = lo_pdo_message_handler
            eo_sc_instance     = me->core_object->mo_pdo_pr.
        zsrmcln_ext_req_utils=>set_pdo( me->core_object->mo_pdo_pr ).
      CATCH /sapsrm/cx_pdo_wf_mode_ban INTO lx_pdo_wf_mode_ban.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_wf_mode_ban ).
      CATCH /sapsrm/cx_pdo_wrong_bus_type INTO lx_pdo_wrong_bus_type.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_wrong_bus_type ).
      CATCH /sapsrm/cx_pdo_pd_read_error INTO lx_pdo_pd_read_error.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_pd_read_error ).
      CATCH /sapsrm/cx_pdo_lock_failed INTO lx_pdo_lock_failed.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_lock_failed ).
      CATCH /sapsrm/cx_pdo_no_authorizatio INTO lx_pdo_no_authorizatio.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_no_authorizatio ).
      CATCH /sapsrm/cx_pdo_parameter_error INTO lx_pdo_parameter_error.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_parameter_error ).
      CATCH /sapsrm/cx_pdo_status_error INTO lx_pdo_status_error.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_status_error ).
      CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_incons_user.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_incons_user ).
      CATCH /sapsrm/cx_pdo_abort INTO lx_pdo_abort.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_abort ).
      CATCH /sapsrm/cx_pdo_error INTO lx_pdo_error.
        me->core_object->mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_error ).
    ENDTRY.
    CALL METHOD me->core_object->mo_msg_hdlr->set_message_consumer
      EXPORTING
        io_message_handler = lo_pdo_message_handler.
  ENDMETHOD.                    "IOW_ZKSH_EI_CL_SOA_PUR_REQ~CREATE_PDO_SC_INSTANCE

Modifications

/SAPSRM/CL_CH_SOA_DO_PR_ITM->CONSTRUCTOR

METHOD constructor.
  DATA : ls_ipt LIKE LINE OF mt_allowed_ipt,
         lt_limit_ipt LIKE   mt_allowed_ipt.
* Exceptions
  DATA:
    lx_pdo_icons_user      TYPE REF TO /sapsrm/cx_pdo_incons_user.
  CALL METHOD super->constructor
    EXPORTING
      io_base_mapper = io_base_mapper
      io_msg_hdlr    = io_msg_hdlr.
* Instantiate DOs
  me->init_do( ).
* Set node name
  me->mv_node_name = 'PR_ITEM'(001).    "#EC *
* Instantiate user context
  TRY.
*{   REPLACE        **********                                        1
*\      CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_user_context
*\        EXPORTING
*\          iv_user         = sy-uname
*\          iv_application  = iv_application
*\        RECEIVING
*\          ro_user_context = mo_user_context.
      DATA lv_requester TYPE xubname.
      IF abap_true = zksh_ext_req_utils=>mv_ext_req_creation.
        lv_requester = zksh_ext_req_utils=>get_requester( ).
      ELSE.
        lv_requester = sy-uname.
      ENDIF.
      CALL METHOD /sapsrm/cl_pdo_factory_user=>get_instance_user_context
        EXPORTING
          iv_user         = lv_requester
          iv_application  = iv_application
        RECEIVING
          ro_user_context = mo_user_context.
*}   REPLACE
    CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_icons_user.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_icons_user ).
  ENDTRY.
**** Get the Hierarchy Template and Store it
  CALL METHOD /sappssrm/cl_ih_cust_prov=>get_template_from_trans_type
    EXPORTING
      iv_process_type       = 'EXTR'
    RECEIVING
      rv_hierarchy_template = mv_hier_template.
**** FILL THE HIERARCHY TEMPLATE and Allowed IPT's.
  CALL METHOD /sappssrm/cl_ih_cust_prov=>get_allowed_ipt_full
    EXPORTING
      iv_hier_templ  = mv_hier_template
      iv_object_type = 'BUS2121'
    RECEIVING
      rt_ipt         = mt_allowed_ipt.
  READ TABLE mt_allowed_ipt INTO ls_ipt WITH KEY ps_ctrl_key = '0001'.
  CALL METHOD /sappssrm/cl_ih_cust_prov=>get_allowed_ipt_full
    EXPORTING
      iv_hier_templ  = mv_hier_template
      iv_object_type = 'BUS2121'
      iv_ps_ipt      = ls_ipt-ps_ipt
    RECEIVING
      rt_ipt         = lt_limit_ipt.
  APPEND LINES OF lt_limit_ipt TO mt_allowed_ipt.
  SORT mt_allowed_ipt BY ps_ctrl_key.
  DELETE ADJACENT DUPLICATES FROM mt_allowed_ipt COMPARING ps_ctrl_key.
ENDMETHOD.

/SAPSRM/CL_CH_SOA_DO_PR_ITM->ADD_ITEM

METHOD add_item.
* Exceptions
  DATA:
    lx_pdo_no_authorizatio TYPE REF TO /sapsrm/cx_pdo_no_authorizatio,
    lx_pdo_abort           TYPE REF TO /sapsrm/cx_pdo_abort,
    lx_pdo_incons_user     TYPE REF TO /sapsrm/cx_pdo_incons_user,
    lx_pdo_curr_error      TYPE REF TO /sapsrm/cx_pdo_curr_error,
    lx_pdo_cat_not_allowed TYPE REF TO /sapsrm/cx_pdo_cat_not_allowed,
    lx_pdo_prd_not_unique  TYPE REF TO /sapsrm/cx_pdo_prd_not_unique,
    lx_pdo_prd_not_found   TYPE REF TO /sapsrm/cx_pdo_prd_not_found.
  TRY.
*{   REPLACE        **********                                        1
*\      CALL METHOD io_pdo_sc->/sapsrm/if_pdo_bo_sc~add_item
*\        EXPORTING
*\          iv_uname           = sy-uname
*\          is_item            = is_bbp_item
*\          iv_account_from_pr = iv_account_from_pr
*\        IMPORTING
*\          es_return          = es_return
*\        CHANGING
*\          co_message_handler = mo_pdo_consumer.
      DATA lv_user TYPE xubname.
      DATA lo_us_context TYPE REF TO /sapsrm/if_pdo_user_context.
      lo_us_context = /sapsrm/cl_pdo_factory_user=>get_buffered_user_context( ).
      IF lo_us_context IS BOUND.
        lv_user = lo_us_context->/sapsrm/if_pdo_us_context_cons~get_user( ).
      ELSEIF abap_true = zksh_ext_req_utils=>mv_ext_req_creation.
        lv_user = zksh_ext_req_utils=>get_requester( ).
      ELSE.
        lv_user = sy-uname.
      ENDIF.
      CALL METHOD io_pdo_sc->/sapsrm/if_pdo_bo_sc~add_item
        EXPORTING
          iv_uname           = lv_user
          is_item            = is_bbp_item
          iv_account_from_pr = iv_account_from_pr
        IMPORTING
          es_return          = es_return
        CHANGING
          co_message_handler = mo_pdo_consumer.
*}   REPLACE
    CATCH /sapsrm/cx_pdo_cat_not_allowed INTO lx_pdo_cat_not_allowed.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_cat_not_allowed ).
    CATCH /sapsrm/cx_pdo_no_authorizatio INTO lx_pdo_no_authorizatio .
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_no_authorizatio ).
    CATCH /sapsrm/cx_pdo_abort INTO lx_pdo_abort.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_abort ).
    CATCH /sapsrm/cx_pdo_incons_user INTO lx_pdo_incons_user .
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_incons_user ).
    CATCH /sapsrm/cx_pdo_curr_error INTO lx_pdo_curr_error.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_curr_error  ).
    CATCH /sapsrm/cx_pdo_prd_not_unique INTO lx_pdo_prd_not_unique.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_prd_not_unique  ).
    CATCH /sapsrm/cx_pdo_prd_not_found INTO lx_pdo_prd_not_found.
      mo_msg_hdlr->add_exception( io_pdo_error_exception = lx_pdo_prd_not_found  ).
  ENDTRY.
ENDMETHOD.

As a result you should become a custom requester for shopping carts, created from backend purchase requisitions.

P.S.:  English language is not my native language, and any person is not insured from mistakes and typing errors. If you have found an error in the text, please let me know.

P.P.S.: If you have some remarks or hints - please don't hesitate to leave a comment.