среда, 15 июля 2015 г.

Доступ к системе SAP из MS Excel и вызов RFC ФМ с помощью VBA

Предполагается, что в системе SAP уже существует RFC ФМ, посредством которого необходимо получить определенные данные в MS Excel.
Ниже приведен VBA код, с помощью которого будет выполнено подключение к системе и вывод полученных данных. Для простоты понимания я не стал усложнять код дополнительными проверками и различными удобствами.

Dim fsap_obj As Object
Dim gr_func  As Object
Dim gp_impr  As Object
Dim gp_expr  As Object
Dim gp_tabl  As Object

Sub run_rfc_fm()

'создаем объект для подключения к системе
Set fsap_obj = CreateObject("SAP.Functions")    
      fsap_obj.Connection.Password = ""
      fsap_obj.Connection.system = ""
      fsap_obj.Connection.user = ""

'возвращает True при подключении к системе и False если подключение не удалось
Connect = fsap_obj.Connection.logon(0, False)    

'имя RFC ФМ
Set gr_func = fsap_obj.Add("ZWEB_SERVICE_TEST")   

'параметр импорта в ФМ       
Set gp_expr = gr_func.exports("I_VBELN") 

'параметр экспорта в ФМ                         
Set gp_impr = gr_func.imports("E_COMMENT")

'возвращаемая таблица данных из ФМ                 
Set gp_tabl = gr_func.tables("T_VBAP")                                

'передаем значение в I_VBELN
gp_expr.Value = "0000004969"                                               

'вызов ФМ
Call gr_func.Call     
  
'отключение от системы                                                                    
fsap_obj.Connection.logoff                                                      

'вывод полученных данных
Call write_tab                                                                             

End Sub

Public Function write_tab()
For Row = 1 To gp_tabl.RowCount

 num_p = 0
 Do While num_p < gp_tabl.columnCount
   num_p = num_p + 1
   Лист1.Cells(Row, num_p).Value = gp_tabl.cell(Row, num_p)
 Loop
 Next
Лист1.Cells(Row + 1, 1).Value = gp_impr
End Function






понедельник, 16 февраля 2015 г.

Два способа получить структуру внутренней таблицы.

Способ №1, используя класс CL_ABAP_TYPEDESCR.
typesbegin of typ_itab,
           a 
type c,
           b 
type i,
           
c type p length decimals 2,
          
end of typ_itab.
datalt_out_n type table of typ_itab,"таблица структуру которой нужно будет получить

      l_tabledescr_ref 
type ref to cl_abap_tabledescr,
      l_descr_ref      
type ref to cl_abap_structdescr,
      wa_table 
type abap_compdescr.

l_tabledescr_ref ?= cl_abap_typedescr
=>describe_by_datalt_out_n ).
l_descr_ref ?= l_tabledescr_ref
->get_table_line_type( ).
write'CL_ABAP_TYPEDESCR' color col_positive.
loop at l_descr_ref->components into wa_table .
  
writewa_table-name,
           wa_table-type_kind
,
           wa_table
-length,
           wa_table
-decimals.
endloop.
Это собственно все. Быстро, удобно, красиво, но работает только с  внутренними таблицами без заголовка, для таблиц с заголовком смотрим способ №2.

Способ №2, используя ФМ GET_COMPONENT_LIST.
databegin of lt_out_h occurs 0"таблица структуру которой нужно будет получить
         s1 
type c,
         s2 
type c,
         s3 
type p length decimals 2,
        
end of lt_out_h,

lt_components 
like standard table of rstrucinfo,
wa_components 
like line of lt_components.
call function 'GET_COMPONENT_LIST'
  
exporting
    
program    sy-cprog
    fieldname  
'LT_OUT_H'
  
tables
    components 
lt_components.
write'GET_COMPONENT_LIST' color col_positive.
loop at lt_components into wa_components.
  
writewa_components-compname,
           wa_components
-level,
           wa_components-leng
,
           wa_components
-type,
           wa_components-olen
,
           wa_components-decs
.
endloop.
 Достоинство этого способа это то, что мы может получить структуру внутренней таблицы находящейся не только в нашей программе, но и в любой другой. Для этого нужно в параметр program передать название программы, в которой находится интересующая нас таблица.
Минус данного способа, он работает только с таблицами с заголовками. Для работы с таблицами без заголовка смотрим способ №1.

четверг, 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.

Результат: