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

How to download the data structure of tables in SE11?

Good morning people around the world. Its me again doing some blogs. Sharing to you some tips and tricks in the SAP world. Well, before I s...