четверг, 15 января 2015 г.

SAP диаграммы или по «научному» - презентационная графика SAP.

Интересный инструмент для наглядного представления значений, с большим количеством настроек отображения, как программно так и через меню.

Ниже представлен простой код, в котором достаточно легко будет разобраться.  

report ztest_graph.
databegin of wa_data,
      dataname
(15),
       value1 
type i,
       value2 
type i,
       value3 
type i,
       
end of wa_data,

       gt_data 
like standard table of wa_data.
databegin of wa_options,
      options
(20),
        
end of wa_options,

      gt_options 
like standard table of wa_options.
start-of-selection.
  wa_data-dataname 
'Чай'.
  wa_data-value1 
19.
  wa_data-value2 
29.
  wa_data-value3 
20.
  
append wa_data to gt_data.
  wa_data-dataname 
'Гречка'.
  wa_data-value1 
12.
  wa_data-value2 
16.
  wa_data-value3 
75.
  
append wa_data to gt_data.
  wa_data-dataname 
'Сахар'.
  wa_data-value1 
18.
  wa_data-value2 
22.
  wa_data-value3 
19.
  
append wa_data to gt_data.
  wa_data-dataname 
'Мука'.
  wa_data-value1 
22.
  wa_data-value2 
14.
  wa_data-value3 
33.
  
append wa_data to gt_data.

  wa_options
-options 'P3TYPE = TO'.
  wa_options
-options 'FIFRST = 2D'"закомментировав эту строкуили подставив
*                                      сюда вместо 2D -> 3D мы получим 3D график
  
append wa_options to gt_options.

  
call function 'GRAPH_MATRIX_3D'
    
exporting
      col1   
'Окт'
      col2   
'Ноя'
      col3   
'Дек'
      titl   
'График продаж 2014'
    
tables
      
data   gt_data         "данные для диаграмы
      opts   
gt_options      "настройки отображения
    
exceptions
      
others 1.

Результат:

пятница, 2 января 2015 г.

ALV Tree

Попытался как можно проще описать создание ALV Tree.
Для начала, нужно создать экран, например 0100. Поместить на экран «Спец. упр. элемент» т.е. контейнер и назвать его, например CONT. Далее зайти в логику экрана и активировать там модули PBO и PAI.
 Должно получится это:



Дальше нужно создать GUI-статус, с одной кнопкой назад и назвать его, например MAIN1.
Теперь все проще, копируйте текст программы к себе и активируйте. По коду есть комментарии, которые должны помочь сориентироваться.
report  ztest_tree.
datag_alv_tree         type ref to cl_gui_alv_tree,
      g_custom_container 
type ref to cl_gui_custom_container.
datagt_sflight type sflight occurs 0,      "Выходная таблица данных
      g_max      
type i value 255.
call screen '0100'.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
module status_0100 output.
  
set pf-status 'MAIN1'.
  
if g_alv_tree is initial.
    
perform init_tree.
  
endif.
endmodule.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  INIT_TREE
*&---------------------------------------------------------------------*
form init_tree .
* 1. Создаем ALV Tree Control.
создаем контейнерпомещаем в него ALV Tree
  
