Application Development 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: 

OO ALV: changing of fieldcatalog

Former Member
0 Kudos

Dear experts, I got following situation:

During PBO I create my fieldcatalog in the simple way:

IF rf_custom_container IS NOT BOUND.

       CREATE OBJECT rf_custom_container

         EXPORTING

           container_name = 'CUSTCONTROL'.

       CREATE OBJECT rf_alv

         EXPORTING

           i_parent = rf_custom_container.

     

       CLEAR st_fieldcat.

       st_fieldcat-fieldname = 'KWMENG'.

       st_fieldcat-hotspot   = abap_true.

       st_fieldcat-edit      = abap_false.

       st_fieldcat-outputlen = 15.

       APPEND st_fieldcat TO ta_fieldcat.


Than I'd like to do one of the fields changeable, when some variable is 'true' and I do this in this way:


IF v_matbeleg = abap_false.

     "Get current fieldcatalog

     CALL METHOD rf_alv->get_frontend_fieldcatalog

       IMPORTING

         et_fieldcatalog = ta_fieldcat.

     LOOP AT ta_fieldcat INTO st_fieldcat.

       st_fieldcat-fieldname = 'KWMENG'.

       st_fieldcat-hotspot   = abap_false.

       st_fieldcat-edit      = abap_true.

       APPEND st_fieldcat TO ta_fieldcat.

       "MODIFY ta_fieldcat FROM st_fieldcat.

     ENDLOOP.

     "Show changed field catalog

     CALL METHOD rf_alv->set_table_for_first_display

       CHANGING

         it_outtab       = ta_alv

         it_fieldcatalog = ta_fieldcat.

     IF sy-subrc <> 0.

       MESSAGE e017(z_whreservierung).

     ENDIF.

     "Refresh of ALV

     rf_alv->refresh_table_display( ).

     "Saving of changed amount

     CALL METHOD rf_alv->register_edit_event

       EXPORTING

         i_event_id = rf_alv->mc_evt_modified.

     IF sy-subrc <> 0.

       "Geänderte menge wurde nicht gespeichert!

       MESSAGE e017(z_whreservierung).

     ENDIF.

     "Refresh of ALV

     rf_alv->refresh_table_display( ).

   ENDIF.


But unfortunatelly this solution doesn't work...what do I do wrong? Is there any other possibility may be?


Thanks in advance


Denis

1 ACCEPTED SOLUTION

alessandroieva
Active Participant
0 Kudos

Hi,

use this code:

1) insert this field in your internal table (ta_alv).

celltab        TYPE lvc_t_styl,


2) insert this code in the perform after that you create the container:

  CALL METHOD ref_alv->register_edit_event
EXPORTING
i_event_id
= cl_gui_alv_grid=>mc_evt_enter


3) assign this value to layout structure:

p_layout-stylefname = 'CELLTAB’.


4)call the first display:

CALL METHOD ref_alv ->register_edit_event
EXPORTING
i_event_id
= cl_gui_alv_grid=>mc_evt_modified.

  
CALL METHOD alv->set_table_for_first_display
    
EXPORTING
       is_variant                   
= st_variant
       i_save                       
= 'A'
       is_layout                    
= st_layout
       it_toolbar_excluding         
= tb_toolbar_excl
    
CHANGING
       it_outtab                    
= tb_out
       it_fieldcatalog              
= tb_fcat
    
EXCEPTIONS
       invalid_parameter_combination
= 1
       program_error                
= 2
       too_many_lines               
= 3
      
OTHERS                        = 4.

* Set editable cells to ready for input initially
CALL METHOD alv->set_ready_for_input
EXPORTING
i_ready_for_input
= 1.


5) use this perform for valorise the field celltab:

PERFORM set_edit_cell USING wa_alv-celltab <fieldname>.


