ABAP SAP ~ AbapFox 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)
*----------------------------------------------------------------------*
TABLES: vbak, kna1.
*----------------------------------------------------------------------*
* ESTRUTURA(S) TYPES
*----------------------------------------------------------------------*
TYPES: BEGIN 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
*----------------------------------------------------------------------*
DATA: gt_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
*----------------------------------------------------------------------*
DATA: gt_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-OPTIONS: s_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 .
REFRESH: gt_vbak, gt_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 .
REFRESH: gt_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.
CLEAR: gt_vbak, gt_kna1, gw_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.
REFRESH: gt_sortcat.
PERFORM: f_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 .
REFRESH: gt_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 DATA: v_dataini(10) TYPE c,
v_datafim(10) TYPE c,
v_qtd_linhas TYPE i,
v_lines(10) TYPE c.
REFRESH: gt_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.
WRITE: s_erdat-low TO v_dataini.
WRITE: s_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.
CLEAR: gw_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-POOLS: slis.
DATA: lv_callback_program LIKE sy-repid.
CLEAR: lv_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?
Acesse: www.abapfox.org
“O sucesso é a soma de pequenos esforços repetidos dia após dia” – Robert Collier
0 comentários: