Small enhancement to create Service contract based on IBASE search result

255 阅读2分钟

Created by Jerry Wang, last modified on Feb 25, 2015

Requirement:

1. Add new button "Create Service Contract" in IBASE search result view

clipboard1

 

the selected ibase 18790 in this example has two products component:

clipboard2

 

2. Once "Create Service Contract" button is clicked, the two products are required to transfer to service contract creation page automatically:

clipboard3

 

 

Implementation

  

1. ui component CRMCMP_IBSEARCH, view HeaderResultList:

 

Add two event handlers:

clipboard4

 

EH_ONCREATE_POPUP_CLOSED:

METHOD eh_oncreate_popup_closed.

  DATA:

        lv_proc_type    TYPE crmt_process_type,

        ls_params       TYPE crmt_name_value_pair,

        lt_params       TYPE crmt_name_value_pair_tab,

        lr_msg_srv      TYPE REF TO cl_bsp_wd_message_service,

        lv_transferred  TYPE crmt_boolean,

        lr_core         TYPE REF TO cl_crm_bol_core,

        lr_factory      TYPE REF TO cl_crm_bol_entity_factory,

        lr_order        TYPE REF TO cl_crm_bol_entity,

        lr_context_node TYPE REF TO cl_bsp_wd_context_node,

        lr_current      TYPE REF TO if_bol_bo_property_access,

        lr_col          TYPE REF TO if_bol_bo_col,

        lr_comp         TYPE REF TO cl_bt112s_s_bspwdcomponen_impl,

        lr_adm_h        TYPE REF TO cl_crm_bol_entity,

        lr_items        LIKE lr_adm_h,

        lr_tx           TYPE REF TO if_bol_transaction_context.

  CHECK go_proctype_popup->get_fired_outbound_plug( ) EQ 'leave'. "# EC NOTEXT

  lr_context_node = go_proctype_popup->get_context_node( iv_cnode_name = 'PROCTYPE' ).

  CHECK lr_context_node IS BOUND.

* Get the selected line

  lr_current = lr_context_node->collection_wrapper->get_current( ).

  CHECK lr_current IS BOUND.

  lv_proc_type = lr_current->get_property_as_string( 'PROCESS_TYPE' ).

  ls_params-name  = 'PROCESS_TYPE'.                         "#EC NOTEXT

  ls_params-value = lv_proc_type.                           "#EC NOTEXT

  APPEND ls_params TO lt_params.

  lr_core = cl_crm_bol_core=>get_instance( ).

  lr_factory = lr_core->get_entity_factory( 'BTOrder' ).    "#EC NOTEXT

  lr_order = lr_factory->create( lt_params ).

  IF lr_order IS NOT BOUND.

    lr_msg_srv = me->view_manager->get_message_service( ).

    lr_msg_srv->add_message( iv_msg_type   = 'I'

                             iv_msg_id     = 'CRM_SRV_WEBREQ_ORDER'

                             iv_msg_number = '014' ).

    IF 1 = 2. MESSAGE e014(crm_srv_webreq_order).ENDIF.

    RETURN.

  ENDIF.

  go_created_btorder = lr_order.

  lr_adm_h = lr_order->get_related_entity( iv_relation_name = 'BTOrderHeader' iv_mode = cl_crm_bol_entity=>bypassing_buffer ).

  IF lr_adm_h IS BOUND.

    lr_items = lr_adm_h->get_related_entity(

    iv_relation_name = 'BTHeaderItemsExt' iv_mode = cl_crm_bol_entity=>bypassing_buffer ).

  ENDIF.

  me->parse_products_from_ibase( ).

  CALL METHOD cl_crm_uiu_bt_tools=>add_products_to_btorder

    EXPORTING

      ir_products_col     = go_selected_products

    IMPORTING

      ev_prdtransfer_flag = lv_transferred

    CHANGING

      cr_btorder          = lr_order

      cr_btitems          = lr_items.

  me->nav_to_service_creation_page( ).

ENDMETHOD.

method PARSE_PRODUCTS_FROM_IBASE.

   go_selected_products = zcl_crm_prod_accessor=>get_productlist_by_ibase( GO_SELECTED_IBASES ).

endmethod.