*&---------------------------------------------------------------------*
*&      Form  SET_EDIT_CELL
*&---------------------------------------------------------------------*
FORM set_edit_cell  CHANGING lt_celltab TYPE lvc_t_styl
fieldname.

DATA: ls_celltab TYPE lvc_s_styl.
CLEAR ls_celltab.

ls_celltab
-fieldname = fieldname.
ls_celltab
-style = cl_gui_alv_grid=>mc_style_enabled.
INSERT ls_celltab INTO TABLE lt_celltab.

ENDFORM.                    " SET_EDIT_CELL



let me know.


AI


9 REPLIES 9

nmkarthikeya
Active Participant
0 Kudos

Do you want entire column editable or only a particular cell?

No need to call "set_table_for_first_display" whenever you change field cat, "refresh_table_display( )" will just do the trick.


now I didn't get what exactly is not working, is it not changing to edit mode or you are not able to see the values that are edited?


Regards,

Karthikeya

0 Kudos

i want the whole column (but not row) 'KWMENG' editable.

yes exactly is not changing to edit mode. BTW I made my code a bit better:

IF v_matbeleg = abap_false.

     CALL METHOD rf_alv->get_frontend_fieldcatalog

       IMPORTING

         et_fieldcatalog = ta_fieldcat.

     LOOP AT ta_fieldcat ASSIGNING <wa_fieldcat>

       WHERE fieldname = 'KWMENG'.

       <wa_fieldcat>-hotspot   = abap_false.

       <wa_fieldcat>-edit      = abap_true.

     ENDLOOP.


    rf_alv->refresh_table_display( ).


But the cell/column is still not editable


alessandroieva
Active Participant
0 Kudos

Hi,

use this code:

1) insert this field in your internal table (ta_alv).

celltab        TYPE lvc_t_styl,


2) insert this code in the perform after that you create the container:

  CALL METHOD ref_alv->register_edit_event
EXPORTING
i_event_id
= cl_gui_alv_grid=>mc_evt_enter


3) assign this value to layout structure:

p_layout-stylefname = 'CELLTAB’.


4)call the first display:

CALL METHOD ref_alv ->register_edit_event
EXPORTING
i_event_id
= cl_gui_alv_grid=>mc_evt_modified.

  
CALL METHOD alv->set_table_for_first_display
    
EXPORTING
       is_variant                   
= st_variant
       i_save                       
= 'A'
       is_layout                    
= st_layout
       it_toolbar_excluding         
= tb_toolbar_excl
    
CHANGING
       it_outtab                    
= tb_out
       it_fieldcatalog              
= tb_fcat
    
EXCEPTIONS
       invalid_parameter_combination
= 1
       program_error                
= 2
       too_many_lines               
= 3
      
OTHERS                        = 4.

* Set editable cells to ready for input initially
CALL METHOD alv->set_ready_for_input
EXPORTING
i_ready_for_input
= 1.


5) use this perform for valorise the field celltab:

PERFORM set_edit_cell USING wa_alv-celltab <fieldname>.


*&---------------------------------------------------------------------*
*&      Form  SET_EDIT_CELL
*&---------------------------------------------------------------------*
FORM set_edit_cell  CHANGING lt_celltab TYPE lvc_t_styl
fieldname.

DATA: ls_celltab TYPE lvc_s_styl.
CLEAR ls_celltab.

ls_celltab
-fieldname = fieldname.
ls_celltab
-style = cl_gui_alv_grid=>mc_style_enabled.
INSERT ls_celltab INTO TABLE lt_celltab.

ENDFORM.                    " SET_EDIT_CELL



let me know.


AI


0 Kudos

Hi Alessandro,

thank you very much for the feedback but let me may be try to concretize what I need:

So I create my container, my alv as my fieldcatalog like this and everything is great:

