Problema ALV al Maximizar / ajustar / minimizar

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • andresf02
    Senior Member
    • nov
    • 190

    #1

    Problema ALV al Maximizar / ajustar / minimizar

    Buenos dias.

    He realizado reporte ABAP para el area de compras con ALV grid OO que esta funcionando muy bien, pero le he encontrado un problema cuando el usuario cambia de tamaño la ventana de sap (Maximiza, minimiza o ajusta a un tamaño deseado).

    Cuando el usuario cambia el tamaño, el reporte vuelve a mostrar todas las columnas del reporte quedando repetidas.

    Por ejemplo:

    Las columnas originales del reporte son:

    | Doc. Compras | Posicion | Importe |

    Al cambiar el tamaño de la ventana, el alv queda mostrando los campos asi:


    | Doc. Compras | Doc. Compras | Posicion | Posicion | Importe | Importe |


    Si el usuario vuelve a cambiar el tamaño de la ventan, maximizarla por ejemplo, ya el ALV muestra los campos 3 veces repetidos y asi cada vez que cambio el tamaño de la pantalla, repite cada uno de los campos una vez mas.


    Para evitar que el ALV recalcule los datos ya mostrados cuando cambio el tamaño de la pantalla he usado siempre el siguiente codigo que me ha funcionado muy bien:



    Código:
    DATA: gr_pantalla        TYPE scrfname.
    
    
    
    *En el PBO hago la condicion siguiente:
    if gr_pantalla is INITIAL.
    
        data: lr_pantalla     type scrfname value 'ALV_GRID_100',
              lr_disposicion  type lvc_s_layo,
              lr_catalogo     type lvc_t_fcat,
              lr_ordenacion   type lvc_t_sort,
              lv_titulo1(100) type c value 'REPORTE DE AHORRO DE COMPRADORES',
              lv_titulo2(100) type c.
    
    
        perform obtener_datos.
    
        perform obtener_catalogo changing lr_catalogo.
    
        perform obtener_disposicion CHANGING lr_disposicion.
    
        perform obtener_reporte using lr_pantalla   lr_disposicion lr_catalogo
                                      lr_ordenacion ty_tabcon[]      '50'
                                      lv_titulo1    lv_titulo2.
      ENDIF.
    Pensaba que con este codigo no deberia pasar tampoco lo de la duplicidad ed columnas pero al parecer para esto hace falta algo mas


    Lo unico que he hecho de diferente en este reporte respecto a los demas (donde NO me pasa este problema) es que si el usuario da doble click sobre el numero del Doc Compra, abre automaticamente la transaccion ME23N y lo despliega. Es decir, es interactivo.


    Para ello, a mi include con la que creo el ALV le agregue lo siguiente:

    Código:
    METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
          IMPORTING e_row e_column.
    
    
    METHOD handle_double_click.
        PERFORM double_click USING e_row e_column .
    ENDMETHOD.                    "handle_double_click
    
    
    *Y en el FRM va la funcion:
    *--------------------------------------------------------------------*
    * Definición DOUBLE CLICK
    *--------------------------------------------------------------------*
    FORM double_click  USING    p_row
                                p_column.
    
      DATA: wa_tabcon LIKE LINE  OF ty_tabcon.
    
        READ TABLE ty_tabcon INTO wa_tabcon INDEX p_row.
    
        CASE p_column.
    
          WHEN 'EBELN'. " Orden de Compra
            SET PARAMETER ID 'BES' FIELD wa_tabcon-ebeln.
            call TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
        ENDCASE.
      ENDIF.
    
    ENDFORM.
    Espero me puedan ayudar

    Gracias
    Editado por última vez por andresf02; 16/03/2011, 11:16:10.
  • ballan
    Senior Member
    • oct
    • 671

    #2
    Lo que te esta ocurriendo es que el usuario hace algo que provoca que vuelvas a rellenar el catalogo y por eso las columnas te salen duplicadas

    En definitiva busca en tu programa donde rellenas el fieldcat y lo primero de todo haz un refresh

    Comentario

    • andresf02
      Senior Member
      • nov
      • 190

      #3
      Gracias por la respuesta.

      Lo que hago con el Fieldcat es lo siguiente:


      Código:
      *En el FRM:
      
      form obtener_catalogo changing p_catalogo type lvc_t_fcat.
        data ls_catalogo type lvc_s_fcat.
      
        CLEAR ls_catalogo.
        ls_catalogo-col_pos   = 1.
        ls_catalogo-ref_table = 'EKKO'.
        ls_catalogo-ref_field = 'EBELN'.
        ls_catalogo-fieldname = 'EBELN'.
        ls_catalogo-coltext   = 'ORDEN COMPRA'.
        ls_catalogo-emphasize = 'C110'.
        APPEND ls_catalogo TO p_catalogo.
      
        CLEAR ls_catalogo.
        ls_catalogo-col_pos   = 2.
        ls_catalogo-ref_table = 'EKKO'.
        ls_catalogo-ref_field = 'BSART'.
        ls_catalogo-fieldname = 'BSART'.
        ls_catalogo-coltext   = 'CLASE ORDEN'.
        APPEND ls_catalogo TO p_catalogo.
      .
      .
      .
      .
      endform.                    "construir_catalogo
      
      
      
      
      *Esta funcion la llamo desde el PBO:
      
      module visualizar_alvgrid output.
      
        if gr_pantalla is INITIAL.
      
          data: lr_pantalla     type scrfname value 'ALV_GRID_100',
                lr_disposicion  type lvc_s_layo,
                lr_catalogo     type lvc_t_fcat,
                lr_ordenacion   type lvc_t_sort,
                lv_titulo1(100) type c value 'REPORTE DE AHORRO DE COMPRADORES',
                lv_titulo2(100) type c.
      
      
          perform obtener_datos.
      
          [COLOR="Red"]perform obtener_catalogo changing lr_catalogo.[/COLOR]
      
          perform obtener_disposicion CHANGING lr_disposicion.
      
          perform obtener_reporte using lr_pantalla     lr_disposicion lr_catalogo
                                                   lr_ordenacion ty_tabcon[]      '50'
                                                   lv_titulo1       lv_titulo2.
        ENDIF.
      endmodule.


      Que condicional podria implementar dentro de la funcion obtener_catalogo o al llamarla para que solamente se llene el catalogo una sola vez.


      Gracias!

      Comentario

      • ballan
        Senior Member
        • oct
        • 671

        #4
        Donde pone

        Código:
        *En el FRM:
        
        form obtener_catalogo changing p_catalogo type lvc_t_fcat.
          data ls_catalogo type lvc_s_fcat.
        
          CLEAR ls_catalogo.
          ls_catalogo-col_pos   = 1.
          ls_catalogo-ref_table = 'EKKO'.
        Pon

        Código:
        *En el FRM:
        
        form obtener_catalogo changing p_catalogo type lvc_t_fcat.
          data ls_catalogo type lvc_s_fcat.
        
          REFRESH: p_catalogo.
        
          CLEAR ls_catalogo.
          ls_catalogo-col_pos   = 1.
          ls_catalogo-ref_table = 'EKKO'.

        Comentario

        • andresf02
          Senior Member
          • nov
          • 190

          #5
          Perfecto!!!

          Problema Solucionado. No te habia entendido al comienzo a que te referias con hacerle refresco al catalogo.

          Gracias!!

          Comentario

          Trabajando...