ALV report editable to enter text and print with including the text?

Hi all,
I have to display output of a  report in ALV format and i have to make two fileds can be editable to enter texts by user  and able to print the list with that texts .
Is it possible using standard Function modules or I have to go for OO methods? Please give the sample code ?
Thanks,
Vamshi
Edited by: VAMSHI KRISHNA on Oct 31, 2008 4:25 PM

Hi Vamshi,
Check out the Below sample code for the editable ALV.
*& Report  Z7CC_OOPS_ALV_EDITABLE
report  z7cc_oops_alv_editable.
tables sflight.
data: begin of gt_outtab occurs 0.     "with header line
        include structure sflight.
data: celltab type lvc_t_styl.
data: end of gt_outtab.
data: gt_fieldcat type lvc_t_fcat.
data: g_carrid like sflight-carrid,
      g_connid like sflight-connid.
data: gs_spfli type spfli.                                  "#EC NEEDED
data: g_custom_container type ref to cl_gui_custom_container.
data:  g_container type scrfname value 'BCALV_GRID_DEMO_0100_CONT1'.
data: g_grid  type ref to cl_gui_alv_grid.
data: wa_outtab like gt_outtab.
*       CLASS lcl_event_receiver DEFINITION
class lcl_event_receiver definition.
  public section.
    types: begin of sflight_key.
    types:   carrid type s_carr_id.
    types:   connid type s_conn_id.
    types:   fldate type s_date.
    types: end of sflight_key.
    types: sflight_keys type standard table of sflight_key,
           sflight_table type standard table of sflight.
    methods:
      handle_data_changed
         for event data_changed of cl_gui_alv_grid
             importing er_data_changed.
    methods:
      get_inserted_rows
           exporting
              inserted_rows type sflight_keys.
    methods:
      get_deleted_rows
          exporting
              deleted_rows type sflight_table.
    methods:
       refresh_delta_tables.
    methods: set_table_is_initial.
    methods: set_table_is_not_initial.
    methods: table_is_initial
                returning value(initial) type char01.
  private section.
* §4.Define internal tables to remember inserted and deleted lines,
*    thus the delta between input made after the last saving.
    data: inserted_rows type sflight_keys,
          deleted_rows type standard table of sflight.
* This flag is set if any error occured in one of the
* following methods:
    data: error_in_data type c.
* This flag signals that no records were read for the flight
* table initially:
    data: initial_table type c.
** Methods to modularize event handler method HANDLE_DATA_CHANGED:
    methods:
      check_double_entries
         importing
            pr_data_changed type ref to cl_alv_changed_data_protocol.
    methods:
      update_delta_tables
         importing
            pr_data_changed type ref to cl_alv_changed_data_protocol.
    methods:
      perform_semantic_checks
         importing
            pr_data_changed type ref to cl_alv_changed_data_protocol.
    methods:
      get_cell_values
           importing
             row_id          type int4
             pr_data_changed type ref to cl_alv_changed_data_protocol
           exporting
             key             type sflight_key.
endclass.                    "lcl_event_receiver DEFINITION
class lcl_event_receiver implementation.
  method handle_data_changed.
*    data: ls_good type lvc_s_modi,
*          l_price type s_price,
*          ls_new type lvc_s_moce.
*    error_in_data = space.
** check if there exist double entries
*    call method check_double_entries( er_data_changed ).
** remember new or deleted lines for saving
*    call method update_delta_tables( er_data_changed ).
** check mt_good_cells semantically
*    call method perform_semantic_checks( er_data_changed ).
*    if error_in_data = 'X'.
*      call method er_data_changed->display_protocol.
*    endif.
  endmethod.                    "handle_data_changed
  method check_double_entries.
    data: lt_good_cells type lvc_t_modi,
          ls_good type lvc_s_modi,
          ls_key type sflight_key,
          ls_sflight type sflight,
          l_flightdate like gt_outtab-fldate,
          l_del_row type lvc_s_moce,
          ls_outtab like line of gt_outtab,
          l_reentered type c.
