PDA

Ver la Versión Completa : URGENTE - Dynpro en Objetos


javiercar
08/01/09, 11:26:19
Hola necesito hacer lo siguiente :

CHAIN.
FIELD: i_alv_new-ricefwid,
i_alv_new-vkorg,
i_alv_new-param,
i_alv_new-regid,
i_alv_new-value.
module validacion.
ENDCHAIN.

i_alv_new seria lo siguiente:

CALL METHOD d_grid_new->set_table_for_first_display
EXPORTING
i_structure_name = 'ZQT_PARAM'
is_layout = r_layout
it_toolbar_excluding = i_exclude
CHANGING
it_fieldcatalog = i_fieldcat
it_outtab = i_alv_new.


no me deja poner ese chain endchain como puedo hacer para poder hacer las validaciones de cada linea de la tabla i_alv_new para q cuando ocurra un error me marque la linea en rojo y me grise las demas ???


Gracias!.

DavidXD_XD
08/01/09, 13:43:00
HOla ... dentro del ALV no se puede jugar con CHAIN o FIELD MODULE, supongo que tienes celda editables y en base al ingreso tiene q validar, xfa si es asi para copiarte un ejemplo ...

javiercar
08/01/09, 14:14:09
Si es como vos decis, tengo campos editables.

DavidXD_XD
08/01/09, 15:16:59
Primero lo primero ... creo dentro de las clases locales el evento handle_data_changed

*----------------------------------------------------------------------*
* Definición de Clases (DEFINITION)
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.

PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT DOUBLE_CLICK OF cl_gui_alv_grid
IMPORTING
e_row
e_column,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING
er_data_changed.

PRIVATE SECTION.
DATA: l_coddet TYPE ztfi_pdb_det_com-coddet.

ENDCLASS.

*----------------------------------------------------------------------*
* Definición de Clases (IMPLEMENTATION)
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
* Evento Double Click
METHOD handle_double_click.
FIELD-SYMBOLS: <fs_exc> LIKE LINE OF t_exc.
CASE sy-dynnr.
WHEN 400.
READ TABLE t_exc INDEX e_row-index ASSIGNING <fs_exc>.
WHEN 500.
READ TABLE t_neu INDEX e_row-index ASSIGNING <fs_exc>.
ENDCASE.
IF sy-subrc = 0.
SET PARAMETER ID: 'BLN' FIELD <fs_exc>-belnr,
'BUK' FIELD <fs_exc>-bukrs,
'GJR' FIELD <fs_exc>-gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.
ENDMETHOD.
* Evento Data Changed
METHOD handle_data_changed.
* Variables locales
FIELD-SYMBOLS: <fs_detrac> LIKE LINE OF t_detrac.
LOOP AT er_data_changed->mt_good_cells INTO g_good.
SELECT COUNT(*)
FROM ztfi_pdb_det
WHERE coddet EQ g_good-value.
IF sy-subrc = 0.
READ TABLE t_detrac INDEX g_good-row_id ASSIGNING <fs_detrac>.
IF sy-subrc = 0.
<fs_detrac>-icon = icon_led_green.
ENDIF.
UNASSIGN <fs_detrac>.
ELSE.
READ TABLE t_detrac INDEX g_good-row_id ASSIGNING <fs_detrac>.
IF sy-subrc = 0.
<fs_detrac>-icon = icon_led_red.
ENDIF.
UNASSIGN <fs_detrac>.
ENDIF.
ENDLOOP.
ENDMETHOD.

ENDCLASS.

Dentro del ALV q hice se insertaba un codigo de detraccion dentro de la celda del ALV, y cuando lo colocaba y pasaba a otra celda automaticamente pasaba por el codigo que coloque arriba para ver si el codigo que inserte se encuentra dentro de la tabla ztfi_pdb_det, colocaba dentro del campo icon el icono verde, y sino lo colocaba en rojo (Puedes pintarlos en vez de colocarle iconos de status), ahora el ALV lo forme de esta manera:

*&---------------------------------------------------------------------*
*& Form status_600
*&---------------------------------------------------------------------*
* Instanciando el grid para el screen 600
*----------------------------------------------------------------------*
FORM status_600.

* Variables Locales
DATA: ls_stbl_det TYPE lvc_s_stbl.

IF g_container_600 IS INITIAL.
* Instanciamos el container principal
CREATE OBJECT g_container_600
EXPORTING
container_name = 'CONTAINER_600'.
* Separamos el container en título y grid
IF g_top_600 IS INITIAL.
CREATE OBJECT g_top_600
EXPORTING
style = 'ALV_GRID'.
ENDIF.
* Separamos en 2 filas el container principal
CREATE OBJECT g_splitter_600
EXPORTING
parent = g_container_600
rows = 2
columns = 1.
* Primer Splitter para el TOP OF PAGE
CALL METHOD g_splitter_600->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = g_parent_html_600.
* Segundo splitter para el grid
CALL METHOD g_splitter_600->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = g_parent_grid_600.
* Creando la instancia para el grid y enlazarla con el container
CREATE OBJECT g_grid_600
EXPORTING
i_appl_events = 'X'
i_parent = g_parent_grid_600.
* Creando el catálogo y definiendo layout
PERFORM build_fieldcat_600.
PERFORM build_layout.
PERFORM build_sort_600.
* Excluyendo botones
PERFORM exclude_button.
* Construyendo cabecera
PERFORM top_of_page_600.

CALL METHOD g_grid_600->set_table_for_first_display
EXPORTING
it_toolbar_excluding = gt_exclude
is_layout = gs_layout_600
CHANGING
it_outtab = t_detrac
it_fieldcatalog = ti_fieldcat_600
it_sort = ti_sort_600.
* Adicionando evento ENTER
CALL METHOD g_grid_600->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* Evento que captura los cambios realizados
CALL METHOD g_grid_600->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
* Instanciando el objeto que enlaza eventos y el grid
CREATE OBJECT g_event_receiver_600.
SET HANDLER g_event_receiver_600->handle_data_changed
FOR g_grid_600.
ELSE.
CLEAR ls_stbl_det.
ls_stbl_det-row = 'X'.
ls_stbl_det-col = 'X'.
CALL METHOD g_grid_600->refresh_table_display
EXPORTING
is_stable = ls_stbl_det.
ENDIF.

ENDFORM. " status_600

La parte importante de este codigo es cuando se llama a los eventos de ENTER y q captura los cambios realizados, eso sirve para que no tengas que presionar ningun boton y automaticamente valide el campo que has ingresado en la celda cuando salgas de ella ... espero te pueda servir

javiercar
09/01/09, 02:00:17
Se puede ejecutar la validacion solo cuando se toca el Boton del status SAVE ???


Gracias!