Quelle / Inspiration gefunden auf: www.tricktresor.de
* ALV-Konstanten
INCLUDE <cl_alv_control>.
CLASS lcl_main DEFINITION.
PUBLIC SECTION.
TYPES: ty_enum TYPE i.
TYPES: BEGIN OF ty_param,
name TYPE string,
type TYPE ty_enum,
text TYPE string,
value TYPE string,
END OF ty_param.
TYPES: ty_it_params TYPE STANDARD TABLE OF ty_param WITH NON-UNIQUE DEFAULT KEY.
* Enum
CLASS-DATA: string TYPE ty_enum VALUE 1 READ-ONLY.
CLASS-DATA: int TYPE ty_enum VALUE 2 READ-ONLY.
CLASS-DATA: float TYPE ty_enum VALUE 3 READ-ONLY.
CLASS-DATA: date TYPE ty_enum VALUE 4 READ-ONLY.
* Bezeichner
CONSTANTS: co_name TYPE string VALUE 'NAME'.
CONSTANTS: co_type TYPE string VALUE 'TYPE'.
CONSTANTS: co_text TYPE string VALUE 'TEXT'.
CONSTANTS: co_value TYPE string VALUE 'VALUE'.
METHODS: constructor
IMPORTING
o_parent TYPE REF TO cl_gui_container.
METHODS: init_grid.
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.
METHODS: on_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING
er_data_changed
sender.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD constructor.
o_grid = NEW #( i_parent = o_parent ).
ENDMETHOD.
* ALV-Gitter initialisieren
METHOD init_grid.
DATA(it_fieldcat) = VALUE lvc_t_fcat( ( fieldname = co_name
outputlen = 15
coltext = 'Parameter'
style = alv_style_font_bold + alv_style_color_int_group )
( fieldname = co_type
outputlen = 5
coltext = 'Type'
no_out = abap_true )
( fieldname = co_text
outputlen = 15
coltext = 'Text' )
( fieldname = co_value
outputlen = 20
coltext = 'Value'
edit = abap_true
fix_column = abap_true ) ).
DATA(s_layout) = VALUE lvc_s_layo( no_toolbar = abap_true
no_headers = abap_false ).
SET HANDLER on_data_changed FOR o_grid.
* Tastenevents registrieren
o_grid->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_enter ). " Enter
o_grid->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_modified ). " Eingabe, Cursortasten
* ALV-Grid selektionsbereit setzen
o_grid->set_ready_for_input( i_ready_for_input = 1 ).
o_grid->set_table_for_first_display( EXPORTING
is_layout = s_layout
CHANGING
it_outtab = it_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
type = parameter-type
text = parameter-text
value = parameter-value ) TO it_params.
ENDMETHOD.
METHOD on_data_changed.
* geänderte Zellen durchgehen
LOOP AT er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<fs_changed>).
IF <fs_changed> IS ASSIGNED.
* Zeile x aus der iTab it_params rausholen und daraus die Zelle anhand des Spaltennamens (Feldnamens) holen
TRY.
ASSIGN COMPONENT <fs_changed>-fieldname OF STRUCTURE it_params[ <fs_changed>-row_id ] TO FIELD-SYMBOL(<fs_param>).
IF <fs_param> IS ASSIGNED.
* Änderungswert in die Zelle der iTab (it_params) rückschreiben
CASE it_params[ <fs_changed>-row_id ]-type.
WHEN lcl_main=>string.
<fs_param> = <fs_changed>-value.
WHEN lcl_main=>int.
* Typprüfung für Int
IF cl_abap_matcher=>create( pattern = '^[-+]?[0-9]*$'
text = <fs_changed>-value
ignore_case = abap_true )->match( ) = abap_true.
<fs_param> = <fs_changed>-value.
ELSE.
* Eingabefehler im Protokoll anzeigen
er_data_changed->add_protocol_entry( i_msgid = '0K'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = 'Ungültiger Wert:'
i_msgv2 = <fs_changed>-value
i_msgv3 = 'Bitte einen Wert vom Typ int eingeben!'
i_msgv4 = ''
i_fieldname = <fs_changed>-fieldname
i_row_id = <fs_changed>-row_id ).
ENDIF.
WHEN lcl_main=>float.
* Typprüfung für Float
IF cl_abap_matcher=>create( pattern = '^[-+]?[0-9]*[,]?[0-9]+([eE][-+]?[0-9]+)?$'
text = <fs_changed>-value
ignore_case = abap_true )->match( ) = abap_true.
<fs_param> = <fs_changed>-value.
ELSE.
* Eingabefehler im Protokoll anzeigen
er_data_changed->add_protocol_entry( i_msgid = '0K'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = 'Ungültiger Wert:'
i_msgv2 = <fs_changed>-value
i_msgv3 = 'Bitte einen Wert vom Typ float eingeben!'
i_msgv4 = ''
i_fieldname = <fs_changed>-fieldname
i_row_id = <fs_changed>-row_id ).
ENDIF.
WHEN lcl_main=>date.
* Typprüfung für Date
IF cl_abap_matcher=>create( pattern = '^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$'
text = <fs_changed>-value
ignore_case = abap_true )->match( ) = abap_true.
<fs_param> = <fs_changed>-value.
ELSE.
* Eingabefehler im Protokoll anzeigen
er_data_changed->add_protocol_entry( i_msgid = '0K'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = 'Ungültiger Wert:'
i_msgv2 = <fs_changed>-value
i_msgv3 = 'Bitte einen Datumswert im Format dd.mm.yyyy eingeben!'
i_msgv4 = ''
i_fieldname = <fs_changed>-fieldname
i_row_id = <fs_changed>-row_id ).
ENDIF.
ENDCASE.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDIF.
ENDLOOP.
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_left
extension = 500
no_autodef_progid_dynnr = abap_true ) ).
* Beispiel-Parameter einfügen
* String-Parameter
o_main->add_parameter( VALUE #( name = 'PERSON_VOR'
type = lcl_main=>string
text = 'Vorname'
value = 'Udo' ) ).
* String-Parameter
o_main->add_parameter( VALUE #( name = 'PERSON_NACH'
type = lcl_main=>string
text = 'Nachname'
value = 'Lehmann' ) ).
* Int-Parameter
o_main->add_parameter( VALUE #( name = 'PERSON_ALTER'
type = lcl_main=>int
text = 'Alter'
value = '34' ) ).
* Float-Parameter
o_main->add_parameter( VALUE #( name = 'PERSON_GROESSE'
type = lcl_main=>float
text = 'Größe'
value = '1,80' ) ).
* Date-Parameter
o_main->add_parameter( VALUE #( name = 'PERSON_DATE'
type = lcl_main=>date
text = 'Geburtsdatum'
value = '01.01.1980' ) ).
**********************************************************************
*
* AT SELECTION-SCREEN OUTPUT
*
**********************************************************************
AT SELECTION-SCREEN OUTPUT.
IF o_main IS BOUND.
o_main->init_grid( ).
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.