Ver la Versión Completa : ALV Editable: REUSE_ALV_GRID_DISPLAY_LVC
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
** 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.
Gracias por la pronta respuesta!!!!
Ahí lo pruebo y cualquier cosa aviso por acá!!!
Muchas gracias!!
*&---------------------------------------------------------------------*
*& 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!
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
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!!!
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.
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.
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!!!!!
www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web