ALV-Anzeige im Selection-Mode mit angepassten Zellenfarben

ajanzen.com
ALV-Anzeige im Selection-Mode mit
angepassten Zellenfarben
ajanzen.com
1 Einleitung
In dem vorliegenden Dokument wird anhand eines Beispiels auf die Möglichkeit einer
schnell programmierten Visualisierung von Informationen unter Verwendung der
Klasse CL_SALV_TABLE eingegangen. Zusätzlich wird gezeigt, wie der SelectionMode aktiviert und Zellenfarben angepasst werden können.
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 die Informationen aus Tabelle SFLIGHT in eine
interne Tabelle selektiert und in Form eines ALVs (siehe Abbildung unten) mit
angepassten Zellenfarben visualisiert. Zusätzlich wird der Selektionsmodus so
geändert, sodass das Markieren mehrerer Zeilen möglich ist.
Im ersten Schritt des ALV-Aufrufes wird über die FACTORY-Methode der Klasse
CL_SALV_TABLE eine Instanz derselben Klasse erzeugt. Außerdem wird der
Factory-Methode
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 eigenständig ermittelt.
Anschließend wird durch Aufruf von Methode SET_OPTIMIZE() der Klasse
CL_SALV_COLUMNS_TABLE die Spaltenbreite an den Inhalt angepasst.
Hinweis: Bei Klasse CL_SALV_COLUMNS_TABLE handelt es sich um das
Hauptobjekt zur Verwaltung von ALV-Spalten.
Das
Setzen
eines
Selektionsmodus
erfolgt
über
ein
eigenständiges
Selektionsobjekt vom Typ der Klasse CL_SALV_SELECTIONS. Für dieses
Vorgehen wird Methode SET_SELECTION_MODE( ) der benannten Klasse
aufgerufen.
Hinweis: Neben dem im Beispiel verwendeten Selektionsmodus existieren noch
weitere Modi. Diese sind als Attribute in Interface IF_SALV_C_SELECTION_MODE
enthalten.
Dem nächsten Schritt kann das Vorgehen zum Ändern der Farben einzelner Zellen
bzw. einer ganzer Zeilen entnommen werden. Dabei ist zu beachten, dass die
Farbinformation in einer eigenständigen Tabelle enthalten ist. Diese Tabelle ist vom
Typ LVC_T_SCOL und wird als Bestandteil der Tabelle mit den zu visualisierenden
Informationen deklariert. In dem Beispielcoding hat die Farbinformationstabelle die
Bezeichnung COLOR (siehe Abbildung 1).
2
ajanzen.com
Abbildung 1: Um Farbinformationen erweiterte Struktur
Aus der Typisierung in Abbildung 1 ist ersichtlich, dass die Angabe der
Farbinformationen pro Datensatz der internen Datentabelle erfolgt. Dieses Vorgehen
bietet den Vorteil der datensatzscharfen Farbsteuerung.
Beim Festlegen der Farbinformationen kann gesteuert werden, ob diese für die
gesamte Zeile (Datensatz), oder nur für bestimmte Zellen der Zeile gültig sind. Gilt
eine Farbinformation ausschließlich für bestimmte Zellen (siehe Abbildung 2 roter
Rahmen), ist der Spaltenname mitzugeben. Farbinformationen ohne Angabe eines
Spaltennamens (siehe Abbildung 2 grüner Rahmen) gelten für die gesamte Zeile.
Abbildung 2: Steuerung der zellen- bzw. zeilenabhängigen Farbinformationen
Durch Aufruf von Methode SET_COLOR_COLUMN() des ALV-Spaltenobjektes wird
dem ALV mitgeteilt, in welcher Strukturkomponenten die Farbinformationen
enthalten sind.
Die in SAP mögliche Farbpalette ist relativ überschaubar, kann jedoch durch die
Attribute INT und INV der Struktur LVC_T_SCOL-COLOR etwas differenziert werden.
In Abbildung 3 sind die möglichen Farbausprägungen aufgeführt. Diese können über
die links benannten Nummern gesteuert werden. So werden in Abbildung 2
beispielsweise die Farben mit den Nummern 3 und 7 verwendet.
3
ajanzen.com
Abbildung 3: Steuerung von ALV-Farben durch Zahlenvergabe
Zusätzlich werden die ALV-Standardfunktionen mit Methode SET_ALL() der Klasse
CL_SALV_FUNCTIONS_LIST aktiviert.
Abschließend findet die eigentliche Datenvisualisierung unter Verwendung der
Methode DISPLAY() statt.
Aus Abbildung 4 ist das Ergebnis des Reports ersichtlich. Dabei ist durch den roten
Rahmen der Selektionsmodus gekennzeichnet. Der grüne Rahmen hebt Zellen mit
geänderten Farben hervor.
Abbildung 4: ALV im Selektionsmodus mit angepassten Zellenfarben
Wie in Abbildung 4 gezeigt, sind die Spalten Mandant, Carrier, Flug-Nr. und
Flugdatum blau gefärbt. Diese Farbe wird von SAP automatisch verwendet, um
Schlüsselfelder zu kennzeichnen. Dabei hat die Farbdarstellung von Schlüsselfeldern
eine höhere Priorität als manuell gesetzt Farbinformationen für eine Zeile. Bei Bedarf
kann die Schlüsselfeld-Eigenschaft einer Spalte wie folgt deaktiviert werden:
4
ajanzen.com
* Instanz für Spalten holen
DATA: gr_column TYPE REF TO cl_salv_column_table.
gr_columns = gr_salv->get_columns( ).
* Die relevante Spalte ermitteln
gr_column ?= gr_columns->get_column( 'MANDT' ).
* Schlüsseleigenschaft ausschalten
gr_column->set_key( abap_false ). " nur ein ' '
Zum Einfärben ganzer Spalten kann folgende Logik verwendet werden:
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gs_color
TYPE lvc_s_colo.
gr_columns = gr_salv->get_columns(
).
gr_column ?= gr_columns->get_column( 'PAYMENTSUM' ).
gs_color-col = 5.
gr_column->set_color( gs_color ).
5
3 Coding
*--------------------------------------------------------------------*
* Das vorliegende Programm dient der Demonstration eines SALV im
* Selection-mode mit geänderten Farben einzelner Zellen
*
* Date: 27.03.2015
*--------------------------------------------------------------------*
* Änderungen
*--------------------------------------------------------------------*
REPORT
zaj_ren_con_funct_salv.
TYPES: BEGIN OF gs_sflight_ty.
INCLUDE STRUCTURE sflight.
TYPES: color TYPE lvc_t_scol.
TYPES: END OF gs_sflight_ty.
DATA: gr_salv
TYPE REF TO cl_salv_table.
DATA: gr_columns
TYPE REF TO cl_salv_columns_table.
DATA: gr_functions
TYPE REF TO cl_salv_functions_list.
DATA: gr_selections
TYPE REF TO cl_salv_selections.
DATA: gt_sflight
TYPE STANDARD TABLE OF gs_sflight_ty.
DATA: gr_err_salv
TYPE REF TO cx_salv_msg.
DATA: gv_string
TYPE string.
DATA: gs_color
TYPE lvc_s_scol.
FIELD-SYMBOLS: <gs_sflight> TYPE gs_sflight_ty.
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'
***************************************************************************
****
* 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
).
***************************************************************************
****
* Zellenfarbe ändern
***************************************************************************
****
* nun werden selektiv ein paar Zellen eingefärbt
LOOP AT gt_sflight ASSIGNING <gs_sflight>.
CLEAR: gs_color.
IF sy-tabix LE 5.
*
so will ich in den ersten fünf Zeilen die Farbe von PRICE ändern
gs_color-fname = 'PRICE'.
gs_color-color-col = 5.
APPEND gs_color TO <gs_sflight>-color.
ELSEIF sy-tabix GE 10 AND sy-tabix LE 15.
*
in den nächsten Zeilen 10 - 15 will ich die Farbe von
*
SEATSOCC anpassen
gs_color-fname = 'SEATSOCC'.
gs_color-color-col = 3.
APPEND gs_color TO <gs_sflight>-color.
ELSEIF sy-tabix EQ 8.
*
und Zeile 8 will ich KOMPLETT einfärben
gs_color-color-col = 7.
APPEND gs_color TO <gs_sflight>-color.
ENDIF.
ENDLOOP.
* dem ALV mitteilen, in welcher Strukturkomponente die Farbinformationen zu
* finden sind
gr_columns->set_color_column( 'COLOR' ).
***************************************************************************
****
* 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'
* Die eigentliche Anzeige
gr_salv->display( ).