cl_salv_table=>factory Editable column

With the follow code you can create an ALV with editable columns using cl_salv_table=>factory


*&---------------------------------------------------------------------*
*& Report Z_PRUEBAS2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_pruebas2.

DATA: gt_spfli TYPE TABLE OF spfli,
gs_spfli TYPE spfli,
ok_code TYPE sy-ucomm,
gr_table TYPE REF TO cl_salv_table,
gr_container TYPE REF TO cl_gui_custom_container.

CLASS lcl_listener DEFINITION.
PUBLIC SECTION.
INTERFACES :
if_salv_gui_om_edit_strct_lstr.
ENDCLASS.

CLASS lcl_listener IMPLEMENTATION.
METHOD if_salv_gui_om_edit_strct_lstr~on_check_changed_data.
o_ui_data_modify->get_ui_changes( IMPORTING t_modified_cells = DATA(lt_modified) ).

BREAK-POINT.

ENDMETHOD.
ENDCLASS.

DATA : mo_listener TYPE REF TO lcl_listener.

CLASS lcl_handler DEFINITION.

PUBLIC SECTION.

CLASS-METHODS: handle FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function.

ENDCLASS.

CLASS lcl_handler IMPLEMENTATION.

METHOD handle.
CASE e_salv_function.
WHEN 'ADD'.
gs_spfli-carrid = 'TST'.
APPEND gs_spfli TO gt_spfli.
gr_table->refresh( ).

WHEN 'DELETE'.
DELETE gt_spfli INDEX 1.
gr_table->refresh( ).
WHEN 'EDIT'.
PERFORM EDIT.
* DATA: rows TYPE salv_t_row,
* row TYPE i.
*
* rows = gr_table->get_selections( )->get_selected_rows( ).
* READ TABLE rows INTO row INDEX 1.
* READ TABLE gt_spfli INTO gs_spfli INDEX row.

* gs_spfli-cityfrom = 'Savannah'.
* MODIFY gt_spfli FROM gs_spfli INDEX row.
* gr_table->refresh( ).

WHEN OTHERS.
ENDCASE.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

CALL SCREEN 9000.

*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'ZSTATUS'.
SET TITLEBAR 'ZTITLE'.
PERFORM init_table.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE SY-UCOMM.
WHEN 'BACK' OR 'CANC' OR 'EXIT'.
LEAVE TO SCREEN 0.

ENDCASE.
ENDMODULE.

FORM EDIT.
DATA:ls_api TYPE REF TO if_salv_gui_om_extend_grid_api,
ls_edit TYPE REF TO if_salv_gui_om_edit_restricted.

ls_api = gr_table->extended_grid_api( ).
ls_edit = ls_api->editable_restricted( ).
TRY.
ls_edit->set_attributes_for_columnname(
EXPORTING
columnname = 'COUNTRYFR'
all_cells_input_enabled = abap_true
).
mo_listener = NEW lcl_listener( ).
ls_edit->set_listener( mo_listener ).
gr_table->refresh( ).
CATCH cx_root.
ENDTRY.
ENDFORM.

FORM init_table.
IF gr_container IS NOT BOUND.
CREATE OBJECT gr_container
EXPORTING
container_name = 'CONTAINER1'.

SELECT * FROM spfli INTO TABLE gt_spfli.

TRY.
CALL METHOD cl_salv_table=>factory
EXPORTING
*
r_container = gr_container " Abstract Container for GUI Controls
* container_name =
IMPORTING
r_salv_table = gr_table " Basis Class Simple ALV Tables
CHANGING
t_table = gt_spfli.
* CATCH cx_salv_msg. " ALV: General Error Class with Message

CATCH cx_salv_msg.

ENDTRY.

DATA lr_functions TYPE REF TO cl_salv_functions.
lr_functions = gr_table->get_functions( ).