datal_tree_container_name(30type c.
  l_tree_container_name 
'CONT'.
  
create object g_custom_container
    
exporting
      container_name              
l_tree_container_name
    
exceptions
      cntl_error                  
1
      cntl_system_error           
2
      create_error                
3
      lifetime_error              
4
      lifetime_dynpro_dynpro_link 
5.
  
if sy-subrc <> 0.
    
message x208
(00with 'ERROR'(100).
  
endif.

  
create object g_alv_tree
    
exporting
      parent                      
g_custom_container
      node_selection_mode         
cl_gui_column_tree=>node_sel_mode_single
      item_selection              
'X'
      no_html_header              
'X'
      no_toolbar                  
''
    
exceptions
      cntl_error                  
1
      cntl_system_error           
2
      create_error                
3
      lifetime_error              
4
      illegal_node_selection_mode 
5
      failed                      
6
      illegal_column_name         
7.
  
if sy-subrc <> 0.
    
message x208(00with 'ERROR'.
  
endif.
* 2. Создаем заголовок иерархии
  
data l_hierarchy_header type treev_hhdr.
  
perform build_hierarchy_header changing l_hierarchy_header.
* 3. Создаем пустой Tree Control
  
call method g_alv_tree->set_table_for_first_display
    
exporting
      i_structure_name    
'SFLIGHT'
      is_hierarchy_header 
l_hierarchy_header
    
changing
      it_outtab           
gt_sflight"таблица должна быть пустая !
* 4. Создаем узлы и уровни (заполнение дерева происходит именно тут)
  
perform create_hierarchy.
* * 5. Отправим данные в alv-tree
  
call method g_alv_tree->frontend_update.
endform.                    " INIT_TREE
*&---------------------------------------------------------------------*
*&      Form  BUILD_HIERARCHY_HEADER
*&---------------------------------------------------------------------*
*       Заполняем свойства заголовка иерархии
*----------------------------------------------------------------------*
form build_hierarchy_header changing
                               p_hierarchy_header 
type treev_hhdr.

  p_hierarchy_header
-heading Список узлов'.
  p_hierarchy_header-t_image 
'@BV@'"иконка вверху списка узлов
  p_hierarchy_header
-tooltip 'Всплывающая подсказка'.
  p_hierarchy_header
-width   30.     "ширина списка узлов

endform.                    " BUILD_HIERARCHY_HEADER
*&---------------------------------------------------------------------*
*&      Form  CREATE_HIERARCHY
*&---------------------------------------------------------------------*
*       Создание узлов и иерархии
*----------------------------------------------------------------------*
form create_hierarchy .

  
datals_sflight type sflight,
        l2_sflight 
type sflight,
      lsum_sflight 
type sflight,
        lt_sflight 
type sflight occurs 0.

  
datap_relat_key type lvc_nkey,
        l_node_text 
type lvc_value,
         p_node_key 
type lvc_nkey
        
.

  
"Выбираем данные
  
select from sflight into table lt_sflight up to g_max rows.


  
"Выполняем сортировку по полю которое будет узлом/ключом
  
sort  lt_sflight by carrid.

  
loop at lt_sflight into ls_sflight.

    
on change of ls_sflight-carrid.

      
"Т.к. я планирую в заголовке узла так же выводить данные
      
"то для красоты буду выводить там суммы по carrid
      
"в принципе, это можно и не делать <<<
      
at new carrid.
        
sum.
        
move ls_sflight to lsum_sflight.
      
endat.
      
">>>

      
"выберем название узла
      
select single carrname
        
from scarr
        
into l_node_text
        
where
        carrid 
eq ls_sflight-carrid.

      
"создаем узел
      
call method g
_alv_tree->add_node
        
exporting
          i_relat_node_key 
p_relat_key
          i_relationship   
cl_gui_column_tree=>relat_last_child
          is_outtab_line   
lsum_sflight
          i_node_text      
l_node_text
        
importing
          e_new_node_key   
p_node_key.

      
"Выведем в данный узел значения <<<
      
loop at lt_sflight into l2_sflight where carrid eq ls_sflight-carrid.
        
l_node_text ls_sflight-carrid.

        
"создаем строку в узле.
        
"каждая такая строка может содержать свой раскрывающийся список
        
"т.е. быть еще и узлом. Это ж дерево:)

        
call method g_alv_tree->add_node
          
exporting
            i_relat_node_key 
p_node_key
            i_relationship   
cl_gui_column_tree=>relat_last_child
            is_outtab_line   
l2_sflight
            i_node_text      
l_node_text.

        
"<<< тут вложенность может быть продолжена >>>
      
endloop.

      
"Выведем в данный узел значения >>>
    
endon.
  
endloop.
endform.                    " CREATE_HIERARCHY
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
module user_command_0100 input.
  
case sy-ucomm.
    
when 'EXIT' or 'BACK' or 'CANC'.
      
call method g_custom_container->free.
      
leave program.
    
when others.
      
call method cl_gui_cfw=>dispatch.
  
endcase.
  
call method cl_gui_cfw=>flush.
endmodule.                 " USER_COMMAND_0100  INPUT

Результат: