ALV GRID com HOTSPOT e Cabeçalho no Relatório


HOTSPOT - São áreas especiais de uma lista de saída, como se fosse links. Se o usuário clicar uma vez em um campo de hotspot, um evento é acionado.

Para que seja possível inserir os hostpots em um ALV iremos fazer o seguinte:

- Teremos que marcar um flag para work area que alimenta a tabela do FIELDCAT
Ex.:

DATA: gt_fieldcat TYPE         slis_t_fieldcat_alv,
      gw_fieldcat TYPE LINE OF slis_t_fieldcat_alv.

      gw_fieldcat-hotspot     = 'X'.
      APPEND gw_fieldcat TO gt_fieldcat. 


- Na chamada de função 'REUSE_ALV_GRID_DISPLAY', devemos passar o 'USER_COMMAND' para o parâmetro i_callback_user_command da função.
Ex.:

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING

          i_callback_user_command = 'USER_COMMAND'


- Agora iremos "pegar" o que o usuário clicou, ou seja, iremos direcioná-lo através da transação que será aberta ao clicar no hotspot.
  Para isso teremos que criar um Form "USER_COMAND" e iremos passar como parâmetro UCOMM como sy-ucomm e SELFIELD do tipo kkblo_selfield.

  Vejo o exemplo abaixo, pois irei comentar o código para ficar fácil a compreensão:

FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE kkblo_selfield. 
  CLEAR: gw_saida.

* Após ter clicado sobre o hotspot a variável UCOMM estará preenchida com o valor "&IC1" por default
  CASE ucomm.
    WHEN '&IC1'.

*     Leia a tabela do ALV, passando o nome da coluna clicada para o campo FIELDNAME da tabela SELFIELD
      READ TABLE gt_saida INTO gw_saida INDEX selfield-tabindex.
      CHECK sy-subrc = 0.
      CASE selfield-fieldname.

*       Cada WHEN terá o nome de cada coluna que contém o hotspot
        WHEN  'VBELN'.

*         Para saber o ID de um campo, basta ir na SE16, informar a tabela que contém o campo e pressionar F1 sobre o campo. Em informações técnicas você encontrará o Parameter Id do mesmo
*         Informe também a o campo junto a work area da tabela do ALV
          SET PARAMETER ID 'AUN' FIELD gw_saida-vbeln.

*   O call transaction é a utilização de chamadas para transações utilizando chamadas automáticas através de codificação ABAP. Você irá informar o nome da transação que deseja ser direcionado
          CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. "And Skip - Se o usuário clicar em voltar, ele retorna para o ALV

        WHEN  'KUNNR'.
          SET PARAMETER ID 'KUN' FIELD gw_saida-kunnr.
          CALL TRANSACTION 'XD03' AND SKIP FIRST SCREEN.
        WHEN OTHERS.
      ENDCASE.
  ENDCASE.
ENDFORM.                    "user_command


Pronto, está feito seu hotspost!

Agora vamos ao cabeçalho no ALV \o/

- Primeiro vamos declarar uma tabela e uma work area do tipo: slis_t_listheader.
Ex.:
Data: it_header TYPE         slis_t_listheader,
      wa_header TYPE LINE OF slis_t_listheader.

- Depois teremos que alimentar os campos: typ, info ou key e alimentar a nossa tabela de cabeçalho.
Ex.:
*  Título - H ( Negrito, maior destaque )
   wa_header-typ  = 'H'.
   wa_header-info = 'Relação de Materiais'.
   APPEND wa_header TO it_header.

   CLEAR header.
*  Informações - S ( Descrição )
   wa_header-typ  = 'S'. 
   wa_header-key  = 'Empresa:'. " (Ênfase no início de uma frase)
   wa_header-info = p_bukrs.
   APPEND wa_header TO it_header.

   CLEAR wa_header.
*  Informações adicionais - A ( Ítálico ) 
   wa_header-typ  = 'A'. 
   wa_header-key  = 'Teste'.
   wa_header-info = t_line.
  APPEND wa_header TO it_header.

- Criaremos um FORM TOP_OF_PAGE, chamar a função 'REUSE_ALV_COMMENTARY_WRITE' e alimentar o parâmetro it_list_commentary com a tabela do cabeçalho.
Ex.:

FORM top_of_page.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = it_header.

ENDFORM.


- Por final iremos passar o form que acabamos de criar para a nossa função que chama o ALV
Ex.:

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING

      i_callback_top_of_page  = 'TOP_OF_PAGE'


Uffa!
Prontinho, esse foi pauleira \o/

Ative o programa e faça os testes.
Ao clicar no HOTSPOT você será direcionado para transação já passando o valor clicado na coluna e de quebra tem um cabeçalho simples e útil para seu ALV.

Segue o código utilizado para criar o tutorial, se gostar aproveite o templo do alv, pode ser útil mais tarde, bons estudos ;)


*----------------------------------------------------------------------*
*   ESTRUTURA(S) DA(S) TABELA(S) TRANSPARENTE(S)
*----------------------------------------------------------------------*

TABLESvbakkna1.
*----------------------------------------------------------------------*
*   ESTRUTURA(S) TYPES
*----------------------------------------------------------------------*

TYPESBEGIN OF ty_saida,
         erdat TYPE vbak-erdat" Data / Período
         vbeln TYPE vbak-vbeln" Ordem de Venda
         auart TYPE vbak-auart" Tipo Ordem de vendas
         ernam TYPE vbak-ernam" Criado por
         kunnr TYPE vbak-kunnr" Cliente
         knumv TYPE vbak-knumv" Nº condição do documento
         name1 TYPE kna1-name1" Razão social
         regio TYPE kna1-regio" UF Cliente
         txjcd TYPE kna1-txjcd" Domicilio Fiscal / Cód. Cidade
         ort01 TYPE kna1-ort01" Cidade
       END OF ty_saida.
*----------------------------------------------------------------------*
*   TABELA(S) INTERNA
*----------------------------------------------------------------------*

DATAgt_vbak  TYPE TABLE OF vbak WITH HEADER LINE,
      gt_kna1  TYPE TABLE OF kna1 WITH HEADER LINE,
      gt_saida TYPE TABLE OF ty_saida,
*----------------------------------------------------------------------*
*   WORK AREA(S)
*----------------------------------------------------------------------*

      gw_saida TYPE ty_saida.
*----------------------------------------------------------------------*
*   TABELA(S) E WA(S) PARA O ALV
*----------------------------------------------------------------------*

DATAgt_fieldcat TYPE         slis_t_fieldcat_alv,
      gt_sortcat  TYPE         slis_t_sortinfo_alv,
      gt_header   TYPE         slis_t_listheader,
      gw_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
      gw_sortcat  TYPE LINE OF slis_t_sortinfo_alv,
      gw_header   TYPE         slis_listheader,
      gw_layout   TYPE         slis_layout_alv.
*----------------------------------------------------------------------*
*   TELA DE SELEÇÃO
*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECT-OPTIONSs_erdat FOR vbak-erdat" Período
                s_vbeln FOR vbak-vbeln" Ordem Venda
                s_auart FOR vbak-auart" Tipo Ordem Venda
                s_ernam FOR vbak-ernam" Criado Por
                s_kunnr FOR kna1-kunnr" Cliente
SELECTION-SCREEN END OF BLOCK b1.
*----------------------------------------------------------------------*
*   INICIA PROGRAMA
*----------------------------------------------------------------------*

START-OF-SELECTION.
*----------------------------------------------------------------------*
*     PERFORM(S)
*----------------------------------------------------------------------*

  PERFORM f_busca_dados.
  PERFORM f_popula_saida.
  PERFORM f_monta_alv.
*&---------------------------------------------------------------------*
*&      Form  F_BUSCA_DADOS
*&---------------------------------------------------------------------*
*       Buscando dados com base nos parâmetros de seleção
*----------------------------------------------------------------------*

FORM f_busca_dados .
 REFRESHgt_vbakgt_kna1.

  SELECT erdat
         vbeln
         auart
         ernam
         kunnr
         knumv
    FROM vbak
    INTO CORRESPONDING FIELDS OF TABLE gt_vbak
   WHERE erdat IN s_erdat
     AND vbeln IN s_vbeln
     AND auart IN s_auart
     AND ernam IN s_ernam.

  IF gt_vbak[] IS NOT INITIAL.

    SELECT kunnr
           name1
           regio
           txjcd
           ort01
      FROM kna1
      INTO CORRESPONDING FIELDS OF TABLE gt_kna1
       FOR ALL ENTRIES IN gt_vbak
      WHERE kunnr EQ gt_vbak-kunnr.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F_POPULA_SAIDA
*&---------------------------------------------------------------------*
*       Preenche tabela de saída
*----------------------------------------------------------------------*

FORM f_popula_saida .
REFRESHgt_saida.
  CLEAR  gt_vbak  gt_kna1  gw_saida.
  SORT   gt_kna1 BY kunnr.
  LOOP AT gt_vbak.

    gw_saida-erdat  gt_vbak-erdat .
    gw_saida-vbeln  gt_vbak-vbeln .
    gw_saida-auart  gt_vbak-auart .
    gw_saida-ernam  gt_vbak-ernam .
    gw_saida-knumv  gt_vbak-knumv .

    READ TABLE gt_kna1 WITH KEY kunnr gt_vbak-kunnr BINARY SEARCH.
    IF sy-subrc EQ 0.
      gw_saida-kunnr  gt_kna1-kunnr  .
      gw_saida-name1  gt_kna1-name1  .
      gw_saida-regio  gt_kna1-regio  .
      gw_saida-txjcd  gt_kna1-txjcd  .
      gw_saida-ort01  gt_kna1-ort01  .
    ENDIF.
    APPEND gw_saida TO gt_saida.
    CLEARgt_vbakgt_kna1gw_saida.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F_EXIBE_ALV
*&---------------------------------------------------------------------*
*       Monta estrutura para o ALV GRID
*----------------------------------------------------------------------*

FORM f_monta_alv .
 PERFORM f_sortcat.
  PERFORM f_fieldcat.
  PERFORM f_layout.
  PERFORM f_cabecalho.
  PERFORM f_imprir_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  f_sortcat
*&---------------------------------------------------------------------*
*       Modelo SortCat
*----------------------------------------------------------------------*

FORM f_sortcat.
REFRESHgt_sortcat.
  PERFORMf_sort USING '1'  'VBELN'   'X'.
ENDFORM.                    "build_sortcat
*&---------------------------------------------------------------------*
*&      Form  F_SORT
*&---------------------------------------------------------------------*
*       Ordenando o ALV
*----------------------------------------------------------------------*

FORM f_sort  USING    p_spos
                      p_fieldname
                      p_up.


  CLEAR gw_sortcat.
  gw_sortcat-spos      p_spos.      " Posição da ordenação
  gw_sortcat-fieldname p_fieldname" Nome da coluna que será ordenada
  gw_sortcat-up        p_up.        " Ordenar de menor para o maior
  APPEND gw_sortcat TO gt_sortcat.
ENDFORM.                    " F_SORT
*&---------------------------------------------------------------------*
*&      Form  F_FIELD_CAT
*&---------------------------------------------------------------------*
*       Modelo FieldCat
*----------------------------------------------------------------------*

FORM f_fieldcat .
 REFRESHgt_fieldcat.
  PERFORM
           f_preenche_fieldcat   USING 'ERDAT'     'GT_SAIDA'    'Data'                  'L'      space,
           f_preenche_fieldcat   USING 'VBELN'    'GT_SAIDA'    'Ordem Venda'    'L'      'X',
           f_preenche_fieldcat   USING 'AUART'    'GT_SAIDA'    'TP Ord. Venda'  'L'      space,
           f_preenche_fieldcat   USING 'ERNAM'   'GT_SAIDA'    'Criado por'        'L'      space,
           f_preenche_fieldcat   USING 'KUNNR'   'GT_SAIDA'    'Cliente'              'L'      'X',
           f_preenche_fieldcat   USING 'KNUMV'  'GT_SAIDA'    'Nº Cond. Doc.'  'L'      space,
           f_preenche_fieldcat   USING 'NAME1'   'GT_SAIDA'    'Razão social'      'L'      space,
           f_preenche_fieldcat   USING 'REGIO'     'GT_SAIDA'    'UF Cliente'        'L'      space,
           f_preenche_fieldcat   USING 'TXJCD'     'GT_SAIDA'    'Cód. Cidade'     'L'      space,
           f_preenche_fieldcat   USING 'ORT01'     'GT_SAIDA'    'Cidade'              'L'      space.
ENDFORM.                    " F_FIELD_CAT
*&---------------------------------------------------------------------*
*&      Form  F_PREENCHE_FIELDCAT
*&---------------------------------------------------------------------*
*       Preenchendo FieldCat / Declarando os campos que serão impresso no ALV
*----------------------------------------------------------------------*

FORM f_preenche_fieldcat  USING    p_fieldname
                                   p_tabname
                                   p_seltext_1
                                   p_just
                                   p_hotspot.


  CLEAR gw_fieldcat.
  gw_fieldcat-fieldname   p_fieldname.   " Nome da coluna
  gw_fieldcat-tabname     p_seltext_1.     " Nome da tabela do ALV
  gw_fieldcat-seltext_m   p_seltext_1.     " Texto Campo / Key Word (L)ong (M)iddle (S)ort
  gw_fieldcat-just            p_just.              " Justificar / (R)ight (L)eft (C)ent.
  gw_fieldcat-hotspot     p_hotspot.         " Campo para HotSpot / Link
  APPEND gw_fieldcat TO gt_fieldcat.
