SAP ABAP ALV CL GUI ALV GRID
From SapWiki
- Ejemplo de CL_GUI_ALV_GRID con User Command en dynpro & Container y editar columna
Contents
YTEST_ALV_GRID
*----------------------------------------------------------------------* * Report YTEST_ALV_GRID * Author: ..... *----------------------------------------------------------------------* * ejemplo de CL_GUI_ALV_GRID con User Command en dynpro & Container * y editar columna * *----------------------------------------------------------------------* REPORT ytest_alv_grid. TYPE-POOLS icon. TYPES: BEGIN OF ty_data. INCLUDE TYPE p0002. TYPES celltab TYPE lvc_t_styl. TYPES END OF ty_data. DATA gt_data TYPE TABLE OF ty_data. DATA gt_data_ori TYPE TABLE OF ty_data. DATA wa_data LIKE LINE OF gt_data. DATA g_edit TYPE xfeld. INCLUDE y_test_alv_grid_top.
*--------------------------------------------------------------------* * *--------------------------------------------------------------------* SELECT-OPTIONS: s_pernr FOR wa_data-pernr MATCHCODE OBJECT prem. *--------------------------------------------------------------------* START-OF-SELECTION. *--------------------------------------------------------------------* SELECT pernr vorna nachn name2 INTO CORRESPONDING FIELDS OF TABLE gt_data FROM pa0002 UP TO 100 ROWS WHERE pernr IN s_pernr. gt_data_ori[] = gt_data[]. PERFORM style CHANGING g_edit. "por defecto no se puede editar, ver user_command_0100 code EDIT *--------------------------------------------------------------------* END-OF-SELECTION. *--------------------------------------------------------------------* * display ALV CALL SCREEN 0100. "en la dynpro crear container CC_ALV INCLUDE y_test_alv_grid_f01. INCLUDE y_test_alv_grid_o01. INCLUDE y_test_alv_grid_i01.
Y_TEST_ALV_GRID_TOP
* Y_TEST_ALV_GRID_TOP *--------------------------------------------------------------------* DATA: ok_code LIKE sy-ucomm, save_ok LIKE sy-ucomm, g_container TYPE scrfname VALUE 'CC_ALV', g_grid TYPE REF TO cl_gui_alv_grid, g_custom_container TYPE REF TO cl_gui_custom_container, gt_fieldcat TYPE lvc_t_fcat, gs_layout TYPE lvc_s_layo, gt_events TYPE slis_t_event. DATA : g_variant1 TYPE disvariant, g_variant2 TYPE disvariant. INCLUDE <icon>. CLASS lcl_event_receiver DEFINITION DEFERRED. DATA: g_event_receiver TYPE REF TO lcl_event_receiver. *----------------------------------------------------------------------* * CLASS lcl_event_receiver DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive, handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. METHODS: handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. "lcl_event_receiver DEFINITION *----------------------------------------------------------------------* * CLASS lcl_event_receiver IMPLEMENTATION *----------------------------------------------------------------------* * agregar botones a CONTAINER *----------------------------------------------------------------------* CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_toolbar. DATA: ls_toolbar TYPE stb_button. * append a separator to normal toolbar CLEAR ls_toolbar. MOVE 3 TO ls_toolbar-butn_type. APPEND ls_toolbar TO e_object->mt_toolbar. * append an icon to show booking table *--------------------------------------------------------------------* * se habilita botón Aprobar *--------------------------------------------------------------------* CLEAR ls_toolbar. MOVE 'APRO' TO ls_toolbar-function. MOVE icon_execute_object TO ls_toolbar-icon. MOVE 'Aprobar' TO ls_toolbar-quickinfo. MOVE 'Aprobar' TO ls_toolbar-text. MOVE ' ' TO ls_toolbar-disabled. APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. *--------------------------------------------------------------------* METHOD handle_user_command. *--------------------------------------------------------------------* PERFORM user_command USING e_ucomm. ENDMETHOD. *--------------------------------------------------------------------* METHOD handle_data_changed. *--------------------------------------------------------------------* DATA : ls_mod_cell TYPE lvc_s_modi, lv_value TYPE lvc_value, lv_mask1 TYPE string, lv_mask2 TYPE string. DATA: l_nachn TYPE pa0002-nachn, l_vorna TYPE pa0002-vorna, l_name2 TYPE p0002-name2. DATA l_subrc TYPE sy-subrc. data l_dummy(200). DATA: lv_valor TYPE string. DATA: lv_mod TYPE i. SORT er_data_changed->mt_mod_cells BY row_id . LOOP AT er_data_changed->mt_good_cells INTO ls_mod_cell. IF ls_mod_cell-fieldname = 'VORNA'. CALL METHOD er_data_changed->get_cell_value EXPORTING i_row_id = ls_mod_cell-row_id i_fieldname = 'VORNA' IMPORTING e_value = l_vorna. READ TABLE gt_data_ori INTO wa_data INDEX ls_mod_cell-row_id. IF wa_data-vorna <> l_vorna. if l_vorna = 'Homero'. l_subrc = 1. MESSAGE e000(0k) with 'No se permiten Homeros' into l_dummy. endif. ELSE. l_subrc = 0. ENDIF. IF l_subrc <> 0. DATA(error_in_data) = 'X'. CALL METHOD er_data_changed->add_protocol_entry EXPORTING i_msgid = sy-msgid i_msgno = sy-msgno i_msgty = sy-msgty i_msgv1 = sy-msgv1 i_msgv2 = sy-msgv2 i_msgv3 = sy-msgv3 i_msgv4 = sy-msgv4 i_fieldname = ls_mod_cell-fieldname i_row_id = ls_mod_cell-row_id. CALL METHOD er_data_changed->modify_cell EXPORTING i_row_id = ls_mod_cell-row_id i_fieldname = 'VORNA' i_value = wa_data-vorna. CONTINUE. ENDIF. ENDIF. ENDLOOP. CALL METHOD g_grid->refresh_table_display. IF error_in_data EQ 'X'. CALL METHOD er_data_changed->display_protocol. ENDIF. ENDMETHOD. ENDCLASS.
Y_TEST_ALV_GRID_F01
*----------------------------------------------------------------------* ***Y_TEST_ALV_GRID_F01 *----------------------------------------------------------------------* FORM fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat. DATA lt_fcat_save TYPE lvc_t_fcat. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = 'PA0002' i_client_never_display = 'X' CHANGING ct_fieldcat = lt_fcat_save EXCEPTIONS inconsistent_interface = 1 program_error = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * colums names * LOOP AT lt_fcat_save ASSIGNING FIELD-SYMBOL(<wa>). * CASE <wa>-fieldname. * WHEN 'ICON'. * <wa>-scrtext_l = 'Estatus'. * <wa>-scrtext_m = 'Estatus'. * <wa>-scrtext_s = <wa>-reptext = 'Estatus'. * endloop. * hide, solo se desplegan columnas PERNR, VORNA, NACHN & NAME2 LOOP AT lt_fcat_save ASSIGNING FIELD-SYMBOL(<wa>) WHERE fieldname <> 'PERNR' AND fieldname <> 'VORNA' AND fieldname <> 'NACHN' AND fieldname <> 'NAME2'. <wa>-tech = 'X'. ENDLOOP.
* enable VORNA para editar READ TABLE lt_fcat_save ASSIGNING <wa> WITH KEY fieldname = 'VORNA'. <wa>-edit = 'X'. pt_fieldcat[] = lt_fcat_save[]. ENDFORM. *----------------------------------------------------------------------* * FORM style *----------------------------------------------------------------------* * Habilita/Des-Habilita edición de columna VORNA *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM style CHANGING p_edit. DATA: ls_celltab TYPE lvc_s_styl. DATA: lt_celltab TYPE lvc_t_styl. DATA l_tabix TYPE sy-tabix. LOOP AT gt_data INTO wa_data. l_tabix = sy-tabix. CLEAR lt_celltab[]. CLEAR wa_data-celltab[]. IF p_edit = 'X'. ELSE. ls_celltab-fieldname = 'VORNA'. ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled. INSERT ls_celltab INTO TABLE lt_celltab. ENDIF. INSERT LINES OF lt_celltab INTO TABLE wa_data-celltab. MODIFY gt_data FROM wa_data INDEX l_tabix. ENDLOOP. IF p_edit = 'X'. p_edit = space. ELSE. p_edit = 'X'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form CREATE_AND_INIT_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_GT_DATA[] text * <--P_GT_FIELDCAT text *----------------------------------------------------------------------* FORM create_and_init_alv CHANGING pt_outtab TYPE STANDARD TABLE pt_fieldcat TYPE lvc_t_fcat. DATA: lt_exclude TYPE ui_functions. DATA: ps_layout TYPE lvc_s_layo. CREATE OBJECT g_custom_container EXPORTING container_name = g_container. CREATE OBJECT g_grid EXPORTING i_parent = g_custom_container. PERFORM fieldcat CHANGING pt_fieldcat. PERFORM exclude_tb_functions CHANGING lt_exclude. ps_layout-zebra = 'X'. ps_layout-cwidth_opt = 'X'. ps_layout-stylefname = 'CELLTAB'. g_variant1-report = sy-repid. g_variant1-handle = 'X'. g_variant1-username = sy-uname. CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET' EXPORTING i_save = 'A' CHANGING cs_variant = g_variant1 EXCEPTIONS wrong_input = 1 not_found = 2 program_error = 3 OTHERS = 4. CALL METHOD g_grid->set_table_for_first_display EXPORTING i_save = 'A' is_variant = g_variant1 is_layout = ps_layout it_toolbar_excluding = lt_exclude CHANGING it_fieldcatalog = pt_fieldcat it_outtab = pt_outtab[]. CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. CALL METHOD g_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter. * CALL METHOD g_grid->save_variant. CREATE OBJECT g_event_receiver. SET HANDLER g_event_receiver->handle_user_command FOR g_grid. SET HANDLER g_event_receiver->handle_toolbar FOR g_grid. SET HANDLER g_event_receiver->handle_data_changed FOR g_grid. CALL METHOD g_grid->set_toolbar_interactive. ENDFORM. " CREATE_AND_INIT_ALV *&---------------------------------------------------------------------* *& Form EXCLUDE_TB_FUNCTIONS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PT_EXCLUDE text *----------------------------------------------------------------------* FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions. DATA ls_exclude TYPE ui_func. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo. APPEND ls_exclude TO pt_exclude. ENDFORM. " EXCLUDE_TB_FUNCTIONS *&---------------------------------------------------------------------* *& Form GRABAR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM grabar . CALL METHOD g_grid->refresh_table_display. ENDFORM. " GRABAR *&---------------------------------------------------------------------* *& Form user_command *&---------------------------------------------------------------------* * user command de CONTAINER *----------------------------------------------------------------------* * -->I_FUNCTION text *----------------------------------------------------------------------* FORM user_command USING i_function TYPE salv_de_function. DATA: gt_rows TYPE lvc_t_row. CALL METHOD g_grid->get_selected_rows IMPORTING et_index_rows = gt_rows. CASE i_function. WHEN 'APRO'. "do something LOOP AT gt_rows INTO DATA(l_tabix). READ TABLE gt_data INDEX l_tabix INTO wa_data. ENDLOOP. ENDCASE. ENDFORM.
Y_TEST_ALV_GRID_I01
*----------------------------------------------------------------------* ***INCLUDE Y_TEST_ALV_GRID_I01 *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* * user command de dynpro 0100 *----------------------------------------------------------------------* MODULE user_command_0100 INPUT. save_ok = ok_code. CLEAR ok_code. CASE save_ok. *--------------------------------------------------------------------* WHEN '&F03' OR "back '&F15' OR"leave '&F12'. "canc *--------------------------------------------------------------------* SET SCREEN 0. LEAVE SCREEN. *--------------------------------------------------------------------* WHEN 'EDIT'. "Habilitar/Des-Habilitar Editar Columnas *--------------------------------------------------------------------* PERFORM style CHANGING g_edit. CALL METHOD g_grid->refresh_table_display. *--------------------------------------------------------------------* WHEN 'GRABAR'. *--------------------------------------------------------------------* PERFORM grabar. *--------------------------------------------------------------------* WHEN 'LOG'. *--------------------------------------------------------------------* WHEN OTHERS. * do nothing ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT
Y_TEST_ALV_GRID_O01
*----------------------------------------------------------------------* ***INCLUDE Y_TEST_ALV_GRID_O01 *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS 'LIST_ALV'. ""copiar de SALV_DEMO_TABLE_LAYOUT SET TITLEBAR 'T01'. IF G_CUSTOM_CONTAINER IS INITIAL. PERFORM CREATE_AND_INIT_ALV CHANGING GT_DATA[] GT_FIELDCAT. ELSE. * CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY. CALL METHOD CL_GUI_CONTROL=>SET_FOCUS EXPORTING CONTROL = G_GRID. ENDIF. ENDMODULE. " STATUS_0100 OUTPUT
Dynpro 0100
- Crear Custom Container con nombre CC_ALV
- Agregar elemento OK_CODE de tipo OK
- Crear Status GUI LIST_ALV copia de programa SALV_DEMO_TABLE_LAYOUT Status SALV_STANDARD
- Agregar Código de función EDIT - Editar - ICON_TOGGLE_DISPLAY_CHANGE
- Agregar Código de función GRABAR - Grabar - ICON_SYSTEM_SAVE
- Crear Título T01 "Test CL_GUI_ALV_GRID"
PROCESS BEFORE OUTPUT. MODULE status_0100. * PROCESS AFTER INPUT. MODULE user_command_0100.