cl_gui_alv_grid and checkbox (Color a Row)

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jamiguel77
    Junior Member
    • jun
    • 21

    #1

    cl_gui_alv_grid and checkbox (Color a Row)

    Hola amigos, como estan?

    tengo mi programa funcionando en el cual incluyo una columna con checkbox, ya esta trabajando como quiero solo quiero agregarle una funcionalidad mas:
    Cuando el usuario le da click a algun renglon en el checkbox, quiero colorear el renglon (claro si el valor del checkbox es TRUE).

    Alguna idea de como hacerlo?

    Me imagino que debo de detectar el evento CLICK o no?

    Me base en este ejemplo para hacer trabajar mi alv, con el checkbox:
    BCALV_EDIT_05


    Gracias
  • luise32
    Member
    • oct
    • 71

    #2
    Hola, espero que no sea un poco tarde para responderte.

    Voy a suponer que la estructura de tu tabla la cual muestras en el ALV es la siguiente:

    Ojo: Ten en cuenta que estoy agregando una columna adicional la cual se llamara COLOR, el nombre no importa pero si debes tenerlo muy presente.

    Código:
    TYPES:
    BEGIN OF ty_data,
      bukrs       TYPE bukrs,
      belnr  TYPE belnr,
      check(1)   TYPE c,
    [B]  color(4)    TYPE c,[/B]
    END OF ty_data,
    Cuando generas el loyout seguramente utilizas unas lineas de código similares a lo siguiente: Ten en cuenta la linea que esta en negrilla la cual le permitirá a tu ALV identificar cual es la columna que almacenara el dato del color. Debes llamarlo igual al campo que creaste para almacenar el COLOR en la parte del TYPES:

    Código:
    FORM build_layout .
      gs_layout-edit       = 'X'.
    *  gs_layout-cwidth_opt = 'X'.
    *  gs_layout-numc_total = 'X'.
    *  gs_layout-frontend   = 'E'.
    *  gs_layout-no_totline = 'X'.
    *  gs_layout-no_toolbar = 'X'.
    *  gs_layout-no_rowmark = space.
    *  gs_layout-no_rowmove = 'X'.
    *  gs_layout-sel_mode = 'B' .    "Single selection
      gs_layout-grid_title = 'Mi Reporte'.
      [B]gs_layout-info_fname = 'COLOR'.[/B]
    ENDFORM.                    " BUILD_LAYOUT
    Por ultimo solo falta identificar las columnas que ya fueron marcadas para colorearlas, los colores son los siguientes:

    Código:
    CONSTANTS:
      zcol_greyblue(04)              TYPE c VALUE 'C100',
      zcol_lightgrey(04)             TYPE c VALUE 'C200',
      zcol_yellow(04)                TYPE c VALUE 'C300',
      zcol_bluegreen(04)             TYPE c VALUE 'C400',
      zcol_green(04)                 TYPE c VALUE 'C500',
      zcol_red(04)                   TYPE c VALUE 'C600',
      zcol_violett(04)               TYPE c VALUE 'C700',
     
      zcol_greyblue_int(04)          TYPE c VALUE 'C110',
      zcol_lightgrey_int(04)         TYPE c VALUE 'C210',
      zcol_yellow_int(04)            TYPE c VALUE 'C310',
      zcol_bluegreen_int(04)         TYPE c VALUE 'C410',
      zcol_green_int(04)             TYPE c VALUE 'C510',
      zcol_red_int(04)               TYPE c VALUE 'C610',
      zcol_violett_int(04)           TYPE c VALUE 'C710',
     
      zcol_greyblue_inv(04)          TYPE c VALUE 'C101',
      zcol_lightgrey_inv(04)         TYPE c VALUE 'C201',
      zcol_yellow_inv(04)            TYPE c VALUE 'C301',
      zcol_bluegreen_inv(04)         TYPE c VALUE 'C401',
      zcol_green_inv(04)             TYPE c VALUE 'C501',
      zcol_red_inv(04)               TYPE c VALUE 'C601',
      zcol_violett_inv(04)           TYPE c VALUE 'C701',
     
      zcol_greyblue_int_inv(04)      TYPE c VALUE 'C111',
      zcol_lightgrey_int_inv(04)     TYPE c VALUE 'C211',
      zcol_yellow_int_inv(04)        TYPE c VALUE 'C311',
      zcol_bluegreen_int_inv(04)     TYPE c VALUE 'C411',
      zcol_green_int_inv(04)         TYPE c VALUE 'C511',
      zcol_red_int_inv(04)           TYPE c VALUE 'C611',
      zcol_violett_int_inv(04)       TYPE c VALUE 'C711'.
    Usa los que necesites en realidad, el resto deséchalos o comentarealos.

    Por ultimo podrias hacer un loop para recorrer la tabla y determinar que color ira en cada fila del ALV o tambien justo en el momento cuando marcas el check en el evento change o change_finished.

    Código:
      LOOP AT ti_data INTO wa_data.
        IF wa_data-check = 'X'.
          wa_data-color = zcol_green.
        ELSE.
          wa_data-color = zcol_red.
        ENDIF.
      ENDLOOP.
    Espero te sirva esta guía.

    Saludos!
    Consultor SAP ABAP

    Comentario

    • jamiguel77
      Junior Member
      • jun
      • 21

      #3
      Hola luise32

      Gracias por responder y no es tarde.

      Ahorita mi gran problema es.... como detecto el Click en la columna del checkbox (en el preciso momento de darle click al checkbox) quisiera hacer lo siguiente:

      Algoritmo:

      si celdacheckada[indicedecolumna] entonces
      si columna3='AAA' entonces
      renglon[indicedecolumna].color=rojo
      endsi
      endsi

      El gran problema que he visto es detectar el CLICK, he visto que facilmente detectan el DOBLECLICK pero no asi el CLICK.

      algunos mencionan que hay que cambiar la columna de tipo checkbox a HOTSPOT, pero no entiendo mucho todavia al respecto.

      Te agradezco y tu codigo es sumamente claro.

      Gracias por compartir.

      Comentario

      • luise32
        Member
        • oct
        • 71

        #4
        Hola nuevamente

        Es preferible que coloques el evento del data_change_finished o data_change y con ellos entrar a validar. No tienes que detectar el evento del clic en la columna, mas bien valida si la fila cambio sus datos y si esta marcada pintala de un color y sino pintala de otro.

        Ejemplo: El usuario hace clic en el campo de check, al cambiar de vacio a 'X' y si presionas TAB o si te ubicas con la ayuda del mouse en otra celda o campo, el programa detectará que cambió la información de la tabla (siempre y cuando tengas declarados los eventos data_changed_finished o data_changed).

        Definition
        Código:
            on_data_changed
              FOR EVENT data_changed
              OF cl_gui_alv_grid
              IMPORTING "e_ucomm
                        er_data_changed
                        e_onf4
                        e_onf4_before
                        e_onf4_after,
        
            on_data_changed_finished
              FOR EVENT data_changed_finished OF cl_gui_alv_grid
              IMPORTING e_modified,
        Implementation
        Código:
          METHOD on_data_changed.
            PERFORM changed.
          ENDMETHOD.                    "on_data_changed
        
          METHOD on_data_changed_finished.
            PERFORM changed_finished.
          ENDMETHOD.                    "on_data_changed_finished
        En las rutinas entra a validar si hubo algún cambio en los datos, ten en cuenta que este codigo se disparará siempre que realices un cambio en los datos de cualquier campo y los finalices. Cuando digo finalizar me refiero a:

        1. El usuario hizo el cambio en la columna y presiono TAB o Enter
        2. El usuario hizo clic en una celda diferente a la actual.

        En una de esas rutinas (yo optaría por la change_finished) validaría la tabla haciendo un loop.

        Código:
          LOOP AT ti_data INTO wa_data.
            IF wa_data-check = 'X'.
              wa_data-color = zcol_green.
            ELSE.
              wa_data-color = zcol_red.
            ENDIF.
          ENDLOOP.
        Saludos, cualquier duda coméntame...
        Consultor SAP ABAP

        Comentario

        Trabajando...