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

Нередактируемые строки.


Goto page 1, 2  Next
 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Thu Jul 12, 2012 2:09 pm    Post subject: Нередактируемые строки. Reply with quote

Всем привет.

Помогите, как сделать нередактируемые строки в АЛВ ГРИД, в динамической таблице? Разумеется по условию. А также оставить редактируемые строки в этой же таблице.
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 46
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Thu Jul 12, 2012 11:39 pm    Post subject: Reply with quote

"An Easy Reference for ALV Grid Control" в google, далее к пункту "Making ALV Grid Editable" PDF-документа.
_________________
ABAP/4 You
Back to top
View user's profile Send private message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Mon Jul 16, 2012 12:55 pm    Post subject: Reply with quote

Я что-то не понял! Sad

Мне надо сделать нередактируемые строки в динамической таблице. Можно примерчик написать.
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


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

PostPosted: Mon Jul 16, 2012 1:55 pm    Post subject: Reply with quote

Насколько я помню, в динамической таблице нельзя задавать поля с типом "Таблица".
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Mon Jul 16, 2012 4:46 pm    Post subject: Reply with quote

Пример. В строках материалы, в столбцах заводы. И то, и то динамическое. На пересечении - максимальный запас материала на заводе.

Поле материал - нередактируемое. Ячейки с запасом != 0 - нередактируемые.
Чтобы строку сделать нередактируемой Вам нужно все ее поля сделать нередактируемыми - то есть в строке в таблицу STYLE занести MC_STYLE_DISABLED для каждого поля.

Code:
REPORT  ztest_dyn_table_alv.
TYPE-POOLS abap.

TYPES:
  BEGIN OF ts_alv,
    matnr TYPE matnr,
    werks TYPE mabst,
    style TYPE lvc_t_styl,
  END OF ts_alv,

  tt_alv TYPE TABLE OF ts_alv.


DATA gs_alv TYPE ts_alv.
DATA gtp_alv TYPE REF TO data.
DATA gt_marc TYPE SORTED TABLE OF marc WITH UNIQUE KEY matnr werks.
DATA gt_werks TYPE TABLE OF werks_d.
DATA gt_fcat TYPE lvc_t_fcat.
DATA gs_fcat TYPE lvc_s_fcat.
DATA gs_style TYPE lvc_s_styl.
DATA go_struct TYPE REF TO cl_abap_structdescr.
DATA go_table TYPE REF TO cl_abap_tabledescr.
DATA gt_components TYPE cl_abap_structdescr=>component_table.
DATA gs_component TYPE abap_componentdescr.
DATA gv_werks TYPE werks_d.
DATA gv_index TYPE i.
DATA gs_layout TYPE lvc_s_layo.

FIELD-SYMBOLS:
  <s_alv> TYPE ANY,
  <s_marc> TYPE marc,
  <v_mabst> TYPE mabst,
  <t_alv> TYPE STANDARD TABLE.


SELECT
  matnr
  werks
  mabst
  FROM marc
*  UP TO 200 ROWS
  INTO CORRESPONDING FIELDS OF TABLE gt_marc
.

LOOP AT gt_marc ASSIGNING <s_marc>.
  APPEND <s_marc>-werks TO gt_werks.
ENDLOOP.

SORT gt_werks.
DELETE ADJACENT DUPLICATES FROM gt_werks.

go_struct ?= cl_abap_structdescr=>describe_by_data( gs_alv ).
gt_components = go_struct->get_components( ).

READ TABLE gt_components INTO gs_component WITH KEY
  name = 'WERKS'
.
IF sy-subrc = 0.
  gv_index = sy-tabix.
  DELETE gt_components INDEX sy-tabix.
ENDIF.

CLEAR gs_fcat.
gs_fcat-fieldname = 'MATNR'.
gs_fcat-coltext = 'Материал'.
APPEND gs_fcat TO gt_fcat.

LOOP AT gt_werks INTO gv_werks.
  CONCATENATE 'WERKS' gv_werks INTO gs_component-name SEPARATED BY '_'.
  INSERT gs_component INTO gt_components INDEX gv_index.
  ADD 1 TO gv_index.

  gs_fcat-fieldname = gs_component-name.
  gs_fcat-coltext = gv_werks.
  APPEND gs_fcat TO gt_fcat.
ENDLOOP.

CLEAR gs_fcat.
gs_fcat-fieldname = 'STYLE'.
gs_fcat-tech = 'X'.
APPEND gs_fcat TO gt_fcat.


