SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Изменение fieldcatalog в 'REUSE_ALV_GRID_DISPLAY'



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
flex
Специалист
Специалист



Joined: 02 Feb 2011
Posts: 50

PostPosted: Tue Jul 24, 2012 2:56 pm    Post subject: Изменение fieldcatalog в 'REUSE_ALV_GRID_DISPLAY' Reply with quote

Всем привет!
Товарищи, никто не сталкивался с задачей изменять fieldcatalog динамически в программе?

Задача примерно такая:
Кнопку тыкнули - поля стали нередактируемыми.
Другу тыкнули - поля стали редактируемыми.

Кнопки у меня в USER_COMMAND прописаны соответственно.

Редактируемые поля проставляю через:
fieldcat-edit = 'X'.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Tue Jul 24, 2012 5:39 pm    Post subject: Reply with quote

Зачем менять 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
Back to top
View user's profile Send private message
flex
Специалист
Специалист



Joined: 02 Feb 2011
Posts: 50

PostPosted: Tue Jul 24, 2012 6:21 pm    Post subject: Reply with quote

alezhu wrote:
Зачем менять 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...
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Wed Jul 25, 2012 9:51 am    Post subject: Reply with quote

см. программу BCALV_GRID_EDIT.
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Wed Jul 25, 2012 9:58 am    Post subject: Reply with quote

Quote:
Мне нужно чтобы всего 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_**.
Back to top
View user's profile Send private message
flex
Специалист
Специалист



Joined: 02 Feb 2011
Posts: 50

PostPosted: Wed Jul 25, 2012 10:57 am    Post subject: Reply with quote

Спасибо большое!

Я извиняюсь, но это я что-то наколбасил и у меня не работало.

Вариант go_grid->is_ready_for_input( ) прекрасно работает и в моем случае с 'REUSE_ALV_GRID_DISPLAY' и формировании fcat заранее.

Тем не менее спасибо за разъяснение других приемов!

Удаву тоже спасибо за подсказку!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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.