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