Você está na página 1de 130

GUIA DE PROGRAMAÇÃO

Volume

Volume

Desenvolvimento de aplicações ABAP

Guia Básico de Programação ALV

( ABAP List Viwer )

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

DESENVOLVIMENTO DE APLICAÇÕES ABAP

Guia Básico de Programação ALV

Flavio Ricardo de Almeida www.almeidafr.hpg.ig.com.br almeidafr@bigfoot.com

GUIA

BÁSICO

Índice

DE

PROGRAMAÇÃO

ALV

Capítulo 1

Introdução

3

Capítulo 2

Meu Primeiro ALV

4

Capítulo 3

Montando a estrutura da lista

8

Capítulo 4

Ordenando a lista

12

Capítulo 5

Criando grupos de campos

15

Capítulo 6

Chamando uma variante de exibição

21

Capítulo 7

Parâmetros de Impressão

25

Capítulo 8

Variações de Layout

27

Capítulo 9

Criando Evntos

31

Capítulo 10

Barra de Status Personalizada

37

Capítulo 11

Trabalhando com checkbox

41

Capítulo 12

Mudando cores dos campos

43

Capítulo 13

Inserindo

Ícone

48

Considerações Gerais ( Copyright e Trademarks )

51

Apêndice A ( Listagem de Programas Exemplos )

52

GUIA

BÁSICO

DE

PROGRAMAÇÃO

Introdução

ALV

Capítulo

Capítulo

Apresentação da ferramenta ABAP LIST VIEWER conhecida simplesmente por ALV.

A ferramenta ALV ( ABAP LIST VIEWER ) permite criar listas de uma maneira fácil e prática. Consiste basicamente em utilizar funções genéricas pertencentes basicamente a classe de desenvolvimento SLIS. Para nossos

estudos será utilizado basicamente o grupo de funções, o SALV, para o formato de lista simples. Este mesmo grupo também contempla as listas dos tipos hierárquica e popup, e o grupo SLVC_FULLSCREEN para a lista no formato de GRID CONTROL.

Existe a opção de utilizar objetos para a construção das listas mas não serão abordadas neste manual, para isto consulte a ajuda do sistema no seguinte tópico: SAP Library Basis Components Basis Service / Communications Interfaces (BC-SRV) BC - ALV Grid Control.

Nos próximos capítulos vamos apresentar a ferramenta de maneira prática com exemplos para evitar a leitura pesada regularmente utilizada em manuais, mas para isto será exigido do leitor prévio conhecimento da linguagem de programação ABAP.

As listas dos tipos hierárquica, popup e grid não serão tratadas neste volume, ficando seu estudo para o volume 2 desta obra.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Meu primeiro ALV

Criar uma lista utilizando os recursos do ALV.

N este capítulo vamos criar uma lista bastante simples, porém muito útil e versátil para apresentação de informações.

O layout da lista será baseado em uma estrutura definida no dicionário de dados do ABAP. No próximo capítulo mostraremos que é possível determinar os campos da lista sem utilizar uma estrutura do dicionário, utilizando outros recursos do ALV.

No R/3, através da transação SE38, ou SE80 àqueles que preferem uma visualização dos processos separadamente, vamos criar nosso primeiro programa através da primeira transação mencionada. Iremos chamá-lo de ZFRA0023_2 e implementaremos novas funcionalidades de acordo com o assunto tratado em cada capítulo.

1 – Declarar a tabela interna que irá conter os dados a serem listados, que terá a mesma estrutura da tabela VBAK ( Cabeçalho da ordem de venda ), e algumas outras variáveis que iremos precisar futuramente:

*$*$ Tipos ------------------------------------------------------------- TYPES: BEGIN OF we_saida. INCLUDE STRUCTURE vbak.

TYPES: END

OF we_saida.

*$*$ Tabelas Internas -------------------------------------------------- DATA: wt_saida TYPE STANDARD TABLE OF we_saida WITH HEADER LINE.

*$*$ Variáveis --------------------------------------------------------- * Nome do programa DATA: wv_repid LIKE sy-repid.

2 – Criar uma tela de parâmetros simples apenas para melhorar a performance da busca de informações:

*$*$ Tela de Seleção --------------------------------------------------- SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-902. SELECT-OPTIONS: s_vbeln FOR wt_saida-vbeln.

SELECTION-SCREEN END

OF BLOCK b1.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

3 – Criar o evento INITIALIZATION para inicializar algumas variáveis:

*$*$ Inicialização ----------------------------------------------------- INITIALIZATION.

wv_repid

= sy-repid.

4 – Criar uma sub-rotina para obter as informações da base de dados, aqui a chamaremos de Z_OBTER_DADOS. Criaremos também uma outra sub-rotina chamada Z_SAPGUI_PROGRESS_INDICATOR para interagir com a interface do R/3 informando ao usuário os processos que o programa está executando:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Obter informações para lista

*----------------------------------------------------------------------*

FORM z_buscar_dados.

Form Z_BUSCAR_DADOS

PERFORM z_sapgui_progress_indicator USING 'Selecionando dados. Aguarde

'.

SELECT * INTO TABLE wt_saida FROM vbak WHERE vbeln IN s_vbeln.

ENDFORM.

" Z_BUSCAR_DADOS

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Interagir com o front-end - Enviar mensagens

*----------------------------------------------------------------------*

--> PV_TEXT - Mensagem *----------------------------------------------------------------------* FORM z_sapgui_progress_indicator using value(pv_text).

*

Form Z_SAPGUI_PROGRESS_INDICATOR

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING

*

PERCENTAGE = 0

 

TEXT

= pv_text.

ENDFORM.

" Z_SAPGUI_PROGRESS_INDICATOR

5 – Até aqui os processos são basicamente o que qualquer outro programa de lista

precisaria, agora vamos utilizar efetivamente recursos do ALV. Para isto vamos criar

uma sub-rotina para impressão da lista que se chamará Z_LIST_DISPLAY:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

i_callback_program = wv_repid

i_structure_name

= 'VBAK'

i_save

= 'A'

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

others

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid type sy-msgty number sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

Veja que passamos como parâmteros:

i_callback_program = wv_repid Nome do programa para o qual a função deve retornar o controle após a execução;

i_structure_name = ‘VBAK’ Nome da ma para o qual a função deve ser referenciada no dicionário;

i_save = ‘A’ Permitir salvar variante de exibição;

t_outtab = wt_saida Tabela com os dados a serem impressos;

6 – Resultado

Tabela com os dados a serem impressos; 6 – Resultado FIGURA 2.1 Lista ALV simples utilizando

FIGURA 2.1 Lista ALV simples utilizando a estrutura da tabela VBAK

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Agora com a lista pronta é possível mudar o layout do mesmo ocultando colunas,

sumarizando colunas de valor, ordenando outras, etc

visualizações futuras. Para isto utilize a barra de status que contem os botões para acionar estas funcionalidades.

e gravar os layouts para

para acionar estas funcionalidades. e gravar os layouts para FIGURA 2.2 Barra de status com funcionalidades

FIGURA 2.2 Barra de status com funcionalidades para lista.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Montando a estrutura da lista

Montar a estrutura de campos da lista sem utilizar estrutura do dicionário de dados do R/3.

N

o capítulo anterior aprendemos a criar uma lista referenciando uma

estrutura do banco de dados. Agora vamos gerar uma lista onde os campos

da lista serão determinados no próprio programa.

Vamos copiar o programa ZFRA0023_2 e chamá-lo de ZFRA0023_3 faremos algumas mudanças a seguir descritas.

1 – Declarar o tipo de pool SLIS que contém as definições necessárias para interagir com as funções ALV:

*$*$ Type pools -------------------------------------------------------- TYPE-POOLS: slis.

2 – Redefinir o tipo WE_SAIDA, como descrito abaixo;

TYPES: BEGIN OF we_saida, vbeln LIKE vbak-vbeln, erdat LIKE vbak-erdat, ernam LIKE vbak-ernam, audat LIKE vbak-audat, auart LIKE vbak-auart, netwr LIKE vbak-netwr, vkorg LIKE vbak-vkorg, vtweg LIKE vbak-vtweg, spart LIKE vbak-spart, vkgrp LIKE vbak-vkgrp, vkbur LIKE vbak-vkbur,

" Nro da ordem de venda " Data de criação " Criado por " Data da ordem " Tipo de ordem " Valor líq. da ordem " Org. de vendas " Canal de distribuição " Setor de atividade " Grupo de vendedores " Escritório de vendas

END

OF we_saida.

3 – Declarar a tabela que conterá as configurações dos campos da lista;

DATA: wt_fieldcat TYPE slis_t_fieldcat_alv.

4 – Modificar a busca das informações na rotina Z_OBTER_DADOS;

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

