Зачем менять FIELDCATALOG? Отлкючайте возможность правки целиком:
Code:
REPORT ztest_switch_alv_edit.
DATA go_grid TYPE REF TO cl_gui_alv_grid.
DATA gt_makt TYPE TABLE OF makt.
DATA ls_layout TYPE lvc_s_layo.
START-OF-SELECTION.
SELECT
*
FROM makt
INTO TABLE gt_makt
WHERE spras = sy-langu
.
ls_layout-edit = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'ZPF_STATUS_SET'
i_callback_user_command = 'ZUSER_COMMAND'
i_structure_name = 'MAKT'
is_layout_lvc = ls_layout
TABLES
t_outtab = gt_makt
EXCEPTIONS
program_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.
FORM zpf_status_set USING dummy.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = go_grid.
SET PF-STATUS 'TEST'.
ENDFORM. "zpf_status_set
FORM zuser_command USING iv_ucomm TYPE sy-ucomm dummy TYPE any.
CASE iv_ucomm.
WHEN 'SWITCH'.
IF go_grid->is_ready_for_input( ) IS INITIAL.
go_grid->set_ready_for_input( 1 ).
ELSE.
go_grid->set_ready_for_input( 0 ).
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFORM. "zuser_command
В статус добавлена кнопка с кодом SWITCH. По ее нажатию переключение.
Если все таки хотите через FIELDCATALOG - его также можно вытащить из GO_GRID через метод GET_FRONTEND_FIELDCATALOG и задать новый с помощью метода SET_FRONTEND_FIELDCATALOG
Зачем менять FIELDCATALOG?
Отлкючайте возможность правки целиком:
Спасибо!
Мне нужно чтобы всего 2 поля были редактируемыми, поэтому проставляю через fieldcatalog и вариант с правкой целиком не подходит (он имеет больший приоритет, чем филдкаталог).
Code:
go_grid->set_ready_for_input( 0 ).
Такой вариант для меня подходит при отключении полей, но вот в случае включения - set_ready_for_input( 1 ) - ничего не происходит...
alezhu wrote:
В статус добавлена кнопка с кодом SWITCH. По ее нажатию переключение.
Если все таки хотите через FIELDCATALOG - его также можно вытащить из GO_GRID через метод GET_FRONTEND_FIELDCATALOG и задать новый с помощью метода SET_FRONTEND_FIELDCATALOG
Читал про эти 2 метода, но я так понимаю они работают с филдкаталогом типа LVC_T_FCAT, а в моем случае это slis_t_fieldcat_alv...
Мне нужно чтобы всего 2 поля были редактируемыми, поэтому проставляю через fieldcatalog
В таком случае можно сделать чуть по другому:
Code:
REPORT ztest_switch_alv_edit.
DATA go_grid TYPE REF TO cl_gui_alv_grid.
DATA gt_makt TYPE TABLE OF makt.
DATA ls_layout TYPE lvc_s_layo.
DATA gt_fcat TYPE lvc_t_fcat.
FIELD-SYMBOLS:
<s_fcat> TYPE lvc_s_fcat.
START-OF-SELECTION.
SELECT
*
FROM makt
INTO TABLE gt_makt
WHERE spras = sy-langu
.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'MAKT'
CHANGING
ct_fieldcat = gt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT gt_fcat assigning <s_fcat>.
CASE <s_fcat>-fieldname.
WHEN 'MAKTX'.
<s_fcat>-edit = 'X'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ls_layout-edit_mode = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'ZPF_STATUS_SET'
i_callback_user_command = 'ZUSER_COMMAND'
* i_structure_name = 'MAKT'
is_layout_lvc = ls_layout
IT_FIELDCAT_LVC = gt_fcat
TABLES
t_outtab = gt_makt
EXCEPTIONS
program_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.
FORM zpf_status_set USING dummy.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = go_grid.
SET PF-STATUS 'TEST'.
ENDFORM. "zpf_status_set
FORM zuser_command USING iv_ucomm TYPE sy-ucomm dummy TYPE any.
CASE iv_ucomm.
WHEN 'SWITCH'.
IF go_grid->is_ready_for_input( ) IS INITIAL.
go_grid->set_ready_for_input( 1 ).
ELSE.
go_grid->set_ready_for_input( 0 ).
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFORM. "zuser_command
Отличие в предварительном получении FCAT и прописывании нужным полям EDIT. Также в layout вместо EDIT устанавливается EDIT_MODE - Вы сможете править свои открытые поля, но не сможете добавлять/удалять/дублировать строки. Если Вам нужно это, то нужно ставить EDIT и запрещать правку уже отдельных полей на уровне каждой строки через доп. поле типа LVC_T_STYL.
Это логичное поведение - если брать мой пример с правкой MAKT, то при редактировании существующих записей ключ трогать нельзя - он должен оставаться нередактируемым, но при добавлении новых записей его тоже надо задать как-то изначально - значит должен быть редактируемым. Поэтому нельзя задать EDIT на уровне столбца в FCAT, потому что в зависимости от того, новая запись или нет, поле в столбце может быть как закрыто, так и открыто.
Quote:
Читал про эти 2 метода, но я так понимаю они работают с филдкаталогом типа LVC_T_FCAT, а в моем случае это slis_t_fieldcat_alv
"Внутре" SLIS использует тот же CL_GUI_ALV_GRID. Соответственно, при вызове REUSE_ALV_GRID_DISPLAY (а не REUSE_ALV_GRID_DISPLAY_LVC) просто происходит преобразование вашего типа FCAT в нативный для класса тип LVC_T_FCAT.
В Вашем случае, если вариант выше все-таки почему-то не подходит, Вы можете все так же вызывать REUSE_ALV_GRID_DISPLAY, передавая туда slis_t_fieldcat_alv, а когда работаете с переключением получать через GET_** уже LVC_T_FCAT, ставить edit нужным полям, и записывать обратно SET_**.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.