ABAP 101

ABAP | Ruby on Rails | Programação

ABAP 101 header image 2

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

August 23rd, 2009 · No Comments

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:

DATA: r_container TYPE REF TO cl_gui_custom_container,
r_grid TYPE REF TO cl_gui_alv_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:

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

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

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

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

SELECT * FROM sflight INTO TABLE it_sflight.

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:


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 uma tabela interna e work area para a tabela de field catalog:

DATA: it_fcat TYPE lvc_t_fcat,
wa_fcat LIKE LINE OF it_fcat.

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:
CALL SCREEN 0100.

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′.

module STATUS_0100 output.
SET PF-STATUS ‘PF0100′.
* SET TITLEBAR ‘xxx’.
endmodule. ” STATUS_0100 OUTPUT

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:

MODULE user_command_0100 INPUT.
IF sy-ucomm = ‘BACK’.
LEAVE TO SCREEN 0.
ENDIF.
ENDMODULE. ” USER_COMMAND_0100 INPUT

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:

CREATE OBJECT r_container
EXPORTING
container_name = ‘CONTAINER1′
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.

CREATE OBJECT r_grid
EXPORTING
i_parent = r_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.

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

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

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


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

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

ZPURE_ALV_FIELDCAT.txt
ZPURE_ALV_FIELDCAT_INCL.txt

Veja Também

ABAP Control Exemples

ALV at SAP Help

Tags: ALV · Receita ABAP

0 responses so far ↓

  • There are no comments yet...Kick things off by filling out the form below.

Leave a Comment