ALV Zeilen, Zellen und Spalten farbig formatieren
Siehe.
Es kann eine gesamte Spalte einer Farbe zugewiesen werden im Fieldcat.
Aber manchmal möchte man auch eine Zeile farbig formatieren in Abhängigkeit einer Bedingung oder eine Zelle und dieser Zeile bzw. Zelle mit der Farbcodierung der Zelle eine semantische Bedeutung geben.
Eine Zeile farbig formatieren
Erweiterung interne Tabelle
Die interne Tabelle wird um eine Spalte erweitert. In diesem Fall um die Spalte ROWCOLOR. Sie typisiert auf ein Char-Feld der Länge 4.
Types: begin of ty_paragraphs. include structure SSFPARAS. types: ROWCOLOR type char4. Types: end of ty_paragraphs.
Neue Spalte der Layout-Struktur bekannt machen
Die Layout-Struktur vom ALV-Grid wird im Spaltennamen INFO_FNAME mit der neuen Spalte gefüllt. Der ALV-Grid weiß somit in welcher Spalte der internen Tabelle die Farbcodierung der Zeile ist.
ls_layout-info_fname = 'ROWCOLOR'.
Interne Tabelle füllen
Die interne Tabelle wird in Abhängigkeit vom Kontext mit einer Farbcodierung gefüllt. Hier wird die interne Tabelle CT_PARAGRAPHS in der Spalte ROWCOLOR mit "C300" (Beige) gefüllt.
read table ct_paragraphs ASSIGNING <fs_paragraphs> with key TDPARGRAPH = ls_itab-TDFIRSTPAR. <fs_paragraphs>-rowcolor = 'C300'.
Anzeige in ALV-Liste
Hier wird der Standardabsatz "AL" in einer Liste von Absatzformaten eines Smart Form-Stils in einer beigen Farbe angezeigt.
Eine Zelle farbig formatieren
Feld einfügen Typ LVC_T_SCOL
In der internen Tabelle, die im ALV ausgegeben wird, muss ein Feld (hier mit Namen CELLCOLL) eingefügt werden, was den Typ LVC_T_SCOL hat.
Siehe Include <CL_ALV_CONTROL> und https://www.abapforum.com/forum/viewtopic.php?t=6612, der beschreibt, wie man Spalte fett markieren kann.
TYPES: BEGIN OF ty_texte, ..., "(normale Felder) CELLCOL TYPE LVC_T_SCOL. "Zellfarben TYPES: END OF ty_texte.
Das Feld FNAME muss zwingend mit dem gewünschten Feld gefüllt werden. COLOR ist eine Struktur vom Typ LVC_S_COLO.
Das Feld COL wird mit einem Farbwert von 1 bis 7 gefüllt. INT und INV werden oft leer sein.
Feld CELLCOL in Layout-Struktur bekannt machen
In der Layoutstruktur wird dieses Feld CELLCOL dem ALV bekannt gemacht.
ls_layout-ctab_fname = 'CELLCOL'.
Feld CELLCOL im Loop füllen
Beim Loop über die interne Tabelle wird dieses Feld CELLCOL nun gefüllt mit dem Feldnamen und dem gewünschten Farbwert.
*&---------------------------------------------------------------------* *& Form FILL_CELLCOL *&---------------------------------------------------------------------* * Zellen werden farblich formatiert *----------------------------------------------------------------------* FORM alv_itab_fill_cellcol CHANGING ct_itab TYPE tty_itab. CONSTANTS: BEGIN OF gcs_color_green, col TYPE lvc_col VALUE 5, "Grün int TYPE lvc_int VALUE 0, inv TYPE lvc_inv VALUE 0, END OF gcs_color_green. CONSTANTS: BEGIN OF gcs_color_red, col TYPE lvc_col VALUE 6, "Rot int TYPE lvc_int VALUE 0, inv TYPE lvc_inv VALUE 0, END OF gcs_color_red. LOOP AT ct_itab ASSIGNING FIELD-SYMBOL(<fs_itab>). IF <fs_itab>-type = 'E'. <fs_itab>-cellcol = VALUE #( BASE <fs_itab>-cellcol ( fname = 'WERKS' color = gcs_color_red ) ( fname = 'MATNR' color = gcs_color_red ) ( fname = 'TYPE' color = gcs_color_red ) ( fname = 'MESSAGE' color = gcs_color_red ) ). ELSE. <fs_itab>-cellcol = VALUE #( BASE <fs_itab>-cellcol ( fname = 'WERKS' color = gcs_color_green ) ( fname = 'MATNR' color = gcs_color_green ) ( fname = 'TYPE' color = gcs_color_green ) ( fname = 'MESSAGE' color = gcs_color_green ) ). ENDIF. ENDLOOP. ENDFORM.
Problem Select in tiefe Struktur
Wenn die interne Tabelle um die interne Tabelle CELLCOL erweitert wurde, liegt eine tiefe Struktur vor, in die nicht mehr so einfach selektiert werden kann mittels
select .. into itab
Es kann dann gleich bei der Syntaxprüfung zu einer Fehlermeldung kommen. Hier behilft man sich dann, indem die tiefe Struktur mit einer Select-Endselect-Schleife gefüllt wird. Im einfachsten Fall mit
select ... INTO CORRESPONDING FIELDS OF @ls_itab
Wenn ungleichnamige Felder dabei sind, dann müssen die Felder einzeln aufgeführt werden
select vbap~vbeln, vbap~posnr ... INTO (@ls_itab-vbeln_ka, @ls_itab-posnr, ...)
Ausgabe ALV-Liste
Die Felder "Material" bis "Messagetext" erscheinen nun grün oder rot, in Abhängigkeit vom Meldungstyp (Feld "Msg-Typ").
Interface-Konstanten für Spaltenfarben und Zellfarben
- Die Definition der Farben der Zellen ist schwer merkbar. Es liegt nahe dafür Konstanten in einem Interface anzulegen. Das hat einerseits den Vorteil, dass man das Füllen der Farben nicht neu nachschlagen muss und man kann einen Verwendungsnachweis auf die Farbkonstanten im Interface durchführen, um die Verwender (ALV-Reporte) zu finden.
- Theoretisch kann man später systemweit die Farbintensität einer Farbe ändern, indem man den Farbwert der Konstante in der globalen Klasse/Interface ändert und so diese Änderung gleich auf alle Verwender in den Reporten vererben. Das macht vor allem Sinn, wenn alle ALV-Reporte mit Farbausgaben diese Konstanten verwenden.
- In einem Projekt wurde hier das Interface "ZIF_CA_CONSTANTS" angelegt. Es geht hier um die Konstanten mit dem Namen "MCS_ALV_CELL_GREEN" und folgende.
Mit einem Klick auf kommt man auf die "Direkte Typangabe", da hier kein Data-Dictionary-Bezug existiert für die anzulegende Konstante für die Zellfarbe.
Das Feld "COLL" steht hier für die Grundfarbe. Es gibt die Werte 1 bis 9. "INT" erhöht die Intensität der Farbe mit dem Wert 1. Man sollte hier einfach etwas experimentieren welche Farben einem gefallen und sie dann als Konstanten anlegen. Im Screenshot sind die Konstanten für Grün, Rot und Blau definiert.