ENDFORM.                    " F_PREENCHE_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  F_LAYOUT
*&---------------------------------------------------------------------*
*       Preenchendo Layout
*----------------------------------------------------------------------*

FORM f_layout .
 gw_layout-colwidth_optimize 'X'.     " Altera o tamanho da coluna
  gw_layout-zebra                      'X'.      " Deixa o ALV zebrado
ENDFORM.                    " F_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  F_CABECALHO
*&---------------------------------------------------------------------*
*       Criando cabeçalho para o ALV
*----------------------------------------------------------------------*

FORM f_cabecalho .
* Variáveis destinadas ao PERÌDO no cabeçalho   DATAv_dataini(10TYPE c,
        v_datafim(10TYPE c,
        v_qtd_linhas  TYPE i,
        v_lines(10)   TYPE c.

  REFRESHgt_header.
  CLEAR:   gw_header,
           v_qtd_linhas,
           v_lines,
           v_dataini,
           v_datafim.

  DESCRIBE TABLE gt_saida LINES v_qtd_linhas.
  v_lines v_qtd_linhas.

  WRITEs_erdat-low  TO v_dataini.
  WRITEs_erdat-high TO v_datafim.

  " Título do relatório
gw_header-typ  'H'.                 " H = Header, S = Selection, A = Action
  gw_header-info 'Ordens de Venda'.
  APPEND gw_header TO gt_header.
  CLEAR  gw_header.

  " Seleção no cabeçalho
gw_header-typ 'S'.
  CONCATENATE 'Período: ' v_dataini 'à' v_datafim
         INTO gw_header-info SEPARATED BY space.
  APPEND gw_header TO gt_header.
  CLEAR  gw_header.

  " Retorno/Exibição no cabeçalho

  CONCATENATE'Ordens encontradas: ' v_lines INTO gw_header-info SEPARATED BY space.
  APPEND gw_header TO gt_header.
ENDFORM.                    " F_CABECALHO
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       Setando o HotSpot de acordo com PARAMETER ID e CALL TRANSACTION
*----------------------------------------------------------------------*

FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE kkblo_selfield"slis_selfield.
 CLEARgw_saida.

  CASE ucomm.
    WHEN '&IC1'.
      READ TABLE gt_saida INTO gw_saida INDEX selfield-tabindex.
      CHECK sy-subrc 0.
      CASE selfield-fieldname.
        WHEN  'VBELN'.
          SET PARAMETER ID 'AUN' FIELD gw_saida-vbeln.
          CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
        WHEN  'KUNNR'.
          SET PARAMETER ID 'KUN' FIELD gw_saida-kunnr.
          CALL TRANSACTION 'XD03' AND SKIP FIRST SCREEN.
        WHEN OTHERS.
      ENDCASE.
  ENDCASE.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
*       Função para exibição do cabeçalho
*----------------------------------------------------------------------*

FORM top_of_page.   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary gt_header.

ENDFORM"top_of_page
*&---------------------------------------------------------------------*
*&      Form  F_IMPRIR_ALV
*&---------------------------------------------------------------------*
*       Impressão do ALV GRID na tela
*----------------------------------------------------------------------*

FORM f_imprir_alv .
* Essa declaração e necessária pois e o grupo de tipos usados no ALV.
TYPE-POOLSslis.
  DATAlv_callback_program LIKE sy-repid.

  CLEARlv_callback_program.
  lv_callback_program sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program               lv_callback_program
      i_callback_user_command    'USER_COMMAND'
      i_callback_top_of_page        'TOP_OF_PAGE'
      it_fieldcat                              gt_fieldcat
      it_sort                                    gt_sortcat
      is_layout                                gw_layout
      i_save                                    'A'
    TABLES
      t_outtab                                 gt_saida
    EXCEPTIONS
      program_error                       1
      OTHERS                               2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " F_IMPRIR_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

Um comentário:

  1. Valeu meu amig@ , foi muito útil e consegui usar no meu programa.
    Porem usei um outro modelo para alv e assim:

    gw_fieldcat-hotspot = 'X'.

    não funcionou comigo, tive que declarar apenas no campo que queria , mas deu certo, abraço!

    ResponderExcluir

Copyright © 2013 ABAP SAP - AbapFox! Aprenda ABAP Definitivamente