ALV com Field Catalog – Usando a Técnica “Pura”

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, ZPURE_ALV_FIELDCAT.
Passo 2: Criar as referências para os objetos do grid:

Passo 3: Criar uma tabela interna com todos os campos da tabela transparente SFLIGHT e mais um campo do tipo package, com 2 casas decimais, para guardar o valor calculado da taxa de ocupação.

Criar um tipo local para a nova estrutura contendo o cálculo da taxa de ocupação.

Com o tipo criado, criar os data objects (tabela interna e work area).

Fazer a seleção dos dados da SFLIGHT, logo no início do evento START-OF-SELECTION:

Após fazer a seleção dos dados é necessário efetuar o cálculo da taxa de ocupação e atualizar a tabela interna com esse valor:

Passo 4: Criar uma tabela interna e work area para a tabela de field catalog:

Passo 5: Criar e chamar uma tela onde o ALV será apresentado. Para criar a tela, dar um duplo clique no número da tela, confirmar a criação do objeto e entrar com uma descrição:

Importante: a tela precisa ser classificada como “Normal”

Nessa nova tela, é necessário criar um componente chamado “Custom Control” , pelo screen painter onde ALV será apresentado, ou seja, o ALV ficará limitado a essa área. Além disso, atentar para o nome desse componente, pois será utilizado nos próximos passos.

Terminado de desenhar onde o ALV será mostrado, é necessário programar o PBO e PAI da screen. Para isso entre na tab Flow Logic, descomente a linha MODULE STATUS_0100, dê um duplo clique na palavra STATUS_0100 e confirme a criação do novo includ. É importante escolher um bom nome para o include, pois todos os MODULES serão escritos nele:

Confirme a inclusão da instrução INCLUDE no programa princial.

No MODULE STATUS_0100, criar o comando SET PF-STATUS ‘PF0100’.

Dar um duplo clique no ‘PF0100’ para criar o GUI STATUS. Definir a descrição para o STATUS GUI como Normal Screen:

Na criação do Status Gui, definir uma Function Key para o botão BACK:

Também precisamos programar o PAI para o botão BACK. Para isso, descomentar  MODULE USER_COMMAND_0100 no flow logic da screen. Dar um duplo clique nesse comando, confirmar a criação de um novo MODULE no mesmo include criado para o module PBO:

Inserir o seguinte código no MODULE USER_COMMAND_0100.

Ao final do passo 5, já podemos fazer a primeira ativação do nosso programa para verificar se tudo está correto.

Passo 6: Criar os objetos para o ALV:

No PBO, criar a linha MODULE CREATE_ALV e dar um duplo clique para criar o MODULE. Escolher o mesmo include que já estamos usando para colocar os outros modules:

Nesse module, será colocado os comandos para criação dos objetos para o grid.

Também precisamos montar a tabela interna com o field catalog.

Por último, chamar o método para mostrar o grid:

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

Esse programa é muito parecido com o desse post. Mas para esse programa precisamo criar um field catalog para definir as características do novo campo.

Conceituando o Field Catalog do ALV

De uma maneira bem sumarizada podemos dizer que o field catalog é o que define as características das colunas do ALV. Para cada campo do ALV, temos uma linha no field catalog. O field catalog é uma tabela interna, do tipo LVC_T_FCAT (ou também LVC_S_FCAT para estruturas), onde definimos uma séria de características para cada coluna.

Nesse tipo LVC_T_FCAT, temos um campo chamado FIELDNAME, onde é feito o link com a it_outtab, veja novamente como a tabela it_fcat foi preenchida:

CLEAR wa_fcat.
wa_fcat-fieldname = ‘TXOCC’.
wa_fcat-col_pos = 10.
wa_fcat-coltext = ‘Tx. Occ.’.
APPEND wa_fcat TO it_fcat.

Ou seja, o campo FIELDNAME precisa ser o mesmo nome técnico que está na it_outtab. Veja o detalhe que está em maísculo ‘TXOCC’, caso contrário a classe grid não reconhecerá o campo.

Campos de Referência no Field Catalog

Quando chamamos o método SET_TABLE_FOR_FIRST_DISPLAY passamos o parâmetro I_STRUCTURE_NAME = ‘SFLIGHT’, onde usamos as informações semânticas (labels, documentação etc.) que estão no dicionário. Mas se o campo extra não está presente na SFLIGHT, mas está em outra tabela do dicionário (não é o caso da taxa de ocupação)?

Temos dois campos no field catalog que podemos indicar referência a outro campo e tabela do dicionário, REF_FIELD e REF_TABLE. Se o nosso campo tem a mesma referência técnia e semântica de algúm campo de outra tabela, podemos usar REF_FIELD para indicar o campo e REF_TABLE para indicar a tabela.

Lembrando que podemos sobrescrever qualquer característica usando os outros campos da tabela do field catalog.

Vamos supor que queremos incluir um campo para o telefone no nosso field catalog. O campo da it_outtab é TELEPHONE, e o campo PHONE da tabela SCUSTOM possui as mesmas características e queremos usá-la. A entrada na IT_FCAT ficaria assim:

CLEAR wa_fcat.
wa_fcat-fieldname = ‘TELEPHONE’.
wa_fcat-ref_table = ‘SCUSTOM’.
wa_fcat-ref_field = ‘PHONE’.
APPEND wa_fcat TO it_fcat.

Outro detalhe interessante seria se no exemplo acima o campo na it_outtab fosse PHONE ao invés de TELEPHONE, como na tabela SCUSTOM, eu não precisaria preencher o campo REF_FIELD no field catalog. Veja como ficaria:

CLEAR wa_fcat.
wa_fcat-fieldname = ‘PHONE’.
wa_fcat-ref_table = ‘SCUSTOM’.
APPEND wa_fcat TO it_fcat.

Detalhes na Chamada do Método SET_TABLE_FOR_FIRST_DISPLAY

Preenchido o field catalog, precisamos passá-lo na chamada do método SET_TABLE_FOR_FIRST_DISPLAY:

CALL METHOD r_grid->set_table_for_first_display
EXPORTING
i_structure_name = ‘SFLIGHT’
CHANGING
it_outtab = it_sflight
it_fieldcatalog = it_fcat.

Repare que foi usado tanto o it_outtab quanto o i_structure_name. Isso porque parte das refências vêm da definição da tabela transparente SFLIGHT e parte da tabela interna do field catalog.

Ou seja, não precisamos preencher todos os campos do field catalog, mas somente os novos campos e os campos que queremos sobre escrever as características que foram referenciadas do dicionário (i_structure_name).

Anexos

NUGG_ZPURE_ALV_FIELDCAT.nugg

Veja Também

ABAP Control Exemples

ALV at SAP Help

 

1 Response

  1. December 7, 2014

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