SELECT vbeln erdat ernam audat auart netwr vkorg vtweg spart vkgrp vkbur INTO TABLE wt_saida FROM vbak WHERE vbeln IN s_vbeln.

5 – Agora vamos criar a sub-rotina de configuração de campos da estrutura de lista a qual chamaremos de Z_FIELDCAT_INIT;

*---------------------------------------------------------------------*

* FORM Z_FIELDCAT_INIT

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------* FORM z_fieldcat_init USING pt_fieldcat TYPE slis_t_fieldcat_alv.

* Estruturas DATA: lf_fieldcat TYPE slis_fieldcat_alv.

*

* Inicializar estrutura das informações da lista

* --> PT_FIELDCAT - Tab. com estrutura de linha

* Limpar tabela CLEAR pt_fieldcat[].

* Cód. doc. venda CLEAR lf_fieldcat. lf_fieldcat-fieldname lf_fieldcat-ref_tabname

* Cód. doc. venda CLEAR lf_fieldcat. lf_fieldcat-fieldname lf_fieldcat-ref_tabname

= 'VBELN'.

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

APPEND lf_fieldcat TO pt_fieldcat.

" Nome do Campo " Tab. de Referência " Gravar na tab. config.

" Nome do Campo " Tab. de Referência " Gravar na tab. config.
" Nome do Campo " Tab. de Referência " Gravar na tab. config.

* Data de Criação CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'ERDAT'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Criado por CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'ERNAM'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Tipo de Ordem CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'AUART'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Valor líq. da ordem

CLEAR lf_fieldcat. lf_fieldcat-fieldname

= 'NETWR'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Organização de vendas CLEAR lf_fieldcat. lf_fieldcat-fieldname lf_fieldcat-ref_tabname

* Organização de vendas CLEAR lf_fieldcat. lf_fieldcat-fieldname lf_fieldcat-ref_tabname

= 'VKORG'.

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Canal de distribuição CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'VTWEG'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Setor de atividade CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'SPART'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Grupo de Vendedores CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'VKGRP'.

lf_fieldcat-ref_tabname

= 'VBAK'.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

APPEND lf_fieldcat TO pt_fieldcat.

* Escritório de Vendas CLEAR lf_fieldcat.

lf_fieldcat-fieldname

lf_fieldcat-ref_tabname

APPEND lf_fieldcat TO pt_fieldcat.

= 'VKBUR'.

= 'VBAK'.

ENDFORM.

" FORM Z_FIELDCAT_INIT

Veja que este tipo de construção de exige mais esforços que quando referenciamos uma estrutura do dicionário, devido a isto muitos desenvolvedores preferem criar suas próprias estruturas no dicionário e referenciar as mesmas.

Estamos utilizando os atributos básicos da estrutura SLIS_T_FIELDCAT_ALV, referenciada aqui pela tabela wt_fieldcat. Fica a cargo do leitor estudar os outros

tais como

indicar que o campo tem a característica “hotspot”, definir tamanho, mudar desto de

cabeçalho, etc

atributos desta estrutura, pois os mesmo tratam formatação, layout, etc

6 – Inserir chamada a subrotina Z_FIELDCAT_INIT;

*$*$ Programa Principal ------------------------------------------------ START-OF-SELECTION. PERFORM z_buscar_dados.

* Indicar campos para exibição na lista PERFORM z_fieldcat_init USING wt_fieldcat[].

END-OF-SELECTION.

*

Construção da lista propriamente dita ( Exibição das informações ) PERFORM z_list_display.

7

– Modificar o processo de listar informações, Z_LIST_DISPLAY;

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

* i_structure_name

= 'VBAK'

it_fieldcat

= wt_fieldcat

i_save

= 'A'

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

GUIA

BÁSICO

ENDFORM.

DE

PROGRAMAÇÃO

ALV

" Z_LIST_DISPLAY

Veja que comentamos a linha de parâmetro “ i_structure_name ” e inserimos o parâmetro it_fieldcat que recebe a tabela wt_fieldcat.

it_fieldcat = wt_fieldcat Nome da tabela interna com as configurações dos campos da lista;

8 – Vejamos a lista resultante do programa;

da lista; 8 – Vejamos a lista resultante do programa; FIGURA 3.1 Lista com campos determinados

FIGURA 3.1 Lista com campos determinados na tabela wt_fieldcat.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Ordenando a lista

Utilizando recursos para ordenação da lista antes da apresentação.

N o capítulo anterior aprendemos uma outra forma de criar uma lista simples, agora vamos a cada capítulo implementar novos recursos disponíveis no ALV. Um deles é a ordenação. Apesar da possibilidade de ordenar a tabela

interna antes da apresentação da lista, ou mesmo a lista depois da execução do programa através das variantes de exibição, as vezes é necessário que a lista já apresente uma ordenação padrão logo que a mesma apareça na tela. Para isto vamos implementar uma rotina para fazer isto através do ALV.

Mais adiante veremos que é possível chamar uma variante de exibição na primeira tela, dessa forma economizando precioso tempo já que muitas rotinas poderão ser descartadas, pois todos os atributos da lista tais como ordenações de colunas e linhas, sumarizações, etc, estarão definidos na variante. Mas não se preocupe, pois teremos um capítulo específico para tratar este assunto.

Vamos copiar o programa ZFRA0023_3 e chamá-lo de ZFRA0023_4 e implementaremos as funcionalidades, caso você tenha pulado capítulo 1, você pode copiar o modelo que encontra-se no final do manual.

1 – Declarar a tabela interna que conterá as informações para ordenação;

* Tab. com informações sobre a ordenação da lista

DATA: wt_sort

TYPE slis_t_sortinfo_alv.

2 – Criar uma rotina para definir a ordenação, chamaremos a mesma de Z_ORDENAR_LISTA, e nela pediremos para ordenar pelo campo de usuário de criação ( ERDAT );

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Ordenação da lista

*----------------------------------------------------------------------*

* --> PT_SORT[] - Tabela com informações de ordenação dos campos

*----------------------------------------------------------------------*

FORM z_ordenar_lista USING pt_sort TYPE slis_t_sortinfo_alv.

* Estrutura para gravar na lista DATA: lf_sort TYPE slis_sortinfo_alv.

Form Z_ORDENAR_LISTA

GUIA

BÁSICO

DE

CLEAR lf_sort.

PROGRAMAÇÃO

ALV

*

Montar estrutura lf_sort-spos

= 1.

" Sequência de ordenação

lf_sort-fieldname = 'ERNAM'.

" Nome do campo

lf_sort-tabname

= 'WT_SAIDA'.

" Nome da tabela de lista

lf_sort-up

= 'X'.

" Ordenação Crescente

lf_sort-expa

= 'X'.

" Expandir lista

APPEND lf_sort TO wt_sort.

** Outras opções possíveis de utilização

*

lf_sort-down

= 'X'.

" Ordenação decrescente

*

lf_sort-group

= '*'.

" Mudança de controle: quebra de

*

" página, inserir sublinha

*

lf_sort-subtot

= 'X'.

" Subtotal

*

lf_sort-comp

= 'X'.

" Comprimir lista mostrando

*

" apenas os subtotais

ENDFORM.

 

" Z_ORDENAR_LISTA

Veja que existem outras opções para ordenação, depois você pode mudar o código para testá-las.

4

Z_LIST_DISPLAY;

*$*$ Programa Principal ------------------------------------------------ START-OF-SELECTION. PERFORM z_buscar_dados.

* Indicar campos para exibição na lista PERFORM z_fieldcat_init USING wt_fieldcat[].

* Ordenar lista PERFORM z_ordenar_lista USING wt_sort[].

Inserir

chamada

rotina

Z_ORDENAR_LISTA,

antes

da

rotina

a

de

END-OF-SELECTION.

* Construção da lista propriamente dita ( Exibição das informações ) PERFORM z_list_display.

5 – Agora vamos passar mais um parâmetros para a função REUSE que está na sub- rotina Z_LIST_DISPLAY:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* form z_list_display.

Form Z_LIST_DISPLAY

perform z_sapgui_progress_indicator using 'Estruturando a lista. Aguarde

'.

call function 'REUSE_ALV_LIST_DISPLAY' exporting i_callback_program = wv_repid

*

i_structure_name

= 'VBAK'

it_fieldcat

= wt_fieldcat

it_sort

= wt_sort

i_save

= 'A'

tables

t_outtab

= wt_saida

exceptions

program_error

= 1

GUIA

BÁSICO

DE

others

PROGRAMAÇÃO

= 2.

ALV

* Verificar processamento da função if sy-subrc ne 0. message id sy-msgid type sy-msgty number sy-msgno

with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

endif.

endform.

" Z_LIST_DISPLAY

Veja que passamos como novo parâmetro:

it_sort = wt_sort Nome da tabela interna com as configurações para ordenação;

5 – Resultado

com as configurações para ordenação; 5 – Resultado FIGURA 4.1 Lista ordenada pelo coluna ERNAM, usuário

FIGURA 4.1 Lista ordenada pelo coluna ERNAM, usuário de criação.

Veja que a lista foi apresentada ordenada pela coluna “Criado por”, de forma crescente.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Criando grupos de campos

Especificação de grupo de campos para variantes de exibição

O capítulo 1 mostrou que é possível montar a estrutura de campos da lista sem referenciar estruturas do dicionário. Um grupo de campos pode ser bastante útil para selecionar os mesmos para uma variante de exibição, pois facilita a pesquisa para a composição da lista de saída.

Aqui vamos criar apenas dois grupos para demonstração. Para isto vamos copiar o programa ZFRA0023_4 e chamá-lo de ZFRA0023_5

1 – Declarar a tabela interna que conterá as informações para formar os grupos de campos;

* Tab. de especificação de grupos

DATA: wt_sp_group TYPE slis_t_sp_group_alv.

2 – Criar uma rotina para definir os grupos de campos, chamaremos a mesma de Z_SP_GROUP_BUILD;

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------* form z_sp_group_build using pt_sp_group type slis_t_sp_group_alv.

* FORM Z_SP_GROUP_BUILD

* Definir tipos de grupos de campos

* --> PT_SP_GROUP - Estrutura do grupo de campos

* Variáveis data: lf_sp_group type slis_sp_group_alv.

* Atribuir valores

* Ordem de Venda clear lf_sp_group.

lf_sp_group-sp_group = 'A'.

lf_sp_group-text

append lf_sp_group to pt_sp_group.

= 'Ordem de Venda'(g01).

* Status da Ordem de Venda

clear lf_sp_group.

lf_sp_group-sp_group = 'V'.

lf_sp_group-text

append lf_sp_group to pt_sp_group.

= 'Valores'(g02).

GUIA

BÁSICO

endform.

DE

PROGRAMAÇÃO

ALV

" FORM Z_SP_GROUP_BUILD

4 – Inserir chamada à rotina Z_SP_GROUP_BUILD;

*$*$ Programa Principal ------------------------------------------------ START-OF-SELECTION. PERFORM z_buscar_dados.

* Indicar campos para exibição na lista PERFORM z_fieldcat_init USING wt_fieldcat[].

* Ordenar lista PERFORM z_ordenar_lista USING wt_sort[].

* Grupos de campos perform z_sp_group_build using wt_sp_group[].

END-OF-SELECTION.

* Construção da lista propriamente dita ( Exibição das informações ) PERFORM z_list_display.

5 – Especificar na rotina Z_FIELDCAT_INIT, quais campos vão pertencer aos grupos criados;

FORM z_fieldcat_init USING pt_fieldcat TYPE slis_t_fieldcat_alv.

* Estruturas DATA: lf_fieldcat TYPE slis_fieldcat_alv.

* Limpar tabela CLEAR pt_fieldcat[].

* Cód. doc. venda CLEAR lf_fieldcat. lf_fieldcat-fieldname

= 'VBELN'.

" Nome do Campo

lf_fieldcat-ref_tabname

= 'VBAK'.

" Tab. de Referência

lf_fieldcat-sp_group

= 'A'.

" Grupo de Ordem Vendas

APPEND lf_fieldcat TO pt_fieldcat.

" Gravar na tab. config.

* Data de Criação CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'ERDAT'.

lf_fieldcat-ref_tabname

= 'VBAK'.

lf_fieldcat-sp_group

= 'A'.

" Grupo de Ordem Vendas

APPEND lf_fieldcat TO pt_fieldcat.

* Criado por CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'ERNAM'.

lf_fieldcat-ref_tabname

= 'VBAK'.

lf_fieldcat-sp_group

= 'A'.

" Grupo de Ordem Vendas

APPEND lf_fieldcat TO pt_fieldcat.

* Tipo de Ordem CLEAR lf_fieldcat.

lf_fieldcat-fieldname

= 'AUART'.

lf_fieldcat-ref_tabname

= 'VBAK'.

APPEND lf_fieldcat TO pt_fieldcat.

* Valor líq. da ordem CLEAR lf_fieldcat. lf_fieldcat-fieldname

= 'NETWR'.

lf_fieldcat-ref_tabname

= 'VBAK'.

lf_fieldcat-sp_group

= 'V'.

" Grupo de Valores

APPEND lf_fieldcat TO pt_fieldcat.

ENDFORM.

" FORM Z_FIELDCAT_INIT

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

6 – Agora vamos passar mais um parâmetros para a função REUSE rotina Z_LIST_DISPLAY:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

que está na

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

*

i_structure_name

= 'VBAK'

it_fieldcat

= wt_fieldcat

it_sort

= wt_sort

it_special_groups = wt_sp_group

i_save

= 'A'

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

Veja que passamos como parâmteros:

it_special_groups = wt_sp_group Nome da tabela interna com as configurações para especificação de grupos;

7 – Podemos visualizar os efeitos deste processo quando acionamos a criação de variante de exibição;

Tecle o botão de “ Exibição de Variante Atual ” abaixo aparecerá;

de “ Exibição de Variante Atual ” abaixo aparecerá; ou “ CRTL + F8 ”, e

ou “ CRTL + F8 ”, e a tela

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE PROGRAMAÇÃO ALV FIGURA 5.1 Tela para montar variante de exibição. Agora vamos ocultar

FIGURA 5.1 Tela para montar variante de exibição.

Agora vamos ocultar todos os campos para que possamos identificar a especificação dos campos, para isto tecle no ícone .

a especificação dos campos, para isto tecle no ícone . F I G U R A
a especificação dos campos, para isto tecle no ícone . F I G U R A

FIGURA 5.2 Tela com campos ocultados.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Veja que todos os campos passaram para o lado direito ( Campos ocultados ).

Agora tecle na “Combo Box” onde esta inscrito “Todos os Campos”, e veremos os grupos que criamos;

“Todos os Campos”, e veremos os grupos que criamos; FIGURA 5.3 Tela mostrando as opções de

FIGURA 5.3 Tela mostrando as opções de grupos especificadores existentes.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Vamos escolher o grupo “Valores” e veremos que apenas o campo especificado para este grupo aparecerá.

que apenas o campo especificado para este grupo aparecerá. FIGURA 5.4 Tela apenas com campos do

FIGURA 5.4 Tela apenas com campos do Grupo Valores

Isto é interessante quanto temos uma lista grande de campos disponíveis para composição da lista, para que possamos identificar melhor cada um deles.

Neste exemplo isto seria irrelevante já que temos poucos campos e todos podem ser visualizados de maneira simples já na primeira tela.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Chamando uma variante de exibição

Como chamar uma variante de exibição já na primeira tela, tela de seleção.

A qui vamos aprender como chamar uma variante de exibição já na primeira tela, desde que ela já tenha sido criada previamente, ou seja, na tela de seleção, sem a necessidade de executar o programa para depois escolher a mesma melhorando assim a performance pois a seleção pode conter vários

registros, e o mais importante, agilizando o processo para o usuário.

Vamos copiar o programa ZFRA0023_5 e chamá-lo de ZFRA0023_6.

1 – Declarar algumas estruturas para trabalhar com as variantes de exibição;

*$*$--- Estruturas ----------------------------------------------------- data: wf_x_variant like disvariant.

data: wf_variant

like disvariant.

2 – Criar na tela de parâmetros a entrada pela escolha da variante de exibição:

*$*$ Tela de Seleção ---------------------------------------------------

* Variante

selection-screen begin of block b2 with frame title text-s02. parameters: p_vari like disvariant-variant.

selection-screen end

of block b2.

3 – No evento de inicialização incluiremos instruções para identificar para qual programa deve-se procurar variantes de exibição já gravadas:

* Atribuições para variante clear wf_variant. wf_variant-report = wv_repid.

4 – Criar de ajuda para o campo de variante, para que seja possível procurar a mesma através do recurso de matchcode ( F4 ), declarar o evento “AT SELECTION-

SCREEN ON VALUE REQUEST

e depois criaremos uma rotina a qual

chamaremos de Z_F4_FOR_VARIANT:

”,

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

*$*$ Ajudas de tela ----------------------------------------------------

* Processo de ajuda para variante

at selection-screen on value-request for p_vari. perform z_f4_for_variant.

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Processo de ajuda pra variante

*----------------------------------------------------------------------* form z_f4_for_variant.

* Variável local

Form Z_F4_FOR_VARIANT

data: lv_exit.

* Encontrar variante

call function 'REUSE_ALV_VARIANT_F4' exporting

is_variant

