PDA

Ver la Versión Completa : ALV Editable: REUSE_ALV_GRID_DISPLAY_LVC


xeram
27/09/10, 12:04:59
Buen día!!!
Soy nuevo en esto, así que no entiendo mucho todavía.

Estoy haciendo un desarrollo, donde tengo un alv editable. Para ellos uso la función REUSE_ALV_GRID_DISPLAY_LVC. Logre hacer que me cargue correctamente el alv y que el campo que quiero editar funciones bien, pero tengo una duda: ¿como leo el cambio?
O sea: una vez que muestra el alv, ingreso un valor en el campo que puedo editar y apreto el botón guardar, ¿como hago para tomar el cambio del alv y plasmarlo en la bd?

Gracias de antemano y disculpen las molestias

Neo_25
27/09/10, 12:27:16
** Entre el catálogo y el layout se crea lo que nos interesa
* se carga el catalogo del ALV
PERFORM f_cargar_catalogo USING pi_estructura
CHANGING li_catalogo.

** cogemos el valor que se ha escrito
" se define en el TOP, en * Definition of classes
* CREATE OBJECT g_application_9000.
* SET HANDLER g_application_9000->handle_data_changed FOR v_grid.
*****


* se carga la disposición de pantalla del ALV
PERFORM f_cargar_layout CHANGING lw_layout.


En el top se crea:
No cambies el orden o te dirá q no existe.

**********************************************************
* Definition of classes
**********************************************************
CLASS: lcl_application_9000 DEFINITION DEFERRED.

DATA: g_application_9000 TYPE REF TO lcl_application_9000.

*---------------------------------------------------------------------*
* CLASS LCL_APPLICATION_9000 DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_application_9000 DEFINITION.

PUBLIC SECTION.
METHODS: handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_application_9000 DEFINITION

*---------------------------------------------------------------------*
* CLASS LCL_APPLICATION_9000 IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_application_9000 IMPLEMENTATION.

METHOD handle_data_changed.
PERFORM f_handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed

ENDCLASS. "lcl_application_9000 IMPLEMENTATION



En tu perform, donde kieras ponerlo,
lo q te pongo es un ejemplo mío, tu tienes q adaptarlo.
pregunta si te hace falta.

*&---------------------------------------------------------------------*
*& Form F_HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* Cogemos el valor escrito y se comprueba si es mayor o no que wrbtr
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM f_handle_data_changed
USING pi_data TYPE REF TO cl_alv_changed_data_protocol.

DATA: ls_modi TYPE lvc_s_modi. "da el registro modificado (línea)
DATA: lv_error TYPE c.
* Variables para el field-symbol que creamos por código
DATA: lv_texto TYPE char19,
lv_importe TYPE ycant_imp.
FIELD-SYMBOLS: <fs_mio> TYPE ANY.

FIELD-SYMBOLS: <fs_alv> TYPE yco_co04_0060.


* ordeno la i_alv
SORT pi_data->mt_mod_cells BY row_id .
* recorro la i_alv y anoto el registro que se ha modificado
LOOP AT pi_data->mt_mod_cells INTO ls_modi.
* cojo el registro que se ha modificado
READ TABLE i_alv ASSIGNING <fs_alv> INDEX ls_modi-row_id.

IF sy-subrc = 0.
* Se mete el número nuevo en la tabla del ALV
* Convertir el número introducido (char) a número
PERFORM f_validar_valor USING ls_modi-value "valor char
CHANGING lv_importe. "valor número
* Introducimos el valor en el campo de la tabla
* Se crea el field-symbol como interesa - nombrecolumna
CONCATENATE '<FS_ALV>-' ls_modi-fieldname INTO lv_texto.
ASSIGN (lv_texto) TO <fs_mio>.

<fs_mio> = lv_importe.

ENDIF.
ENDLOOP.

xeram
27/09/10, 13:22:44
Gracias por la pronta respuesta!!!!

Ahí lo pruebo y cualquier cosa aviso por acá!!!

Muchas gracias!!

xeram
27/09/10, 13:37:49
*&---------------------------------------------------------------------*
*& Form F_HANDLE_DATA_CHANGED
*&---------------------------------------------------------------------*
* Cogemos el valor escrito y se comprueba si es mayor o no que wrbtr
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM f_handle_data_changed
USING pi_data TYPE REF TO cl_alv_changed_data_protocol.



Disculpa que te joda:
El pi_data que le pasas al form, ¿es la tabla que mostras en el alv o como lo declaras?

Gracias!

Neo_25
27/09/10, 13:44:29
No se de donde eres, pero:
Disculpa que te joda:
no queda bien.

Si, el pì_dat es la tabla q se muestra en el alv

xeram
27/09/10, 13:56:14
No se de donde eres, pero:

no queda bien.


Lo siento!!! Soy de argentina, y es una manera de decir: disculpa que te moleste!! Es algo propio de acá: joder = molestar.



Si, el pì_dat es la tabla q se muestra en el alv

Okis, gracias!!!

xeram
27/09/10, 14:58:21
Otra vez yo :(

Cuando haces este llamado:
SET HANDLER g_application_9000->handle_data_changed FOR v_grid

¿que valor corresponde al de v_grid?

Y cuando hago el llamado a la funcion:
FORM f_handle_data_changed
USING pi_data TYPE REF TO cl_alv_changed_data_protocol.

¿Como declaro la variable pi_data? Porque al reemplazarla con mi tabla interna me dice que son incompatibles.

Gracias por todo!!!!

Marlon21
27/09/10, 17:37:03
Hola el pi_data tienes que dejarlo asi tal y como está, ya que esa variable contendrá los cambios hechos en tu alv.



y el llamado:
SET HANDLER g_application_9000->handle_data_changed FOR v_grid

va antes de mandar tu REUSE_ALV_GRID_DISPLAY_LVC.


en tu top define.

data: v_grid type ref to cl_gui_alv_grid.

xeram
27/09/10, 18:14:21
Claro, eso lo tengo asi, pero pregunto lo de la pi_data porque cuando quiero activar me dice:
In PERFORM or CALL FUNCTION "F_HANDLE_DATA_CHANGED", the actual parameter "I_FINAL_REPORT" is incompatible with the formal parameter "PI_DATA".

Yo lo que hice es poner el llamado asi:
PERFORM f_handle_data_changed USING i_final_report.

donde i_final_report es la tabla que uso para mostrar el alv:
DATA:
i_final_report
TYPE STANDARD TABLE OF ty_final_report. "Table with output report str.

Pero debo estar haciendo mal, porque la tabla pi_data es de otro type :( :( :(

Marlon21
27/09/10, 18:22:19
Ese perform tiene que ir tal y como lo definieron arriba

*---------------------------------------------------------------------*
* CLASS LCL_APPLICATION_9000 DEFINITION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_application_9000 DEFINITION.

PUBLIC SECTION.
METHODS: handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_application_9000 DEFINITION

*---------------------------------------------------------------------*
* CLASS LCL_APPLICATION_9000 IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_application_9000 IMPLEMENTATION.

METHOD handle_data_changed.
PERFORM f_handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed

ENDCLASS. "lcl_application_9000 IMPLEMENTATION


No cambies er_data_changed por tu tabla interna, este metodo hace que automáticamente tu tabla interna a esa variable PI_DATA.

xeram
27/09/10, 18:27:19
Ahhhhhh ahi entendi!!!
Lo que pasa es que no me habia dado cuenta y yo lo estaba llamando al metodo por separado :P

MIL GRACIAS!!!!!