REPORT zreuse_alv_popup_to_select.
*--------------------------------------------------------------------*
* Fala pessoal, hoje irei mostrar algo que facilita muito escolhas de
* registro em massa em um ALV, para fazer isso usarei a função
* 'REUSE_ALV_POPUP_TO_SELECT' que irá exibir todas as opções de seleção
* em massa.
* Estarei trabalhando com um exemplo simples que trará todos os objetos
* criados pelo usuário que executar o programa.
* A lista de opções de seleção de linhas do ALV será criada baseada nos
* tipos de objetos ( TADIR-OBJECT ).
* Espero que gostem desse metodo que ajudará muito na seleção de linhas
* do ALV, onde além de fazer linha por linha, será feito conforme range
* definido no PopUP.
* Segue no final do código os prints do processo.
* Valeo.
* Tipos.
TYPES :
BEGIN OF ty_tadir,
selected.
INCLUDE TYPE tadir.
TYPES :
END OF ty_tadir.
TYPES :
BEGIN OF ty_popup,
select,
text(50),
END OF ty_popup.
* Tabela global.
DATA :
gt_popup TYPE TABLE OF ty_popup.
* Variaveis referente ao ALVV
DATA :
* Objetos
o_docking TYPE REF TO cl_gui_docking_container,
o_grid TYPE REF TO cl_gui_alv_grid,
* Tabelas internas
gt_tadir TYPE TABLE OF ty_tadir,
gt_fieldcat TYPE TABLE OF lvc_s_fcat,
gt_exclude TYPE TABLE OF ui_func,
* Estruturas
gs_layout TYPE lvc_s_layo.
* Ranges
DATA :
r_object TYPE RANGE OF char20.
* Inicio do processo.
START-OF-SELECTION.
* Quando criarem a tela do ALV ( 9001 ) coloquem o código abaixo na tela.
*--------------------------------------------------------------------*
*PROCESS BEFORE OUTPUT.
* MODULE :
* status_9001,
* inicialization_9001.
*
*PROCESS AFTER INPUT.
* MODULE :
* user_command_9001.
*--------------------------------------------------------------------*
* Tela ALV principal.
CALL SCREEN 9001.
*&---------------------------------------------------------------------*
*& Form POPUP_COM_MULTIPLA_ESCOLHA
*&---------------------------------------------------------------------*
FORM popup_com_multipla_escolha .
DATA :
ls_popup LIKE LINE OF gt_popup,
lt_fcat_popup TYPE TABLE OF slis_fieldcat_alv,
ls_fcat_popup LIKE LINE OF lt_fcat_popup,
lt_excl TYPE slis_t_extab,
ls_excl TYPE slis_extab,
ls_object LIKE LINE OF r_object.
* Catalogo de campos do PopUp de opções.
ls_fcat_popup-tabname = 'LT_POPUP'.
ls_fcat_popup-col_pos = '1'.
ls_fcat_popup-fieldname = 'SELECT'.
ls_fcat_popup-seltext_m = 'SELECT'.
APPEND ls_fcat_popup TO lt_fcat_popup.
ls_fcat_popup-col_pos = '2'.
ls_fcat_popup-fieldname = 'TEXT'.
ls_fcat_popup-seltext_m = 'Status'.
ls_fcat_popup-outputlen = 50.
APPEND ls_fcat_popup TO lt_fcat_popup.
* Exclusão dos botões padrões do ALV.
ls_excl-fcode = '&ETA'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '%SC'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '%SC+'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&OUP'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&ODN'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&ILT'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&OL0'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&CRB'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&CRL'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&CRR'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&CRE'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&ALL'. APPEND ls_excl TO lt_excl.
ls_excl-fcode = '&SAL'. APPEND ls_excl TO lt_excl.
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'Tipos de Objetos'
i_zebra = abap_true
i_screen_start_column = 1
i_screen_start_line = 1
i_checkbox_fieldname = 'SELECT'
i_tabname = 'LT_POPUP'
it_fieldcat = lt_fcat_popup
it_excluding = lt_excl
TABLES
t_outtab = gt_popup
EXCEPTIONS
program_error = 1
OTHERS = 2.
FREE r_object.
IF gt_popup[] IS NOT INITIAL.
LOOP AT gt_popup INTO ls_popup.
IF ls_popup-select = abap_true..
ls_object-sign = 'I'.
ls_object-option = 'EQ'.
ls_object-low = ls_popup-text.
APPEND ls_object TO r_object.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
SET PF-STATUS 'PF_9001'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INICIALIZATION_9001 OUTPUT
*&---------------------------------------------------------------------*
MODULE inicialization_9001 OUTPUT.
IF o_grid IS NOT BOUND.
* seleção dos objetos do usuário que está processando o programa.
SELECT * FROM tadir
INTO CORRESPONDING FIELDS OF TABLE gt_tadir
WHERE author = sy-uname.
* Popula o range do popup de objetos.
PERFORM popula_range.
* Criação de do Objeto docking que vai a tela alv
CREATE OBJECT o_docking
EXPORTING
repid = sy-repid
dynnr = '9001'
extension = 9999
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
* ALV
CREATE OBJECT o_grid
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.
PERFORM add_fieldcatalog_alv_9001 USING :
* Col fname tabname texto "Edit "No_out "CheckBox
'1' 'SELECTED' 'GT_TADIR' 'Seleção' abap_true abap_false abap_true,
'2' 'OBJECT' 'GT_TADIR' 'Tipo' abap_false abap_false abap_false,
'3' 'OBJ_NAME' 'GT_TADIR' 'Nome' abap_false abap_false abap_false,
'4' 'KORRNUM' 'GT_TADIR' 'Ordem' abap_false abap_false abap_false,
'5' 'SRCSYSTEM' 'GT_TADIR' 'Sistema' abap_false abap_false abap_false,
'6' 'DEVCLASS' 'GT_TADIR' 'Pacote' abap_false abap_false abap_false.
gs_layout-zebra = abap_true.
gs_layout-cwidth_opt = abap_true.
* Exibe alv
o_grid->set_table_for_first_display(
EXPORTING
is_layout = gs_layout " Layout
it_toolbar_excluding = gt_exclude " Excluded Toolbar Standard Functions
CHANGING
it_outtab = gt_tadir " Output Table
it_fieldcatalog = gt_fieldcat " Field Catalog
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4
).
ELSE.
o_grid->refresh_table_display( ).
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form ADD_FIELDCATALOG_ALV_9001
*&---------------------------------------------------------------------*
FORM add_fieldcatalog_alv_9001 USING
col_pos TYPE lvc_s_fcat-col_pos
fieldname TYPE lvc_s_fcat-fieldname
tabname TYPE lvc_s_fcat-tabname
descricao TYPE lvc_s_fcat-scrtext_s
edit TYPE lvc_s_fcat-edit
no_out TYPE lvc_s_fcat-no_out
checkbox TYPE lvc_s_fcat-checkbox.
DATA :
ls_fieldcat LIKE LINE OF gt_fieldcat.
ls_fieldcat-col_pos = col_pos.
ls_fieldcat-fieldname = fieldname.
ls_fieldcat-tabname = tabname.
ls_fieldcat-scrtext_s = ls_fieldcat-scrtext_m = ls_fieldcat-scrtext_l =
descricao.
ls_fieldcat-edit = edit.
ls_fieldcat-no_out = no_out.
ls_fieldcat-checkbox = checkbox.
APPEND ls_fieldcat TO gt_fieldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
* Atualiza a tabela com as alterações
o_grid->check_changed_data( ).
CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN 'MALL'. " Marca todos
PERFORM marca_todos_alv.
WHEN 'DALL'. " Desmarca Todos.
PERFORM desmarcar_todos_alv.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form DESMARCAR_TODOS_ALV
*&---------------------------------------------------------------------*
FORM desmarcar_todos_alv .
FIELD-SYMBOLS :
<tadir> LIKE LINE OF gt_tadir.
* Atualiza a tabela com as alterações
o_grid->check_changed_data( ).
LOOP AT gt_tadir ASSIGNING <tadir>.
<tadir>-selected = abap_false.
ENDLOOP.
o_grid->refresh_table_display( ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form MARCA_TODOS_ALV
*&---------------------------------------------------------------------*
FORM marca_todos_alv .
FIELD-SYMBOLS :
<tadir> LIKE LINE OF gt_tadir.
DATA :
lv_all TYPE i,
lv_count TYPE i.
* PopUp com todas as opções de status para identificar quais selecionar
PERFORM :
popup_com_multipla_escolha.
lv_all = lines( gt_tadir ).
IF r_object[] IS NOT INITIAL.
LOOP AT gt_tadir ASSIGNING <tadir>.
IF <tadir>-object IN r_object.
<tadir>-selected = abap_true.
ADD 1 TO lv_count.
ELSE.
<tadir>-selected = abap_false.
ENDIF.
ENDLOOP.
gs_layout-grid_title = `Foram selecionadas ` && lv_count &&
`/` && lv_all && ` registros!`.
o_grid->set_frontend_layout( gs_layout ).
o_grid->refresh_table_display( ).
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form POPULA_RANGE
*&---------------------------------------------------------------------*
FORM popula_range .
DATA :
lt_tadir TYPE TABLE OF ty_tadir,
ls_tadir LIKE LINE OF lt_tadir,
ls_popup LIKE LINE OF gt_popup.
lt_tadir[] = gt_tadir[].
SORT lt_tadir BY object.
DELETE ADJACENT DUPLICATES FROM lt_tadir
COMPARING object.
LOOP AT lt_tadir INTO ls_tadir.
ls_popup-select = abap_true.
ls_popup-text = ls_tadir-object.
COLLECT ls_popup INTO gt_popup.
ENDLOOP.
ENDFORM.