ALV GRID - Cor e Semáforo entre Células


Falaaa galera da Fox!
Nesse post eu vou mostrar como colorir uma determinada célula do ALV, assim como mostrar semáforos entre as mesmas.

Com certeza na internet tem muito material explicando como utilizar essa técnica, mas eu particularmente achei um pouco confuso e como trata-se de algo muito útil no mundo ABAP, eu resolvi mostrar um exemplo o mais simples possível.

Mãos a obra!

Primeiro teremos que declarar uma variável do tipo lvc_t_scol (para trabalhar com a cor da célula) e outra do tipo char de 8 caracteres (para exibir o semáforo).
Ex.:
       cor           TYPE lvc_t_scol.
       semaforo TYPE c LENGTH 8.


Será preciso declarar também uma tabelinha do tipo: lvc_t_scol e uma work área do tipo: lvc_s_scol.
Ex.:
      lt_coltab TYPE lvc_t_scol,
      ls_col    TYPE lvc_s_scol.


Agora  é o seguinte, no momento em que você preenche a sua tabela de saída (aquela que você passará para função do ALV), iremos preencher também a tabela lt_coltab com base em sua estrutura.
Utilizei uma condição no programa, para ficar mais fácil o compreendimento.
Informe qual o nome do campo que você pretende colorir (Lembrando que deve estar em maiúsculo)
Ex.: ls_col-fname = 'PASSNAME'

Informar qual a cor que deseja passar para a célula. As cores são representada por números, pesquise no google mais afundo sobre todas as cores possível, aqui eu irei colorir apenas de vermelho e verde ;)
Para ficar claro, estou apendando estrutura de estrutura, por isso ficou enfileirada separadas por hífen, saiba mais no curso da fox, clicando aqui.
Ex.: ls_col-color-col = '6'

Depois que você tiver apendado sua tabela lt_coltab, você irá passar toda sua estrutura para o campo que você declarou referente a cor na tabela de saída.
Ex.: tb_saida-cor = lt_coltab[]

Nessa mesma condição, vamos aproveitar e preencher logo também o nosso semáforo.
Para isso você vai popular o campo referente ao semáforo, preenchendo sua tabela de saída com o mesmo.
Os semáforos são tipo:
Vermelho - Char: '@S_TL_R@'
Amarelo  - Char: '@S_TL_Y@'
Verde       - Char: '@S_TL_G@'

Passe um desses valores para dentro da variável que você declarou na sua tabela de saída e pronto ;)
Ex: wa_saida-semaforo = '@S_TL_G@'.


Será necessário declarar uma estrutura  slis_layout_alv para o ALV
Ex.: lv_layout   TYPE         slis_layout_alv.


E agora vem o puloooo da raposaaa \o///
Durante o preenchimento da estrutura de layout você irá preenchê-lo, passando o mesmo nome que você declarou lá na tabela de saída referente a cor.

Ex.: lv_layout-coltab_fieldname  = 'COR'.


E para finalizar, lembre-se de passar a estrutura que você preencheu no layout para sua função que chama o ALV.


Prontinhoooooo, ativa tudo e testa você mesmo \o///////
Segue todo o código que utilizei para testar o desenvolvimento ;)

REPORT YFOX_TREINAR01_156.
*----------------------------------------------------------------------*
* DECLARANDO ESTRUTURA PARA TABELA(S) INTERNA
*----------------------------------------------------------------------*
TYPESBEGIN OF st_sbook.
        INCLUDE  TYPE sbook.
TYPES:  cor      TYPE lvc_t_scol.
TYPES:  semaforo TYPE LENGTH 8.
TYPESEND OF st_sbook.
*----------------------------------------------------------------------*
* DECLARANDO TABELA(S) E WORK AREA(S)
*----------------------------------------------------------------------*
DATAtb_sbook  TYPE TABLE OF st_sbook WITH HEADER LINE,
      lt_coltab TYPE lvc_t_scol,
      ls_col    TYPE lvc_s_scol.
*-----------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM f_preenche_tabela.
  PERFORM f_exibi_alv.
*&---------------------------------------------------------------------*
*&      Form  F_PREENCHE_TABELA
*&---------------------------------------------------------------------*
*       Buscando dados
*----------------------------------------------------------------------*
FORM f_preenche_tabela .

  SELECT *
  FROM sbook
  INTO CORRESPONDING FIELDS OF TABLE tb_sbook
 WHERE carrid EQ 'AA'
   AND connid EQ '0017'.

  LOOP AT tb_sbook.
    IF tb_sbook-smoker IS NOT INITIAL.
      ls_col-fname      'PASSNAME'.
      ls_col-color-col  '6'.
      tb_sbook-semaforo '@S_TL_R@'.
    ELSE.
      ls_col-fname      'PASSNAME'.
      ls_col-color-col  '5'.
      tb_sbook-semaforo '@S_TL_G@'.
    ENDIF.
    APPEND ls_col TO lt_coltab.
    tb_sbook-cor lt_coltab[].

    MODIFY tb_sbook.
    CLEARtb_sbooklt_coltab[].
  ENDLOOP.
ENDFORM.                    " F_PREENCHE_TABELA
*&---------------------------------------------------------------------*
*&      Form  F_EXIBI_ALV
*&---------------------------------------------------------------------*
*       Montrando estrutura ALV para exibição
*----------------------------------------------------------------------*
FORM f_exibi_alv .

  DATA:lt_fieldcat TYPE         slis_t_fieldcat_alv,
       ls_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
       lv_layout   TYPE         slis_layout_alv.

  CLEAR:   ls_fieldcat.
  REFRESHlt_fieldcat.

  ls_fieldcat-fieldname 'PASSNAME'.
  ls_fieldcat-tabname   'GT_SAIDA'.
  ls_fieldcat-seltext_s 'Passageiro'.
  APPEND ls_fieldcat TO lt_fieldcat.
  CLEAR  ls_fieldcat.

  ls_fieldcat-fieldname 'SMOKER'.
  ls_fieldcat-tabname   'GT_SAIDA'.
  ls_fieldcat-seltext_s 'Fumante'.
  APPEND ls_fieldcat TO lt_fieldcat.
  CLEAR  ls_fieldcat.

  ls_fieldcat-fieldname 'SEMAFORO'.
  ls_fieldcat-tabname   'GT_SAIDA'.
  ls_fieldcat-seltext_s 'Status'.
  APPEND ls_fieldcat TO lt_fieldcat.
  CLEAR  ls_fieldcat.

  lv_layout-coltab_fieldname  'COR'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      is_layout     lv_layout
      it_fieldcat   lt_fieldcat
    TABLES
      t_outtab      tb_sbook
    EXCEPTIONS
      program_error 1
      OTHERS        2.

ENDFORM.                    " F_EXIBI_ALV


Gostou da publicação? Então clica na raposinha e curta nossa fanpage \o/


Quer aprender ABAP definitivamente, sem precisar sair de casa?

Acessewww.abapfox.org


“O sucesso é a soma de pequenos esforços repetidos dia após dia” – Robert Collier

0 comentários:

Copyright © 2013 ABAP SAP - AbapFox! Aprenda ABAP Definitivamente