10-15-2014 11:04 AM
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
10-15-2014 1:42 PM
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
10-15-2014 11:57 AM
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
10-15-2014 12:52 PM
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
10-15-2014 1:42 PM
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
10-18-2014 6:23 PM
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
10-19-2014 5:55 AM
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.
10-19-2014 6:45 AM
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.
10-23-2014 8:34 AM
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
10-19-2014 7:03 AM
Hi,
Also use:
gs_layout-no_rowins = abap_true ."Block ctrl enter .
Regards.
10-19-2014 7:15 AM
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.
Regards,
FB