среда, 13 ноября 2013 г.

Cоздать редактируемый checkbox в CL_SALV_TABLE.

ALV Object CL_SALV_TABLE не поддерживает редактируемых ячеек, редактируемых столбцов или строк. Но если нельзя, но очень надо, то можно...

report  z_test_lna.
класс для обработки действий пользователя
class lcl_handle_events definition deferred.
Объявляем объект типа cl_salv_table, который выведет наши данные в виде ALV
datagc_alv_table type ref to cl_salv_table.
datagc_columns   type ref to cl_salv_columns_table.
datagc_colwork   type ref to cl_salv_column_table.
Таблица с данными для вывода в ALV
databegin of gt_mkpf occurs 10,
checkbox,
mblnr 
type mkpf-mblnr,
mjahr 
type mkpf-mjahr,
vgart 
type mkpf-vgart,
blart 
type mkpf-blart,
blaum 
type mkpf-blaum,
bldat 
type mkpf-bldat,
budat 
type mkpf-budat,
cpudt 
type mkpf-cpudt,
cputm 
type mkpf-cputm,
aedat 
type mkpf-aedat,
usnam 
type mkpf-usnam,
tcode 
type mkpf-tcode,
frath 
type mkpf-frath,
      
end of gt_mkpf.
data wa_mkpf like line of gt_mkpf.
*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
class lcl_handle_events definition.
  
public section.
    
methods:
      on_link_click 
for event link_click of cl_salv_events_table
    
importing row column.
endclass.                    "lcl_handle_events DEFINITION
*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
class lcl_handle_events implementation.
  
method on_link_click.
* Тут весь секрет)
    
if row <> 0.
      
if column 'CHECKBOX'.
        
read table gt_mkpf into wa_mkpf index row.
        
if sy-subrc eq 0.
          
case wa_mkpf-checkbox.
            
when 'X'.
              
clear wa_mkpf-checkbox.
            
when others.
              wa_mkpf
-checkbox 'X'.
          
endcase.
        
endif.
        
modify gt_mkpf from wa_mkpf index row transporting checkbox.


        
gc_alv_table->refresh( ). "Нужно для обработки изменения в экране.
      
else.
        
break-point.
        gc_alv_table
->refresh( ). "Нужно для обработки изменения в экране.
      
endif.
    
else.

      
"...
    
endif.
  
endmethod.                    "on_single_click
endclass.                    "lcl_handle_events IMPLEMENTATION
datagr_events type ref to lcl_handle_events.
datagc_events type ref to cl_salv_events_table.
start-of-selection.
Выбираем данные
  
select into corresponding fields of table gt_mkpf from mkpf
    
where mblnr '10490000000'.
Статический метод класса для создания объекта и связывания с нашей таблицей
  cl_salv_table
=>factoryimporting r_salv_table gc_alv_table
                          
changing t_table gt_mkpf[] ).
Получим каталог полей таблицы
  gc_columns 
gc_alv_table->get_columns( ).
Получим поле по имени
  gc_colwork ?= gc_columns
->get_column'CHECKBOX' ).
Объявляем наш checkbox как checkbox-ссылка
  gc_colwork
->set_cell_typeif_salv_c_cell_type=>checkbox_hotspot ).
*Создание объекта обработки
  
create object gr_events.
Получить события для таблицы
  gc_events 
gc_alv_table->get_event( ).
    
set handler gr_events->on_link_click for gc_events.
Вывести ALV-таблицу на экран
  gc_alv_table
->display( ).

результат



Создание кнопки в меню селекционного экрана.

tablessscrfields.
selection-screenfunction key 1.
initialization.
  
call function 'ICON_CREATE'
    
exporting
      name                  
'ICON_PERSONAL_SETTINGS'
      
text                  'кнопка'
      info                  
' '
    
importing
      result                
sscrfields-functxt_01
    
exceptions
      icon_not_found        
1
      outputfield_too_short 
2
      
others                3.
at selection-screen.
  
case sscrfields-ucomm.
    
when 'FC01'.
      
message 'PUSH BUTTON' type 'I'.
  
endcase.

результат


или еще можно так:

datals_dyntxt type smp_dyntxt.
  
clear ls_dyntxt.
  ls_dyntxt
-icon_id icon_protocol.
  ls_dyntxt
-text =
  ls_dyntxt
-icon_text 'Журнал замеров'.
  sscrfields
-functxt_01 ls_dyntxt.

  
clear ls_dyntxt.
  ls_dyntxt
-icon_id icon_table_settings.
  ls_dyntxt
-text =
  ls_dyntxt
-icon_text 'Диапазон плотностей'.
  sscrfields
-functxt_02 ls_dyntxt.