Um einen Hotspot erweiterte ALV
Transcription
Um einen Hotspot erweiterte ALV
ajanzen.com Um einen Hotspot erweiterte ALV-Anzeige ajanzen.com 1 Einleitung Der Fokus des vorliegenden Dokumentes liegt auf dem Aktivieren einer HotspotFunktion bei Verwendung von Klasse CL_SALV_TABLE. Im Rahmen dessen wird auch auf die Behandlung des Ereignisses LINK_CLICK eingegangen. Zur besseren Strukturierung des Codes ist die Ereignisbehandlung in ein eigenständiges INCLUDE ausgelagert. Die im vorliegenden Beispiel ausgeprägte Funktion ist relativ einfach und visualisiert ausschließlich den Inhalt der geklickten Zelle über die MESSAGE-Anweisung. Das komplette Beispielcoding ist in Kapitel 3 enthalten. Nähere Informationen zum Ablauf können Kapitel 2 entnommen werden. 1 ajanzen.com 2 Informationen zur Programmlogik Im vorliegenden Beispiel werden vorbereitend die Informationen aus Tabelle SFLIGHT in eine interne Tabelle zur Anzeige im ALV selektiert. Anschließend wird gezeigt, wie die ALV-Anzeige um eine Hotspot-Funktion erweitert werden kann. Das Ergebnis ist in Abbildung 1 dargestellt. Aus Gründen der Übersichtlichkeit sind Hauptprogramm und das INCLUDE zur Ereignisbehandlung in eigenständigen Kapiteln enthalten. 2.1 Hauptprogramm Im ersten Schritt des ALV-Aufrufes wird über die FACTORY-Methode der Klasse CL_SALV_TABLE eine Instanz derselben Klasse erzeugt. Dabei wird der FactoryMethode die Tabelle mit den anzuzeigenden Informationen direkt mitgegeben. Eine zusätzliche Angabe eines Feldkataloges ist nicht notwendig, da sich die CL_SALV_TABLE-Klasse die Dictionary-Informationen anhand der Tabellenfelder ermittelt. Über eine Instanz von Klasse CL_SALV_COLUMNS_TABLE wird die Spaltenbreite an den Inhalt angepasst (optimiert). Anschließend wird Methode GET_COLUMN( ) derselben Instanz aufgerufen. Dem Methodenaufruf wird die Spaltenbezeichnung 'CARRID' als Importing-Parameter mitgegeben. Das Ergebnis des Methodenaufrufes ist eine Instanz der Klasse CL_SALV_COLUMN_LIST (Achtung: Casting notwendig) mit Bezug zur Spalte CARRID. Das eigentliche Festlegen der Hotspots-Eigenschaft erfolgt über den Aufruf von Methode SET_CELL_TYPE( ) der CARRID-Spalteninstanz. Zum besseren Markieren der einzelnen Zeilen, erfolgt das Aktivieren des Selektionsmodus. Für diese Aktivität wird zum ALV eine Instanz der Klasse CL_SALV_SELECTIONS erzeugt und der Selektionsmodus durch Aufruf von Methode SET_SELECTION_MODE( ) gesetzt. Für das Aktivieren der Toolbar mit den ALV-Standardfunktionen, ist eine Instanz der Klasse CL_SALV_FUNCTIONS_LIST zum ALV notwendig. Das eigentliche Aktivieren erfolgt über Methode SET_ALL( ) der soeben erzeugten Instanz. 2 ajanzen.com Abbildung 1: Um einen Hotspot erweiterte ALV-Anzeige Wie bereits einleitend erwähnt, wird beim Klick auf den Hotspot ein Ereignis ausgelöst. Die Ereignisbehandlung findet über eine eigenständige lokale Klasse statt. Nähere Informationen zu der Klasse können Kapitel 2.2 entnommen werden. Damit das ALV weiß, wo das Klick-Ereignis behandelt wird, ist eine Verbindung zwischen Ereignis und Ereignis-Behandler herzustellen, also das Ereignis zu registrieren. Zum Registrieren wird eine Instanz der Klasse CL_SALV_EVENTS_ TABLE benötigt. Das Objekt der Klasse verwaltet die SALV-Ereignisse. Da zur Ereignisbehandlung eine eigenständige Klasse zum Einsatz kommt, muss diese ebenfalls instanziiert werden. Nach Instanziieren der lokalen Behandler-Klasse wird diese über die Anweisung SET HANDLER der Instanz von CL_SALV_EVENTS_ TABLE zugeordnet und damit die Verbindung zwischen Ereignis und Ereignisbehandlung hergestellt. Hinweis: Bei dem ausgelösten Ereignis handelt es sich um LINK_CLICK. Dieses kann der Registerkarte Ereignisse der Klasse CL_SALV_EVENTS_TABLE entnommen werden (siehe Abbildung 2). In der Behandler-Klasse kommt für die Ereignisbehandlung Methode HANDLE_HOTSPOT_CLICK zum Einsatz. Abbildung 2: Ereignis ADDED_FUNCTION der Klasse CL_SALV_EVENTS_TABLE 3 ajanzen.com Das eigentliche Anzeigen des ALV erfolgt über Methode DISPLAY( ) der ALV-Klasse. Da beim Aufruf der FACTORY-Methode kein Container mitgegeben wurde, kümmert sich die ALV-Klasse selbständig um einen Dynpro-Aufruf. 2.2 INCLUDE zur Ereignisbehandlung Wie bereits im Vorfeld beschrieben, ist für die Behandlung des Ereignisses HotspotClick eine Behandler-Klasse notwendig. In dem vorliegenden Beispiel wurde die Klasse in ein eigenständiges INCLUDE ausgelagert. Die ausgeprägte Logik ist in Kapitel 2.2 beschrieben. Die Behandler-Klasse besteht neben der Constructor-Methode ausschließlich aus Methode HANDLE_HOTSPOT_CLICK. Letztere wurde als Event-handler für das Ereignis LINK_CLICK der Klasse CL_SALV_EVENTS_TABLE definiert. Beim Instanziieren der Behandler-Klasse werden der Constructor-Methode eine Instanz der SALV-Klasse und die Tabelle mit den Daten übergeben. Der Inhalt beider Parameter wird in klassenglobalen Attributen abgelegt und damit für die Weiterverarbeitung vorgehalten. Bei Ablage der Datentabelle ist zu beachten, dass diese nicht über ein „=“ sondern über die Anweisung GET REFERENCE OF erfolgt. Siehe nachfolgende Erklärung: Bei Verwenden des „=“ für die Datenzuweisung wird der Inhalt der ImportparameterTabelle IT_SFLIGHT in das globale Klassenattribut kopiert. Dadurch existieren die Informationen (Tabellen) doppelt (siehe Abbildung 3). Globales Attribut GT_SFLIGHT_CLASS Importparameter IT_SFLIGHT Mandant 001 001 001 001 001 … Carrier AA AA AZ AZ AZ … Flug-Nr. 17 64 555 555 788 … Flugdatum 15.10.2014 12.12.2014 15.10.2014 04.02.2015 23.06.2015 … Flugpreis 422,94 422,94 185,00 185,00 1.030,00 … … … … … … … … Mandant 001 001 001 001 001 … Carrier AA AA AZ AZ AZ … Flug-Nr. 17 64 555 555 788 … Flugdatum 15.10.2014 12.12.2014 15.10.2014 04.02.2015 23.06.2015 … Flugpreis 422,94 422,94 185,00 185,00 1.030,00 … … … … … … … … Abbildung 3: Doppeln der Daten bei Zuweisung über „=“ Bei Verwendung der Anweisung GET REFERENCE OF wird ein Zeiger auf die übergebenen Daten erzeugt. Dadurch sind die Informationen nur einmal vorhanden und alle Änderungen (z.B. sortieren der Tabelle im ALV) sind ohne weiteren Aufwand ersichtlich (siehe Abbildung 4). 4 ajanzen.com Importparameter IT_SFLIGHT Mandant 001 001 001 001 001 … Carrier AA AA AZ AZ AZ … Flug-Nr. 17 64 555 555 788 … Flugdatum 15.10.2014 12.12.2014 15.10.2014 04.02.2015 23.06.2015 … Flugpreis 422,94 422,94 185,00 185,00 1.030,00 … … … … … … … … Globales Attribut GT_SFLIGHT_CLASS Abbildung 4: Zeiger auf Ursprungsdaten bei der Zuweisung GET REFERENCE OF Hinweis: In der FACTORY-Methode der SALV-Klasse wird ebenfalls nur eine Referenz auf die übergebenen Daten erzeugt. Die eigentliche Verarbeitungslogik von Methode HANDLE_HOTSPOT_CLICK ist relativ simpel. Unter Verwendung von Parameter ROW wird die Zeile mit dem geklickten Hotspot bestimmt. Das entsprechende Feld ist im Parameter COLUMN enthalten. Der Feldinhalt kann über die ASSIGN-Anweisung in ein Feldsymbol übernommen werden. Die Informationen zur geklickten Zeile und zum Feldinhalt werden verkettet und anschließend über die MESSAGE-Anweisung visualisiert. 5 3 Coding Wie aus der Überschrift ersichtlich ist, enthält Kapitel 3 das komplette Beispielcoding. Genau wie beim Aufbau von Kapitel 2 sind Hauptprogramm und das INCLUDE zur Ereignisbehandlung in eigenständigen Unterkapiteln enthalten. 3.1 Hauptprogramm *--------------------------------------------------------------------* * Das vorliegende Programm dient der Demonstration eines SALV mit der * mit einem HOTSPOT-Feld * * Date: 30.03.2015 *--------------------------------------------------------------------* * Änderungen *--------------------------------------------------------------------* REPORT zaj_sel_mode_hotspot_salv. *************************************************************************** **** * Include zur Ereignisbehandlung *************************************************************************** **** INCLUDE zaj_sel_mode_hotspot_salv_cl. DATA: gr_salv TYPE REF TO cl_salv_table. DATA: gr_columns TYPE REF TO cl_salv_columns_table. DATA: gr_column TYPE REF TO cl_salv_column_list. DATA: gr_functions TYPE REF TO cl_salv_functions_list. DATA: gr_selections TYPE REF TO cl_salv_selections. DATA: gt_sflight TYPE flighttab. DATA: gr_err_salv TYPE REF TO cx_salv_msg. DATA: gr_err_salv_not_found TYPE REF TO cx_salv_not_found. DATA: gv_string TYPE string. DATA: gr_events TYPE REF TO cl_salv_events_table. DATA: gr_event_handler TYPE REF TO gcl_event_handler. START-OF-SELECTION. *************************************************************************** **** * Selektion der anzuzeigenden Daten *************************************************************************** **** SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_sflight. IF sy-subrc NE 0. * In diesem Fall wird eine leere Tabelle angezeigt ENDIF. *************************************************************************** **** * Daten anzeigen *************************************************************************** **** TRY. * ALV-Instanz erzeugen CALL METHOD cl_salv_table=>factory EXPORTING list_display = if_salv_c_bool_sap=>false IMPORTING r_salv_table = gr_salv CHANGING t_table = gt_sflight. CATCH cx_salv_msg INTO gr_err_salv. * Fehler anzeigen gv_string = gr_err_salv->get_text( ). MESSAGE gv_string TYPE 'E'. ENDTRY. * Instanz für Spalten holen gr_columns = gr_salv->get_columns( ). * Spaltenbreite optimieren gr_columns->set_optimize( abap_true ). " nur ein 'X' * Die Spalte CARRID soll ein HOTSPOT werden ... TRY . * ... dazu das Spaltenobjekt holen gr_column ?= gr_columns->get_column( 'CARRID' ). * ... und die entsprechende Eigenschaft setzen gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ). CATCH cx_salv_not_found INTO gr_err_salv_not_found. * Fehler anzeigen gv_string = gr_err_salv_not_found->get_text( ). MESSAGE gv_string TYPE 'E'. ENDTRY. *************************************************************************** **** * Selection-Mode aktivieren *************************************************************************** **** * Instanz des Selection-Objektes holen gr_selections = gr_salv->get_selections( ). * Selektionsmodus setzen gr_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ). *************************************************************************** **** * Alle Standard-Funktionen auf aktiv setzen *************************************************************************** **** * Instanz für Funktionen holen gr_functions = gr_salv->get_functions( ). * Alle Standardfunktionen aktivieren gr_functions->set_all( abap_true ). " nur ein 'X' *************************************************************************** **** * Ereignis zum Behandeln des Button-Click registrieren *************************************************************************** **** * Das Objekt für die möglichen ALV-Ereignisse holen gr_events = gr_salv->get_event( ). * Objekt für die Ereignisbehandlung erzeugen ... CREATE OBJECT gr_event_handler EXPORTING cr_salv = gr_salv it_sflight = gt_sflight. * ... und bei den ALV-Ereignissen registrieren SET HANDLER gr_event_handler->handle_hotspot_click FOR gr_events. *************************************************************************** **** * ALV-Anzeige anstoßen *************************************************************************** **** * ALV-Anzeige anstoßen gr_salv->display( ). 3.2 INCLUDE zur Ereignisbehandlung *&---------------------------------------------------------------------* *& Include ZAJ_SEL_MODE_HOTSPOT_SALV_CL *&---------------------------------------------------------------------* *************************************************************************** **** * Definition der Klasse *************************************************************************** **** CLASS gcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: constructor IMPORTING cr_salv TYPE REF TO cl_salv_table it_sflight TYPE flighttab. METHODS: handle_hotspot_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column. PROTECTED SECTION. DATA: gr_salv_class TYPE REF TO cl_salv_table. DATA: gt_sflight_class TYPE REF TO flighttab. ENDCLASS. "gcl_event_handler DEFINITION *************************************************************************** **** * Implementierung der Klasse *************************************************************************** **** CLASS gcl_event_handler IMPLEMENTATION. METHOD constructor. * Importparameter in globale Klassenattribute übernehmen gr_salv_class = cr_salv. GET REFERENCE OF it_sflight INTO gt_sflight_class. ENDMETHOD. "constructor METHOD handle_hotspot_click. * CONSTANTS: lc_zero TYPE char1 VALUE '0'. DATA: ls_flight TYPE sflight. DATA: lv_message TYPE char250. DATA: lv_row_char TYPE char10. FIELD-SYMBOLS: <lv_any_value> TYPE any. Informationen zur geklickten Zeile lesen READ TABLE gt_sflight_class->* INTO ls_flight INDEX row. CHECK sy-subrc EQ 0. * Wert in Feldsymbol übernehmen0 ASSIGN COMPONENT column OF STRUCTURE ls_flight TO <lv_any_value>. CHECK sy-subrc EQ 0. MOVE row TO lv_row_char. SHIFT lv_row_char LEFT DELETING LEADING lc_zero. SHIFT lv_row_char LEFT DELETING LEADING space. * Nachricht vorbereiten ... auf eine Konvertierung des * Feldinhaltes wurde hier verzichtet CONCATENATE: 'Sie haben Wert' <lv_any_value> 'in Zeile' lv_row_char 'selektiert' INTO lv_message SEPARATED BY space. * Nachricht anzeigen MESSAGE lv_message TYPE 'I'. ENDMETHOD. ENDCLASS. "handle_toolbar_click "gcl_event_handler IMPLEMENTATION