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

0 responses so far ↓
There are no comments yet...Kick things off by filling out the form below.
Leave a Comment