ALV Editable
posted under
REPORTES - ALV
by Antonio Lopez
Para poder editar un grid de ALV, directamente, este es el codigo a seguir:
***************************************************
*TOP
***************************************************
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: T_INTERNA TYPE T_EXTERNA OCCURS 0 WITH HEADER LINE,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
GRID TYPE REF TO CL_GUI_ALV_GRID,
CAT_CAMPOS TYPE LVC_T_FCAT,
LCAT_CAMPOS LIKE LINE OF CAT_CAMPOS,
event_receiver TYPE REF TO lcl_event_receiver,
LAYOUT_GRID1 TYPE LVC_S_LAYO.
DATA: lt_sel_rows TYPE lvc_t_row,
ls_sel_row TYPE lvc_s_row,
ls_selected_line like lvc_s_row,
INDEX_1 TYPE N,
er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*************************************
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF CL_GUI_ALV_GRID
IMPORTING e_row e_column,
handle_data_changed
for event data_changed of cl_gui_alv_grid
importing er_data_changed.
ENDCLASS.
******************************************
******************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
ENDMETHOD. "handle_double_click
METHOD handle_data_changed.
DATA: lt_data_changed TYPE lvc_t_modi,
LS_DATA_CHANGED LIKE LINE OF LT_DATA_CHANGED.
APPEND LINES OF er_data_changed->mt_mod_cells TO
LT_DATA_CHANGED.
IF NOT LT_DATA_CHANGED IS INITIAL.
INDEX_1 = 1.
READ TABLE LT_DATA_CHANGED INDEX INDEX_1 INTO LS_DATA_CHANGED.
SELECT * FROM T_EXTERNA INTO TABLE T_INTERNA.
READ TABLE T_INTERNA INDEX LS_DATA_CHANGED-ROW_ID INTO T_EXTERNA.
REFRESH T_INTERNA.
CASE LS_DATA_CHANGED-FIELDNAME.
* AQUI SE COMPARA EN NOMBRE DE LOS CAMPOS DE LA TABLA,
* SUPONGAMOS QUE EXISTE UN CAMPO QUE SE LLAMA NOMBRE_C
WHEN 'NOMBRE_C'.
ZAV_T0001-NOMBRE_C = LS_DATA_CHANGED-VALUE.
ENDCASE.
*AQUI ACTUALIZAMOS LA TABLA DE LA BD !!!!!!
UPDATE T_EXTERNA FROM T_EXTERNA.
CLEAR T_EXTERNA.
REFRESH T_INTERNA.
REFRESH lt_data_changed.
CLEAR lt_data_changed.
CLEAR LS_DATA_CHANGED.
CLEAR er_data_changed.
ENDIF.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'DC'.
ENDMETHOD. "handle_data_changed
ENDCLASS.
***************************************************
* OUT
***************************************************
module STATUS_0001 output.
SET PF-STATUS 'xxxx'.
SET TITLEBAR 'xxxx'.
PERFORM GRID_1.
endmodule.
***************************************************
* FORM
***************************************************
form GRID_1.
IF NOT ( G_CUSTOM_CONTAINER IS INITIAL ).
CALL METHOD G_CUSTOM_CONTAINER->free
EXCEPTIONS cntl_error = 1
cntl_system_error = 2.
CALL METHOD GRID->free
EXCEPTIONS cntl_error = 1
cntl_system_error = 2.
CLEAR G_CUSTOM_CONTAINER.
ENDIF.
IF G_CUSTOM_CONTAINER IS INITIAL.
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = 'GRD_EDIT'.
CREATE OBJECT GRID
EXPORTING
I_PARENT = G_CUSTOM_CONTAINER.
PERFORM PREPARA_GRID.
ENDIF.
SELECT * FROM T_ERXSTERNA INTO TABLE T_INTERNA.
LAYOUT_GRID1-cwidth_opt = 'X'.
LAYOUT_GRID1-NO_TOOLBAR = 'X'. "nO MUESTRA LA BARRA DE HERR.
PERFORM LLENACAT.
CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING IS_LAYOUT = LAYOUT_GRID1
CHANGING IT_OUTTAB = T_INTERNA[]
IT_FIELDCATALOG = CAT_CAMPOS .
REFRESH T_INTERNA.
endform. " GRID_1
*&---------------------------------------------------------------------*
*& Form LLENACAT
*&---------------------------------------------------------------------*
* text
form LLENACAT.
CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-fieldname = 'NOMBRE_C'.
LCAT_CAMPOS-ref_table = 'ZAV_T0001'.
LCAT_CAMPOS-coltext = 'NOMBRE'.
LCAT_CAMPOS-emphasize = 'C110'.
LCAT_CAMPOS-EDIT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.
endform. " LLENACAT
*&---------------------------------------------------------------------*
*& Form PREPARA_GRID
*&---------------------------------------------------------------------*
* text
Form PREPARA_GRID.
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR GRID.
set handler event_receiver->handle_data_changed for GRID.
CREATE OBJECT er_data_changed.
CALL METHOD grid->set_ready_for_input
exporting
i_ready_for_input = 1.
CALL METHOD grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
endform. " PREPARA_GRID
***************************************************
*TOP
***************************************************
CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: T_INTERNA TYPE T_EXTERNA OCCURS 0 WITH HEADER LINE,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
GRID TYPE REF TO CL_GUI_ALV_GRID,
CAT_CAMPOS TYPE LVC_T_FCAT,
LCAT_CAMPOS LIKE LINE OF CAT_CAMPOS,
event_receiver TYPE REF TO lcl_event_receiver,
LAYOUT_GRID1 TYPE LVC_S_LAYO.
DATA: lt_sel_rows TYPE lvc_t_row,
ls_sel_row TYPE lvc_s_row,
ls_selected_line like lvc_s_row,
INDEX_1 TYPE N,
er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*************************************
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF CL_GUI_ALV_GRID
IMPORTING e_row e_column,
handle_data_changed
for event data_changed of cl_gui_alv_grid
importing er_data_changed.
ENDCLASS.
******************************************
******************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
ENDMETHOD. "handle_double_click
METHOD handle_data_changed.
DATA: lt_data_changed TYPE lvc_t_modi,
LS_DATA_CHANGED LIKE LINE OF LT_DATA_CHANGED.
APPEND LINES OF er_data_changed->mt_mod_cells TO
LT_DATA_CHANGED.
IF NOT LT_DATA_CHANGED IS INITIAL.
INDEX_1 = 1.
READ TABLE LT_DATA_CHANGED INDEX INDEX_1 INTO LS_DATA_CHANGED.
SELECT * FROM T_EXTERNA INTO TABLE T_INTERNA.
READ TABLE T_INTERNA INDEX LS_DATA_CHANGED-ROW_ID INTO T_EXTERNA.
REFRESH T_INTERNA.
CASE LS_DATA_CHANGED-FIELDNAME.
* AQUI SE COMPARA EN NOMBRE DE LOS CAMPOS DE LA TABLA,
* SUPONGAMOS QUE EXISTE UN CAMPO QUE SE LLAMA NOMBRE_C
WHEN 'NOMBRE_C'.
ZAV_T0001-NOMBRE_C = LS_DATA_CHANGED-VALUE.
ENDCASE.
*AQUI ACTUALIZAMOS LA TABLA DE LA BD !!!!!!
UPDATE T_EXTERNA FROM T_EXTERNA.
CLEAR T_EXTERNA.
REFRESH T_INTERNA.
REFRESH lt_data_changed.
CLEAR lt_data_changed.
CLEAR LS_DATA_CHANGED.
CLEAR er_data_changed.
ENDIF.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'DC'.
ENDMETHOD. "handle_data_changed
ENDCLASS.
***************************************************
* OUT
***************************************************
module STATUS_0001 output.
SET PF-STATUS 'xxxx'.
SET TITLEBAR 'xxxx'.
PERFORM GRID_1.
endmodule.
***************************************************
* FORM
***************************************************
form GRID_1.
IF NOT ( G_CUSTOM_CONTAINER IS INITIAL ).
CALL METHOD G_CUSTOM_CONTAINER->free
EXCEPTIONS cntl_error = 1
cntl_system_error = 2.
CALL METHOD GRID->free
EXCEPTIONS cntl_error = 1
cntl_system_error = 2.
CLEAR G_CUSTOM_CONTAINER.
ENDIF.
IF G_CUSTOM_CONTAINER IS INITIAL.
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = 'GRD_EDIT'.
CREATE OBJECT GRID
EXPORTING
I_PARENT = G_CUSTOM_CONTAINER.
PERFORM PREPARA_GRID.
ENDIF.
SELECT * FROM T_ERXSTERNA INTO TABLE T_INTERNA.
LAYOUT_GRID1-cwidth_opt = 'X'.
LAYOUT_GRID1-NO_TOOLBAR = 'X'. "nO MUESTRA LA BARRA DE HERR.
PERFORM LLENACAT.
CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING IS_LAYOUT = LAYOUT_GRID1
CHANGING IT_OUTTAB = T_INTERNA[]
IT_FIELDCATALOG = CAT_CAMPOS .
REFRESH T_INTERNA.
endform. " GRID_1
*&---------------------------------------------------------------------*
*& Form LLENACAT
*&---------------------------------------------------------------------*
* text
form LLENACAT.
CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-fieldname = 'NOMBRE_C'.
LCAT_CAMPOS-ref_table = 'ZAV_T0001'.
LCAT_CAMPOS-coltext = 'NOMBRE'.
LCAT_CAMPOS-emphasize = 'C110'.
LCAT_CAMPOS-EDIT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.
endform. " LLENACAT
*&---------------------------------------------------------------------*
*& Form PREPARA_GRID
*&---------------------------------------------------------------------*
* text
Form PREPARA_GRID.
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR GRID.
set handler event_receiver->handle_data_changed for GRID.
CREATE OBJECT er_data_changed.
CALL METHOD grid->set_ready_for_input
exporting
i_ready_for_input = 1.
CALL METHOD grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
endform. " PREPARA_GRID
Comment Form under post in blogger/blogspot