This document is aimed at understanding bol programming CRUD operation concepts in CRM WebUI.
Sample Code for BOL Creation : Create a Activity Transaction
DATA : lr_core TYPE REF TO cl_crm_bol_core.
TRY.
lr_core = cl_crm_bol_core=>get_instance( ).
lr_core->load_component_set( 'BT' ) .
CATCH cx_crm_genil_general_error.
ENDTRY.
*-->Build Create Parameters of Root Object.
DATA: ls_params TYPE crmt_name_value_pair.
DATA: lt_params TYPE crmt_name_value_pair_tab.
CLEAR : ls_params , lt_params[].
*-->Build Create parameters Root Object 'BTOrder'
*--> Process Type
ls_params-name = 'PROCESS_TYPE'.
ls_params-value = 'ZACTIVITY'.
APPEND ls_params TO lt_params.
*Create Root Instance or Entity Factory.
DATA : lr_factory TYPE REF TO cl_crm_bol_entity_factory.
DATA : lr_order TYPE REF TO cl_crm_bol_entity.
*-->Note Either use root_create or get_entity_factory to create.
*--> Obtain Factory of Root Object in Entity.
TRY.
lr_factory = lr_core->get_entity_factory( iv_entity_name = 'BTOrder' ).
lr_order = lr_factory->create( lt_params ).
CATCH cx_crm_unsupported_object.
ENDTRY.
DATA : lr_adminh TYPE REF TO cl_crm_bol_entity.
*--> Get Dependent Objects.
lr_adminh = lr_order->get_related_entity( iv_relation_name = 'BTOrderHeader' ).
IF lr_adminh IS NOT BOUND.
TRY.
*-->Create Dependent Objects.
lr_adminh = lr_order->create_related_entity( iv_relation_name = 'BTOrderHeader').
CATCH cx_crm_genil_duplicate_rel cx_crm_genil_model_error.
ENDTRY.
ENDIF.
DATA : ls_admin TYPE crmst_adminh_btil.
lr_adminh->get_properties( IMPORTING es_attributes = ls_admin ).
ls_admin-description = 'Activity Creation'.
ls_admin-posting_date = '20140110'.
lr_adminh->set_properties( EXPORTING is_attributes = ls_admin ).
DATA: lr_activity TYPE REF TO cl_crm_bol_entity.
*--> Get Dependent Objects.
lr_activity = lr_adminh->get_related_entity( iv_relation_name = 'BTHeaderActivityExt' ).
IF lr_activity IS NOT BOUND.
TRY.
*-->Create Dependent Objects.
lr_activity = lr_adminh->create_related_entity( iv_relation_name = 'BTHeaderActivityExt' ).
CATCH cx_crm_genil_duplicate_rel cx_crm_genil_model_error.
ENDTRY.
ENDIF.
* -->set the attribute using set_property method.
DATA : ls_activity TYPE crmst_activityh_btil.
lr_activity->get_properties( IMPORTING es_attributes = ls_activity ).
ls_activity-category = '101'.
ls_activity-priority = '01'.
ls_activity-objective = '003' .
lr_activity->set_properties( EXPORTING is_attributes = ls_activity ).
* -->Submit Root Objects and Child Objects Which are created.
* -->Always call modify on bol core.
lr_core->modify( ).
*Save and Commit Changes Using Global Transaction Context
DATA: lr_transaction TYPE REF TO if_bol_transaction_context .
DATA: lv_success TYPE crmt_boolean.
lr_transaction = lr_core->get_transaction( ).
IF lr_transaction->check_save_needed( ) EQ abap_true
AND lr_transaction->check_save_possible( ) EQ abap_true.
lv_success = lr_transaction->save( ).
IF lv_success IS NOT INITIAL.
lr_transaction->commit( ).
ELSE.
lr_transaction->rollback( ).
ENDIF.
ENDIF.
Sample Code for BOL Search : Search a Activity Transaction
Use CL_CRM_BOL_QUERY_SERVICE or CL_CRM_BOL_DQUERY_SERVICE class objects to search data.
DATA : lr_core TYPE REF TO cl_crm_bol_core.
TRY.
lr_core = cl_crm_bol_core=>get_instance( ).
lr_core->load_component_set( 'BT' ) .
CATCH cx_crm_genil_general_error.
ENDTRY.
DATA: lr_qs TYPE REF TO cl_crm_bol_dquery_service,
lr_result TYPE REF TO if_bol_entity_col,
lr_iter TYPE REF TO if_bol_entity_col_iterator,
lr_entity TYPE REF TO cl_crm_bol_entity,
ls_param TYPE crmt_name_value_pair,
lt_param TYPE crmt_name_value_pair_tab.
*Get and prepare dynamic query service.
lr_qs ?= cl_crm_bol_dquery_service=>get_instance( 'BTQAct' ).
* Set Query Parameters.
ls_param-name = 'MAX_HITS'.
ls_param-value = '5'.
APPEND ls_param TO lt_param.
lr_qs->set_query_parameters( lt_param ).
*Add selected parameters or criteria .
lr_qs->add_selection_param( iv_attr_name = 'EMPLOYEE_RESP' iv_sign = 'I'
iv_low = '*' iv_option = 'EQ' iv_high = ' ').
*Execute Query and retrieve result
lr_result = lr_qs->get_query_result( ).
CHECK lr_result IS BOUND.
*Use Iterator to access entities in query result
lr_iter ?= lr_result->get_iterator( ).
* Get the first record from Collection.
lr_entity ?= lr_iter->get_first( ).
DATA : lv_guid TYPE crmt_object_guid.
WHILE lr_entity IS BOUND.
*Access Attributes of Business object.
lv_object_id = lr_entity->get_property_as_string( 'OBJECT_ID' ).
"Perform Operations or Write
Write:/ lv_object_id.
lr_entity ?= lr_iter->get_next( ).
ENDWHILE.
Sample Code for BOL CHANGE OR UPDATE ENTITY
Scenario : To Modify or update a Business Object entities.
To update BOL entity , First we need to search using Search Object and get the entity object (Root object ) once we can the instance of Root object we can update the entity.
For Search : Use Above code as reference.
Data : lr_core type ref to cl_crm_bol_core.
lr_core = cl_crm_bol_core=>get_instance( ).
TRY.
lr_core->start_up( EXPORTING iv_appl_name = 'ONEORDER'
iv_display_mode_support = abap_true ).
CATCH cx_crm_genil_general_error. "#EC NO_HANDLER
ENDTRY.
DATA: lr_qs TYPE REF TO cl_crm_bol_query_service,
lr_iterator TYPE REF TO if_bol_entity_col_iterator,
lr_search_result_coll TYPE REF TO if_bol_entity_col,
lr_btorder TYPE REF TO cl_crm_bol_entity,
lr_btorder_h TYPE REF TO cl_crm_bol_entity.
* Start BT Appl
lr_qs = cl_crm_bol_query_service=>get_instance( 'BTQuery1O' ). "#EC NOTEXT
* set search parameters
CALL METHOD lr_qs->set_property
EXPORTING
iv_attr_name = 'OBJECT_ID'
iv_value = lv_object_id.
* set search parameters, Bus Object type 'LEAD'
CALL METHOD lr_qs->set_property
EXPORTING
iv_attr_name = ' OBJECT_TYPE'
iv_value = 'BUS2000108'.
lr_search_result_coll = lr_qs->get_query_result( ).
IF lr_search_result_coll IS BOUND.
lr_iterator = lr_search_result_coll->get_iterator( ).
IF lr_iterator IS BOUND.
lr_btorder = lr_iterator->get_first( ).
*Get the Entity of Activity Object
CALL METHOD lr_btorder->get_related_entity
EXPORTING
iv_relation_name = 'BTOrderHeader'
RECEIVING
rv_result = lr_order_h.
CATCH cx_crm_genil_model_error .
ENDTRY.
lr_order_h->switch_to_change_mode( ).
*Locks are always set on root object.
IF lr_order_h->lock( ) = 'X'.
IF lr_order_h->is_changeable( ) = 'X'.
*Set property also locks the object entity if lock has not been set.
lr_order_h->if_bol_bo_property_access~set_property( iv_attr_name = 'DESCRIPTION'
iv_value = 'Melbourne' ).
*Modify BOL layer
lr_core->modify( ).
lr_transaction = lr_core->get_transaction( ).
lv_success = lr_transaction->save( ).
IF lv_success eq abap_true. lr_transaction->commit( ).
ENDIF.
ENDIF.ENDIF.ENDIF.ENDIF.
Sample Code for BOL Delete
* Use Above code for Entity Object
lr_entity ?= lr_result->get_first( ).
*
*Lock and modify the property
IF lr_entity->lock( ) = if_genil_boolean=>true.
lr_entity->delete( ).
*Modify the Core Object
lr_core->modify( ).
ENDIF.
* Then Again Use save and commit using transaction contexxt.
UI Development Codes
Saving Object into Database EH_ONSAVE
DATA lr_tx TYPE REF TO if_bol_transaction_context.
DATA lr_entity TYPE REF TO cl_crm_bol_entity.
DATA lr_core TYPE REF TO cl_crm_bol_core.
*
lr_entity ?= me->typed_context->object_name->collection_wrapper->get_current( ).
lr_tx = lr_entity->get_transaction( ).
IF lr_tx IS NOT BOUND.
lr_core = cl_crm_bol_core=>get_instance( ).
lr_tx = lr_core->begin_transaction( ).
ENDIF.
IF lr_tx IS BOUND.
IF lr_tx->check_save_possible( ) = abap_true.
CHECK lr_tx->save( ) = abap_true.
lr_tc->commit( ).
ENDIF.
ENDIF.
me->view_group_context->reset( ).
Cancel Changes or Reset Objects EH_ONCANCEL
DATA lr_entity TYPE REF TO cl_crm_bol_entity.
DATA lr_tx TYPE REF TO if_bol_transaction_context.
*
lr_entity ?= me->typed_context->node->collection_wrapper->get_current( ).
lr_tx = lr_entity->get_transaction( ).
lr_tx->revert( iv_suppress_buffer_sync = abap_true ).
me->view_group_context->reset( ).
Edit Objects EH_ONEDIT
DATA: lr_entity TYPE REF TO cl_crm_bol_entity.
lr_entity ?= me->typed_context->node->collection_wrapper->get_current( ).
CHECK lr_entity IS BOUND.
CHECK lr_entity->is_change_allowed( ) = abap_true.
lr_entity->lock( ).
IF lr_entity->is_locked( ) = abap_false.
me->view_group_context->reset( ).
ELSE.
me->view_group_context->set_all_editable( ).
ENDIF.
Config Use of DO_CONFIG_DETERMINATION method to change the screen layout.
*For Each Object type and Subobject type combination, there is 1 view configuration
lv_object_type = 'ZOBJTYP'.
lv_subobject_type = 'ZSUBTYP'.
* Set the config keys to fetch relevant configuration.
me->set_config_keys( iv_object_type = lv_object_type
iv_object_sub_type = lv_subobject_type
iv_propagate_2_children = abap_true ).
|
Set or Populate valuenodes with value using CL_BSP_WD_VALUE_NODE
TYPES: BEGIN OF str,
status TYPE char20,
END OF str.
* Structure of status context node.
DATA lr_struct_ref TYPE REF TO str.
* Structure of your context node
DATA ls_struct TYPE str.
DATA lr_value_node TYPE REF TO cl_bsp_wd_value_node.
CREATE DATA lr_struct_ref.
CREATE OBJECT lr_value_node
EXPORTING
iv_data_ref = lr_struct_ref.
ls_struct-status = 'Your Value'.
lr_value_node->if_bol_bo_property_access~set_properties( ls_struct ).
*Add Value Node to a collection
typed_context->testnode->collection_wrapper->add( lr_value_node ).
|
Get a model node from Mixed node using CL_BSP_WD_MIXED_NODE
DATA: lr_mixednode TYPE REF TO cl_bsp_wd_mixed_node,
lr_access TYPE REF TO if_bol_bo_property_access.
*
*Get the current entity from your mixed node
lr_mixednode ?= me->typed_context->contexnodename->collection_wrapper->get_current( ).
lr_access ?= lr_mixednode->if_bsp_wd_ext_property_access~get_model_node( ).
|
Display Custom Internal Table on UI on a Table View Context Node.
DATA : lr_valuenode TYPE REF TO cl_bsp_wd_value_node "Collection to fill node
DATA : lr_tabline TYPE REF TO ty_str. "Type Structure
DATA : lr_ent_col TYPE REF TO if_bol_bo_col.
DATA : lr_coll_wrapp TYPE REF TO cl_bsp_wd_collection_wrapper. "Collection Wrapper
CREATE DATA lr_tabline.
CREATE OBJECT lr_ent_col TYPE cl_crm_bol_bo_col.
LOOP AT lt_table INTO ls_str.
* Create value object with current line for collection
CREATE OBJECT lr_valuenode
EXPORTING
iv_data_ref = lr_tabline.
* Set current line data
lr_valuenode->set_properties( ls_str ).
* Add current line to collection
lr_ent_col->add(
EXPORTING
iv_entity = lr_valuenode ). " Access Interface for BO Attributes
ENDLOOP.
typed_context->context_node->collection_wrapper->clear_collection( ).
CREATE OBJECT lr_coll_wrapp.
lr_coll_wrapp->set_collection( lr_ent_col ).
typed_context->salesorg->set_collection_wrapper( lr_coll_wrapp ).
typed_context->context_node->build_table( ).
Access or Read a Context Node of another Component using Controllers if they are linked with each other.
data : lr_object type ref to cl_bsp_wd_view_controller.
IF lr_object IS NOT BOUND.
lr_object = me->get_subcontroller_by_viewname( iv_viewname = 'ComponentName/MainWindow' ).
IF lr_object IS BOUND.
lr_object = lr_object->get_subcontroller_by_viewname( iv_viewname = 'ComponentName/ViewSet' ).
IF lr_object IS BOUND.
lr_object = lr_object>get_subcontroller_by_viewname( iv_viewname = 'ComponentName/ViewName' ).
ENDIF.
ENDIF.
ENDIF.
Get parent component at run time from embedded component view implentation class
In window impl class - create a method GET_OUTER_REP_VIEW parameter as RR_OUTER_REP_VIEW Returning Type Ref To CL_BSP_WD_REP_VIEW.
method GET_OUTER_REP_VIEW.
rr_outer_rep_view = me->outer_rep_view.
endmethod.
*Call in an view imple class or context node to fetch parent
Data : lr_parentview TYPE REF TO cl_bsp_wd_rep_view.
TRY.
lr_contr ?= me->view_manager->get_window_controller( ).
lr_parentview = lr_contr->get_outer_rep_view( )->get_parent( ).
lv_parent_name = lr_parentview->get_name( ).
CATCH cx_sy_move_cast_error cx_sy_ref_is_initial.
RETURN.
ENDTRY.
Accessing component controller in CN00 methods. Go to _CN class -Create attribute - ZOWNER Instance Attribute Public Type Ref To view_imple_class. - open IF_BSP_MODEL~INIT put as zowner ?= owner.
lr_view ?= zowner.
lr_window ?= lr_view->get_window( ).
lr_comp ?= lr_window->m_parent.