REPORT z_cl_gui_docking_container.
* Hoje vou mostrar como criar um alv orientado a Objeto sem precisar
* criar nada na tela, o segredo disso tá na classe cl_gui_docking_container
* que irei mostrar abaixo. Vamos lá.
* Estruturas e tabelas internas
*&---------------------------------------------------------------------*
DATA :
t_out TYPE TABLE OF sflight,
t_fcat TYPE TABLE OF lvc_s_fcat,
st_layout TYPE lvc_s_layo
.
* Objetos
*&---------------------------------------------------------------------*
DATA :
o_docking TYPE REF TO cl_gui_docking_container,
o_alv TYPE REF TO cl_gui_alv_grid.
* Inicio do processo
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Seleção dos dados
PERFORM f_select_sflight.
* Chamada da tela que irá mostrar o ALV
CALL SCREEN 9999.
**&---------------------------------------------------------------------*
** Modules da tela 9999 criada acima.
*PROCESS BEFORE OUTPUT.
* MODULE status_9999.
* MODULE initial_9999.
*
*PROCESS AFTER INPUT.
* MODULE exit_command_9999 AT EXIT-COMMAND.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form F_FCAT_OO
*&---------------------------------------------------------------------*
FORM f_fcat_oo .
DATA :
lt_fcat TYPE TABLE OF slis_fieldcat_alv.
* Criação do catalogo de campo para o modo Estruturado.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = lt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc IS INITIAL.
* Conversão Estruturado x OO
CALL FUNCTION 'LVC_TRANSFER_FROM_SLIS'
EXPORTING
it_fieldcat_alv = lt_fcat
IMPORTING
et_fieldcat_lvc = t_fcat
TABLES
it_data = t_out
EXCEPTIONS
it_data_missing = 1
OTHERS = 2.
ENDIF.
ENDFORM. " F_FCAT_OO
*&---------------------------------------------------------------------*
*& Form F_LAYOUT
*&---------------------------------------------------------------------*
FORM f_layout .
st_layout-zebra = 'X'.
st_layout-cwidth_opt = 'X'.
ENDFORM. " F_LAYOUT
*&---------------------------------------------------------------------*
*& Module STATUS_9999 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_9999 OUTPUT.
SET PF-STATUS 'PF_9999'.
ENDMODULE. " STATUS_9999 OUTPUT
*&---------------------------------------------------------------------*
*& Module INITIAL_9999 OUTPUT
*&---------------------------------------------------------------------*
MODULE initial_9999 OUTPUT.
BREAK-POINT.
IF o_docking IS NOT BOUND.
* Aqui que encontramos a parte mais importante desse post, esse objeto
* docking que será criado terá a tela chamada(9999) como referencia,
* o parametro 'extension' será o tamanho do uso da tela.
CREATE OBJECT o_docking
EXPORTING
repid = sy-repid
dynnr = sy-dynnr
extension = 2000 " Tela Full rs " Extension
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
ENDIF.
IF o_alv IS NOT BOUND.
* Criação da catalogo de campos
PERFORM f_fcat_oo.
* Alimentação dos parametros do Layout do alv
PERFORM f_layout.
* Criação do alv com referencia no Objeto Docking criado anteriormente
CREATE OBJECT o_alv
EXPORTING
i_parent = o_docking " Parent Container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
* Exibição do alv
o_alv->set_table_for_first_display(
EXPORTING
i_save = 'A' " Save Layout
i_default = 'X' " Default Display Variant
is_layout = st_layout " Layout
CHANGING
it_outtab = t_out " Output Table
it_fieldcatalog = t_fcat " Field Catalog
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4
).
* Caso o alv já tenha sido criado
ELSE.
* Atualização do alv.
o_alv->refresh_table_display(
EXCEPTIONS
finished = 1
OTHERS = 2
).
ENDIF.
ENDMODULE. " INITIAL_9999 OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT_COMMAND_9999 INPUT
*&---------------------------------------------------------------------*
MODULE exit_command_9999 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " EXIT_COMMAND_9999 INPUT
*&---------------------------------------------------------------------*
*& Form F_SELECT_SFLIGHT
*&---------------------------------------------------------------------*
FORM f_select_sflight .
* Seleção simples
SELECT *
FROM sflight
INTO TABLE t_out
UP TO 100 ROWS.
ENDFORM. " F_SELECT_SFLIGHT
* Hoje vou mostrar como criar um alv orientado a Objeto sem precisar
* criar nada na tela, o segredo disso tá na classe cl_gui_docking_container
* que irei mostrar abaixo. Vamos lá.
* Estruturas e tabelas internas
*&---------------------------------------------------------------------*
DATA :
t_out TYPE TABLE OF sflight,
t_fcat TYPE TABLE OF lvc_s_fcat,
st_layout TYPE lvc_s_layo
.
* Objetos
*&---------------------------------------------------------------------*
DATA :
o_docking TYPE REF TO cl_gui_docking_container,
o_alv TYPE REF TO cl_gui_alv_grid.
* Inicio do processo
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Seleção dos dados
PERFORM f_select_sflight.
* Chamada da tela que irá mostrar o ALV
CALL SCREEN 9999.
**&---------------------------------------------------------------------*
** Modules da tela 9999 criada acima.
*PROCESS BEFORE OUTPUT.
* MODULE status_9999.
* MODULE initial_9999.
*
*PROCESS AFTER INPUT.
* MODULE exit_command_9999 AT EXIT-COMMAND.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form F_FCAT_OO
*&---------------------------------------------------------------------*
FORM f_fcat_oo .
DATA :
lt_fcat TYPE TABLE OF slis_fieldcat_alv.
* Criação do catalogo de campo para o modo Estruturado.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = lt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc IS INITIAL.
* Conversão Estruturado x OO
CALL FUNCTION 'LVC_TRANSFER_FROM_SLIS'
EXPORTING
it_fieldcat_alv = lt_fcat
IMPORTING
et_fieldcat_lvc = t_fcat
TABLES
it_data = t_out
EXCEPTIONS
it_data_missing = 1
OTHERS = 2.
ENDIF.
ENDFORM. " F_FCAT_OO
*&---------------------------------------------------------------------*
*& Form F_LAYOUT
*&---------------------------------------------------------------------*
FORM f_layout .
st_layout-zebra = 'X'.
st_layout-cwidth_opt = 'X'.
ENDFORM. " F_LAYOUT
*&---------------------------------------------------------------------*
*& Module STATUS_9999 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_9999 OUTPUT.
SET PF-STATUS 'PF_9999'.
ENDMODULE. " STATUS_9999 OUTPUT
*&---------------------------------------------------------------------*
*& Module INITIAL_9999 OUTPUT
*&---------------------------------------------------------------------*
MODULE initial_9999 OUTPUT.
BREAK-POINT.
IF o_docking IS NOT BOUND.
* Aqui que encontramos a parte mais importante desse post, esse objeto
* docking que será criado terá a tela chamada(9999) como referencia,
* o parametro 'extension' será o tamanho do uso da tela.
CREATE OBJECT o_docking
EXPORTING
repid = sy-repid
dynnr = sy-dynnr
extension = 2000 " Tela Full rs " Extension
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
ENDIF.
IF o_alv IS NOT BOUND.
* Criação da catalogo de campos
PERFORM f_fcat_oo.
* Alimentação dos parametros do Layout do alv
PERFORM f_layout.
* Criação do alv com referencia no Objeto Docking criado anteriormente
CREATE OBJECT o_alv
EXPORTING
i_parent = o_docking " Parent Container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
* Exibição do alv
o_alv->set_table_for_first_display(
EXPORTING
i_save = 'A' " Save Layout
i_default = 'X' " Default Display Variant
is_layout = st_layout " Layout
CHANGING
it_outtab = t_out " Output Table
it_fieldcatalog = t_fcat " Field Catalog
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4
).
* Caso o alv já tenha sido criado
ELSE.
* Atualização do alv.
o_alv->refresh_table_display(
EXCEPTIONS
finished = 1
OTHERS = 2
).
ENDIF.
ENDMODULE. " INITIAL_9999 OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT_COMMAND_9999 INPUT
*&---------------------------------------------------------------------*
MODULE exit_command_9999 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " EXIT_COMMAND_9999 INPUT
*&---------------------------------------------------------------------*
*& Form F_SELECT_SFLIGHT
*&---------------------------------------------------------------------*
FORM f_select_sflight .
* Seleção simples
SELECT *
FROM sflight
INTO TABLE t_out
UP TO 100 ROWS.
ENDFORM. " F_SELECT_SFLIGHT