Archivos Mensuales: abril 2009

Colores en ALV

Introducción

A veces toca colorear las filas o columnas de un listado ALV. Casi todo el mundo tiene su propio template para estas cosas, pero es difícil acordarse de la codificación de los colores o en qué campos concretos se tenían que colocar dentro de la definición. Hoy pegamos repaso y acompañamos además con una bonita macro para no volver a olvidarse jamás. Asumo que ya has hecho alguna y que los nombres de las cosas te suenan familiares.

La codificación de color

Las ALV, y no sé si el resto de lugares de R/3, codifican el color con un código char(4) con la siguiente estructura:

Cxyz

Donde C es siempre “C”, x€[0,7] es el código de color, y es INTENSIFIED, z es INVERSE. Siempre cumpliendo y,z €[0,1] pero sabiendo que cuando y = 1, da igual lo que valga z. En este gráfico horrible podemos ver como se ven:
 

la magnífica paleta ALV de R/3
Observación maliciosa: no sé quien dejó establecido que los colores corporativos siempre son alguna combinación de azules tenues. Obsérvese que en R/3 de 8 (ocho) colores básicos disponibles, 3 (tres) son azules.

Color en líneas

Para darle color a una línea tenemos que definir un campo char(4) en nuestra tabla interna que contenga, para cada fila, su código de color como el que ya hemos visto.

Posteriormente, antes de llamar a la ALV tenemos que especificar cuál el campo de color en la definición de layout. Para eso nada como un ejemplo de código:

data: begin of it_tablita occurs 0,
      caja(1),
      semaforo(1),
      gjahr like bkpf-gjahr,
      blart like bkpf-blart,
      budat like bkpf-budat,
      belnr like bkpf-belnr,
      dmbtr like bseg-dmbtr,
      waers like bkpf-waers,
      COLORCILLO(4),
end of it_tablita.

loop at it_tablita.
      it_tablita_colorcillo = 'C211'. "por ejemplo
      modify it_tablita.
endloop.

*[...continuamos hasta la definición de ALV...]

is_layout-info_fieldname = 'COLORCILLO'. "literales en mayúsculas, SIEMPRE!

Color en columnas

Es más rápido pues se define en el catálogo de campos, clave emphasize. Por ejemplo:

it_fieldcat-emphasize = 'C600'.

Color en celdas

Esto SÍ es un rollo. Tenemos que meter un campo en nuestra tabla interna, como en el caso del color en filas. Pero ahora ese campo contendrá una tabla del tipo lvc_t_scol. Esta tabla debe contener información sobre el campo (o campos) que debe colorear y el color que le (les) corresponde. Y por último, especificarlo en el layout:

*Añadimos la tabla CT como campo de la tabla interna
data: begin of it_tablita occurs 0,
      caja(1),
      semaforo(1),
      gjahr like bkpf-gjahr,
      blart like bkpf-blart,
      budat like bkpf-budat,
      belnr like bkpf-belnr,
      dmbtr like bseg-dmbtr,
      waers like bkpf-waers,
      COLORCILLO(4),
      CT type lvc_t_scol,
end of it_tablita.

*cs es la estructura de la tabla de colores
Data: cs type lvc_s_scol,
*cta es la tabla donde meteremos cs y luego se la pasamos a CT
cta type lvc_t_scol.

*cargamos el valor. suponemos un loop
LOOP AT IT_TABLITA WHERE BLART NE SPACE.
      refresh cta.
      clear cs.
* coloreamos BLART, pero podríamos hacer con los otros
      cs-fname = 'BLART'.
      cs-color-col = 4.
      cs-color-int = 0.
      cs-color-inv = 0.
      cs-nokeycol = 'X'.
      append cs to cta.
      append lines of cta to it_tablita-ct.
      clear cs.
      modify it_tablita transporting ct.
endloop.

*[...continuamos hasta la definición de ALV...]

*lo decimos en el layout
is_layout-coltab_fieldname = 'CT'.

¿Y cómo me acuerdo?

De todos modos, como soy muy majo, os invito a una macro para no tener que acordarse de los códigos de color. El abap siguiente se explica solo:

DEFINE vc_color.
* MACRO para convertir color humano en código color Cxyz
* creado por alberto viñuela miranda en 2008, http://cranf.com
* uso: vc_color campo ´texto_en_español´
* en EMPHASIZE o en el campo COLOR usamos char(4)
* con la forma Cxyz, x€[0,7]; y,z€[0,1] / y+z<2
* valores de x:
*            0 COL_BACKGROUND fondo (gris)
*            1 COL_HEADING    azul oscuro
*            2 COL_NORMAL     azul claro
*            3 COL_TOTAL      amarillo
*            4 COL_KEY        azul
*            5 COL_POSITIVE   verde
*            6 COL_NEGATIVE   rojo
*            7 COL_GROUP      naranja
* valores de y: 0 = normal, 1 = intenso
* valores de z: 0 = xy afecta fondo, 1 = x invertido
*          OJO: ls_fieldcat-key = 'X' invalida lo anterior
&1 = 'C000'. "gris fondo por definición
find 'azul' in &2 ignoring case.
if sy-subrc = 0.
&1+1(1) = '4'.
find 'claro' in &2 ignoring case.
if sy-subrc = 0. &1+1(1) = '2'. endif.
find 'oscuro' in &2 ignoring case.
if sy-subrc = 0. &1+1(1) = '1'. endif.
endif.
find 'amar' in &2 ignoring case.
if sy-subrc = 0. &1+1(1) = '3'. endif.
find 'verd' in &2 ignoring case.
if sy-subrc = 0. &1+1(1) = '5'. endif.
find 'rojo' in &2 ignoring case.
if sy-subrc = 0. &1+1(1) = '6'. endif.
find 'nara' in &2 ignoring case.
if sy-subrc = 0. &1+1(1) = '7'. endif.
find 'ntens' in &2 ignoring case.
if sy-subrc = 0. &1+2(2) = '10'. endif.
find 'nver' in &2 ignoring case.
if sy-subrc = 0. &1+2(2) = '01'. endif.
END-OF-DEFINITION.

Y he aquí unos ejemplos:

vc_color it_fieldcat-emphasize 'azul oscuro'.

vc_color it_fieldcat-emphasize 'azul claro intenso'.

vc_color it_fieldcat-emphasize 'naranja invertido'.

Shameless self-promotion

Si necesitas colores para cualquier otra cosa que no sea R/3, recomiendo color synthAxis.

Publicado en: SAP 1 Comentario ▼
[c] Alberto Viñuela Miranda / Cranfcom 2013-2014

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.