go_struct ?= cl_abap_structdescr=>create( gt_components ).
go_table ?= cl_abap_tabledescr=>create( go_struct ).

CREATE DATA gtp_alv TYPE HANDLE go_table.
ASSIGN gtp_alv->* TO <t_alv>.

LOOP AT gt_marc ASSIGNING <s_marc>.
  AT NEW   matnr.
    CLEAR gs_alv.
    APPEND INITIAL LINE TO <t_alv> ASSIGNING <s_alv>.
  ENDAT.

  CONCATENATE 'WERKS' <s_marc>-werks INTO gs_component-name
    SEPARATED BY '_'.
  ASSIGN COMPONENT gs_component-name  OF STRUCTURE <s_alv> TO <v_mabst>.
  IF sy-subrc = 0.
    <v_mabst> = <s_marc>-mabst.
  ENDIF.

  IF <s_marc>-mabst IS NOT INITIAL.
    gs_style-fieldname = gs_component-name.
    gs_style-style = cl_gui_alv_grid=>mc_style_disabled.
    INSERT gs_style INTO TABLE gs_alv-style.
  ENDIF.

  AT END OF matnr.
    gs_alv-matnr = <s_marc>-matnr.
    gs_style-fieldname = 'MATNR'.
    gs_style-style = cl_gui_alv_grid=>mc_style_disabled.
    INSERT gs_style INTO TABLE gs_alv-style.
    MOVE-CORRESPONDING gs_alv TO <s_alv>.
  ENDAT.

ENDLOOP.

gs_layout-stylefname = 'STYLE'.
gs_layout-edit = 'X'.
gs_layout-cwidth_opt = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
 EXPORTING
   is_layout_lvc                     = gs_layout
   it_fieldcat_lvc                   = gt_fcat
  TABLES
    t_outtab                          = <t_alv>
 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.
Back to top
View user's profile Send private message
Удав
Гуру
Гуру


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

PostPosted: Tue Jul 17, 2012 10:22 am    Post subject: Reply with quote

Удав wrote:
Насколько я помню, в динамической таблице нельзя задавать поля с типом "Таблица".

В 6.0 заработало Rolling Eyes

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Tue Jul 17, 2012 3:24 pm    Post subject: Reply with quote

Спасибо, за пример.

Его я переделал, для себя, сейчас он делает нередактируемую строку.

Но у меня проблема не в этом. Конкретно в этом примере делается нередактируемой строка, так что каждый её столбец делается нередактируемый, через их названия (названия столбцов).

У меня же есть динамическая таблица (dyn_table) и структура(dyn_wa), так же есть чекбоксик <fs_otklonenie>. В dyn_table неизвестно количество столбцов, количество строк, название столбцов и содержание самих ячеек. Поэтому мне надо как-то сделать нередактируемую строку, лишь по какому-то условию (я проверяю условие по чекбоксику <fs_otklonenie>), в зависимости от него я окрашиваю (делаю нередактируемой) строку.

Если чем-то поможет, то названия столбцов в дин.таблице заносятся с помощью ссылочного объекта.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Tue Jul 17, 2012 5:41 pm    Post subject: Reply with quote

Если dyn_table приходит уже динамическая и Вы не знаете ее структуру в момент выполнения:
1. Создайте объект-описатель для таблицы типа CL_ABAP_TABLEDESCR с помощью статического метода этого класса DESCRIBE_BY_DATA, передав ему в качестве параметра как раз свою таблицу
2. Из объекта-описателя таблицы, полученного выше, с помощью его метода GET_TABLE_LINE_TYPE получите объект-описатель для строки таблицы типа CL_ABAP_STRUCTDESCR.
3. C помощью метода GET_COMPONENTS объекта-описателя строки получите таблицу полей в строке. Поле name - имя поля в исходной динамической таблице. Это позволит построить FIeldCatalog и заполнить STYLE
4. Если в исходной таблице нет поля для STYLE (типа LVC_T_STYL), добавьте его к списку полей, полученному через GET_COMPONENTS, создайте новую структуру на основе этих полей, на основе структуры новую таблицу и скопируйте в нее оригинальную, дополнительно добавив в таблицу STYLE каждой строки записи для закрытия полей от редактирования. Если поле STYLE изначально было, то только закрыть поля.
Back to top
View user's profile Send private message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Wed Jul 18, 2012 12:22 pm    Post subject: Reply with quote

