Created
November 13, 2022 17:28
-
-
Save victorizbitskiy/af20391051ba91458ce2bb19527628be to your computer and use it in GitHub Desktop.
ABAP APPEND TO INNER TABLE SPEADTEST
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
REPORT ZSPEADTEST_READ. | |
CLASS lcl_read_spead_test DEFINITION FINAL. | |
PUBLIC SECTION. | |
TYPES ty_itab TYPE pa0002. | |
TYPES ty_t_itab TYPE STANDARD TABLE OF ty_itab WITH KEY primary_key COMPONENTS pernr subty objps sprps endda begda seqnr. | |
* TYPES ty_t_itab TYPE SORTED TABLE OF ty_itab WITH UNIQUE KEY primary_key COMPONENTS pernr subty objps sprps endda begda seqnr. | |
* TYPES ty_t_itab TYPE HASHED TABLE OF ty_itab WITH UNIQUE KEY primary_key COMPONENTS pernr subty objps sprps endda begda seqnr. | |
TYPES: | |
BEGIN OF ty_result, | |
name TYPE c LENGTH 100, | |
value TYPE timestampl, | |
place TYPE i, | |
END OF ty_result, | |
ty_t_result TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY. | |
DATA mv_test_runs_times TYPE i. | |
DATA mv_operations_times TYPE i. | |
METHODS: | |
constructor IMPORTING iv_test_runs_times TYPE i | |
iv_operations_times TYPE i, | |
run, | |
get_result RETURNING VALUE(rt_result) TYPE ty_t_result. | |
PRIVATE SECTION. | |
DATA mt_run_result TYPE ty_t_result. | |
DATA mt_runs_result TYPE ty_t_result. | |
DATA mt_itab TYPE ty_t_itab. | |
METHODS: | |
re_tbl_into_wa, | |
re_tbl_assign_to_fs, | |
re_tbl_reference_into, | |
re_tbl_as_arr_val_optional, | |
re_tbl_as_arr_val_try_catch, | |
re_tbl_as_arr_assign_fs, | |
re_tbl_as_arr_ref_try_catch, | |
place_assignment. | |
ENDCLASS. | |
CLASS lcl_opera_spead_test_res_view DEFINITION FINAL. | |
PUBLIC SECTION. | |
TYPES: | |
BEGIN OF ty_common_result, | |
name TYPE c LENGTH 100, | |
cnt_place_1 TYPE i, | |
cnt_place_2 TYPE i, | |
cnt_place_3 TYPE i, | |
cnt_place_4 TYPE i, | |
cnt_place_5 TYPE i, | |
cnt_place_6 TYPE i, | |
cnt_place_7 TYPE i, | |
time TYPE timestampl, | |
END OF ty_common_result, | |
ty_t_common_result TYPE STANDARD TABLE OF ty_common_result WITH EMPTY KEY. | |
METHODS: | |
constructor IMPORTING io_opera_spead_test TYPE REF TO lcl_read_spead_test, | |
display. | |
PRIVATE SECTION. | |
DATA mo_opera_spead_test TYPE REF TO lcl_read_spead_test. | |
DATA mt_common_result TYPE ty_t_common_result. | |
METHODS: | |
prepare, | |
collect_result IMPORTING is_result TYPE lcl_read_spead_test=>ty_result. | |
ENDCLASS. | |
CLASS lcl_report DEFINITION FINAL. | |
PUBLIC SECTION. | |
CLASS-METHODS: | |
end_of_selection. | |
ENDCLASS. | |
CLASS lcl_read_spead_test IMPLEMENTATION. | |
METHOD constructor. | |
mv_test_runs_times = iv_test_runs_times. | |
mv_operations_times = iv_operations_times. | |
SELECT * FROM pa0002 INTO TABLE mt_itab UP TO 1000 ROWS. | |
ENDMETHOD. | |
METHOD run. | |
DO mv_test_runs_times TIMES. | |
CLEAR mt_run_result. | |
re_tbl_into_wa( ). | |
re_tbl_assign_to_fs( ). | |
re_tbl_reference_into( ). | |
re_tbl_as_arr_val_optional( ). | |
re_tbl_as_arr_val_try_catch( ). | |
re_tbl_as_arr_assign_fs( ). | |
re_tbl_as_arr_ref_try_catch( ). | |
place_assignment( ). | |
ENDDO. | |
ENDMETHOD. | |
METHOD get_result. | |
rt_result = mt_runs_result. | |
ENDMETHOD. | |
METHOD re_tbl_into_wa. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
DATA ls_itab LIKE LINE OF mt_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
READ TABLE mt_itab INTO ls_itab WITH KEY pernr = '00087734'. | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'READ TABLE mt_itab INTO ls_itab WITH KEY ... .' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD re_tbl_assign_to_fs. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
FIELD-SYMBOLS <ls_itab> LIKE LINE OF mt_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
READ TABLE mt_itab ASSIGNING <ls_itab> WITH KEY pernr = '00087734'. | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'READ TABLE mt_itab ASSIGNING <ls_itab> WITH KEY ... .' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD re_tbl_reference_into. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
DATA lr_itab TYPE REF TO ty_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
READ TABLE mt_itab REFERENCE INTO lr_itab WITH KEY pernr = '00087734'. | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'READ TABLE mt_itab REFERENCE INTO lr_itab WITH KEY ... .' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD re_tbl_as_arr_val_optional. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
DATA ls_itab LIKE LINE OF mt_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
ls_itab = VALUE ty_itab( mt_itab[ pernr = '00087734' ] OPTIONAL ). | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'ls_itab = VALUE ty_itab( mt_itab[ ... ] OPTIONAL ).' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD re_tbl_as_arr_val_try_catch. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
DATA ls_itab LIKE LINE OF mt_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
TRY. | |
ls_itab = mt_itab[ pernr = '00087734' ]. | |
CATCH cx_sy_itab_line_not_found INTO DATA(lx_e). | |
ENDTRY. | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'TRY. ls_itab = VALUE ty_itab( mt_itab[ ... ] ). CATCH cx_... ENDTRY. ENDTRY.' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD re_tbl_as_arr_assign_fs. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
FIELD-SYMBOLS <ls_itab> LIKE LINE OF mt_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
ASSIGN mt_itab[ pernr = '00087734' ] TO <ls_itab>. | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'ASSIGN mt_itab[ ... ] TO <ls_itab>.' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD re_tbl_as_arr_ref_try_catch. | |
DATA lv_tsmp_before TYPE timestampl. | |
DATA lv_tsmp_after TYPE timestampl. | |
DATA lv_tsmp_result TYPE timestampl. | |
DATA lr_itab TYPE REF TO ty_itab. | |
GET TIME STAMP FIELD lv_tsmp_before. | |
DO mv_operations_times TIMES. | |
TRY. | |
lr_itab = REF ty_itab( mt_itab[ pernr = '00087734' ] ). | |
CATCH cx_sy_itab_line_not_found INTO DATA(lx_e). | |
ENDTRY. | |
ENDDO. | |
GET TIME STAMP FIELD lv_tsmp_after. | |
lv_tsmp_result = cl_abap_tstmp=>subtract( tstmp1 = lv_tsmp_after | |
tstmp2 = lv_tsmp_before ). | |
APPEND VALUE ty_result( name = 'TRY. lr_itab = REF ty_itab( mt_itab[ ... ] ). CATCH cx_... ENDTRY.' | |
value = lv_tsmp_result ) TO mt_run_result. | |
ENDMETHOD. | |
METHOD place_assignment. | |
DATA lv_cnt TYPE i. | |
" Определяем места в текущем прогоне | |
SORT mt_run_result BY value ASCENDING. | |
LOOP AT mt_run_result ASSIGNING FIELD-SYMBOL(<lfs_run_result>). | |
lv_cnt = lv_cnt + 1. | |
APPEND VALUE ty_result( name = <lfs_run_result>-name | |
value = <lfs_run_result>-value | |
place = lv_cnt ) TO mt_runs_result. | |
ENDLOOP. | |
ENDMETHOD. | |
ENDCLASS. | |
CLASS lcl_opera_spead_test_res_view IMPLEMENTATION. | |
METHOD constructor. | |
mo_opera_spead_test = io_opera_spead_test. | |
ENDMETHOD. | |
METHOD display. | |
DATA lo_salv_table TYPE REF TO cl_salv_table. | |
prepare( ). | |
TRY. | |
cl_salv_table=>factory( IMPORTING r_salv_table = lo_salv_table | |
CHANGING t_table = mt_common_result ). | |
DATA(lo_salv_functions) = lo_salv_table->get_functions( ). | |
lo_salv_functions->set_all( abap_true ). | |
DATA(lo_salv_columns_table) = lo_salv_table->get_columns( ). | |
lo_salv_columns_table->set_optimize( abap_true ). | |
DATA(lo_column) = lo_salv_columns_table->get_column( 'NAME' ). | |
lo_column->set_long_text( |Operation| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_1' ). | |
lo_column->set_long_text( |1 places| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_2' ). | |
lo_column->set_long_text( |2 places| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_3' ). | |
lo_column->set_long_text( |3th places| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_4' ). | |
lo_column->set_long_text( |4th places| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_5' ). | |
lo_column->set_long_text( |5th places| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_6' ). | |
lo_column->set_long_text( |6th places| ). | |
lo_column = lo_salv_columns_table->get_column( 'CNT_PLACE_7' ). | |
lo_column->set_long_text( |7th places| ). | |
lo_column = lo_salv_columns_table->get_column( 'TIME' ). | |
lo_column->set_short_text( |AvrTime| ). | |
lo_column->set_medium_text( |Average time, sec| ). | |
lo_column->set_long_text( |Average time, sec| ). | |
lo_salv_table->display( ). | |
CATCH cx_salv_msg cx_salv_not_found INTO DATA(lx_e). | |
WRITE lx_e->get_text( ). | |
ENDTRY. | |
ENDMETHOD. | |
METHOD prepare. | |
DATA(lt_runs_result) = mo_opera_spead_test->get_result( ). | |
LOOP AT lt_runs_result ASSIGNING FIELD-SYMBOL(<lfs_runs_result>). | |
collect_result( <lfs_runs_result> ). | |
ENDLOOP. | |
LOOP AT mt_common_result ASSIGNING FIELD-SYMBOL(<lfs_common_result>). | |
<lfs_common_result>-time = <lfs_common_result>-time / mo_opera_spead_test->mv_test_runs_times. | |
ENDLOOP. | |
SORT mt_common_result BY cnt_place_1 DESCENDING. | |
ENDMETHOD. | |
METHOD collect_result. | |
FIELD-SYMBOLS <lfs_common_result> LIKE LINE OF mt_common_result. | |
FIELD-SYMBOLS <lfs_place_cnt_val> TYPE any. | |
UNASSIGN <lfs_common_result>. | |
ASSIGN mt_common_result[ name = is_result-name ] TO <lfs_common_result>. | |
IF <lfs_common_result> IS NOT ASSIGNED. | |
APPEND VALUE #( name = is_result-name ) TO mt_common_result ASSIGNING <lfs_common_result>. | |
ENDIF. | |
ASSIGN COMPONENT |{ 'CNT_PLACE_' }{ is_result-place }| OF STRUCTURE <lfs_common_result> TO <lfs_place_cnt_val>. | |
<lfs_place_cnt_val> = <lfs_place_cnt_val> + 1. | |
ASSIGN COMPONENT 'TIME' OF STRUCTURE <lfs_common_result> TO <lfs_place_cnt_val>. | |
<lfs_place_cnt_val> = <lfs_place_cnt_val> + is_result-value. | |
ENDMETHOD. | |
ENDCLASS. | |
CLASS lcl_report IMPLEMENTATION. | |
METHOD end_of_selection. | |
DATA(lo_read_spead_test) = NEW lcl_read_spead_test( iv_test_runs_times = 1000 | |
iv_operations_times = 1000 ). | |
lo_read_spead_test->run( ). | |
DATA(lo_opera_spead_test_res_view) = NEW lcl_opera_spead_test_res_view( lo_read_spead_test ). | |
lo_opera_spead_test_res_view->display( ). | |
ENDMETHOD. | |
ENDCLASS. | |
END-OF-SELECTION. | |
lcl_report=>end_of_selection( ). |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment