Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

uneditable key fields within a editable grid

Former Member
0 Likes
1,951

hi friends,,,

i am using oo alv to display report..

in that report..

i maintained EDIT bt in the application Tool bar using PF-Status..

if i press EDIT bt the entire grid( key fields and other fields) become editable..

but my requirement is i want all the key fields uneditable.and remaining fields editable if i press EDIT bt.

thanks in advance

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,236

Check below program

&----


*& Report ZEDIT_ALV

&----


REPORT zedit_alv.

DATA: i_zkb_test TYPE TABLE OF zkb_test,

w_zkb_test TYPE zkb_test.

DATA: o_grid TYPE REF TO cl_gui_alv_grid,

o_container TYPE REF TO cl_gui_custom_container.

DATA: lt_fcat TYPE lvc_t_fcat,

ls_layo TYPE lvc_s_layo,

ls_sort TYPE lvc_s_sort,

lt_sort TYPE lvc_t_sort,

ls_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

START-OF-SELECTION.

CALL SCREEN 9000.

&----


*& Module STATUS_9000 OUTPUT

&----


  • text

----


MODULE status_9000 OUTPUT.

SET PF-STATUS '9000'.

  • SET TITLEBAR 'xxx'.

ENDMODULE. " STATUS_9000 OUTPUT

&----


*& Module display_alv_9000 OUTPUT

&----


  • text

----


MODULE display_alv_9000 OUTPUT.

IF o_container IS INITIAL.

SELECT * FROM zkb_test INTO TABLE i_zkb_test.

IF cl_gui_alv_grid=>offline( ) IS INITIAL.

  • Create a custom container control for ALV Control

CREATE OBJECT o_container

EXPORTING

container_name = 'CONTAINER'.

  • Create a ALV Control

CREATE OBJECT o_grid

EXPORTING i_parent = o_container.

PERFORM build_field_catalgue.

CALL METHOD o_grid->set_table_for_first_display

EXPORTING

i_save = 'A'

i_default = 'X'

is_layout = ls_layo

CHANGING

it_outtab = i_zkb_test

it_fieldcatalog = lt_fcat

it_sort = lt_sort[].

ENDIF.

ENDIF.

ENDMODULE. " display_alv_9000 OUTPUT

&----


*& Module user_command_9000 INPUT

&----


  • text

----


MODULE user_command_9000 INPUT.

CASE sy-ucomm .

WHEN 'BACK' OR 'EXIT'.

SET SCREEN 0.

LEAVE SCREEN.

WHEN 'UPDATE'.

CALL METHOD o_grid->check_changed_data.

MODIFY zkb_test FROM TABLE i_zkb_test.

IF sy-subrc EQ 0.

COMMIT WORK AND WAIT.

MESSAGE 'Data updated' TYPE 'I'.

ENDIF.

  • Refresh the same in ALV

CALL METHOD o_grid->refresh_table_display.

ENDCASE.

ENDMODULE. " user_command_9000 INPUT

&----


*& Form build_field_catalgue

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM build_field_catalgue .

DATA: ls_fcat TYPE lvc_s_fcat.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'

EXPORTING

i_program_name = sy-cprog

i_internal_tabname = 'I_ZKB_TEST'

i_structure_name = 'ZKB_TEST'

i_client_never_display = 'X'

CHANGING

ct_fieldcat = ls_fieldcat[]

EXCEPTIONS

inconsistent_interface = 1

program_error = 2

OTHERS = 3.

IF sy-subrc <> 0.

MESSAGE 'FCAT Error' TYPE 'I'.

EXIT.

ENDIF.

LOOP AT ls_fieldcat.

CLEAR ls_fcat.

ls_fcat-fieldname = ls_fieldcat-fieldname. "Fieldname

ls_fcat-ref_table = ls_fieldcat-tabname. "DDIC ref struct

ls_fcat-inttype = ls_fieldcat-inttype. "Data type

ls_fcat-outputlen = ls_fieldcat-outputlen. "Column width

ls_fcat-coltext = ls_fieldcat-seltext_m. "Column Header

