sexta-feira, 17 de janeiro de 2014

Trocando Telas por Subtelas


* Um dia desses foi solicitado para que eu fizesse um programa que mostrasse
* o resultado em um ALV na mesma tela que a tela de seleção, já veio na
* cabeça, entrar no layout da Tela e desenhar todos os parametros que
* seriam necessários para o resultado correto... Mas aí eu lembrei de um
* jeito bem Maroto de resolver, que é colocando uma SubScreen na Tela e
* assim eu não precisaria desenhar nada, somente criar um selectio-screen
* normal e declarar ele como uma Subscreen, e depois na tela chamar como
* o exemplo abaixo. A vantagem disso é a velocidade de desenvolvimento, pois
* não precisará ficar desenhando cada parametro de entrada das seleções na Tela.

REPORT z_call_subscreen.

DATA :
  it_spfli  
TYPE TABLE OF spfli,
  st_layout 
TYPE lvc_s_layo.

DATA:
  o_alv       
TYPE REF TO cl_gui_alv_grid,
  o_container 
TYPE REF TO cl_gui_custom_container.

SELECTION-SCREEN BEGIN OF SCREEN 0100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS :
  p_carrid 
TYPE s_carr_id.
SELECTION-SCREEN END OF BLOCK   b1.
SELECTION-SCREEN END OF SCREEN 0100.

START-OF-SELECTION.

* Primeiramente vamos chamar nossa Screen.
  
CALL SCREEN 9000.

*  Agora vamos criar os objetos desse tela.





* Veja as configurações.





*A logica colocada na Tela será essa. Reparem na Call subscreen
*&---------------------------------------------------------------------*
*PROCESS BEFORE OUTPUT.
* MODULE STATUS_9000.
* CALL SUBSCREEN SUB INCLUDING SY-REPID '0100'.
*
*PROCESS AFTER INPUT.
* MODULE USER_COMMAND_9000.
* CALL SUBSCREEN SUB.
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  
SET PF-STATUS 'DEFAULT'.
*  SET TITLEBAR 'xxx'.

* A parte do ALV orientado vcs já sabem, espero eu.... Se não sabem veja
* Link abaixo.
*http://abapjuniores.blogspot.com.br/2012/03/alv-oo-orientado-objeto.html
  
PERFORM alv.

ENDMODULE.                 " STATUS_9000  OUTPUT

*&---------------------------------------------------------------------*
*&      Form  ALV
*&---------------------------------------------------------------------*
FORM alv .

  
SELECT *
    
FROM spfli
    
INTO TABLE it_spfli
    
WHERE carrid p_carrid.

  
IF o_alv IS BOUND.
    o_alv
->free( ).
  
ENDIF.

  
IF o_container IS NOT BOUND.
    
CREATE OBJECT o_container
      
EXPORTING
        container_name 
'CCONTAINER'.
  
ENDIF.

  
CREATE OBJECT o_alv
    
EXPORTING
      i_parent 
o_container.    " Parent Container

  st_layout
-cwidth_opt 'X'.
  st_layout
-zebra 'X'.

  
CALL METHOD o_alv->set_table_for_first_display
    
EXPORTING
      i_structure_name 
'SPFLI'
      is_layout        
st_layout
    
CHANGING
      it_outtab        
it_spfli.

ENDFORM.                    " ALV

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_9000 INPUT.

  
CASE sy-ucomm.
    
WHEN 'BACK'.
      
LEAVE TO SCREEN 0.
    
WHEN 'EXIT'.
      
LEAVE TO SCREEN 0.
    
WHEN 'CANCEL'.
      
LEAVE PROGRAM.
    
WHEN OTHERS.
  
ENDCASE.

ENDMODULE.                 " USER_COMMAND_9000  INPUT

3 comentários:

  1. Mauro tudo bem? Por favor estou estudando abap, fiz um curso e estudo em casa diariamente.
    Fiz um programa o qual é uma seleção de cardapio de um restaurante, quando abre o programa ele pede para definir qual o dia da semana, e queria saber como posso chamar outra tela após isto, pois voce irá processar o programa, ou seja, entendo que tenho de definir o sy-ucomm com esta info correto? Ou tem outra maneira de fazer isto?

    ResponderExcluir
  2. Cria essa primeira tela como 'Modal Dialog Box' na Screen Type que fica na 'Atributos' da sua tela, na hora de chamar no programa coloque o comando 'CALL SCREEN 9zzz STARTING AT 25 15', isso fará ele abrir igual PopUp, e depois trabalhe no PAI dessa tela indicado Pelo Sy-ucomm, não deve ser dificil, mas pra trabalhar com telas, é como eu sempre digo, tem que ter bem claro a idéia de PBO e PAI.

    ResponderExcluir
  3. Boa tarde,
    Nesse exemplo como faria para colocar uma ajuda de pesquisa no parâmetro de seleção p_carrid?? Tentei utilizando matchcode mas não funciona na subtela.

    ResponderExcluir