Quelle / Inspiration gefunden auf: www.tricktresor.de
Die Codeteile mit UNDEF / abap_undefined können auch auskommentiert werden, so dass sich eine Möglichkeit der Dual-State Umschaltung (ON / OFF) per Mausklick ergibt.
* ALV-Konstanten INCLUDE <cl_alv_control>. CLASS lcl_main DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_param, name TYPE string, text TYPE string, status TYPE boolean, END OF ty_param. TYPES: ty_it_params TYPE STANDARD TABLE OF ty_param WITH NON-UNIQUE DEFAULT KEY. TYPES: BEGIN OF ty_ui_param, name TYPE string, text TYPE string, status TYPE icon_text, t_color TYPE lvc_t_scol, t_style TYPE lvc_t_styl, END OF ty_ui_param. TYPES: ty_it_ui_params TYPE STANDARD TABLE OF ty_ui_param. TYPES: ty_cell_type TYPE i. CONSTANTS: co_celltype_hotspot TYPE ty_cell_type VALUE 1. CONSTANTS: co_celltype_button TYPE ty_cell_type VALUE 2. * Farben CONSTANTS: co_color_on TYPE i VALUE col_positive. CONSTANTS: co_color_off TYPE i VALUE col_negative. CONSTANTS: co_color_undef TYPE i VALUE col_total. * Bezeichner CONSTANTS: co_status TYPE string VALUE 'STATUS'. CONSTANTS: co_on TYPE string VALUE 'ON'. CONSTANTS: co_off TYPE string VALUE 'OFF'. CONSTANTS: co_undef TYPE string VALUE 'N/A'. * Icons CONSTANTS status_icon_on TYPE icon_text VALUE icon_oo_object. CONSTANTS status_icon_off TYPE icon_text VALUE icon_system_start_recording. CONSTANTS status_icon_undef TYPE icon_text VALUE icon_oo_class. * CONSTANTS status_icon_undef TYPE icon_text VALUE icon_led_yellow. METHODS: constructor IMPORTING o_parent TYPE REF TO cl_gui_container. METHODS: init_grid IMPORTING cell_type TYPE ty_cell_type. METHODS: add_parameter IMPORTING parameter TYPE ty_param. METHODS: get_params RETURNING VALUE(rv_it_parameters) TYPE ty_it_params. PROTECTED SECTION. DATA: o_grid TYPE REF TO cl_gui_alv_grid. DATA: it_params TYPE ty_it_params. DATA: it_ui_params TYPE ty_it_ui_params. METHODS: set_color IMPORTING status TYPE boolean RETURNING VALUE(color) TYPE lvc_t_scol. METHODS: on_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id. METHODS: on_button_click FOR EVENT button_click OF cl_gui_alv_grid IMPORTING es_col_id es_row_no. ENDCLASS. CLASS lcl_main IMPLEMENTATION. METHOD constructor. o_grid = NEW #( i_parent = o_parent ). ENDMETHOD. METHOD init_grid. CLEAR: it_ui_params. * Parameter in ALV-Zeilen umwandeln LOOP AT it_params ASSIGNING FIELD-SYMBOL(<fs_param>). CASE <fs_param>-status. WHEN abap_true. * ON APPEND VALUE #( name = <fs_param>-name text = <fs_param>-text status = |{ status_icon_on } { co_on }| t_color = me->set_color( abap_true ) ) TO it_ui_params. WHEN abap_false. * OFF APPEND VALUE #( name = <fs_param>-name text = <fs_param>-text status = |{ status_icon_off } { co_off }| t_color = me->set_color( abap_false ) ) TO it_ui_params. WHEN abap_undefined. * UNDEF APPEND VALUE #( name = <fs_param>-name text = <fs_param>-text status = |{ status_icon_undef } { co_undef }| t_color = me->set_color( abap_undefined ) ) TO it_ui_params. ENDCASE. ENDLOOP. DATA: it_fieldcat TYPE lvc_t_fcat. IF cell_type = co_celltype_button. it_fieldcat = VALUE lvc_t_fcat( ( fieldname = 'NAME' outputlen = 15 coltext = 'Parameter' style = alv_style_font_bold + alv_style_color_int_group ) ( fieldname = 'TEXT' outputlen = 20 coltext = 'Description' ) ( fieldname = co_status outputlen = 10 coltext = 'Switch' style = alv_style_button icon = abap_true fix_column = abap_true ) ). ELSE. it_fieldcat = VALUE lvc_t_fcat( ( fieldname = 'NAME' outputlen = 15 coltext = 'Parameter' style = alv_style_font_bold + alv_style_color_int_group ) ( fieldname = 'TEXT' outputlen = 20 coltext = 'Description' ) ( fieldname = co_status outputlen = 10 coltext = 'Switch' hotspot = abap_true icon = abap_true fix_column = abap_true ) ). ENDIF. DATA(s_layout) = VALUE lvc_s_layo( stylefname = 'T_STYLE' ctab_fname = 'T_COLOR' no_toolbar = abap_true no_headers = abap_false ). SET HANDLER on_hotspot_click FOR o_grid. SET HANDLER on_button_click FOR o_grid. o_grid->set_table_for_first_display( EXPORTING is_layout = s_layout CHANGING it_outtab = it_ui_params it_fieldcatalog = it_fieldcat ). ENDMETHOD. * Parameterliste zurückholen METHOD get_params. rv_it_parameters = it_params. ENDMETHOD. * Parameter hinzufügen METHOD add_parameter. APPEND VALUE #( name = parameter-name text = parameter-text status = parameter-status ) TO it_params. ENDMETHOD. * Hintergrundfarben setzen METHOD set_color. CASE status. WHEN abap_true. * Grün / ON color = VALUE #( ( fname = co_status color-col = co_color_on ) ). WHEN abap_false. * Rot / OFF color = VALUE #( ( fname = co_status color-col = co_color_off ) ). WHEN abap_undefined. * Gelb / UNDEF color = VALUE #( ( fname = co_status color-col = co_color_undef ) ). ENDCASE. ENDMETHOD. METHOD on_hotspot_click. * geklickte ALV-Zeile holen READ TABLE it_ui_params ASSIGNING FIELD-SYMBOL(<ui_param>) INDEX e_row_id-index. * korrespondierenden Parameter ermitteln READ TABLE it_params ASSIGNING FIELD-SYMBOL(<param>) WITH KEY name = <ui_param>-name. CASE <param>-status. WHEN abap_true. * ON->OFF <ui_param>-status = |{ status_icon_off } { co_off }|. <ui_param>-t_color = me->set_color( abap_false ). <param->-status = abap_false. WHEN abap_false. * OFF->UNDEF <ui_param>-status = |{ status_icon_undef } { co_undef }|. <ui_param>-t_color = me->set_color( abap_undefined ). <param>-status = abap_undefined. WHEN abap_undefined. * UNDEF->ON <ui_param>-status = |{ status_icon_on } { co_on }|. <ui_param>-t_color = me->set_color( abap_true ). <param>-status = abap_true. ENDCASE. o_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = abap_true col = abap_true ) i_soft_refresh = abap_false ). ENDMETHOD. METHOD on_button_click. * geklickte ALV-Zeile holen READ TABLE it_ui_params ASSIGNING FIELD-SYMBOL(<ui_param>) INDEX es_row_no-row_id. * korrespondierenden Parameter ermitteln READ TABLE it_params ASSIGNING FIELD-SYMBOL(<param>) WITH KEY name = <ui_param>-name. CASE <param>-status. WHEN abap_true. * ON->OFF <ui_param>-status = status_icon_off. <ui_param>-t_color = me->set_color( abap_false ). <param>-status = abap_false. WHEN abap_false. * OFF->UNDEF <ui_param>-status = status_icon_undef. <ui_param>-t_color = me->set_color( abap_undefined ). <param>-status = abap_undefined. WHEN abap_undefined. * UNDEF->ON <ui_param>-status = status_icon_on. <ui_param>-t_color = me->set_color( abap_true ). <param>-status = abap_true. ENDCASE. o_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = abap_true col = abap_true ) i_soft_refresh = abap_false ). ENDMETHOD. ENDCLASS. ********************************************************************** * * Datentypen, Variablen, Konstanten * ********************************************************************** DATA: o_main TYPE REF TO lcl_main. ********************************************************************** * * SELECTION-SCREEN * ********************************************************************** SELECTION-SCREEN BEGIN OF SCREEN 2000. SELECTION-SCREEN END OF SCREEN 2000. ********************************************************************** * * INITIALIZATION * ********************************************************************** INITIALIZATION. o_main = NEW #( o_parent = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_right extension = 400 no_autodef_progid_dynnr = abap_true ) ). o_main->add_parameter( VALUE #( name = 'SHOW_RESULT' text = 'Ergebnisse anzeigen' status = abap_true ) ). o_main->add_parameter( VALUE #( name = 'HIDE_COLS' text = 'Spalten ausblenden' status = abap_false ) ). o_main->add_parameter( VALUE #( name = 'DELETE_ON_EXIT' text = 'Beim Beenden löschen' status = abap_undefined ) ). ********************************************************************** * * AT SELECTION-SCREEN OUTPUT * ********************************************************************** AT SELECTION-SCREEN OUTPUT. IF o_main IS BOUND. * Flag cell_type triggert den Typ (Hotspot / Button) des Klick-Feldes o_main->init_grid( cell_type = lcl_main=>co_celltype_hotspot ). ENDIF. ********************************************************************** * * AT SELECTION-SCREEN * ********************************************************************** AT SELECTION-SCREEN. * wenn "Ausführen" (F8) geklickt wurde IF sy-ucomm = 'CRET'. cl_demo_output=>display_data( o_main->get_params( ) ). ENDIF. ********************************************************************** * * START-OF-SELECTION * ********************************************************************** START-OF-SELECTION. * leeres Selektionbild 2000 anzeigen CALL SELECTION-SCREEN 2000.