ls_fcat-seltext = ls_fieldcat-seltext_m. "Column Desc

ls_fcat-ref_field = ls_fieldcat-ref_fieldname. "Reference field

ls_fcat-ref_table = ls_fieldcat-ref_tabname. "Reference table

CASE ls_fieldcat-fieldname.

WHEN 'MANDT' OR 'SNO'.

ls_fcat-edit = ' '.

WHEN OTHERS.

ls_fcat-edit = 'X'.

ENDCASE.

APPEND ls_fcat TO lt_fcat.

ENDLOOP.

ENDFORM. " build_field_catalgue

Rewards if useful...

Regards,

Minal

4 REPLIES 4
Read only

uwe_schieferstein
Active Contributor
0 Likes
1,236

Hello Deva

The following sample report <b>ZUS_SDN_ALV_GRID_EDITABLE</b> shows how to toggle editability of entire columns.

For more details on ALV grid programming please refer to the excellent tutorial

<a href="https://www.sdn.sap.comhttp://www.sdn.sap.comhttp://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/e8a1d690-0201-0010-b7ad-d9719a415907">An Easy Reference For ALV Grid Control</a>

Further useful transactions are:

SE83 (Reuse library)
DWDM (Development Worbench Samples)

Finally, have a look at package <b>SLIS</b>. There are plenty of well documented sample reports (e.g. BCALV_EDIT_...).

*&---------------------------------------------------------------------*
*& Report  ZUS_SDN_ALV_GRID_EDITABLE
*&
*&---------------------------------------------------------------------*
*& Screen '0100' contains no elements.
*& ok_code -> assigned to GD_OKCODE
*&
*& Flow logic:
*  PROCESS BEFORE OUTPUT.
*    MODULE STATUS_0100.
**
*  PROCESS AFTER INPUT.
*    MODULE USER_COMMAND_0100.
*&
*&---------------------------------------------------------------------*

REPORT  zus_sdn_alv_grid_editable.




DATA:
  gd_okcode        TYPE ui_func,
*
  go_docking       TYPE REF TO cl_gui_docking_container,
  go_grid          TYPE REF TO cl_gui_alv_grid,
  gs_layout        TYPE lvc_s_layo,
  gs_variant       TYPE disvariant.


DATA:
  gt_outtab        TYPE STANDARD TABLE OF knb1.




START-OF-SELECTION.

  SELECT        * FROM  knb1 INTO TABLE gt_outtab
         WHERE  bukrs  = '1000'.


  PERFORM init_controls.




* Display data
  gs_layout-grid_title = 'Customers'.
  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      i_structure_name = 'KNB1'
      is_layout        = gs_layout
    CHANGING
      it_outtab        = gt_outtab
    EXCEPTIONS
      OTHERS           = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  PERFORM modify_fieldcatalog.



* Link the docking container to the target dynpro
  CALL METHOD go_docking->link
    EXPORTING
      repid                       = syst-repid
      dynnr                       = '0100'
*      CONTAINER                   =
    EXCEPTIONS
      OTHERS                      = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* NOTE: dynpro does not contain any elements
  CALL SCREEN '0100'.
* Flow logic of dynpro (does not contain any dynpro elements):
*
*PROCESS BEFORE OUTPUT.
*  MODULE STATUS_0100.
**
*PROCESS AFTER INPUT.
*  MODULE USER_COMMAND_0100.



END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.  " contains push button "DETAIL"
*  SET TITLEBAR 'xxx'.


*** Refresh display of detail ALV list
**  CALL METHOD go_grid2->refresh_table_display
***    EXPORTING
***      IS_STABLE      =
***      I_SOFT_REFRESH =
**    EXCEPTIONS
**      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.


ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  TRANSLATE gd_okcode TO UPPER CASE.
  CASE gd_okcode.
    WHEN 'BACK' OR
         'END'  OR
         'CANC'.
      SET SCREEN 0. LEAVE SCREEN.

