PDA

Ver la Versión Completa : Enter + Alv Oo


ciberdrago
17/02/10, 22:11:03
Hola como estan? tengo un problema y no se si me puedan ayudar, en el trabajo me han pedido que haga un ALV OO en cual deben de haber campos editables y campos no editables, lo estoy haciendo con alv OO pero me piden que cuando aprete ENTER en un campo se modifiquen los demas...

eh leido que se tendría que hacer con data_changed pero no se de que manera implementarlo.

Muchas gracias,

Saludos

DavidXD_XD
18/02/10, 02:33:48
Hola ciberdrago, hice un ejemplo con lo que quieres, te dejo el codigo y el dynpro, con los comentarios te guiaras del programa, espero te pueda ayudar :D


*&---------------------------------------------------------------------*
*& Programa : zdemo_alv
*& Autor : David Carballido
*& Fecha : 17.02.2010
*& Descripcion : Muestra el cambio de celda dependiendo de otra celda
*&---------------------------------------------------------------------*
REPORT zdemo_alv.
* Definicion de clases
CLASS lcl_event DEFINITION DEFERRED.
* Tipos Globales
TYPES: BEGIN OF ty_itab,
campo1 TYPE i,
campo2 TYPE p DECIMALS 2,
END OF ty_itab.
* Variables Globales
DATA: gcl_grid TYPE REF TO cl_gui_alv_grid,
gcl_custom TYPE REF TO cl_gui_custom_container,
gcl_event TYPE REF TO lcl_event,
gt_fcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo,
gt_itab TYPE TABLE OF ty_itab.
* Simbolos de campo globales
FIELD-SYMBOLS: <fs_itab> TYPE ty_itab.
* Parametros de Seleccion
PARAMETERS: p_fila TYPE i OBLIGATORY.

* Definicion e Implementacion de clase de eventos
CLASS lcl_event DEFINITION.
PUBLIC SECTION.
METHODS handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS.

CLASS lcl_event IMPLEMENTATION.
METHOD handle_data_changed.
* Se elevara al cuadrado la cantidad que se encuentre en la primera col.
DATA: ls_stable TYPE lvc_s_stbl.

FIELD-SYMBOLS: <fs_good> TYPE lvc_s_modi.

LOOP AT er_data_changed->mt_good_cells ASSIGNING <fs_good>.
READ TABLE gt_itab INDEX <fs_good>-row_id ASSIGNING <fs_itab>.

IF sy-subrc = 0.
<fs_itab>-campo1 = <fs_good>-value.
<fs_itab>-campo2 = <fs_good>-value ** 2.
ENDIF.
ENDLOOP.
* Actualizando cambios
* Posicionando sobre la ultima fila y columna
ls_stable-row = 'X'.
ls_stable-col = 'X'.

CALL METHOD gcl_grid->refresh_table_display
EXPORTING
is_stable = ls_stable.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
* Llenando datos en tabla interna
DO p_fila TIMES.
APPEND INITIAL LINE TO gt_itab ASSIGNING <fs_itab>.
<fs_itab>-campo1 = sy-index.
<fs_itab>-campo2 = sy-index ** 2.
ENDDO.
* Llamando al ALV
IF LINES( gt_itab ) > 0.
CALL SCREEN 100.
ENDIF.

*&---------------------------------------------------------------------*
*& Module status OUTPUT
*&---------------------------------------------------------------------*
MODULE status OUTPUT.

SET PF-STATUS 'ST_100'.
PERFORM status.

ENDMODULE. " status OUTPUT

*&---------------------------------------------------------------------*
*& Module user_command INPUT
*&---------------------------------------------------------------------*
MODULE user_command INPUT.

CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.

ENDMODULE. " user_command INPUT

*&---------------------------------------------------------------------*
*& Form status
*&---------------------------------------------------------------------*
* Instanciar ALV
*----------------------------------------------------------------------*
FORM status.
* Variables Locales
DATA: ls_stable TYPE lvc_s_stbl.

IF gcl_custom IS INITIAL.
* Instanciando contenedor
CREATE OBJECT gcl_custom
EXPORTING
container_name = 'ALV_LIST'.
* Instanciando grilla
CREATE OBJECT gcl_grid
EXPORTING
i_parent = gcl_custom.
* Llenando atributos de ALV
PERFORM build_attributes_alv CHANGING gt_fcat
gs_layout.
* Instanciando clase de eventos
CREATE OBJECT gcl_event.
* Enlazando la clase de eventos al ALV
SET HANDLER gcl_event->handle_data_changed FOR gcl_grid.
* Registrando evento ENTER y otras teclas para captar cambio
CALL METHOD gcl_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.

CALL METHOD gcl_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
* Llamando a ALV
CALL METHOD gcl_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
CHANGING
it_fieldcatalog = gt_fcat
it_outtab = gt_itab.
ELSE.
* Posicionando sobre la ultima fila y columna
ls_stable-row = 'X'.
ls_stable-col = 'X'.

CALL METHOD gcl_grid->refresh_table_display
EXPORTING
is_stable = ls_stable.
ENDIF.

ENDFORM. " status

*&---------------------------------------------------------------------*
*& Form build_attributes_alv
*&---------------------------------------------------------------------*
* Construyendo atributos del ALV
*----------------------------------------------------------------------*
* <--PT_FCAT : Catalogo del ALV
* <--PS_LAYOUT : Layout del ALV
*----------------------------------------------------------------------*
FORM build_attributes_alv CHANGING pt_fcat TYPE lvc_t_fcat
ps_layout TYPE lvc_s_layo.
* Variables Locales
FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.
* Construyendo catalogo
CLEAR pt_fcat.
APPEND INITIAL LINE TO pt_fcat ASSIGNING <fs_fcat>.
<fs_fcat>-edit = 'X'.
<fs_fcat>-fieldname = 'CAMPO1'.
<fs_fcat>-tabname = 'GT_ITAB'.
<fs_fcat>-outputlen = 8.
<fs_fcat>-coltext = 'Campo 1'.

APPEND INITIAL LINE TO pt_fcat ASSIGNING <fs_fcat>.
<fs_fcat>-fieldname = 'CAMPO2'.
<fs_fcat>-tabname = 'GT_ITAB'.
<fs_fcat>-outputlen = 8.
<fs_fcat>-coltext = 'Campo 2'.
* Construyendo Layout
CLEAR ps_layout.
ps_layout-zebra = 'X'.
ps_layout-cwidth_opt = 'X'.

ENDFORM. " build_attributes_alv


Y este es la logica del dynpro

PROCESS BEFORE OUTPUT.
MODULE status.

PROCESS AFTER INPUT.
MODULE user_command.

ciberdrago
18/02/10, 13:23:23
Muchas gracias... voy a leerlo y te comento =P!!!!!!!!!!!!

ciberdrago
18/02/10, 14:03:22
leido y probado!!!! Muchas gracias men te debo una (B)(B)(B)(B) =D