SAP CRM BOL collection find_by_property
SAP by CRM Find Property collection
2023-09-14 09:03:03 时间
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,有两种做法:
- 逐一遍历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.
- 从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倍。
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.
相关文章
- SAP UI5 sap.ui.core.Element 的概要介绍
- SAP UI5 应用中的 sap.ui.require.toUrl 使用场景
- SAP UI5 sap.ui.export.Spreadsheet API 介绍
- SAP UI5 sap.ui.Device.media.RANGESETS.SAP_STANDARD_EXTENDED 介绍
- SAP UI5 sap.ui.Device.media.initRangeSet 方法的单步调试
- 关于 SAP UI5 ODataModel.createEntry 返回的 context 对象
- SAP ABAP Netweaver 里的 ABAP 会话概念
- SAP ABAP CDS view Association 引入的缘由
- 英语不好,对 SAP 英文文档有所畏惧,该怎么办?
- SAP MIGO + 561初始化库存,系统报错 - There is no item category assigned to account 399999
- SAP UI5 sap.m.Table Manual Pop-In Mode 概述
- SAP Fiori Launchpad url 参数 sap-app-origin-hint 的含义
- 深入比较:SAP vs Oracle(sap和oracle)
- SAP程序代码中RANGE表的用法禁忌详解编程语言
- SAP记账码详解编程语言
- SAP系统内如何查询特定时间内某个Tcode都修改了什么-AUT10详解编程语言
- SAP query创建详解编程语言
- SAP业务事务代码详解编程语言
- SAP vs Oracle:差异点与解析(sap和oracle的区别)
- partition by深入理解 Oracle over Partition By(oracle的over)
- 对比:Oracle 与 SAP的优势(oracle 与 sap)
- 系统Oracle公司收购SAP系统开启新的商业时代(Oracle公司sap)
- 缓存使用SAP创建Redis缓存,实现高效稳定加速(sap如何创建redis)
- 跨界合作新模式 Oracle与SAP实现合并(oracle与sap合并)
- 展望未来Oracle与SAP的合作结盟前景(oracle、sap)