ALV com Field Catalog – Usando a classe CL_SALV_TABLE

Problema

Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Também é requerido um novo campo chamado Taxa de Ocupação, onde é mostrado a relação entre capacidade máxima de  passageiros e ocupação atual do vôo.

Solução

Passo 1: Criar um programa executável, sem TOP include, ZSALV_ALV_FIELDCAT.

Passo 2: Criar as referências para os objetos do grid:

DATA: r_table     TYPE REF TO cl_salv_table,
r_columns   TYPE REF TO cl_salv_columns_table,
r_column    TYPE REF TO cl_salv_column,
r_functions TYPE REF TO cl_salv_functions.

Passo 3: Criar uma tabela interna sem header line, fazer a seleção de todos os dados da tablea SFLIGHT e fazer o cálculo da taxa de ocupação.

TYPES: BEGIN OF ty_flight.
INCLUDE TYPE sflight.
TYPES: txocc TYPE p DECIMALS 2,
END OF ty_flight.

DATA: r_table     TYPE REF TO cl_salv_table,
r_columns   TYPE REF TO cl_salv_columns_table,
r_column    TYPE REF TO cl_salv_column,
r_functions TYPE REF TO cl_salv_functions.

DATA: it_sflight TYPE TABLE OF ty_flight,
wa_sflight LIKE LINE OF it_sflight.

….

SELECT * FROM sflight INTO TABLE it_sflight.

LOOP AT it_sflight INTO wa_sflight.
wa_sflight-txocc =
( wa_sflight-seatsocc / wa_sflight-seatsmax ) * 100.
MODIFY it_sflight FROM wa_sflight.
ENDLOOP.

Passo 4: Criar a referência com o método FACTORY para o objeto ALV:

TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = r_table
CHANGING
t_table      = it_sflight ).
CATCH cx_salv_msg .
ENDTRY.

Passo 5: Ajustar os dados para a nova coluna:

r_columns = r_table->get_columns( ).
r_columns->set_optimize( abap_true ).

r_column = r_columns->get_column( ‘TXOCC’ ).
r_column->set_short_text( ‘Tx. Occ.’ ).
r_columns->set_column_position( columnname = ‘TXOCC’ position = 10 ).


Passo 5:
Chamar o método DISPLAY para mostrar os grid:

r_table->display( ).

Agora você pode ativar o seu programa e testar.

Execução e Teste

Para executar e testar o programa, apenas pressione F8 ou :

Discussão

Na versão Netweaver 04, a SAP introduziu a família de classes CL_SALV*, que basicamente encapsula as operações que fizemos no post ALV Simples – Usando a Técnica “Pura”. Podemos dizer que essa família de classes veio para substituir as técnicas baseadas nas Function Modules da família REUSE*.

As classes SALV tornam a manipulação do ALV extremamente simples. No exemplo de ALV simples não fica tão claro, mas nesse exemplo vemos claramente que o ALV com as classes SALV ficam muito mais “orientado a objetos”.

Quando estiver trabalhando com elas, você deve pensar o ALV como um objeto, mas composto por diversos outros objetos, como por exemplo, colunas.

Ou seja, após criar o objeto CL_SALV_TABLE com o método FACTORY, você só precisa usar métodos GET… para obter as referências aos objetos agregados, como colunas, coluna individual e funções do grid.

Adicionando Nova Coluna ao Grid

Diferentemente do método “puro”, você não precisa criar uma tabela interna para ajustar o field catalog, mas apenas trabalhar com os atributos do objeto CL_SALV_COLUMN. Muito mais simples e intuitivo.

r_columns = r_table->get_columns( ).

Com o método get_columns( ), você obtém a referência para o objeto CL_SALV_COLUMNS_TABLE, que são as colunas do grid. Lembre-se que ela não contém os valores das colunas, apenas metadados (informações das colunas em si).

r_columns->set_optimize( abap_true ).

O método set_optimize( ) você pode definir que a largura das colunas serão otimizadas de acordo com o contéudo da coluna.

r_column = r_columns->get_column( ‘TXOCC’ ).

Com o método get_column( ) você retorna a referência a uma data coluna, de acordo com o nome técnico do campo que você passou no parâmetro. No caso acima, o nome do nosso campo que queremos alterar as características é o TXOCC.

r_column->set_short_text( ‘Tx. Occ.’ ).

Esse método, set_short_text( ) define o texto curto para a coluna.

r_columns->set_column_position( columnname = ‘TXOCC’ position = 10 ).

Finalmente, com o método set_column_position( ), você define a posição de uma coluna.

Anexos

ZSALV_ALV_FIELDCAT.txt

Veja Também

ALV Output Display
Introdução ao ALV – Série Especial
ALV com Field Catalog – Usando a Técnica “Pura”

You may also like...

3 Responses

  1. Eduardo says:

    E no caso de eu querer esconder um campo da tabela? como faria?

  2. Paulo Sales says:

    Olá,

    A resposta para a dúvida do Eduardo é passar o nome do campo da tabela ao método GET_COLUMN do objeto da classe CL_SALV_COLUMNS_TABLE e passar parâmetro em branco ou abap_false para o método SET_VISIBLE do objeto da classe CL_SALV_COLUMN.

    Abs.

  3. Felipe Omarini says:

    E quando eu quiser adicionar mais de um campo?
    Como fica a estrutura do código?