版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
Created by Jerry Wang, last modified on Oct 13, 2014
当使用下列report删除一个BOL entity root entity时,无需在report里手动trigger一个COMMIT WORK也能将root entity真正删除:
DATA: lo_core TYPE REF TO cl_crm_bol_core,
lo_collection TYPE REF TO if_bol_entity_col,
lv_view_name TYPE crmt_view_name,
lv_query_name TYPE crmt_ext_obj_name,
lt_query_parameter TYPE crmt_name_value_pair_tab,
ls_query_parameter LIKE LINE OF lt_query_parameter,
lv_size TYPE i.
ls_query_parameter-name = 'INTERNAL_ID'.
ls_query_parameter-value = '201300024498'.
APPEND ls_query_parameter TO lt_query_parameter.
lo_core = cl_crm_bol_core=>get_instance( ).
lo_core->load_component_set( 'CRMSMT' ).
lv_query_name = 'PostSearch'.
lo_collection = lo_core->query(
iv_query_name = lv_query_name
it_query_params = lt_query_parameter
iv_view_name = lv_view_name ).
lv_size = lo_collection->IF_BOL_BO_COL~SIZE( ).
"ASSERT lv_size 1.
DATA(lo_bol_entity) = lo_collection->get_first( ).
CHECK lo_bol_entity IS NOT INITIAL.
DATA(lo_root) = lo_bol_entity->get_related_entity( 'SocialPostRel' ).
lo_root->delete( ).
复制
原因是因为CL_CRM_BOL_CORE->ROOT_DELETE方法里会自动调用CL_CRM_GENERIC_IL_NEW->COMMIT操作。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5Gcu4GdyFzYxJDZyR2LcdzM1czNzUzLcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
而如果删除root node下面的sub node:
REPORT zhana_product_search1.
PARAMETERS: prod_id TYPE comt_product_id,
prod_des TYPE comt_prshtextx,
cat_id TYPE comt_category_id, "COMM_PRPRDCATR-CATEGORY_ID,
cat_desc TYPE comt_category_text,
maxhit TYPE i.
DATA: lo_core TYPE REF TO cl_crm_bol_core,
lo_collection TYPE REF TO if_bol_entity_col,
lo_root_entity TYPE REF TO cl_crm_bol_entity,
lv_view_name TYPE crmt_view_name,
lv_query_name TYPE crmt_ext_obj_name,
lt_query_parameter TYPE crmt_name_value_pair_tab,
ls_query_parameter LIKE LINE OF lt_query_parameter,
lv_size TYPE i.
START-OF-SELECTION.
-
replace ' ' with '' into prod_id.
SHIFT prod_id RIGHT DELETING TRAILING space.
SHIFT prod_id LEFT DELETING LEADING space.
SHIFT prod_des RIGHT DELETING TRAILING space.
SHIFT prod_des LEFT DELETING LEADING space.
SHIFT cat_id RIGHT DELETING TRAILING space.
SHIFT cat_id LEFT DELETING LEADING space.
SHIFT cat_desc RIGHT DELETING TRAILING space.
SHIFT cat_desc LEFT DELETING LEADING space.
IF prod_id NE ''.
ls_query_parameter-name = 'PRODUCT_ID'.
ls_query_parameter-value = prod_id.
APPEND ls_query_parameter TO lt_query_parameter.
ENDIF.
IF prod_des NE ''.
ls_query_parameter-name = 'DESCRIPTION'.
ls_query_parameter-value = prod_des.
APPEND ls_query_parameter TO lt_query_parameter.
ENDIF.
IF cat_id NE ''.
ls_query_parameter-name = 'CATEGORY_ID'.
ls_query_parameter-value = cat_id.
APPEND ls_query_parameter TO lt_query_parameter.
ENDIF.
IF cat_desc NE ''.
ls_query_parameter-name = 'CATEGORY_DESC'.
ls_query_parameter-value = cat_desc.
APPEND ls_query_parameter TO lt_query_parameter.
ENDIF.
IF maxhit EQ ''.
maxhit = 10000.
ENDIF.
ls_query_parameter-name = 'MAX_ROWS'.
ls_query_parameter-value = maxhit.
APPEND ls_query_parameter TO lt_query_parameter.
lo_core = cl_crm_bol_core=>get_instance( ).
lo_core->load_component_set( 'PROD_ALL' ).
lv_query_name = 'ProdAdvancedSearchProducts'.
"lv_query_name = 'ProdAdvSearchRgProducts'.
TRY.
lo_collection = lo_core->query(
iv_query_name = lv_query_name
it_query_params = lt_query_parameter
iv_view_name = lv_view_name ).
CATCH cx_sy_arithmetic_error.
WRITE:/ 'Error' .
ENDTRY.
lv_size = lo_collection->if_bol_bo_col~size( ).
WRITE:/ 'Number of ' , lv_size, ' Products has been found!'.
DATA(lo_product) = lo_collection->get_first( ).
CHECK lo_product IS NOT INITIAL.
DATA(lo_short_text) = lo_product->get_related_entities( iv_relation_name = 'ProductShortText' ).
CHECK lo_short_text IS NOT INITIAL.
DATA(lo_text) = lo_short_text->get_first( ).
CHECK lo_text IS NOT INITIAL.
CHECK lo_product->lock( ) = abap_true.
lo_text->delete( ).
发现调用delete之后,只是简单把当前sub node对应的bol entity加入到bol entity manager的modified_entities tab里
要做到真正删除sub node, 必须要call if_bol_transaction_context的save和commit方法。