Validar checkbox en un ALV

Colapsar
Este tema está cerrado
X
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • oshima
    Junior Member
    • jun
    • 15

    #1

    Validar checkbox en un ALV

    Hola gente, Feliz año a todos.

    Una cosilla,

    Tengo un ALV al que le he añadido una campo checkbox de esta manera:
    Código:
    [SIZE="1"]
    En el catálogo de campos lo añado así:
    ...
      CLEAR ls_fieldcat.
      ls_fieldcat-fieldname   = 'CAMPO_SEL'.
      ls_fieldcat-col_pos      = 1.
      ls_fieldcat-seltext_m   = '  '.
      ls_fieldcat-checkbox    = 'X'.
      ls_fieldcat-input          = 'X'.
      ls_fieldcat-edit            = 'X'.
      APPEND ls_fieldcat TO lt_fieldcat.
    ...
    
    Y en el layout así:
    FORM layout_build USING ls_layout TYPE slis_layout_alv.
    ...
      ls_layout-zebra             = 'X'.
      ls_layout-cell_merge        = ' '.
      ls_layout-colwidth_optimize = 'X'.
      ls_layout-no_input          = ' '.
      ls_layout-no_vline          = ' '.
      ls_layout-no_colhead        = ' '.
      ls_layout-box_fieldname     = 'CAMPO_SEL'.
      ls_layout-lights_fieldname  = ' '.
      ls_layout-lights_condense   = ' '.
      ls_layout-totals_text       = ' '.
      ls_layout-subtotals_text    = ' '.
      ls_layout-totals_only       = ' '.
      ls_layout-key_hotspot       = ' '.
      ls_layout-detail_popup      = ' '.
    ...
    
    Luego me he creado un botón que al pulsarlo ejecuta un user_command.
    ...
    FORM PATATIN...
      CASE v_ucomm.
        WHEN '&SAVE'.
          PERFORM GRABAR.
      ENDCASE.
    END FORM.
    ...
    [/SIZE]
    El caso es que si modifico cualquier cosa del ALV se me mete solo en la tabla interna, pero el checkbox este o no pulsado no me cambia de estado en la tabla interna, no se si me falta algo o qué puede pasar, ¿alguien me puede echar una mano?.

    Gracias.

    La tabla interna tiene todos los campos y le he hecho un include del nuevo que es de tipo caracter y de una sola posición.
    La función que uso es para el ALV es "REUSE_ALV_GRID_DISPLAY".
    Editado por última vez por oshima; 02/01/2012, 15:22:05.
  • edgar_par87
    Junior Member
    • nov
    • 21

    #2
    CheckBox ALV.

    Hola Oshima, te anexo código que a mi me ha funcionado:

    Código:
    REPORT  ZPRUEBA_MARS.
    
    TABLES kna1.
    
    TYPE-POOLS slis.
    
    SELECT-OPTIONS s_kunnr FOR kna1-kunnr.
    
    TYPES: begin of ty_kna1,
              kunnr TYPE kna1-kunnr,
              name1 type kna1-name1,
           END OF ty_kna1.
    
    TYPES: begin of ty_out,
              box TYPE c,
              kunnr TYPE kna1-kunnr,
              name1 type kna1-name1,
           END OF ty_out.
    
    DATA: w_kna1 TYPE ty_kna1,
          w_out TYPE ty_out,
          i_kna1 TYPE STANDARD TABLE OF ty_kna1,
          i_out TYPE STANDARD TABLE OF ty_out.
    
    DATA: begin of w_cat,
                box TYPE c,
                kunnr LIKE kna1-kunnr,
               name1 LIKE kna1-name1,
           END OF w_cat.
    
    SELECT kunnr
           name1
      FROM kna1
      INTO TABLE i_kna1
     WHERE kunnr IN s_kunnr.
    
    LOOP AT i_kna1
         INTo w_kna1.
    
      w_out-kunnr = w_kna1-kunnr.
      w_out-name1 = w_kna1-name1.
    
      APPEND w_out TO i_out.
    
    ENDLOOP.
    
    DATA: i_catalogo TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.
    
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
     EXPORTING
        I_PROGRAM_NAME               = 'ZPRUEBA_MARS'
        I_INTERNAL_TABNAME           = 'W_CAT'
        I_INCLNAME                   = 'ZPRUEBA_MARS'
      CHANGING
        CT_FIELDCAT                  = i_catalogo[]
       EXCEPTIONS
        INCONSISTENT_INTERFACE       = 1
        PROGRAM_ERROR                = 2
        OTHERS                       = 3
              .
    IF SY-SUBRC <> 0.
    
    ENDIF.
    
    LOOP AT i_catalogo.
    
      CASE i_catalogo-fieldname.
    
        WHEN 'BOX'.
          i_catalogo-checkbox = 'X'.
          i_catalogo-edit = 'X'.
    
      ENDCASE.
    
      MODIFY i_catalogo.
      CLEAR i_catalogo.
    
    ENDLOOP.
    
    DATA: w_layout TYPE SLIS_LAYOUT_ALV.
    
    w_layout-box_fieldname = 'BOX'.
    
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
     EXPORTING
       I_CALLBACK_PROGRAM                = 'ZPRUEBA_MARS'
       I_CALLBACK_PF_STATUS_SET          = 'F_STATUS'
       I_CALLBACK_USER_COMMAND           = 'F_USER'
       IS_LAYOUT                         = w_layout
       IT_FIELDCAT                       = i_catalogo[]
      TABLES
        T_OUTTAB                          = i_out[]
     EXCEPTIONS
       PROGRAM_ERROR                     = 1
       OTHERS                            = 2
              .
    
    *&---------------------------------------------------------------------*
    *&      Form  F_STATUS
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_UCOMM    text
    *      -->P_SELFIELD text
    *----------------------------------------------------------------------*
    FORM F_user
         USING    p_ucomm    TYPE sy-ucomm
       CHANGING p_selfield TYPE slis_selfield.
    
      DATA lv_ref_grid TYPE REF TO cl_gui_alv_grid.
    
      DATA lv_cancel TYPE c.
    
      IF lv_ref_grid IS INITIAL.
        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
          IMPORTING
            e_grid = lv_ref_grid.
      ENDIF.
    
      IF NOT lv_ref_grid IS INITIAL.
        CALL METHOD lv_ref_grid->check_changed_data.
      ENDIF.
    
    
    
    ENDFORM.                    "F_STATUS
    
    *&---------------------------------------------------------------------*
    *&      Form  f_pf_status_set
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_CE_FUNC_EXCLUDE  text
    *----------------------------------------------------------------------*
    FORM f_status
      USING p_ce_func_exclude TYPE slis_t_extab.
    
      CLEAR p_ce_func_exclude[].
      SET PF-STATUS 'ZSTANDARD'
           EXCLUDING p_ce_func_exclude .
    
    ENDFORM.                    "f_pf_status_set
    Saludos!!

    Comentario

    • oshima
      Junior Member
      • jun
      • 15

      #3
      Al final lo único que he tenido que hacer es actualizar la tabla interna con los datos del ALV, de esta manera:

      Código:
        DATA: lv_change TYPE c.
        DATA: ref1 TYPE REF TO cl_gui_alv_grid.
        CLEAR lv_change.
      
        CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
          IMPORTING
            e_grid = ref1.
      
        CALL METHOD ref1->check_changed_data
          IMPORTING
            e_valid = lv_change.

      Comentario

      Trabajando...