= wf_variant

i_save

= 'A'

* it_default_fieldcat = importing e_exit es_variant

exceptions not_found = 2.

* Verificar processamento da função if sy-subrc = 2. message id sy-msgid type 'S'

= lv_exit

= wf_x_variant

number sy-msgno

with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

else.

* Atribuir valor if lv_exit = space. p_vari = wf_x_variant-variant. endif. endif.

endform.

" Z_F4_FOR_VARIANT

6 – Criar o evento “AT SELECTION-SCREEN ON

do campo de variante, e depois criar a rotina Z_VALIDACAO_VARIANTE:

*$*$ Validações de tela ------------------------------------------------ at selection-screen on p_vari. perform z_validacao_variante.

para validação do conteúdo

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Realizar validação da variante de exibição

*----------------------------------------------------------------------* form z_validacao_variante.

* Variante if not p_vari is initial.

Form Z_VALIDACAO_VARIANTE

move: wf_variant to wf_x_variant,

p_vari

to wf_x_variant-variant.

* Verificar existencia call function 'REUSE_ALV_VARIANT_EXISTENCE'

exporting

i_save

= 'A'

changing cs_variant = wf_x_variant. wf_variant = wf_x_variant.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

else. clear: wf_variant. wf_variant-report = wv_repid. endif.

endform.

" Z_VALIDACAO_VARIANTE

7 – Neste caso, veremos o resultado, na tela de seleção:

7 – Neste caso, veremos o resultado, na tela de seleção: FIGURA 6.1 Tela de seleção

FIGURA 6.1 Tela de seleção com opção de escolher a variante de exibição antes da execução do programa

Caso ainda não tenha criado uma variante de exibição anteriormente, execute o programa ( F8 ), tecle selecione os campos e depois grave a variante através do

selecione os campos e depois grave a variante através do botão . Agora retorne a tela
selecione os campos e depois grave a variante através do botão . Agora retorne a tela

botão . Agora retorne a tela de seleção.

Com o cursor posicionado no campo de “Variante de Exibição” acionar a tecla “F4” e a ajuda será acionada.

Será aberta uma janela que conterá as variantes de exibição globais, e as específicas para o usuário. Veja a figura 6.2

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE PROGRAMAÇÃO ALV FIGURA 6.2 Janela POPUP com variantes de exibição. 8 – Agora

FIGURA 6.2 Janela POPUP com variantes de exibição.

8 – Agora vamos passar o parâmetro de variante para a função REUSE que está na rotina Z_LIST_DISPLAY:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

*

i_structure_name

= 'VBAK'

it_fieldcat

= wt_fieldcat

it_sort

= wt_sort

it_special_groups = wt_sp_group

i_save

= 'A'

is_variant

= wf_variant

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Parâmetros para impressão

Configurar alguns parâmetros de impressão da lista através de estruturas do ALV.

A s vezes queremos configurar um relatório de modo que o mesmo não tenha uma página de rosto para economizar papel, ou então necessitamos reservar linhas para impressão de um rodapé, etc

Neste capítulo veremos como é possível fazer estas configurações internamente no programa.

Vamos copiar o programa ZFRA0023_6 e chamá-lo de ZFRA0023_7 e implementaremos as funcionalidades, caso você tenha pulado os capítulos anteriores, você pode copiar o que está no final do manual.

1 – Declarar a estrutura que conterá os campos de configurações:

DATA: wf_print

TYPE slis_print_alv.

2 – Criar uma rotina que definirá os parâmetros a serem utilizados, o qual chamaremos de Z_PRINT_BUILD, que receberá como parâmetro a estrutura declarada no item 1;

* Parâmetros de impressão PERFORM z_print_build USING wf_print.

3 – Código para o form Z_PRINT_BUILD:

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

* FORM Z_PRINT_BUILD

*

*---------------------------------------------------------------------*

* Definir atributos de impressão da lista

*

*---------------------------------------------------------------------*

* --> PF_PRINT - Estrutura com atributos da impressão da lista

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

FORM z_print_build USING pf_print TYPE slis_print_alv.

*

*

PF_PRINT-PRINT

= 'X'.

" Imprimir no SPOOL

pf_print-no_print_selinfos = 'X'.

" Não listar info. sobre seleção

pf_print-no_coverpage

= 'X'.

" Não listar página de rostp

pf_print-no_print_listinfos = 'X'.

" Não listar info. sobre a lista

*

PF_PRINT-RESERVE_LINES

= 'X'.

" Reservar linhas

*

PF_PRINT-NO_NEW_PAGE

= 'X'.

" Sem novas páginas

*

PF_PRINT-NO_CHANGE_PRINT_PARAMS = 'X'. " Não alterar tamanho da linha

ENDFORM.

 

" Z_PRINT_BUILD

4 – Agora vamos passar mais um parâmetro para a função REUSE que está na rotina Z_LIST_DISPLAY:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

*

i_structure_name

= 'VBAK'

it_fieldcat

= wt_fieldcat

it_sort

= wt_sort

it_special_groups = wt_sp_group

is_print

= wf_print

i_save

= 'A'

is_variant

= wf_variant

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

Veja que passamos como parâmetros:

is_print = wf_print Nome da estrutura com as configurações de impressão;

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Variações de Layout

Incluindo características novas a lista.

V eremos neste capítulo que é possível mudar algumas características da linha da lista, tais como criar uma checkbox, permitir níveis de quebra diferentes nas totalizações, entre outros.

Faremos duas inclusões básicas e deixaremos ao leitor a função de pesquisar outras características a serem exploradas. Para tal veja a estrutura “SLIS_LAYOUT_ALV” do grupo de tipos “SLIS”.

Vamos copiar o programa ZFRA0023_7 e chamá-lo de ZFRA0023_8.

1 – Criar um campo novo na tabela de saída para que o mesmo seja um checkbox; que chamaremos de BOX;

*$*$ Tipos ------------------------------------------------------------- TYPES: BEGIN OF we_saida,

vbeln LIKE vbak-vbeln,

erdat LIKE vbak-erdat, ernam LIKE vbak-ernam, audat LIKE vbak-audat, auart LIKE vbak-auart, netwr LIKE vbak-netwr, vkorg LIKE vbak-vkorg, vtweg LIKE vbak-vtweg, spart LIKE vbak-spart, vkgrp LIKE vbak-vkgrp, vkbur LIKE vbak-vkbur,

,

box

END

OF we_saida.

" Nro da ordem de venda " Data de criação " Criado por " Data da ordem " Tipo de ordem " Valor líq. da ordem " Org. de vendas " Canal de distribuição " Setor de atividade " Grupo de vendedores " Escritório de vendas " Checkbox

2

– Declarar estrutura de layout;

DATA: wf_layout

TYPE slis_layout_alv.

3 – Criar uma rotina que definirá os parâmetros a serem utilizados, o qual chamaremos de Z_PRINT_BUILD, que receberá como parâmetro a estrutura declarada no item 1;

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

*

Layout da lista - Referente as definições PERFORM z_layout_build USING wf_layout.

4

– Código para o form Z_PRINT_BUILD:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Layout de saída

*----------------------------------------------------------------------*

* --> PF_LAYOUT - Estrutura para layout de saída da lista

*----------------------------------------------------------------------* FORM z_layout_build USING pf_layout TYPE slis_layout_alv.

Form Z_LAYOUT_BUILD

* Permitir mudança de níves de quebra para subtotais pf_layout-group_change_edit = 'X'.

* Check box na lista

pf_layout-box_fieldname

= 'BOX'.

pf_layout-box_tabname

= 'WT_SAIDA'.

ENDFORM.

" Z_LAYOUT_BUILD

5 – Agora vamos passar mais um parâmetro para a função REUSE que está na rotina Z_LIST_DISPLAY:

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

* i_structure_name

= 'VBAK'

it_fieldcat

= wt_fieldcat

it_sort

= wt_sort

it_special_groups = wt_sp_group

is_print

= wf_print

is_layout

= wf_layout

i_save

= 'A'

is_variant

= wf_variant

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Veja que passamos como parâmetros:

is_layout = wf_layout Nome da estrutura com as configurações layout;

6 – Tela do Relatório:

com as configurações layout; 6 – Tela do Relatório: FIGURA 8.1 Lista com checkbox. 7 –

FIGURA 8.1 Lista com checkbox.

7 – Totalize a coluna do valor líquido, e depois acione o botão de subtotal

do valor líquido, e depois acione o botão de subtotal . A janela a seguir será

.

A janela a seguir será exibida, mostrando as opções de ordenação para a totalização, porém o mais interessante é a coluna “GR’, onde é possível escolher os níveis de quebra de totais, posicione o cursor no mesmo e tecle a função F4 ( Fig. 8.2 )

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE PROGRAMAÇÃO ALV FIGURA 8.2 Tela com a opção de tipos de quebra diferentes

