Created by Jerry Wang, last modified on Mar 21, 2014
这个工具能够根据UI 上的search条件( Main Category和Created on)搜索出对应的service order:
并且根据report指定的读取条件使用function module CRM_ORDER_READ读取对应的Service Order part( 第二个selection frame里对应的checkbox)
使用SAT即可分析Order read的性能:
report source code如下:
REPORT zorder_search1.
CONSTANTS: c_oneorder TYPE crmt_aui_map_item_type VALUE 'ONEORDER',
c_open TYPE crmt_aui_status VALUE '0001',
c_inprocess TYPE crmt_aui_status VALUE '0002',
c_complete TYPE crmt_aui_status VALUE '0003',
c_not_comp TYPE crmt_aui_status VALUE '0004'.
DATA: lo_core TYPE REF TO cl_crm_bol_core,
lo_collection TYPE REF TO if_bol_entity_col,
lv_query_name TYPE crmt_ext_obj_name,
lt_selection_parameter TYPE genilt_selection_parameter_tab,
ls_selection_parameter TYPE genilt_selection_parameter,
lo_order TYPE REF TO cl_crm_bol_entity,
lo_header TYPE REF TO cl_crm_bol_entity,
ls_query_parameters TYPE genilt_query_parameters,
lv_order_guid TYPE crmt_object_guid,
lt_order_guid TYPE crmt_object_guid_tab,
lv_size TYPE i,
lv_category_num TYPE i VALUE 0,
lv_category TYPE crmt_aui_maincat,
lt_native_status TYPE crmtt_aui_native_values,
lv_native_status LIKE LINE OF lt_native_status,
lv_type TYPE crmt_aui_maincat,
lv_date_valid TYPE abap_bool,
lv_status TYPE crmt_aui_status,
lv_name TYPE vrm_id,
lt_list TYPE vrm_values,
ls_value LIKE LINE OF lt_list.
SELECTION-SCREEN BEGIN OF BLOCK b1
WITH FRAME TITLE txt1.
SELECT-OPTIONS: tr_type FOR lv_type DEFAULT 'SRVO' OBLIGATORY.
PARAMETERS: c_from TYPE crmt_posting_date DEFAULT '20140318',
c_to TYPE crmt_posting_date DEFAULT '20140320',
status(4) AS LISTBOX VISIBLE LENGTH 20 DEFAULT '0001'.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2
WITH FRAME TITLE txt2.
PARAMETERS: p_head AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_item AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_prod AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_se_h AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_se_i AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_st AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_st_h AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3
WITH FRAME TITLE txt3.
PARAMETERS: p_op AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT /1(78) outcom FOR FIELD p_op.
SELECTION-SCREEN END OF BLOCK b3.
INITIALIZATION.
txt1 = 'Search Attribute for Service Order in IC'.
txt2 = 'Specify which part of Service Order needs to be read via API'.
txt3 = 'Output Service Order Detail retrieved by API'.
outcom = 'If result set for Service Order is large, do not choose this flag'.
AT SELECTION-SCREEN.
PERFORM check_date CHANGING lv_date_valid.
CHECK lv_date_valid = abap_true.
AT SELECTION-SCREEN OUTPUT.
ls_value-key = c_open.
ls_value-text = 'Open'.
APPEND ls_value TO lt_list.
ls_value-key = c_inprocess.
ls_value-text = 'In Process'.
APPEND ls_value TO lt_list.
ls_value-key = c_complete.
ls_value-text = 'Completed'.
APPEND ls_value TO lt_list.
ls_value-key = c_not_comp.
ls_value-text = 'Not Completed'.
APPEND ls_value TO lt_list.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'status'
values = lt_list.
START-OF-SELECTION.
PERFORM fill_search_para.
lv_query_name = 'BTAdvQueryAUI'.
lo_core = cl_crm_bol_core=>get_instance( ).
lo_core->load_component_set( 'BT' ).
lo_collection = lo_core->dquery(
iv_query_name = lv_query_name
it_selection_parameters = lt_selection_parameter
is_query_parameters = ls_query_parameters ).
CHECK lo_collection IS NOT INITIAL.
lv_size = lo_collection->size( ).
WRITE: / 'Number of Service Order found: ' , lv_size COLOR COL_POSITIVE.
CHECK lv_size > 0.
lo_order = lo_collection->get_first( ).
WHILE lo_order IS NOT INITIAL.
lo_header = lo_order->get_related_entity( 'BTOrderHeader' ).
lv_order_guid = lo_header->get_property_as_string( 'GUID' ).
INSERT lv_order_guid INTO TABLE lt_order_guid.
lo_order = lo_collection->get_next( ).
ENDWHILE.
DATA: lt_header TYPE crmt_orderadm_h_wrkt,
lt_item TYPE crmt_orderadm_i_wrkt,
lt_product TYPE crmt_product_i_wrkt,
lt_service_h TYPE crmt_service_h_wrkt,
lt_service_i TYPE crmt_service_i_wrkt,
lt_status TYPE crmt_status_wrkt,
lt_status_h TYPE crmt_status_h_wrkt,
lt_requested TYPE crmt_object_name_tab.
IF p_head = abap_true.
APPEND 'ORDERADM_H' TO lt_requested.
ENDIF.
IF p_item = abap_true.
APPEND 'ORDERADM_I' TO lt_requested.
ENDIF.
IF p_prod = abap_true.
APPEND 'PRODUCT_I' TO lt_requested.
ENDIF.
IF p_se_h = abap_true.
APPEND 'SERVICE_H' TO lt_requested.
ENDIF.
IF p_se_i = abap_true.
APPEND 'SERVICE_I' TO lt_requested.
ENDIF.
IF p_st = abap_true.
APPEND 'STATUS' TO lt_requested.
ENDIF.
IF p_st_h = abap_true.
APPEND 'STATUS_H' TO lt_requested.
ENDIF.
CALL FUNCTION 'CRM_ORDER_READ'
EXPORTING
it_header_guid = lt_order_guid
it_requested_objects = lt_requested
IMPORTING
et_orderadm_h = lt_header
et_orderadm_i = lt_item
et_product_i = lt_product
et_service_h = lt_service_h
et_service_i = lt_service_i
et_status = lt_status
et_status_h = lt_status_h.
PERFORM print_title USING 'Header Information' lt_header.
PERFORM print_result USING lt_header.
PERFORM print_title USING 'Item Information' lt_header.
PERFORM print_result USING lt_item.
PERFORM print_title USING 'Product Information' lt_header.
PERFORM print_result USING lt_product.
PERFORM print_title USING 'Service Header Information' lt_header.
PERFORM print_result USING lt_service_h.
PERFORM print_title USING 'Service Item Information' lt_header.
PERFORM print_result USING lt_service_i.
PERFORM print_title USING 'Status Information' lt_header.
PERFORM print_result USING lt_status.
PERFORM print_title USING 'Status Header Information' lt_header.
PERFORM print_result USING lt_status_h.
FORM print_result USING it_table TYPE SORTED TABLE.
FIELD-SYMBOLS: <item> TYPE any,
<data> TYPE any.
DATA: lo_struct TYPE REF TO cl_abap_structdescr,
ls_comp LIKE LINE OF lo_struct->components.
READ TABLE it_table ASSIGNING <item> INDEX 1.
check sy-subrc = 0.
lo_struct ?= cl_abap_structdescr=>describe_by_data( <item> ).
READ TABLE it_table ASSIGNING <item> INDEX 1.
LOOP AT it_table ASSIGNING <item>.
WRITE: / '**************************************' COLOR COL_TOTAL.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <item> TO <data>.
IF sy-subrc <> 0.
EXIT.
ELSEIF <data> IS NOT INITIAL.
READ TABLE lo_struct->components INTO ls_comp INDEX sy-index.
WRITE: / 'Field Name: ', ls_comp-name COLOR COL_GROUP, 'Field value: ', <data> COLOR COL_NEGATIVE.
ENDIF.
ENDDO.
ENDLOOP.
ENDFORM.
FORM print_title USING iv_title TYPE string it_table TYPE ANY TABLE.
IF it_table IS NOT INITIAL.
WRITE: / iv_title COLOR COL_POSITIVE.
ENDIF.
ENDFORM.
FORM check_date CHANGING cv_valid TYPE abap_bool.
cv_valid = abap_false.
IF ( c_from IS INITIAL AND c_to IS NOT INITIAL ) OR ( c_from IS NOT INITIAL AND c_to IS INITIAL ).
MESSAGE 'Specify both from and to date for Creation Date' TYPE 'E'.
RETURN.
ELSEIF c_from > c_to.
MESSAGE 'Create from date must be earlier than to date' TYPE 'E'.
RETURN.
ENDIF.
cv_valid = abap_true.
ENDFORM.
FORM fill_search_para.
DATA: ls_type LIKE LINE OF tr_type[].
LOOP AT tr_type[] INTO ls_type WHERE option = 'EQ'.
CLEAR: ls_selection_parameter.
ls_selection_parameter-attr_name = 'MAINCATEGORY'.
ls_selection_parameter-option = 'EQ'.
ls_selection_parameter-sign = 'I'.
ls_selection_parameter-low = ls_type-low.
APPEND ls_selection_parameter TO lt_selection_parameter.
lv_category_num = lv_category_num + 1.
lv_category = ls_type-low.
ENDLOOP.
ls_selection_parameter-attr_name = 'POSTING_DATE'.
ls_selection_parameter-option = 'BT'.
ls_selection_parameter-sign = 'I'.
ls_selection_parameter-low = c_from.
ls_selection_parameter-high = c_to.
APPEND ls_selection_parameter TO lt_selection_parameter.
IF status IS NOT INITIAL.
lv_status = status.
IF lv_category_num > 1.
CLEAR: lv_category.
ENDIF.
lt_native_status = cl_crm_aui_service=>map_native_states(
iv_item_type = c_oneorder
iv_maincategory = lv_category
iv_inbox_status = lv_status ).
LOOP AT lt_native_status INTO lv_native_status.
CLEAR: ls_selection_parameter.
ls_selection_parameter-attr_name = 'STATUS'.
ls_selection_parameter-option = 'EQ'.
ls_selection_parameter-sign = 'I'.
ls_selection_parameter-low = lv_native_status.
APPEND ls_selection_parameter TO lt_selection_parameter.
ENDLOOP.
ENDIF.
ENDFORM.