ABAP Code: Editable ALV

This report illustrates how to set chosen cells of an ALV Grid Control editable. Below are the essential steps undertaken:

1.Extend your output table for a field, e.g., CELLTAB, that holds information about the edit status of each cell for the corresponding row (the table type is SORTED!).
2. After selecting data, set edit status for each row in a loop according to field SEATSMAX.
   a.Use attribute CL_GUI_ALV_GRID=>MC_STYLE_ENABLED to set a cell to status    "editable".
   b.Use attribute CL_GUI_ALV_GRID=>MC_STYLE_DISABLED to set a cell to status "non-editable".
  c.Copy your celltab to the celltab of the current row of gt_outtab.

3.Provide the fieldname of the celltab field by using field STYLEFNAME of the layout structure.


Sample Code:

data: ok_code like sy-ucomm,
      save_ok like sy-ucomm,
      g_container type scrfname value 'BCALV_GRID_DEMO_0100_CONT1',
      grid1  type ref to cl_gui_alv_grid,
      g_custom_container type ref to cl_gui_custom_container,
      gs_layout type lvc_s_layo.
*      g_max type i value 500.

*§1.Extend your output table for a field, e.g., CELLTAB, that holds
*   information about the edit status of each cell for the
*   corresponding row (the table type is SORTED!).
databegin of gt_outtab occurs 0"with header line
        count type int2.
        include structure sflight.
data: celltab type lvc_t_styl.
dataend of gt_outtab.

data: gs_fieldcat type lvc_s_fcat,
      gt_fieldcat type lvc_t_fcat.

parameters: g_max type i default '600',
            g_rstyle type char1 as checkbox,
            g_rowins type char1 as checkbox"default 'X'.  "key active

*---------------------------------------------------------------------*
*       MAIN                                                          *
*---------------------------------------------------------------------*
call screen 100.

*---------------------------------------------------------------------*
*       MODULE PBO OUTPUT                                             *
*---------------------------------------------------------------------*
module pbo output.
  set pf-status 'MAIN100'.
  set titlebar 'MAIN100'.
  if g_custom_container is initial.
    create object g_custom_container
      exporting
        container_name = g_container.
    create object grid1
      exporting
        i_parent = g_custom_container.

* select data, set styles
    perform select_data_and_init_style.

*§3.Provide the fieldname of the celltab field by using field
*   STYLEFNAME of the layout structure.
    gs_layout-stylefname = 'CELLTAB'.
    gs_layout-sel_mode   = 'D'.
* short key 'Delete row' active?
    if g_rowins is not initial.
      gs_layout-no_rowins = 'X'"not allowed
    endif.

* fieldcat
    perform set_fieldcat using gt_fieldcat.

    call method grid1->set_table_for_first_display
      exporting "i_structure_name = 'SFLIGHT'
        is_layout       = gs_layout
      changing
        it_outtab       = gt_outtab[]
        it_fieldcatalog = gt_fieldcat.

  endif.
endmodule.
*---------------------------------------------------------------------*
*       MODULE PAI INPUT                                              *
*---------------------------------------------------------------------*
module pai input.
  save_ok = ok_code.
  clear ok_code.
  case save_ok.
    when 'EXIT'.
      perform exit_program.
    when 'SWITCH'.
      perform switch_edit_mode.
    when others.
*     do nothing
  endcase.
endmodule.
*---------------------------------------------------------------------*
*       FORM EXIT_PROGRAM                                             *
*---------------------------------------------------------------------*
form exit_program.
  set screen 0.
  leave screen.
endform.
*&---------------------------------------------------------------------*
*&      Form  SELECT_DATA_AND_INIT_STYLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form select_data_and_init_style.
  data: lt_sflight type table of sflight with header line,
        lt_celltab type lvc_t_styl,
        l_index type i.

  select * from sflight into table lt_sflight up to g_max rows.
* move corresponding fields from lt_sflight to gt_outtab
  loop at lt_sflight.
    move-corresponding lt_sflight to gt_outtab.
    append gt_outtab.
  endloop.

*§2.After selecting data, set edit status for each row in a loop
*   according to field SEATSMAX.
  loop at gt_outtab.
    l_index = sy-tabix.
    gt_outtab-count = l_index.
    refresh lt_celltab.
    if gt_outtab-seatsmax ge 300.
      perform fill_celltab using 'RW'
                                 l_index
                           changing lt_celltab.
    else.
      perform fill_celltab using 'RO'
                                 l_index
                           changing lt_celltab.
    endif.
*§2c.Copy your celltab to the celltab of the current row of gt_outtab.
    insert lines of lt_celltab into table gt_outtab-celltab.
    modify gt_outtab index l_index.
  endloop.
endform.                               " SELECT_DATA_AND_INIT_STYLE
*&---------------------------------------------------------------------*
*&      Form  FILL_CELLTAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_PT_CELLTAB  text
*----------------------------------------------------------------------*
form fill_celltab using value(p_mode) l_index
                  changing pt_celltab type lvc_t_styl.

  data: ls_celltab type lvc_s_styl,
        l_index1 type i,
        l_mode type raw4,
        l_rowstyle(1type c.
* This forms sets the style of column 'PRICE' editable
* according to 'p_mode' and the rest to read only either way.

  if p_mode eq 'RW'.   ">300
*§2a.Use attribute CL_GUI_ALV_GRID=>MC_STYLE_ENABLED to set a cell
*    to status "editable".
    l_mode = cl_gui_alv_grid=>mc_style_enabled.
  else"p_mode eq 'RO'   "<300
*§2b.Use attribute CL_GUI_ALV_GRID=>MC_STYLE_DISABLED to set a cell
*    to status "non-editable".
    l_mode = cl_gui_alv_grid=>mc_style_disabled.
  endif.


* is row style selected?
  l_rowstyle = g_rstyle.
  l_index1   = l_index.

* define rowstyle for single rows:
  if l_rowstyle is not initial.
    clear ls_celltab.

    if l_index1 <= '100'.
      ls_celltab-fieldname = ' '.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_no_delete_row. " row not deleted
      insert ls_celltab into table pt_celltab.

* define editablility of single cells:
      ls_celltab-fieldname = 'CARRID'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'CONNID'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'FLDATE'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'PRICE'.
      ls_celltab-style = l_mode.    "depending on value seatmax
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'CURRENCY'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'PLANETYPE'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'SEATSMAX'.
      ls_celltab-style = l_mode.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'SEATSOCC'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
      ls_celltab-fieldname = 'PAYMENTSUM'.
      ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
      insert ls_celltab into table pt_celltab.
    else.
*  rows can be deleted
      if l_index1 > 100 and l_index1 <= 200.
* do nothing for row style  and cell style
* set cell style:
        ls_celltab-fieldname = 'CARRID'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'CONNID'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'FLDATE'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'PRICE'.
        ls_celltab-style = l_mode.    "depending on value seatmax
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'CURRENCY'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'PLANETYPE'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'SEATSMAX'.
        ls_celltab-style = l_mode.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'SEATSOCC'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
        ls_celltab-fieldname = 'PAYMENTSUM'.
        ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.
        insert ls_celltab into table pt_celltab.
      else.
        if l_index1 > 200 and l_index1 <= 250.
* everything is editable: > 300, rows can not be deleted
           ls_celltab-fieldname = ' '.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_no_delete_row. " row not deleted
           insert ls_celltab into table pt_celltab.

           ls_celltab-fieldname = 'CARRID'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'CONNID'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'FLDATE'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'PRICE'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'CURRENCY'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'PLANETYPE'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'SEATSMAX'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'SEATSOCC'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'PAYMENTSUM'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
         else.  "BT 250 and 600  rows can be deleted.
           ls_celltab-fieldname = 'CARRID'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'CONNID'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'FLDATE'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'PRICE'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'CURRENCY'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'PLANETYPE'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'SEATSMAX'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'SEATSOCC'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
           ls_celltab-fieldname = 'PAYMENTSUM'.
           ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
           insert ls_celltab into table pt_celltab.
          endif.

      endif.
    endif.
  else.
*without any row style: rows can be deleted
    ls_celltab-fieldname = 'CARRID'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'CONNID'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'FLDATE'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'PRICE'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.   "depending on value seatmax
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'CURRENCY'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'PLANETYPE'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'SEATSMAX'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'SEATSOCC'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
    ls_celltab-fieldname = 'PAYMENTSUM'.
    ls_celltab-style = cl_gui_alv_grid=>mc_style_enabled.
    insert ls_celltab into table pt_celltab.
  endif.

endform.                               " FILL_CELLTAB
*&---------------------------------------------------------------------*
*&      Form  SWITCH_EDIT_MODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form switch_edit_mode.

  if grid1->is_ready_for_input( ) eq 0.

* set edit enabled cells ready for input
    call method grid1->set_ready_for_input
      exporting
        i_ready_for_input = 1.

  else.
* lock edit enabled cells against input
    call method grid1->set_ready_for_input
      exporting
        i_ready_for_input = 0.

  endif.
endform.                               " SWITCH_EDIT_MODE
*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
form set_fieldcat  using    rt_fieldcat type lvc_t_fcat.

  data: ls_fieldcat type lvc_s_fcat,
        lt_fieldcat type lvc_t_fcat,
        n type i.                                           "#EC NEEDED

  call function 'LVC_FIELDCATALOG_MERGE'
   exporting
     i_structure_name             = 'SFLIGHT'
    changing
      ct_fieldcat                  = gt_fieldcat
*    EXCEPTIONS
*      INCONSISTENT_INTERFACE       = 1
*      PROGRAM_ERROR                = 2
*      OTHERS                       = 3
            .
  if sy-subrc <> 0.    "#EC *
* Implement suitable error handling here
  endif.

  lt_fieldcat = rt_fieldcat.

* add count field
  ls_fieldcat-fieldname = 'COUNT'.
  ls_fieldcat-inttype   = 'I'.
  ls_fieldcat-datatype  = 'INT2'.
  ls_fieldcat-scrtext_s = 'Count'.                          "#EC NOTEXT
  ls_fieldcat-scrtext_m = 'Count'.                          "#EC NOTEXT
  ls_fieldcat-scrtext_l = 'Counter'.                        "#EC NOTEXT
  ls_fieldcat-col_pos = '1'.
  ls_fieldcat-col_opt = 'X'.
  ls_fieldcat-intlen    = 2.
  ls_fieldcat-outputlen = 2.

  append ls_fieldcat to lt_fieldcat.

  rt_fieldcat = lt_fieldcat.

endform.                    " SET_FIELDCAT




Output:

No comments:

Post a Comment