TRY .
CALL METHOD lr_functions->add_function
EXPORTING
name = 'ADD' " ALV Function
icon = '@FO@'
text = 'Add row'
tooltip = 'Add row'
position = if_salv_c_function_position=>right_of_salv_functions. " Positioning Function

CATCH cx_salv_existing cx_salv_wrong_call.

ENDTRY.

TRY .
CALL METHOD lr_functions->add_function
EXPORTING
name = 'DELETE' " ALV Function
icon = '@FN@'
text = 'Delete row'
tooltip = 'Delete row'
position = if_salv_c_function_position=>right_of_salv_functions. " Positioning Function

CATCH cx_salv_existing cx_salv_wrong_call.

ENDTRY.

TRY .
CALL METHOD lr_functions->add_function
EXPORTING
name = 'EDIT' " ALV Function
icon = '@0Z@'
text = 'Edit a row'
tooltip = 'Edit a row'
position = if_salv_c_function_position=>right_of_salv_functions. " Positioning Function

CATCH cx_salv_existing cx_salv_wrong_call.

ENDTRY.

DATA lr_event TYPE REF TO cl_salv_events_table.
lr_event = gr_table->get_event( ).

SET HANDLER lcl_handler=>handle FOR lr_event.

gr_table->display( ).

ENDIF.

ENDFORM.

*TABLES: MARC.
*
*DATA: BEGIN OF ITAB OCCURS 0.
* INCLUDE STRUCTURE MARC.
*DATA: CELLTAB TYPE LVC_T_STYL.
*DATA: END OF ITAB.
*
*
**--ALV Grid
*DATA: OK_CODE LIKE SY-UCOMM.
*DATA: CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
*DATA: MYCONTAINER TYPE SCRFNAME VALUE 'ALV_CONTAINER'.
*DATA: GR_GRID TYPE REF TO CL_GUI_ALV_GRID.
*DATA: GR_DOCKING_CONTAINER TYPE REF TO CL_GUI_DOCKING_CONTAINER.
*DATA: GT_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
*DATA: LS_FCAT TYPE LVC_S_FCAT .
*DATA: LT_FIELDCAT_SLIS TYPE SLIS_T_FIELDCAT_ALV.
*DATA: GS_LAYOUT TYPE LVC_S_LAYO.
*DATA: ROW_ID TYPE LVC_T_ROID WITH HEADER LINE,
* ROW_I TYPE LVC_S_ROW,
* COL_I TYPE LVC_S_COL.
*DATA: GT_CELLTAB TYPE LVC_T_STYL.
*DATA: BEGIN OF KFIELDNAME OCCURS 0,
* FIELDNAME LIKE DD03L-FIELDNAME.
*DATA: END OF KFIELDNAME.
*
*DATA: LS_MODI TYPE LVC_S_MODI.
*DATA: V_VALUE TYPE LVC_VALUE.
**----------------------------------------------------------------------*
** CLASS lcl_event_handler DEFINITION
**----------------------------------------------------------------------*
**
**----------------------------------------------------------------------*
*CLASS LCL_EVENT_HANDLER DEFINITION.
*
* PUBLIC SECTION.
*
* METHODS:HANDLE_DATA_CHANGED_FINISHED
* FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
* IMPORTING E_MODIFIED ET_GOOD_CELLS.
*
* METHODS:HANDLE_DATA_CHANGED
* FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
* IMPORTING ER_DATA_CHANGED.
*
*ENDCLASS. "lcl_event_handler DEFINITION
*
*DATA: GR_EVENT_HANDLER TYPE REF TO LCL_EVENT_HANDLER .
**----------------------------------------------------------------------*
** CLASS lcl_event_handler IMPLEMENTATION
**----------------------------------------------------------------------*
**
**----------------------------------------------------------------------*
*CLASS LCL_EVENT_HANDLER IMPLEMENTATION .
*
*
* METHOD HANDLE_DATA_CHANGED_FINISHED .
*
* DATA: LS_MODI TYPE LVC_S_MODI.
*
* CHECK E_MODIFIED = 'X'.
*
* LOOP AT ET_GOOD_CELLS INTO LS_MODI.
*
* MOVE LS_MODI-ROW_ID TO ROW_ID-ROW_ID.
* MOVE LS_MODI-ROW_ID TO ROW_I-INDEX.
* MOVE LS_MODI-FIELDNAME TO COL_I-FIELDNAME.
*
* IF LS_MODI-FIELDNAME EQ 'MATNR'.
* READ TABLE ITAB INTO ITAB INDEX LS_MODI-ROW_ID.
* CHECK ITAB-MATNR IS NOT INITIAL.
* MOVE LS_MODI-VALUE TO ITAB-MATNR.
* MODIFY ITAB FROM ITAB INDEX LS_MODI-ROW_ID.
* ENDIF.
*
* ENDLOOP.
*
* CALL METHOD GR_GRID->REFRESH_TABLE_DISPLAY.
* CALL METHOD GR_GRID->SET_CURRENT_CELL_VIA_ID
* EXPORTING
* IS_ROW_ID = ROW_I
* IS_COLUMN_ID = COL_I.
* CALL METHOD CL_GUI_CFW=>FLUSH.
*
* ENDMETHOD. "handle_data_changed_finished
*
* METHOD: HANDLE_DATA_CHANGED.
*
*
*
* LOOP AT GT_FIELDCAT INTO LS_FCAT WHERE EDIT = 'X'.
* MOVE-CORRESPONDING LS_FCAT TO KFIELDNAME.
* APPEND KFIELDNAME TO KFIELDNAME.
* ENDLOOP.
*
* SORT ER_DATA_CHANGED->MT_MOD_CELLS BY ROW_ID.
*
* LOOP AT KFIELDNAME INTO KFIELDNAME.
* LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS INTO LS_MODI
* WHERE FIELDNAME = KFIELDNAME-FIELDNAME.
*
* CALL METHOD ER_DATA_CHANGED->GET_CELL_VALUE
* EXPORTING
* I_ROW_ID = LS_MODI-ROW_ID
* I_FIELDNAME = KFIELDNAME-FIELDNAME
* IMPORTING
* E_VALUE = V_VALUE.
*
* CALL METHOD ER_DATA_CHANGED->MODIFY_CELL
* EXPORTING
* I_ROW_ID = LS_MODI-ROW_ID
* I_FIELDNAME = KFIELDNAME-FIELDNAME
* I_VALUE = V_VALUE.
*
* ENDLOOP.
*
* ENDLOOP.
*
*
* ENDMETHOD. "handle_data_changed
*
*ENDCLASS. "lcl_event_handler IMPLEMENTATION
*
*
*
**----- selection-screen
*SELECTION-SCREEN: BEGIN OF BLOCK A1 WITH FRAME TITLE TEXT-001.
*SELECT-OPTIONS: S_MATNR FOR MARC-MATNR,
* S_WERKS FOR MARC-WERKS.
*SELECTION-SCREEN: END OF BLOCK A1.
*
*
**---- start-of-selection
*START-OF-SELECTION.
*
*
**-- read data into internal table
* PERFORM GET_DATA.
*
* CHECK ITAB[] IS NOT INITIAL.
*
* CALL SCREEN 100.
*
*
*
*END-OF-SELECTION.
**&---------------------------------------------------------------------
*
**& Form GET_DATA
**&---------------------------------------------------------------------
*
** text
**----------------------------------------------------------------------
*
** --> p1 text
** <-- p2 text **---------------------------------------------------------------------- * *FORM GET_DATA . * * * SELECT * INTO CORRESPONDING FIELDS OF TABLE ITAB * FROM MARC * WHERE MATNR IN S_MATNR * AND WERKS IN S_WERKS. * *ENDFORM. " GET_DATA **&---------------------------------------------------------------------* **& Module STATUS_0100 OUTPUT **&---------------------------------------------------------------------* ** text **----------------------------------------------------------------------* *MODULE STATUS_0100 OUTPUT. * * SET PF-STATUS 'STATUS_100'. * * PERFORM DISPLAY_TABLE. * * * * *ENDMODULE. " STATUS_0100 OUTPUT **&---------------------------------------------------------------------* **& Module USER_COMMAND_0100 INPUT **&---------------------------------------------------------------------* ** text **----------------------------------------------------------------------* *MODULE USER_COMMAND_0100 INPUT. * * CASE OK_CODE. * WHEN 'BACK'. "Go Back * LEAVE TO SCREEN 0. * WHEN 'EXIT'. * CALL METHOD CUSTOM_CONTAINER->FREE.
* LEAVE TO SCREEN 0.
* WHEN OTHERS.
* ENDCASE.
*
* CLEAR OK_CODE.
*
*ENDMODULE. " USER_COMMAND_0100 INPUT
**&---------------------------------------------------------------------*
**& Form DISPLAY_TABLE
**&---------------------------------------------------------------------*
** text
**----------------------------------------------------------------------*
** --> p1 text
** <-- p2 text
**----------------------------------------------------------------------*
*FORM DISPLAY_TABLE .
*
* IF CUSTOM_CONTAINER IS INITIAL.
** create container
* CREATE OBJECT CUSTOM_CONTAINER
* EXPORTING
* CONTAINER_NAME = MYCONTAINER
* EXCEPTIONS
* CNTL_ERROR = 1
* CNTL_SYSTEM_ERROR = 2
* CREATE_ERROR = 3
* LIFETIME_ERROR = 4
* LIFETIME_DYNPRO_DYNPRO_LINK = 5.
* IF SY-SUBRC <> 0.
* MESSAGE ' erreur container' TYPE 'I'.
* ENDIF.
** create alv grid
* CREATE OBJECT GR_GRID
* EXPORTING
* I_PARENT = CUSTOM_CONTAINER
* EXCEPTIONS
* ERROR_CNTL_CREATE = 1
* ERROR_CNTL_INIT = 2
* ERROR_CNTL_LINK = 3
* ERROR_DP_CREATE = 4
* OTHERS = 5.
* IF SY-SUBRC <> 0.
* MESSAGE ' erreur grid' TYPE 'I'.
* ENDIF.
*
*
** prepare fielfcatalog
* PERFORM PREPAR_CATALOG.
**-- prepare cell tab
* PERFORM PREPARE_CELLTAB.
** prepare layout
* PERFORM PREPAR_LAYOUT.
** fist display
* PERFORM FIRST_DISPLAY.
*
* ELSE .
* CALL METHOD GR_GRID->REFRESH_TABLE_DISPLAY
* EXCEPTIONS
* FINISHED = 1
* OTHERS = 2.
* ENDIF.
*
*
*ENDFORM. " DISPLAY_TABLE
**&---------------------------------------------------------------------*
**& Form PREPAR_CATALOG
**&---------------------------------------------------------------------*
** text
**----------------------------------------------------------------------*
** --> p1 text
** <-- p2 text **----------------------------------------------------------------------* *FORM PREPAR_CATALOG . * * CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' * EXPORTING * I_PROGRAM_NAME = SY-REPID * I_INTERNAL_TABNAME = 'ITAB' * I_CLIENT_NEVER_DISPLAY = 'X' * I_INCLNAME = SY-REPID * CHANGING * CT_FIELDCAT = LT_FIELDCAT_SLIS. * * CALL FUNCTION 'LVC_TRANSFER_FROM_SLIS' * EXPORTING * IT_FIELDCAT_ALV = LT_FIELDCAT_SLIS * IMPORTING * ET_FIELDCAT_LVC = GT_FIELDCAT[] * TABLES * IT_DATA = ITAB[] * EXCEPTIONS * IT_DATA_MISSING = 1 * OTHERS = 2. * * * LOOP AT GT_FIELDCAT. * CASE GT_FIELDCAT-FIELDNAME. * WHEN 'MATNR'. * GT_FIELDCAT-EDIT = 'X'. * WHEN OTHERS. * ENDCASE. * ENDLOOP. * * * * * *ENDFORM. " PREPAR_CATALOG **&---------------------------------------------------------------------* **& Form PREPAR_LAYOUT **&---------------------------------------------------------------------* ** text **----------------------------------------------------------------------* ** --> p1 text
** <-- p2 text **----------------------------------------------------------------------* *FORM PREPAR_LAYOUT . * * GS_LAYOUT-ZEBRA = 'X' . * GS_LAYOUT-SMALLTITLE = 'X'. * GS_LAYOUT-STYLEFNAME = 'CELLTAB'. * *ENDFORM. " PREPAR_LAYOUT **&---------------------------------------------------------------------* **& Form FIRST_DISPLAY **&---------------------------------------------------------------------* ** text **----------------------------------------------------------------------* ** --> p1 text
** <-- p2 text **----------------------------------------------------------------------* *FORM FIRST_DISPLAY . * * CALL METHOD GR_GRID->SET_TABLE_FOR_FIRST_DISPLAY
* EXPORTING
* IS_LAYOUT = GS_LAYOUT
* I_DEFAULT = 'X'
* CHANGING
* IT_FIELDCATALOG = GT_FIELDCAT[]
* IT_OUTTAB = ITAB[]
* EXCEPTIONS
* INVALID_PARAMETER_COMBINATION = 1
* PROGRAM_ERROR = 2
* TOO_MANY_LINES = 3
* OTHERS = 4.
*
*
*
* CREATE OBJECT GR_EVENT_HANDLER.
* SET HANDLER GR_EVENT_HANDLER->HANDLE_DATA_CHANGED_FINISHED
* FOR GR_GRID.
*
*
* CALL METHOD GR_GRID->SET_READY_FOR_INPUT
* EXPORTING
* I_READY_FOR_INPUT = 1.
*
* CALL METHOD GR_GRID->REGISTER_EDIT_EVENT
* EXPORTING
* I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
*
*
*ENDFORM. " FIRST_DISPLAY
**&---------------------------------------------------------------------*
**& Form PREPARE_CELLTAB
**&---------------------------------------------------------------------*
** text
**----------------------------------------------------------------------*
** --> p1 text
** <-- p2 text **----------------------------------------------------------------------* *FORM PREPARE_CELLTAB . * * DATA: L_INDEX TYPE SY-TABIX. * DATA: LS_CELLTAB TYPE LVC_S_STYL, * L_MODE TYPE RAW4. * * LOOP AT ITAB. * * L_INDEX = SY-TABIX. * CLEAR GT_CELLTAB[]. * **-- if the plant is equal 1000 make the material cell editable * IF ITAB-WERKS = '1000'. * * LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
* LOOP AT GT_FIELDCAT WHERE FIELDNAME = 'MATNR'.
* LS_CELLTAB-FIELDNAME = GT_FIELDCAT-FIELDNAME.
* INSERT LS_CELLTAB INTO TABLE GT_CELLTAB.
* ENDLOOP.
* ELSE.
* LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
* LOOP AT GT_FIELDCAT WHERE FIELDNAME = 'MATNR'.
* LS_CELLTAB-FIELDNAME = GT_FIELDCAT-FIELDNAME.
* INSERT LS_CELLTAB INTO TABLE GT_CELLTAB.
* ENDLOOP.
* ENDIF.
* INSERT LINES OF GT_CELLTAB INTO TABLE ITAB-CELLTAB.
* MODIFY ITAB INDEX L_INDEX.
*
* ENDLOOP.
*
*ENDFORM. " PREPARE_CELLTAB

Leave a Reply

Your email address will not be published. Required fields are marked *

Go up