Created by Jerry Wang, last modified on Feb 25, 2015
Requirement:
1. Add new button "Create Service Contract" in IBASE search result view
the selected ibase 18790 in this example has two products component:
2. Once "Create Service Contract" button is clicked, the two products are required to transfer to service contract creation page automatically:
Implementation
1. ui component CRMCMP_IBSEARCH, view HeaderResultList:
Add two event handlers:
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:
add new attribute:
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:
3. create outbound plug DEFAULT in window:
.
endmethod.
4. Map this DEFAULT plug to IB150M_IBASE's outbound plug DEFAULT:
create a new outbound plug in window controller:
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.