FIGURA 8.2 Tela com a opção de tipos de quebra diferentes para os níveis de totais

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo

Capítulo

Criando Eventos

Criando eventos para ações específicas para o relatório.

E xistem vários eventos que podemos acionar para executar os mais diversos processos no relatório. Neste capítulo vamos tratar os eventos principais, ou mais usados, para mostrar que é possível interferir no processamento da lista ALV.

Vamos copiar o programa ZFRA0023_8 e chamá-lo de ZFRA0023_9.

1

– Declarar a tabela de eventos;

*

Tab. de eventos

DATA: wt_events

TYPE slis_t_event.

2 – Criar uma rotina que definirá os eventos a serem utilizados, que chamaremos de Z_EVENTTAB_BUID;

*

Eventos que podem ser acionados na lista PERFORM z_eventtab_build USING wt_events[].

3

– Codificação para a rotina Z_EVENTTAB_BUILD:

Para atribuir nomes mais amigáveis as rotinas de eventos, ou tenha uma identificação melhor, é possível fazê-lo conforme mostrado na rotina abaixo:

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

* Definir eventos associados a lista

*---------------------------------------------------------------------*

* --> PT_EVENTS - Eventos associados a lista

*---------------------------------------------------------------------*

FORM z_eventtab_build USING pt_events TYPE slis_t_event.

* Variáveis DATA: lf_event TYPE slis_alv_event.

* FORM Z_EVENTTAB_BUILD

*

*

* Obter eventos permitidos para lista grid CALL FUNCTION 'REUSE_ALV_EVENTS_GET'

GUIA

BÁSICO

DE

PROGRAMAÇÃO

EXPORTING

i_list_type = 0 IMPORTING

et_events

= pt_events.

ALV

* Verificar se evento foi encontrado

* Verificar se evento foi encontrado LOOP AT pt_events INTO lf_event. CASE lf_event-name. WHEN slis_ev_user_command. MOVE 'Z_USER_COMMAND' TO lf_event-form. WHEN slis_ev_item_data_expand.

* move 'Z_ITEM_DATA_EXPAND' to lf_event-form. WHEN slis_ev_reprep_sel_modify.

* move 'Z_REPREP_SEL_MODIFY' to lf_event-form. WHEN slis_ev_caller_exit_at_start.

* MOVE 'Z_CALLER_EXIT' TO lf_event-form. WHEN slis_ev_top_of_page. MOVE 'Z_TOP_OF_PAGE' TO lf_event-form. WHEN slis_ev_top_of_coverpage.

* move 'Z_TOP_OF_COVERPAGE' to lf_event-form. WHEN slis_ev_end_of_coverpage.

* move 'Z_END_OF_COVERPAGE' to lf_event-form. WHEN slis_ev_foreign_top_of_page.

* move 'Z_FOREIGN_TOP_OF_PAGE' to lf_event-form. WHEN slis_ev_foreign_end_of_page.

* move 'Z_FOREIGN_END_OF_PAGE' to lf_event-form. WHEN slis_ev_pf_status_set.

* MOVE 'Z_PF_STATUS_SET' TO lf_event-form. WHEN slis_ev_list_modify.

* MOVE 'Z_LIST_MODIFY' TO lf_event-form. WHEN slis_ev_top_of_list. MOVE 'Z_TOP_OF_LIST' TO lf_event-form. WHEN slis_ev_end_of_page. MOVE 'Z_END_OF_PAGE' TO lf_event-form. WHEN slis_ev_end_of_list. MOVE 'Z_END_OF_LIST' TO lf_event-form. WHEN slis_ev_after_line_output.

* MOVE 'Z_AFTER_LINE_OUTPUT' TO lf_event-form. WHEN slis_ev_before_line_output.

* MOVE 'Z_BEFORE_LINE_OUTPUT' TO lf_event-form. WHEN slis_ev_subtotal_text.

* MOVE 'Z_SUBTOTAL_TEXT' TO lf_event-form. ENDCASE. MODIFY pt_events FROM lf_event. ENDLOOP.

*

ENDFORM.

" FORM Z_EVENTTAB_BUILD

Veja que no parâmetro “i_list_type” atribuímos o valor 0 (zero), que especifica os eventos para lista simples. Este parâmetro pode receber os seguintes valores:

0 = Lista Simples ( Função REUSE_ALV_LIST_DISPLAY )

1 = Lista hierárquica seqüencial ( REUSE_ALV_HIERSEQ_LIST_DISPLAY )

2 = Lista em blocos simples ( REUSE_ALV_BLOCK_LIST_APPEND )

3 = Lista em blocos hierárquica ( REUSE_ALV_BLOCK_LIST_HS_APPEND )

As demais serão vistas em outra oportunidade.

4 – Agora vamos passar mais um parâmetro para a função REUSE que está na rotina Z_LIST_DISPLAY:

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

it_fieldcat

= wt_fieldcat

it_sort

= wt_sort

it_special_groups = wt_sp_group

is_print

= wf_print

is_layout

= wf_layout

it_events

= wt_events

i_save

= 'A'

is_variant

= wf_variant

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

Veja que passamos como parâmetros:

is_events = wt_events Nome da tabela com os eventos;

6 – Veremos cada evento descrito no tópico 3 ( três ) de forma resumida apenas para o leitor ter uma idéia dos benefícios que as mesmas podem nos proporcionar.

6.1 – O evento USER_COMMAND serve para tratar ações do usuário, aqui daremos um exemplo simples que quando houver um duplo clique no campo do número da ordem de venda, a transação VA03 ( Exibir ordem de cliente ) será acionada exibindo assim a ordem em questão.

*----------------------------------------------------------------------*

* FORM Z_USER_COMMAND

*

*----------------------------------------------------------------------*

* Ações do usuário

*

*----------------------------------------------------------------------*

FORM z_user_command USING pv_ucomm

LIKE sy-ucomm

pf_selfield TYPE slis_selfield.

"#EC CALLED

*

*

*

*

CASE pv_ucomm.

Ação de Click duplo '&IC1' WHEN '&IC1'.

Posicionar no registro selecionado READ TABLE wt_saida INDEX pf_selfield-tabindex.

Verificar campo selecionado CASE pf_selfield-sel_tab_field. WHEN 'WT_SAIDA-VBELN'.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

* Determinar nro da ordem de venda ao parâmetro de memória SET PARAMETER ID 'AUN' FIELD wt_saida-vbeln.

* Chamar transação de exibição da ordem de venda CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. ENDCASE. ENDCASE.

ENDFORM.

6.2 – O evento TOP_OF_PAGE serve para criar um cabeçalho para cada página do

relatório. Apenas um comentário será feito na rotina para visualização do efeito do mesmo no relatório.

*----------------------------------------------------------------------*

* FORM Z_TOP_OF_PAGE

*----------------------------------------------------------------------*

* Evento de cabeçalho

*----------------------------------------------------------------------*

FORM z_top_of_page.

*

*

"#EC CALLED

WRITE: / 'Evento: top-of-page'.

ENDFORM.

6.3 – O evento END_OF_PAGE serve para criar um rodapé para cada página do

relatório.

*----------------------------------------------------------------------*

* FORM Z_END_OF_PAGE

*----------------------------------------------------------------------*

* Evento para rodapé da lista

*----------------------------------------------------------------------*

form z_end_of_page.

*

*

"#EC CALLED

write: / 'Evento: end_of_page'.

endform.

6.4 – O evento TOP_OF_LIST, será impresso apenas uma vez ao início da lista.

*----------------------------------------------------------------------*

* FORM Z_TOP_OF_LIST

*

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

form z_top_of_list.

* Evento para topo da lista

"#EC CALLED

write: / 'Evento: top-of-list'.

endform.

6.5 – O evento END_OF_LIST, será impresso apenas uma vez ao final da lista.

*----------------------------------------------------------------------*

* FORM Z_END_OF_LIST

*----------------------------------------------------------------------*

*

*

* Evento de final de lista

*----------------------------------------------------------------------*

form z_end_of_list.

"#EC CALLED

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

write: / 'Evento: end_of_list'.

endform.

6.5 – Este é um evento interessante, o PF_STATUS_SET, nele é possível indicar qual

a barra de status que deve ser apresentada para o relatório.

Veremos em um tópico específico como funciona este evento, assim criaremos uma funcionalidade específica deste evento interagindo com o checkbox.

*----------------------------------------------------------------------*

* FORM Z_PF_STATUS_SET

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

form z_pf_status_set using pt_extab type slis_t_extab. * Acionar barra de comandos

"#EC CALLED

*

* Especificar barra de status

* set pf-status 'STANDARD' excluding pt_extab.

endform.

6.6 – Abaixo segue a interface dos outros eventos mais utilizados. Você pode testá-los

ativando os mesmos no evento Z_EVENTTAB_BUILD. Os pontos de paradas estão comentados, mas você pode ativá-los para verificar melhor o momento em que cada um deles é acionado.

*----------------------------------------------------------------------*

* FORM Z_CALLER_EXIT

*----------------------------------------------------------------------*

* Evento

*----------------------------------------------------------------------*

form z_caller_exit using pf_data.

*

*

"#EC CALLED

endform.

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

form z_before_line_output using pf_lineinfo type slis_lineinfo.

* Evento antes da impressão da linha

* FORM Z_BEFORE_LINE_OUTPUT

"#EC CALLED

* break-point.

endform.

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

form z_after_line_output using pf_lineinfo type slis_lineinfo.

* Evento depois da impressão da linha

* FORM Z_AFTER_LINE_OUTPUT

"#EC CALLED

* break-point.

endform.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

form z_list_modify using pv_tabname pv_index

* Evento modifica linha da lista

* FORM Z_LIST_MODIFY

type slis_tabname like sy-tabix

pv_index_slave like sy-tabix

pv_index_sum

like sy-tabix.

"#EC CALLED

* break-point.

endform.

7 – Uma pequena amostra da tela com alguns eventos implementados.

pequena amostra da tela com alguns eventos implementados. F I G U R A 9 .

FIGURA 9.1 Tela exibindo a aplicação de alguns eventos

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Barra de Status Personalizada

Capítulo

Capítulo

Atribuindo uma barra de status específica para o programa.

P odemos criar barra de status ( Status da Interface ) específicas para os programas. Isto já deve ser sabido por todos, porém no ALV temos uma maneira especial para indicar qual será a barra de status que o programa deverá utilizar.

Vamos copiar o programa ZFRA0023_9 e chamá-lo de ZFRA0023_10.

Para não perdermos as funcionalidades já existentes para os programas ALVs, vamos copiar uma barra de status padrão para os programas e depois adicionaremos nossas funções;

1 – Copiando uma barra de status padrão para ALV;

1.1 – Execute a transação SE41 ( Menu Painter ), escolha o programa SAPLKKBL e a barra de status STANDARD.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE PROGRAMAÇÃO ALV FIGURA 10.1 Copiando barra de status. 1.2 – Copiar o status

FIGURA 10.1 Copiando barra de status.

1.2 – Copiar o status acionando o botão

.
.

1.3 – Altere o nome do programa “Para”, para ZFRA0023_10;

– Altere o nome do programa “Para”, para ZFRA0023_10; FIGURA 10.2 Tela de cópia. 1.4 –

FIGURA 10.2 Tela de cópia.

1.4 – Salve e ative a barra de status;

2 – Alterar o programa para utilizar a barra de status específica para o ZFRA0023_10. Na rotina Z_EVENTTAB_BUID, tire o comentário da linha do evento de barra de status.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

*---------------------------------------------------------------------*

* FORM Z_EVENTTAB_BUILD

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------* FORM z_eventtab_build USING pt_events TYPE slis_t_event.

* --> PT_EVENTS - Eventos associados a lista

* Definir eventos associados a lista

*

WHEN slis_ev_pf_status_set. MOVE 'Z_PF_STATUS_SET' TO lf_event-form.

3 – Na rotina Z_PF_STATUS_SET elimine o comentário para acionar a barra de status STANDARD;

*----------------------------------------------------------------------*

* FORM Z_PF_STATUS_SET

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

FORM z_pf_status_set USING pt_extab TYPE slis_t_extab. * Acionar barra de comandos SET PF-STATUS 'STANDARD' EXCLUDING pt_extab.

"#EC CALLED

* Especificar barra de status

*

ENDFORM.

4 – Agora vamos adicionar um botão específico para o programa ZFRA0023. Insira um separador e depois adicione um botão chamado “TESTE”. Neste caso vamos associar este botão a PF “CTRL + F10”.

Neste caso vamos associar este botão a PF “CTRL + F10”. FIGURA 10.3 Adicionando um botão

FIGURA 10.3 Adicionando um botão específico.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE PROGRAMAÇÃO ALV FIGURA 10.4 Botão TESTE ao final da barra de status. A

FIGURA 10.4 Botão TESTE ao final da barra de status.

A construção da barra de status funciona da mesma forma como para os outros programas ABAP, sendo possível associar ícones aos botões, etc, porém aqui queremos apenas mostrar a personalização da barra de status portanto deixamos a cargo do leitor as questões de layout da barra de status, que pode ser obtida através da ajuda para pesquisa da transação SE41.

No próximo capítulo veremos como associar o botão TESTE a um determinado evento.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Trabalhando com checkbox

Capítulo

Capítulo

Associando um evento para trabalhar com as linhas selecionadas através do checkbox.

A seleção de uma ou mais linhas pode ser feita através de um checkbox como aprendemos no capítulo 8, e no capítulo 10 aprendemos a criar uma barra de status específica para adicionarmos nossas próprias funções com o intuito de acionar eventos específicos.

Agora neste capítulo vamos integrar estas duas funcionalidades.

Vamos copiar o programa ZFRA0023_10 e chamá-lo de ZFRA0023_11. Não se esqueça de selecionar também a barra de status para a cópia ( interfaces do usuário ).

1 – Na rotina Z_USER_COMMAND vamos criar uma entrada para o evento “TESTE”;

*----------------------------------------------------------------------*

* FORM Z_USER_COMMAND

*----------------------------------------------------------------------*

*

*

* Ações do usuário

*----------------------------------------------------------------------*

FORM z_user_command USING pv_ucomm

LIKE sy-ucomm

pf_selfield TYPE slis_selfield.

"#EC CALLED

*

 

CASE pv_ucomm.

*

Ação de Click duplo '&IC1' WHEN '&IC1'.

*

Posicionar no registro selecionado READ TABLE wt_saida INDEX pf_selfield-tabindex.

*

Verificar campo selecionado CASE pf_selfield-sel_tab_field. WHEN 'WT_SAIDA-VBELN'.

*

Determinar nro da ordem de venda ao parâmetro de memória SET PARAMETER ID 'AUN' FIELD wt_saida-vbeln.

*

Chamar transação de exibição da ordem de venda CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. ENDCASE. WHEN 'TESTE'. PERFORM z_rotina_teste. ENDCASE.

ENDFORM.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

2 – Criar a rotina Z_ROTINA_TESTE, que exibirá uma mensagem indicando quais linhas foram selecionadas.

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Rotina para o evento TESTE ( Botão )

*----------------------------------------------------------------------* FORM z_rotina_teste.

Form Z_ROTINA_TESTE

LOOP AT wt_saida.

* Verificar se linha foi selecionada CHECK wt_saida-box EQ 'X'.

* Enviar mensagem para informar linha selecionada MESSAGE i899(bd) WITH 'Foi escolhida a ordem:' wt_saida-vbeln. ENDLOOP.

ENDFORM.

3 – Tela da lista;

" Z_ROTINA_TESTE

ENDLOOP. ENDFORM. 3 – Tela da lista; " Z_ROTINA_TESTE FIGURA 11.1 Tela com mensagem de linha

FIGURA 11.1 Tela com mensagem de linha selecionada.

A mensagem será exibida quantas linhas forem selecionadas, indicando na mesma o número da ordem de venda.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Mudando cores dos campos

Mudando os atributos de cores de campos.

Capítulo

Capítulo

N o capítulo 8 ( Variações de Layout ) vimos que é possível mudar algumas características da lista através da configuração da estrutura “is_layout”. Com relação a cores pode-se configurar o parâmetro “zebra” para que as linhas da lista alternem as cores para que as mesmas sejam melhores

identificadas.

Neste capítulo vamos aprender como mudar os atributos de cores para campos da lista e conseqüentemente para a linha.

Vamos copiar o programa ZFRA0023_11 e chamá-lo de ZFRA0023_12. Não se esqueça de selecionar também a barra de status para a cópia ( interfaces do usuário ).

1 – Incluir estrutura de cores na estrutura we_saída;

*$*$ Tipos ------------------------------------------------------------- TYPES: BEGIN OF we_saida,

vbeln LIKE vbak-vbeln, erdat LIKE vbak-erdat, ernam LIKE vbak-ernam, audat LIKE vbak-audat, auart LIKE vbak-auart, netwr LIKE vbak-netwr, vkorg LIKE vbak-vkorg, vtweg LIKE vbak-vtweg, spart LIKE vbak-spart, vkgrp LIKE vbak-vkgrp, vkbur LIKE vbak-vkbur, box

, color TYPE slis_t_specialcol_alv,