IF rf_custom_container IS NOT BOUND.

       CREATE OBJECT rf_custom_container

         EXPORTING

           container_name = 'CUSTCONTROL'.

       CREATE OBJECT rf_alv

         EXPORTING

           i_parent = rf_custom_container.

       "Feldkatalog aufbauen

       CLEAR st_fieldcat.

       st_fieldcat-fieldname = 'MATNR'.

       st_fieldcat-hotspot   = abap_true.

       st_fieldcat-outputlen   = 18.

       APPEND st_fieldcat TO ta_fieldcat.

       st_fieldcat-fieldname = 'MTEXT'.

       st_fieldcat-hotspot   = abap_true.

       st_fieldcat-outputlen   = 48.

       APPEND st_fieldcat TO ta_fieldcat.

       st_fieldcat-fieldname = 'KWMENG'.

       st_fieldcat-hotspot   = abap_true.

       st_fieldcat-edit      = abap_false.

       st_fieldcat-outputlen = 15.

       APPEND st_fieldcat TO ta_fieldcat.

       st_fieldcat-fieldname = 'VRKME'.

       st_fieldcat-hotspot   = abap_true.

       st_fieldcat-outputlen   = 3.

       APPEND st_fieldcat TO ta_fieldcat.

       st_layout-cwidth_opt = abap_true.


CALL METHOD rf_alv->set_table_for_first_display

         EXPORTING

           i_structure_name = 'ZWH_RESERVIERUNG'

         CHANGING

           it_outtab        = ta_alv

           it_fieldcatalog  = ta_fieldcat.


No I have some subroutine and I just need to have the same alv and field catalog but only with one change (see below) and I do this like this:



FORM my_subroutine


CREATE OBJECT rf_alv

       EXPORTING

         i_parent = rf_custom_container.

     "Feldkatalog aufbauen

     CLEAR st_fieldcat.

     st_fieldcat-fieldname = 'MATNR'.

     st_fieldcat-hotspot   = abap_true.

     st_fieldcat-outputlen   = 18.

     APPEND st_fieldcat TO ta_fieldcat.

     st_fieldcat-fieldname = 'MTEXT'.

     st_fieldcat-hotspot   = abap_true.

     st_fieldcat-outputlen   = 48.

     APPEND st_fieldcat TO ta_fieldcat.

     st_fieldcat-fieldname = 'KWMENG'.

     st_fieldcat-hotspot   = abap_false.

     st_fieldcat-edit      = abap_true.

     st_fieldcat-outputlen = 15.

     APPEND st_fieldcat TO ta_fieldcat.

     st_fieldcat-fieldname = 'VRKME'.

     st_fieldcat-hotspot   = abap_true.

     st_fieldcat-outputlen   = 3.

     APPEND st_fieldcat TO ta_fieldcat.

     st_layout-cwidth_opt = abap_true.

     "Ereignisbehandler

     CREATE OBJECT evt_handler.

     SET HANDLER evt_handler->handle_toolbar      FOR rf_alv.

     SET HANDLER evt_handler->handle_user_command FOR rf_alv.

     SET HANDLER evt_handler->handle_event_click  FOR rf_alv.

     CALL METHOD rf_alv->set_table_for_first_display

       EXPORTING

         i_structure_name = 'ZWH_RESERVIERUNG'

       CHANGING

         it_outtab        = ta_alv

         it_fieldcatalog  = ta_fieldcat.

     rf_alv->refresh_table_display( ).


But my fieldcatalog is even not showed....what do I wrong?


BR


Denis





rosenberg_eitan
Active Contributor
0 Kudos

Hi,

See program BCALV_EDIT_01 .

You can see that using display/change button is calling FORM switch_edit_mode.

This is done AFTER the ALV was presented to the user .

Regards.

rosenberg_eitan
Active Contributor
0 Kudos

Hi,


"but only with one change (see below) and I do this like this:

  st_fieldcat-fieldname = 'KWMENG'.

     st_fieldcat-hotspot   = abap_false.

     st_fieldcat-edit      = abap_true.

     st_fieldcat-outputlen = 15.

     APPEND st_fieldcat TO ta_fieldcat."