* §5.Check if there exist already other records with equal key fields.
* Check if the user has entered two new lines where the key fields
* are equal.
* Since CARRID and CONNID are read only, the check is restrained
* to field FLDATE.
* Algorithm: Copy all entries in MT_GOOD_CELLS to a dummy table.
*            During the copying procedure check if there exists
*            already a line with the same Flight date.
*    loop at pr_data_changed->mt_good_cells into ls_good.
*      case ls_good-fieldname.
*        when 'FLDATE'.
*          call method pr_data_changed->get_cell_value
*                      exporting
*                            i_row_id = ls_good-row_id
*                            i_fieldname = ls_good-fieldname
*                      importing e_value = l_flightdate.
*          read table lt_good_cells with key
*                            value = l_flightdate
*                            transporting no fields.
*          if sy-subrc = 0.
** There exists already a line with the same flight date!
*            call method pr_data_changed->add_protocol_entry
*                         exporting
*              i_msgid = '0K' i_msgno = '000'  i_msgty = 'E'
*              i_msgv1 = text-m01
*              i_fieldname = ls_good-fieldname
*              i_row_id = ls_good-row_id.
*            error_in_data = 'X'.
*          else.
*            ls_good-value = l_flightdate.
*            append ls_good to lt_good_cells.
*          endif.
*      endcase.
*    endloop.
** Check if any new entries already exist in gt_outtab.
** At this point, lt_good_cells contains only lines with
** FIELDNAME = 'FLDATE'.
*    loop at lt_good_cells into ls_good.
*      l_flightdate = ls_good-value.      "flightdate, see above
*      read table gt_outtab with key
*                    carrid = g_carrid
*                    connid = g_connid
*                    fldate = l_flightdate
*                    transporting no fields.
*      if sy-subrc = 0.
** Check if this entry was deleted before, i.e. it is in the table
** of deleted rows. If so, the entry does not exist twice. The user
** has deleted a line and then reentered it.
*        l_reentered = space.
*        loop at pr_data_changed->mt_deleted_rows into l_del_row.
*          read table gt_outtab into ls_outtab index l_del_row-row_id.
*          if sy-subrc ne 0.
*            message i000(0k) with text-e01."Fehler beim Löschen
*          elseif
*                    ls_outtab-carrid eq g_carrid
*                and ls_outtab-connid eq g_connid
*                and ls_outtab-fldate eq ls_good-value.
*            l_reentered = 'X'.
*          endif.
*        endloop.
*        if l_reentered ne 'X'.
*          call method pr_data_changed->add_protocol_entry
*                         exporting
*              i_msgid = '0K' i_msgno = '000'  i_msgty = 'E'
*              i_msgv1 = text-m01
*              i_fieldname = ls_good-fieldname
*              i_row_id = ls_good-row_id.
*          error_in_data = 'X'.
*        endif.
*      endif.
*    endloop.
** In this demo report you may prevent the selection
** of data by setting parameter 'p_ds'.
** If this is done, the next check is required:
*    if me->table_is_initial( ) eq 'X'.
*      call method get_cell_values
*           exporting row_id          = 1
*                     pr_data_changed = pr_data_changed
*           importing key             = ls_key.
*      select single * from sflight into ls_sflight
*                where carrid = ls_key-carrid
*                  and connid = ls_key-connid
*                  and fldate = ls_key-fldate.
*      if sy-subrc = 0.
*        call method pr_data_changed->add_protocol_entry
*                       exporting
*            i_msgid = '0K' i_msgno = '000'  i_msgty = 'E'
*            i_msgv1 = text-m01
*            i_fieldname = 'FLDATE'
*            i_row_id = 1.
*        error_in_data = 'X'.
*      endif.
** flag initial_table is reset in method 'update_delta_tables'
*    endif.
  endmethod.                    "check_double_entries
  method update_delta_tables.
*    data: l_ins_row type lvc_s_moce,
*          l_del_row type lvc_s_moce,
*          ls_key type sflight_key,
*          ls_sflight type sflight,
*          ls_outtab like line of gt_outtab.
** §6.Use protocol attributes MT_DELETED_ROWS and MT_INSERTED_ROWS
**    to remember which lines where deleted or inserted. Save this
**    information in your internal tables.
** deleted rows
*    loop at pr_data_changed->mt_deleted_rows into l_del_row.
*      read table gt_outtab into ls_outtab index l_del_row-row_id.
*      if sy-subrc ne 0.
*        message i000(0k) with text-e01."Fehler beim Löschen
*      else.
*        move-corresponding ls_outtab to ls_sflight.
** It should no be possible that the same line is deleted twice,
** so we just add the new key line to 'deleted_rows'.
*        append ls_sflight to deleted_rows.
** If this line was inserted just before it is deleted:
*        delete me->inserted_rows
*             where carrid = ls_outtab-carrid
*             and   connid = ls_outtab-connid
*             and   fldate = ls_outtab-fldate.
*      endif.
*    endloop.
** inserted rows
** At this point ALV has not added new lines
** to gt_outtab, so you can not access their values
** by reading gt_outtab.
** Table MT_GOOD_CELLS holds new values that can be
** referenced using the ROW_ID.
*    if me->table_is_initial( ) eq 'X'.
** No flights were selected initially. This is the first new line.
*      call method get_cell_values
*            exporting row_id          = 1
*                      pr_data_changed = pr_data_changed
*            importing key             = ls_key.
*      append ls_key to inserted_rows.
*      call method me->set_table_is_not_initial.
*    endif.
*    loop at pr_data_changed->mt_inserted_rows into l_ins_row.
*      call method get_cell_values
*              exporting row_id          = l_ins_row-row_id
*                        pr_data_changed = pr_data_changed
*              importing key             = ls_key.
**      READ TABLE gt_outtab INTO ls_outtab INDEX l_ins_row-row_id.
** Just insert the new row regardless if the input is wrong
*      append ls_key to inserted_rows.
*    endloop.
  endmethod.                    "update_delta_tables
  method get_cell_values.
