*&---------------------------------------------------------------------* *& Report : /EUTIN/RSTABLESIZE *& Title : Determine space used by database tables *& Developer : EUTINM - 01-OCT-2015 *& Development Class : /EUTIN/TOOLS *& Descrition : *& Determine used database space of requested database tables. *& This is an enhanced copy of report RSTABLESIZE *& *&---------------------------------------------------------------------* *& CHANGE HISTORY *&---------------------------------------------------------------------* *& Date Request No User Id Description *&---------------------------------------------------------------------* *& *& *& *& *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT /eutin/rstablesize. *---------------------------------------------------------------------- *--- global data declarations *---------------------------------------------------------------------- TYPE-POOLS: slis. TYPES: BEGIN OF ts_cctabsize, tabname TYPE cctabsize-tabname, clidep TYPE dd02l-clidep, mandt TYPE cctabsize-mandt, nbrins TYPE cctabsize-nbrins, tablen TYPE cctabsize-tablen, size_kb TYPE cctabsize-size_kb, class TYPE cctabsize-class, contflag TYPE cctabsize-contflag, devclass TYPE cctabsize-devclass, ddtext TYPE dd02t-ddtext, *--- technical fields (to be hidden in ALV output) size TYPE cctabsize-size, clidepf TYPE dd03l-fieldname, END OF ts_cctabsize. DATA: gt_cctabsize TYPE STANDARD TABLE OF ts_cctabsize WITH DEFAULT KEY, "NEEDED gv_client TYPE t000-mandt, gv_tabname TYPE dd02l-tabname, gv_auth TYPE c LENGTH 1. *---------------------------------------------------------------------- *--- selection screen 1000 *---------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF BLOCK s10 WITH FRAME TITLE s10. SELECT-OPTIONS: s_client FOR gv_client, "SEL_WRONG s_table FOR gv_tabname. "SEL_WRONG PARAMETERS: p_empty AS CHECKBOX DEFAULT 'X', "SEL_WRONG p_lines TYPE i DEFAULT 10000. "SEL_WRONG SELECTION-SCREEN END OF BLOCK s10. *---------------------------------------------------------------------- *--- event: initialization *---------------------------------------------------------------------- INITIALIZATION. *--- default selection screen parameters and define texts for elements sy-title = 'Determine size and space used of database tables'. "NO_TEXT s10 = 'Output Options'. "NO_TEXT %_s_client_%_app_%-text = 'Client'. "NO_TEXT %_s_table_%_app_%-text = 'Table Name'. "NO_TEXT %_p_empty_%_app_%-text = 'Skip empty tables'. "NO_TEXT %_p_lines_%_app_%-text = 'Load max. lines'. "NO_TEXT *--- default client with current client CLEAR: s_client[], s_client. s_client-sign = 'I'. s_client-option = 'EQ'. s_client-low = sy-mandt. INSERT s_client INTO TABLE s_client. CLEAR gv_auth. *---------------------------------------------------------------------- *--- event: start-of-selection *---------------------------------------------------------------------- START-OF-SELECTION. IF s_table[] IS INITIAL. MESSAGE 'Specify a table name!' TYPE 'S' DISPLAY LIKE 'E'. "NO_TEXT RETURN. ENDIF. PERFORM auth_check. PERFORM run. *---------------------------------------------------------------------- *--- subroutines *---------------------------------------------------------------------- *----------------------------------------------------------------------* * CLASS lcl_event_receiver DEFINITIONS *----------------------------------------------------------------------* * Event handler for ALV grid display to react on doubleclick etc. * Check report SALV_DEMO_TABLE_EVENTS *----------------------------------------------------------------------* CLASS lcl_event_receiver DEFINITION FINAL. PUBLIC SECTION. METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column, "NEEDED on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column. "NEEDED ENDCLASS. " lcl_event_receiver *----------------------------------------------------------------------* * CLASS lcl_event_receiver IMPLEMENTATION *----------------------------------------------------------------------* * Event handler for ALV grid display to react on doubleclick etc. *----------------------------------------------------------------------* CLASS lcl_event_receiver IMPLEMENTATION. METHOD on_double_click. PERFORM display_table_cont USING row. ENDMETHOD. " ON_DOUBLE_CLICK METHOD on_link_click. CASE column. WHEN 'TABNAME'. PERFORM display_table_def USING row. WHEN 'DEVCLASS'. PERFORM display_devclass USING row. WHEN OTHERS. ENDCASE. ENDMETHOD. " ON_LINK_CLICK ENDCLASS. " lcl_event_receiver *&---------------------------------------------------------------------* *& Form RUN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM run. TYPES: BEGIN OF ts_sumtab, tabname TYPE dd02l-tabname, mandt TYPE cccflow-mandt, size TYPE cctabsize-size_kb, END OF ts_sumtab. DATA: lt_dd02l TYPE STANDARD TABLE OF dd02l WITH DEFAULT KEY, lt_dd02t TYPE STANDARD TABLE OF dd02t WITH DEFAULT KEY, lt_t000 TYPE STANDARD TABLE OF t000-mandt WITH DEFAULT KEY, lt_vrstabc TYPE SORTED TABLE OF vrstabc WITH UNIQUE KEY tabname, lt_sumtab TYPE STANDARD TABLE OF ts_sumtab WITH DEFAULT KEY, ls_t000 LIKE LINE OF lt_t000, ls_cctabsize LIKE LINE OF gt_cctabsize, ls_sumtab LIKE LINE OF lt_sumtab, lv_count TYPE i, lv_fieldname TYPE dd03l-fieldname, lv_cross_client TYPE c LENGTH 1. FIELD-SYMBOLS: LIKE LINE OF lt_dd02l, LIKE LINE OF lt_dd02t, LIKE LINE OF lt_t000, LIKE LINE OF gt_cctabsize, LIKE LINE OF lt_sumtab. *--- authorization check PERFORM auth_check. CLEAR gt_cctabsize[]. *--- determine requested tables and check on relevant table classes CLEAR lt_dd02l[]. SELECT * FROM dd02l INTO TABLE lt_dd02l WHERE tabname IN s_table AND as4local EQ 'A' AND as4vers EQ '0000' * AND CLIDEP = 'X' AND ( tabclass EQ 'TRANSP' OR tabclass EQ 'POOL' OR tabclass EQ 'CLUSTER' ) ORDER BY PRIMARY KEY. IF sy-subrc NE 0 OR lt_dd02l[] IS INITIAL. MESSAGE 'Nothing selected' TYPE 'S'. "NO_TEXT RETURN. ENDIF. *--- determine long texts of selected database tables CLEAR lt_dd02t[]. SELECT * FROM dd02t INTO TABLE lt_dd02t FOR ALL ENTRIES IN lt_dd02l WHERE tabname EQ lt_dd02l-tabname AND ddlanguage EQ sy-langu AND as4local EQ 'A' AND as4vers EQ '0000' ORDER BY PRIMARY KEY. IF sy-subrc NE 0 OR lt_dd02t[] IS INITIAL. CLEAR lt_dd02t[]. ENDIF. *--- determine used database table while table class is CLUSTER LOOP AT lt_dd02l ASSIGNING WHERE tabclass EQ 'CLUSTER'. -tabname = -sqltab. CLEAR: -sqltab, -contflag. -tabclass = 'TABCLUST'. ENDLOOP. SORT lt_dd02l ASCENDING BY tabname. *--- determine requested clients CLEAR lt_t000[]. SELECT mandt FROM t000 INTO TABLE lt_t000 WHERE mandt IN s_client ORDER BY mandt. IF sy-subrc NE 0. ls_t000 = sy-mandt. INSERT ls_t000 INTO TABLE lt_t000. ENDIF. *--- retrieve special handling of tables: client copy exception table CLEAR lt_vrstabc[]. SELECT * FROM vrstabc INTO TABLE lt_vrstabc WHERE tabmode EQ 'X' AND maxrelease GE sy-saprl ORDER BY PRIMARY KEY. LOOP AT lt_dd02l ASSIGNING . READ TABLE lt_vrstabc TRANSPORTING NO FIELDS WITH TABLE KEY tabname = -tabname. IF sy-subrc NE 0. CLEAR ls_cctabsize. ls_cctabsize-tabname = -tabname. ls_cctabsize-class = -tabclass. ls_cctabsize-contflag = -contflag. ls_cctabsize-clidep = -clidep. READ TABLE lt_dd02t ASSIGNING WITH KEY tabname = ls_cctabsize-tabname BINARY SEARCH. IF sy-subrc EQ 0. ls_cctabsize-ddtext = -ddtext. ENDIF. IF ls_cctabsize-class EQ 'TABCLUST'. SELECT SINGLE devclass FROM tadir INTO ls_cctabsize-devclass WHERE pgmid EQ 'R3TR' AND object EQ 'SQLT' AND obj_name EQ ls_cctabsize-tabname. ELSE. SELECT SINGLE devclass FROM tadir INTO ls_cctabsize-devclass WHERE pgmid EQ 'R3TR' AND object EQ 'TABL' AND obj_name EQ ls_cctabsize-tabname. ENDIF. CLEAR lv_cross_client. IF -clidep IS INITIAL. lv_cross_client = 'X'. ENDIF. LOOP AT lt_t000 ASSIGNING . IF lv_cross_client IS INITIAL. ls_cctabsize-mandt = . ENDIF. PERFORM get_table_size USING -clidep CHANGING ls_cctabsize lv_fieldname. IF ls_cctabsize-clidepf IS INITIAL. ls_cctabsize-clidepf = lv_fieldname. ENDIF. CASE p_empty. WHEN space. INSERT ls_cctabsize INTO TABLE gt_cctabsize. IF sy-subrc NE 0. WRITE: / 'SY-SUBRC: ', sy-subrc, "NO_TEXT 'INSERT ls_cctabsize INTO TABLE lt_cctabsize.'. "NO_TEXT RETURN. ENDIF. WHEN OTHERS. IF NOT ls_cctabsize-nbrins IS INITIAL. INSERT ls_cctabsize INTO TABLE gt_cctabsize. IF sy-subrc NE 0. WRITE: / 'SY-SUBRC: ', sy-subrc, "NO_TEXT 'INSERT ls_cctabsize INTO TABLE lt_cctabsize.'. "NO_TEXT RETURN. ENDIF. ENDIF. ENDCASE. ADD 1 TO lv_count. IF lv_count EQ 100. CLEAR lv_count. COMMIT WORK AND WAIT. ENDIF. IF NOT lv_cross_client IS INITIAL. *--- client-independent tables must be checked only once! EXIT. ENDIF. ENDLOOP. ENDIF. ENDLOOP. *--- present ALV output PERFORM display_alv. *--- present calculated summary of sizes used IF gt_cctabsize[] IS INITIAL. RETURN. ENDIF. LOOP AT gt_cctabsize ASSIGNING . ls_sumtab-tabname = -tabname. ls_sumtab-mandt = -mandt. ls_sumtab-size = -size_kb. COLLECT ls_sumtab INTO lt_sumtab. ENDLOOP. SORT lt_sumtab BY size DESCENDING. WRITE: / 'Table Analysis Status:', sy-datum, sy-uzeit. "NO_TEXT ULINE. CLEAR ls_cctabsize. WRITE: /1 'Table Name', AT 45 'Client', AT 88 'kByte'. "NO_TEXT ULINE. LOOP AT lt_sumtab ASSIGNING . WRITE: /1 -tabname, AT 45 -mandt, AT 53 -size. ADD -size TO ls_cctabsize-size_kb. ENDLOOP. SKIP 1. ULINE. WRITE: /1 'Total', AT 53 ls_cctabsize-size_kb. "NO_TEXT ULINE. ENDFORM. " RUN *&---------------------------------------------------------------------* *& Form GET_TABLE_SIZE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IV_CLIDEP text * <--CS_CCTABSIZE text * <--CV_FIELDNAME text *----------------------------------------------------------------------* FORM get_table_size USING iv_clidep TYPE dd02l-clidep CHANGING cs_cctabsize LIKE LINE OF gt_cctabsize cv_fieldname TYPE dd03l-fieldname. TYPES: tv_line TYPE c LENGTH 72, BEGIN OF ts_where_clause, line TYPE tv_line, END OF ts_where_clause. DATA: lt_dfies TYPE STANDARD TABLE OF dfies WITH DEFAULT KEY, lt_where TYPE STANDARD TABLE OF ts_where_clause WITH DEFAULT KEY, ls_where LIKE LINE OF lt_where, ls_x030l TYPE x030l, lv_text TYPE tv_line, lv_nt_subrc TYPE sysubrc, lv_subrc TYPE sysubrc. FIELD-SYMBOLS: LIKE LINE OF lt_dfies. CLEAR: cv_fieldname, lt_dfies[], lt_where[], ls_x030l. *--- authorization check PERFORM auth_check. *--- determine table size based on structure length CALL FUNCTION 'SCCR_GET_NAMETAB_AND_TABLEN' EXPORTING tabname = cs_cctabsize-tabname IMPORTING x030l = ls_x030l tablen = cs_cctabsize-tablen TABLES dfies = lt_dfies EXCEPTIONS ddic_error = 1 OTHERS = 2. lv_nt_subrc = sy-subrc. *--- ensure database table exists IF ls_x030l-tabform CO 'PC'. CALL FUNCTION 'DB_EXISTS_TABLE' EXPORTING tabname = ls_x030l-refname IMPORTING subrc = lv_subrc. ELSE. CALL FUNCTION 'DB_EXISTS_TABLE' EXPORTING tabname = cs_cctabsize-tabname IMPORTING subrc = lv_subrc. ENDIF. IF lv_subrc EQ 0 AND lv_nt_subrc EQ 0. IF iv_clidep IS INITIAL. *--- client-independent table: count all records! SELECT COUNT(*) FROM (cs_cctabsize-tabname) INTO cs_cctabsize-nbrins. ELSE. *--- client-dependent table: count all records for requested client! READ TABLE lt_dfies ASSIGNING INDEX 1. IF sy-subrc EQ 0. cv_fieldname = -fieldname. lv_text = '&FIELD = ''&CLIENT'' '. REPLACE '&FIELD' WITH -fieldname INTO lv_text. REPLACE '&CLIENT' WITH cs_cctabsize-mandt INTO lv_text. ls_where-line = lv_text. INSERT ls_where INTO TABLE lt_where. SELECT COUNT(*) FROM (cs_cctabsize-tabname) CLIENT SPECIFIED INTO cs_cctabsize-nbrins WHERE (lt_where). ENDIF. ENDIF. ENDIF. *--- calculate used space caused by existing records cs_cctabsize-size = cs_cctabsize-nbrins * cs_cctabsize-tablen. cs_cctabsize-size_kb = cs_cctabsize-size / 1024. ENDFORM. " GET_TABLE_SIZE *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM display_alv. DATA: lr_alv TYPE REF TO cl_salv_table, lr_display TYPE REF TO cl_salv_display_settings, lr_func TYPE REF TO cl_salv_functions_list, lr_columns TYPE REF TO cl_salv_columns_table, lr_column TYPE REF TO cl_salv_column_table, lr_events TYPE REF TO cl_salv_events_table, lr_event_receiver TYPE REF TO lcl_event_receiver, lx_salv_msg TYPE REF TO cx_salv_msg, lx_salv_error TYPE REF TO cx_salv_error, lx_root TYPE REF TO cx_root, lv_message TYPE string. IF gt_cctabsize[] IS INITIAL. MESSAGE 'Nothing selected' TYPE 'S'. "NO_TEXT RETURN. ENDIF. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lr_alv CHANGING t_table = gt_cctabsize[] ). *--- provide all functions lr_func = lr_alv->get_functions( ). lr_func->set_all( if_salv_c_bool_sap=>true ). *--- display with zebra striped lr_display = lr_alv->get_display_settings( ). lr_display->set_striped_pattern( cl_salv_display_settings=>true ). lr_display->set_list_header( 'Used space by database tables' ). "NO_TEXT *--- optimize columne width automatically lr_columns = lr_alv->get_columns( ). lr_columns->set_optimize( 'X' ). *--- change column attributes lr_column ?= lr_columns->get_column( 'SIZE' ). * lr_column->set_short_text( 'Short Text' ). * lr_column->set_medium_text( 'Medium Text' ). * lr_column->set_long_text( 'Long Description' ). lr_column->set_technical( cl_salv_display_settings=>true ). lr_column ?= lr_columns->get_column( 'CLIDEPF' ). lr_column->set_technical( cl_salv_display_settings=>true ). *--- create single-click event on value presented in column TABNAME lr_column ?= lr_columns->get_column( 'TABNAME' ). lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ). lr_column ?= lr_columns->get_column( 'DEVCLASS' ). lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ). *--- provide event handler for single-click event lr_events = lr_alv->get_event( ). CREATE OBJECT lr_event_receiver. SET HANDLER lr_event_receiver->on_double_click FOR lr_events. SET HANDLER lr_event_receiver->on_link_click FOR lr_events. *--- display table in ALV lr_alv->display( ). *--- error handling... CATCH cx_salv_msg INTO lx_salv_msg. lv_message = lx_salv_msg->if_message~get_text( ). MESSAGE lv_message TYPE 'E'. CATCH cx_salv_error INTO lx_salv_error. lv_message = lx_salv_error->if_message~get_text( ). MESSAGE lv_message TYPE 'E'. CATCH cx_root INTO lx_root. "CATCH_ALL lv_message = lx_root->if_message~get_text( ). MESSAGE lv_message TYPE 'E'. ENDTRY. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form DISPLAY_TABLE_DEF *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IV_ROW text *----------------------------------------------------------------------* FORM display_table_def USING iv_row TYPE i. DATA: ls_cctabsize LIKE LINE OF gt_cctabsize. READ TABLE gt_cctabsize INTO ls_cctabsize INDEX iv_row. IF sy-subrc EQ 0. IF ls_cctabsize-class EQ 'TABCLUST'. CALL FUNCTION 'RS_DD_SQLT_EDIT' EXPORTING objname = ls_cctabsize-tabname * FNAME = ' ' edit_mode = 'S' "Display * POPUP = ' ' * WITH_NEXT = ' ' * LOCAL = ' ' * DDIC_INST = * SQLT_STATE = * IMPORTING * FCODE = EXCEPTIONS object_not_found = 1 object_not_specified = 2 permission_failure = 3 not_executed = 4 OTHERS = 5. IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ELSE. CALL FUNCTION 'RS_DD_SHOW' EXPORTING objname = ls_cctabsize-tabname objtype = 'T' "Table * POPUP = ' ' * SECNAME = * MONITOR_ACTIVATE = 'X' * IMPORTING * FCODE = EXCEPTIONS object_not_found = 1 object_not_specified = 2 permission_failure = 3 type_not_valid = 4 OTHERS = 5. IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. ENDIF. ENDFORM. " DISPLAY_TABLE_DEF *&---------------------------------------------------------------------* *& Form DISPLAY_TABLE_CONT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IV_ROW text *----------------------------------------------------------------------* FORM display_table_cont USING iv_row TYPE i. ** DATA: ** lt_seltab TYPE STANDARD TABLE OF rsparams WITH DEFAULT KEY, ** ls_cctabsize LIKE LINE OF gt_cctabsize, ** ls_seltab LIKE LINE OF lt_seltab. ** ** FIELD-SYMBOLS: ** LIKE LINE OF gt_client. ** ** CLEAR: lt_seltab[], ls_seltab. ** ***--- determine requested line in ALV display ** READ TABLE gt_cctabsize INTO ls_cctabsize INDEX iv_row. ** IF sy-subrc EQ 0. ** IF NOT ls_cctabsize-mandt IS INITIAL AND ls_cctabsize-mandt NE sy-mandt. ***--- check if client-specific access is required ** READ TABLE gt_client ASSIGNING ** WITH TABLE KEY tabname = ls_cctabsize-tabname. ** IF sy-subrc EQ 0. ***--- client-specific table ==> access requested client ** ls_seltab-selname = -fieldname. ** ls_seltab-kind = 'S'. ** ls_seltab-sign = 'I'. ** ls_seltab-option = 'EQ'. ** ls_seltab-low = ls_cctabsize-mandt. ** INSERT ls_seltab INTO TABLE lt_seltab. ** ENDIF. ** CALL FUNCTION 'RS_TABLE_LIST_CREATE' ** EXPORTING ** table_name = ls_cctabsize-tabname ** action = 'ANZE' *** WITHOUT_SUBMIT = ' ' *** GENERATION_FORCED = *** NEW_SEL = *** NO_STRUCTURE_CHECK = ' ' *** DATA_EXIT = ' ' *** IMPORTING *** PROGNAME = ** TABLES ** seltab = lt_seltab ** EXCEPTIONS ** table_is_structure = 1 ** table_not_exists = 2 ** db_not_exists = 3 ** no_permission = 4 ** no_change_allowed = 5 ** OTHERS = 6. ** ELSE. ** CALL FUNCTION 'RS_TABLE_LIST_CREATE' ** EXPORTING ** table_name = ls_cctabsize-tabname ** action = 'ANZE' *** WITHOUT_SUBMIT = ' ' *** GENERATION_FORCED = *** NEW_SEL = *** NO_STRUCTURE_CHECK = ' ' *** DATA_EXIT = ' ' *** IMPORTING *** PROGNAME = *** TABLES *** SELTAB = ** EXCEPTIONS ** table_is_structure = 1 ** table_not_exists = 2 ** db_not_exists = 3 ** no_permission = 4 ** no_change_allowed = 5 ** OTHERS = 6. ** ENDIF. ** IF sy-subrc NE 0. ** IF NOT sy-msgty IS INITIAL. ** MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno ** WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ** ELSE. ** MESSAGE e000(oo) WITH 'FM RS_TABLE_LIST_CREATE' 'returned with error code:' sy-subrc ' '. ** ENDIF. ** ENDIF. ** ENDIF. TYPES: tv_line TYPE c LENGTH 72, BEGIN OF ts_where_clause, line TYPE tv_line, END OF ts_where_clause. DATA: lr_itab TYPE REF TO data, lr_alv TYPE REF TO cl_salv_table, lr_display TYPE REF TO cl_salv_display_settings, lr_func TYPE REF TO cl_salv_functions_list, lr_columns TYPE REF TO cl_salv_columns_table, lr_column TYPE REF TO cl_salv_column_table, lx_salv_msg TYPE REF TO cx_salv_msg, lx_salv_error TYPE REF TO cx_salv_error, lx_root TYPE REF TO cx_root, lt_where TYPE STANDARD TABLE OF ts_where_clause WITH DEFAULT KEY, ls_cctabsize LIKE LINE OF gt_cctabsize, ls_where LIKE LINE OF lt_where, lv_message TYPE string, lv_line TYPE tv_line, lv_title_prep TYPE c LENGTH 255, lv_title TYPE lvc_title, lv_str_nbrins TYPE c LENGTH 30, lv_str_tfill TYPE c LENGTH 15, lv_tfill TYPE i. FIELD-SYMBOLS: TYPE ANY TABLE. CLEAR: lt_where[], ls_where. UNASSIGN . *--- determine requested line in ALV display READ TABLE gt_cctabsize INTO ls_cctabsize INDEX iv_row. IF sy-subrc EQ 0. *--- check users authorization first CALL FUNCTION 'AUTHORITY_CHECK_TCODE' EXPORTING tcode = 'SE16' EXCEPTIONS ok = 0 not_ok = 1 OTHERS = 2. IF sy-subrc NE 0. *--- You are not authorized to use Transaction & MESSAGE e172(00) WITH 'SE16'. ENDIF. CALL FUNCTION 'VIEW_AUTHORITY_CHECK' EXPORTING view_action = 'U' "Display view_name = ls_cctabsize-tabname no_warning_for_clientindep = 'X' * CHECK_ACTION_ALTERNATIVE = * IMPORTING * GRANTED_ACTVT = * CHANGING * ORG_CRIT_INST = EXCEPTIONS invalid_action = 1 no_authority = 2 no_clientindependent_authority = 3 table_not_found = 4 no_linedependent_authority = 5 OTHERS = 6. IF sy-subrc NE 0. IF NOT sy-msgty IS INITIAL. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. *--- No display authorization for Table & MESSAGE e000(oo) WITH 'FM VIEW_AUTHORITY_CHECK' 'returned with error code:' sy-subrc ' '. "NO_TEXT ENDIF. ENDIF. IF NOT ls_cctabsize-clidep IS INITIAL AND NOT ls_cctabsize-mandt IS INITIAL AND ls_cctabsize-mandt NE sy-mandt. *--- client-specific table ==> access requested client lv_line = '&FIELD = ''&MANDT'' '. REPLACE '&FIELD' WITH ls_cctabsize-clidepf INTO lv_line. REPLACE '&MANDT' WITH ls_cctabsize-mandt INTO lv_line. ls_where-line = lv_line. INSERT ls_where INTO TABLE lt_where. ENDIF. TRY. CREATE DATA lr_itab TYPE TABLE OF (ls_cctabsize-tabname). ASSIGN lr_itab->* TO . IF lt_where[] IS INITIAL. *--- client-independent table ==> cross-client access SELECT * FROM (ls_cctabsize-tabname) UP TO p_lines ROWS INTO TABLE . ELSE. SELECT * FROM (ls_cctabsize-tabname) CLIENT SPECIFIED UP TO p_lines ROWS INTO TABLE WHERE (lt_where). ENDIF. CATCH cx_root INTO lr_root. "CATCH_ALL lv_message = lr_root->if_message~get_longtext( ). MESSAGE lv_message TYPE 'E'. ENDTRY. ENDIF. IF NOT IS ASSIGNED. RETURN. ENDIF. IF IS INITIAL. MESSAGE 'Nothing selected' TYPE 'S'. "NO_TEXT RETURN. ENDIF. lv_tfill = lines( ). WRITE lv_tfill TO lv_str_tfill LEFT-JUSTIFIED. WRITE ls_cctabsize-nbrins TO lv_str_nbrins LEFT-JUSTIFIED. CONCATENATE 'Table' ls_cctabsize-tabname '- Records' lv_str_tfill 'of' lv_str_nbrins "NO_TEXT INTO lv_title_prep SEPARATED BY ' '. lv_title = lv_title_prep. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lr_alv CHANGING t_table = ). *--- provide all functions lr_func = lr_alv->get_functions( ). lr_func->set_all( if_salv_c_bool_sap=>true ). *--- display with zebra striped lr_display = lr_alv->get_display_settings( ). lr_display->set_striped_pattern( cl_salv_display_settings=>true ). lr_display->set_list_header( lv_title ). *--- optimize columne width automatically lr_columns = lr_alv->get_columns( ). lr_columns->set_optimize( 'X' ). *--- change column attributes IF NOT ls_cctabsize-clidepf IS INITIAL. lr_column ?= lr_columns->get_column( ls_cctabsize-clidepf ). lr_column->set_technical( cl_salv_display_settings=>false ). ENDIF. *--- display table in ALV lr_alv->display( ). *--- error handling... CATCH cx_salv_msg INTO lx_salv_msg. lv_message = lx_salv_msg->if_message~get_text( ). MESSAGE lv_message TYPE 'E'. CATCH cx_salv_error INTO lx_salv_error. lv_message = lx_salv_error->if_message~get_text( ). MESSAGE lv_message TYPE 'E'. CATCH cx_root INTO lx_root. "CATCH_ALL lv_message = lx_root->if_message~get_text( ). MESSAGE lv_message TYPE 'E'. ENDTRY. ENDFORM. " DISPLAY_TABLE_CONT *&---------------------------------------------------------------------* *& Form DISPLAY_DEVCLASS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->IV_ROW text *----------------------------------------------------------------------* FORM display_devclass USING iv_row TYPE i. DATA ls_cctabsize LIKE LINE OF gt_cctabsize. READ TABLE gt_cctabsize INTO ls_cctabsize INDEX iv_row. IF sy-subrc EQ 0. SET PARAMETER ID 'PB_ENTRY_CB_PACK' FIELD 'X'. SET PARAMETER ID 'PACKNAME' FIELD ls_cctabsize-devclass. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SE21' * SKIP_SCREEN = ' ' * MODE_VAL = 'A' * UPDATE_VAL = 'A' * IMPORTING * SUBRC = * TABLES * USING_TAB = * SPAGPA_TAB = * MESS_TAB = EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. CASE sy-subrc. WHEN 0. RETURN. WHEN OTHERS. *--- You are not authorized to perform this activity. MESSAGE e018(s#). ENDCASE. ENDIF. ENDFORM. " DISPLAY_DEVCLASS *&---------------------------------------------------------------------* *& Form AUTH_CHECK *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM auth_check. IF NOT gv_auth IS INITIAL. RETURN. ENDIF. AUTHORITY-CHECK OBJECT 'S_TABU_CLI' ID 'CLIIDMAINT' FIELD 'X'. IF sy-subrc NE 0. *--- You are not authorized to perform this activity. MESSAGE e018(s#). ENDIF. CALL FUNCTION 'AUTHORITY_CHECK_TCODE' EXPORTING tcode = 'SA38' EXCEPTIONS ok = 0 not_ok = 1 OTHERS = 2. IF sy-subrc NE 0. *--- You are not authorized to perform this activity. MESSAGE e018(s#). ENDIF. AUTHORITY-CHECK OBJECT 'S_RZL_ADM' ID 'ACTVT' FIELD '03'. "Display IF sy-subrc NE 0. *--- You are not authorized to perform this activity. MESSAGE e018(s#). ENDIF. gv_auth = 'X'. ENDFORM. " AUTH_CHECK *--- The End!