alezhu wrote:
Если dyn_table приходит уже динамическая и Вы не знаете ее структуру в момент выполнения:
1. Создайте объект-описатель для таблицы типа CL_ABAP_TABLEDESCR с помощью статического метода этого класса DESCRIBE_BY_DATA, передав ему в качестве параметра как раз свою таблицу
2. Из объекта-описателя таблицы, полученного выше, с помощью его метода GET_TABLE_LINE_TYPE получите объект-описатель для строки таблицы типа CL_ABAP_STRUCTDESCR.
3. C помощью метода GET_COMPONENTS объекта-описателя строки получите таблицу полей в строке. Поле name - имя поля в исходной динамической таблице. Это позволит построить FIeldCatalog и заполнить STYLE
4. Если в исходной таблице нет поля для STYLE (типа LVC_T_STYL), добавьте его к списку полей, полученному через GET_COMPONENTS, создайте новую структуру на основе этих полей, на основе структуры новую таблицу и скопируйте в нее оригинальную, дополнительно добавив в таблицу STYLE каждой строки записи для закрытия полей от редактирования. Если поле STYLE изначально было, то только закрыть поля.




DATA: otkl_tab TYPE REF TO cl_abap_tabledescr,
otkl_struc TYPE REF TO cl_abap_structdescr,
it_components TYPE abap_component_tab.

otkl_tab ?= cl_abap_typedescr=>describe_by_data( <dyn_table> ).
otkl_struc ?= otkl_tab->get_table_line_type( ).
it_components = otkl_struc->components.

Что-то типа этого?




При таком подходе у меня возникает ошибка:
Тип "OTKL_STRUC->COMPONENTS" не может быть преобразован в тип "IT_COMPONENTS"

Sad
Back to top
View user's profile Send private message
lakschmi
Участник
Участник



Joined: 12 Nov 2010
Posts: 11

PostPosted: Wed Jul 18, 2012 3:05 pm    Post subject: Reply with quote

а если попробовать it_components TYPE ABAP_COMPDESCR_TAB ?
Back to top
View user's profile Send private message
lakschmi
Участник
Участник



Joined: 12 Nov 2010
Posts: 11

PostPosted: Wed Jul 18, 2012 3:22 pm    Post subject: Reply with quote

если хотите получить abap_component_tab то get_components( )
Back to top
View user's profile Send private message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Wed Jul 18, 2012 3:55 pm    Post subject: Reply with quote

DATA: otkl_tab TYPE REF TO cl_abap_tabledescr,
otkl_struc TYPE REF TO cl_abap_structdescr,
it_components TYPE ABAP_COMPDESCR_TAB.

otkl_tab ?= cl_abap_typedescr=>describe_by_data( <dyn_table> ).
otkl_struc ?= otkl_tab->get_table_line_type( ).
it_components = otkl_struc->components.



вот так заработало, спасибо.

Буду пробовать делать нередактируемые строки.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Wed Jul 18, 2012 4:21 pm    Post subject: Reply with quote

it_components TYPE ABAP_COMPDESCR_TAB Вам не нужен. Потому что если Вы собрались строить новую структуру с добавленным полем, то метод cl_ABAP_STRUCTDESCR=>CREATE принимает на вход именно abap_component_tab.

Вместо атрибута otkl_struc->components используйте метод otkl_struc->get_components( )


Last edited by alezhu on Thu Jul 19, 2012 9:08 am; edited 1 time in total
Back to top
View user's profile Send private message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Thu Jul 19, 2012 8:02 am    Post subject: Reply with quote

DATA: otkl_tab TYPE REF TO cl_abap_tabledescr,
otkl_struc TYPE REF TO cl_abap_structdescr,
it_components TYPE abap_component_tab.

otkl_tab ?= cl_abap_typedescr=>describe_by_data( <dyn_table> ).
otkl_struc ?= otkl_tab->get_table_line_type( ).
it_components = otkl_struc->get_components.


Теперь у меня в таблице it_components есть столбец NAME, а в нём все поля которые нужно покрасить (сделать нередактируемыми) в другой таблице. Так же в этой таблице, в столбце NAME есть поле STYLE, которое нужно для покраски.

Спасибо, за помощь.
Дальше буду пытаться закрасить ячейки, а потом уж и строки.
Back to top
View user's profile Send private message
SAPBeginner
Участник
Участник



Joined: 03 Jul 2012
Posts: 29

PostPosted: Fri Jul 20, 2012 8:40 am    Post subject: Reply with quote

Всем большое спасибо, за помощь. С покраской строк долго мучился, но всё-таки получилось. Покрасил строки. Smile


Закрывайте тему.
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
Goto page 1, 2  Next
Page 1 of 2

 
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.