Duda sobre el evento DATA_CHANGED

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • TUESDAY
    Member
    • may
    • 32

    #1

    Duda sobre el evento DATA_CHANGED

    Hola a todos.
    tengo un alv, en el que la columna de la cantidad es editable, a partir del valor que introduzcan en una celda de esa columna modifico la celda correspondiente de la columna de precios. Esto lo he hecho como han explicado en otro post usando el evento DATA_CHANGED. Hasta aqui, todo bien. Funciona correctamente.
    Mi problema viene porque la columna de precios tiene marcado el flag del do_sum. Es decir que al pintar el alv, se calcula el sumatorio de la columna.
    Y este sumatorio no se esta actualizando.
    Es decir, yo cambio la cantidad, y se modifica el valor del precio, pero no se modifica la suma total de la columna precio.
    He estado debbugeando y todo se arreglaría si pudiera marcar el campo rs_selfield-refresh = 'X'. Y mi problema consiste en que no sé como marcarlo desde el evento DATA_CHANGED.
    Tambien he probado a definirme it_event_exit.
    CLEAR ls_event_exit.
    ls_event_exit-ucomm = '%GC_ 117 89'.
    ls_event_exit-after = 'X'.
    APPEND ls_event_exit TO lt_event_exit.

    donde he comprobado que %GC_ 117 89 es el valor que toma sy-ucomm cuando pulsas intro despues de modificar una celda, pero tampoco funciona.
    Si en vez del campo after, marco el campo before, si me entra en el user-command, pero luego no pasa por el evento, con lo que tampoco me vale.
    En fin, cualquier sugerencia será bienvenida!!!
    Muchas gracias por adelantado.
  • ibecerra

    #2
    utiliza la siguiente sentencia
    data: d_stable like lvc_s_stbl.
    d_stable-row = 'X'.
    d_stable-col = 'X'.
    CALL METHOD grid1->refresh_table_display
    EXPORTING
    is_stable = d_stable
    i_soft_refresh = 'X'.

    sALUDOS

    Comentario

    • javi_garcia18
      Junior Member
      • jun
      • 23

      #3
      HOLA TUESDAY:

      esta muy bien hasta donde has avanzado me parece que has codificado bien lo unico q te falta es llamar al metodo

      CALL METHOD grid1->refresh_table_display

      para q tus cambios se refresquen internamente con esto no vas a tener problemas buena suerte.
      Si necesitas ayuda solo pidemela!!

      Comentario

      • TUESDAY
        Member
        • may
        • 32

        #4
        Hola, esa solucion la lei ayer en distintos foros, pero mi alv no es orientado a objetos yo uso la funcion 'REUSE_ALV_GRID_DISPLAY', perdón se me olvidó mencionarlo en el post anterior.
        Así que no se como definirme la instancia del objeto grid1 para aplicarle el metodo refresh_table, ni en que momento hacerlo.

        Muchas gracias a los dos por contestar tan rapido.

        Comentario

        • vcarrillo
          Junior Member
          • jul
          • 3

          #5
          Originalmente publicado por TUESDAY
          Hola, esa solucion la lei ayer en distintos foros, pero mi alv no es orientado a objetos yo uso la funcion 'REUSE_ALV_GRID_DISPLAY', perdón se me olvidó mencionarlo en el post anterior.
          Así que no se como definirme la instancia del objeto grid1 para aplicarle el metodo refresh_table, ni en que momento hacerlo.

          Muchas gracias a los dos por contestar tan rapido.
          Hay una función que te devuelve la referencia al ALV que muestras con el CALL FUNCTION... desde el evento que comentas, puedes obtener la referencia y ya puedes hacer la llamada al metodo.

          Código:
          CALL METHOD referencia->refresh_table_display

          Comentario

          • TUESDAY
            Member
            • may
            • 32

            #6
            y sabes que funcion es? O me puedes dar una indicacion de como encontrarla??

            Yo he encontrado ésta "UPP_ALV_GET_GRID_INSTANCE" pero no encuentro información sobre ella, y no sé muy bien como usarla
            Gracias por adelantado
            Editado por última vez por TUESDAY; 27/08/2008, 08:44:08.

            Comentario

            • vcarrillo
              Junior Member
              • jul
              • 3

              #7
              Originalmente publicado por TUESDAY
              y sabes que funcion es? O me puedes dar una indicacion de como encontrarla??

              Yo he encontrado ésta "UPP_ALV_GET_GRID_INSTANCE" pero no encuentro información sobre ella, y no sé muy bien como usarla
              Gracias por adelantado
              Decirte que para la version 4.6C no esta disponible el parametro e_grid, para la 6.20 si esta disponible. Es esta.

              Código:
              DATA: ld_grid TYPE REF TO cl_gui_alv_grid.
              CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
               IMPORTING
              *     ET_EXCLUDING             =
              *     E_REPID                  =
              *     E_CALLBACK_PROGRAM       =
              *     E_CALLBACK_ROUTINE       =
                 e_grid                   = ld_grid
              *     ET_FIELDCAT_LVC          =
              *     ER_TRACE                 =
              *     E_FLG_NO_HTML            =
              *     ES_LAYOUT_KKBLO          =
              *     ES_SEL_HIDE              =
              *     ET_EVENT_EXIT            =
                        .

              Comentario

              • TUESDAY
                Member
                • may
                • 32

                #8
                Muchas gracias por contestar!!!
                Lamentablemente, parece que esto no funciona ya que sigue sin actualizarme el valor del total.
                He puesto la llamada al metodo dentro del from data_change.
                Si alguien tiene alguna sugerencia más será bienvenida.
                De nuevo muchas gracias y saludos!

                Comentario

                • TUESDAY
                  Member
                  • may
                  • 32

                  #9
                  Vale, no he dicho nada, finalmente ha funcionado.
                  mi fallo estaba en que le he pasado el metodo con los parametros del exporting, pero al llamarlo sin pasarle nada por el exporting, ha funcionado perfectamente.
                  Muchas gracias a todos por vuestra ayuda!!!

                  Os dejo aqui el codigo de como ha quedado el evento data_change por si alguien lo necesitase algun dia.
                  FORM data_changed USING rr_data TYPE REF TO cl_alv_changed_data_protocol.
                  DATA : ls_mod_cell TYPE lvc_s_modi,
                  lv_value TYPE lvc_value,
                  ls_fielcat TYPE lvc_t_fcat.
                  * Inicialitzacions
                  DATA cant TYPE i.
                  * Tractament de les dades modificades
                  SORT rr_data->mt_mod_cells BY row_id .
                  LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
                  IF ls_mod_cell-fieldname = 'LFIMG'.
                  * Realizamos las operaciones necesarias para nuestra modificacion
                  READ TABLE i_alv INDEX ls_mod_cell-row_id .
                  * Convertimos el string a entero
                  SEARCH ls_mod_cell-value FOR ',0'.
                  IF sy-subrc = 0.
                  ls_mod_cell-value = ls_mod_cell-value+0(sy-fdpos).
                  ENDIF.
                  REPLACE '.' IN ls_mod_cell-value WITH space.
                  CONDENSE ls_mod_cell-value NO-GAPS.
                  MOVE ls_mod_cell-value TO cant.
                  PERFORM calc_precio_xfact USING i_alv-kbetr
                  i_alv-kpein
                  cant
                  CHANGING i_alv-kwert.

                  IF sy-subrc = 0.
                  MODIFY i_alv INDEX ls_mod_cell-row_id.
                  CALL METHOD rr_data->modify_cell
                  EXPORTING
                  i_row_id = ls_mod_cell-row_id
                  i_fieldname = 'KWERT'
                  i_value = i_alv-kwert.
                  ENDIF.
                  ENDIF.
                  ENDLOOP.
                  * Actualizamos el alv, para que se actualicen los totales
                  DATA: ld_grid TYPE REF TO cl_gui_alv_grid.
                  * Esta funcion devuelve la instancia del alv que estamos pintando
                  * para poder usar los metodos asociados al alv
                  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
                  * EXPORTING
                  * IR_SALV_FULLSCREEN_ADAPTER =
                  IMPORTING
                  * ET_EXCLUDING =
                  * E_REPID =
                  * E_CALLBACK_PROGRAM =
                  * E_CALLBACK_ROUTINE =
                  e_grid = ld_grid
                  * ET_FIELDCAT_LVC =
                  * ER_TRACE =
                  * E_FLG_NO_HTML =
                  * ES_LAYOUT_KKBLO =
                  * ES_SEL_HIDE =
                  * ET_EVENT_EXIT =
                  .

                  DATA: d_stable LIKE lvc_s_stbl.
                  d_stable-row = 'X'.
                  d_stable-col = 'X'.
                  * Actualizamos el alv
                  CALL METHOD ld_grid->refresh_table_display
                  * EXPORTING
                  * is_stable = d_stable
                  * i_soft_refresh = 'X'
                  .
                  ENDFORM.

                  Comentario

                  • vickxo
                    Senior Member
                    • nov
                    • 118

                    #10
                    Hola!

                    Hola, encontre este codigo:


                    FORM data_changed USING rr_data TYPE REF TO
                    cl_alv_changed_data_protocol.
                    DATA : ls_mod_cell TYPE lvc_s_modi.
                    DATA : c_texto LIKE tj30t-txt30.
                    SORT rr_data->mt_mod_cells BY row_id .
                    LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
                    * Compruebo que el campo que se ha modificado es el que quiero
                    tratar
                    IF ls_mod_cell-fieldname = 'ESTAT'.
                    * Haces las comprobaciones necesarias
                    SELECT SINGLE txt30 INTO c_texto
                    FROM tj30t
                    WHERE stsma = 'ZCSIORD'
                    AND txt04 = ls_mod_cell-value
                    AND spras = sy-langu.
                    READ TABLE g_mseg INDEX ls_mod_cell-row_id .
                    IF sy-subrc = 0.
                    * Con el resultado, modifico el campo que quiero
                    g_mseg-txt30 = c_texto.
                    * Primero modifico la tabla interna
                    MODIFY g_mseg INDEX ls_mod_cell-row_id.
                    * Luego hago el refresh del campo que quiero que se modifique
                    en el ALV
                    CALL METHOD rr_data->modify_cell
                    EXPORTING
                    i_row_id = ls_mod_cell-row_id
                    i_fieldname = 'TXT30' "Aquí va el campo que quieres
                    modificar
                    i_value = c_texto. "Aquí el texto que quieres
                    modificar
                    ENDIF.
                    ENDIF.
                    ENDLOOP.
                    ENDFORM. "data_change

                    lo tome de aqui ...



                    No c muy bien si puedes controlar el user_command su fuese asi podria intentar esto:
                    FORM user_command USING r_ucomm LIKE sy-ucomm
                    rs_selfield TYPE slis_selfield.
                    DATA: w_answer TYPE c.
                    rs_selfield-refresh = 'X'.

                    CASE r_ucomm.
                    WHEN 'EXEC'.
                    *--La comprobación sólo se realiza si no estamos en test, ya que
                    *..cuando ejecutamos en test no se crea el juego de datos
                    *****Campo PA_CHECK ya no se utiliza.JRMR2008
                    *****Se cambia por pregunta si se requiere ejecutar el registro de
                    *****las Facturas.
                    CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
                    EXPORTING
                    diagnosetext1 = 'Va a procesar las Facturas'
                    diagnosetext2 = 'Desea Continuar'
                    textline1
                    ...



                    Saludos.

                    Saludos
                    el tema esta en hacer la pregunta correcta...

                    Comentario

                    • mcarrasco
                      Member
                      • jul
                      • 71

                      #11
                      Cl_gui_alv_grid

                      Amigo cambiate a CL_GUI_ALV_GRID, te tardara 1 o 2 dias si es muy largo... y te ahorras el problema..

                      Aunque tambien podrias desactivar el calculo automatico del total y hacerlo tu manual... y agregas un registro en blanco al alv_grid de color amarillo con los totales nada mas....

                      Atte. Marcos Carrasco...

                      Comentario

                      • Alhan
                        Junior Member
                        • may
                        • 3

                        #12
                        Movimiento de Cursor en ALV Orientado a Objetos.

                        Hola buenas noches como están?

                        la verdad que me urge saber lo siguiente:
                        me podrían apoyar por favor?

                        Les comento que tengo un problema, en el cual tengo 2 pantallas una la de parámetros de selección, y la siguiente es la que me muestra una serie de materiales con su descripción, lote, cantidad..etc

                        cuando marco la opción de agregar linea en la posición 3 me la agrega satisfactoriamente, pero al momento de agregar el material lo agrega y posteriormente me regresa el cursor al material de la posición 1, y eso es incorrecto ya que estoy tratando la linea 3 del documento.

                        alguien sabrá porque razón realiza eso?

                        muchas gracias por su apoyo!!!!

                        Comentario

                        • Alhan
                          Junior Member
                          • may
                          • 3

                          #13
                          Movimiento de Cursor en ALV Orientado a Objetos.

                          Hola buenas noches como están?

                          la verdad que me urge saber lo siguiente:


                          Les comento que tengo un problema, en el cual tengo 2 pantallas una la de parámetros de selección, y la siguiente es la que me muestra una serie de materiales con su descripción, lote, cantidad..etc

                          cuando marco la opción de agregar linea en la posición 3 me la agrega satisfactoriamente, pero al momento de agregar el material lo agrega y posteriormente me regresa el cursor al material de la posición 1, y eso es incorrecto ya que estoy tratando la linea 3 del documento.

                          alguien sabrá porque razón realiza eso?

                          muchas gracias por su apoyo!!!!

                          Comentario

                          Trabajando...