*   User has pushed button "Display/Change"
    WHEN 'EDIT'.
      PERFORM toggle_display_edit.

    WHEN OTHERS.
  ENDCASE.

  CLEAR: gd_okcode.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*
*&      Form  TOGGLE_DISPLAY_EDIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM toggle_display_edit .

  IF ( go_grid->is_ready_for_input( ) = 0 ).  " not editable
    go_grid->set_ready_for_input( 1 ).  " editable
  ELSE.
    go_grid->set_ready_for_input( 0 ).  " not editable
  ENDIF.

  go_grid->refresh_table_display( ).

ENDFORM.                    " TOGGLE_DISPLAY_EDIT



*&---------------------------------------------------------------------*
*&      Form  INIT_CONTROLS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_controls .

* Create docking container
  CREATE OBJECT go_docking
    EXPORTING
      parent                      = cl_gui_container=>screen0
      ratio                       = 90
    EXCEPTIONS
      OTHERS                      = 6.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


  CALL METHOD go_docking->set_extension
    EXPORTING
      extension  = 9999  " fill entire dynpro
    EXCEPTIONS
      cntl_error = 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.


  CREATE OBJECT go_grid
    EXPORTING
*      I_SHELLSTYLE      = 0
*      I_LIFETIME        =
      i_parent          = go_docking
*      I_APPL_EVENTS     = space
*      I_PARENTDBG       =
*      I_APPLOGPARENT    =
*      I_GRAPHICSPARENT  =
*      I_NAME            =
*      I_FCAT_COMPLETE   = SPACE
    EXCEPTIONS
      error_cntl_create = 1
      error_cntl_init   = 2
      error_cntl_link   = 3
      error_dp_create   = 4
      OTHERS            = 5.
  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.                    " INIT_CONTROLS


*&---------------------------------------------------------------------*
*&      Form  MODIFY_FIELDCATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM modify_fieldcatalog .
* define local data
  DATA:
    ls_fcat    TYPE lvc_s_fcat,
    lt_fcat    TYPE lvc_t_fcat.


  CALL METHOD go_grid->get_frontend_fieldcatalog
    IMPORTING
      et_fieldcatalog = lt_fcat.


  " set non-key fields editable
  ls_fcat-edit = 'X'.
  MODIFY lt_fcat FROM ls_fcat
    TRANSPORTING edit
    WHERE ( key NE 'X' ).

  go_grid->set_frontend_fieldcatalog( lt_fcat ).

  go_grid->set_ready_for_input( 0 ).  " default = display

  go_grid->refresh_table_display( ).

ENDFORM.                    " MODIFY_FIELDCATALOG

Regards

Uwe

Read only

Former Member
0 Likes
1,236

In the field catalog, you can specify a value for the attribute EDIT:

LOOP AT gt_fcat INTO ls_fcat.

CASE ls_fcat-fieldname.

WHEN 'KEYFLD1'.

ls_fcat-edit = ''. " Non-editable field

WHEN 'KEYFLD2'.

ls_fcat-edit = ''. " Non-editable field

WHEN 'FLD3.

ls_fcat-edit = 'X'. " Editable field

ENDCASE.

modify gt_fcat from ls_fcat.

endloop.

Regards,

Rao A

Read only

Former Member
0 Likes
1,237

Check below program

&----


*& Report ZEDIT_ALV

&----


REPORT zedit_alv.

DATA: i_zkb_test TYPE TABLE OF zkb_test,

w_zkb_test TYPE zkb_test.

DATA: o_grid TYPE REF TO cl_gui_alv_grid,

o_container TYPE REF TO cl_gui_custom_container.

DATA: lt_fcat TYPE lvc_t_fcat,

ls_layo TYPE lvc_s_layo,

ls_sort TYPE lvc_s_sort,

lt_sort TYPE lvc_t_sort,

ls_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

START-OF-SELECTION.

CALL SCREEN 9000.

&----


*& Module STATUS_9000 OUTPUT

&----


  • text

----


MODULE status_9000 OUTPUT.

SET PF-STATUS '9000'.

  • SET TITLEBAR 'xxx'.

ENDMODULE. " STATUS_9000 OUTPUT

