19 Tabellenanzeige mit dem SAP List Viewer (ALV)
19.1 Die alte ALV-Anzeige
19.2 Die neue ALV-Anzeige
19.3 SAP List View mit integriertem Datenzugriff (IDA) ❓
19.4 Anzeigemodi
19.2.1 Aufbau des Gundgerüsts
19.2.2 Funktionen
19.2.3 Ereignisse
19.2.4 Spalten bearbeiten
19.2.5 Zellentypen
19.2.6 Farbige Hervorhebung
19.2.7 Icons
19.2.8 ALV-Tabellen sortieren und gruppieren
19.2.9 Aggregation
19.2.10 Layout speichern
19.2.11 Filter
Die neue ALV-Anzeige basiert auf der Klasse CL_SALV_TABLE und stellt denselben Funktionsumfang bereit, kommt darüber hinaus aber durch kleinere Schnittstellen mit weniger Code aus. Eine direkte Eingabefähigkeit wird nicht unterstützt.
Im Grundaufbau haben Sie zwei Anzeigevaraianten zur Verfügung
Vollbildmodues
Es wird kein Container und kein Dynpro benötigt.
Containermodues
Es werden ein Dynpro und ein Container benötigt.
Vollbild
DATA: lt_sflight TYPE TABLE OF sflight.
*Daten beschaffen
SELECT * FROM sflight INTO TABLE lt_sflight UP TO 100 ROWS.
DATA: lo_alv TYPE REF TO cl_salv_table.
CALL METHOD cl_salv_table => factory
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = lt_sflight.
*ALV-Objekt aufrufen
lo_alv -> display().
Sie müssen sich zum Aufbau einer ALV-Tabelle im Vollbildmodus lediglich um die Beschaffung der Daten kümmern und ein Objekt der Klasse CL_SALV_TABLE über die Mehtode FACTROY() erzeugen.
Diese Methode benötigt nur die interne Tabelle und gibt im Importing-Parameter R_SALV_TABLE die Instanz des ALV-Objekt zurück.
Von dieser Instanz der ALV-Tabelle müssen Sie anschließend die Methode DISPLAY() aufrufen, wodurch die ALV-Tabelle auch direkt angezeigt wird.
Jegliche nachträgliche Änderungen an der ALV-Tabelle werden ohne ein Neuaufbauen der Anzeige nicht mehr berücksichtigt.
Container
DATA: lo_alv TYPE REF TO cl_salv_table.
DATA: lo_container TYPE REF TO cl_gui_custom_container.
CREATE OBJECT lo_container
EXPORTING
*Containerobjekt erzeugen
container_name = 'CCONTAINER_SALV'.
CALL METHOD cl_salv_table => factory
*Containerobjekt der ALV-Klasse übergeben
EXPORTING
r_container = lo_container
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = lt_sflight.
lo_alv -> display().
CALL SCREEN 2000.
Um die ALV-Tabelle in einem Container anzuzeigen, benötigen Sie ein Dynpro mit einem Container, von dem Sie mit der Anweisung CREATE OBJECT ein Objekt erzeugen.
Diese Objekt geben Sie dann in der Methode FACTORY() der ALV-Klasse über den Exporting-Parameter R_CONTAINER mit.
Trotz des Containers müssen Sie die Methode DISPLAY() und anschließend Ihr Dynpro mit der Anweisung CALL SCREEN aufrufen.
DATA: lo_functions TYPE REF TO cl_salv_functions_list.
lo_functions = lo_alv -> get_functions().
lo_functions -> set_all().
Die Funktionsleiste wird bei der neuen ALV-Anzeige standmäßig nicht mit angezeigt und muss erst aktiviert werden.
Hierfür lassen Sie sich vom ALV-Objekt das Funktionsobjekt geben und rufen die Methode SET_ALL() von diesem Funktionsobjekt aus auf.
Damit aktivieren Sie die komplette Funktionsleiste.
Funktionen hinzufügen
Darüber hinaus bietet Ihnen auch die neue ALV-Anzeige die Möglichkeit, der Funktionsleiste neue Funktionen hinzufügen.
Dies erfolgt je nach Anzeigemodus unterschiedlich
im Container werden die Funktionen ebenfalls über das Funktionsobjekt hinzugefügt
im Vollbildmodus über einen eigenen GUI-Status für Ihr Dynpro
In beiden Fällen können Sie auf eine Benutzereingabe mit dem Ereignis ADDED_FUNCTION reagieren. #
Funktion im Container hinzufügen
Funktion im Vollbild hinzufügen
DATA: lo_functions TYPE REF TO cl_salv_functions_list.
lo_functions = lo_alv -> get_functions().
lo_functions -> set_all().
lo_functions -> add_function (
name = 'SUMME'
text = 'Summe'
tooltip = 'Summe'
position = if_salv_c_function_position => right_of_salv_function
).
Im Container lassen Sie sich das Funktionsobjekt geben.
Anschließend rufen Sie die Methode ADD_FUNCTION() des Objekt mit den Werten der gewünschten neuen Funktion auf.
Um eine Funktion im Vollbildmodus hinzufügen, kopieren Sie sich zunächst den GUI-Status SALV_TABLE_STANDARD in Ihren Report
in der Transaktion SE80 in die Funktionsgruppe SALV_METADATA_STATUS gehen
klicken Sie mit der rechten Maustaste auf den GUI-Status SALV_TABLE_STANDARD
Wählen Sie dann Kopieren im Kontextmenü.
Geben Sie im folgenden Pop-up-Fenster Ihr Programm und einen Zielnamen für den zu kopierenden GUI-Status an, und bestätigen Sie Ihre Eingaben.
Anschließend können Sie diesen GUI-Status anpassen und z.B. einen neuen Funktionscode hinzufügen. Die anpassten GUI-Status müssen Sie der ALV-Tabelle jetzt noch mit Ihrem dafür vergebenen Namen bekannt machen, indem Sie die Methode SET_SCREEN_STATUS() des ALV-Objekts aufrufen. ❓
lo_alv -> set_screen_status (
report = 'ZFR_ALV'
pfstatus = 'SALV_TABLE_STANDARD'
set_functions = lo_alv -> c_functions_all
).
Die Ereignisse finden Sie in der Klasse CL_SALV_EVENTS_TABLE auf der Registerkarte Ereignissse.
die wichtigsten Ereignisse
DOUBLE_KLICK
LINK_KLICK
ADDED_FUNCTION
Wird nach einem Doppelklick ausgelöst.
Parameter: ROW(Zeile) und COLUMN(Spalte)
Wird nach einem einfachen Klick auf einen Hotspot oder Button ausgelöst.
Parameter: wie DOUBLE_KLICK
Wird nach der Ausführung einer selbst definierten Funktion ausgelöst.
Parameter: E_SALV_FUNCTION(Funktionscode)
Die Implementierung aller Ereignisse erfolgt auf die gleiche Weise
Es muss ein Ereignisbehandler bereitgestellt und für das jeweilige Event mit der Anweisung SET HANDLER registriert werden.
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: on_double FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD on_double.
FIELD-SYMBOLS: <fs_sflight> TYPE sflight.
READ TABLE lt_sflight INDEX row ASSIGNING <fs_sflight>.
IF sy-subrc = 0 AND column = 'CARRID'.
''... z.B. Aufruf einer Detailanzeige
ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lo_events TYPE REF TO cl_salv_events_table.
lo_events = lo_alv -> get_event().
SET HANDLER lcl_handler => on_double FOR lo_events.
Die Spalten können Sie dabei immer über das Spaltenobjekt bearbeiten. Dieses erhalten Sie, wenn Sie die Methode GET_COLUMNS() von der Instanz Ihres ALV-Objekts aufrufen.
Spalten ausblenden
Spalten hinzufügen und entfernen
Spalten umbenennen
Spaltenposition setzen
Spaltenbreite optimieren
DATA: lo_cols TYPE REF TO cl_salv_columns_table,
lo_col TYPE REF TO cl_salv_columns_table.
*Spaltenobjekt abrufen
lo_cols = lo_alv -> get_columns().
*Objekt einer einzelnen Spalte
lo_col = lo_cols -> get_columns( 'CARRID' ).
lo_col -> set_visible( abap_false ).
Um eine Spalte auszublenden, lassen Sie sich zuerst das Spaltenobjekt von der ALV-Klasse geben.
Von diesem Objekt lassen Sie sich wiederum das Objekt einer einzelnen Spalte über deren technischen Namen geben.
Rufen Sie anschließend die Methode SET_VISIBLE() dieses Objekts auf.
Die Klasse für alle Spalten besitzt eine Methode REMOVE_COLUMN(), für die aber die Sichtbarkeit PROTECTED definiert ist und die für Sie darum ohne Vererbung nicht aufrufbar ist. Hier muss daher der Weg über den Feldkatalog gegangen werden.
Der Feldkatalog für die ALV-Tabelle wird aus der übergebenen Struktur beim Aufruf der Methode FACTORY() aufgebaut.
Das bedeutet, wenn Sie eine Spalte aus dem Feldkatalog entfernen oder hinzufügen wollen, müssen Sie die übergebene Struktur an die ALV-Tabelle anpassen.
Dies kann über eine globale Struktur in der Transaktion SE11 oder über einen lokal definierten Typ geschehen.
Bei der Definition der Struktur lohnt es sich immer, Datenelemente für die einzelnen Felder zu verwenden, damit die dort gepflegten Texte als Spaltenüberschriften angezeigt werden. ❓
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: neue_spalte TYPE zmein_datenelement,
END OF ty_sflight.
*Anschließender Aufruf der Methode cl_salv_table => factory
Eine Spalte der neuen ALV-Tabelle hinzufügen
Spalten können Sie über das Objekt einer einzelnen Spalte auch umbenennen.
Dafür stehen mit SET_SHORT_TEXT(), SET_MEDIUM_TEXT(), SET_LONG_TEXT() und SET_TOOLTIP() vier Methoden für verschiedene Textlängen bereit.
DATA: lo_cols TYPE REF TO cl_salv_columns_table,
lo_col TYPE REF TO cl_salv_columns_table.
DATA: lv_s_text TYPE scrtext_s,
lv_m_text TYPE scrtext_m,
lv_l_text TYPE scrtext_l,
lv_tip TYPE lvc_tip.
lo_cols = lo_alv -> get_columns().
lo_col ?= lo_cols -> get_columns( 'NEUE_SPALTE' ).
lv_s_text = 'Kurztext'.
lo_col -> set_short_text ( lv_s_text ).
lv_m_text = 'Text'.
lo_col -> set_medium_text( lv_m_text ).
lv_l_text = 'Langtext'.
lo_col -> set_long_text( lv_l_text ).
lv_tip = 'Tooltip'.
lo_col -> set_tooltip( lv_tip ).
Für das Setzen der Spaltenposition stellt Ihnen das Spaltenobjekt eine Methode SET_COLUMN_POSITION() bereit, die Sie mit dem Namen der Spalte und der gewünschten Position versorgen müssen.
DATA: lo_cols TYPE REF TO cl_salv_columns_table.
lo_cols = lo_alv -> get_columns().
lo_cols -> set_column_position(
columname = 'FLDATE'
position = 5 ).
Optimierung aller Spalten
manuelles Setzen der Spalenbreite
Optimierung einer Spalte
die Methode SET_OPTIMIZE() des Spaltenobjekts aufrufen
DATA: lo_cols TYPE REF TO cl_salv_columns_table.
lo_cols = lo_alv -> get_columns().
lo_cols -> set_optimize().
Darüber hinaus stellt Ihnen das Objekt einer Spalte mit der Methode SET_OUTPUT_LENGTH() die Möglichkeit bereit, die Breite der Spalte fest auf einen bestimmten Wert zu setzen.
DATA: lo_cols TYPE REF TO cl_salv_columns_table,
lo_col TYPE REF TO cl_salv_columns_table.
lo_cols = lo_alv -> get_columns().
lo_col = lo_cols -> get_columns( 'PRICE' ).
lo_col -> set_output_length( 20 ).
Über das Objekt einer einezelnen Spalte können Sie diese mit der Methode SET_OPTIMIZED() auch einzeln optimieren.
DATA: lo_cols TYPE REF TO cl_salv_columns_table,
lo_col TYPE REF TO cl_salv_columns_table.
lo_cols = lo_alv -> get_columns().
lo_col ?= lo_cols -> get_column( 'CARRID' ).
lo_col -> set_optimized( abap_true ).
Alle Zellentypen können sowohl für Container als auch für den Vollbildmodus verwendet werden.
Typ --------------------- Attribute von IF_SALV_C_CELL_TYPE --- Anzeige Container/Vollbild ---Ereingis
Text -------------------- =>text ----------------------------------------------- beide -------------------------------------------
Checkbox ------------ =>checkbox ---------------------------------------- beide--------------------------------------------
Checkbox Hostpot - =>checkbox_hotspot ---------------------------- beide ------------------------------ link_click
Button ----------------- =>button -------------------------------------------- beide ------------------------------ link_click
Dropdown ------------ =>dropdown --------------------------------------- Container---------------------------------------
Hotspot ---------------- =>hotspot ------------------------------------------ beide ------------------------------ link_click
Unterschied zwischen Checkbox und Checkbox Hotspot
die Methode SET_CELL_TYPE()
Der Zellentyp Checkbox beschränkt sich auf die reine Anzeige eines Ankreuzfeldes, während die Hotspot-Version anklickbar ist und das Ereignis LINK_CLICK auslöst.
Dieses Verhalten können Sie trotz der fehlenden Eingabefähigkeit in der neuen ALV-Variante ausnutzen, um den Wert des Feldes über den Ereignisbehandler zu manipulieren und die Anzeige mit LO_ALV->REFRESH() aufzufrischen. Auf diese Weise kann der Anwender den Wert der Checkbox also ändern.
DATA: lo_cols TYPE REF TO cl_salv_columns_table,
lo_col TYPE REF TO cl_salv_columns_table.
lo_cols = lo_alv -> get_columns().
lo_col ?= lo_cols -> get_columns( 'CARRID' ).
lo_col -> set_cell_type( if_salv_c_cell_type => hotspot ).
Spalten vollständig einfärben
Einzelne Zellen einfärben
Einzelne Zellen können Sie ebenfalls mithilfe der Struktur LVC_S_SCOL farbig hervorheben, nur dass Sie diese Information jetzt nicht nur für eine Spalte, sndern für jede einzelne Spalte pro Zeile bereitstellen müssen.
SET_COLOR()
DATA: lo_columns TYPE REF TO cl_salv_columns_table,
lo_column TYPE REF TO cl_salv_columns_table.
lo_column ?= lo_columns -> get_column( 'PLANETYPE' ).
DATA: ls_column_color TYPE lvc_s_scol.
ls_column_color-col = 6.
ls_column_color-int = 1.
ls_column_color-inv = 0.
lo_column -> set_color( value = ls_column_color ).
Dafür erweitern Sie Ihre Struktur um eine weitere Spalte in Form einer internen Tabelle mit dem Typ LVC_T_SCOL, die genau diese Informationen verhalten wird.
In einem zweiten Schritt machen Sie der ALV-Tabelle diese neue Spalte mit der Methode SET_COLOR_COLUMN() als Farbtabelle bekannt und füllen anschließend die Tabelle mit entsprechenden Farbwerten für die einzelnen Spalten.
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
*Struktur um neue Spalte (interne Tabelle) erweitern
TYPES: colors TYPE lvc_t_scol,
END OF ty_sflight.
DATA: ls_colors TYPE lvc_s_scol,
lo_cols TYPE REF TO cl_salv_columns_table.
DATA: lt_sflight TYPE TABLE OF ty_sflight.
SELECT * FROM sflight INTO TABLE lt_sflight UP TO 100 ROWS.
lo_cols = lo_alv -> get_columns().
*Farbtabelle bekannt machen
lo_cols -> set_color_column( 'COLORS' ).
LOOP AT lt_sflight ASSIGNING <fs_sflight> WHERE price > 500.
ls_colors-fname = 'PRICE'.
ls_colors-color-col = 6.
ls_colors-color-int = 1.
ls_colors-color-inv = 1.
APPEND ls_colors TO <fs_sflight>-colors.
ENDLOOP.
Um Ihre abelle Icons hinzufügen, brauchen Sie lediglich eine Spalte von Typ ICON_D bzw. CHAR mit der Länge 4.
Diese Spalte müssen Sie mit einem Icon-Code befüllen.
TYPE-POOLS: icon.
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: icon TYPE icon_d,
END OF ty_sflight.
DATA: lt_sflight TYPE TABLE OF ty_sflight.
SELECT * FROM sflight INTO TABLE lt_sflight UP TO 10 ROWS.
FIELD-SYMBOLS: <fs_output> TYPE ty_sflight.
LOOP AT lt_sflight ASSIGNING <fs_output>.
<fs_output>-icon = icon_budget_update. ''siehe Transaktion ICON
ENDLOOP.
Für die Implementierung stellt Ihnen der ALV ein eigenes Sortierobjekt mit einer Methode ADD_SORT() bereit, über die Sie die gewünschte Spalte und die Sortierung übergeben können.
Wiederholen Sie den Aufruf gegebenfalls für beliebig viele zu sortierende Spalten.
DATA: lo_sorts TYPE REF TO cl_salv_sorts.
lo_sorts = lo_alv -> get_sorts().
lo_sorts -> add_sort (
EXPORTING
columnname = 'FLDATE'
sequence = if_salv_c_sort => sort_down ).
Folgende Sortier- und Gruppieroptionen stehen Ihnen zur Verfügung
if_salv_c_sort => sort_down
if_salv_c_sort => sort_up
if_salv_c_sort => sort_none
if_salv_c_sort => group_with_underline
if_salv_c_sort => group_with_newpage (für Listenausgabe)
if_salv_c_sort => group_none
Für die Implementierung stellt Ihnen der ALV ein eigenes Aggregationsobjekt mit einer Methode ADD_AGGREGATION() bereit, über die Sie die gewünschte Spalte und die Aggregationsart übergeben können.
DATA: lo_aggrs TYPE REF TO cl_salv_aggregations.
lo_aggrs = lo_alv -> get_aggregations().
lo_agrs -> set_aggregation_before_items( abap_true ).
lo_agrs -> add_aggregation (
columname = 'PAYMENTSUM'
aggregation = if_salv_c_aggregation => total ).
Folgende Aggregationsarten stehen Ihnen zur Verfügung
get_aggregations()
set_aggregation_before_items ( abap_true )
add_aggregation()
if_salv_c_aggregation => total
if_salv_c_aggregation => minimum
if_salv_c_aggregation => maximum
if_salv_c_aggregation => average
if_salv_c_aggregation => none
der Anwender kann auch in der neuen ALV-Anzeige mit der Funktion Layout sein Layout einstellen
Außerdem können Sie Ihren Anwendern erlauben, diese Auswahl über ein Menü auch zu speichern.
Um die Speichermöglichkeit zu implementieren, stellt die neue ALV-Anzeige ein Layoutobjekt bereit.
DATA: ls_key TYPE salv_s_layout_key,
lo_layout TYPE REF TO cl_salv_layout.
ls_key-report = sy-repid.
lo_layout = lo_alv -> get_layout().
lo_layout -> set_key( ls_key ).
lo_layout -> set_default ( abap_true ).
lo_layout -> set_save_restriction (
if_salv_c_layout => restrict_none
).
übergenben Sie mit der Methode SET_KEY() den Reportnamen
über die Methode SET_SAVE_RESTRICTION() bestimmen, ob der Anwender das Layout nur für sich oder für alle Benutzer speichern darf
get_layout()
Folgende Optionen stehen Ihnen für die Methode SET_SAVE_RESTRICTION() als Parameter zur Auswahl
if_salv_c_layout => restrict_user_dependant
if_salv_c_layout => restrict_user_independant
if_salv_c_layout => restrict_none
Der Benutzer kann nur benutzerspezifische Layouts speichren.
Der Benutzer kann nur übergreifende Layouts speichern.
Der Benutzer kann sowohl benuterspeizifische als auch übergreifende Layouts speichern.
Filter können Sie verwenden, um die angezeigten Daten nach bestimmten Kriterien einzuschränken.
Normalerweise kann der Anwender diese Einschränkung über die Funktionsleiste mit dem Button Filter selbst vornehmen.
programmatisch voreinstellen
Dazustellt die neue ALV-Anzeige ein Filterobjekt bereit, über das Sie eine Einschränkung für eine bestimmte Spalte mit der Methode ADD_FILTER() auf die gleiche Weise wie bei einer Selektionstabelle (SIGN, OPTION, LOW, HIGH) vornehmen können.
DATA: lo_filers TYPE REF TO cl_salv_filters.
lo_filters = lo_alv -> get_filters().
lo_filters -> add_filters (
columnname = 'CARRID'
sign = 'I'
option = 'EQ'
low = 'AA'
'' high = ...
)
get_filters()
add_filters()
get_sorts()
add_sorts()
19.3.1 Aufbau des Grundgerüsts
19.3.2 Funktionen
19.3.3 Ereignisse
19.3.4 Spalten bearbeiten
19.3.5 Zellentypen
19.3.6 Icons
19.3.7 ALV-Tabelle sorieren und gruppieren
19.3.8 Aggregation
19.3.9 Layout
19.3.10 Filter
Vollbildmodus
Containermodus
Es werden kein Container und kein Dynpro benötigt.
Es werden im Normalfall ein Dynpro und ein Container benötigt.
die Methode CREATE() der Klasse CL_SALV_GUI_TABLE_IDA aufrufen und dabei den Namen Ihrer Quelle angeben
Anschließend können Sie von diesem Objekt mit der Methode FULLSCREEN() den Vollbildmodus erzeugen und sich mit der Methode DISPLAY() anzeigen lassen.
DATA(lo_alv) = cl_salv_gui_table_ida => create(
iv_table_name = 'SFLIGHT'
).
lo_alv -> fullscreen() -> display().
Beim Containermodus übergeben Sie wie gewohnt einen vorher erzeugten Container, der sich auf einem Dynpro befinden muss.
Der Aufruf der ALV-Tabelle mit IDA erfolgt dabei nicht explizit durch eine Methode wie DISPLAY(), sondern durch den Aufruf des Dynpros mit der Anweisung CALL SCREEN.
DATA(lo_cc) = NEW cl_gui_custom_container( 'CCONTAINER_SALV' ).
DATA(lo_alv) = cl_salv_gui_table_ida => create(
iv_table_name = 'SFLIGHT'
io_gui_container = lo_cc ).
CALL SCREEN 2000.
Bevor Sie z.B. einen externen View als Datenquelle verwenden, sollten Sie prüfen, ob Ihre Datenbank dies unterstützt.
IF cl_salv_gui_table_ida => db_capabilities() ->
is_table_supported( 'MEIN_EXT_VIEW' ) <> abap_true.
MESSAGE 'Tabelle nicht unterstützt' TYPE 'E'.
ENDIF.
Funktionen hinzufügen
Das Toolbar-Objekt des ALVs mit IDA bietet Ihnen mit der Methode ADD_BUTTON() auch die Möglichkeit, neue Funktionen zu definieren.
Auf diese Funktionen können Sie anschließend mit dem Event FUNCTION_SELECTED der Klasse CL_SALV_GUI_TOOBAR_IDA reagieren.
DATA(lo_alv) = cl_salv_gui_table_ida => create (
iv_table_name = 'SFLIGHT' ).
CLASS lcl_hander DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: function FOR EVENT function_selected
OF if_salv_gui_toolbar_ida
IMPORTING ev_fcode.
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD function.
CASE ev_fcode.
WHEN 'DETAILS'.
DATA: ls_sflight TYPE sflight.
IF lo_alv->selection()->is_row_selected()=abap_true.
lo_alv->selection()->get_selected_row(
EXPORTING iv_request_type =
if_salv_gui_selection_ida=>cs_request_type-all_fields
IMPORTING es_row = ls_sflight ).
ENDIF.
ENDCASE.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_toolbar) = lo_alv->toolbar().
lo_toobar->add_button(
EXPORTING
iv_fcode = 'DETAILS'
iv_icon = icon_detail
iv_text = 'Details'
iv_quickinfo = 'Details der ausgewählten Zeile'
iv_before_standard_functions = abap_true
).
''Aktiviere, dass einzelne Zeilen ausgewählt werden können
lo_alv->selection()->set_selection:mode(
if_salv_gui_selection_ida=>cs_selection_mode-single ).
SET HANDLER lcl_handler=>funktionsklick OR lo_toolbar.
lo_alv->full_screen()->display().
Die einzige Funktion, die nicht eingeblendet wird, ist die Textsuche
Sie können sich für die Funktionen vom ALV mit IDA ein Objekt von der Toolbar geben lassen.
Dies geschieht über die Methode TOOLBAR().
DOUBLE_CLICK
CALL_ACTION
FUNCTION_SELECTED
Wird nach einem Doppelklick ausgelöst.
Interface
Parameter
IF_SALV_GUI_TABLE_DISPLAY_OPT
EV_FIELD_NAME als Name der Spalte sowie EO_ROW_DATA vom Typ IF_SALV_GUI_ROW_DATA_IDA
Wird bei einem einfachen Klick auf einen Hotspot auselöst.
Interface
Parameter
IF_SALV_GUI_FIELD_DISPLAY_OPT
wie Ereignis DOUBLE_CLICK
Wird ausgelöst, wenn der Anwender eine Funktion auswählt.
Interface
IF_SALV_GUI_TOOLBAR_IDA
Parameter
EV_FCODE mit Funktionscode
DATA: ls_row TYPE sflight.
eo_row_data -> get_row_data(
EXPORTING
iv_request_type = 'ALL_FIELDS' ''sonst nur Schlüsselfelder
IMPORTING
es_row = ls_row
).
eine beispielhafte Implementierung für das Event FUCNTION_SELECTED
Über den Parameter EO_ROW_DATA können Sie die Daten der ausgwählten Zeile auslesen.
Spalten ausblenden
Spalten entfernen
Spalten umbenennen
Spalten hinzufügen
DATA: lt_visible TYPE if_salv_gui_type_ida=>yt_field_name.
lo_alv->field_catalog()->get_all_fields(
IMPORTING ets_field_names = DATA(lt_alle)
).
MOVE-CORRESPONDING lt_alle TO lt_visible.
DELETE lt_visible WHERE table_line='FLDATE'.
lo_alv->default_layout()->set_visible_fields(
it_visible_fields=lt_visible
).
Eine Spalte können Sie ausblenden, indem Sie sich über die Methode FIELD_CATALOG() den Feldkatalog der ALV-Tabelle mit IDA geben lassen.
Die Felder des Feldkatalogs lassen sich mit der Methode GET_ALL_FIELDS() ausgeben.
Aus deisen Feldern löschen Sie anschließend die gewünschte Spalte und setzen die restlichen Spalten über die Methode SET_VISIBLE_FIELDS() als sichtbare Felder des Default-Layouts.
DATA(lo_fldcatlog) = lo_alv->field_catalog().
lo_fldcatlog->get_all_fields(
IMPORTING ets_field_names = DATA(lt_alle)
).
DELETE lt_alle WHERE table_line = 'FLDATE'.
lo_fldcatlog->set_available_fields( lt_alle ).
Lassen Sie sich die Felder des Feldkatalogs über die Methoden FIELD_CATALOG() und GET_ALL_FIELDS() geben, und löschen Sie auch hier wieder die gewünschte Spalte.
Anschließend geben Sie den geänderten Feldkatalog mit der Methode SET_AVAILABLE_FIELDS() als neuen Feldkatalog an.
lo_alv_display->field_catalog()->set_field_header_texts(
iv_field_name = 'SPALTEN_NAME'
iv_header_text = 'Meine Überschrift'
iv_tooltip_text = 'Mein Tooltip'
iv_tooltip_text_long = 'Mein langer Tooltip' ).
Lassen Sie sich den Feldkatalog mit der Methode FIELD_CATALOG() ausgeben, und rufen Sie anschließend die Methode SET_FIELD_HEADER_TEXTS auf.
Übergeben Sie als Parameter den Namen der umzubennenenden Spalte und den neuen Text für die Spaltenüberschrift.
Nur geschieht dies aufgrund der Tatsache, dass die Struktur der Datenbanktabelle oder des Views nicht direkt (z.B. durch einen lokalen Typ) manipuliert werden kann, über das Interface IF_SALV_IDA_CALC_FIELD_HANDER.
Dieses Interface ermöglicht es Ihnen, über verschiedene Methoden eine Spalte noch vor der Anzeige des ALVs hinzufügen und mit Daten anzureichern.
Dieses Interface müssen Sie in einer Klasse implementieren.
Beim Deklarieren der ALV-Tabelle geben Sie dabei die Referenz der Klasse mit, damit die ALV-Tabelle auf die implementierten Methoden des Interface zugreifen kann.
Folgende Methoden stellt das Interface dafür bereit
GET_CALC_FIELD_STRUCTURE()
GET_REQUESTED_FIELDS()
START_PAGE()
CALCULATE_LINE()
END_PAGE()
Diese Methode wird aufgerufen, nachdem die Zusatzfelder für alle Datensätze einer Seite berechnet wurden.
Hier werden die anzuzeigenden Zusatzfelder deklariert und als Strukturbeschreibung dem Parameter RO_CALC_FIELD_STRUTURE übergeben.
Hier können Sie zusätzliche Felder aus der Datenbanktabelle gelesen werden, die nicht zur Anzeige gedacht sind, sondern nur für die Berechnung der zusätzlich definierten Felder.
Wenn bereits alle Felder vorhanden sind, kann diese Methode leer gelassen werden.
Im Parameter ITS_CALC_FIELD_NAME steht das aktuelle Zusatzfeld, und in der Rückgabetabelle RTS_DB_FIELD_NAME können Sie die eventuell benötigten Datenbanfelder angeben.
Diese Methode enthält im Parameter IT_TABLE die Daten für die aktuelle Seite sowie im Parameter ITS_CALC_FIELD_NAME die angezeigten Zusatzfelder.
Dies ist für Sie wichtig zu wissen, damit Sie dieses Feld nicht in der Methode CALCULATE_LINE() umsonst berechnen bzw. mit Daten füllen und damit Performance einbüßen.
Diese Methode berechnet die Zusatzfelder für eine Zeile, die im Parameter IS_DATA_BASE_LINE mitgegeben wird.
Sie wird vom ALV mit IDA für jede Zeile in einer Schleife aufgerufen.
Die gefüllten Zusatzfelder können Sie über den Rückgabeparameter ES_CALCULATED_FIELDS zurückgeben.
Spaltenposition ändern
Die Position einer Spalte können Sie ändern, indem Sie die Reihenfolge der Zeilen des Feldkatalogs manipulieren.
Jede Zeile im Feldkatalog (der internen Tabelle) entspricht genau einer Spalte für das ALV.
Lassen Sie sich dazu den Feldkatalog mit der Methode FIELD_CATALOG() und dessen Felder mit GET_ALL_FIELDS() geben.
Ändern Sie hier nun die Position der gewünschten Zeile, und setzen Sie die geänderte interne Tabelle über das Default-Layout mit der Methode SET_VISIBLE_FIELDS() wieder zurück.
Datenelement einer Spalte ändern
Indem Sie das Datenelement einer Spalte ändern, können Sie jegeliche Informationen zur Spalte kontrollieren.
Dazu gehören sowohl die Texte und die Breite der Spalte als auch die angebundene Suchhilfe.
Lassen Sie sich den Feldkatalog mit der Methode FIELD_CATALOG() geben.
Rufen Sie anschließend für die gewüsnchte Spalte im Feldkatalog die Methode SET_DATA_ELEMENT() auf.
19.1.1 Aufbau des Grundgerüsts
19.1.2 Eingabefähigkeit
19.1.3 Funktionen
19.1.4 Ereignisse
19.1.5 Spalten bearbeiten
19.1.6 Zellentypen
19.1.7 Farbige Hervorhebung
19.1.8 Icons
19.1.9 ALV-Tabellen sortieren und gruppieren
19.1.10 Aggregation
19.1.11 Layout speichern
Für den Grundaufbau haben Sie zwei Anzeigemodi zur Verfügung
Vollbildmodus
Containermodus
Im Normalfall werden ein Dynpro und ein Container benötigt.
Es werden kein Container und kein Dynpro benötigt.
Um das Grundgerüst einer ALV-Tablle aufzubauen, folgen Sie diesen Schritten
- Datensleketion in eine interne Tabelle
- Erzeugung des Containers (optional)
- Beschaffung des Feldcatalogs (optional)
- Erzeugung des ALV-Objekts
- Layout definieren (optional)
- Anzeige der ALV-Tabelle
Breiten Sie die interne Tablle, die Sie anzeigen wollen, vor.
DATA: lt_sflight TYPE TABLE OF sflight.
SELECT * FROM sflight
INTO CORRESPONDING FIELDS OF TABLE lt_sflight
UP TO 100 ROWS.
DATA: lo_container TYPE REF TO cl_gui_custom_container.
CREATE OBJECT lo_container
EXPORTING
container_name = 'CCONTAINER_SALV'.
Legen Sie für Ihr angelegtes Dynpro einen Container an, und vergeben Sie eine eindeutige ID.
Diese Container müssen Sie anschließend noch programmatisch mit der Anweisung CREATE OBJECT erzeugen.
Dieser enthält alle Informationen, die zur Anzeige wichtig sind, wie z.B. die Spaltenüberschriften, die Anzeigebreite und die Information, welche Spalte welchen Datentyp hat.
Wenn Sie Ihre ALV-Tablle nicht in einem bestimmten Bereich des Bildschirms, sondern im Vollbildmodus anzeigen lassen wollen, können Sie diesen Schritt weglassen und bei der Erzeugung der ALV-Liste (Schritt 4) cl_gui_custom_container=>default_screen anstelle des Containers mitgeben.
DATA lt_fcat TYPE lvc_t_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = lt_fcat.
Optional Beschaffung
Wollen Sie keine Spalten modifizieren (Texte, Position usw.), können Sie diesen Schritt überspringen. Geben Sie stattdessen bei der sich anschließenden Erzeugung des ALV-Objekts mit der Methode SET_TABLE_FOR_FIRST_DISPLAY() den Parameter I_STRUCTURE_NAME mit dem Namen der Struktur mit. Dann beschafft der ALV den Feldkatalog automatisch. ❓
DATA lo_alv TYPE REF TO cl_gui_alv_grid.
CREATE OBJECT lo_alv
EXPORTING
i_parent = lo_container.
Erzeugen Sie ein Objekt der Klasse CL_GUI_ALV_GRID, und übergeben Sie dem Konstruktor beim Aufruf Ihren in Shcritt 2 erzeugten Container. #
DATA ls_layout TYPE lvc_s_layo.
ls_layout-zebra = abap_true.
das Zebra-Muster (alternierende Farbwechsel für jede zweite Zeile) aktivieren
CALL METHOD lo_alv->set_table_for_first_display
EXPORTING
is_layout = ls_layout
CHANGING
it_outtab = lt_sflight
it_fieldcatalog = lt_fcat.
CALL SCREEN 2000.
die Methode SET_TABLE_FOR_FIRST_DISPLAY() aufrufen
den Feldkatalog, das Layout sowie die aufbereitete interne Tablle übergeben
Anschließend können Sie mit der Anweisung CALL SCREEN Ihr angelegtes Dynpro aufrufen.
die gewünschten Spalten im Feldkatalog als eingabebereit markieren
das Feld EDIT für die jweweiligen Spalten auf den Wert ABAP_TRUE setzen
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
LOOP AT lt_fcat ASSIGNING <fs_fcat>
''IF <fs_cat>-fieldname = 'CARRID'.
<fs_fcat>-edit = abap_true. ''bzw. X
''ENDIF.
ENDLOOP.
Standardmäßig wird dadurch der Bearbeitungsmodus aktiviert, und in der Funktionsleiste werden dem Anwender Buttons für die Bearbeitung angeboten.
Sie können diese Bearbeitungsmodus auch explizit mit der Methode SET_READY_FOR_INPUT (i_ready_for_input=1) Ihres ALV-Objekts aktivieren bzw. deaktivieren (i_ready_for_input=0)
CALL METHOD lo_alv->set_ready_for_input
EXPORTING
i_ready_for_input = 0. ''1 for Aktivierung
Damit ließe sich z.B. eine Funktion realisieren, mit der die Eingabefähigkeit ähnlich wie mit dem Button Anzeigen<->Ändern im ABAP Editor ein- bzw. ausgestellt werden kann.
Wenn der Anwender nun die Tabelleneinträge geändert hat, möchten Sie ihm vermutlich noch eine Funktion bereitstellen, die die geänderten Daten speichert (z.B. über den Button Speichern des GUI-Status). Damit die Änderungen von Frontend (d.h. von der für den Anwender sichtbaren Tabelle) in das Backend (d.h. in Ihre ursprüngliche interne Tabelle) übertragen werden, müssen Sie die Methode CHECK_CHANGED_DATA aufrufen.
DATA lv_valid TYPE c.
CALL METHOD lo_alv->check_changed_data
IMPORTING
e_valid = lv_valid.
Dadurch werden vorhandende Änderungen übertragen. Ihre interne Tabelle enthält somit die aktuellsten Daten, die Sie nun auf die Datenbank übertragen können.
Felder sperren ❓
Prinzipiell wollen Sie die Eingabe in diese Spalten erlauben, nämlich wenn eine neue Zeile hinzufügt wird. Dadurch ist die Vorgehensweise über den Feldkatalog so auch notwendig, und Sie müssen für jede Zeile enzeln sagen, ob diese Spalten eingabebereit sein sollen oder nicht. In diesem Fall wollen Sie die Primärschlüsselfelder für die initial angezeigten Zeilen sperren, aber nicht für neu hinzugefügte Zeilen.
Um diess zu bewerksteilligen, müssen Sie den Typ Ihrer internen Tabelle um ein weiteres Feld des Typs LVC_T_STYL erweitern.
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: fieldstyle TYPE lvc_t_styl,
END OF ty_sflight.
DATA: lt_sflight TYPE TABLE OF ty_sflight.
DATA: ls_layout TYPE lvc_s_layo.
ls_layout-stylefname = 'FIELDSTYLE'.
Das hinzufügte Feld FIELDSTYLE ist eine interne Tabelle, die pro Zeile angibt, welche Spalte welchen Style haben soll und damit auch welche Zeile eingabefähig ist und welche nicht.
Sie müssen sich also nun vor dem Aufruf der ALV-Tabelle darum kümmern, dass Sie für die gewünschten Spalten den Bearbeitungsmodus, den Sie im Feldkatalog für alle Spalten freigegeben haben, durch die Auswahl des Styles cl_gui_alv_grid=>mc_style_disabled wieder sperren.
FIELD-SYMBOLS: <fs_sflight> TYPE sflight.
DATA: ls_stylerow TYPE lvc_s_styl.
LOOP AT lt_sflight ASSIGNING <fs_sflight>.
ls_stylerow-fieldname = 'CARRID'.
ls_stylerow-style = cl_gui_alv_grid => mc_style_disabled.
INSERT ls_stylerow INTO TABLE <fs_output>-fieldstyle.
ls_stylerow-fieldname = 'CARRID'.
INSERT ls_stylerow INTO TABLE <fs_output>-fieldstyle.
ls_stylerow-fieldname = 'FLDATE'.
INSERT ls_stylerow INTO TABLE <fs_output>-fieldstyle.
ENDLOOP.
Dort wir die Bearbeitung der internen Tabelle für die drei Spalten CARRID, CONNID und FLDATE wieder deaktiviert.
Funktionen hinzufügen
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
*Ereignisbehandler registerieren
CLASS-METHODS: handle_toolbar FOR EVENT toolbar
of cl_gui_alv_grid IMPORTING e_object.
ENDCLASS.
CLASS lcl_handler IMPLEMENTATION.
METHOD: handle_toolbar.
DATA: ls_toolbar TYPE stb_button.
ls_toolbar-function = 'SWITCH'.
ls_toolbar-icon = icon_toggle_display_change.
ls_toolbar-quickinfo = 'Meine Funktion'.
INSERT ls_toolbar INTO e_object -> mt_toolbar INDEX 1.
ENDMETHOD.
ENDCLASS.
*Aufruf nach SET_TABLE_FOR_FIRST_DISPLAY und vor CALL SCREEN
SET HANDLER lcl_handler => handle_toolbar FOR lo_alv.
*Ereignis aktivieren
CALL METHOD lo_alv -> set_toolbar_interactive.
das Eregins TOOLBAR der Klasse CL_GUI_ALV_GRID nutzen
Damit dieses Ereignis vom ALV ausgelöst wird, müssen Sie es über die Methode SET_TOOLBAR_INTERACTIVE() aktivieren.
Die alte ALV-Anzeige stellt Ihnen mehrere Ereignisse zur Verfügung, die Sie in der Klasse CL_GUI_ALV_GRID auf der Registerkarte Ereignisse finden können.
DOUBLE_CLICK
HOTSPOT_CLICK
BUTTON_CLICK
TOOLBAR
USER_COMMAND
Wird ausgelöst, wenn doppelt auf eine Zelle geklickt wird.
Parameter
E_ROW (Zeilen-ID)
E_COLUMN (Spaltename)
ES_ROW_NO (numerische Zeilen-ID)
Wird ausgelöst, wenn auf einen Hotspot geklickt wird.
Parameter: wie DOUBLE_CLICK
Wird ausgelöst, wenn auf einen Button geklickt wird.
Parameter: wie DOUBLE_CLICK
Wird ausgelöst, wenn die Funktionsleiste erweitert werden soll.
Parameter
E_OBJECT vom Typ CL_ALV_EVENT_TOOLBAR_SET
Wird ausgelöst, wenn eine Funktion ausgelöst wird.
Parameter
E_UCOMM (Funktionscode)
Spalten ausblenden
Spalten hinzufügen
Spalten entfernen
Spalten umbenennen
Spaltenposition setzen
Spaltenbreite setzen
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
LOOP AT lt_fcat ASSIGNING <fs_fcat> WHERE fieldname = 'PRICE'.
<fs_fcat>-no_out = abap_true.
für die Spalten das Feld NO_OUT auf ABAP_TRUE setzen
*Typ für die Tabelle erweitern
*Hier lokal, aber auch global in Transaktion SE11 möglich
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: neu TYPE char8,
END OF ty_sflight.
DATA: ls_fcat TYPE lvc_s_fcat.
ls_fcat-col_pos = 4.
ls_fcat-fieldname = 'NEU'.
ls_fcat-inttype = 'C'.
ls_fcat-datatype = 'CHAR'.
ls_fcat-intlen = 8.
ls_fcat-scrtext_s = 'Neue Spalte'.
ls_fcat-scrtext_m = 'Neue Spalte'.
ls_fcat-scrtext_l = 'Neue Spalte'.
APPEND ls_fcat TO lt_fcat. ''Neue Spalte zu Feldcatalog
DELETE lt_fcat WHERE fieldname = 'PRICE'.
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
LOOP AT lt_fcat ASSIGNING <fs_fcat>
WHERE fieldname = 'MEINE_SPALTE'.
<fs_fcat>-col_pos = 1.
ENDLOOP.
Die Spaltentexte für eine beliebige Spalte können Sie über die Feler (REPTEXT, SCRTEXT_L, SCRTEXT_M und SCRTEXT_S) im Feldkatalog ändern.
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
LOOP AT lt_fcat ASSIGNING <fs_fcat>
WHERE fieldname = 'MEINE_SPALTE'.
<fs_fcat>-reptext = 'Mein Text'.
<fs_fcat>-scrtext_l = 'Mein Text'.
<fs_fcat>-scrtext_m = 'Mein Text'.
<fs_fcat>-scrtext_s = 'Mein Text'.
ENDLOOP.
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
LOOP AT lt_fcat ASSIGNING <fs_fcat>
WHERE fieldname = 'MEINE_SPALTE'.
<fs_fcat>-outputlen = 5.
<fs_fcat>-col_opt = 'X'.
ENDLOOP.
Das Feld OUTPUTLEN gibt dabei die fixe Größe der Spalte als Integerwert an, wäherend das Feld COL_OPT auf ABAP_TRUE gesetzt werden muss und dafür sorgt, dass sich die Spaltenbreite an dem Inhalt der Spalte orientiert.
Der breiteste Inhalt definiert dabei die Spaltenbreite, die Spalte ist jedoch mindestens so breit wie der kleinste Spaltentext.
Wenn Sie beide Felder setzen, dominiert die optimierte Spaltenbreite.
Hotspot und Button
Dropdown-Liste
Sie erweitern Ihre interne Tabelle um eine weitere Spalte vom Typ LVC_T_STYL.
Dieser Typ stellt eine interne Tabelle dar, zu der Sie anschließend als neue Zeile die gewünschte Spalte im Feld FIELDNAME und den gewünschten Typ im Feld STYLE hinzufügen müssen.
Anschließend geben Sie im Layout des Feld STYLENAME mit dem Namen Ihrer hinzugefügten Style-Spalte an, damit der ALV weiß, wo diese Informationen zu finden sind.
*Struktur um neue Spalte vom Typ LVC_T_STYL erweitern
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: fieldstyle TYPE lvc_t_styl,
END OF ty_sflight.
DATA: lt_sflgiht TYPE TABLE OF ty_sflight.
DATA: ls_style TYPE lvc_s_styl.
FIELD-SYMBOLS: <fs_sflight> TYPE ty_sflight.
LOOP AT lt_sflight ASSIGNING <fs_sflight>.
ls_style-fieldname = 'FLDATE'.
ls_style-style = cl_gui_alv_grid => mc_style_button.
APPEND ls_style TO <fs_sflight>-field-fieldstyle.
ENDLOOP.
*Setzen des Field-Styles in der Anzeigetabelle
ls_layout-stylename = 'FIELDSTYLE'.
Hotspot
Button
cl_gui_alv_grid => mc_style_hotspot
cl_gui_alv_grid => mc_style_button
*Beschaffung des Feldkatalogs
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
LOOP AT lt_fcat ASSIGNING <fs_fcat> WHERE fieldname = 'CARRID'.
<fs_fcat>-drdn_hndl = 1.
<fs_fcat>-drdn_alias = 'X'. ''Wert aus INT_VALUE wird übernommen
ENDLOOP.
im Feldkatalog Ihrer gewünschten Spalte die Felder DRDN_HNDL und DRDN_ALIAS füllen
Das Feld DRDN_HDNL stellt die Verknüpfung zu der internen Tabelle her, die die Werte für die Dropdown-Liste beinhaltet
das Feld DRDN_ALIAS bestimmt, welcher Wert aus der internen Tabelle übernommen wird: der technische Name INT_VALUE (wenn DRDN_ALIAS='X') oder der Anzeigename VALUE (wenn DRDN_ALIAS leer) #
Anschließend müssen Sie noch eine interne Tabelle mit den Werten für die Dropdown-Liste bereitstellen, mit Werten füllen und anschließend der ALV-Tabelle übergeben.
Zur Wertübergebe müssen Sie dabei denselben Handle-Wert (Feld HANDLE) übergeben, den Sie auch für die Spalte im vorangegangenen Schritt definiert hatten.
DATA: lt_dral TYPE lvc_t_dral,
ls_dral TYPE lvc_s_dral.
ls_dral-handle = 1.
ls_dral-value = 'AA'.
ls_dral-int_value = 'AA'.
APPEND ls_dral TO lt_dral. ''Erster Wert
ls_dral-value = 'AZ'.
ls_dral-int_value = 'AZ'.
APPEND ls_dral TO lt_dral. ''Zweiter Wert
*Muss vor SET_TABLE_FOR_FIRST_DISPLAY aufgerufen werden!
CALL METHOD lo_alv->set_drop_down_table
EXPORTING
it_drop_down_alias = lt_dral.
Zeilen vollständig einfärben
Einzelne Zellen einfärben
Um eine gesamte Zeile einzufärben, müssen Sie Ihre Struktur um eine weitere Spalte vom Typ c der Länge 4 erweitern, diese Spalte anschließend der ALV-Tabelle über das Layout im Feld INFO_NAME bekant machen und zum Schluss dieses hinzugefügte Feld mit einem Farbcode füllen.
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: color_line(4) TYPE c,
END OF ty_sflight.
DATA: lt_sflight TYPE TABLE OF ty_sflight.
*Neue Spalte der ALV-Tabelle bekannt machen
ls_layout-info_name = 'COLOR_LINE'.
FIELD-SYMBOLS: <fs_sflight> TYPE ty_sflight.
LOOP AT lt_sflight ASSIGNING <fs_sflight> WHERE price > 400.
*Farbcode für das neue Feld angeben
<fs_sflight>-color_line = 'C510'.
ENDLOOP.
Um eine einzelne Zelle einzufärben, erweitern Sie Ihre Struktur um eine weitere Spalte vom Typ LVC_T_SCOL.
Diese Spalte stellt eine interne Tabelle dar, die für jede einzelne Zeile die Farbcode beinhalten wird.
Damit die ALV-Tabelle diese neue Spalte kennt, müssen Sie diese im Layout im Feld CTAB_FNAME bekannt machen und anschließend mit Daten befüllen.
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
*Neue Spalte hinzufügen
TYPES: color_cell TYPE lvc_t_scol,
END OF ty_sflight.
DATA: lt_sflight TYPE TABLE OF ty_sflight.
*Neue Spalte der ALV-Tabelle bekannt machen
ls_layout-ctab_fname = 'COLOR_CELL'.
FIELD-SYMBOLS: <fs_sflight> TYPE ty_sflight.
LOOP AT lt_sflight ASSIGNING <fs_sflight> WHERE price > 400.
DATA: ls_color TYPE lvc_s_scol.
ls_color-fname = 'PRICE'.
ls_color-color-col = 6.
ls_color-color-int = 1.
ls_color-color-inv = 1.
*Interne Tabelle mit Daten befüllen
APPEND ls_color TO <fs_sflight>-color_cell.
ENDLOOP.
Um Icons in einer Zelle anzuzeigen, fügen Sie eine neue Spalte vom Typ ICON_D hinzu.
Anschließend müssen Sie diese Spalte noch als Icon-Spalte im Feldkatalog im Feld ICON mit dem Wert ABAP_TRUE bekannt machen.
dieses Feld für die Ausgabe füllen
TYPES: BEGIN OF ty_sflight.
INCLUDE STRUCTURE sflight.
TYPES: icon TYPE icon_d,
END OF ty_sflight.
DATA: lt_sflight TYPE TABLE OF ty_sflight.
SELECT * FROM sflight INTO CORRESPONDING FIELDS OF TABLE lt_sflight UP TO 100 ROWS.
LOOP AT lt_sflight ASSIGNING <fs_sflight>.
<fs_sflight>-icon = icon_budget_update.
ENDLOOP.
*Neue Spalte ICON dem Feldkatalog hinzufügen und aktivieren
DATA: ls_fcat TYPE lvc_s_fcat.
ls_fcat-fieldname = 'ICON'.
ls_fcat-icon = 'X'.
ls_fcat-outputlen = 3.
APPEND ls_fcat TO lt_fcat.
Innerhalb dieser Tabelle IT_SORT müssen Sie für die gewünschten Spalten die Fleder FIELDNAME füllen und die Sortierreihenfolge in den Feldern UP (aufsteigend) oder DOWN (absteigend) einstellen (Wert ABAP_TRUE).
Falls mehrere Sortierungen vorhanden sind, müssen Sie im Feld SPOS angeben, welche Sortierung die erste sein soll.
DATA: lt_sort TYPE lvc_t_sort,
ls_sort TYPE lvc_s_sort.
ls_sort-spos = 1. ''Erste Sortierung
ls_sort-fieldname = 'CARRID'.
ls_sort-down = 'X'. ''Absteigend
APPEND ls_sort TO lt_sort.
CLEAR ls_sort.
ls_sort-spos = 2. ''Zweite Sortierung
ls_sort-fieldname = 'CONNID'.
ls_sort-up = 'X'. ''Aufsteigend
APPEND ls_sort TO lt_sort.
CALL METHOD lo_alvgd->set_table_for_first_display
...
CHANGING
it_sort = lt_sort. ''Setzen der Sortiertabelle
das Feld SUBTOT mit dem Wert X (wahr) füllen
DATA: lt_sort TYPE lvc_t_sort,
ls_sort TYPE lvc_s_sort.
ls_sort-fieldname = 'CARRID'.
ls_sort-subtot = 'X'.
APPEND ls_sort TO lt_sort.
LOOP AT lt_fcat ASSIGNING <fs_fcat> WHERE fieldname = 'PRICE'.
<fs_fcat>-do_sum = 'X'.
ENDLOOP.
DATA: ls_variant TYPE disvariant.
ls_variant-report = sy-repid.
ls_variant-username = sy-uname.
CALL METHOD lo_alvgd -> set_table_for_first_display
EXPORTING
is_variant = ls_variant
i_save = 'A'
...
eine neue Struktur IS_VARIANT als Exporting-Parameter vom Typ DISVARIANT mitgeben
Diese Struktur enthält lediglich die Informationen, zu welchem Report und welchem Benutzernamen das Layout gespeichert werden soll.
I_SAVE
welche Speicheroptionen für die Layouts erlaubt sein sollen
Folgende Optionen stehen Ihnen für I_SAVE zur Auswahl
U
X
A
Der Benutzer kann nur benutzerspeizifische Layouts speichern (das Layout kann dann kein anderer Benutzer sehen).
Der Benutzer kann nur übergreifende Layouts speichern (das gespeicherte Layout ist dann für andere Benutzer sichtbar).
Der Benutzer kann sowohl benutzerspezifische als auch übergreifende Layouts ändern.