PDA

Ver la Versión Completa : Duda campo checkbox en ALV


javispill
28/01/09, 08:39:06
Buenas, estoy intentando insertar una columna en un ALV como checkbox pero me sale el botoncito para marcar el registro no el CHECKBOX como tal. Os pongo mi código a ver, eh estado buscando por ahí y entodos los sitios esta sim9ilar a como lo he hecho pero no quiero el boton de seleccionar quiero el checkbox que se pueda marcar con "v".

El campo de la tabla interna con la que saco el alv tiene declarado el campo checkbox como char1.


PERFORM asignar_campo_a_catalogo TABLES p_lt_fcat
USING:

'CHECKBOX' 'X' 'X ' 'X' 'X' ' ' '',
'PERNR' ' ' ' ' ' ' ' ' ' ' 'NºEmpleado',
'ENAME' ' ' ' ' ' ' ' ' ' ' 'Nombre',
'BEGDA' ' ' ' ' ' ' ' ' ' ' 'Fecha Ini.',
'ENDDA' ' ' ' ' ' ' ' ' ' ' 'Fecha Fin.',
'IT' ' ' ' ' ' ' ' ' ' ' 'Infotipo',
'SUBTYPE' ' ' ' ' ' ' ' ' ' ' 'Subtipo',
'ANZHL' ' ' ' ' ' ' ' ' ' ' 'Cantidad',
'BETRG' ' ' ' ' ' ' ' ' ' ' 'Importe'.

*&---------------------------------------------------------------------*
*& Form asignar_campo_a_catalogo
*&---------------------------------------------------------------------*
* Asignar campo al catalogo ALV
*----------------------------------------------------------------------*
* -->P_FIELDNAME Nombre de campo en el reporte
* -->P_KEY Indicador 'campo clave'
* -->P_COL_POS N° columna
*----------------------------------------------------------------------*
FORM asignar_campo_a_catalogo TABLES pt_cat STRUCTURE wa_fcat
USING p_fieldname LIKE wa_fcat-fieldname
p_key LIKE wa_fcat-key
p_col_pos TYPE c
p_input LIKE wa_fcat-input
p_checkbox LIKE wa_fcat-checkbox
p_hotspot LIKE wa_fcat-hotspot
p_reptext_ddic LIKE wa_fcat-reptext_ddic.

STATICS l_col_pos LIKE sy-cucol.

* Asignar atributos de campo en el catalogo de cabecera ALV
CLEAR wa_fcat.
READ TABLE pt_cat INTO wa_fcat
WITH KEY fieldname = p_fieldname.

CHECK sy-subrc EQ 0.

CLEAR wa_fcat-tech.

IF NOT p_reptext_ddic IS INITIAL.
wa_fcat-seltext_l = wa_fcat-seltext_m =
wa_fcat-seltext_s = wa_fcat-reptext_ddic = p_reptext_ddic.
ENDIF.

IF p_col_pos EQ 'X'.
* Inicializo el cont para ordenar las columnas.
l_col_pos = 1.
ELSE.
ADD 1 TO l_col_pos.
ENDIF.

wa_fcat-fieldname = p_fieldname.
wa_fcat-key = p_key.
wa_fcat-col_pos = l_col_pos.
wa_fcat-edit = wa_fcat-input = p_input.
wa_fcat-checkbox = p_checkbox.
wa_fcat-hotspot = p_hotspot.

MODIFY pt_cat FROM wa_fcat INDEX sy-tabix.

Bmamba
28/01/09, 11:29:59
Tienes que declararte en el catálogo un campo checkbox:
CLEAR wa_catalogo.
wa_catalogo-fieldname = 'CHECK'.
wa_catalogo-col_pos = l_lin.
wa_catalogo-checkbox = 'X'.
wa_catalogo-outputlen = 2.
wa_catalogo-edit = 'X'.
APPEND wa_catalogo TO catalogo.
ADD 1 TO l_lin.

Además en el layout tienes que marcar lo siguiente:
layout-no_rowmark = 'X'.

Y luego para saber cuales están marcados o no después del set_table_for_first_display añades:
CALL METHOD alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.

* Evento que captura los cambios realizados
CALL METHOD alv->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.

* Instanciando el objeto que enlaza eventos y el grid
CREATE OBJECT g_event_receiver.
SET HANDLER g_event_receiver->handle_data_changed
FOR alv.

La clase lcl_event_handler es:
**----------------------------------------------------------------------
*-
CLASS lcl_event_handler DEFINITION.
***---------------------------------------------------------------------

PUBLIC SECTION.
METHODS: handle_data_changed FOR EVENT data_changed OF
cl_gui_alv_grid IMPORTING er_data_changed.

ENDCLASS.

**----------------------------------------------------------------------
*-
CLASS lcl_event_handler IMPLEMENTATION.
***---------------------------------------------------------------------

METHOD handle_data_changed.
DATA: lv_changed TYPE lvc_s_modi.

LOOP AT er_data_changed->mt_good_cells INTO lv_changed
WHERE fieldname = 'CHECK'.

clear wa_etiquetas.

READ TABLE it_etiquetas INTO wa_etiquetas INDEX lv_changed-row_id.

IF sy-subrc = 0.
MOVE lv_changed-value TO wa_etiquetas-check.
MODIFY it_etiquetas FROM wa_etiquetas INDEX lv_changed-row_id.
ENDIF.

ENDLOOP.
ENDMETHOD.

ENDCLASS.


Espero que te sirva de algo.
Saludos

fenix28
04/08/09, 13:43:15
Hola Bmamba hago exactamente lo que dices y no hay manera me sale el cuadradito para poder marcar la línea pero después de sale un campo checkbox editable en el ALV. Me estoy volviendo loco....... no tendrás por ahi un ejemplo completo para echarle un vistazo desde el principio...... Yo lo que he hecho es lo siguiente:

REPORT ZBIG_LIB_RESP_PDA.

tables: ZBIG_LA_PDACLI,
ZBIG_BZCAMPANIAS.

data: g_zbig_la_pdacli like standard table of zbig_la_pdacli with header line.

data: begin of g_datos occurs 0,
check type c,
kunnr like zbig_la_pdacli-kunnr,
zcodcampania like zbig_la_pdacli-zcodcampania,
zcodcomunicacion like zbig_la_pdacli-zcodcomunicacion,
zcodcosecha like zbig_la_pdacli-zcodcosecha,
zbig_clave_buzon like zbig_la_pdacli-zbig_clave_buzon,
descripcion like zbig_bzcampanias-zdesccampania,
end of g_datos.

data: g_nombre like kna1-name1,
g_wa_datos like g_datos.

* Declare reference variables to the ALV grid and the container

data: go_grid type ref to cl_gui_alv_grid, "ALV GRID
go_custom_container type ref to cl_gui_custom_container, "Contenedor
g_fieldcatalog type lvc_t_fcat, "Catálogo de campos
l_layout type lvc_s_layo, "Layout
lt_fcodes type ui_functions.

***************************** SELECTION SCREEN ******************************
selection-screen begin of block bl1 with frame.
parameters: pa_kunnr like zbig_la_pdacli-kunnr obligatory.
selection-screen end of block bl1.


**----------------------------------------------------------------------
CLASS lcl_event_handler DEFINITION.
**----------------------------------------------------------------------
PUBLIC SECTION.

METHODS: handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed.

ENDCLASS.

**----------------------------------------------------------------------
CLASS lcl_event_handler IMPLEMENTATION.
**----------------------------------------------------------------------
METHOD handle_data_changed.

DATA: lv_changed TYPE lvc_s_modi.

LOOP AT er_data_changed->mt_good_cells INTO lv_changed WHERE fieldname = 'CHECK'.

clear g_wa_datos.
READ TABLE g_datos INTO g_wa_datos INDEX lv_changed-row_id.

IF sy-subrc = 0.
MOVE lv_changed-value TO g_wa_datos-check.
MODIFY g_datos FROM g_wa_datos INDEX lv_changed-row_id.
ENDIF.

ENDLOOP.

ENDMETHOD.

ENDCLASS.

DATA g_event_receiver type ref to lcl_event_handler.


***************************** START-OF-SELECTION ****************************
START-OF-SELECTION.

perform seleccion_datos.
perform build_fieldcat.
call screen 2000.

END-OF-SELECTION.
***************************** END-OF-SELECTION ****************************

*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* Creamos el formato del ALV
*----------------------------------------------------------------------*
form build_fieldcat.

* Importante hay que añadir "WITH HEADER LINE
data: l_fieldcatalog type lvc_t_fcat with header line.

clear: l_fieldcatalog, g_fieldcatalog.
refresh: l_fieldcatalog.

l_fieldcatalog-fieldname = 'CHECK'. "Código Campaña
l_fieldcatalog-col_pos = 1.
l_fieldcatalog-outputlen = 2.
l_fieldcatalog-checkbox = 'X'.
l_fieldcatalog-edit = 'X'.

append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.

l_fieldcatalog-fieldname = 'ZCODCAMPANIA'. "Código Campaña
l_fieldcatalog-scrtext_l = 'Campaña'.
l_fieldcatalog-col_pos = 2.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 10.
l_fieldcatalog-just = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.

