miércoles, 21 de julio de 2010

Ejemplo de ALV OO

Es es un ejemplo de un ALV OO que implementa los siguientes eventos.
*TOP_OF_PAGE "Cabecera
*DATA_CHANGED "Cuando es cambiado un campo editable
*TOOLBAR "Agrega botones al alv
*END_OF_LIST "Pie de página
*USER_COMMAND "Codigo Interno
*HOTSPOT_CLICK "Click a dato de un campo
*ONF4 "Ayuda en un campo del ALV


Programa Principal


*----------------------------------------------------------------------*
* TEMPLATE *
*----------------------------------------------------------------------*
* Programa : ZPRIMERPROGRAMA *
* Descripción : Ejemplo de creación de un ALV OO con el manejo*
* de los principales eventos. *
* Desarrollador : José Ángel Moreno Nieblas MZAVALA *
* Fecha Creación : 05.06.2010 *
*----------------------------------------------------------------------*
REPORT zprimerprograma.

*----------------------------------------------------------------------*
* D E C L A R A C I O N D E I N C L U D E S *
*----------------------------------------------------------------------*
INCLUDE: zprimerprograma_a, "Declaraciones Globales.
zprimerprograma_b, "Sub-rutinas.
zprimerprograma_o, "PBO
zprimerprograma_i. "PAI

*----------------------------------------------------------------------*
* E V E N T O I N I T I A L I Z A T I O N *
*----------------------------------------------------------------------*
INITIALIZATION.
* Para limpiar los parámetros de selección.
PERFORM f_limpiar_parametros.
PERFORM f_inicializar_variante. "Inicializa la variable

*----------------------------------------------------------------------*
* E V E N T O S E L E C C T I O N - S C R E E N *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
PERFORM f_obtener_variante. "Rutina que obtiene una variante default

AT SELECTION-SCREEN.
PERFORM f_cargar_variante. "Rutina que obtiene una variante

*----------------------------------------------------------------------*
* E V E N T O S T A R T - O F - S E L E C T I O N *
*----------------------------------------------------------------------*
START-OF-SELECTION.
* Para inicializar los objetos necesarios.
PERFORM f_crear_alv_oo.

* Llamado a la pantalla 100.
CALL SCREEN 0100.



Include de Declaraciones


*----------------------------------------------------------------------*
* TEMPLATE *
*----------------------------------------------------------------------*
* Programa : ZPRIMERPROGRAMA_A *
* Descripción : Declarciones globales necesarias para el *
* Ejemplo de creación de un ALV OO con el manejo*
* de los principales eventos. *
* Desarrollador : José Ángel Moreno Nieblas MZAVALA *
* Fecha Creación : 05.06.2010 *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* T A B L A S *
*----------------------------------------------------------------------*
TABLES: lfa1.

*----------------------------------------------------------------------*
* T I P O S *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_lfa1,
lifnr TYPE lfa1-lifnr,
name1 TYPE lfa1-name1,
name2 TYPE lfa1-name2,
j_sc_capital TYPE lfa1-j_sc_capital.
TYPES: END OF ty_lfa1.

TYPES: BEGIN OF ty_lfb1,
lifnr TYPE lfb1-lifnr,
bukrs TYPE lfb1-bukrs,
webtr TYPE lfb1-webtr.
TYPES: END OF ty_lfb1.

TYPES: BEGIN OF ty_t001,
bukrs TYPE t001-bukrs,
butxt TYPE t001-butxt.
TYPES: END OF ty_t001.

TYPES: BEGIN OF ty_lfm1,
lifnr TYPE lfm1-lifnr,
ekorg TYPE lfm1-ekorg.
TYPES: END OF ty_lfm1.

TYPES: BEGIN OF ty_t024e,
ekorg TYPE t024e-ekorg,
ekotx TYPE t024e-ekotx.
TYPES: END OF ty_t024e.

*----------------------------------------------------------------------*
* E S T R U C T U R A S *
*----------------------------------------------------------------------*
DATA: w_lfa1 TYPE ty_lfa1,
w_lfb1 TYPE ty_lfb1,
w_t001 TYPE ty_t001,
w_lfm1 TYPE ty_lfm1,
w_salida TYPE zes_alv_oo,
w_fdcat TYPE lvc_s_fcat,
w_layout TYPE lvc_s_layo,
w_sort TYPE lvc_s_sort,
w_variant TYPE disvariant,
w_xvariant TYPE disvariant,
w_t024e TYPE ty_t024e.

*----------------------------------------------------------------------*
* T A B L A S I N T E R N N A S *
*----------------------------------------------------------------------*
DATA: i_lfa1 TYPE STANDARD TABLE OF ty_lfa1,
i_lfb1 TYPE STANDARD TABLE OF ty_lfb1,
i_t001 TYPE STANDARD TABLE OF ty_t001,
i_lfm1 TYPE STANDARD TABLE OF ty_lfm1,
i_salida TYPE STANDARD TABLE OF zes_alv_oo,
i_fdcat TYPE lvc_t_fcat,
i_sort TYPE lvc_t_sort,
i_t024e TYPE STANDARD TABLE OF ty_t024e.

*----------------------------------------------------------------------*
* V A R I A B L E S *
*----------------------------------------------------------------------*
DATA: v_ucomm100 TYPE sy-ucomm,
v_ucomm200 TYPE sy-ucomm,
v_block100(100) TYPE c VALUE 'Selection Parameters'.

*----------------------------------------------------------------------*
* C L A S E S *
*----------------------------------------------------------------------*
CLASS lcl_co_application DEFINITION DEFERRED.
DATA: cl_application TYPE REF TO lcl_co_application.

*----------------------------------------------------------------------*
* CLASS lcl_co_application DEFINITION *
*----------------------------------------------------------------------*
* Clase mejorada de objetos para generar el ALV OO. *
*----------------------------------------------------------------------*
CLASS lcl_co_application DEFINITION.

PUBLIC SECTION.
METHODS:

* Cuando en dato en cambiado en el ALV.
handle_data_changed
FOR EVENT data_changed
OF cl_gui_alv_grid
IMPORTING er_data_changed
e_onf4
e_onf4_before
e_onf4_after
e_ucomm,

* Cuando un dato contiene el hotspot habilitado.
handle_hotspot_click
FOR EVENT hotspot_click
OF cl_gui_alv_grid
IMPORTING e_row_id
e_column_id
es_row_no,

* Para crear la cabecera del ALV OO.
handle_top_of_page
FOR EVENT top_of_page
OF cl_gui_alv_grid
IMPORTING e_dyndoc_id
table_index,

