#1
|
|||
|
|||
Eliminar Registro De Un Alv
Hola a todos, soy nuevo en abap y estoy haciendo un programa de mantenimiento de una tabla,me explico: he creado una tabla (ztab_usu) con los campos (CODIGO,NOMBRE,APELLIDO,DIRECCION,TELEFONO), ya hize una dynpro con un ALV-GRID y 2 botones (nuevo,borrar); he logrado añadir datos, pero lo que no puedo es eliminar el(los) registro(s) que selecciono en el alv. espero su ayuda porfavor, le dejo una parte del codigo. Gracias.
TABLES: ztab_usu. TYPES BEGIN OF ty_ztab_usu. INCLUDE STRUCTURE ztab_usu. TYPES END OF ty_ztab_usu. DATA: it_ztab_usu TYPE STANDARD TABLE OF ty_ztab_usu. FIELD-SYMBOLS: <fs_ztab_usu> LIKE LINE OF it_ztab_usu. *DECLARACION DE VARIABLES ALV* DATA: gs_layout_usu TYPE lvc_s_layo, gt_fieldcat_usu TYPE lvc_t_fcat, gs_fieldcat_usu TYPE lvc_s_fcat, i_index_rows TYPE lvc_t_row, i_selected_row LIKE lvc_s_row. DATA: cnt_name_usu TYPE scrfname VALUE 'CUSTOM_ALV', container_alv_usu TYPE REF TO cl_gui_custom_container, alv_grid_usu TYPE REF TO cl_gui_alv_grid. FIELD-SYMBOLS: <fs_fieldcat> LIKE LINE OF gt_fieldcat_usu. START-OF-SELECTION. CALL SCREEN '100'. *----------------------------------------------------------------------* **FUNCIONES DEL ALV** FORM load_data . REFRESH it_ztab_usu. SELECT codigo nombre apellido direccion telefono INTO CORRESPONDING FIELDS OF TABLE it_ztab_usu FROM ztab_usu. ENDFORM. " load_data *&---------------------------------------------------------------------* *& Form fill_layout *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM fill_layout . gs_layout_usu-sel_mode = 'A'. * gs_layout_usu-no_toolbar = 'X'. ENDFORM. " fill_layout *&---------------------------------------------------------------------* *& Form fill_catalog *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM fill_catalog . REFRESH gt_fieldcat_usu. CLEAR gs_fieldcat_usu. gs_fieldcat_usu-tabname = 'it_ztab_usu'. gs_fieldcat_usu-fieldname = 'CODIGO'. gs_fieldcat_usu-reptext = 'Codigo'. gs_fieldcat_usu-col_pos = 1. gs_fieldcat_usu-outputlen = 7. APPEND gs_fieldcat_usu TO gt_fieldcat_usu. CLEAR gs_fieldcat_usu. gs_fieldcat_usu-tabname = 'it_ztab_usu'. gs_fieldcat_usu-fieldname = 'NOMBRE'. gs_fieldcat_usu-reptext = 'Nombres'. gs_fieldcat_usu-col_pos = 2. gs_fieldcat_usu-outputlen = 8. APPEND gs_fieldcat_usu TO gt_fieldcat_usu. CLEAR gs_fieldcat_usu. gs_fieldcat_usu-tabname = 'it_ztab_usu'. gs_fieldcat_usu-fieldname = 'APELLIDO'. gs_fieldcat_usu-reptext = 'Apellidos'. gs_fieldcat_usu-col_pos = 3. gs_fieldcat_usu-outputlen = 10. APPEND gs_fieldcat_usu TO gt_fieldcat_usu. CLEAR gs_fieldcat_usu. gs_fieldcat_usu-tabname = 'it_ztab_usu'. gs_fieldcat_usu-fieldname = 'DIRECCION'. gs_fieldcat_usu-reptext = 'Direccion'. gs_fieldcat_usu-col_pos = 4. gs_fieldcat_usu-outputlen = 10. APPEND gs_fieldcat_usu TO gt_fieldcat_usu. CLEAR gs_fieldcat_usu. gs_fieldcat_usu-tabname = 'it_ztab_usu'. gs_fieldcat_usu-fieldname = 'TELEFONO'. gs_fieldcat_usu-reptext = 'Telefono'. gs_fieldcat_usu-col_pos = 4. gs_fieldcat_usu-outputlen = 8. APPEND gs_fieldcat_usu TO gt_fieldcat_usu. ENDFORM. " fill_catalog *&---------------------------------------------------------------------* *& Form display_alv *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM display_alv . IF container_alv_usu IS INITIAL. CREATE OBJECT container_alv_usu EXPORTING container_name = cnt_name_usu EXCEPTIONS cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5 OTHERS = 6. IF sy-subrc EQ 0. CREATE OBJECT alv_grid_usu EXPORTING i_parent = container_alv_usu. CALL METHOD alv_grid_usu->set_table_for_first_display EXPORTING i_save = 'A' i_default = 'X' is_layout = gs_layout_usu CHANGING it_outtab = it_ztab_usu it_fieldcatalog = gt_fieldcat_usu EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4. CALL METHOD alv_grid_usu->set_ready_for_input EXPORTING i_ready_for_input = 0. ELSE. CALL METHOD alv_grid_usu->refresh_table_display. ENDIF. ENDIF. ENDFORM. " display_alv *&---------------------------------------------------------------------* *& Form refresh_alv *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM refresh_alv . CALL METHOD alv_grid_usu->set_frontend_layout EXPORTING is_layout = gs_layout_usu. CALL METHOD alv_grid_usu->refresh_table_display. ENDFORM. " refresh_alv *&---------------------------------------------------------------------* *& Form eliminar_registro *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM eliminar_registro . **ESTO ES LO QUE ME FALTA ENDFORM. " eliminar_registro Úlima edición por x27christian27x fecha: 26/06/12 a las 23:06:13. |
#2
|
|||
|
|||
El ALV se forma según los registros de la tabla interna, por lo tanto debes activar un boton de eliminar, en el cual se deben identificar los registros seleccionados (para esto existe un método que retorna en una tabla los indices de los registros marcados), al conocer los indices que se desean eliminar, los pasos siguientes son recorrer la tabla interna del alv, borrar los registros según el indice y hacer el refresh del alv.
espero haberme explicado bien. saludos! |
#3
|
|||
|
|||
- Primero tenes que crear en tu tabla de la cual mostras el alv con un campo para flag (TYPE c).
-Despues tenes que declararla en el fieldcat: gw_fieldcat-checkbox = 'X'. gw_fieldcat-edit = 'X'. - Crea un nuevo STATUS_GUI con un boton que diga "Eliminar" - En la funcion donde llamas al ALV tenes que pasarle un user command: i_callback_user_command = 'FR_USER_COMMAND' => debes crear un form - En este form colocas: IF pe_ucomm = '%ANUL'. "si presiono el boton "Eliminar" CLEAR lf_change. * estas funciones son para actualizar el campo flag que creaste al principio CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = cl_ref1. CALL METHOD cl_ref1->check_changed_data IMPORTING e_valid = lf_change. * valido que se hayan seleccionado al menos un documento para anular READ TABLE gt_alv WITH KEY anular = co_x TRANSPORTING NO FIELDS. IF sy-subrc IS INITIAL. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING titlebar = text-002 "Anular Compensaciones text_question = text-003 "Se procederá a la anulación de los documentos seleccionados. ¿Desea Continuar? default_button = '2' display_cancel_button = 'X' IMPORTING answer = lf_answer. IF sy-subrc IS INITIAL. IF lf_answer = co_1. * anulo las compensaciones marcadas PERFORM fr_anular_docs. ENDIF. ENDIF. ELSE. * Seleccionar al menos un documento. MESSAGE i004(zfbank) DISPLAY LIKE 'E'. ENDIF. ENDIF. Espero te sirva. Slds. |
#4
|
|||
|
|||
eliminar alv
claro, te entendi, el detalle es que solo sé capturar el indice de una tabla (dynpro), pero de un alv no se como hacerlo
TABLES: ztab_usu. TYPES BEGIN OF ty_ztab_usu. INCLUDE STRUCTURE ztab_usu. TYPES END OF ty_ztab_usu. DATA: it_ztab_usu TYPE STANDARD TABLE OF ty_ztab_usu. FIELD-SYMBOLS: <fs_ztab_usu> LIKE LINE OF it_ztab_usu. DATA : t_intab1 LIKE TABLE OF ztab_usu WITH HEADER LINE, t_intab2 LIKE TABLE OF ztab_usu WITH HEADER LINE, w_intab1 LIKE LINE OF t_intab1. *DECLARACION DE VARIABLES ALV* DATA: gs_layout_usu TYPE lvc_s_layo, gt_fieldcat_usu TYPE lvc_t_fcat, gs_fieldcat_usu TYPE lvc_s_fcat, i_index_rows TYPE lvc_t_row, i_selected_row LIKE lvc_s_row. FORM eliminar_registro . DATA : i_lines TYPE i. CLEAR : t_intab2. REFRESH : t_intab2. * Capturar Indice de Fila Marcada CALL METHOD alv_grid_usu->get_selected_rows IMPORTING et_index_rows = i_index_rows. * DESCRIBE TABLE i_index_rows LINES i_lines. * IF i_lines = 0. ** MESSAGE t999 WITH 'Para Eliminar...Debe Marcar un Registro.'. * EXIT. * ENDIF. * Lee Filas Marcacadas en TBI para Borrado LOOP AT i_index_rows INTO i_selected_row. READ TABLE t_intab1 INDEX i_selected_row-index INTO w_intab1. APPEND w_intab1 TO t_intab2. ENDLOOP. * Borra Las Filas Marcadas en TBI de Borrado LOOP AT t_intab2 INTO w_intab1. DELETE t_intab1 WHERE CODIGO = w_intab1-CODIGO. * AND mstae = w_intab1-mstae. DELETE FROM ztab_usu WHERE CODIGO = w_intab1-CODIGO. * AND mstae = w_intab1-mstae. ENDLOOP. COMMIT WORK. *delete it_ztab_usu where CODIGO = ztab_wa-CODIGO. *delete from ztab_usu where CODIGO = ztab_wa-CODIGO. perform refresh_alv. * IF sy-subrc = 0. * MESSAGE i000 WITH 'Proceso de Borrado Ok.'. * ELSE. * MESSAGE i000 WITH 'Fallo el Proceso de Borrado'. * ENDIF. ENDFORM. " eliminar_registro |
#5
|
|||
|
|||
Hechate una mirada al metodo GET_SELECTED_ROWS de la clase CL_GUI_ALV_GRID, si mal no estoy, el te retorna una tabla con los indices de los registros que seleccionas en el ALV.
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|