Capturar eventos en alv

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • sanckok
    Member
    • oct
    • 40

    #1

    Capturar eventos en alv

    Hola a todos,

    Antes de nada, pedir perdon por postear con anterioridad este mensage en un tema que no tocaba, lo vuelvo a poner aqui.

    Es la primera vez que posteo, ya que normalmente encuentro lo que necesito.
    Ahora se me presenta un problema y no se como solucionarlo
    En un ALV tengo una columna que es editable. Necesito saber cuando se modifica para poder hacer un calculo en ese mismo momento.
    Entiendo que tengo que capturar el evento DATA_CHANGED o LIST_MODIFY, pero no me hace el efecto deseado.

    A alguien se le ocurre como puedo hacer esto, si voy bien encaminado o mejor hacerlo de otra forma.

    He mirado de hacerlo con objetos, pero tendria que modificar todo el programa y no quiero, ya que lo tienen en produccion.

    Muchas gracias por leerme
  • ibecerra

    #2
    Que tal, lo podrias hacer con un enter, es decir te creas un status "Menu" lo invocas desde el alv.
    pero debes hacer algo especial en el status.. en el boton que tiene un
    √ poner la palabra enter o ok.
    luego cuando estes en la celda editables y des enter se accionara el
    USER_COMMAND
    ejemplo..
    si llamo a la funcion para displayar el alv
    CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
    i_callback_program = g_repid
    i_callback_pf_status_set = 'SET_STATUS' ---LLAMADA DEL MENU
    i_callback_user_command = 'USER_COMMAND' -- ,, DEL USERCOMMAD
    i_structure_name = 'TI_INTERNA'
    is_layout = gs_layout
    it_fieldcat = gt_fieldcat[]
    IT_EXCLUDING = gs_exclude[]
    i_save = g_save
    is_variant = g_variant
    it_events = gt_events[]
    is_print = gs_print
    TABLES
    t_outtab = TI_INTERNA
    EXCEPTIONS
    program_error = 1
    OTHERS = 2.



    FORM user_command USING pa_ucomm LIKE sy-ucomm
    pa_tabla TYPE slis_selfield.
    CASE pa_ucomm.
    when 'ENTER'.

    CHECK NOT pa_tabla-value IS INITIAL.
    READ TABLE TI_INTERNA INDEX pa_tabla-tabindex. "Te indica en la posicion q se encuentra.
    IF SY-SUBRC EQ 0.
    aqui pones tu logica de calculo.... y actualizas tu tabla interna
    ENDIF.
    * y por ultimo para refrescarla ejecutas la siguiente sentencia
    pa_tabla-refresh = 'X'.
    pa_tabla-col_stable = 'X'.
    pa_tabla-row_stable = 'X'.

    encase.
    espero poder haberte ayudado.
    saludos

    Comentario

    • sanckok
      Member
      • oct
      • 40

      #3
      Muchas gracias,
      La verdad es que al final lo he conseguido. Pongo aqui como lo he hecho, ya que creo que le puede ir bien a alguien

      Primero agrego el evento DATA_CHANGED a la llamada del alv, en tu codigo seria en el gt_events[]
      FORM eventtab_build USING it_events TYPE slis_t_event.

      DATA: l_event TYPE slis_alv_event.

      CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
      EXPORTING
      i_list_type = 0
      IMPORTING
      et_events = it_events.


      l_event-name = 'DATA_CHANGED'.
      l_event-form = 'DATA_CHANGED'.
      APPEND l_event TO it_events.
      ENDFORM. "eventtab_build

      Luego creo la rutina DATA_CHANGED para efectuar los cambios necesarios. El evento salta con el INTRO

      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 .
      data c_texto like tj30t-txt30.
      * Inicialitzacions
      data rs_selfield TYPE slis_selfield.

      * 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 = 'ESTAT'.
      SELECT SINGLE txt30 INTO c_texto
      FROM tj30t
      WHERE stsma = 'ZCSIORD'
      AND estat = ls_mod_cell-value
      AND spras = sy-langu.
      READ TABLE g_mseg index ls_mod_cell-row_id .
      if sy-subrc = 0.
      g_mseg-txt30 = c_texto.
      modify g_mseg index ls_mod_cell-row_id.
      call method rr_data->MODIFY_CELL
      exporting i_row_id = ls_mod_cell-row_id
      i_fieldname = 'TXT30'
      i_value = c_texto.
      ENDIF.
      ENDIF.
      ENDLOOP.
      * MESSAGE i300.
      ENDFORM.


      Muchas gracias de nuevo

      Comentario

      • sanckok
        Member
        • oct
        • 40

        #4
        Perdon, para que funcione, se me ha olvidado decir una cosa
        En la funcion REUSE_ALV_GRID_DISPLAY se le ha de pasar un parametro:
        i_grid_settings = i_lvc_s_glay

        Y llenarlo con:
        DATA i_lvc_s_glay LIKE lvc_s_glay.

        i_lvc_s_glay-edt_cll_cb = 'X'.

        Comentario

        • sanvic
          Member
          • nov
          • 32

          #5
          Hola, use el change data y me sirvio pero lo uso para recuperar la descripción del campo que se acaba de modificar, y claro como no pasa despues por el user command no se actualiza, sabe alguien como arreglarlo.

          Gracias,
          Salu2

          Comentario

          • negrogho
            Member
            • ene
            • 65

            #6
            Sanvic

            el metodo para modificar la celda en el Alv tambien te lo pusieron en el ejemplo

            call method rr_data->MODIFY_CELL
            exporting i_row_id = ls_mod_cell-row_id
            i_fieldname = 'TXT30'
            i_value = c_texto.


            saludos

            Comentario

            • sanvic
              Member
              • nov
              • 32

              #7
              Muchas gracias, a veces parezco un poco cieguita :P

              Comentario

              • ksper
                Junior Member
                • nov
                • 13

                #8
                Yo tengo un reporte ALV, donde solo una columna es editable, le pongo el valor que quiero y le doy enter y de manera de visualizar se ven los campos que cambie y demas... pero no se como actualizar mi tabla Z...

                osea como actualizo mi tabla interna para que tome los nuvos valores introducidos y de ahi actualizar mi tabla z....

                espero me puedan ayudar..

                saludos..
                Octavio Sánchez Arce
                SAP Consultant / Capgemini / Mexico
                www.capgemini.com

                Comentario

                • ksper
                  Junior Member
                  • nov
                  • 13

                  #9
                  Originalmente publicado por sanckok
                  Muchas gracias,
                  La verdad es que al final lo he conseguido. Pongo aqui como lo he hecho, ya que creo que le puede ir bien a alguien

                  Primero agrego el evento DATA_CHANGED a la llamada del alv, en tu codigo seria en el gt_events[]
                  FORM eventtab_build USING it_events TYPE slis_t_event.

                  DATA: l_event TYPE slis_alv_event.

                  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
                  EXPORTING
                  i_list_type = 0
                  IMPORTING
                  et_events = it_events.


                  l_event-name = 'DATA_CHANGED'.
                  l_event-form = 'DATA_CHANGED'.
                  APPEND l_event TO it_events.
                  ENDFORM. "eventtab_build

                  Luego creo la rutina DATA_CHANGED para efectuar los cambios necesarios. El evento salta con el INTRO

                  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 .
                  data c_texto like tj30t-txt30.
                  * Inicialitzacions
                  data rs_selfield TYPE slis_selfield.

                  * 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 = 'ESTAT'.
                  SELECT SINGLE txt30 INTO c_texto
                  FROM tj30t
                  WHERE stsma = 'ZCSIORD'
                  AND estat = ls_mod_cell-value
                  AND spras = sy-langu.
                  READ TABLE g_mseg index ls_mod_cell-row_id .
                  if sy-subrc = 0.
                  g_mseg-txt30 = c_texto.
                  modify g_mseg index ls_mod_cell-row_id.
                  call method rr_data->MODIFY_CELL
                  exporting i_row_id = ls_mod_cell-row_id
                  i_fieldname = 'TXT30'
                  i_value = c_texto.
                  ENDIF.
                  ENDIF.
                  ENDLOOP.
                  * MESSAGE i300.
                  ENDFORM.


                  Muchas gracias de nuevo


                  Oye una duda, que es G_MSEG??

                  esa tabla donde la llenas?? No me quedo claro esa parte,
                  agredeceria tu ayuda........
                  Octavio Sánchez Arce
                  SAP Consultant / Capgemini / Mexico
                  www.capgemini.com

                  Comentario

                  • sponsor
                    Senior Member
                    • may
                    • 108

                    #10
                    a mi este codigo no me hace nada, y no tengo claro que es lo que le tengo k pasar al import it_event de la llamada al alv grid.. hay que ponerle tab_events[]??

                    donde se deben colocar los performs de estos forms?

                    Poniendole eso no hace nada...
                    Editado por última vez por sponsor; 23/06/2010, 14:12:10.

                    Comentario

                    • sponsor
                      Senior Member
                      • may
                      • 108

                      #11
                      alguien que se le ocurra algo?

                      Comentario

                      • sponsor
                        Senior Member
                        • may
                        • 108

                        #12
                        no acabo de aclararme donde debo poner los performs a las rutinas eventtab y a la rutina data_changed, tampoco se exactamente que es rr_data que es lo que se le pasa a la rutina data_changed...

                        alguien me lo puede explicar?

                        Comentario

                        • julian.cely
                          Junior Member
                          • ene
                          • 1

                          #13
                          LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
                          IF ls_mod_cell-fieldname = 'ESTAT'.
                          SELECT SINGLE txt30 INTO c_texto
                          FROM tj30t
                          WHERE stsma = 'ZCSIORD'
                          AND estat = ls_mod_cell-value
                          AND spras = sy-langu.
                          READ TABLE g_mseg index ls_mod_cell-row_id .
                          IF sy-subrc = 0.
                          g_mseg-txt30 = c_texto.
                          modify g_mseg index ls_mod_cell-row_id.
                          call method rr_data->MODIFY_CELL
                          exporting i_row_id = ls_mod_cell-row_id
                          i_fieldname = 'TXT30'
                          i_value = c_texto.
                          ENDIF.
                          ENDIF.
                          ENDLOOP.
                          Yo creería que se podría mejorar el performance del reporte, sacando ese SELECT del LOOP, haces el SELECT antes del LOOP con un FOR ALL ENTRIES de la rr_data, luego dentro del LOOP lo que haces es un READ TABLE a la rr_data WITH KEY con la llave del área de trabajo que controla el LOOP. Espero que les sirva.

                          Comentario

                          Trabajando...