SAP R/3
MÓDULO ABAP
REPORT ALV
Treinamento
Índice:
VISÃO GERAL:...................................................................................................................3
CRIAÇÃO DO REPORT ALV:.............................................................................................61) Em forma de LISTA..............................................................................................................................62) Em forma de GRID................................................................................................................................7
DECLARAÇÃO DE DADOS PARA ALV:...........................................................................8
VARIANTES.......................................................................................................................10Busca de Variantes previamente geradas:................................................................................................10Escolha de Variantes para execução do ALV:.........................................................................................10
INÍCIO LÓGICO DO PROGRAMA:...................................................................................11
PROCESSAMENTO DO ALV:..........................................................................................12Definição de CABEÇALHO:..................................................................................................................13Definição das COLUNAS A SEREM IMPRESSAS:.............................................................................13Definição de LAYOUT:..........................................................................................................................15Definição de EVENTOS:.........................................................................................................................15Definição de QUEBRA / SORT:.............................................................................................................16Definição de CALLBACK do programa.................................................................................................17Definição do ALV:..................................................................................................................................17
CRIAÇÃO DE FORMS:.....................................................................................................18FORM USER_COMMAND:...................................................................................................................18FORM TOP_OF_PAGE:.........................................................................................................................19FORM XEND_OF_LIST:.......................................................................................................................19
OPÇÕES GERAIS DO ALV:.............................................................................................20Ícones:......................................................................................................................................................20Alterando cor de linha:.............................................................................................................................22
ALTERANDO O PF-STATUS DE UM ALV:......................................................................23
ALV MÚLTIPLO:................................................................................................................24
LÓGICA DE ALV MÚLTIPLO:...........................................................................................25Chamada do ALV Múltiplo dentro do ALV Simples:.............................................................................25
CONSTRUÇÃO DO ALV MÚLTIPLO................................................................................26Module-Pool............................................................................................................................................26Container:.................................................................................................................................................27Codificação / Explicação:........................................................................................................................28Estruturas ZKNA1 / ZLFA1:...................................................................................................................30PF-STATUS:............................................................................................................................................31
2
Treinamento
Visão Geral:
ALV – Abap List View - Basicamente uma função Standard que pega a sua tabela interna de dados e transforma em um relatório. Existem algumas funcionalidades como gerar um arquivo Excel, gráficos, somatórias de campos, "links" para chamar uma outra transação, etc.. etc.. O ALV trabalha com as tabelas do type-pools slis.
Exemplos de ALV.
Relatório ALV (Fig 01).
Fig. 01
3
Menu stander de funções
Menu Z de funções
Treinamento
Exemplo Excel – ALV: clicando no botão que chama o Excel, monta-se dentro do ALV uma planilha Excel.
Fig. 02
4
Treinamento
Opção de gráfico:
Fig. 03
** Esta opção não foi utilizada no exemplo
5
Treinamento
Criação do Report ALV:
O Report ALV (Abap List View) pode ser gerado de 2(duas) maneiras:
1) Em forma de LISTA CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
Fig. 04
6
Treinamento
2) Em forma de GRID CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
Fig. 05
7
Treinamento
Declaração de dados para ALV:
*Primeiramente, definiremos algumas constantes, variáveis, etc no nosso programa. Não esquecer de definir o type-pools SLIS!!
*Definição das tabelas. Essa são tabelas que carregamos as informações necessárias para passar pra função. São tabelas que armazenam o layout do seu relatório, a classificação, os campos, e o cabeçalho .
Exemplo:
*----------------------------------------------------------------------** DECLARAÇÃO DE VARIÁVEIS, CONSTANTES, TABELAS PARA ALV*----------------------------------------------------------------------** Variáveis/Tabelas para ALVTYPE-POOLS: slis.DATA: t_alv_fieldcat TYPE slis_t_fieldcat_alv, “Tab. Com os campos s_alv_layout TYPE slis_layout_alv, “Tab. De Layout do ALV l_repid LIKE sy-repid, t_alv_events TYPE slis_t_event, t_alv_listheader TYPE slis_t_listheader,* Tab./Estrut. De Ordenação ou Quebra h_sort_alv TYPE slis_sortinfo_alv, " header t_sort_alv TYPE slis_t_sortinfo_alv, " sem header* Definição da Variante gerada pelos usuários variante LIKE disvariant.
* Constantes p/ ALVCONSTANTS: c_display LIKE sy-ucomm VALUE 'DISPLAY', c_listheader_typ_headline TYPE slis_listheader-typ VALUE 'S'.
8
Treinamento
Definição de tabela(s) interna(s) para utilização no ALV:
*Vamos criar a nossa tabela interna. Essa tabela interna seria a ultima tabela (aquela que temos já todas as informações gravadas nela). *----------------------------------------------------------------------** DECLARAÇÃO DE TABELAS INTERNAS*----------------------------------------------------------------------** Tab. p/ Impressão em ALV principalDATA: BEGIN OF t_final OCCURS 0, bukrs LIKE bseg-bukrs, belnr LIKE bseg-belnr, gjahr LIKE bseg-gjahr, augdt LIKE bseg-augdt, gsber LIKE bseg-gsber, dmbtr LIKE bseg-dmbtr, wrbtr LIKE bseg-wrbtr, pswsl LIKE bseg-pswsl, sgtxt LIKE bseg-sgtxt, lifnr LIKE bseg-lifnr, kunnr LIKE bseg-kunnr, ICON(30), END OF t_final,
* Tab. p/ Impressão em ALV de Clientes BEGIN OF t_kna1 OCCURS 0, kunnr LIKE kna1-kunnr, land1 LIKE kna1-land1, name1 LIKE kna1-name1, ort01 LIKE kna1-ort01, END OF t_kna1,
* Tab. p/ Impressão em ALV de Fornecedores BEGIN OF t_lfa1 OCCURS 0, lifnr LIKE lfa1-lifnr, land1 LIKE lfa1-land1, name1 LIKE lfa1-name1, ort01 LIKE lfa1-ort01, END OF t_lfa1.
9
Treinamento
VariantesBusca de Variantes previamente geradas:
INITIALIZATION. PERFORM alv_init.
FORM alv_init...* Esta função busca as variantes para o programa, se existirem… CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET' EXPORTING i_save = 'A' CHANGING cs_variant = variante EXCEPTIONS not_found = 2....ENDFORM. " ALV_INIT
Escolha de Variantes para execução do ALV:
*----------------------------------------------------------------------*AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_varia.*----------------------------------------------------------------------* PERFORM alv_f4.
FORM alv_f4.
.
.* Com esta função escolhe-se a Variante para executar o ALV, caso * a função anterior tenha tido sucesso... CALL FUNCTION 'REUSE_ALV_VARIANT_F4' EXPORTING is_variant = variante i_save = 'A' IMPORTING es_variant = variante EXCEPTIONS not_found = 2....
ENDFORM. " ALV_F4
10
Treinamento
Início Lógico do programa:
*----------------------------------------------------------------------** INÍCIO LÓGICO*----------------------------------------------------------------------*START-OF-SELECTION. PERFORM busca_dados.
IF NOT t_final[] IS INITIAL. PERFORM alv. ENDIF.
END-OF-SELECTION.
No PERFORM busca_dados, gera-se as tabelas a serem utilizadas pelo ALV.
11
Treinamento
Processamento do ALV:
FORM alv.
* DEFINIÇÀO DO CABEÇALHO PERFORM: alv_build_header,* DEFINIÇÃO DAS COLUNAS A SEREM IMPRESSAS alv_build_fieldcat CHANGING t_alv_fieldcat,* DEFINIÇÃO DO LAYOUT alv_set_layout CHANGING s_alv_layout,* DEFINIÇÃO DE EVENTOS alv_build_eventtab CHANGING t_alv_events,* DEFINIÇÃO DE QUEBRAS definir_quebras_alv.
* set callback program* DEFINIÇÃO DE: CALLBACK DO PROGRAMA* sy-repid guarda o nome do programa em execução... l_repid = sy-repid.
* display ALV grid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'* display ALV list.* CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_background_id = ' ' i_callback_program = l_repid i_callback_top_of_page = 'ALV_TOP_OF_LIST' i_callback_user_command = 'ALV_USER_COMMAND'* QND. TEM OUTRO STATUS A SER GERADO... i_callback_pf_status_set = 'SET_PF_STATUS' is_layout = s_alv_layout i_save = 'A' it_fieldcat = t_alv_fieldcat it_events = t_alv_events it_sort = t_sort_alv TABLES t_outtab = t_final 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.
12
Treinamento
Definição de CABEÇALHO:* DEFINIÇÀO DO CABEÇALHO PERFORM: alv_build_header,
*&---------------------------------------------------------------------**& Form ALV_BUILD_HEADER*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*FORM alv_build_header.
... DATA: ls_listheader LIKE LINE OF t_alv_listheader.
ls_listheader-typ = c_listheader_typ_headline. ls_listheader-key = 'Usuário : '. ls_listheader-info = sy-uname. APPEND ls_listheader TO t_alv_listheader.
ENDFORM. " ALV_BUILD_HEADER
Definição das COLUNAS A SEREM IMPRESSAS:
* DEFINIÇÃO DAS COLUNAS A SEREM IMPRESSAS PERFORM alv_build_fieldcat CHANGING t_alv_fieldcat.
FORM alv_build_fieldcat CHANGING et_fieldcat TYPE slis_t_fieldcat_alv.
DATA: l_fieldcat TYPE slis_fieldcat_alv, l_count TYPE i.
CLEAR: l_fieldcat, l_count, t_alv_fieldcat. REFRESH: t_alv_fieldcat.
* Add header data. . .*EMPRESA CLEAR l_fieldcat. l_count = l_count + 1. l_fieldcat-col_pos = l_count. l_fieldcat-fieldname = 'BUKRS'. l_fieldcat-ref_tabname = 'BSEG'. l_fieldcat-ddictxt = 'L'. l_fieldcat-outputlen = '4'. l_fieldcat-datatype = 'CHAR'. l_fieldcat-hotspot = ''. l_fieldcat-seltext_l = 'Empresa'. APPEND l_fieldcat TO et_fieldcat.
. . .ENDFORM. " ALV_BUILD_FIELDCAT
Feito isso, a tabela et_fieldcat possui os campos da tabela interna. Existem alguns campos dentro dessa tabela que tem algumas funcionalidades. Por exemplo:
13
Treinamento
Pode-se atribuir determinado campo para chamar uma função quando o usuário clicar duas vezes em cima dele. No exemplo, estamos utilizando isso no campo BELNR que executa a transação FB03. Para isso, ativar o campo hotspot da tabela et_fieldcat.
*NÚM. DOCUMENTO CLEAR l_fieldcat. l_count = l_count + 1. l_fieldcat-col_pos = l_count. l_fieldcat-fieldname = 'BELNR'. l_fieldcat-ref_tabname = 'BSEG'. l_fieldcat-ddictxt = 'L'. l_fieldcat-outputlen = '10'. l_fieldcat-datatype = 'CHAR'.
l_fieldcat-hotspot = 'X'. l_fieldcat-seltext_l = 'Núm. Doc.'. APPEND l_fieldcat TO et_fieldcat.
Outra opção é utilizarmos a edição de campos:
*TXT. ÍTEM CLEAR l_fieldcat. l_count = l_count + 1. l_fieldcat-col_pos = l_count. l_fieldcat-fieldname = 'SGTXT'. l_fieldcat-ref_tabname = 'BSEG'. l_fieldcat-ddictxt = 'L'. l_fieldcat-outputlen = '50'. l_fieldcat-datatype = 'CHAR'. l_fieldcat-hotspot = ''.
* Utilizado para GRID l_fieldcat-edit = 'X'.* Utilizado para LIST l_fieldcat-input = 'X'. l_fieldcat-seltext_l = 'Txt. Ítem'. APPEND l_fieldcat TO et_fieldcat.
Podemos definir um campo que ao ser mostrado na tela, mostre a sua somatória. No exemplo abaixo, utilizamos o campo WRBTR.
* Valor CLEAR l_fieldcat. l_count = l_count + 1. l_fieldcat-col_pos = l_count. l_fieldcat-fieldname = 'WRBTR'. l_fieldcat-tabname = 'T_FINAL'. l_fieldcat-ddictxt = 'L'. l_fieldcat-outputlen = 15. l_fieldcat-datatype = 'CURR'. l_fieldcat-hotspot = 'X'. l_fieldcat-seltext_l = 'Valor'. l_fieldcat-just = 'R'. l_fieldcat-reptext_ddic = 'Valor'. l_fieldcat-no_zero = 'X'.
14
Treinamento l_fieldcat-do_sum = 'X'. APPEND l_fieldcat TO et_fieldcat.
15
Treinamento
Definição de LAYOUT:
* DEFINIÇÃO DO LAYOUT PERFORM alv_set_layout CHANGING s_alv_layout.
FORM alv_set_layout CHANGING es_alv_layout TYPE slis_layout_alv.
CLEAR: es_alv_layout.* DEFINIÇÃO DE ÍTEM COMO DEFAULT (JÁ USEI COM 'X' E VAZIO E NÃO TIVE* PROBLEMAS....* es_alv_layout-default_item = 'X'.* DEFINIÇÃO DE LINHAS DIFERENCIADAS POR CORES es_alv_layout-zebra = 'X'.* SY-UCOMM, NESTE PONTO FIXA-SE A VAR C_DISPLAY = 'DISPLAY' es_alv_layout-f2code = c_display.* DEFINIÇÃO IDEAL DA LARGURA DAS COLUNAS es_alv_layout-colwidth_optimize = 'X'.
ENDFORM. " ALV_SET_LAYOUT
Na determinação do Layout, podemos também definir que campos que são numéricos devem ser totalizados Exemplo: es_alv_layout–totals_text = 'Total Final'. “Exibir a linha do total es_alv_layout-numc_sum = 'X'.
Definição de EVENTOS:
* DEFINIÇÃO DE EVENTOS PERFORM alv_build_eventtab CHANGING t_alv_events.
FORM alv_build_eventtab CHANGING et_alv_events TYPE slis_t_event.
DATA: ls_alv_events TYPE slis_alv_event, l_dummy_ucomm LIKE sy-ucomm, l_dummy_selfield TYPE slis_selfield.
REFRESH: et_alv_events.
* event 'BEFORE_LINE_OUTPUT' CLEAR ls_alv_events. ls_alv_events-name = slis_ev_before_line_output. ls_alv_events-form = 'BEFORE_LINE_OUTPUT'. APPEND ls_alv_events TO et_alv_events.
* event 'USER_COMMAND'. CLEAR ls_alv_events. ls_alv_events-name = slis_ev_user_command. ls_alv_events-form = 'ALV_USER_COMMAND'. APPEND ls_alv_events TO et_alv_events.
IF wg_tela = 'X'.* O XEND_OF_LIST, só é executado no modo LIST* event 'XEND_OF_LIST'. -> TELAS COMPLEMENTARES CLEAR ls_alv_events. ls_alv_events-name = slis_ev_end_of_list.
16
Treinamento ls_alv_events-form = 'XEND_OF_LIST'. APPEND ls_alv_events TO et_alv_events.
* event 'TOP_OF_PAGE'. -> TELA DE PALLET / ETIQUETA CLEAR ls_alv_events. ls_alv_events-name = slis_ev_top_of_page. ls_alv_events-form = 'TOP_OF_PAGE'. APPEND ls_alv_events TO et_alv_events. ELSE.
* event 'ALV_TOP_OF_LIST'. CLEAR ls_alv_events. ls_alv_events-name = slis_ev_top_of_list. ls_alv_events-form = 'ALV_TOP_OF_LIST'. APPEND ls_alv_events TO et_alv_events. ENDIF.
* callback forms.* Este teste exite, pois estes PERFORM’s somente são executados* pelo ALV STANDARD.. IF 1 = 0. PERFORM alv_top_of_list. PERFORM xend_of_list. PERFORM top_of_page. PERFORM alv_user_command USING l_dummy_ucomm l_dummy_selfield. ENDIF.
ENDFORM. " ALV_BUILD_EVENTTAB
Definição de QUEBRA / SORT:
* DEFINIÇÃO DE QUEBRAS PERFORM definir_quebras_alv.
FORM definir_quebras_alv.
* Ordenar lista* sort t_final by BUKRS BELNR
CLEAR t_sort_alv. refresh t_sort_alv.
* A quebra será executada no campo BUKRS, posição 01 h_sort_alv-spos = '01'. h_sort_alv-fieldname = 'BUKRS'. h_sort_alv-tabname = 'T_FINAL'. h_sort_alv-up = 'X'.* h_sort_alv-DOWN = 'X'. h_sort_alv-subtot = 'X'. " inicializar com 'X' para totalização h_sort_alv-group = '*'. " inicializar com '*' para quebra APPEND h_sort_alv TO t_sort_alv.
. . . ENDFORM. " definir_quebras_alv
A tabela de SORT/QUEBRA, possui os campos onde iremos classificar os campos.
Tem a opção de mostrar o total de uma coluna ou a classificação em ordem ascendente ou descendente de uma coluna.
17
Treinamento
h_sort_alv-fieldname = 'BUKRS'. “Nome do campo da tabela interna h_sort_alv -spos = 1. “Posicao da quebra (1,2,3,4.... h_sort_alv -up = ‘X’. “Classificação em ordem ascendente. h_sort_alv -subtot = ‘X’.. “Mostrar Sub-Total APPEND h_sort_alv TO t_sort_alv.
Definição de CALLBACK do programa.
* set callback program* DEFINIÇÃO DE: CALLBACK DO PROGRAMA* Esta var. determina que quando executado o comando F3, o processamento* volta para o programa SY-REPID => Nome do programa em execução. l_repid = sy-repid.
Definição do ALV:
Esta é a função principal do ALV que é executada após ter definido Layout, colunas, etc...
* display ALV grid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_background_id = ' ' i_callback_program = l_repid i_callback_top_of_page = 'ALV_TOP_OF_LIST' i_callback_user_command = 'ALV_USER_COMMAND'* QND. TEM OUTRO STATUS A SER GERADO... i_callback_pf_status_set = 'SET_PF_STATUS' is_layout = s_alv_layout i_save = 'A' it_fieldcat = t_alv_fieldcat it_events = t_alv_events it_sort = t_sort_alv TABLES
t_outtab = t_final 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.
18
Treinamento
Criação de FORMS:
Após ter executado a função, mostrará o relatório assim como na fig. 01.Existem alguns forms que serão utilizados. Basta apenas defini-los dentro do seu programa que a função ALV o encontra mas tem que definir utilizando a mesma estrutura logo em baixo senão vai ocorrer Dumping por diferença de campos.
FORM USER_COMMAND:
*---------------------------------------------------------------------** FORM USER_COMMAND **---------------------------------------------------------------------*form user_command using f_ucomm like sy-ucomm i_selfield type slis_selfield.
Utiliza-se este form para chamar a transação do link, caso o usuário clique duas vezes em cima do campo, ele chamara uma transação que você definiu.Este campo i_selfield-tabindex possui o numero da linha que o usuário clicou, assim pode-se dar um read table index i_selfied-tabindex na nossa tabela interna para pegar todos os dados da linha da nossa tabela interna. Ou pegar o dado do campo value da tabela i_selfield que seria o registro corrente.No exemplo, mostra-se a Síntese do Documento chamando-se a transação FB03.
CASE i_ucomm.
WHEN c_display. CASE i_selfield-fieldname. WHEN 'BELNR'.*Para conseguir o ID do campo é só realizar o seguinte:* 1) SE11 (nome da tabela, no caso BSEG)* 2) Clique duplo no tipo de campo desejado (no caso BELNR)* 3) Encontra-se o ID na caixa CARACTERÍSTICAS (ID parâmetro) READ TABLE t_final INDEX i_selfield-tabindex. IF sy-subrc = 0.*Neste ponto, se ao realizar um Clique duplo no campo BELNR, tem-se* duas(2) opções:* 1) Se a transação FB03 executasse com um parâmetro apenas:* SET PARAMETER ID 'BLN' FIELD i_selfield-value.* 2) Se a transação FB03 executasse com dois parâmetro (Exemplo): SET PARAMETER ID 'BLN' FIELD t_final-belnr. SET PARAMETER ID 'BUK' FIELD t_final-bukrs. CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN. ENDIF. ENDCASE.
Defini-se também, o tratamento de algum botão no PF-STATUS:. . . WHEN '&CLIFOR'. EXPORT t_kna1 TO MEMORY ID 'ZTES1_CLI'. EXPORT t_lfa1 TO MEMORY ID 'ZTES1_FOR'.
CALL TRANSACTION 'ZTES5'.
WHEN OTHERS.
19
Treinamento ENDCASE.
20
Treinamento
FORM TOP_OF_PAGE:
*---------------------------------------------------------------------** FORM TOP_OF_PAGE **---------------------------------------------------------------------**---------------------------------------------------------------------*FORM top_of_page.
* Serve para imprimir o cabeçalho do ALV.Utiliza-se a função REUSE_ALV_COMMENTARY_WRITE para imprimir os dadosdentro do ALV. Para isso, temos que preencher a tabela de cabeçalho definindo o tipo SLIS_LISTHEADER, que já foi realizado no PERFORM ALV_BUILD_HEADER. Neste ponto define-se o LOGO também.
* DEFINIÇÀO DO CABEÇALHO PERFORM: alv_build_header,
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = t_alv_listheader i_logo = 'ENJOYSAP_LOGO'. " ID da figura
* Para criar um logotipo, deve-se entrar na transação 0FPM002 e preencher: - Classe = PICTURES - Objeto = OT - Item = Nome do ID da figura
*Serve para imprimir o numero da pagina...usado no LIST SKIP TO LINE 4. WRITE: AT 70 'Página:', sy-pagno.
FORM XEND_OF_LIST:Este form é executado no fim, e somente para LIST
*&--------------------------------------------------------------------*& Form XEND_OF_LIST.*&--------------------------------------------------------------------FORM xend_of_list.
IF wg_tela = 'X'. SKIP 3. WRITE: /10 '_________________________________________'. WRITE: /28 'VISTO'. ENDIF.
ENDFORM.
21
Treinamento
Opções Gerais do ALV:
Ícones:
Este exemplo explica como criar um ícone dentro do ALV.* Inserir o include ICON. Ele chama o type-pools icon onde fica todos os tipos de ícones que deseja-se colocar.
* Tab. p/ Impressão em ALV principalDATA: BEGIN OF t_final OCCURS 0, bukrs LIKE bseg-bukrs, belnr LIKE bseg-belnr, gjahr LIKE bseg-gjahr, augdt LIKE bseg-augdt, gsber LIKE bseg-gsber, dmbtr LIKE bseg-dmbtr, wrbtr LIKE bseg-wrbtr, pswsl LIKE bseg-pswsl, sgtxt LIKE bseg-sgtxt, lifnr LIKE bseg-lifnr, kunnr LIKE bseg-kunnr,
ICON(30), END OF t_final,
INCLUDE <ICON>.
Para que o campo ICON exista na tab. de impressão, segue exemplo:
* SELECIONA DADOS PARA IMPRESSÃO PRINCIPAL SELECT bukrs belnr gjahr augdt gsber dmbtr wrbtr pswsl sgtxt lifnr kunnr FROM bseg INTO TABLE t_final WHERE belnr IN s_belnr.
LOOP AT T_FINAL.
T_FINAL-ICON = ICON_POSITIVE. MODIFY T_FINAL INDEX SY-TABIX. ENDLOOP.
*O próximo passo, seria definir este campo ICON como ícone.:
*ÍCONE CLEAR l_fieldcat. l_count = l_count + 1. l_fieldcat-col_pos = l_count. l_fieldcat-fieldname = 'ICON'. l_fieldcat-ref_tabname = 'T_FINAL'. l_fieldcat-outputlen = '4'. l_fieldcat-datatype = 'CHAR'. APPEND l_fieldcat TO et_fieldcat.
22
Treinamento
Fig. 06
23
Ícone
Treinamento
Alterando cor de linha:
Definir também o Type Pools kkblo
*--- Type-pools --------------------------------------------------------TYPE-POOLS: kkblo.
QUANDO CRIAR A TABELA, INSERIR NA TABELA, OUTRO CAMPO “COLINFO”
DATA: BEGIN OF t_final OCCURS 0.. . . DATA: colinfo TYPE kkblo_t_specialcol, END OF t_final.
No LAYOUT, inserir também a seguinte linha:
FORM alv_set_layout CHANGING es_alv_layout TYPE slis_layout_alv.
CLEAR: es_alv_layout. es_alv_layout-zebra = 'X'. es_alv_layout-f2code = c_display. es_alv_layout-colwidth_optimize = 'X'.
es_alv_layout-coltab_fieldname = 'COLINFO'.
Fig. 07
24
Nova COR de linha
TreinamentoAlterando o PF-STATUS de um ALV:
Copia-se o PF-STATUS STANDARD ou STANDARD_FULLSCREEN do grupo de funções KKBL para o PF-STATUS a ser utilizado no programa. Daí em diante, altera-se de acordo com a necessidade ...
Fig. 08
25
Treinamento
ALV Múltiplo:
Há a possibilidade de ter uma tela com vários ALV’s. Abaixo mostra-se um exemplo com 2 (dois) ALV’s numa mesma tela.
O processo para tal execução é um pouco diferente do ALV estudado acima:
Fig. 09
26
ALV com dados de Fornecedores
ALV com dados de Clientes
Treinamento
Lógica de ALV Múltiplo:
Chamada do ALV Múltiplo dentro do ALV Simples:
FORM alv_user_command USING i_ucomm LIKE sy-ucomm i_selfield TYPE slis_selfield.
i_selfield-before_action = 'X'.
CASE i_ucomm.
WHEN c_display.. . . WHEN '&CLIFOR'.* Neste ponto exportasse o conteúdo das tab. int. para serem* utilizadas no programa de ALV Múltiplo... EXPORT t_kna1 TO MEMORY ID 'ZTES1_CLI'. EXPORT t_lfa1 TO MEMORY ID 'ZTES1_FOR'.
CALL TRANSACTION 'ZTES5'.
WHEN OTHERS. ENDCASE.
ENDFORM. " ALV_USER_COMMAND
27
Treinamento
Construção do ALV MúltiploModule-Pool
Criar o programa ZTES5, o qual conterá 2 (dois) CONTAINER’s. Cada CONTAINER conterá a exibição de um ALV.
Fig. 10
28
Treinamento
Container:
O CONTAINER é nada mais do que o ‘CUSTOM CONTROL’.
Fig. 11
29
Treinamento
Codificação / Explicação:
PROGRAM test.
TYPES:* Tab. p/ Impressão em ALV de Clientes BEGIN OF type_kna1, kunnr LIKE kna1-kunnr, land1 LIKE kna1-land1, name1 LIKE kna1-name1, ort01 LIKE kna1-ort01, END OF type_kna1,
* Tab. p/ Impressão em ALV de Fornecedores BEGIN OF type_lfa1, lifnr LIKE lfa1-lifnr, land1 LIKE lfa1-land1, name1 LIKE lfa1-name1, ort01 LIKE lfa1-ort01, END OF type_lfa1.
DATA:* Tabelas internas t_kna1 TYPE type_kna1 OCCURS 0 WITH HEADER LINE, t_lfa1 TYPE type_lfa1 OCCURS 0 WITH HEADER LINE.
DATA: ok_code LIKE sy-ucomm,* Declaração de GT_KNA1 e GT_LFA1 para serem exibidas nos * CONTAINER’s através da chamada do Método: CALL METHOD grid1 gt_kna1 TYPE TABLE OF type_kna1, gt_lfa1 TYPE TABLE OF type_lfa1,
* Criar dois CONTAINER's com os respectivos nomes abaixo:* Os valores, são os mesmos nomes dados ao CONTAINER’s na tela 0100 g_container_kna1 TYPE scrfname VALUE 'CONTAINER_KNA1', g_container_lfa1 TYPE scrfname VALUE 'CONTAINER_LFA1',* grid1 TYPE REF TO cl_gui_alv_grid, g_custom_container_kna1 TYPE REF TO cl_gui_custom_container, g_custom_container_lfa1 TYPE REF TO cl_gui_custom_container.
*---------------------------------------------------------------------** MAIN **---------------------------------------------------------------------*
CALL SCREEN 100.
*---------------------------------------------------------------------** MODULE PBO OUTPUT **---------------------------------------------------------------------*MODULE pbo OUTPUT. SET PF-STATUS 'MAIN100'.
* Importa tabelas exportadas no prog. ZTES1 (ALV) para serem exibidos* nos CONTAINER’s... IMPORT t_kna1 FROM MEMORY ID 'ZTES1_CLI'. IMPORT t_lfa1 FROM MEMORY ID 'ZTES1_FOR'.
* Transporta os valores das tab. int’s. para dentro das estruturas que serão* utilizadas nos métodos que exportarão os valores para os CONTAINER’s INSERT LINES OF t_kna1 INTO TABLE gt_kna1.
30
Treinamento INSERT LINES OF t_lfa1 INTO TABLE gt_lfa1.
* Se 1o CONTAINER for vazio IF g_custom_container_kna1 IS INITIAL.* Cria o objeto exportando o nome do CONTAINER CREATE OBJECT g_custom_container_kna1 EXPORTING container_name = g_container_kna1.* Cria o GRID com o nome do objeto CONTAINER gerado CREATE OBJECT grid1 EXPORTING i_parent = g_custom_container_kna1.* Gera o GRID exportando a estrutura ‘ZKNA1’ com os dados* a serem exibidos na tab. ‘GT_KNA1’ CALL METHOD grid1->set_table_for_first_display* EXPORTING i_structure_name = 'KNA1'* Criar uma ESTRUTURA(ZKNA1) com os campos da tabl GT_KNA1 EXPORTING i_structure_name = 'ZKNA1' CHANGING it_outtab = gt_kna1. ENDIF.
IF g_custom_container_lfa1 IS INITIAL. CREATE OBJECT g_custom_container_kna1 EXPORTING container_name = g_container_lfa1. CREATE OBJECT grid1 EXPORTING i_parent = g_custom_container_kna1. CALL METHOD grid1->set_table_for_first_display* EXPORTING i_structure_name = 'LFA1'* Cria uma ESTRUTURA(ZLFA1) com os campos da tabl GT_LFA1 EXPORTING i_structure_name = 'ZLFA1' CHANGING it_outtab = gt_lfa1. ENDIF.ENDMODULE.*---------------------------------------------------------------------** MODULE PAI INPUT **---------------------------------------------------------------------*MODULE pai INPUT.* to react on oi_custom_events: CALL METHOD cl_gui_cfw=>dispatch. CASE ok_code. WHEN 'EXIT'. PERFORM exit_program. WHEN OTHERS.* do nothing ENDCASE. CLEAR ok_code.ENDMODULE.*---------------------------------------------------------------------** FORM EXIT_PROGRAM **---------------------------------------------------------------------*FORM exit_program.* CALL METHOD G_CUSTOM_CONTAINER->FREE.* CALL METHOD CL_GUI_CFW=>FLUSH. LEAVE PROGRAM.ENDFORM.
31
Treinamento
Estruturas ZKNA1 / ZLFA1:
Fig. 12
Fig. 13
32
Treinamento
PF-STATUS:
Fig. 14
33
Top Related