l_fieldcatalog-fieldname = 'ZCODCOMUNICACION'. "Código Comunicación
l_fieldcatalog-scrtext_l = 'Comunicación'.
l_fieldcatalog-col_pos = 3.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 12.
l_fieldcatalog-just = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.

l_fieldcatalog-fieldname = 'ZCODCOSECHA'. "Código Cosecha
l_fieldcatalog-scrtext_l = 'Cosecha'.
l_fieldcatalog-col_pos = 4.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 10.
l_fieldcatalog-just = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.

l_fieldcatalog-fieldname = 'ZBIG_CLAVE_BUZON'. "Clave del Buzón
l_fieldcatalog-scrtext_l = 'Clave Buzón'.
l_fieldcatalog-col_pos = 5.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 16.
l_fieldcatalog-just = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.

l_fieldcatalog-fieldname = 'DESCRIPCION'.
l_fieldcatalog-scrtext_l = 'Descripción'.
l_fieldcatalog-col_pos = 6.
l_fieldcatalog-outputlen = 150.
l_fieldcatalog-just = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.

endform. " BUILD_FIELDCAT

*&---------------------------------------------------------------------*
*& Form load_data_into_grid
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form load_data_into_grid.

call method go_grid->set_table_for_first_display
exporting
is_layout = l_layout
changing
it_outtab = g_datos[]
it_fieldcatalog = g_fieldcatalog[].

* Para saber si se han marcado la líneas.
CALL METHOD go_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

* Evento que captura los cambios realizados
CALL METHOD go_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified.

* Instanciando el objeto que enlaza eventos y el grid
CREATE OBJECT g_event_receiver.
SET HANDLER g_event_receiver->handle_data_changed FOR go_grid.


endform. " load_data_into_grid
*&---------------------------------------------------------------------*
*& Module STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_2000 output.

if not go_custom_container is initial.

* Limpiar referencia al objeto

call method go_grid->free.
call method go_custom_container->free.

* Limpiar variables

clear go_grid.
clear go_custom_container.

endif.

case sy-ucomm.

when 'BACK'. perform clear_variables.
clear g_datos. refresh g_datos.
leave to screen 0. exit.
when 'CANC'. perform clear_variables.
clear g_datos. refresh g_datos.
leave to screen 0. exit.
when 'EXIT'. perform clear_variables.
clear g_datos. refresh g_datos.
leave to screen 0. exit.
endcase.

set pf-status 'STATUS_2000'.
* SET TITLEBAR 'xxx'.

* Creamos el contenedor del ALV y llamamos al ALV
if go_custom_container is initial.

create object go_custom_container
exporting container_name = 'ZTABLA'.

create object go_grid
exporting
i_parent = go_custom_container.

perform load_data_into_grid.

* Layout

* l_layout-cwidth_opt = 'X'.
l_layout-zebra = 'X'.
l_layout-cwidth_opt = 'X'.
l_layout-no_rowmark = 'X'.

else.

* Refrescar la tabla ALV

* l_layout-cwidth_opt = 'X'.
l_layout-zebra = 'X'.
l_layout-cwidth_opt = 'X'.
l_layout-no_rowmark = 'X'.

call method go_grid->refresh_table_display.
perform load_data_into_grid.

endif.

endmodule. " STATUS_2000 OUTPUT

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_2000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_2000 input.

endmodule. " USER_COMMAND_2000 INPUT

*&---------------------------------------------------------------------*
*& Form CLEAR_VARIABLES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form clear_variables.

if not go_custom_container is initial.

* Limpiar referencia al objeto

call method go_grid->free.
call method go_custom_container->free.

* Limpiar variables

* clear gv_event_receiver.
clear go_grid.
clear go_custom_container.

endif.

endform. " CLEAR_VARIABLES


Y el resultado que obtengo es que mando en la foto adjunta....
No sé que tengo que hacer para quitar ese checkbox y sólo dejar el cuadradito para poder seleccionar la línea entera o no..........

Gracias por leer este mensaje y un saludo a todo el mundo....... La verdad que tú líneas de código me han servido de mucho....... Muchas gracias.....

fenix28
04/08/09, 14:15:01
Hola a todo el mundo de nuevo.......... Ya he visto porque me salen las dos cosas a la vez es por

l_layout-no_rowmark = 'X'.

Ahora sólo me sale el checkbox.... pero yo lo que quiero en realidad es tener control sobre el botón de seleccionar la línea para poder seleccionar los registro que desee el usuario y después usar esas líneas para hacer lo que sea con ellas............

Algún ejemplillo ???? Tendría que mirarme el método GET_SELECTED_ROWS
de la clase CL_GUI_ALV_GRID para obtener eso ??????

Muchas gracias por leer este mensaje y un saludo a todo el mundo....