Assuming you want a column wise modification .

See this modify version of BCALV_EDIT_01 .

*---------------------------------------------------------------------*
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 g_grid
      EXPORTING
        i_parent = g_custom_container.

   DATA: it_fieldcatalog TYPE lvc_t_fcat .

    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name = 'SFLIGHT'
      CHANGING
        ct_fieldcat      = it_fieldcatalog.

    FIELD-SYMBOLS: <st_fieldcatalog> LIKE LINE OF it_fieldcatalog .

    LOOP AT it_fieldcatalog ASSIGNING <st_fieldcatalog> .

      CASE <st_fieldcatalog>-fieldname .
        WHEN 'SEATSOCC' .
          <st_fieldcatalog>-hotspot   = abap_false.
          <st_fieldcatalog>-edit      = abap_true.
      ENDCASE.

    ENDLOOP .

    SELECT * FROM sflight INTO TABLE gt_outtab UP TO g_max ROWS.

    CALL METHOD g_grid->set_table_for_first_display
      EXPORTING
        is_layout       = gs_layout
      CHANGING
       it_fieldcatalog = it_fieldcatalog
        it_outtab       = gt_outtab.

* This is to simulate a condition that is known at PBO
    DATA: condition TYPE abap_bool .

    IF condition EQ abap_false .

      CALL METHOD g_grid->set_ready_for_input
        EXPORTING
          i_ready_for_input = 0.

    ELSE .

      CALL METHOD g_grid->set_ready_for_input
        EXPORTING
          i_ready_for_input = 1.

    ENDIF.

  ENDIF .

ENDMODULE.                    "pbo OUTPUT

Regards.

0 Kudos

Hi, thank you for theresponse.

I tried following way:

WHEN 'MENGE'.


CALL METHOD rf_alv->get_frontend_fieldcatalog

         IMPORTING

           et_fieldcatalog = ta_fieldcat[].

       LOOP AT ta_fieldcat INTO st_fieldcat .

         IF st_fieldcat-fieldname = 'KWMENG' .

           st_fieldcat-hotspot   = abap_false.

           st_fieldcat-edit      = abap_true.

           MODIFY ta_fieldcat FROM st_fieldcat .

         ENDIF.

         IF st_fieldcat-fieldname = 'VRKME'.

           st_fieldcat-hotspot = abap_false.

           MODIFY ta_fieldcat FROM st_fieldcat.

         ENDIF .

       ENDLOOP .

       CALL METHOD rf_alv->set_frontend_fieldcatalog

         EXPORTING

           it_fieldcatalog = ta_fieldcat[].

       CALL METHOD rf_alv->get_frontend_layout

         IMPORTING

           es_layout = st_layout.

       st_layout-grid_title = 'Test DYU' .

       CALL METHOD rf_alv->set_frontend_layout

         EXPORTING

           is_layout = st_layout.

       "Sende gepufferten aut. queue zum Frontend

       CALL METHOD cl_gui_cfw=>flush.

       "Alv Grid aktualisieren

       rf_alv->refresh_table_display( ).

       "Erignisverteiler in Bezug auf ok_code

       CALL METHOD cl_gui_cfw=>dispatch.


And in Debugger everything looks very good (well the fields in ta_fieldcat)

have the rights values....but in the application the fields are bot hotspot anymore,

but still not editable....what I do wrong?


Thank you


Denis

rosenberg_eitan
Active Contributor
0 Kudos

Hi,

Also use:

gs_layout-no_rowins  = abap_true ."Block ctrl enter .

Regards.

fredericbasilius
Participant
0 Kudos

Hi,

You have to use the styles to achieve this. Please refer the solution by Alessandro or refer the following guide for achieving the same through styles.

http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/e8a1d690-0201-0010-b7ad-d9719a415...

Regards,

FB