METHOD nav_to_service_creation_page.

  DATA:

        lr_data_collection    TYPE REF TO cl_crm_bol_bo_col,

        lr_nav_srv            TYPE REF TO  if_crm_ui_navigation_service,

        lr_window TYPE REF TO cl_bsp_wd_window,

        lr_descriptor_object  TYPE REF TO  if_bol_bo_property_access.

  CALL METHOD cl_crm_ui_descriptor_obj_srv=>create_entity_based

    EXPORTING

      ir_entity           = go_created_btorder

      iv_ui_object_type   = space

      iv_ui_object_action = if_crm_ui_descriptor_object=>gc_action_create

      iv_component        = 'CRMCMP_IBSEARCH'

    RECEIVING

      rr_result           = lr_descriptor_object.

  ASSERT lr_descriptor_object IS BOUND.

  lr_nav_srv = cl_crm_ui_navigation_service=>get_instance( me ).

  IF lr_nav_srv->is_dynamic_nav_supported( ir_descriptor_object = lr_descriptor_object ) EQ abap_true.

    CREATE OBJECT lr_data_collection.

    lr_data_collection->if_bol_bo_col~add( iv_entity = lr_descriptor_object ).

    lr_data_collection->if_bol_bo_col~add( iv_entity = go_created_btorder ).

    lr_window ?= me->view_manager->get_window_controller( ).

    lr_window->call_outbound_plug( iv_outbound_plug   = 'DEFAULT'

                                   iv_data_collection = lr_data_collection ).

  ENDIF.

ENDMETHOD.

EH_ONSELECT: add one line below:

clipboard5

 

add new attribute:

clipboard6

 

 

EH_ONSRVCREATE:

  

method EH_ONSRVCREATE.

 

  INCLUDE:

 

     crm_object_types_con.

  

  DATA:

 

    lv_proc_type     TYPE crmt_process_type,

 

    lv_title         TYPE string,

 

    ls_struct        TYPE crmst_followup_proctype_option,

 

    ls_params        TYPE crmt_name_value_pair,

 

    lt_params        TYPE crmt_name_value_pair_tab,

 

    lr_context_node  TYPE REF TO cl_bsp_wd_context_node,

 

    lr_struct_ref    TYPE REF TO crmst_followup_proctype_option,

 

    lr_value_node    TYPE REF TO cl_bsp_wd_value_node,

 

    lr_current       TYPE REF TO if_bol_bo_property_access,

 

    lr_core          TYPE REF TO cl_crm_bol_core,

 

    lr_factory       TYPE REF TO cl_crm_bol_entity_factory,

 

    lr_order         TYPE REF TO cl_crm_bol_entity,

 

    lr_col           TYPE REF TO if_bol_bo_col,

 

    lr_comp          TYPE REF TO cl_bt112s_s_bspwdcomponen_impl,

 

    lr_tx            TYPE REF TO if_bol_transaction_context.

  

  lr_col = ZCL_CRM_IBASE_CC_POC_UTIL=>get_proctypes_for_create( ).

  

* popup not necessary

 

  IF lr_col->size( ) = 1.

  

*    lr_current ?= lr_col->get_first( )  .

 

*    lv_proc_type = lr_current->get_property_as_string( iv_attr_name = 'PROCESS_TYPE' ).

 

*

 

*    ls_params-name  = 'PROCESS_TYPE'.                       "#EC NOTEXT

 

*    ls_params-value = lv_proc_type.                         "#EC NOTEXT

 

*    APPEND ls_params TO lt_params.

 

*

 

*** add entity

 

*    lr_core = cl_crm_bol_core=>get_instance( ).

 

*    lr_factory = lr_core->get_entity_factory( 'BTOrder' ).  "#EC NOTEXT

 

*    lr_order = lr_factory->create( lt_params ).

 

*

 

*    CHECK lr_order IS BOUND.

 

*

 

**   prefetch data after create

 

*    IF gv_bol_view IS NOT INITIAL.

 

*      TRY.

 

*          lr_core = cl_crm_bol_core=>get_instance( ).

 

*          CREATE OBJECT lr_col

 

*            TYPE

 

*              cl_crm_bol_bo_col.

 

*          lr_col->add( lr_order ).

 

*          lr_core->prefetch_view( iv_bo_collection = lr_col

 

*                                  iv_view_name     = gv_bol_view ).

 

*        CATCH cx_root.                                    "#EC NO_HANDLER

 

** ignore exceptions as it is only for performance

 

*      ENDTRY.

 

*    ENDIF.

 

*

 

*    set_btorder_to_coco( lr_order ).

 

*

 

*    IF NOT view_group_context IS BOUND.

 

*      CREATE OBJECT me->view_group_context

 

