* _______ _______ _______ _______ _______ _______ ______ _______ _______ ______ _______ * | _ | _ | _ | | | _ | || _ | _ | _ | | _ | * | |_| | |_| | |_| | _ | | |_| | _ | |_| | |_| | | || | |_| | * | | | | |_| | | | | | | | | |_||_| | * | | _ || | ___| _| | |_| | | _ || __ | | * | _ | |_| | _ | | | |_| _ | | _ | |_| | | | | _ | * |__| |__|_______|__| |__|___| |_______|__| |__|______||__| |__|_______|___| |_|__| |__| * www.abapcadabra.com *------------------------------------------------------------------------------------------- * program : ZABAPCADABRA_SOURCE_SCANNER * title : Abap source code scanner * functional area : X-component * environment : 4.7 * program Function : Get a good feel on the development's insides by focussing * on the available components. This report reveals how many * variables are defined and whether they are global or local. * Does the report perform any direct table updates ? Are * other reports or transactions called ? * Documentation : Search for "Scan your source" on AbapcadabrA.com * Previous version : This is the initial version * Developer name : Wim Maasdam * Development date : 18-03-2017 * Version : 0.1 *--------------------------------------------------------------------- * Change list: * Date Description * 18-03-2017 Initial release *--------------------------------------------------------------------- REPORT ZABAPCADABRA_SOURCE_SCANNER. CLASS lcl_event_manager DEFINITION FINAL. PUBLIC SECTION. METHODS: constructor IMPORTING r_object TYPE REF TO cl_salv_table, * on_user_command FOR EVENT * added_function OF cl_salv_events * IMPORTING e_salv_function, on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column. PRIVATE SECTION. DATA: go_salv TYPE REF TO cl_salv_table. ENDCLASS. class lcl_report_scanner definition FINAL. PUBLIC SECTION. types: begin of ty_scan_results, superSourceLine type sy-dbcnt, linetype type c length 15, level type c length 12, content type char255, object type c length 30, sourceLine type c length 5, "Max accepted.. key1 type c length 40, key2 type c length 40, resultCounter type n length 5, one TYPE i, colors TYPE lvc_t_scol, end of ty_scan_results. class-data: gv_main_program type sy-repid, begin of gw_totals, objects type n length 4, transactions type n length 4, dynpros type n length 4, sourcelines type n length 6, commentlines type n length 6, blanklines type n length 6, global type n length 4, global_class type n length 4, statics type n length 4, local type n length 4, forms type n length 4, modules type n length 4, classes type n length 4, methods type n length 4, modify type n length 4, insert type n length 4, update type n length 4, delete type n length 4, sapstandard type n length 4, import type n length 4, export type n length 4, commit type n length 4, ".. and rollback submits type n length 4, call_dyn type n length 4, call_tra type n length 4, call_fun type n length 4, call_funS type n length 4, leave_prog type n length 4, leave_screen type n length 4, leave_trans type n length 4, end of gw_totals, gt_sourcecode type standard table of char255, gt_scan_results type standard table of ty_scan_results, gv_lineType type c length 15, go_alv type ref to cl_salv_table, go_event_man TYPE REF TO lcl_event_manager, RF_FUNCTIONS_LIST type ref to CL_SALV_FUNCTIONS_LIST, rf_columns_table type ref to CL_SALV_COLUMNS_TABLE, rf_column_table type ref to CL_SALV_COLUMN_TABLE, rf_column TYPE REF TO cl_salv_column, rf_sorts type ref to CL_SALV_SORTS, * The footer box rf_alv_footer type ref to CL_SALV_FORM_LAYOUT_GRID, rf_text TYPE REF TO cl_salv_form_text, rf_layout TYPE REF TO cl_salv_layout, rf_layout_data TYPE REF TO cl_salv_form_layout_data_grid, gt_colors type LVC_T_SCOL. class-methods: initialize importing main_program type any, set_result importing resultCounter type any default 0 level type any default space superSourceline type any key1 type any default space key2 type any default space, scan_for_SKELETON, scan_for_DATA, scan_for_DB_actions, scan_for_SUBMIT, ALV_report. endclass. class lcl_report_scanner implementation. method initialize. data: lt_sourcecode2 type standard table of char255, lv_sourcecode type char255, lv_sourcecode2 type char255, lv_include_name type char255, lv_tabix type sy-tabix, lv_tabix_num type n length 5, lv_devclass type tadir-devclass. data: lt_keywords type standard table of char50, lt_statements type standard table of SSTMNT, lw_statement TYPE SSTMNT, lw_statement2 TYPE SSTMNT, lt_tokens type standard table of STOKES, lw_token TYPE STOKES. gv_main_program = main_program. clear: gt_sourcecode[], gw_totals. * Read the main report read report gv_main_program into gt_sourcecode. check sy-subrc = 0. gw_totals-objects = 1. * Perform the SCAN - with focus on local and global data declarations append 'INCLUDE' to lt_keywords. * Position 200 onwards is used to identify the original main source and line loop at gt_sourcecode into lv_sourcecode. lv_tabix_num = sy-tabix. concatenate '"' gv_main_program lv_tabix_num into lv_sourcecode+200 SEPARATED BY space. modify gt_sourcecode from lv_sourcecode. endloop. * Resolve includes in n rounds (include in include in include in ...): do 5 times. scan abap-source gt_sourcecode KEYWORDS FROM lt_keywords STATEMENTS INTO lt_statements TOKENS INTO lt_tokens. delete lt_tokens where STR = 'INCLUDE'. sort lt_tokens by row descending. "< Insert Includes BOTTOM UP loop at lt_tokens into lw_token. lv_tabix = lw_token-row + 1. lv_include_name = lw_token-str. select single devclass from tadir into lv_devclass where pgmid = 'R3TR' and object = 'PROG' and obj_name = lv_include_name. if sy-subrc = 0 and ( lv_devclass(1) = 'Z' or lv_devclass(1) = 'Y' or lv_devclass = '$TMP' ). add 1 to gw_totals-objects. * Read include coding read report lv_include_name into lt_sourcecode2. if sy-subrc = 0. concatenate '* Resolved INCLUDE >>' lv_include_name into lv_sourcecode SEPARATED BY space. modify gt_sourcecode from lv_sourcecode index lw_token-row. loop at lt_sourcecode2 into lv_sourcecode2. * Position 200 onwards is used to identify the original include source and line lv_tabix_num = sy-tabix. concatenate '"' lv_include_name lv_tabix_num into lv_sourcecode2+200 SEPARATED BY space. modify lt_sourcecode2 from lv_sourcecode2. endloop. insert lines of lt_sourcecode2 into gt_sourcecode index lv_tabix. endif. endif. endloop. enddo. * Count transaction codes and dynpro's select count( * ) from D020S into gw_totals-dynpros where prog = gv_main_program. select count( * ) from tstc into gw_totals-transactions where pgmna = gv_main_program. endmethod. method set_result. "resultCounter = superSourceline = lineType = data: lw_scan_results type ty_scan_results. lw_scan_results-resultCounter = resultCounter. lw_scan_results-superSourceLine = superSourceline. lw_scan_results-level = level. lw_scan_results-linetype = gv_lineType. lw_scan_results-key1 = key1. lw_scan_results-key2 = key2. read table gt_sourcecode index superSourceline into lw_scan_results-content. split lw_scan_results-content+202 at space into lw_scan_results-object lw_scan_results-sourceLine. lw_scan_results-content = lw_scan_results-content(200). lw_scan_results-colors[] = gt_colors[]. lw_scan_results-one = 1. append lw_scan_results to gt_scan_results. endmethod. method scan_for_SKELETON. data: lw_colored_field TYPE lvc_s_scol, lt_keywords type standard table of char50, lt_statements type standard table of SSTMNT, lw_statement TYPE SSTMNT, lt_tokens type standard table of STOKES, lw_token TYPE STOKES, lw_token_hlp TYPE STOKES, lv_level type c length 20, lv_TOKEN_ROW type TOKEN_ROW. gv_lineType = 'SKELETON'. * Perform the SCAN - with focus on local and global data declarations append 'FORM' to lt_keywords. append 'ENDFORM' to lt_keywords. append 'CLASS' to lt_keywords. append 'ENDCLASS' to lt_keywords. append 'MODULE' to lt_keywords. append 'ENDMODULE' to lt_keywords. append 'METHOD' to lt_keywords. append 'ENDMETHOD' to lt_keywords. append 'INITIALIZATION' to lt_keywords. append 'START-OF-SELECTION' to lt_keywords. append 'END-OF-SELECTION' to lt_keywords. scan abap-source gt_sourcecode KEYWORDS FROM lt_keywords STATEMENTS INTO lt_statements TOKENS INTO lt_tokens. lv_level = ''. clear: gt_colors[]. lw_colored_field-fname = 'SUPERSOURCELINE'. lw_colored_field-color-col = 0. lw_colored_field-color-int = 1. lw_colored_field-color-inv = 1. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'RESULTCOUNTER'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'LINETYPE'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'LEVEL'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'CONTENT'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'OBJECT'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'SOURCELINE'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'KEY1'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'KEY2'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'ONE'. APPEND lw_colored_field TO gt_colors. loop at lt_statements into lw_statement. loop at lt_tokens into lw_token from lw_statement-from to lw_statement-to. case lw_token-STR. when 'FORM' or 'MODULE' or 'METHOD' or 'CLASS'. lv_level = lw_token-STR. lv_TOKEN_ROW = lw_token-ROW. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). exit. when 'ENDFORM' or 'ENDMODULE' or 'ENDMETHOD' or 'ENDCLASS'. lv_level = lw_token-STR+3. lv_TOKEN_ROW = lw_token-ROW. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). exit. when 'INITIALIZATION' or 'START-OF-SELECTION' or 'END-OF-SELECTION'. lv_level = 'EVENT'. lv_TOKEN_ROW = lw_token-ROW. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token-STR ). exit. endcase. endloop. endloop. clear: gt_colors[]. endmethod. method scan_for_DATA. data: lt_keywords type standard table of char50, lt_statements type standard table of SSTMNT, lw_statement TYPE SSTMNT, lw_statement2 TYPE SSTMNT, lt_tokens type standard table of STOKES, lw_token TYPE STOKES, lw_token_hlp TYPE STOKES, lv_sourcecode TYPE char255, lv_number type n length 5, lv_at_first type boolean, lv_level type c length 20, lv_skipper type boolean. gv_lineType = 'DATA'. * Perform the SCAN - with focus on local and global data declarations append 'PARAMETER' to lt_keywords. append 'PARAMETERS' to lt_keywords. append 'SELECT-OPTIONS' to lt_keywords. append 'DATA' to lt_keywords. append 'FORM' to lt_keywords. append 'ENDFORM' to lt_keywords. append 'CLASS-DATA' to lt_keywords. append 'CLASS' to lt_keywords. append 'ENDCLASS' to lt_keywords. append 'MODULE' to lt_keywords. append 'ENDMODULE' to lt_keywords. append 'METHOD' to lt_keywords. append 'ENDMETHOD' to lt_keywords. append 'STATICS' to lt_keywords. scan abap-source gt_sourcecode KEYWORDS FROM lt_keywords STATEMENTS INTO lt_statements TOKENS INTO lt_tokens. clear: lv_number, lv_skipper. lv_level = 'GLOBAL'. loop at lt_statements into lw_statement. lv_at_first = abap_true. loop at lt_tokens into lw_token from lw_statement-from to lw_statement-to. case lw_token-STR. when 'CLASS'. * Class: is this a CLASS definition or implementation ? then switch read table gt_sourcecode index lw_statement-trow into lv_sourcecode. TRANSLATE lv_sourcecode TO UPPER CASE. if not lv_sourcecode cp '*DEFINITION*LOAD*' and not lv_sourcecode cp '*DEFINITION*DEFERRED*'. lv_level = 'CLASS'. else. if not lv_sourcecode cs ' DEFINITION'. add 1 to gw_totals-classes. endif. endif. clear lv_at_first. when 'FORM'. * Class: is this a CLASS definition or implementation ? then switch lv_level = 'LOCAL'. add 1 to gw_totals-forms. when 'METHOD'. * Class: is this a CLASS definition or implementation ? then switch lv_level = 'LOCAL'. add 1 to gw_totals-methods. when 'MODULE'. add 1 to gw_totals-modules. when 'ENDFORM' or 'ENDCLASS' or 'ENDMETHOD'. lv_level = 'GLOBAL'. exit. " 0. clear lw_token_hlp. endif. set_result( level = lv_level resultCounter = lv_number superSourceline = lw_statement2-trow key1 = lw_token_hlp-str ). case lv_level. when 'GLOBAL'. add 1 to gw_totals-global. when 'STATICS'. add 1 to gw_totals-statics. when 'CLASS'. add 1 to gw_totals-global_class. when 'LOCAL'. add 1 to gw_totals-local. endcase. clear: lv_skipper, lw_statement2, lv_at_first. when others. if lv_at_first = abap_true and lv_skipper = abap_false. add 1 to lv_number. set_result( level = lv_level resultCounter = lv_number superSourceline = lw_statement-trow key1 = lw_token-STR ). case lv_level. when 'GLOBAL'. add 1 to gw_totals-global. when 'CLASS'. add 1 to gw_totals-global_class. when 'LOCAL'. add 1 to gw_totals-local. endcase. clear lv_at_first. endif. endcase. endloop. endloop. endmethod. method scan_for_DB_ACTIONS. data: lt_keywords type standard table of char50, lt_statements type standard table of SSTMNT, lw_statement TYPE SSTMNT, lt_tokens type standard table of STOKES, lw_token TYPE STOKES, lv_number type n length 5, lv_level type c length 20, lv_tabname type dd02l-tabname. * Perform the SCAN - with focus on local and global data declarations append 'INSERT' to lt_keywords. append 'MODIFY' to lt_keywords. append 'UPDATE' to lt_keywords. append 'DELETE' to lt_keywords. append 'EXPORT' to lt_keywords. append 'IMPORT' to lt_keywords. append 'COMMIT' to lt_keywords. append 'ROLLBACK' to lt_keywords. scan abap-source gt_sourcecode KEYWORDS FROM lt_keywords STATEMENTS INTO lt_statements TOKENS INTO lt_tokens. clear: lv_number, lv_LEVEL. gv_lineType = 'TABLE ACTIONS'. loop at lt_statements into lw_statement. loop at lt_tokens into lw_token from lw_statement-from to lw_statement-to. case lw_token-STR. when 'MODIFY' or 'UPDATE' or 'INSERT' or 'DELETE'. lv_level = lw_token-STR. when 'IMPORT' or 'EXPORT'. add 1 to lv_number. lv_level = lw_token-STR. set_result( level = lv_level resultCounter = lv_number superSourceline = lw_statement-trow key1 = lw_token-STR ). case lv_level. when 'IMPORT'. add 1 to gw_totals-modify. when 'EXPORT'. add 1 to gw_totals-insert. endcase. exit. when 'COMMIT' or 'ROLLBACK'. add 1 to lv_number. lv_level = lw_token-STR. set_result( level = lv_level resultCounter = lv_number superSourceline = lw_statement-trow ). add 1 to gw_totals-commit. exit. when others. if not lv_level is initial and lw_token-STR <> 'SCREEN'. * Test the table name, which is not the active token. It this a transparent table ? select single tabname from dd02l into lv_tabname where tabname = lw_token-STR and as4local = 'A' and as4vers = 0000 and tabclass = 'TRANSP'. if sy-subrc = 0. add 1 to lv_number. set_result( level = lv_level resultCounter = lv_number superSourceline = lw_statement-trow key1 = lw_token-STR ). case lv_level. when 'MODIFY'. add 1 to gw_totals-modify. when 'INSERT'. add 1 to gw_totals-insert. when 'UPDATE'. add 1 to gw_totals-update. when 'DELETE'. add 1 to gw_totals-delete. endcase. if lw_token-STR(1) <> 'Z' and lw_token-STR(1) <> 'Y'. add 1 to gw_totals-sapstandard. endif. endif. endif. clear lv_level. endcase. endloop. endloop. endmethod. method scan_for_SUBMIT. data: lt_keywords type standard table of char50, lt_statements type standard table of SSTMNT, lw_statement TYPE SSTMNT, lt_tokens type standard table of STOKES, lw_token TYPE STOKES, lw_token_hlp TYPE stokes, lv_level type c length 20, lw_colored_field type LVC_S_SCOL, lv_TOKEN_ROW type TOKEN_ROW. * Perform the SCAN - with focus on local and global data declarations append 'SUBMIT' to lt_keywords. append 'CALL' to lt_keywords. append 'LEAVE' to lt_keywords. scan abap-source gt_sourcecode KEYWORDS FROM lt_keywords STATEMENTS INTO lt_statements TOKENS INTO lt_tokens. clear: lv_LEVEL. gv_lineType = 'EXIT'. clear: gt_colors[]. lw_colored_field-fname = 'SUPERSOURCELINE'. lw_colored_field-color-col = 7. lw_colored_field-color-int = 0. lw_colored_field-color-inv = 0. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'RESULTCOUNTER'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'LINETYPE'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'LEVEL'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'CONTENT'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'OBJECT'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'SOURCELINE'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'KEY1'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'KEY2'. APPEND lw_colored_field TO gt_colors. lw_colored_field-fname = 'ONE'. APPEND lw_colored_field TO gt_colors. loop at lt_statements into lw_statement. loop at lt_tokens into lw_token from lw_statement-from to lw_statement-to. case lw_token-STR. when 'SUBMIT'. lv_level = lw_token-STR. lv_TOKEN_ROW = lw_token-ROW. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. if sy-subrc <> 0. clear lw_token_hlp. endif. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). add 1 to gw_totals-submits. exit. when 'LEAVE'. lv_level = lw_token-STR. lv_TOKEN_ROW = lw_token-ROW. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. if sy-subrc <> 0. clear lw_token_hlp. elseif lw_token_hlp-str = 'TO'. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. endif. case lw_token_hlp-str. when 'PROGRAM'. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). add 1 to gw_totals-leave_prog. when 'SCREEN'. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. set_result( level = 'SCREEN' superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). add 1 to gw_totals-leave_screen. when 'TRANSACTION'. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. replace ALL OCCURRENCES OF '''' in lw_token_hlp-STR with ''. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). add 1 to gw_totals-leave_trans. endcase. exit. when 'CALL'. lv_TOKEN_ROW = lw_token-ROW. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. lv_level = lw_token_hlp-STR. "Either FUNCTION or TRANSACTION if lv_level = 'FUNCTION' or lv_level = 'TRANSACTION' or lv_level = 'SCREEN'. add 1 to lw_statement-from. read table lt_tokens into lw_token_hlp index lw_statement-from. replace ALL OCCURRENCES OF '''' in lw_token_hlp-STR with ''. set_result( level = lv_level superSourceline = lv_TOKEN_ROW key1 = lw_token_hlp-STR ). case lv_level. when 'SCREEN'. add 1 to gw_totals-call_dyn. when 'FUNCTION'. add 1 to gw_totals-call_fun. if not ( lw_token_hlp-STR(1) = 'Y' or lw_token_hlp-STR(1) = 'Z' ). add 1 to gw_totals-call_funS. endif. when 'TRANSACTION'. add 1 to gw_totals-call_tra. endcase. exit. endif. endcase. endloop. endloop. clear: gt_colors[]. endmethod. METHOD alv_report. DATA: lv_column TYPE i, lv_text TYPE scrtext_s, lv_text_m TYPE scrtext_m, lv_text_l TYPE scrtext_l, lw_layout_key TYPE salv_s_layout_key, lv_sourceline type char255. DEFINE set_text_field. rf_column ?= rf_columns_table->get_column( &1 ). lv_text = &2. lv_text_m = &2. lv_text_l = &2. rf_column->set_short_text( lv_text ). rf_column->set_medium_text( lv_text_m ). rf_column->set_long_text( lv_text_l ). END-OF-DEFINITION. DEFINE set_hidden_field. set_text_field &1 &2. rf_column->set_visible( abap_false ). END-OF-DEFINITION. DEFINE set_totals_field. lv_column = &2. rf_text = rf_alv_footer->create_text( text = &3 row = &1 column = lv_column ). rf_layout_data ?= rf_text->get_layout_data( ). rf_layout_data->set_h_align( if_salv_form_c_h_align=>right ). add 1 to lv_column. rf_text = rf_alv_footer->create_text( text = &4 row = &1 column = lv_column ). END-OF-DEFINITION. TRY. cl_salv_table=>factory( importing r_salv_table = go_alv changing t_table = gt_scan_results ). rf_functions_list = go_alv->get_functions( ). rf_functions_list->set_all( ). rf_columns_table = go_alv->get_columns( ). rf_columns_table->set_color_column( value = 'COLORS' ). rf_columns_table->set_optimize( abap_true ). "Always a good idea set_text_field: 'SUPERSOURCELINE' 'SuperSource line#', 'RESULTCOUNTER' 'Result#', 'LINETYPE' 'Type', 'LEVEL' 'Level', 'CONTENT' 'Source code', 'KEY1' 'Key'. set_hidden_field: 'OBJECT' 'Object', 'SOURCELINE' 'Line#', 'KEY2' 'Key2', 'ONE' 'Value 1'. * Sort fields rf_sorts = go_alv->get_sorts( ). rf_sorts->add_sort( COLUMNNAME = 'SUPERSOURCELINE' ). * Activate link in TRKORR and OBJECT: rf_column_table ?= rf_columns_table->get_column( 'SUPERSOURCELINE' ). rf_column_table->set_cell_type( if_salv_c_cell_type=>hotspot ). * Footer information CREATE OBJECT rf_alv_footer. describe table gt_sourcecode lines gw_totals-sourcelines. loop at gt_sourcecode into lv_sourceline. if lv_sourceline(1) = '*'. add 1 to gw_totals-commentlines. endif. if lv_sourceline(200) is initial. add 1 to gw_totals-blanklines. endif. endloop. subtract gw_totals-statics from gw_totals-local. set_totals_field: "line, First columnquantity, field label 1 1 '______' 'Summary', 2 1 gw_totals-objects '| Objects', 3 1 gw_totals-transactions '| Transactions', 4 1 gw_totals-dynpros '| Dynpros', 5 1 gw_totals-forms '| Form routines', 6 1 gw_totals-modules '| Modules', 7 1 gw_totals-methods '| Methods', 1 3 '______' 'Sourcecode', 2 3 gw_totals-sourcelines '| Source code lines', 3 3 gw_totals-commentlines '| Comments', 4 3 gw_totals-blanklines '| Blank', 1 5 '______' 'Data definitions', 2 5 gw_totals-global '| Global', 3 5 gw_totals-global_class '| Global (class)', 4 5 gw_totals-statics '| Global (statics)', 5 5 gw_totals-local '| Local', 1 7 '______' 'Updates', 2 7 gw_totals-insert '| Insert', 3 7 gw_totals-modify '| Modify', 4 7 gw_totals-update '| Update', 5 7 gw_totals-delete '| Delete', 6 7 gw_totals-sapstandard '| SAP standard (!)', 7 7 gw_totals-export '| Export', 8 7 gw_totals-import '| Import', 9 7 gw_totals-commit '| Commit/rollback', 1 9 '______' 'Exits', 2 9 gw_totals-call_dyn '| Call screen', 3 9 gw_totals-leave_screen '| Leave screen', 4 9 gw_totals-submits '| Submit', 5 9 gw_totals-call_tra '| Call transaction', 6 9 gw_totals-leave_trans '| Leave transaction', 7 9 gw_totals-call_fun '| Call function', 8 9 gw_totals-call_funs '| Call function (standard)', 9 9 gw_totals-leave_prog '| Leave program'. go_alv->set_end_of_list( rf_alv_footer ). rf_layout = go_alv->get_layout( ). lw_layout_key-report = sy-cprog. lw_layout_key-logical_group = '1721'. rf_layout->set_key( lw_layout_key ). rf_layout->set_default( abap_true ). rf_layout->set_save_restriction( if_salv_c_layout=>restrict_none ). CREATE OBJECT go_event_man EXPORTING r_object = go_alv. go_alv->display( ). CATCH cx_salv_msg cx_salv_not_found CX_SALV_DATA_ERROR CX_SALV_EXISTING. MESSAGE 'Error generating ALV report' TYPE 'E'. ENDTRY. ENDMETHOD. endclass. CLASS lcl_event_manager IMPLEMENTATION. METHOD constructor. DATA: lo_events TYPE REF TO cl_salv_events_table. go_salv = r_object. lo_events = go_salv->get_event( ). * SET HANDLER on_user_command FOR lo_events. SET HANDLER on_link_click FOR lo_events. ENDMETHOD. "constructor * METHOD on_user_command. * * ENDMETHOD. "on_user_command METHOD on_link_click. DATA: lt_bdcdata type standard table of bdcdata, lw_bdcdata type bdcdata, lw_scan_results type lcl_report_scanner=>ty_scan_results. * bdc_add 'X' 'PROGRAM_NAME' 'SCREEN NUMBER'. * bdc_add ' ' 'FIELDNAME' 'FIELDVALUE'. define bdc_add. clear lw_bdcdata. lw_bdcdata-dynbegin = &1. if &1 = 'X'. lw_bdcdata-program = &2. lw_bdcdata-dynpro = &3. else. lw_bdcdata-fnam = &2. lw_bdcdata-fval = &3. endif. append lw_bdcdata to lt_bdcdata. end-of-definition. READ TABLE lcl_report_scanner=>gt_scan_results INTO lw_scan_results INDEX row. IF sy-subrc = 0. CASE column. WHEN 'SUPERSOURCELINE'. clear: lt_bdcdata. bdc_add: 'X' 'SAPLWBABAP' '0100', ' ' 'RS38M-PROGRAMM' lw_scan_results-object, ' ' 'BDC_OKCODE' '=SHOP', 'X' 'SAPLS38E' '0400', ' ' 'RSTXP-TDFIRST' lw_scan_results-sourceLine+1, * ' ' 'BDC_OKCODE' '=SHOP', 'X' 'SAPLS38E' '0400'. call transaction 'SE38' using lt_bdcdata mode 'E'. ENDCASE. ENDIF. go_salv->refresh( ). ENDMETHOD. "on_link_click ENDCLASS. "lcl_event_manager IMPLEMENTATION SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(22) lbl_01 FOR FIELD pa_main. parameter: pa_main like sy-repid. SELECTION-SCREEN END OF LINE. INITIALIZATION. lbl_01 = 'Main program'. START-OF-SELECTION. lcl_report_scanner=>initialize( pa_main ). lcl_report_scanner=>scan_for_SKELETON( ). lcl_report_scanner=>scan_for_DATA( ). lcl_report_scanner=>scan_for_DB_ACTIONS( ). lcl_report_scanner=>scan_for_SUBMIT( ). lcl_report_scanner=>alv_report( ).