" Nro da ordem de venda " Data de criação " Criado por " Data da ordem " Tipo de ordem " Valor líq. da ordem " Org. de vendas " Canal de distribuição " Setor de atividade " Grupo de vendedores " Escritório de vendas " Checkbox

END

OF we_saida.

2 – Vamos criar duas tabelas internas que conterão uma configuração específica de cores.

* Tabs. de cores DATA: wt_color_normal TYPE slis_t_specialcol_alv WITH HEADER LINE,

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

wt_color_selecao TYPE slis_t_specialcol_alv WITH HEADER LINE.

4 – Criar rotina para atribuição de cores;

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* <-- PT_COLOR

* --> PV_COLOR

* --> PV_INTENSIFIED - Intensificado

* --> PV_INVERSE

*----------------------------------------------------------------------* FORM z_field_color TABLES pt_color TYPE slis_t_specialcol_alv

Form Z_FIELD_COLOR

- Tab. com configuração das cores

- Cor

- Inversão de cores

USING value(pv_color)

TYPE i

value(pv_intensified) TYPE i

value(pv_inverse)

TYPE i.

DEFINE z_field_color. pt_color-color-col = pv_color. pt_color-color-int = pv_intensified. pt_color-color-inv = pv_inverse. pt_color-fieldname = &1. append pt_color. END-OF-DEFINITION.

* Inicializar tabela CLEAR: pt_color[], pt_color.

* Definir campos z_field_color: 'VBELN', 'ERDAT', 'ERNAM', 'AUDAT', 'AUART', 'NETWR', 'VKORG', 'VTWEG', 'SPART', 'VKGRP', 'VKBUR'.

ENDFORM.

" Z_FIELD_COLOR

5 – Criar chamada da rotina para atribuição de cores;

*$*$ Programa Principal ------------------------------------------------ START-OF-SELECTION.

*

Determinar cores PERFORM z_field_color: TABLES wt_color_normal USING 2 0 0, TABLES wt_color_selecao USING 5 0 0.

6

– Indicar a tabela de cores na rotina Z_LAYOUT_BUILD;

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Layout de saída

*----------------------------------------------------------------------*

* --> PF_LAYOUT - Estrutura para layout de saída da lista

*----------------------------------------------------------------------* FORM z_layout_build USING pf_layout TYPE slis_layout_alv.

Form Z_LAYOUT_BUILD

pf_layout-group_change_edit = 'X'.

* Check box na lista

pf_layout-box_fieldname

= 'BOX'.

pf_layout-box_tabname

= 'WT_SAIDA'.

* Determinar a tabela de cores pf_layout-coltab_fieldname = 'COLOR'.

ENDFORM.

" Z_LAYOUT_BUILD

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

7 – Vamos aproveitar a rotina Z_ROTINA_TESTE para implementar a mudança de

cor. Faremos que as linhas que estiverem selecionadas no momento em que o botão

“TESTE” seja acionado mudem de cor.

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Rotina para o evento TESTE ( Botão )

*----------------------------------------------------------------------* FORM z_rotina_teste.

Form Z_ROTINA_TESTE

LOOP AT wt_saida.

* Verificar se linha foi selecionada

* CHECK wt_saida-box EQ 'X' IF wt_saida-box EQ 'X'.

* Enviar mensagem para informar linha selecionada MESSAGE i899(bd) WITH 'Foi escolhida a ordem:' wt_saida-vbeln.

* Mudar cor da linha selecionada wt_saida-color[] = wt_color_selecao[]. ELSE.

* Mudar cor da linha selecionada wt_saida-color[] = wt_color_normal[]. ENDIF. MODIFY wt_saida TRANSPORTING color. ENDLOOP.

ENDFORM.

" Z_ROTINA_TESTE

Veja que mudamos um pouco a rotina, trocamos o comando CHECK por um IF, pois desta forma poderemos identificar as linhas que não estão selecionadas e retorná- las a cor original caso tenham sido selecionadas em algum momento.

Atribuiremos as cores configuradas na tabela “wt_color_selecao”, para as linhas selecionadas, caso contrário será atribuída as da “wt_color_normal”.

8 – Detalhe importante, devemos informar que deve ser feito um REFRESH da lista

para que as alterações, neste caso das cores, sejam atualizadas na lista. Para isto vamos

informar ao evento Z_USER_COMMAND o parâmetro de REFRESH.

*----------------------------------------------------------------------*

* FORM Z_USER_COMMAND

*

*----------------------------------------------------------------------*

* Ações do usuário

*

*----------------------------------------------------------------------*

FORM z_user_command USING pv_ucomm

LIKE sy-ucomm

pf_selfield TYPE slis_selfield.

"#EC CALLED

*

 

CASE pv_ucomm.

*

Ação de Click duplo '&IC1' WHEN '&IC1'.

*

Posicionar no registro selecionado READ TABLE wt_saida INDEX pf_selfield-tabindex.

*

Verificar campo selecionado CASE pf_selfield-sel_tab_field. WHEN 'WT_SAIDA-VBELN'.

*

Determinar nro da ordem de venda ao parâmetro de memória SET PARAMETER ID 'AUN' FIELD wt_saida-vbeln.

*

Chamar transação de exibição da ordem de venda CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. ENDCASE. WHEN 'TESTE'.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

PERFORM z_rotina_teste.

ALV

* Realizar um REFRESH da lista pf_selfield-refresh = 'X'. ENDCASE.

ENDFORM.

O parâmetro REFRESH também pode ser utilizado para atualizar a tela quando alguma informação da tabela interna ( wt_saida ) sobre alguma alteração no conteúdo.

9 – Teremos que realizar uma alteração na rotina Z_BUSCAR_DADOS, pois não

será aceito o SELECT

pois a mesma com a inclusão do campo color, do tipo SLIS_T_SPECIALCOL_ALV, que é uma tabela, passou a ter mais de uma dimensão, e a cláusula INTO TABLE aceita apenas tabelas internas unidimensionais.

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Obter informações para lista

*----------------------------------------------------------------------* FORM z_buscar_dados.

* Variáveis DATA: BEGIN OF lt_saida OCCURS 0, vbeln LIKE vbak-vbeln, erdat LIKE vbak-erdat, ernam LIKE vbak-ernam, audat LIKE vbak-audat, auart LIKE vbak-auart, netwr LIKE vbak-netwr, vkorg LIKE vbak-vkorg, vtweg LIKE vbak-vtweg, spart LIKE vbak-spart, vkgrp LIKE vbak-vkgrp, vkbur LIKE vbak-vkbur, END OF lt_saida.

INTO TABLE diretamente na tabela de saída “wt_saida”

Form Z_BUSCAR_DADOS

" Nro da ordem de venda " Data de criação " Criado por " Data da ordem " Tipo de ordem " Valor líq. da ordem " Org. de vendas " Canal de distribuição " Setor de atividade " Grupo de vendedores " Escritório de vendas

* Exibir aviso PERFORM z_sapgui_progress_indicator USING 'Selecionando dados. Aguarde

* Seleção das informações SELECT vbeln erdat ernam audat auart netwr vkorg vtweg spart vkgrp vkbur

* INTO TABLE wt_saida

'.

INTO TABLE lt_saida FROM vbak WHERE vbeln IN s_vbeln.

* Atribuir valores a tabela de saída LOOP AT lt_saida. MOVE-CORRESPONDING lt_saida TO wt_saida. APPEND wt_saida. ENDLOOP.

ENDFORM.

" Z_BUSCAR_DADOS

Veja que apenas foi criado um passo intermediário para incluir os campos na tabela de saída “wt_saída”.

10 – Telas antes e depois de acionar o botão “TESTE” com uma linha selecionada;

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE PROGRAMAÇÃO ALV FIGURA 12.1 Tela antes de apertar o botão TESTE F I

FIGURA 12.1 Tela antes de apertar o botão TESTE

ALV FIGURA 12.1 Tela antes de apertar o botão TESTE F I G U R A

FIGURA 12.2 Tela DEPOIS de apertar o botão TESTE, já com a linha selecionada colorida.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Inserindo Ícones

Agregando ícones a linhas da lista.

Capítulo

Capítulo

U m recurso bastante interessante é a inclusão de ícones nas linhas da lista. Neste capítulo vamos aprender como é simples dispor deste recurso e como a lista pode ficar muito mais apresentável ao usuário.

Vamos copiar o programa ZFRA0023_11 e chamá-lo de ZFRA0023_13. Não se esqueça de selecionar também a barra de status para a cópia.

1 – Referenciar o include de definição de ícones;

*$*$ Includes ---------------------------------------------------------- INCLUDE <icon>.

2 – Incluir campo na tabela de saída “wt_saida” que receberá o código do ícone;

*$*$ Tipos ------------------------------------------------------------- TYPES: BEGIN OF we_saida,

