segunda-feira, 26 de junho de 2017

Função - REUSE_ALV_POPUP_TO_SELECT

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.


 
Comentários
0 Comentários

Nenhum comentário:

Postar um comentário