Buttons and events in ALV GRID and ALV GRID OO


Hola amigos en esta oportunidad vamos a mostrar como añadir botones en 2 tipos de ALV 
1. REUSE ALV GRID DISPLAY
2. ALV Orientado a Objetos         

A estos botones le daremos eventos de manera que al hacer click en cada uno de ellos ejecute y/o muestre alguna funcionalidad, como complemento a este DEMO se verán muchas más funcionalidades y técnicas de programación en ABAP que nos serán de gran utilidad para diversos proyectos. 

Para los datos la tabla de ejemplo que utlizaremos será: SFLIGHT

Veamos:
Creamos el programa de ejemplo: ZAQR017

*&--------------------------------------------------------------------*
* PROGRAMA    : ZAQR017                                                        
* TITULO      :  Interacción con 2 tipos de ALV                              
* AUTOR       : MAGALEXSIS                                                      
* FECHA       : Julio 2013                                                                
*&--------------------------------------------------------------------*

REPORT  ZAQR017.
include zaqr017cla.
include zaqr017top.
include zaqr017mai.
include zaqr017pbo.
include zaqr017pai.
include zaqr017f01.



*&---------------------------------------------------------------------*
*&  Include           ZAQR017TOP
*&---------------------------------------------------------------------*

************************************************************************
*Declaration internal tables                                           *
************************************************************************
datagt_sflight type standard table of sflight.

************************************************************************
*Delaration field-symbols                                              *
************************************************************************
field-symbols: <sflight>  like line of gt_sflight.


************************************************************************
*Declaration ALV's  internal tables                                    *
************************************************************************
data:
gt_fieldcat type slis_t_fieldcat_alv" Catálogo ALV Reuse...
gt_fcat_oo  type lvc_t_fcat,          " Catálogo ALV OO
gt_header   type slis_t_listheader,   " Cabecera ALV
gt_event    type slis_t_event,        " Evento
gt_sort     type slis_t_sortinfo_alv" Ordenamiento
gt_sort_oo  type lvc_t_sort.          " Ordenamiento ALV OO

************************************************************************
*Declaration ALV's  structures                                         *
************************************************************************
data:
gs_layout  type slis_layout_alv" Diseño ALV REUSE
gs_layo_oo type lvc_s_layo,      " Diseño ALV OO
gs_variant type disvariant.      " Variante visual.(uso externo)

************************************************************************
*Declaration ALV's  ref to                                             *
************************************************************************
data

      go_cc_alv_oo    type ref to cl_gui_custom_container,
      go_cc_header    type ref to cl_gui_custom_container,
      go_title        type ref to cl_gui_alv_tree_simple,
      go_grid_oo      type ref to cl_gui_alv_grid,
      go_evt_receiver type ref to lcl_event_receiver.

************************************************************************
*Declaration ALV's  global variables                                   *
************************************************************************
data: gv_title    type lvc_title.     "Título

************************************************************************
*Declaration ALV's  constants                                          *
************************************************************************
"CUIDADO AQUI! Al definir estos valores...
*TIENEN QUE EXISTIR los PERFORM respectivos segun el valor
constants:
 gc_status    type slis_formname value 'PF_STATUS',
 gc_ucommand  type slis_formname value 'USER_COMMAND',


 gc_header    type scrfname      value 'CC_HEADER',
 gc_alv       type scrfname      value 'CC_ALV'.

************************************************************************
*Declaration constants                                                 *
************************************************************************
constants:
gc_x      type value 'X'.



*&---------------------------------------------------------------------*
*&  Include           ZAQR017MAI
*&---------------------------------------------------------------------*

************************************************************************
* START-OF-SELECTION                                                   *
************************************************************************
start-of-selection.
  perform get_data.
  perform show_data.



*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
 

form get_data.
  select *
    into table gt_sflight
    from sflight.
endform.                    " GET_DATA

*&---------------------------------------------------------------------*
*&      Form  SHOW_DATA
*&---------------------------------------------------------------------*
 

form show_data .
  perform init_layout.
  perform build_fieldcat.
  perform set_top_of_page.
  perform set_event.
  perform call_alv.
endform.                    " SHOW_DATA

*&---------------------------------------------------------------------*
*&      Form  INIT_LAYOUT
*&---------------------------------------------------------------------*
 

form init_layout .
  gs_layout-zebra             'X'.
  gs_layout-colwidth_optimize 'X'.
endform.                    " INIT_LAYOUT

*El form build_fieldcat lo voy a mostrar como imagen ya q su contenido es muy ancho que si lo pongo aqui como texto se va ha descuadrar. veamos:


Los textos de selección:

*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT
*&---------------------------------------------------------------------*

form set_fieldcat  using    
                            pi_colpos
                            pi_fieldname
                            pi_ref_fieldname
                            pi_ref_tabname
                            pi_key
                            pi_cfieldname
                            pi_outputlen
                            pi_noout
                            pi_seltext_m
                            pi_seltext_l
                            pi_seltext_s
                            pi_reptext_ddic
                            pi_ddictxt
                            pi_hotspot
                            pi_showasicon
                            pi_checkbox
                            pi_edit
                            pi_dosum
                            pi_mask      type slis_edit_mask
                            pi_fieldcat  type slis_t_fieldcat_alv.

  datals_fieldcat type slis_fieldcat_alv.

  clear ls_fieldcat.
* General settings
  ls_fieldcat-col_pos    pi_colpos.
  ls_fieldcat-fieldname  pi_fieldname.
  ls_fieldcat-key        pi_key.
  ls_fieldcat-no_out     pi_noout.
  ls_fieldcat-hotspot    pi_hotspot.
  ls_fieldcat-checkbox   pi_checkbox.
  ls_fieldcat-icon       pi_showasicon.
  ls_fieldcat-do_sum     pi_dosum.
  ls_fieldcat-cfieldname pi_cfieldname.

* Set reference fieldname, tablenam and rollname.
  if pi_ref_tabname is initial.
    ls_fieldcat-rollname        =  pi_ref_fieldname.
  else.
    ls_fieldcat-ref_tabname     =  pi_ref_tabname.
    if pi_ref_fieldname eq space.
      ls_fieldcat-ref_fieldname =  ls_fieldcat-fieldname.
    else.
      ls_fieldcat-ref_fieldname =  pi_ref_fieldname.
    endif.
  endif.

* set output length.
  if not pi_outputlen is initial.
    ls_fieldcat-outputlen pi_outputlen.
  endif.

  if pi_seltext_s is initial.
* Set text headers.
    if not pi_seltext_m is initial.
      ls_fieldcat-seltext_m pi_seltext_m.
    endif.

    if not pi_seltext_l is initial.
      ls_fieldcat-seltext_l pi_seltext_l.
    endif.

    if not pi_seltext_s is initial.
      ls_fieldcat-seltext_s pi_seltext_s.
    endif.

    if not pi_reptext_ddic is initial.
      ls_fieldcat-reptext_ddic pi_reptext_ddic.
    endif.

    if not pi_ddictxt is initial.
      ls_fieldcat-ddictxt pi_ddictxt.
    endif.
  endif.

* Set as editable or not.
  if pi_edit is not initial.
    ls_fieldcat-input 'X'.
    ls_fieldcat-edit  'X'.
  endif.

  append ls_fieldcat to gt_fieldcat.
endform.                    " SET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  SET_TOP_OF_PAGE
*&---------------------------------------------------------------------*
form set_top_of_page .
  datals_header type slis_listheader.

* Report title
  cleargt_header[].

  clear ls_header.
  ls_header-typ  'H'.
  ls_header-info sy-title.
  append ls_header to gt_header.

* User who is running the report
  clear ls_header.
  ls_header-typ 'S'.
  ls_header-key 'User: '.
  ls_header-info sy-uname.
  append ls_header to gt_header.

* Date of execution
  clear ls_header.
  ls_header-typ 'S'.
  ls_header-key 'Date: '.
  write sy-datum to ls_header-info.
  append ls_header to gt_header.

* Time of execution
  clear ls_header.
  ls_header-typ 'S'.
  ls_header-key 'Time: '.
  write sy-uzeit to ls_header-info.
  append ls_header to gt_header.
endform.                    " SET_TOP_OF_PAGE

*&---------------------------------------------------------------------*
*&      Form  SET_EVENT
*&---------------------------------------------------------------------*

form set_event .
  datals_event  type line of slis_t_event.
*Top of page event
*Al definir ls_event-form TIENE QUE EXISTIR UN PERFORM con el mismo nombre: 'TOP_OF_PAGE'
  ls_event-name slis_ev_top_of_page.
  ls_event-form 'TOP_OF_PAGE'.
  append ls_event to gt_event.
endform.                    " SET_EVENT

*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
 

form top_of_page.
  call function 'REUSE_ALV_COMMENTARY_WRITE'
    exporting
      it_list_commentary gt_header.
endform.                    " alv_top_of_page

*&---------------------------------------------------------------------*
*&      Form  CALL_ALV
*&---------------------------------------------------------------------*
 

form call_alv .
  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program       sy-repid
      it_fieldcat              gt_fieldcat[]
      is_layout                gs_layout
      it_sort                  gt_sort
      i_callback_pf_status_set gc_status   "call perform PF_STATUS
      i_callback_user_command  gc_ucommand "call perform USER_COMMAND
      i_save                   gc_x
      it_events                gt_event
      i_grid_title             gv_title
    tables
      t_outtab                 gt_sflight
    exceptions
      program_error            1
      others                   2.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
    with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
endform.                    " CALL_ALV

*&---------------------------------------------------------------------*
*&      Form  PF_STATUS
*&---------------------------------------------------------------------*
*smp_dyntxt
*Menu Painter: Interfase programa para textos dinámicos
*&---------------------------------------------------------------------*
form pf_status using func_exclude type slis_t_extab.

  data fcode_attrib_tab like smp_dyntxt occurs with header line.

  clearfcode_attrib_tabfcode_attrib_tab[].

  "creating buttons 1 "SY-UCOMM = FC01
  fcode_attrib_tab-text      text-010.
  fcode_attrib_tab-icon_id   '@15@'."ICON_EXECUTE_OBJECT "Ejecutar
  fcode_attrib_tab-icon_text text-010.
  fcode_attrib_tab-quickinfo space.
  fcode_attrib_tab-path      space.
  append fcode_attrib_tab.

  "creating buttons 2 "SY-UCOMM = FC02
  fcode_attrib_tab-text      text-011.
  fcode_attrib_tab-icon_id   '@DH@'."ICON_PROTOCOL  "Agradecimientos
  fcode_attrib_tab-icon_text text-011.
  fcode_attrib_tab-quickinfo space.
  fcode_attrib_tab-path      space.
  append fcode_attrib_tab.

  "creating buttons 3 "SY-UCOMM = FC03
  fcode_attrib_tab-text      text-012.
  fcode_attrib_tab-icon_id   '@39@'."ICON_GENERATE "ALV OO
  fcode_attrib_tab-icon_text text-012.
  fcode_attrib_tab-quickinfo space.
  fcode_attrib_tab-path      space.
  append fcode_attrib_tab.

  perform dynamic_report_fcodes(rhteiln0) tables fcode_attrib_tab
                                                                       using  func_exclude
                                                                                       ' '
                                                                                        ' '.
  set pf-status 'ALVLIST' excluding func_exclude  of program 'RHTEILN0'.


endform.                    "PF_STATUS
*&------------------------------------------------------------------------------------------------*


Aqui hacemos una pausa para explicar el uso de las siguientes líneas de código:
*-----------------------------------------------------------------------------------------------------*
  perform dynamic_report_fcodes(rhteiln0) tables fcode_attrib_tab
                                                                       using  func_exclude
                                                                                       ' '
                                                                                        ' '.
  set pf-status 'ALVLIST' excluding func_exclude  of program 'RHTEILN0'.

*-----------------------------------------------------------------------------------------------------*

Para  nuestro caso en el toolbar de nuestro ALV nos serviremos de un programa ya existente en SAP la cual tiene por nombre: RHTEILN0.

Si vemos en la sección Status GUI de este programa tenemos al standard status ALVLIST donde podremos apreciar todos las funciones genéricas que se visualizarán en la barra de herramientas de nuestro ALV


Quizá te sigas preguntando, pero... En que momento se llama a la rutina PF_STATUS?

Dentro de la rutina CALL_ALV se llama a la función REUSE_ALV_GRID_DISPLAY este a su vez para manejar el tema del status del ALV en nuestro caso invoca al método llamado PF_STATUS

Dentro de la rutina PF_STATUS vemos que ya por defecto viene lleno la tabla func_exclude con 39 registros:

La cual a continuación las voy a listar para que sepas cuáles son:

  1. &VGRID
  2. &VCRYSTAL
  3. &VLOTUS
  4. %ML
  5. &LIS
  6. &LFO
  7. &NFO
  8. &CRB
  9. &CRE
  10. &CRR
  11. &CRL
  12. &OL1
  13. &OL2
  14. &OL3
  15. &OL4
  16. &OL5
  17. &XML
  18. &COUNT
  19. &FG_SUBTOT
  20. &SUM
  21. &AUF
  22. &ILD
  23. P--
  24. P-
  25. P++
  26. P+
  27. %SC+
  28. &XINT
  29. &EB1
  30. &EB3
  31. &EB9
  32. &EBA
  33. &EBB
  34. &EBC
  35. &EBD
  36. &EBN
  37. &CRTEMPL
  38. &CRDESIG
  39. &CRBATCH


En nuestro caso, en FCODE_ATTRIB_TAB estamos agregando 3 nuevas funciones (Ejecutar, Agradecimientos y ALV OO) que al ejecutar el reporte se visualizarán en la barra de herramientas de nuestro ALV.

Luego de ejecutar la sentencia de código:
perform dynamic_report_fcodes(rhteiln0tables fcode_attrib_tab
                                          using  func_exclude
                                                 ' '
                                                 ' '.



veremos que se actualizado la cantidad de registros de nuestro tabla func_exclude a 42 registros:


La cual a continuación las voy a listar para que sepas cuáles son:

  1. &VGRID
  2. &VCRYSTAL
  3. &VLOTUS
  4. %ML
  5. &LIS
  6. &LFO
  7. &NFO
  8. &CRB
  9. &CRE
  10. &CRR
  11. &CRL
  12. &OL1
  13. &OL2
  14. &OL3
  15. &OL4
  16. &OL5
  17. &XML
  18. &COUNT
  19. &FG_SUBTOT
  20. &SUM
  21. &AUF
  22. &ILD
  23. P--
  24. P-
  25. P++
  26. P+
  27. %SC+
  28. &XINT
  29. &EB1
  30. &EB3
  31. &EB9
  32. &EBA
  33. &EBB
  34. &EBC
  35. &EBD
  36. &EBN
  37. &CRTEMPL
  38. &CRDESIG
  39. &CRBATCH
  40. FC04
  41. DNOT
  42. CNOT

Si observamos la lista, notamos que se han añadido 3 nuevos códigos función (FC04, DNOT y CNOT) que hacen referencia a los códigos de función: 'Ejecutar', 'Agradecimientos' y 'ALV OO' respectivamente.

seguidamente la siguiente línea de código:

set pf-status 'ALVLIST' excluding func_exclude  of program 'RHTEILN0'.

De los 42 registros que ahora existen en FUNC_EXCLUDE va excluir aquellos que no existen en el estatus ALVLIST del programa RHTEILN0
 

Y nuestros códigos de funciones que hemos añadido, según el orden ocuparon los espacios de FC01, FC02 y FC03 para 'Ejecutar', 'Agradecimientos' y 'ALV OO' respectivamente.


*&------------------------------------------------------------------------------------------------*
*&      Form  user_command
*&------------------------------------------------------------------------------------------------*
* Interactuamos con los botones del ALV principal (parte superior derecha)
*&------------------------------------------------------------------------------------------------* form user_command using r_ucomm     like sy-ucomm
                                            rs_selfield type slis_selfield.

  case r_ucomm.
    when 'FC01'"Cuando hace click en el botón 'Ejecutar'
      perform ejecutar using rs_selfield.
    when 'FC02'"Cuando hace click en el botón 'Agradecimientos'
      perform agradecimientos.
    when 'FC03'"Cuando hace click en el botón 'ALV OO'
      perform alv_oo.
  endcase.
endform.                    "user_command

*&------------------------------------------------------------------------------------------------* 
Hasta aqui ya podemos ejecutar el reporte y se visualizará asi:


Interactuaremos con el botón: 'Ejecutar'

Veamos internamente en el código la funcionalidad que he puesto como a modo de ejemplo:

*&---------------------------------------------------------------------*

*&      Form  EJECUTAR

*&---------------------------------------------------------------------*

form ejecutar using rs_selfield type slis_selfield.

  call function 'REUSE_ALV_POPUP_TO_SELECT'
    exporting
      i_title                 'REUSE_ALV_POPUP_TO_SELECT'
      i_selection             ' '
      i_zebra                 'X'
      i_tabname               'GT_SFLIGHT'
      it_fieldcat             gt_fieldcat
      i_callback_program      sy-repid
      i_callback_user_command gc_ucommand "call perform USER_COMMAND
    importing
      es_selfield             rs_selfield
    tables
      t_outtab                gt_sflight
    exceptions
      program_error           1
      others                  2.

endform.                    " EJECUTAR


Como resultado de hacer click en el botón Ejecutar, tendremos lo siguiente:

Ahora interactuaremos con el botón: 'Agradecimientos'
Veamos internamente en el código su funcionalidad que he puesto como a modo de ejemplo:

*&---------------------------------------------------------------------*

*&      Form  AGRADECIMIENTOS

*&---------------------------------------------------------------------*

form agradecimientos .

  datalv_msg type shkontext-meldung.
  lv_msg 'Gracias Xurand Gomez por haber permitido dar inicio a este Post.'.
  call function 'MESSAGE_TEXT_DISPLAY_WITH_PARA'
    exporting
      text lv_msg.

endform.                    " AGRADECIMIENTOS



 Como resultado de hacer click en el botón Agradecimientos, tendremos lo siguiente :)


 Ahora interactuaremos con el botón: 'ALV OO'

Aqui bastante atención!!!
 Ya que fácilmente todo esta parte que veremos a continuación podríamos ponerlo en otro programa aparte, en la cual trabajemos sólo con ALV OO.

Veamos el código:

*&---------------------------------------------------------------------*
*&      Form  ALV_OO
*&---------------------------------------------------------------------*
form alv_oo .
 
  perform show_data_alv_oo.
  call screen 0100.
endform.                    " ALV_OO

*&---------------------------------------------------------------------*
*&      Form  SHOW_DATA_ALV_OO
*&---------------------------------------------------------------------*
 
form show_data_alv_oo .
  perform init_layout_alv_oo.
  perform build_fieldcat_alv_oo.
  perform call_alv_oo.
endform.                    " SHOW_DATA_ALV_OO

*&---------------------------------------------------------------------*
*&      Form  INIT_LAYOUT_ALV_OO
*&---------------------------------------------------------------------*
 
form init_layout_alv_oo .
  gs_layo_oo-sel_mode    'A'.
  gs_layo_oo-cwidth_opt  'X'.
  gs_layo_oo-no_rowmark  'X'.
endform.                    " INIT_LAYOUT_ALV_OO

*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT_ALV_OO
*&---------------------------------------------------------------------*
form build_fieldcat_alv_oo .


datals_fcat type lvc_s_fcat,
         lv_pos  type i.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'CARRID'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'CARRID'.
  ls_fcat-col_pos   lv_pos.
  ls_fcat-key       'X'.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'CONNID'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'CONNID'.
  ls_fcat-col_pos   lv_pos.
  ls_fcat-key       'X'.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'FLDATE'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'FLDATE'.
  ls_fcat-col_pos   lv_pos.
  ls_fcat-key       'X'.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'PRICE'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'PRICE'.
  ls_fcat-col_pos   lv_pos.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'CURRENCY'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'CURRENCY'.
  ls_fcat-col_pos   lv_pos.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'PLANETYPE'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'PLANETYPE'.
  ls_fcat-col_pos   lv_pos.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'SEATSMAX'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'SEATSMAX'.
  ls_fcat-col_pos   lv_pos.
  append ls_fcat to gt_fcat_oo.

  clear ls_fcat.
  ls_fcat-tabname   'GT_SFLIGHT'.
  ls_fcat-fieldname 'SEATSOCC'.
  ls_fcat-ref_table 'SFLIGHT'.
  ls_fcat-ref_field 'SEATSOCC'.
  ls_fcat-col_pos   lv_pos.
  append ls_fcat to gt_fcat_oo.
endform.                    " BUILD_FIELDCAT_ALV_OO

*&---------------------------------------------------------------------*

*&      Form  CALL_ALV_OO

*&---------------------------------------------------------------------*

form call_alv_oo.

  if go_cc_alv_oo is initial.
    create object go_cc_alv_oo
      exporting
        container_name              gc_alv
      exceptions
        cntl_error                  1
        cntl_system_error           2
        create_error                3
        lifetime_error              4
        lifetime_dynpro_dynpro_link 5.

    create object go_cc_header
      exporting
        container_name              gc_header
      exceptions
        cntl_error                  1
        cntl_system_error           2
        create_error                3
        lifetime_error              4
        lifetime_dynpro_dynpro_link 5.

    if sy-subrc eq 0.
      create object go_title
        exporting
          i_parent go_cc_header.

      call method go_title->create_report_header
        exporting
          it_list_commentary    gt_header
          i_set_splitter_height 'X'.
    endif.

    create object go_grid_oo
      exporting
        i_parent go_cc_alv_oo.

    create object go_evt_receiver.

    set handler:
    go_evt_receiver->handle_toolbar     for go_grid_oo,
    go_evt_receiver->handle_user_command for go_grid_oo.

    call method go_grid_oo->set_table_for_first_display
      exporting
        is_variant      gs_variant
        i_save          gc_x
        i_default       gc_x
        is_layout       gs_layo_oo
      changing
        it_fieldcatalog gt_fcat_oo
        it_sort            gt_sort_oo[]
        it_outtab        gt_sflight[].
  endif.

endform.                    " CALL_ALV_OO


Ahora veremos como hemos creado la dynpro 



*&---------------------------------------------------------------------*

*&      Module  STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*

module STATUS_0100 output.

  SET PF-STATUS '0100'.
  SET TITLEBAR '0100'.

endmodule.                 " STATUS_0100  OUTPUT



*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
module user_command_0100 input.
  case sy-ucomm.

    when 'BACK' or 'EXIT' or 'CANCEL'.
      set screen 0.
      leave screen.
  endcase.
endmodule.                 " USER_COMMAND_0100  INPUT



Ahora en el include: ZAQR017CLA definiremos e implementaremos 2 métodos:

1. Para agregar los botones en el toolbar del ALV

2. Eventos para interactuar al dar click en el botón

Veamos:



*------------------------------------------------------------------
CLASS LCL_EVENT_RECEIVER DEFINITION                 

*------------------------------------------------------------------*

class lcl_event_receiver definition.

  public section.
    methods:
    handle_toolbar
    for event toolbar of cl_gui_alv_grid
    importing e_object e_interactive,

    handle_user_command
    for event user_command of cl_gui_alv_grid
    importing e_ucomm.


endclass.                    "lcl_event_receiver DEFINITION



*----------------------------------------------------------------------*

* CLASS lcl_event_receiver IMPLEMENTATION 

*----------------------------------------------------------------------*

class lcl_event_receiver implementation.

  method handle_toolbar.
       perform handle_toolbar_oo using e_object.
  endmethod.                    "handle_toolbar

  method handle_user_command.
      perform user_command_oo using e_ucomm.
  endmethod.                           "handle_user_command


endclass"LCL_EVENT_RECEIVER IMPLEMENTATION



*&---------------------------------------------------------------------*
*&      Form  HANDLE_TOOLBAR_OO
*&---------------------------------------------------------------------*
form handle_toolbar_oo  using pi_object type ref to cl_alv_event_toolbar_set.
  datals_toolbar type stb_button.


  clear ls_toolbar.

  move 'EXE' to ls_toolbar-function.
  move icon_execute_object to ls_toolbar-icon.
  move 'Ejecutar'(201to ls_toolbar-quickinfo.
  move 'Ejecutar'(201to ls_toolbar-text.
  move ' ' to ls_toolbar-disabled.
  append ls_toolbar to pi_object->mt_toolbar.

  clear ls_toolbar.

  move 'LOG' to ls_toolbar-function.
  move icon_protocol to ls_toolbar-icon.
  move 'Agradecimiento'(201to ls_toolbar-quickinfo.
  move 'Agradecimiento'(201to ls_toolbar-text.
  move ' ' to ls_toolbar-disabled.
  append ls_toolbar to pi_object->mt_toolbar.
endform.                    " HANDLE_TOOLBAR_OO



*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND_OO
*&---------------------------------------------------------------------*
form user_command_oo using  pi_ucomm type syucomm.
  case pi_ucomm.

    when 'EXE'.
      message 'Ud. ha presionado el boton ejecutar' type 'S'.
    when 'LOG'.
      perform agradecimientos.
  endcase.
endform.                    " USER_COMMAND_OO


Volvemos a ejecutar el reporte:


Click en el botón: 'ALV OO'
Y como resultado obtenemos visualizamos la data pero utilizando ahora el ALV OO.
Observan que hay diferencia con el ALV anterior, cierto?

Ahora interactuaremos con los botones:

click en ejecutar:

Como resultado tenemos el mensaje en la parte inferior del Reporte.

Click en el botón Agradecimiento:

Resultado :)

Nos vemos en el siguiente Blog ;)
MAGALEX

Comentarios

  1. Gracias Alex!! te pasaste eres grande!! :D

    Sigue así con el blog!! Saludos!!!

    ResponderEliminar
  2. Hola, muy buena explicacion, gracias. Queria preguntarte, tengo lo siguiente,

    Estoy probando de agregar un solo boton, pero cuando ejecuto, me aparece repetido, en este caso dos veces el boton Ejecutar. ¿que podria estar pasando? gracias

    ResponderEliminar
  3. Solucionado, tenia un append de mas cuando incluia los botones.

    Solo una pregunta que no me queda muy claro, para que son estas sentencias?

    PERFORM dynamic_report_fcodes(rhteiln0) TABLES fcode_attrib_tab
    USING func_exclude
    ' '
    ' '.
    SET PF-STATUS 'ALVLIST' EXCLUDING func_exclude OF PROGRAM 'RHTEILN0'.

    Siempre van los nombre de es programa y ese status gui? que realiza el perform? Tambien siempre va ese programa entre ()?

    Gracias

    ResponderEliminar
    Respuestas
    1. En este caso para la barra de herramientas del ALV GRID se esta tomando como referencia el status ALVLIST del programa RHTEILN0, por ende la sentencia PERFORM dynamic_report_fcodes(rhteiln0) TABLES fcode_attrib_tab lo que hace es considerar estas 3 nuevas funciones ('Ejecutar', 'Agradecimientos' y 'ALV OO') en el status ALVLIST del programa RHTEILN0, finalmente la sentencia SET PF-STATUS 'ALVLIST' EXCLUDING func_exclude OF PROGRAM 'RHTEILN0' establece que para nuestro programa la barra de herramientas del ALV GRID será tomando como referencia lo similar al estatus del programa RHTEILN0 pero excluyendo los códigos de función genéricos que no existen en dicho programa ya que como verás por defecto inicialmente trae 39 registros que es más de lo que realmente se encuentra habilitado en el Status GUI 'ALVLIST' del programa RHTEILN0. En conclusión no siempre irá el nombre de dicho programa RHTEILN0 ya que dependiendo del caso podrías crear tu propio status GUI, pero si ves la necesidad de recurrir a un status standard de SAP ahi si tienes que poner el nombre del programa en paréntesis tal como se indica.

      Eliminar
  4. Gracias por responder y por las aclaraciones

    ResponderEliminar
  5. Excelente muy bien explicado!!!! Gracias...

    ResponderEliminar
  6. Se agradece por donar tus conocimientos. Lima Perú.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Modificando Vista de Actualización SM30

User Exit para VA01 y VA02