关于Display Mode
从CRM5.0开始,BOL带有了一个Display Mode。目的就是防止误操作BOL数据。
最终是改变了core的一个参数
IV_DISPLAY_MODE_SUPPORT =ABAP_TRUE.
不过,在调用start_up的时候,默认是非显示模式,也就是可改。
代码示例:
* Start BOL core withdisplay mode support
DATA: lv_bol_core TYPEREF TO cl_crm_bol_core.
lv_bol_core =cl_crm_bol_core=>get_instance( ).
lv_bol_core->start_up(iv_appl_name = ‘MY_COMPONENT_SET’
iv_display_mode_support =ABAP_TRUE ).
* Execute query andaccess entity
DATA: lv_entity type refto cl_crm_bol_entity.
lv_entity= ... - "Entity is in now display mode
* Switch to change modeand change entity
lv_entity->switch_to_change_mode(). "Reread and lock entity
IFlv_entity->is_changeable( ) = abap_true.
lv_entity->set_property_as_string(iv_attr_name = 'PROPERTY_NAME'
iv_value = 'New Value' ).
ENDIF.
注意下switch_to_change_mode与LOCK效果等同。目的就是独占当前的实例,便于增删改。
下面这个例子,演示的如何使用BOL的查询。
* Get searchcriterion of BOL query
DATA: lv_query TYPEREF TO cl_crm_bol_query_service,
lv_city type string.
lv_query =cl_crm_bol_query_service=>get_instance( ‘QUERY_NAME’ ).
lv_city= lv_query->if_bol_bo_property_access~get_property_as_string(‘City’).“Short form using alias
lv_city =lv_query->get_property_as_string( ‘City’ ).
* Set property ofBOL entity
DATA: lv_entity TYPEREF TO cl_crm_bol_entity
lv_entity->if_bol_bo_property_access~set_property(iv_attr_name = ‘CITY’
iv_value = ‘Walldorf’).
“Short form usingalias
lv_entity->set_property(iv_attr_name = ‘CITY’
iv_value = ‘Walldorf’ ).
* Cast toproperty_access interface
DATA:lv_business_object TYPE REF TO if_bol_bo_property_access.
lv_business_object?= lv_entity.
一些常用类之间的关系。
CL_CRM_BOL_ENTITY_COL有接口IF_BOL_ENTITY_COL。
CL_CRM_BOL_BO_COL有接口IF_BOL_BO_COL。
CL_CRM_BOL_ENTITY_COL的BO_PROPERTY_ACCESS集合就是CL_CRM_BOL_BO_COL
IF_BOL_ENTITY_COL接口可以进一步派生接口IF_BOL_BO_COL。
这些类都可以对集合做如下动作
INSERT, GET_FIRST,GET_NEXT, GET_CURRENT, SORT, CLEAR, MARK, UNMARK.
下面的代码示例获取当前行数据及集合循环指针的用法。
* Create collection
DATA: lv_collectionTYPE REF TO cl_crm_bol_bo_collection,
lv_property_accessTYPE REF TO if_bol_bo_property_access,
lv_query TYPE REF TOcl_crm_bol_query_service.
CREATE OBJECTlv_collection.
...
* Add item and makeit current
lv_collection->if_bol_bo_col~insert(iv_bo = lv_query
Iv_index = 1
Iv_set_focus =ABAP_BOOL ).
* Global iteration
lv_property_access =lv_collection->get_next( ). “Global iteration
“ moves focus
* Local iteration
DATA: lv_iteratorTYPE REF TO if_bol_bo_col_iterator.
lv_iterator =lv_collection->get_iterator( ).
lv_property_access =lv_iterator->get_first( )
WHILElv_query_is_bound.
lv_property_access =lv_collection->get_next(). “Local iteration
does not
ENDWHILE. “ movefocus
下面代码演示bol的数据查找功能(很弱)。注意,找到的话,根据你的要求返回是行号或者对象。
* Find by property
DATA: lv_personsTYPE REF TO cl_crm_bol_entity_collection,
lv_male TYPE REF TOcl_crm_bol_entity,
lv_iterator TYPE REFTO if_bol_bo_col_iterator.
lv_iterator =lv_persons->get_iterator( ).
lv_male =lv_iterator->find_by_property( iv_attr_name = ‘SEX’
iv_value = 2 ).
* Set collectionfocus on the entity found
lv_persons->find(iv_bo = lv_male ).
下面代码演示bol的排序。这个功能一旦用了,那么就是真实的把对象重新排列了,原来的序列必定不存在了。(其实原理就是链表重排)
* Sorting
DATA: lv_personsTYPE REF TO cl_crm_bol_entity_collection,
lv_male TYPE REF TOcl_crm_bol_entity,
lv_iterator TYPE REFTO if_bol_bo_col_iterator.
lv_persons->sort(iv_attr_name = ‘SEX’
iv_sort_order = IF_BOL_BO_COL=>SORT_DESCENDING )."默认正序
关于多项选择,主要看mark和unmark函数,以及get_marked
下面这段实例很实用,说的是如何获取bo的报错。
* Access messages ofa business object
* 1) Use the messagecontainer manager
DATA: lv_mcm TYPEREF TO cl_crm_genil_mess_cont_manager.
lv_mcm =lv_bol_core->get_message_cont_manager( ).
* 2) ... to obtainthe message container
DATA: lv_object_nameTYPE crmt_ext_obj_name,
Lv_object_id TYPEcrmt_gnil_object_id.
lv_object_name =lv_order->get_name( ).
lv_object_id =lv_order->get_key( ).
DATA: lv_mc TYPE REFTO if_genil_message_container.
lv_mc =lv_mcm->get_message_cont( iv_object_name = lv_object_name
Iv_object_id =lv_object_id ).
* 3) Access messages
DATA:lv_number_of_errors TYPE int4,
lt_error_messagesTYPE crmt_genil_message_tab.
lv_number_of_errors= lv_mc->get_number_of_messages( lv_mc->mt_error).
IF lv_number_of_errors <> 0.
lt_error_messages =lv_mc->get_messages( lv_mc->mt_error ).
ENDIF.