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.
include zaqr017mai.
include zaqr017pbo.
include zaqr017pai.
include zaqr017f01.
*&---------------------------------------------------------------------*
*& Include ZAQR017TOP
*&---------------------------------------------------------------------*
************************************************************************
*Declaration internal tables *
************************************************************************
data: gt_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 c value 'X'.
*& Include ZAQR017TOP
*&---------------------------------------------------------------------*
************************************************************************
*Declaration internal tables *
************************************************************************
data: gt_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 c value 'X'.
*&---------------------------------------------------------------------*
*& Include ZAQR017MAI
*&---------------------------------------------------------------------*
************************************************************************
* START-OF-SELECTION *
************************************************************************
start-of-selection.
perform get_data.
perform show_data.
*& 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 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 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
*& 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
*& 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.
data: ls_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
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.
data: ls_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 . data: ls_header type slis_listheader.
* Report title
clear: gt_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_TOP_OF_PAGE
*&---------------------------------------------------------------------*
form set_top_of_page . data: ls_header type slis_listheader.
* Report title
clear: gt_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 .
data: ls_event type line of slis_t_event.
*Top of page event
*& Form SET_EVENT
*&---------------------------------------------------------------------*
form set_event .
data: ls_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
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 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 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 4 with header line.
clear: fcode_attrib_tab, fcode_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
*& 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 4 with header line.
clear: fcode_attrib_tab, fcode_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:
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(rhteiln0) tables 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:
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:
- &VGRID
- &VCRYSTAL
- &VLOTUS
- %ML
- &LIS
- &LFO
- &NFO
- &CRB
- &CRE
- &CRR
- &CRL
- &OL1
- &OL2
- &OL3
- &OL4
- &OL5
- &XML
- &COUNT
- &FG_SUBTOT
- &SUM
- &AUF
- &ILD
- P--
- P-
- P++
- P+
- %SC+
- &XINT
- &EB1
- &EB3
- &EB9
- &EBA
- &EBB
- &EBC
- &EBD
- &EBN
- &CRTEMPL
- &CRDESIG
- &CRBATCH
Luego de ejecutar la sentencia de código:
perform dynamic_report_fcodes(rhteiln0) tables 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:
- &VGRID
- &VCRYSTAL
- &VLOTUS
- %ML
- &LIS
- &LFO
- &NFO
- &CRB
- &CRE
- &CRR
- &CRL
- &OL1
- &OL2
- &OL3
- &OL4
- &OL5
- &XML
- &COUNT
- &FG_SUBTOT
- &SUM
- &AUF
- &ILD
- P--
- P-
- P++
- P+
- %SC+
- &XINT
- &EB1
- &EB3
- &EB9
- &EBA
- &EBB
- &EBC
- &EBD
- &EBN
- &CRTEMPL
- &CRDESIG
- &CRBATCH
- FC04
- DNOT
- 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
*& 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 .
data: lv_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 .
*& 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
*&---------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
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 .
data: ls_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
*& 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
*------------------------------------------------------------------*
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. data: ls_toolbar type stb_button.
clear ls_toolbar.
move 'EXE' to ls_toolbar-function.
move icon_execute_object to ls_toolbar-icon.
move 'Ejecutar'(201) to ls_toolbar-quickinfo.
move 'Ejecutar'(201) to 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'(201) to ls_toolbar-quickinfo.
move 'Agradecimiento'(201) to ls_toolbar-text.
move ' ' to ls_toolbar-disabled.
append ls_toolbar to pi_object->mt_toolbar.
endform. " HANDLE_TOOLBAR_OO
*& Form HANDLE_TOOLBAR_OO
*&---------------------------------------------------------------------*
form handle_toolbar_oo using pi_object type ref to cl_alv_event_toolbar_set. data: ls_toolbar type stb_button.
clear ls_toolbar.
move 'EXE' to ls_toolbar-function.
move icon_execute_object to ls_toolbar-icon.
move 'Ejecutar'(201) to ls_toolbar-quickinfo.
move 'Ejecutar'(201) to 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'(201) to ls_toolbar-quickinfo.
move 'Agradecimiento'(201) to 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
*& 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
Gracias Alex!! te pasaste eres grande!! :D
ResponderEliminarSigue así con el blog!! Saludos!!!
Hola, muy buena explicacion, gracias. Queria preguntarte, tengo lo siguiente,
ResponderEliminarEstoy 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
Solucionado, tenia un append de mas cuando incluia los botones.
ResponderEliminarSolo 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
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.
EliminarGracias por responder y por las aclaraciones
ResponderEliminarExcelente muy bien explicado!!!! Gracias...
ResponderEliminarSe agradece por donar tus conocimientos. Lima Perú.
ResponderEliminar