vbeln

LIKE vbak-vbeln,

" Nro da ordem de venda

erdat

LIKE vbak-erdat,

" Data de criação

ernam

LIKE vbak-ernam,

" Criado por

audat

LIKE vbak-audat,

" Data da ordem

auart

LIKE vbak-auart,

" Tipo de ordem

netwr

LIKE vbak-netwr,

" Valor líq. da ordem

vkorg

LIKE vbak-vkorg,

" Org. de vendas

vtweg

LIKE vbak-vtweg,

" Canal de distribuição

spart

LIKE vbak-spart,

" Setor de atividade

vkgrp

LIKE vbak-vkgrp,

" Grupo de vendedores

vkbur

LIKE vbak-vkbur,

" Escritório de vendas

box

TYPE c

,

" Checkbox

icone(30) TYPE c

,

" Ícone

END

OF we_saida.

3 – Faremos uma alteração na rotina Z_BUSCAR_DADOS, considerando o valor líquido da ordem de venda como referência para atribuição de ícones.

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Obter informações para lista

*----------------------------------------------------------------------* FORM z_buscar_dados.

Form Z_BUSCAR_DADOS

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

* Exibir mensagem PERFORM z_sapgui_progress_indicator USING 'Selecionando dados. Aguarde

* Obter dados da base SELECT vbeln erdat ernam audat auart netwr vkorg vtweg spart vkgrp vkbur INTO TABLE wt_saida FROM vbak WHERE vbeln IN s_vbeln.

* Atribuir ícones LOOP AT wt_saida.

* Verificar valor líquido

'.

IF wt_saida-netwr GT '1000'. wt_saida-icone = icon_red_light. ELSEIF wt_saida-netwr GT '500'. wt_saida-icone = icon_yellow_light. ELSE. wt_saida-icone = icon_green_light. ENDIF. MODIFY wt_saida TRANSPORTING icone. ENDLOOP.

ENDFORM.

" Z_BUSCAR_DADOS

Este é um exemplo da aplicação de ícones a listas ALVs. Neste caso estamos considerando que, ipoteticamente, ordens com valores líquidos entre 0 e 500 estariam liberadas, entre 501 e 1000 deveriam ter atenção e acima de 1000 devem ser analisadas, como se existissem limites para que uma ordem fosse liberada, etc

Você pode avaliar suas aplicações e encontrar uma aplicação real, aqui apenas queremos mostrar a ferramenta.

4 – Finalmente incluiremos o campos ICONE na tabela wt_fieldcat;

*---------------------------------------------------------------------*

* FORM Z_FIELDCAT_INIT

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

*

*---------------------------------------------------------------------*

FORM z_fieldcat_init USING pt_fieldcat TYPE slis_t_fieldcat_alv.

* Estruturas DATA: lf_fieldcat TYPE slis_fieldcat_alv.

*

* Inicializar estrutura das informações da lista

* --> PT_FIELDCAT - Tab. com estrutura de linha

* Limpar tabela CLEAR pt_fieldcat[].

* Ícone clear lf_fieldcat. add 1 to lv_col_pos. lf_fieldcat-col_pos lf_fieldcat-fieldname lf_fieldcat-icon lf_fieldcat-datatype lf_fieldcat-outputlen

add 1 to lv_col_pos. lf_fieldcat-col_pos lf_fieldcat-fieldname lf_fieldcat-icon lf_fieldcat-datatype lf_fieldcat-outputlen
add 1 to lv_col_pos. lf_fieldcat-col_pos lf_fieldcat-fieldname lf_fieldcat-icon lf_fieldcat-datatype lf_fieldcat-outputlen
add 1 to lv_col_pos. lf_fieldcat-col_pos lf_fieldcat-fieldname lf_fieldcat-icon lf_fieldcat-datatype lf_fieldcat-outputlen
add 1 to lv_col_pos. lf_fieldcat-col_pos lf_fieldcat-fieldname lf_fieldcat-icon lf_fieldcat-datatype lf_fieldcat-outputlen

= lv_col_pos.

= 'ICONE'.

= 'X'.

= 'CHAR'.

= '4'.

append lf_fieldcat to pt_fieldcat.

* Cód. doc. venda CLEAR lf_fieldcat. lf_fieldcat-fieldname lf_fieldcat-ref_tabname lf_fieldcat-sp_group

= 'VBELN'.

= 'VBAK'." Tab. de Referência

" Nome do Campo

= 'A'.

APPEND lf_fieldcat TO pt_fieldcat.

" Grupo de Ordem Vendas " Gravar na tab. config.

GUIA

BÁSICO

DE

5 – Tela da lista;

PROGRAMAÇÃO

ALV

GUIA BÁSICO DE 5 – Tela da lista; PROGRAMAÇÃO ALV FIGURA 13.1 Tela de lista com

FIGURA 13.1 Tela de lista com ícones.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Considerações Gerais

Referências e ressalvas.

Copyright:

Copyright 2001 Flavio Ricardo de Almeida. Todos os direitos reservados.

O material contido neste manual pode ser reproduzido, alterado e redistribuído sem autorização prévia, desde que mantido os créditos.

Sem vínculo algum com a SAP AG ou quaisquer de suas subsidiárias.

Trademakrs:

SAP®, R/3®, ABAP/4®, ABAP® são marcas registradas da SAP AG.

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Apêndice A

Programas utilizados como exemplos.

Os programas podem ser baixados do site “Flavio’s Home Page” no endereço www.almeidafr.hpg.ig.com.br .

Capítulo 2

*$*$********************************************************************

*$*$

*

*$*$ PROGRAMA: Meu primeiro ALV

*

*$*$ TIPO

: Lista ALV

*

*$*$ AUTOR

: Flavio R. Almeida (FRA) - FRA Consultoria

*

*$*$ DATA

: 12/12/2001

*

*$** OBS.

:

*

*$**

*

*$*$********************************************************************

*$*$

*$*$-------------------------------------------------------------------*

*$*$ DATA

*$*$-------------------------------------------------------------------*

*$**

*$*$******************************************************************** REPORT zfra0023_2 .

*

*

*

HISTÓRICO DAS MODIFICAÇÕES

| AUTOR

|

| DESCRIÇÃO

|

*$*$ Tipos ------------------------------------------------------------- TYPES: BEGIN OF we_saida. INCLUDE STRUCTURE vbak.

TYPES: END

OF we_saida.

*$*$ Tabelas Internas -------------------------------------------------- DATA: wt_saida TYPE STANDARD TABLE OF we_saida WITH HEADER LINE.

*$*$ Variáveis ---------------------------------------------------------

* Nome do programa DATA: wv_repid

LIKE sy-repid.

*$*$ Tela de Seleção --------------------------------------------------- SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-902. SELECT-OPTIONS: s_vbeln FOR wt_saida-vbeln.

SELECTION-SCREEN END

OF BLOCK b1.

*$*$ Inicialização ----------------------------------------------------- INITIALIZATION.

wv_repid

= sy-repid.

*$*$ Programa Principal ------------------------------------------------ START-OF-SELECTION. PERFORM z_buscar_dados.

END-OF-SELECTION.

* Construção da lista propriamente dita ( Exibição das informações ) PERFORM z_list_display.

*$*$ Subrotinas -------------------------------------------------------- *&---------------------------------------------------------------------* *& Form Z_BUSCAR_DADOS

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

*&---------------------------------------------------------------------*

* Obter informações para lista

*----------------------------------------------------------------------* FORM z_buscar_dados.

PERFORM z_sapgui_progress_indicator USING 'Selecionando dados. Aguarde

'.

SELECT * INTO TABLE wt_saida FROM vbak WHERE vbeln IN s_vbeln.

ENDFORM.

" Z_BUSCAR_DADOS

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Lista informações na tela

*----------------------------------------------------------------------* FORM z_list_display.

Form Z_LIST_DISPLAY

PERFORM z_sapgui_progress_indicator USING 'Estruturando a lista. Aguarde

'.

CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = wv_repid

i_structure_name

= 'VBAK'

i_save

= 'A'

TABLES

t_outtab

= wt_saida

EXCEPTIONS

program_error

= 1

OTHERS

= 2.

* Verificar processamento da função IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM.

" Z_LIST_DISPLAY

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

* Interagir com o front-end - Enviar mensagens

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

FORM z_sapgui_progress_indicator USING value(pv_text).

Form Z_SAPGUI_PROGRESS_INDICATOR

--> PV_TEXT - Mensagem

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING

*

PERCENTAGE = 0

 

text

= pv_text.

ENDFORM.

" Z_SAPGUI_PROGRESS_INDICATOR

GUIA

BÁSICO

DE

PROGRAMAÇÃO

ALV

Capítulo 3

*$*$********************************************************************

*$*$

</