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”

E no caso de eu querer esconder um campo da tabela? como faria?
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.
E quando eu quiser adicionar mais de um campo?
Como fica a estrutura do código?