&----


*& Module display_alv_9000 OUTPUT

&----


  • text

----


MODULE display_alv_9000 OUTPUT.

IF o_container IS INITIAL.

SELECT * FROM zkb_test INTO TABLE i_zkb_test.

IF cl_gui_alv_grid=>offline( ) IS INITIAL.

  • Create a custom container control for ALV Control

CREATE OBJECT o_container

EXPORTING

container_name = 'CONTAINER'.

  • Create a ALV Control

CREATE OBJECT o_grid

EXPORTING i_parent = o_container.

PERFORM build_field_catalgue.

CALL METHOD o_grid->set_table_for_first_display

EXPORTING

i_save = 'A'

i_default = 'X'

is_layout = ls_layo

CHANGING

it_outtab = i_zkb_test

it_fieldcatalog = lt_fcat

it_sort = lt_sort[].

ENDIF.

ENDIF.

ENDMODULE. " display_alv_9000 OUTPUT

&----


*& Module user_command_9000 INPUT

&----


  • text

----


MODULE user_command_9000 INPUT.

CASE sy-ucomm .

WHEN 'BACK' OR 'EXIT'.

SET SCREEN 0.

LEAVE SCREEN.

WHEN 'UPDATE'.

CALL METHOD o_grid->check_changed_data.

MODIFY zkb_test FROM TABLE i_zkb_test.

IF sy-subrc EQ 0.

COMMIT WORK AND WAIT.

MESSAGE 'Data updated' TYPE 'I'.

ENDIF.

  • Refresh the same in ALV

CALL METHOD o_grid->refresh_table_display.

ENDCASE.

ENDMODULE. " user_command_9000 INPUT

&----


*& Form build_field_catalgue

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM build_field_catalgue .

DATA: ls_fcat TYPE lvc_s_fcat.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'

EXPORTING

i_program_name = sy-cprog

i_internal_tabname = 'I_ZKB_TEST'

i_structure_name = 'ZKB_TEST'

i_client_never_display = 'X'

CHANGING

ct_fieldcat = ls_fieldcat[]

EXCEPTIONS

inconsistent_interface = 1

program_error = 2

OTHERS = 3.

IF sy-subrc <> 0.

MESSAGE 'FCAT Error' TYPE 'I'.

EXIT.

ENDIF.

LOOP AT ls_fieldcat.

CLEAR ls_fcat.

ls_fcat-fieldname = ls_fieldcat-fieldname. "Fieldname

ls_fcat-ref_table = ls_fieldcat-tabname. "DDIC ref struct

ls_fcat-inttype = ls_fieldcat-inttype. "Data type

ls_fcat-outputlen = ls_fieldcat-outputlen. "Column width

ls_fcat-coltext = ls_fieldcat-seltext_m. "Column Header

ls_fcat-seltext = ls_fieldcat-seltext_m. "Column Desc

ls_fcat-ref_field = ls_fieldcat-ref_fieldname. "Reference field

ls_fcat-ref_table = ls_fieldcat-ref_tabname. "Reference table

CASE ls_fieldcat-fieldname.

WHEN 'MANDT' OR 'SNO'.

ls_fcat-edit = ' '.

WHEN OTHERS.

ls_fcat-edit = 'X'.

ENDCASE.

APPEND ls_fcat TO lt_fcat.

ENDLOOP.

ENDFORM. " build_field_catalgue

Rewards if useful...

Regards,

Minal

Read only

former_member480923
Active Contributor
0 Likes
1,236

hi

The steps:

1) input the following field in ur internal Table: cell_style TYPE lvc_t_styl.

2) Using the condition for display enter the value to the field:


    wal_cell_stl-style = cl_gui_alv_grid=>mc_style_enabled.
    INSERT wal_cell_stl INTO TABLE wal_out_tab-cell_style.
* or 
    wal_cell_stl-style = cl_gui_alv_grid=>mc_style_disabled.
    INSERT wal_cell_stl INTO TABLE wal_out_tab-cell_style.

Hope That Helps

Anirban M.