Vous êtes sur la page 1sur 5

Colores en ALV

Introduccin
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 difcil acordarse de la
codificacin de los colores o en qu campos concretos se tenan que colocar
dentro de la definicin. Hoy pegamos repaso y acompaamos adems con una
bonita macro para no volver a olvidarse jams. Asumo que ya has hecho alguna y
que los nombres de las cosas te suenan familiares.
La codificacin de color
Las ALV, y no s si el resto de lugares de R/3, codifican el color con un cdigo
char(4) con la siguiente estructura:
Cxyz
Donde C es siempre C, x[0,7] es el cdigo 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 grfico horrible podemos ver como se ven:


Observacin maliciosa: no s quien dej establecido que los colores corporativos siempre son alguna
combinacin de azules tenues. Obsrvese que en R/3 de 8 (ocho) colores bsicos disponibles, 3 (tres)
son azules.
Color en lneas
Para darle color a una lnea tenemos que definir un campo char(4) en nuestra tabla
interna que contenga, para cada fila, su cdigo de color como el que ya hemos
visto.
Posteriormente, antes de llamar a la ALV tenemos que especificar cul el campo
de color en la definicin de layout. Para eso nada como un ejemplo de cdigo:

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 definicin de ALV...]

is_layout-info_fieldname = 'COLORCILLO'. "literales en maysculas, SIEMPRE!
Color en columnas
Es ms rpido pues se define en el catlogo 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 informacin sobre el campo (o campos)
que debe colorear y el color que le (les) corresponde. Y por ltimo, especificarlo en
el layout:
*Aadimos 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 podramos 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 definicin de ALV...]

*lo decimos en el layout
is_layout-coltab_fieldname = 'CT'.
Y cmo me acuerdo?
De todos modos, como soy muy majo, os invito a una macro para no tener que
acordarse de los cdigos de color. El abap siguiente se explica solo:
DEFINE vc_color.
* MACRO para convertir color humano en cdigo color Cxyz
* creado por alberto viuela miranda en 2008, http://cranf.com
* uso: vc_color campo texto_en_espaol
* 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 definicin
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.