* Para crear el pie de página del ALV OO.
handle_end_of_list
FOR EVENT end_of_list
OF cl_gui_alv_grid
IMPORTING e_dyndoc_id,

* Para poner texto en los subtotales.
handle_subtotal_text
FOR EVENT subtotal_text
OF cl_gui_alv_grid
IMPORTING es_subtottxt_info
ep_subtot_line
e_event_data,

* Para crear una ayuda sobre un campo del ALV OO.
handle_onf4
FOR EVENT onf4
OF cl_gui_alv_grid
IMPORTING e_fieldname
e_fieldvalue
es_row_no
er_event_data
et_bad_cells
e_display,

* Para agregar un botón a la barra del ALV OO.
handle_toolbar
FOR EVENT toolbar
OF cl_gui_alv_grid
IMPORTING e_object
e_interactive,

* Para programar el botón nuevo agregado al ALV OO.
handle_user_command
FOR EVENT user_command
of cl_gui_alv_grid
IMPORTING e_ucomm.

ENDCLASS. "cl_application DEFINITION
*----------------------------------------------------------------------*
* O B J E T O S *
*----------------------------------------------------------------------*
DATA: o_container TYPE REF TO cl_gui_custom_container,
o_html_cntrl TYPE REF TO cl_gui_html_viewer,
o_html_cntrl2 TYPE REF TO cl_gui_html_viewer,
o_dyndoc_id TYPE REF TO cl_dd_document,
o_dyndoc_id2 TYPE REF TO cl_dd_document,
o_parent_top TYPE REF TO cl_gui_container,
o_parent_end TYPE REF TO cl_gui_container,
o_parent_grid TYPE REF TO cl_gui_container,
o_alv_barmanager TYPE REF TO cl_alv_grid_toolbar_manager,
o_splitter TYPE REF TO cl_gui_splitter_container,
o_grid TYPE REF TO cl_gui_alv_grid.

*----------------------------------------------------------------------*
* S E L E C T - O P T I O N S A N D P A R A M E T R O S *
*----------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF SCREEN 0001 AS SUBSCREEN.

SELECT-OPTIONS: s_lifnr FOR lfa1-lifnr OBLIGATORY.
PARAMETERS: p_layout TYPE disvariant-variant.

SELECTION-SCREEN: END OF SCREEN 0001.


Include de Rutinas


*----------------------------------------------------------------------*
* TEMPLATE *
*----------------------------------------------------------------------*
* Programa : ZPRIMERPROGRAMA_B *
* Descripción : Declarción de las rutinas necesarias para el *
* Ejemplo de creación de un ALV OO con el manejo*
* de los principales eventos. *
* Desarrollador : José Ángel Moreno Nieblas MZAVALA *
* Fecha Creación : 05.06.2010 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form F_OBTENER_DATOS *
*&---------------------------------------------------------------------*
* Para obtener los datos necesarios para generar el reporte. *
*----------------------------------------------------------------------*
FORM f_obtener_datos .

SELECT lifnr
name1
name2
j_sc_capital
FROM lfa1
INTO TABLE i_lfa1
WHERE lifnr IN s_lifnr.

IF sy-subrc EQ 0.

SORT i_lfa1
BY lifnr.

SELECT lifnr
bukrs
webtr
FROM lfb1
INTO TABLE i_lfb1
FOR ALL ENTRIES IN i_lfa1
WHERE lifnr EQ i_lfa1-lifnr.

IF sy-subrc EQ 0.

SORT i_lfb1
BY lifnr.

SELECT bukrs
butxt
FROM t001
INTO TABLE i_t001
FOR ALL ENTRIES IN i_lfb1
WHERE bukrs EQ i_lfb1-bukrs.

IF sy-subrc EQ 0.

SORT i_t001
BY bukrs.

ENDIF.

ENDIF.

SELECT lifnr
ekorg
FROM lfm1
INTO TABLE i_lfm1
FOR ALL ENTRIES IN i_lfa1
WHERE lifnr EQ i_lfa1-lifnr.

IF sy-subrc EQ 0.

SORT i_lfm1
BY lifnr.

SELECT ekorg
ekotx
FROM t024e
INTO TABLE i_t024e
FOR ALL ENTRIES IN i_lfm1
WHERE ekorg EQ i_lfm1-ekorg.

IF sy-subrc EQ 0.

SORT i_t024e
BY ekorg.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " F_OBTENER_DATOS
*&---------------------------------------------------------------------*
*& Form F_ARMAR_SALIDA *
*&---------------------------------------------------------------------*
* Rutina para crear la tabla de salida del reporte. *
*----------------------------------------------------------------------*
FORM f_armar_salida .

* Declaraciones de varianles locales
DATA: lv_name(71) TYPE c,
lv_indice TYPE sy-tabix,
lv_lines TYPE i.

REFRESH i_salida.

CLEAR w_salida.

* Se recorre la tabla general para llenar la tabla principal de
* salida.
LOOP AT i_lfa1
INTO w_lfa1.

* Unir dos campos en una variable.
CONCATENATE w_lfa1-name1
w_lfa1-name2
INTO lv_name
SEPARATED BY space.

* Mueve los campos correspondientes a los campos de salida.
MOVE: w_lfa1-lifnr TO w_salida-lifnr,
w_lfa1-j_sc_capital TO w_salida-capital,
lv_name TO w_salida-name1.

DESCRIBE TABLE i_salida LINES lv_lines.

lv_indice = lv_lines.

* Obtener el indice de primer registro que ooincida con la llave.
READ TABLE i_lfb1
INTO w_lfb1
WITH KEY lifnr = w_salida-lifnr
BINARY SEARCH.

IF sy-subrc EQ 0.

LOOP AT i_lfb1
INTO w_lfb1
FROM sy-tabix.

ADD 1 TO lv_indice.

IF w_lfb1-lifnr EQ w_salida-lifnr.

MOVE: w_lfb1-bukrs TO w_salida-bukrs,
w_lfb1-webtr TO w_salida-webtr.

READ TABLE i_t001
INTO w_t001
WITH KEY bukrs = w_lfb1-bukrs
BINARY SEARCH.

IF sy-subrc EQ 0.

MOVE: w_t001-butxt TO w_salida-butxt.

ENDIF.

MODIFY i_salida FROM w_salida INDEX lv_indice.

IF sy-subrc NE 0.

CLEAR: w_salida-ekorg,
w_salida-ekotx.

APPEND w_salida TO i_salida.

ENDIF.

ELSE.

EXIT.

ENDIF.

ENDLOOP.

ENDIF.

lv_indice = lv_lines.

* Obtener el indice de primer registro que ooincida con la llave.
READ TABLE i_lfm1
INTO w_lfm1
WITH KEY lifnr = w_salida-lifnr
BINARY SEARCH.

IF sy-subrc EQ 0.

LOOP AT i_lfm1
INTO w_lfm1
FROM sy-tabix.

ADD 1 TO lv_indice.

IF w_lfm1-lifnr EQ w_salida-lifnr.

MOVE: w_lfm1-ekorg TO w_salida-ekorg.

READ TABLE i_t024e
INTO w_t024e
WITH KEY ekorg = w_lfm1-ekorg
BINARY SEARCH.

IF sy-subrc EQ 0.

MOVE: w_t024e-ekotx TO w_salida-ekotx.

ENDIF.

MODIFY i_salida FROM w_salida INDEX lv_indice.

IF sy-subrc NE 0.

CLEAR: w_salida-bukrs,
w_salida-butxt.

APPEND w_salida TO i_salida.

ENDIF.

ELSE.

EXIT.

ENDIF.

ENDLOOP.

ENDIF.

ENDLOOP.

ENDFORM. " F_ARMAR_SALIDA
*&---------------------------------------------------------------------*
*& Form F_CREAR_ALV_OO *
*&---------------------------------------------------------------------*
* Para inicializar los componentes requeridos para mostrar el *
* ALV OO. *
*----------------------------------------------------------------------*
FORM f_crear_alv_oo .

* Declaración de estructuras locales.
DATA: lw_f4 TYPE lvc_s_f4.

* Declaración de tablas internas locales.
DATA: li_f4 TYPE lvc_t_f4.

* Se crea el contenedor.
CREATE OBJECT o_container
EXPORTING
container_name = 'CONTAINER100'.

IF NOT o_container IS INITIAL.

* Se crear el objeto que contendra los datos para la cabecera.
CREATE OBJECT o_dyndoc_id
EXPORTING
style = 'ALV_GRID'.

* Se crear el objeto que contendra los datos para el pie de página.
CREATE OBJECT o_dyndoc_id2
EXPORTING
style = 'ALV_GRID'.

* Se divide en contenedor en 3 partes.
CREATE OBJECT o_splitter
EXPORTING
parent = o_container
rows = 3
columns = 1.

* Se asigna para primera parte a otro contenedor [Cabecera]
CALL METHOD o_splitter->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = o_parent_top.

* Se asigna para primera parte a otro contenedor [Grid]
CALL METHOD o_splitter->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = o_parent_grid.

* Se asigna para primera parte a otro contenedor [Pie de Página]
CALL METHOD o_splitter->get_container
EXPORTING
row = 3
column = 1
RECEIVING
container = o_parent_end.

* Se asigna una altura por default a la primera división.
CALL METHOD o_splitter->set_row_height
EXPORTING
id = 1
height = 22.

* Se asigna una altura por default a la tercera división.
CALL METHOD o_splitter->set_row_height
EXPORTING
id = 3
height = 15.

* Se crea el objeto para almacenar el ALV.
CREATE OBJECT o_grid
EXPORTING
i_parent = o_parent_grid.

IF NOT o_grid IS INITIAL.

* Se crea el objeto que contiene los metodos mejorados.
CREATE OBJECT cl_application.

* Se activan los eventos para el GRID.
SET HANDLER cl_application->handle_data_changed FOR o_grid.
SET HANDLER cl_application->handle_hotspot_click FOR o_grid.
SET HANDLER cl_application->handle_top_of_page FOR o_grid.
SET HANDLER cl_application->handle_end_of_list FOR o_grid.
SET HANDLER cl_application->handle_subtotal_text FOR o_grid.
SET HANDLER cl_application->handle_onf4 FOR o_grid.
SET HANDLER cl_application->handle_toolbar FOR o_grid.
SET HANDLER cl_application->handle_user_command FOR o_grid.

* Se registra una ayuda para el campo AYUDA del ALV OO.
lw_f4-fieldname = 'AYUDA'.
lw_f4-register = 'X'.
APPEND lw_f4 TO li_f4.

CALL METHOD o_grid->register_f4_for_fields
EXPORTING
it_f4 = li_f4.

* Registrar Evento Enter para poder activar el evento data_changed.
CALL METHOD o_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.

* Registramos el evento cuando se modificar el dato por si acaso no
* pulsan el ENTER
CALL METHOD o_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.

* Para inicializar el catologo de campos.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ZES_ALV_OO'
i_client_never_display = 'X'
CHANGING
ct_fieldcat = i_fdcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc EQ 0.

LOOP AT i_fdcat
INTO w_fdcat.

w_fdcat-colddictxt = 'L'. "Referencia texto
w_fdcat-col_opt = 'X'. "Optimzar columna

CASE w_fdcat-fieldname.
WHEN 'LIFNR'.
w_fdcat-hotspot = 'X'. "HotSpot
WHEN 'CAPITAL'.
w_fdcat-edit = 'X'. "Editable
w_fdcat-do_sum = 'X'. "Subtotal
WHEN 'WEBTR'.
w_fdcat-edit = 'X'. "Editable
w_fdcat-do_sum = 'X'. "Subtotal
WHEN 'TOTAL'.
w_fdcat-do_sum = 'X'. "Subtotal
WHEN 'AYUDA'.
w_fdcat-f4availabl = 'X'. "Activar Ayuda
w_fdcat-edit = 'X'. "Editable
ENDCASE.

MODIFY i_fdcat FROM w_fdcat.

ENDLOOP.

* Llamado a una función para completar el catálogo de campos.
CALL FUNCTION 'LVC_FIELDCAT_COMPLETE'
EXPORTING
i_refresh_buffer = ' '
i_buffer_active = ' '
CHANGING
ct_fieldcat = i_fdcat.

ENDIF.

* Opimizar el ancho de la columna.
w_layout-cwidth_opt = 'X'.

* Creando un ordenamiento default con subtotales.
w_sort-spos = 1.
w_sort-fieldname = 'LIFNR'.
w_sort-subtot = 'X'.
w_sort-up = 'X'.
w_sort-comp = 'X'.
w_sort-level = 1.

APPEND w_sort TO i_sort.

ENDIF.

ENDIF.

ENDFORM. " F_CREAR_ALV_OO
*&---------------------------------------------------------------------*
*& Form F_MOSTRAR_ALV_OO *
*&---------------------------------------------------------------------*
* Rutina que muestra el ALV OO. *
*----------------------------------------------------------------------*
FORM f_mostrar_alv_oo .

* Llamado al métodos que inicializa el ALV OO.
CALL METHOD o_grid->set_table_for_first_display
EXPORTING
is_variant = w_variant
i_save = 'X'
i_default = 'X'
is_layout = w_layout
CHANGING
it_outtab = i_salida
it_fieldcatalog = i_fdcat
it_sort = i_sort
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4.

ENDIF.

* Metodo que inicializa la cabecera.
CALL METHOD o_dyndoc_id->initialize_document.

* Metodo que inicializa el pie página.
CALL METHOD o_dyndoc_id2->initialize_document.

* Para registrar el evento en el GRID.
CALL METHOD o_grid->list_processing_events
EXPORTING
i_event_name = 'TOP_OF_PAGE'
i_dyndoc_id = o_dyndoc_id.

IF o_html_cntrl IS INITIAL.

* Creando el objeto en donde se va mostrar la info.
CREATE OBJECT o_html_cntrl
EXPORTING
parent = o_parent_top.

ENDIF.

* Para registrar el evento en el GRID.
CALL METHOD o_grid->list_processing_events
EXPORTING
i_event_name = 'END_OF_LIST'
i_dyndoc_id = o_dyndoc_id2.

IF o_html_cntrl2 IS INITIAL.

* Creando el objeto en donde se va mostrar la info.
CREATE OBJECT o_html_cntrl2
EXPORTING
parent = o_parent_end.

ENDIF.

* Método que obtiene el documentos.
CALL METHOD o_dyndoc_id->merge_document.

* Referenciando el documentos al control.
o_dyndoc_id->html_control = o_html_cntrl.

* Mostrar el documentos.
CALL METHOD o_dyndoc_id->display_document
EXPORTING
reuse_control = 'X'
parent = o_parent_top
EXCEPTIONS
html_display_error = 1.

* Método que obtiene el documentos.
CALL METHOD o_dyndoc_id2->merge_document.

* Referenciando el documentos al control.
o_dyndoc_id2->html_control = o_html_cntrl2.

* Mostrar el documentos.
CALL METHOD o_dyndoc_id2->display_document
EXPORTING
reuse_control = 'X'
parent = o_parent_end
EXCEPTIONS
html_display_error = 1.

ENDFORM. " F_MOSTRAR_ALV_OO
*----------------------------------------------------------------------*
* CLASS lcl_co_application IMPLEMENTATION *
*----------------------------------------------------------------------*
* Clase que contiene los métodos a implementar.
*----------------------------------------------------------------------*
CLASS lcl_co_application IMPLEMENTATION.

METHOD handle_data_changed.

* Para el evento DATA_CHANGED
PERFORM f_handle_data_changed
USING er_data_changed
e_onf4
e_onf4_before
e_onf4_after
e_ucomm.

ENDMETHOD. "HANDLE_DATA_CHANGED_CLI

METHOD handle_hotspot_click.

* Para el evento HOTSPOT_CLICK
PERFORM f_handle_hotspot_click
USING e_row_id
e_column_id
es_row_no.

ENDMETHOD. "HANDLE_HOTSPOT_CLICK

METHOD handle_top_of_page.

* Para el evento TOP_OF_PAGE
PERFORM f_handle_top_of_page
USING e_dyndoc_id
table_index.

ENDMETHOD. "HANDLE_TOP_OF_PAGE

METHOD handle_end_of_list.

* Para el evento END_OF_LIST
PERFORM f_handle_end_of_list
USING e_dyndoc_id.

ENDMETHOD. "HANDLE_END_OF_LIST

METHOD handle_subtotal_text.

* Para el evento SUBTOTAL_TEXT
PERFORM f_handle_subtotal_text
USING es_subtottxt_info
ep_subtot_line
e_event_data.

ENDMETHOD. "HANDLE_SUBTOTAL_TEXT

METHOD handle_onf4.

* Para el evento ONF4
PERFORM f_handle_onf4
USING e_fieldname
e_fieldvalue
es_row_no
er_event_data
et_bad_cells
e_display.

er_event_data->m_event_handled = 'X' .

ENDMETHOD. "HANDLE_ONF4

METHOD handle_toolbar.

* Para el evento TOOLBAR
PERFORM f_handle_toolbar
USING e_object.

ENDMETHOD. "HANDLE_TOOLBAR

METHOD handle_user_command.

* Para el evento USER_COMMAND
PERFORM f_handle_user_command
USING e_ucomm.

ENDMETHOD. "HANDLE_USER_COMMAND

ENDCLASS. "cl_application
*&---------------------------------------------------------------------*
*& Form F_HANDLE_HOTSPOT_CLICK *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento HOTSPOT_CLICK. *
*----------------------------------------------------------------------*
* -->P_E_ROW_ID Contiene ID de la fila. *
* -->P_E_COLUMN_ID Contiene ID de la columna. *
* -->P_ES_ROW_NO Contiene el número de fila. *
*----------------------------------------------------------------------*
FORM f_handle_hotspot_click
USING p_e_row_id TYPE lvc_s_row
p_e_column_id TYPE lvc_s_col
p_es_row_no TYPE lvc_s_roid.

READ TABLE i_salida
INTO w_salida
INDEX p_e_row_id-index.

IF sy-subrc EQ 0.

MESSAGE i398(00) WITH: 'Vendor '
w_salida-lifnr
'was seleced'
space.

ENDIF.

ENDFORM. " F_HANDLE_HOTSPOT_CLICK
*&---------------------------------------------------------------------*
*& Form F_HANDLE_DATA_CHANGED *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento DATA_CHANGED. *
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED Contiene el objeto cambiado. *
* -->P_E_ONF4 Si se ejecutó el evento ONF4. *
* -->P_E_ONF4_BEFORE Si se ejecutó el evento ONF4_BEFORE. *
* -->P_E_ONF4_AFTER Si se ejecutó el evento ONF4_AFTER. *
* -->P_E_UCOMM Contiene la acción de usuario. *
*----------------------------------------------------------------------*
FORM f_handle_data_changed
USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol
p_e_onf4 TYPE char01
p_e_onf4_before TYPE char01
p_e_onf4_after TYPE char01
p_e_ucomm TYPE sy-ucomm.

* Declaratios of local structures.
DATA: lw_mod_cell TYPE lvc_s_modi,
lw_stable TYPE lvc_s_stbl.

* Declaración de variables locales.
DATA: lv_formato_dec LIKE usr01-dcpfm.

* Para obtener la configuración de las cantidades del usuario.
SELECT SINGLE dcpfm
INTO lv_formato_dec
FROM usr01
WHERE bname = sy-uname.

IF sy-subrc NE 0.

CLEAR lv_formato_dec.

ENDIF.

* Loop the row for modify the ALV and the output table.
LOOP AT p_er_data_changed->mt_mod_cells
INTO lw_mod_cell.

READ TABLE i_salida
INTO w_salida
INDEX lw_mod_cell-row_id.

IF sy-subrc EQ 0.

* Solo los campos que se van a actualizar.
CASE lw_mod_cell-fieldname.

WHEN 'CAPITAL'.

* Efectuando conversión [. ,]
CASE lv_formato_dec.
WHEN 'X'. "Coma Decimal
REPLACE '.' IN lw_mod_cell-value WITH ','.
WHEN 'Y'. "punto decimal
REPLACE ',' IN lw_mod_cell-value WITH '.'.
ENDCASE.

w_salida-capital = lw_mod_cell-value.

WHEN 'WEBTR'.

* Efectuando conversión [. ,]
CASE lv_formato_dec.
WHEN 'X'. "Coma Decimal
REPLACE '.' IN lw_mod_cell-value WITH ','.
WHEN 'Y'. "punto decimal
REPLACE ',' IN lw_mod_cell-value WITH '.'.
ENDCASE.

w_salida-webtr = lw_mod_cell-value.

ENDCASE.

* Realizando calculos...
w_salida-total = w_salida-capital + w_salida-webtr.

* Modificando la tabla interna con los nuevos valores.
MODIFY i_salida
FROM w_salida
INDEX lw_mod_cell-row_id.

IF sy-subrc EQ 0.

CLEAR w_salida.

ENDIF.

ENDIF.

* Para actualizar la celda.
CALL METHOD p_er_data_changed->modify_cell
EXPORTING
i_row_id = lw_mod_cell-row_id
i_fieldname = lw_mod_cell-fieldname
i_value = lw_mod_cell-value.

ENDLOOP.

lw_stable-row = 'X'.
lw_stable-col = 'X'.

* Método que refresca el GRID con los nuevos valores.
CALL METHOD o_grid->refresh_table_display
EXPORTING
is_stable = lw_stable
EXCEPTIONS
finished = 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. " F_HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
*& Form F_HANDLE_TOP_OF_PAGE *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento TOP_OF_PAGE. *
*----------------------------------------------------------------------*
* -->P_E_DYNDOC_ID Contiene la información para la cabecera. *
* -->P_TABLE_INDEX Contiene el indica inicial. *
*----------------------------------------------------------------------*
FORM f_handle_top_of_page
USING p_e_dyndoc_id TYPE REF TO cl_dd_document
p_table_index TYPE syindex.

* Declaraciones de variables locales.
DATA: lv_text1 TYPE sdydo_text_element,
lv_text2 TYPE sdydo_text_element,
lv_text3 TYPE sdydo_text_element,
lv_text4 TYPE sdydo_text_element,
lv_text5 TYPE sdydo_text_element,
lv_fecha(10) TYPE c,
lv_hora(8) TYPE c.

* Declaraciones de objetos locales.
DATA: lo_ta TYPE REF TO cl_dd_table_element,
lo_col1 TYPE REF TO cl_dd_area,
lo_col2 TYPE REF TO cl_dd_area,
lo_col3 TYPE REF TO cl_dd_area.

WRITE sy-datlo TO lv_fecha DD/MM/YYYY.
WRITE sy-timlo TO lv_hora.

IF NOT s_lifnr-high IS INITIAL.

CONCATENATE: 'Vendor'
s_lifnr-low
'to'
s_lifnr-high
INTO lv_text1
SEPARATED BY space.

ELSE.

CONCATENATE: 'Vendor'
s_lifnr-low
INTO lv_text1
SEPARATED BY space.

ENDIF.

lv_text2 = 'The report is displayed sucessfully'.
lv_text3 = 'Is Example the header in ALV OO'.

CONCATENATE: 'Fecha' "Fecha
lv_fecha
INTO lv_text4
SEPARATED BY space.

CONCATENATE: 'Hora' "Hora
lv_hora
INTO lv_text5
SEPARATED BY space.

* Crea Tabla para Cabecera de 3 Columnas
CALL METHOD p_e_dyndoc_id->add_table
EXPORTING
no_of_columns = 3
width = '100%'
border = '0'
IMPORTING
table = lo_ta.

* Asignado el espacio a ocupar para la columna uno
CALL METHOD lo_ta->add_column
EXPORTING
width = '50%'
IMPORTING
column = lo_col1.

* Asignado el espacio a ocupar para la columna dos
CALL METHOD lo_ta->add_column
EXPORTING
width = '35%'
IMPORTING
column = lo_col2.

* Asignado el espacio a ocupar para la columna tres
CALL METHOD lo_ta->add_column
EXPORTING
width = '15%'
IMPORTING
column = lo_col3.

* Quitando las filas que se han de crear para esta columna.
CALL METHOD lo_ta->span_rows
EXPORTING
col_with_span = lo_col3
no_of_rows = 3
EXCEPTIONS
span_failed = 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.
ELSE.

* Agregando un logo creado en Trans. OEAR.
CALL METHOD lo_col3->add_picture
EXPORTING
picture_id = 'ZLOGO'.

ENDIF.

* Agregando espacio a la Columna 1 Fila 1
CALL METHOD lo_col1->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 1 Fila 1
CALL METHOD lo_col1->add_text
EXPORTING
text = lv_text1
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Creando una fila...
CALL METHOD lo_ta->new_row.

* Agregando espacio a la Columna 1 Fila 2
CALL METHOD lo_col1->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 1 Fila 2
CALL METHOD lo_col1->add_text
EXPORTING
text = lv_text2
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Agregando espacio a la Columna 2 Fila 2
CALL METHOD lo_col2->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 2 Fila 2
CALL METHOD lo_col2->add_text
EXPORTING
text = lv_text4 "Fecha
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Creando una fila...
CALL METHOD lo_ta->new_row.

* Agregando espacio a la Columna 1 Fila 3
CALL METHOD lo_col1->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 1 Fila 3
CALL METHOD lo_col1->add_text
EXPORTING
text = lv_text3
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Agregando espacio a la Columna 2 Fila 3
CALL METHOD lo_col2->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 2 Fila 3
CALL METHOD lo_col2->add_text
EXPORTING
text = lv_text5 "Hora
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

ENDFORM. " F_HANDLE_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*& Form F_HANDLE_END_OF_LIST *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento END_OF_LIST. *
*----------------------------------------------------------------------*
* -->P_E_DYNDOC_ID Contiene la información para la cabecera. *
*----------------------------------------------------------------------*
FORM f_handle_end_of_list
USING p_e_dyndoc_id TYPE REF TO cl_dd_document.

* Declaraciones de variables locales.
DATA: lv_text1 TYPE sdydo_text_element,
lv_text2 TYPE sdydo_text_element,
lv_text3 TYPE sdydo_text_element,
lv_text4 TYPE sdydo_text_element,
lv_text5 TYPE sdydo_text_element.

* Declaraciones de objetos locales.
DATA: lo_ta TYPE REF TO cl_dd_table_element,
lo_col1 TYPE REF TO cl_dd_area,
lo_col2 TYPE REF TO cl_dd_area,
lo_col3 TYPE REF TO cl_dd_area.

IF NOT s_lifnr-high IS INITIAL.

CONCATENATE: 'Vendor'
s_lifnr-low
'to'
s_lifnr-high
INTO lv_text1
SEPARATED BY space.

ELSE.

CONCATENATE: 'Vendor'
s_lifnr-low
INTO lv_text1
SEPARATED BY space.

ENDIF.

lv_text2 = 'The report is displayed sucessfully'.
lv_text3 = 'Is Example the footer in ALV OO'.
lv_text4 = 'The footer creating tables'.
lv_text5 = 'Columns and Rows with texts'.

* Crea Tabla para Cabecera de 2 Columnas
CALL METHOD p_e_dyndoc_id->add_table
EXPORTING
no_of_columns = 2
width = '100%'
border = '0'
IMPORTING
table = lo_ta.

* Asignado el espacio a ocupar para la columna uno
CALL METHOD lo_ta->add_column
EXPORTING
width = '15%'
IMPORTING
column = lo_col1.

* Asignado el espacio a ocupar para la columna dos
CALL METHOD lo_ta->add_column
EXPORTING
width = '15%'
IMPORTING
column = lo_col2.

* Agregando espacio a la Columna 1 Fila 1
CALL METHOD lo_col1->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 1 Fila 1
CALL METHOD lo_col1->add_text
EXPORTING
text = lv_text1
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Creando una fila...
CALL METHOD lo_ta->new_row.

* Agregando espacio a la Columna 1 Fila 2
CALL METHOD lo_col1->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 1 Fila 2
CALL METHOD lo_col1->add_text
EXPORTING
text = lv_text2
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Agregando espacio a la Columna 2 Fila 2
CALL METHOD lo_col2->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 2 Fila 2
CALL METHOD lo_col2->add_text
EXPORTING
text = lv_text4
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Creando una fila...
CALL METHOD lo_ta->new_row.

* Agregando espacio a la Columna 1 Fila 3
CALL METHOD lo_col1->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 1 Fila 3
CALL METHOD lo_col1->add_text
EXPORTING
text = lv_text3
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

* Agregando espacio a la Columna 2 Fila 3
CALL METHOD lo_col2->add_gap
EXPORTING
width = 10.

* Agregando texto a la Columna 2 Fila 3
CALL METHOD lo_col2->add_text
EXPORTING
text = lv_text5
sap_fontsize = 'MEDIUM'
sap_emphasis = 'Strong'.

ENDFORM. " F_HANDLE_END_OF_LIST
*&---------------------------------------------------------------------*
*& Form F_HANDLE_SUBTOTAL_TEXT *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento SUBTOTAL_TEXT. *
*----------------------------------------------------------------------*
* -->P_ES_SUBTOTTXT_INFO Contiene el texto de total. *
* -->P_EP_SUBTOT_LINE Contiene la linea del subtotal. *
* -->P_E_EVENT_DATA Contiene texto subtotal del contenedor. *
*----------------------------------------------------------------------*
FORM f_handle_subtotal_text
USING p_es_subtottxt_info TYPE lvc_s_stxt
p_ep_subtot_line TYPE REF TO data
p_e_event_data TYPE REF TO cl_alv_event_data.

* Declaración de apuntadores locales.
FIELD-SYMBOLS: TYPE ANY.

* Campo con los totales
CASE p_es_subtottxt_info-criteria.
WHEN 'LIFNR'.

* Asignado un texto del subtotal.
ASSIGN p_e_event_data->m_data->* TO .
= 'Subtotal Vendor'.

p_es_subtottxt_info-crit_text = 'Subtotal Vendor'.

ENDCASE.

ENDFORM. " F_HANDLE_SUBTOTAL_TEXT
*&---------------------------------------------------------------------*
*& Form F_OBTENER_VARIANTE *
*&---------------------------------------------------------------------*
* Obtiene una variante almacenada con el matchcode *
*----------------------------------------------------------------------*
FORM f_obtener_variante .

* Declaración de variables locales
DATA: lv_exit TYPE c VALUE ''. "Guarda la acción del usuario

* Llamado a la función [REUSE_ALV_VARIANT_F4] para buscar una variante
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = w_xvariant
i_save = 'A'
IMPORTING
e_exit = lv_exit
es_variant = w_xvariant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.

IF sy-subrc EQ 0.

IF lv_exit = space.

p_layout = w_xvariant-variant.

ENDIF.

ENDIF.

ENDFORM. " F_OBTENER_VARIANTE
*&---------------------------------------------------------------------*
*& Form F_CARGAR_VARIANTE *
*&---------------------------------------------------------------------*
* Activa una variante existente *
*----------------------------------------------------------------------*
FORM f_cargar_variante .

IF NOT p_layout IS INITIAL.

* Indica el nombre del programa principal
w_variant-report = sy-repid.

* Indica el usuario
w_variant-username = sy-uname.

MOVE w_variant TO w_xvariant.
MOVE p_layout TO w_xvariant-variant.

* Llamado de la función [REUSE_ALV_VARIANT_EXISTENCE] para aplicar una
* variante exitente en el ALV
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
EXPORTING
i_save = 'A'
CHANGING
cs_variant = w_xvariant
EXCEPTIONS
wrong_input = 1
not_found = 2
program_error = 3
OTHERS = 4.

IF sy-subrc = 0.

w_variant = w_xvariant.

ENDIF.

ELSE.

CLEAR w_variant.

ENDIF.


ENDFORM. " F_CARGAR_VARIANTE
*&---------------------------------------------------------------------*
*& Form F_INICIALIZAR_VARIANTE *
*&---------------------------------------------------------------------*
* Inicializando la variante default *
*----------------------------------------------------------------------*
FORM f_inicializar_variante .

* Indica el nombre del programa principal
w_variant-report = sy-repid.

* Indica el usuario
w_variant-username = sy-uname.

* Se toma la variante
w_xvariant = w_variant.

* Llamado a la función [REUSE_ALV_VARIANT_DEFAULT_GET] para guardar la
* la variante
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
EXPORTING
i_save = 'A'
CHANGING
cs_variant = w_xvariant
EXCEPTIONS
wrong_input = 1
not_found = 2
program_error = 3
OTHERS = 4.

IF sy-subrc = 0.

p_layout = w_xvariant-variant.

ENDIF.

ENDFORM. " F_INICIALIZAR_VARIANTE
*&---------------------------------------------------------------------*
*& Form F_HANDLE_ONF4 *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento ONF4. *
*----------------------------------------------------------------------*
* -->P_E_FIELDNAME Contiene el nombre del campo. *
* -->P_E_FIELDVALUE Contiene el valor de la celda. *
* -->P_ES_ROW_NO Contiene el ID de la fila. *
* -->P_ER_EVENT_DATA Contiene el objeto con los datos. *
* -->P_ET_BAD_CELLS Contiene las celdas incorrectas. *
* -->P_E_DISPLAY Activa que solo de despliegue. *
*----------------------------------------------------------------------*
FORM f_handle_onf4
USING p_e_fieldname TYPE lvc_fname
p_e_fieldvalue TYPE lvc_value
p_es_row_no TYPE lvc_s_roid
p_er_event_data TYPE REF TO cl_alv_event_data
p_et_bad_cells TYPE lvc_t_modi
p_e_display TYPE char01.

* Declaración de estructuras locales.
DATA: lw_return TYPE ddshretval,
lw_stable TYPE lvc_s_stbl.

* Declaración de tablas internas locales.
DATA: li_t247 TYPE STANDARD TABLE OF t247,
li_return TYPE STANDARD TABLE OF ddshretval.

* Detectando el campo para desplegar la ayuda correspondiente.
CASE p_e_fieldname.
WHEN 'AYUDA'.

* Función para obtener los nombres de los meses.
CALL FUNCTION 'MONTH_NAMES_GET'
EXPORTING
language = sy-langu
TABLES
month_names = li_t247
EXCEPTIONS
month_names_not_found = 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.

* Despliega la ayuda para el campo.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'LTX'
dynpprog = sy-repid
dynpnr = sy-dynnr
window_title = 'Months'
value_org = 'S'
TABLES
value_tab = li_t247
return_tab = li_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc EQ 0.

* Accesando al valor escogido...
READ TABLE li_return
INTO lw_return
INDEX 1.

IF sy-subrc EQ 0.

* Accesando a linea en la cual se desplego la ayuda.
READ TABLE i_salida
INTO w_salida
INDEX p_es_row_no-row_id.

IF sy-subrc EQ 0.

* Actualizando el valor...
w_salida-ayuda = lw_return-fieldval.

MODIFY i_salida
FROM w_salida
INDEX sy-tabix.

ENDIF.

ENDIF.

ENDIF.

lw_stable-row = 'X'.
lw_stable-col = 'X'.

* Refrescando el GRID con los nuevos valores.
CALL METHOD o_grid->refresh_table_display
EXPORTING
is_stable = lw_stable
EXCEPTIONS
finished = 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.

ENDCASE.

ENDFORM. " F_HANDLE_ONF4
*&---------------------------------------------------------------------*
*& Form F_HANDLE_TOOLBAR *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento TOOLBAR. *
*----------------------------------------------------------------------*
* -->P_E_OBJECT Contiene el objeto con los datos. *
*----------------------------------------------------------------------*
FORM f_handle_toolbar
USING p_e_object TYPE REF TO cl_alv_event_toolbar_set.

* Declaración de estructuras locales.
DATA: lw_toolbar TYPE stb_button.

* Agregando un separador.
CLEAR lw_toolbar.
lw_toolbar-butn_type = 3.
APPEND lw_toolbar TO p_e_object->mt_toolbar.

* Agregando el boton MAIL a la barra de botones del GRID.
CLEAR lw_toolbar.
lw_toolbar-icon = icon_mail.
lw_toolbar-butn_type = 0.
lw_toolbar-function = 'MAIL'.
lw_toolbar-quickinfo = 'Enviar info al Mail'.
lw_toolbar-disabled = space.
lw_toolbar-text = 'Mail'.

APPEND lw_toolbar TO p_e_object->mt_toolbar.

ENDFORM. " F_HANDLE_TOOLBAR
*&---------------------------------------------------------------------*
*& Form F_HANDLE_USER_COMMAND *
*&---------------------------------------------------------------------*
* Rutina para procesar el evento USER_COMMAND. *
*----------------------------------------------------------------------*
* -->P_E_UCOMM Contiene la acción del usuario en el GRID. *
*----------------------------------------------------------------------*
FORM f_handle_user_command
USING p_e_ucomm TYPE sy-ucomm.

* Evaluar los botones del ALV GRID OO.
CASE p_e_ucomm.
WHEN 'MAIL'.
MESSAGE 'Pulsó el botón MAIL'
TYPE 'I'.
ENDCASE.

ENDFORM. " F_HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form F_LIMPIAR_PARAMETROS *
*&---------------------------------------------------------------------*
* Rutina para limpiar los parámetros de selección. *
*----------------------------------------------------------------------*
FORM f_limpiar_parametros .

CLEAR: p_layout,
s_lifnr,
w_variant,
w_xvariant.

REFRESH s_lifnr.

ENDFORM. " F_LIMPIAR_PARAMETROS



Include PBO


*----------------------------------------------------------------------*
* TEMPLATE *
*----------------------------------------------------------------------*
* Programa : ZPRIMERPROGRAMA_O *
* Descripción : Para todos los procesos antes de la pantalla *
* Ejemplo de creación de un ALV OO con el manejo*
* de los principales eventos. *
* Desarrollador : José Ángel Moreno Nieblas MZAVALA *
* Fecha Creación : 05.06.2010 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT *
*&---------------------------------------------------------------------*
* Para asignar un titulo y botones a la pantalla 100. *
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

SET PF-STATUS 'PF0100'.
SET TITLEBAR 'T0100'.

ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT *
*&---------------------------------------------------------------------*
* Para asignar un titulo y botones a la pantalla 200. *
*----------------------------------------------------------------------*
MODULE status_0200 OUTPUT.

SET PF-STATUS 'PF0200'.
SET TITLEBAR 'T0100'.

ENDMODULE. " STATUS_0200 OUTPUT


Include PAI


*----------------------------------------------------------------------*
* TEMPLATE *
*----------------------------------------------------------------------*
* Programa : ZPRIMERPROGRAMA_I *
* Descripción : Para todos los procesos despues de la pantalla*
* Ejemplo de creación de un ALV OO con el manejo*
* de los principales eventos. *
* Desarrollador : José Ángel Moreno Nieblas MZAVALA *
* Fecha Creación : 05.06.2010 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module EXIT100 INPUT *
*&---------------------------------------------------------------------*
* Para salir de la pantalla 100 sin respetar los campos obligatorios.*
*----------------------------------------------------------------------*
MODULE exit100 INPUT.

CASE v_ucomm100.
WHEN 'BACK'
OR 'CANC'
OR 'EXIT'.

LEAVE PROGRAM.

ENDCASE.

ENDMODULE. " EXIT100 INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT *
*&---------------------------------------------------------------------*
* Para evaluar los botones de la patalla 100. *
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

CASE v_ucomm100.
WHEN 'EXEC'.

* Para obtener los datos para el reporte.
PERFORM f_obtener_datos.

* Para crear el reporte de salida.
PERFORM f_armar_salida.

* Para mostrar el ALV OO.
PERFORM f_mostrar_alv_oo.

* Llamado a la pantalla 0200.
CALL SCREEN 0200.

ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT *
*&---------------------------------------------------------------------*
* Para evaluar los botones de la pantalla 200. *
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.

CASE v_ucomm200.
WHEN 'BACK'
OR 'CANC'.

SET SCREEN 0100.
LEAVE SCREEN.

WHEN 'EXIT'.

LEAVE PROGRAM.

ENDCASE.

ENDMODULE. " USER_COMMAND_0200 INPUT


Pantalla 100


PROCESS BEFORE OUTPUT.

* Asignar un titulo y un estatus.
MODULE status_0100.

* Llamado de la subcreen 0001
CALL SUBSCREEN sub100 INCLUDING sy-repid '0001'.

PROCESS AFTER INPUT.

* Para obtener los valores de la screen.
CALL SUBSCREEN sub100.

* Para salir aunque tenga parámetros obligatorios.
MODULE exit100 AT EXIT-COMMAND.

* Validar la acción de usuario.
MODULE user_command_0100.


Pantalla 200


PROCESS BEFORE OUTPUT.

* Asignar un titulo y un estatus.
MODULE status_0200.

PROCESS AFTER INPUT.

* Validar la acción de usuario.
MODULE user_command_0200.

16 comentarios:

  1. Lo estoy viendo, pinta excelente.

    ResponderEliminar
  2. Amigo, nos podrias ayudar a ubicar el "zes_alv_oo" Muchas gracias de ante manos.

    ResponderEliminar
  3. ZES_ALV_OO es una estructura creada en la SE11, la tiene los campos el reporte que se va a mostrar:

    LIFNR TYPE LFA1-LIFNR
    NAME1 TYPE LFA1-NAME1
    BUKRS TYPE LFB1-BUKRS
    BUTXT TYPE T001-BUTXT
    WEBTR TYPE LFB1-WEBTR
    EKORG TYPE LFM1-EKORG
    EKOTX TYPE T024E-EKOTX
    CAPITAL TYPE LFA1-J_SC_CAPITAL

    El tipo del campo CAPITAL no existe solo pongan uno k sea cantidad o mandenlo vacio no importa.

    ResponderEliminar
  4. Grande José!! estoy aprendiendo abap y encuentro tu blog.
    Un abrazo!
    Alejo desde Argentina

    ResponderEliminar
  5. CALL SUBSCREEN sub100 INCLUDING sy-repid '0001'.

    Este objeto no lo encuentro.
    podria alguien informarme sobre el mismo.

    Gracias de ante mano.

    ResponderEliminar
    Respuestas
    1. Este es un objeto del tipo subscreen creado en layout de la pantalla 100, el cual se llama sub100.

      Eliminar
  6. Al ejecutar el programar solo me sale un pantalla pidiendo acreedor y layout.
    Le coloco un acreedor existente, pero sin importar el boton que presione, solo dice "esta no es una funcion valida"

    Me habria gustado postear una imagen para que la vieran pero no me lo permite, de todos modos si tienen alguna idea.
    Gracias.
    Y la estructura del codigo me gusta, esta limpio y bien organizado.

    ResponderEliminar
    Respuestas
    1. Por favor mandame mas detalle de tu problema, por que acabo de bajar el codigo y sale correctamente, puedes mandarme mail a jamko19@gmail.com

      Eliminar
  7. Hola amigo .. estoy intentado ejecutar tu codigo .. pero me sale un error y no se porque .. me puedes ayudar ..
    el error es :

    Include ZPRIMERPROGRAMA_B
    Between "TYPE" and "ANY", "TYPE" is missing (see HELP COMPUTE). (see
    HELP COMPUTE). (see HELP COMPUTE). (see HELP COMPUTE). (see HELP
    COMPUTE).

    ResponderEliminar
    Respuestas
    1. Podrias, mandarme la pantalla del error, al mail jamko19@gmail.com.

      Eliminar
  8. Claro que si amigo .. te lo acabo de enviar ojala me puedas orientar con el error.

    ResponderEliminar
  9. Hola Jose Excelente programa muy bien estructurado y ordenado, tengo el mismo problema. Lo puedes publicar para hacer la correcion. gracias.

    Include ZPRIMERPROGRAMA_B
    Between "TYPE" and "ANY", "TYPE" is missing (see HELP COMPUTE). (see
    HELP COMPUTE). (see HELP COMPUTE). (see HELP COMPUTE). (see HELP
    COMPUTE).
    Atte. Luis E. Gutierrez

    ResponderEliminar
    Respuestas
    1. Hola Luis.

      Este error esta en la rutina f_handle_subtotal_text, mas bien se debido a un error de copy paste, pero aqui te paso la rutina completa:

      FORM f_handle_subtotal_text
      USING p_es_subtottxt_info TYPE lvc_s_stxt
      p_ep_subtot_line TYPE REF TO data
      p_e_event_data TYPE REF TO cl_alv_event_data.

      * Declaración de apuntadores locales.
      FIELD-SYMBOLS: TYPE ANY.

      * Campo con los totales
      CASE p_es_subtottxt_info-criteria.
      WHEN 'LIFNR'.

      * Asignado un texto del subtotal.
      ASSIGN p_e_event_data->m_data->* TO .
      = 'Subtotal Vendor'.

      p_es_subtottxt_info-crit_text = 'Subtotal Vendor'.

      ENDCASE.

      ENDFORM. " F_HANDLE_SUBTOTAL_TEXT

      Solo basta con reemplazar este codigo con el anterior.


      Saludos.

      Eliminar