Skip to content

Instantly share code, notes, and snippets.

@victorizbitskiy
Created November 13, 2022 17:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save victorizbitskiy/af20391051ba91458ce2bb19527628be to your computer and use it in GitHub Desktop.
Save victorizbitskiy/af20391051ba91458ce2bb19527628be to your computer and use it in GitHub Desktop.
ABAP APPEND TO INNER TABLE SPEADTEST
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