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 b1WITH 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 b2WITH 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 b3WITH 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'EXPORTINGid = '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_nameit_selection_parameters = lt_selection_parameteris_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'EXPORTINGit_header_guid = lt_order_guidit_requested_objects = lt_requestedIMPORTINGet_orderadm_h = lt_headeret_orderadm_i = lt_itemet_product_i = lt_productet_service_h = lt_service_het_service_i = lt_service_iet_status = lt_statuset_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_oneorderiv_maincategory = lv_categoryiv_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.