*        TYPE

 

*          cl_bsp_wd_view_group_context.

 

*    ENDIF.

 

*    lr_tx ?= lr_order->get_transaction( ).

 

*    view_group_context->set_associated_tx_context( lr_tx ).

 

*    view_group_context->set_all_editable( ).

 

*

 

*    op_edit( ).

  

  ELSE.

  

* Create the popup if necassary

 

    IF go_proctype_popup IS NOT BOUND.

 

      lv_title = cl_wd_utilities=>get_otr_text_by_alias( 'CRM_UIU_BT/SELECT_PROC_TYPE' ).

 

      go_proctype_popup = comp_controller->window_manager->create_popup(

 

                         iv_interface_view_name = 'ProcTypeWindow'

 

                         iv_usage_name = 'CUBTFollowUp'

 

                         iv_title = lv_title ).

 

    ENDIF.

  

* Clear AdminH Context of Popup

 

    lr_context_node = go_proctype_popup->get_context_node( iv_cnode_name = 'PROCTYPEBTADMINH' ).

 

    CHECK lr_context_node IS BOUND.

 

    lr_context_node->collection_wrapper->clear( ).

  

* Add Options Value Node of Popup

 

    lr_context_node = go_proctype_popup->get_context_node( iv_cnode_name = 'PROCTYPEOPTIONS' ).

 

    CHECK lr_context_node IS BOUND.

 

    lr_context_node->collection_wrapper->clear( ).

 

    CREATE DATA lr_struct_ref.

 

    CREATE OBJECT lr_value_node

 

      EXPORTING

 

        iv_data_ref = lr_struct_ref.

 

* Only BUS2000xxx proctypes

 

    ls_struct-bus_category = 'BUS2000112'."gv_bor_object_type.

 

* TODO: 2015-02-16

 

    "ls_struct-template_only = gv_template_only.

 

    "ls_struct-quotation_only = gv_quotation_only.

 

    "ls_struct-btx_class = gv_btx_class.

 

    lr_value_node->if_bol_bo_property_access~set_properties( ls_struct ).

 

    lr_context_node->collection_wrapper->add( lr_value_node ).

  

* Check size of result

 

    lr_context_node = go_proctype_popup->get_context_node( iv_cnode_name = 'PROCTYPE' ).

 

    CHECK lr_context_node IS BOUND.

  

    IF lr_context_node->collection_wrapper->size( ) EQ 1.

 

*     No Popup if there is only one possibility

 

*  TODO

 

*      lr_current = lr_context_node->collection_wrapper->get_current( ).

 

*      CHECK lr_current IS BOUND.

 

*      lv_proc_type = lr_current->get_property_as_string( 'PROCESS_TYPE' ).

 

*      create_new( lv_proc_type ).

 

    ELSE.

 

*     Open the Popup

 

    go_proctype_popup->set_on_close_event( iv_view = me iv_event_name = 'create_popup_closed' ).

 

    go_proctype_popup->set_display_mode( if_bsp_wd_popup=>c_display_mode_surrounded ).

 

    go_proctype_popup->open( ).

 

    ENDIF.

   

  ENDIF.

 

endmethod.

  

2. add component usage:

clipboard7

 

3. create outbound plug DEFAULT in window:

![clipboard8](user-images.gith
clipboard9

 

and expose it in runtime repository:

clipboard9

 

 

source code:

 

method OP_DEFAULT.

 

DATA lv_outbound_plug TYPE seocmpname.

 

DATA lv_parent_window TYPE REF TO CL_BSP_WD_WINDOW.

  

lv_outbound_plug = 'DEFAULT'.

 

  me->fire_outbound_plug( iv_outbound_plug   = lv_outbound_plug

 

                          iv_data_collection = iv_data_collection ).

 

endmethod.

  

4. Map this DEFAULT plug to IB150M_IBASE's outbound plug DEFAULT:

clipboard10

 

create a new outbound plug in window controller:

clipboard11

 

 

source code:

  

method OP_DEFAULT.

 

   me->fire_outbound_plug( iv_outbound_plug   = 'DEFAULT'            "EC NOTEXT

 

                              iv_data_collection = iv_data_collection ).

  

endmethod.

 

5. utility class source code:

 

source code:

  

method OP_DEFAULT.

 

   me->fire_outbound_plug( iv_outbound_plug   = 'DEFAULT'            "EC NOTEXT

 

                              iv_data_collection = iv_data_collection ).

  

endmethod.