ALV Zeilen, Zellen und Spalten farbig formatieren

Aus SAP-Wiki
Zur Navigation springenZur Suche springen


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.

Zeilenfarbe1.JPG


Zeilenfarbe2.JPG

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.

Zellenfarbe4.jpg

Das Feld FNAME muss zwingend mit dem gewünschten Feld gefüllt werden. COLOR ist eine Struktur vom Typ LVC_S_COLO.

Zellenfarbe5.jpg


Das Feld COL wird mit einem Farbwert von 1 bis 7 gefüllt. INT und INV werden oft leer sein.

Zellenfarbe6.jpg

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").

Zellenfarbe7.JPG

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.

Interfacekonstanten1.jpg


Mit einem Klick auf Interfacekonstanten2.jpg 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.

Interfacekonstanten3.jpg

Spalten mit Farben formatieren

Web-Links