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

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

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

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

report ztest_graph.
data: begin 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.
data: begin 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.
data: g_alv_tree         type ref to cl_gui_alv_tree,
      g_custom_container 
type ref to cl_gui_custom_container.
data: gt_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
  
data: l_tree_container_name(30) type 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
(00) with '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(00) with '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 .

  
data: ls_sflight type sflight,
        l2_sflight 
type sflight,
      lsum_sflight 
type sflight,
        lt_sflight 
type sflight occurs 0.

  
data: p_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

Результат: