Alv Grid - Poo

16
ALV GRID & Programación Orientada a Objetos Manual de Desarrollo Ing. Alexander Clen Riva Ccaccaycucho 2009 World Business Partner Lima - Perú 08/01/2009

Transcript of Alv Grid - Poo

Page 1: Alv Grid - Poo

ALV GRID & Programación

Orientada a ObjetosManual de DesarrolloIng. Alexander Clen Riva Ccaccaycucho

2009

World Business PartnerLima - Perú

08/01/2009

Page 2: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

2 Ing. Alexander Clen Riva Ccaccaycucho

1. Obtención de la Data a mostrar en el ALV: Este procedimiento varia de acuerdo al programa que se esta desarrollando, en este caso tomaremos como ejemplo mostrar todo los proveedores.

Definición del patrón a usar para la estructura de la tabla interna a usar.

TYPES: BEGIN OF ty_lfa1, LIFNR LIKE LFA1-LIFNR, NAME1 LIKE LFA1-NAME1, END OF ty_lfa1.

Declaración de la tabla interna.

DATA: ti_lfa1 TYPE STANDARD TABLE OF ty_lfa1.

Invocar al método para obtener la data a mostrar.

START-OF-SELECTION. PERFORM get_data.END-OF-SELECTION.

Método que permite obtener la data a mostrar.

FORM get_data . SELECT LIFNR NAME1 INTO TABLE ti_lfa1 FROM LFA1.ENDFORM.

Avance del Programa.

TYPES: BEGIN OF ty_lfa1, LIFNR LIKE LFA1-LIFNR, NAME1 LIKE LFA1-NAME1, END OF ty_lfa1.

DATA: ti_lfa1 TYPE STANDARD TABLE OF ty_lfa1.

START-OF-SELECTION. PERFORM get_data.END-OF-SELECTION.*&---------------------------------------------------------------------**& Form get_data*&---------------------------------------------------------------------** Metodo para obtner la data que sera llenado en al ALV.*----------------------------------------------------------------------*FORM get_data .

Page 3: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

3 Ing. Alexander Clen Riva Ccaccaycucho

SELECT LIFNR NAME1 INTO TABLE ti_lfa1 FROM LFA1.ENDFORM. " get_data

2. Creación de la dynpro 100 y 200: Crearemos la dynpro 100 donde se mostrara el AVL y al hacer doble clic en la columna “Código”, enlazara a la dynpro 200, razón por la cual se crea la dynpro 200.

Fig. 1: Dynpro 100.

Arrastramos el control contenedor, asignamos al atributo Nombre: “CONTENEDOR”, nombre con el cual se hace la referencia en el programa principal, finalmente activar.

Fig. 2: Dynpro 200.

Page 4: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

4 Ing. Alexander Clen Riva Ccaccaycucho

En la dynpro 200, solo colocaremos un label con texto: “hola mundo”.

En la dynpro 100, Lógica de Proceso: Descomentar STATUS_0100 para el status, Crear el Modulo CREAR_ALV apartir de este modulo se invoca a los métodos que permiten crear el alv, Descomentar USER COMMAND_0100 para el manejor de eventos de contro del programa.

PROCESS BEFORE OUTPUT.MODULE STATUS_0100.MODULE CREAR_ALV.

PROCESS AFTER INPUT.MODULE USER_COMMAND_0100.

MODULE CREAR_0100.

MODULE CREAR_ALV OUTPUT.

PERFORM crear_alvgrid.

ENDMODULE.

3. Crear el ALV.

Variables Globales del ALV.

Page 5: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

5 Ing. Alexander Clen Riva Ccaccaycucho

*Variables del ALVDATA: go_cl_alvgrid TYPE REF TO cl_gui_alv_grid, go_container TYPE REF TO cl_gui_custom_container, gtd_fieldcat TYPE lvc_t_fcat, gst_layout TYPE lvc_s_layo.

Método crear_alvgrid.

FORM crear_alvgrid . IF go_container IS INITIAL. CREATE OBJECT go_container EXPORTING container_name = 'CONTENEDOR' EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 OTHERS = 5.

IF sy-subrc EQ 0. CREATE OBJECT go_cl_alvgrid EXPORTING i_parent = go_container.

* Invocar a los metodos del objeto go_cl_alvgrid.

CALL METHOD go_cl_alvgrid->REGISTER_EDIT_EVENT EXPORTING i_event_id = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.

CALL METHOD go_cl_alvgrid->REGISTER_EDIT_EVENT EXPORTING i_event_id = CL_GUI_ALV_GRID=>MC_EVT_ENTER.

CALL METHOD go_cl_alvgrid->SET_READY_FOR_INPUT EXPORTING i_ready_for_input = 1.

PERFORM genera_catalogo CHANGING gtd_fieldcat. PERFORM genera_layout CHANGING gst_layout.

CALL METHOD go_cl_alvgrid->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING is_layout = gst_layout i_save = 'A' CHANGING it_outtab = ti_lfa1[] it_fieldcatalog = gtd_fieldcat. ENDIF. ELSE. CALL METHOD go_cl_alvgrid->REFRESH_TABLE_DISPLAY.

Page 6: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

6 Ing. Alexander Clen Riva Ccaccaycucho

ENDIF.ENDFORM. " crear_alvgrid

La estructura de este método tener en cuenta lo siguiente:

container_name = 'CONTENEDOR'(‘CONTENEDOR’ es el nombre del contenedor creado en la dynpro 100).

PERFORM genera_catalogo CHANGING gtd_fieldcat.(Método para enlazar los campos de la tabla con las columnas del ALV.)

PERFORM genera_layout CHANGING gst_layout.(Metodo que permite determinar los atributos del ALV).

it_outtab = ti_lfa1[] (Tabla interna donde esta la data preparada a ser mostrara).

PERFORM genera_catalogo CHANGING gtd_fieldcat

FORM genera_catalogo CHANGING po_fieldcat TYPE lvc_t_fcat.

* Ojo el nombre de la tabla interna siempre tiene que ponerse aqui en* mayuscula, caso contrario no se mostrara los datos en elalv.

PERFORM set_cat USING 'TI_LFA1' 'LIFNR' 'Codigo' 10 space space CHANGING po_fieldcat.

PERFORM set_cat USING 'TI_LFA1' 'NAME1' 'Nombre' 10 space space CHANGING po_fieldcat.

ENDFORM. " genera_catalogo

PERFORM genera_layout CHANGING gst_layout.

FORM genera_layout CHANGING po_layout TYPE lvc_s_layo. po_layout-grid_title = 'Lista de registros'. po_layout-no_toolbar = 'X'.ENDFORM. " genera_layout

Page 7: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

7 Ing. Alexander Clen Riva Ccaccaycucho

PERFORM set_cat.

FORM set_cat USING pi_log pi_field pi_texto pi_long pi_edit pi_checkbox CHANGING po_fieldcat TYPE lvc_t_fcat.

DATA: lwa_fieldcat TYPE lvc_s_fcat.

lwa_fieldcat-tabname = pi_log. lwa_fieldcat-fieldname = pi_field. lwa_fieldcat-edit = pi_edit. lwa_fieldcat-checkbox = pi_checkbox. lwa_fieldcat-coltext = pi_texto. lwa_fieldcat-seltext = pi_texto. lwa_fieldcat-reptext = pi_texto. lwa_fieldcat-outputlen = pi_long.

APPEND lwa_fieldcat TO po_fieldcat.

ENDFORM. " set_cat

4. Aplicación de POO al ALV.

Definición de la Clase: Se declaran todo los comportamientos que se requiere que soporte el ALV, tales como: button_click, double_click, hotspot_click, onDrag, onDrop, nDropComplete, onDropGetFlavor. Para este ejemplo haremos el de double_click.

CLASS gcl_event DEFINITION. PUBLIC SECTION.* Metodo double click METHODS: handle_double_click FOR event double_click OF CL_GUI_ALV_GRID IMPORTING e_row e_column.ENDCLASS.

Implementación de los Métodos: Se implementa cada método declarado inicialmente en la clase.

* Implementacion de Metodos.CLASS gcl_event IMPLEMENTATION.* Implementacion del metodo doble click METHOD handle_double_click. DATA: ltd_read TYPE STANDARD TABLE OF ty_lfa1.

Page 8: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

8 Ing. Alexander Clen Riva Ccaccaycucho

DATA: lwa_read TYPE ty_lfa1.

READ TABLE ti_lfa1 INDEX e_row-index INTO lwa_read.

IF e_column EQ 'LIFNR'. CALL SCREEN '0200'. ENDIF. ENDMETHOD.ENDCLASS.

Instancias la Clase: En este paso creamos un objeto de la clase.

* Instancia de la Clase gcl_event.DATA: go_event TYPE REF TO gcl_event.

En este paso invocamos a los métodos creados en la clase, a través del objeto que acabamos de crear. Esto en el método crear_alvgrid, de la siguiente manera.

FORM crear_alvgrid . IF go_container IS INITIAL. CREATE OBJECT go_container EXPORTING container_name = 'CONTENEDOR' EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 OTHERS = 5.

IF sy-subrc EQ 0. CREATE OBJECT go_cl_alvgrid EXPORTING i_parent = go_container.

* Invocar a los metodos del objeto go_cl_alvgrid.

CALL METHOD go_cl_alvgrid->REGISTER_EDIT_EVENT EXPORTING i_event_id = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.

CALL METHOD go_cl_alvgrid->REGISTER_EDIT_EVENT EXPORTING i_event_id = CL_GUI_ALV_GRID=>MC_EVT_ENTER.

CALL METHOD go_cl_alvgrid->SET_READY_FOR_INPUT EXPORTING i_ready_for_input = 1.

PERFORM genera_catalogo CHANGING gtd_fieldcat. PERFORM genera_layout CHANGING gst_layout.

Page 9: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

9 Ing. Alexander Clen Riva Ccaccaycucho

CREATE OBJECT go_event. SET HANDLER go_event->handle_double_click FOR go_cl_alvgrid.

CALL METHOD go_cl_alvgrid->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING is_layout = gst_layout i_save = 'A' CHANGING it_outtab = ti_lfa1[] it_fieldcatalog = gtd_fieldcat. ENDIF. ELSE. CALL METHOD go_cl_alvgrid->REFRESH_TABLE_DISPLAY. ENDIF.ENDFORM. " crear_alvgrid

Listo, acabamos de invocar el método double_click

Enlazamos la dynpro 100.

START-OF-SELECTION. PERFORM get_data. CALL SCREEN '0100'.END-OF-SELECTION.

5. Programa completo.

*&---------------------------------------------------------------------**& Report ZALV_GRID_RIVA*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*

REPORT ZALV_GRID_RIVA.

TYPES: BEGIN OF ty_lfa1, LIFNR LIKE LFA1-LIFNR, NAME1 LIKE LFA1-NAME1, END OF ty_lfa1.

DATA: ti_lfa1 TYPE STANDARD TABLE OF ty_lfa1.

*Variables del ALVDATA: go_cl_alvgrid TYPE REF TO cl_gui_alv_grid,

Page 10: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

10 Ing. Alexander Clen Riva Ccaccaycucho

go_container TYPE REF TO cl_gui_custom_container, gtd_fieldcat TYPE lvc_t_fcat, gst_layout TYPE lvc_s_layo.

***************************************************************** Declarar la Clase****************************************************************CLASS gcl_event DEFINITION. PUBLIC SECTION.* Metodo double click METHODS: handle_double_click FOR event double_click OF CL_GUI_ALV_GRID IMPORTING e_row e_column.ENDCLASS.

* Implementacion de Metodos.CLASS gcl_event IMPLEMENTATION.* Implementacion del metodo doble click METHOD handle_double_click. DATA: ltd_read TYPE STANDARD TABLE OF ty_lfa1. DATA: lwa_read TYPE ty_lfa1.

READ TABLE ti_lfa1 INDEX e_row-index INTO lwa_read.

IF e_column EQ 'LIFNR'. CALL SCREEN '0200'. ENDIF. ENDMETHOD.ENDCLASS.

* Instancia de la Clase gcl_event.DATA: go_event TYPE REF TO gcl_event.

START-OF-SELECTION. PERFORM get_data. CALL SCREEN '0100'.END-OF-SELECTION.

*&---------------------------------------------------------------------**& Form get_data*&---------------------------------------------------------------------** Metodo para obtner la data que sera llenado en al ALV.*----------------------------------------------------------------------*FORM get_data . SELECT LIFNR

Page 11: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

11 Ing. Alexander Clen Riva Ccaccaycucho

NAME1 INTO TABLE ti_lfa1 FROM LFA1.ENDFORM. " get_data*&---------------------------------------------------------------------**& Module CREAR_ALV OUTPUT*&---------------------------------------------------------------------** Modulo que permite crear el alv.*----------------------------------------------------------------------*MODULE CREAR_ALV OUTPUT.

PERFORM crear_alvgrid.

ENDMODULE. " CREAR_ALV OUTPUT

*&---------------------------------------------------------------------**& Form crear_alvgrid*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM crear_alvgrid . IF go_container IS INITIAL. CREATE OBJECT go_container EXPORTING container_name = 'CONTENEDOR' EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 OTHERS = 5.

IF sy-subrc EQ 0. CREATE OBJECT go_cl_alvgrid EXPORTING i_parent = go_container.

* Invocar a los metodos del objeto go_cl_alvgrid.

CALL METHOD go_cl_alvgrid->REGISTER_EDIT_EVENT EXPORTING i_event_id = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.

Page 12: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

12 Ing. Alexander Clen Riva Ccaccaycucho

CALL METHOD go_cl_alvgrid->REGISTER_EDIT_EVENT EXPORTING i_event_id = CL_GUI_ALV_GRID=>MC_EVT_ENTER.

CALL METHOD go_cl_alvgrid->SET_READY_FOR_INPUT EXPORTING i_ready_for_input = 1.

PERFORM genera_catalogo CHANGING gtd_fieldcat. PERFORM genera_layout CHANGING gst_layout.

CREATE OBJECT go_event. SET HANDLER go_event->handle_double_click FOR go_cl_alvgrid.

CALL METHOD go_cl_alvgrid->SET_TABLE_FOR_FIRST_DISPLAY EXPORTING is_layout = gst_layout i_save = 'A' CHANGING it_outtab = ti_lfa1[] it_fieldcatalog = gtd_fieldcat. ENDIF. ELSE. CALL METHOD go_cl_alvgrid->REFRESH_TABLE_DISPLAY. ENDIF.ENDFORM. " crear_alvgrid*&---------------------------------------------------------------------**& Form genera_catalogo*&---------------------------------------------------------------------** Metodo que permite Crear las columnas del AVL: camposde la tabla

*----------------------------------------------------------------------** <--P_GTD_FIELDCAT text*----------------------------------------------------------------------*FORM genera_catalogo CHANGING po_fieldcat TYPE lvc_t_fcat.

* Ojo el nombre de la tabla interna siempre tiene que ponerseaqui en

* mayuscula, caso contrario no se mostrara los datos en el alv.

PERFORM set_cat USING 'TI_LFA1' 'LIFNR' 'Codigo' 10 space space

Page 13: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

13 Ing. Alexander Clen Riva Ccaccaycucho

CHANGING po_fieldcat.

PERFORM set_cat USING 'TI_LFA1' 'NAME1' 'Nombre' 10 space space CHANGING po_fieldcat.

**PERFORM set_cat USING 'TABLITA'* 'CHECK'* 'Eliminar'* 10* 'X'* 'X'* CHANGING po_fieldcat.

ENDFORM. " genera_catalogo*&---------------------------------------------------------------------**& Form genera_layout*&---------------------------------------------------------------------** Metodos que permite determinar los atributos del ALV.*----------------------------------------------------------------------** <--P_GST_LAYOUT text*----------------------------------------------------------------------*FORM genera_layout CHANGING po_layout TYPE lvc_s_layo. po_layout-grid_title = 'Lista de registros'. po_layout-no_toolbar = 'X'.* po_layout-box_fname = 'CHECK'.ENDFORM. " genera_layout*&---------------------------------------------------------------------**& Form set_cat*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*FORM set_cat USING pi_log pi_field pi_texto pi_long pi_edit pi_checkbox CHANGING po_fieldcat TYPE lvc_t_fcat.

Page 14: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

14 Ing. Alexander Clen Riva Ccaccaycucho

DATA: lwa_fieldcat TYPE lvc_s_fcat.

lwa_fieldcat-tabname = pi_log. lwa_fieldcat-fieldname = pi_field. lwa_fieldcat-edit = pi_edit. lwa_fieldcat-checkbox = pi_checkbox. lwa_fieldcat-coltext = pi_texto. lwa_fieldcat-seltext = pi_texto. lwa_fieldcat-reptext = pi_texto. lwa_fieldcat-outputlen = pi_long.

APPEND lwa_fieldcat TO po_fieldcat.

ENDFORM. " set_cat*&---------------------------------------------------------------------**& Module USER_COMMAND_0100 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE USER_COMMAND_0100 INPUT. IF sy-ucomm EQ 'CLOSE'. LEAVE PROGRAM. ENDIF.ENDMODULE. " USER_COMMAND_0100 INPUT*&---------------------------------------------------------------------**& Module STATUS_0100 OUTPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS100'.* SET TITLEBAR 'xxx'.

ENDMODULE. " STATUS_0100 OUTPUT*&---------------------------------------------------------------------**& Module USER_COMMAND_0200 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*MODULE USER_COMMAND_0200 INPUT. IF sy-ucomm EQ 'CLOSE'. CALL SCREEN '0100'. ENDIF.ENDMODULE. " USER_COMMAND_0200 INPUT

Page 15: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

15 Ing. Alexander Clen Riva Ccaccaycucho

6. Resultado

Fig. 4: Dynpro 100 mostrando el Alv con datos.

Doble clic en cualquier celda de la columna “codigo”.

Fig.4: Dynpro 200.

Page 16: Alv Grid - Poo

Alv Grid - Programación Orientada a Objetos 2009

16 Ing. Alexander Clen Riva Ccaccaycucho

Bueno este fue un ejemplito que queria compartir con Uds. ”El conocimiento humano pertenece al mundo” .