* get values of key cells of row ROW_ID
** CARRIER
*    call method pr_data_changed->get_cell_value
*          exporting
*                 i_row_id    = row_id
*                 i_fieldname = 'CARRID'
*               importing
*                 e_value = key-carrid.
*    if sy-subrc ne 0.
*      message i000(0k) with text-e02.  "Fehler beim Einfügen
*    endif.
** CONNID
*    call method pr_data_changed->get_cell_value
*          exporting
*                 i_row_id    = row_id
*                 i_fieldname = 'CONNID'
*               importing
*                 e_value = key-connid.
*    if sy-subrc ne 0.
*      message i000(0k) with text-e02.  "Fehler beim Einfügen
*    endif.
** FLDATE
*    call method pr_data_changed->get_cell_value
*          exporting
*                 i_row_id    = row_id
*                 i_fieldname = 'FLDATE'
*               importing
*                 e_value = key-fldate.
*    if sy-subrc ne 0.
*      message i000(0k) with text-e02.  "Fehler beim Einfügen
*    endif.
  endmethod.                    "get_cell_values
  method perform_semantic_checks.
*    data: ls_good type lvc_s_modi,
*          l_planetype type s_planetye,
*          l_seatsmax type s_seatsmax.
*    loop at pr_data_changed->mt_good_cells into ls_good.
*      case ls_good-fieldname.
*        when 'PLANETYPE'.
*          call method pr_data_changed->get_cell_value
*             exporting
*               i_row_id = ls_good-row_id
*               i_fieldname = ls_good-fieldname
*             importing
*               e_value = l_planetype.
*          select single seatsmax from saplane into l_seatsmax
*                        where planetype = l_planetype.
*          if sy-subrc ne 0.
*            call method pr_data_changed->add_protocol_entry
*                            exporting
*                 i_msgid = '0K' i_msgno = '000'  i_msgty = 'E'
*                 i_msgv1 = text-m02
*                 i_fieldname = ls_good-fieldname
*                 i_row_id = ls_good-row_id.
*            error_in_data = 'X'.
*          else.
*            call method pr_data_changed->modify_cell
*              exporting i_row_id    = ls_good-row_id
*                        i_fieldname = 'SEATSMAX'
*                        i_value     = l_seatsmax.
*          endif.
*      endcase.
*    endloop.
  endmethod.                    "perform_semantic_checks
  method get_inserted_rows.
*    inserted_rows = me->inserted_rows.
  endmethod.                    "get_inserted_rows
  method get_deleted_rows.
*    deleted_rows = me->deleted_rows.
  endmethod.                    "get_deleted_rows
  method refresh_delta_tables.
*    clear me->inserted_rows[].
*    clear me->deleted_rows[].
  endmethod.                    "refresh_delta_tables
  method set_table_is_initial.
*    initial_table = 'X'.
  endmethod.                    "set_table_is_initial
  method set_table_is_not_initial.
*    initial_table = space.
  endmethod.                    "set_table_is_not_initial
  method table_is_initial.
*    if initial_table = 'X'.
*      initial = 'X'.
*    else.
*      initial = space.
*    endif.
  endmethod.                    "table_is_initial
endclass.                    "lcl_event_receiver IMPLEMENTATION
data: g_verifier type ref to lcl_event_receiver.
data: g_max type i value 100.
data: gs_layout type lvc_s_layo.
data: ok_code like sy-ucomm,
      save_ok like sy-ucomm.
parameters: p_ds type c as checkbox.   "delete selection
select-options s_carrid for sflight-carrid
                            no intervals no-extension default 'LH'.
select-options s_connid for sflight-connid
                           no intervals no-extension default '0400'.
start-of-selection.
  g_carrid = s_carrid-low.
  g_connid = s_connid-low.
* first check airline and connection
  select single * from spfli into gs_spfli
                     where carrid = g_carrid
                     and connid = g_connid.
  call screen 100.
*&      Module  STATUS_0100  OUTPUT
*       text
module status_0100 output.
  set pf-status 'MAIN100'.
  set titlebar 'MAIN100'.
  if g_custom_container is initial.
    perform create_and_init_alv changing gt_outtab[]
                                         gt_fieldcat.
  endif.
endmodule.                 " STATUS_0100  OUTPUT
*&      Form  create_and_init_alv
*       text
*      <--P_GT_OUTTAB[]  text
*      <--P_GT_FIELDCAT  text
form create_and_init_alv changing pt_outtab like gt_outtab[]
                                  pt_fieldcat type lvc_t_fcat.
  data: lt_exclude type ui_functions.
  create object g_custom_container
         exporting container_name = g_container.
  create object g_grid
         exporting i_parent = g_custom_container.
* Create Objekt to verify input values.
* (This object is already needed in form SELECT_DATA).
  create object g_verifier.
*  SET HANDLER g_verifier->handle_data_changed FOR g_grid.
  perform select_data changing pt_outtab[].
  perform build_fieldcat changing pt_fieldcat.
  perform exclude_tb_functions changing lt_exclude.
  gs_layout-stylefname = 'CELLTAB'.
  call method g_grid->set_table_for_first_display
    exporting
      it_toolbar_excluding = lt_exclude
      is_layout            = gs_layout
    changing
      it_fieldcatalog      = pt_fieldcat
      it_outtab            = pt_outtab[].
* Set editable cells to ready for input initially
  call method g_grid->set_ready_for_input
    exporting
      i_ready_for_input = 1.
endform.                    " create_and_init_alv
*&      Form  select_data
*       text
*      <--P_GT_OUTTAB  text
form select_data changing pt_outtab like gt_outtab[].
  data: lt_sflight type table of sflight,
        ls_sflight type sflight,
        ls_outtab like line of gt_outtab,
        l_index type i,
        ls_spfli type spfli,                                "#EC NEEDED
        lt_celltab type lvc_t_styl.
* Check parameter 'p_ds'=>optionally select no data
  if p_ds is initial.
* Select data from sflight
    select * from sflight into table lt_sflight up to g_max rows
                     where carrid = g_carrid
                       and connid = g_connid.
  endif.
  if sy-subrc ne 0 or not p_ds is initial.
* no flights were found!
* We provide some default values for the first line that is entered:
    ls_outtab-carrid = g_carrid.
    ls_outtab-connid = g_connid.
    case g_carrid.
      when 'LH'.
        ls_outtab-currency = 'DEM'.
      when others.
        ls_outtab-currency = 'US'.
    endcase.
    ls_outtab-seatsocc = 0.
    ls_outtab-paymentsum = 0.
* set fields FLDATE, PRICE and PLANETYPE to editable
    perform fill_celltab using 'RW'
                         changing lt_celltab.
    insert lines of lt_celltab into table ls_outtab-celltab.
    append ls_outtab to pt_outtab.
* Tell Verify-Objekt that the table was initial
    call method g_verifier->set_table_is_initial.
  else.
    call method g_verifier->set_table_is_not_initial.
* move corresponding fields from lt_sflight to gt_outtab
    loop at lt_sflight into ls_sflight.
      move-corresponding ls_sflight to ls_outtab.
      append ls_outtab to pt_outtab.
    endloop.
* §3.Set all cells of the table non-editable by using the style table.
    loop at pt_outtab into ls_outtab.
      l_index = sy-tabix.
      refresh lt_celltab.
      perform fill_celltab using 'RO'
                        changing lt_celltab.
* Copy your celltab to the celltab of the current row of gt_outtab.
      insert lines of lt_celltab into table ls_outtab-celltab.
      modify pt_outtab from ls_outtab index l_index.
    endloop.
  endif.
endform.                               " select_data
*&      Form  fill_celltab
*       text
*      -->VALUE(P_MODE)  text
*      -->PT_CELLTAB     text
form fill_celltab using value(p_mode)
                  changing pt_celltab type lvc_t_styl.
  data: ls_celltab type lvc_s_styl,
        l_mode type raw4.
* This forms sets the style of columns 'PRICE', FLDATE and PLANETYPE
* editable
  if p_mode eq 'RW'.
    l_mode = cl_gui_alv_grid=>mc_style_enabled.
  else.                                "p_mode eq 'RO'
    l_mode = cl_gui_alv_grid=>mc_style_disabled.
  endif.
  ls_celltab-fieldname = 'FLDATE'.
  ls_celltab-style = l_mode.
  insert ls_celltab into table pt_celltab.
  ls_celltab-fieldname = 'PRICE'.
  ls_celltab-style = l_mode.
  insert ls_celltab into table pt_celltab.
  ls_celltab-fieldname = 'PLANETYPE'.
  ls_celltab-style = l_mode.
  insert ls_celltab into table pt_celltab.
endform.                               " FILL_CELLTAB
*&      Form  BUILD_FIELDCAT
*       text
*      <--P_GT_FIELDCAT  text
form build_fieldcat changing pt_fieldcat type lvc_t_fcat.
  data ls_fcat type lvc_s_fcat.
  call function 'LVC_FIELDCATALOG_MERGE'
    exporting
      i_structure_name = 'SFLIGHT'
    changing
      ct_fieldcat      = pt_fieldcat.
  loop at pt_fieldcat into ls_fcat.
    if    ls_fcat-fieldname eq 'PRICE'
       or ls_fcat-fieldname eq 'PLANETYPE'
       or ls_fcat-fieldname eq 'FLDATE'.
* §1.Set status of columns FLDATA, PRICE and PLANETYPE to editable.
*    Since all cells are set to non-editable (see step 3) the cells
*    of this columns will only be editable for new lines.
      ls_fcat-edit = 'X'.
* Field 'checktable' is set to avoid shortdumps that are caused
* by inconsistend data in check tables. You may comment this out
* when the test data of the flight model is consistent in your system.
      ls_fcat-checktable = '!'.        "do not check foreign keys
      modify pt_fieldcat from ls_fcat.
    elseif ls_fcat-fieldname = 'CARRID'
       or ls_fcat-fieldname = 'CONNID'
       or ls_fcat-fieldname = 'CURRENCY'.
* §2.Use field AUTO_VALUE of the fieldcatalog to preset values when new
*    lines are added.
      ls_fcat-auto_value = 'X'.
      ls_fcat-checktable = '!'.   "do not check foreign key relations
      modify pt_fieldcat from ls_fcat.
    endif.
  endloop.
endform.                    "build_fieldcat
*&      Form  exclude_tb_functions
*       text
*      <--P_LT_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_insert_row.
  append ls_exclude to pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
  append ls_exclude to pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  append ls_exclude to pt_exclude.
endform.                               " EXCLUDE_TB_FUNCTIONS
*&      Module  USER_COMMAND_0100  INPUT
*       text
module user_command_0100 input.
  save_ok = sy-ucomm.
  clear ok_code.
  case save_ok.
    when 'SAVE'.
*      perform save_data.
    when 'BACK'.
* §10.Unlock your database table.
*      perform unlock_sflight.
      leave to screen 0.
    when 'EXIT'.
      perform exit_program.
    when 'ADD'.
      perform add_line_item.
    when others.
*     do nothing
  endcase.
endmodule.                 " USER_COMMAND_0100  INPUT
*       FORM EXIT_PROGRAM                                             *
form exit_program.
  leave program.
endform.                    "exit_program
*&      Form  ADD_LINE_ITEM
*       text
*  -->  p1        text
*  <--  p2        text
form add_line_item .
data: lt_rows type lvc_t_row.
data: wa_rows type lvc_t_row with header line.
data: tabix type sy-tabix.
*&Find the  row ( index ) number
call method g_grid->get_selected_rows
          importing et_index_rows = lt_rows.
call method cl_gui_cfw=>flush.
read table lt_rows into wa_rows index 1.
tabix = wa_rows-index .
insert gt_outtab  index tabix.
*REFRESH_TABLE_DISPLAY
call method g_grid->refresh_table_display
*  EXPORTING
*    IS_STABLE      =
*    I_SOFT_REFRESH =
*  EXCEPTIONS
*    FINISHED       = 1
*    others         = 2
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.
endform.                    " ADD_LINE_ITEM
Thanks,
Chidanand

Similar Messages

Maybe you are looking for