SAP CRM BOL collection find_by_property

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

Created by Jerry Wang, last modified on Oct 20, 2014

如果想找出bol collection 里满足某个attribute 等于指定value的条件的bol entity,例如一个bol collection 里包含了一系列product instance, 需要找出product id 等于JERRY06042的product instance,有两种做法:

  1. 逐一遍历collection 中的entity,在每次循环里取出entity的PRODUCT_ID, 和指定比较,如果找到满足条件的bol entity,则退出循环:

```ABAP

CONSTANTS: gv_product_id TYPE comm_product-product_id VALUE 'JERRY06042'.

  DATA: lv_start TYPE i,
        lv_end type i.

  GET RUN TIME FIELD lv_start.

  DATA(lo_product) = lo_collection->get_first( ).

  WHILE lo_product IS NOT INITIAL.
     DATA(lv_product_id) = lo_product->get_property_as_string( 'PRODUCT_ID' ).
     IF lv_product_id = gv_product_id.
        WRITE: / 'product found in solution1'.
        EXIT.
     ENDIF.
     lo_product = lo_collection->get_next( ).
  ENDWHILE.

  GET RUN TIME FIELD lv_end.

  lv_end = lv_end - lv_start.

  WRITE: / 'time spentsolution1: ' , lv_end.
  1. 从bol collection 里得到iterator,利用iterator的FIND_BY_PROPERTY功能:
  CLEAR: lv_start.

  GET RUN TIME FIELD lv_start.
  DATA(iterator) = lo_collection->get_iterator( ).
  DATA(lo_found) = iterator->find_by_property( iv_attr_name = 'PRODUCT_ID' iv_value = gv_product_id ).
  GET RUN TIME FIELD lv_end.

  lv_product_id = lo_found->get_property_as_string( 'PRODUCT_ID' ).

  WRITE: / 'Product found in solution2: ', lv_product_id.

  lv_end = lv_end - lv_start.

  WRITE: / 'time spent solution2: ' , lv_end COLOR COL_NEGATIVE.

```

测试发现bol collection里的entity数量越多,则第二种办法的性能优势越突出。例如在bol collection包含1684个product的情况下,方法二的性能是方法一的将近5倍。
clipboard1

REPORT  ZHANA_PRODUCT_SEARCH_FILTER.

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!'.

  CONSTANTS: gv_product_id TYPE comm_product-product_id VALUE 'JERRY06042'.

  DATA: lv_start TYPE i,
        lv_end type i.

  GET RUN TIME FIELD lv_start.

  DATA(lo_product) = lo_collection->get_first( ).

  WHILE lo_product IS NOT INITIAL.
     DATA(lv_product_id) = lo_product->get_property_as_string( 'PRODUCT_ID' ).
     IF lv_product_id = gv_product_id.
        WRITE: / 'product found in solution1'.
        EXIT.
     ENDIF.
     lo_product = lo_collection->get_next( ).
  ENDWHILE.

  GET RUN TIME FIELD lv_end.

  lv_end = lv_end - lv_start.

  WRITE: / 'time spentsolution1: ' , lv_end.

  CLEAR: lv_start.

  GET RUN TIME FIELD lv_start.
  DATA(iterator) = lo_collection->get_iterator( ).
  DATA(lo_found) = iterator->find_by_property( iv_attr_name = 'PRODUCT_ID' iv_value = gv_product_id ).
  GET RUN TIME FIELD lv_end.

  lv_product_id = lo_found->get_property_as_string( 'PRODUCT_ID' ).

  WRITE: / 'Product found in solution2: ', lv_product_id.

  lv_end = lv_end - lv_start.

  WRITE: / 'time spent solution2: ' , lv_end COLOR COL_NEGATIVE.

猜你喜欢

转载自blog.csdn.net/i042416/article/details/94768514