понедельник, 29 июля 2013 г.

Выгрузка в Excel через BDS (Business Document Service)

Еще один способ выгрузки, со своими плюсами и минусами, подробно описано тут:
работа с сервисом бизнес-документов http://abaphr.ru/bds_oaor/
работа с шаблонами бизнес-документов из ABAP http://abaphr.ru/bds_aba/
Я только дополню более подробно сам момент, выгрузки внутренней таблицы в эксель форму.
Предположим, что все, что описано в контексте этой статьи, сделано, создан бизнес-документ, выбран тот документ, который нам нужен, выполнено его открытие, выполнена инициализация интерфейса. Остается лишь перенести внутреннюю таблицу в эксель.
В первую очередь, в шаблоне эксель, необходимо, присвоить имя диапазону ячеек, для дальнейшей работы с ним. Диапазон будет расширяться динамический, в зависимости от количества выводимых столбцов и значений, но начинаться будет всегда на той строке, где он стоит изначально. На рисунке область диапазона выделена серым цветом, и ей присвоено имя «table1».

















 Далее, я создаю подпрограмму в блоке инициализация интерфейса.

if not has is initial.
    call method document->get_spreadsheet_interface
      
importing
        sheet_interface 
handle.
    
perform fill_exl_tab using lt_outtab.
endif.

lt_outtab эта наша внутренняя таблицаданные которой необходимо перенести в excel.
Создаю простейший макрос для заполнения таблицы сont, тип которой определен ранее как soi_generic_table.
define fill_cont.
  
clear wa_cont.
"тут интуитивно все понятно, но все же пропишу
  &2 = &2 + "При каждом входе наращиваем значение, т.к. каждая последующая запись, в одной строке эксель формы, должна быть записана в новую ячейку
  wa_cont-row    = &1"Строка в эксель форме   
  wa_cont-column = &2"Колонка в эксель форме  
 
 wa_cont-value  = &3"Значение в ячейкев эксель форме
  
append wa_cont to cont.
end-of-definition.
Далее, в подпрограмме fill_exl_tab, запускаем цикл по выходной таблице, используя созданный макрос.
  loop at lt_outtab into wa_ottab.
    add to s_tbx. "Наращиваем счетчик по строкам
    
clearcolumn"Сбрасываем счетчик по колонкам
    fill_cont:
            s_tbx column  wa_ottab-zplanz    
,
            s_tbx column  wa_ottab-gjahr     
,
            s_tbx column  wa_ottab-zfact     
,
            s_tbx column  wa_ottab-zdatadem  
,
            s_tbx column  wa_ottab-diam      
,
            s_tbx column  wa_ottab
-wall      .
  endloop.
Далее, меняем диапазон в зависимости от количества записей в выгружаемой таблице.
  call method handle->change_range
    
exporting
      rangename 
'table1'  "имя диапазона в эксель форме
      
rows      lineslt_outtab "количество строк
      columns   
6"количество столбцов
Этими же значениями заполняем таблицу диапазона ran определенную ранее как soi_range_list
  rangei-name 'table1'.
  rangei
-rows lineslt_outtab ).
  rangei
-columns 6.
  
append rangei to ran.

Переносим данные в ексель форму.
  call method handle->set_ranges_data
    
exporting
      
ranges   ran
      contents 
cont.

И еще один момент. Если делать выгрузку без запуска основного отчета, то можно заметить, не вооруженным глазом, что после того как выгрузятся данные, excel-файл закрывается. Что бы этого не произошло, необходимо следом за выгрузкой вывести какое-либо информационное окно.

среда, 17 июля 2013 г.

Выгрузка в Excel через текстовые файлы.

    Данный вид выгрузки не плохо подойдет, если необходимо выгрузить таблицу огромных размеров. Например, выгрузка пятидесяти тысяч записей в excel проходит за полторы минуты. В принципе данная выгрузка достаточно проста в использовании, имеет шаблонный вид, что очень удобно. Я использую ее по умолчанию, для всех своих разработок, главное что бы были полномочия на транзакцию SMW0, и разрешения на сохранение документа на компьютер пользователя. Данный код можно выделить в отдельный ФМ или подпрограмму, для более удобного использования.

*&---------------------------------------------------------------------*
*& Report  Z_UNLOAD_EXCEL
*& Выгрузка в EXCEL ч/з текстовые файлы
*&---------------------------------------------------------------------*
report  z_unload_excel.
include ole2incl.
datalv_file type rlgrap-filename,
      formname 
type wwwdatatab-objid value 'ZMS_EXL3'"имя объекта SMW0
      filename 
type rlgrap-filename,
      filenametxt 
type rlgrap-filename.
"<<< Таблица для примера
datagt_sflight like sflight occurs 0.
select from sflight into table gt_sflight.
">>> Таблица для примера
Запрашиваем имя файла
perform get_file_name changing lv_file.
check not lv_file is initial.
Выгружаем шаблон
perform download_template using formname lv_file.
Выгружаем таблицу в текстовый файл
perform download_file using formname gt_sflight changing filenametxt.
Запускаем макрос
perform run_macros using filenametxt lv_file.
*&---------------------------------------------------------------------*
*&      Form  run_macros
*&---------------------------------------------------------------------*
form run_macros using p_filenametxt type rlgrap-filename
                         p_filename 
type rlgrap-filename.

  
dataapplication type ole2_object,
        workbooks   
type ole2_object.

  
create object application 'EXCEL.APPLICATION'.
  
if sy-subrc <> 0
      message e011(zst).  
  endif.
  
get property of application 'Workbooks' workbooks.
Открываем макрос
  
call method of
      workbooks
      
'Open'

    
exporting
      #1        
p_filename.
  
free object workbooks.
Запускаем макросуказывая имя файла с данными
  
call method of
      application
      
'Run'
передоваемые параметры до 12 шт.
    
exporting
      #1          
'StartExecute'
      #2          
p_filenametxt
*     #3          = p_3
*     #4          = p_4
*     #5          = p_5
*     #6          = p_6
*     #7          = p_7
*     #8          = p_8
*     #9          = p_9
*     #10         = p_10
*     #11         = p_11
*     #12         = p_12
    
.
  
free object application.
Удаляем макрос с клиента
  
call function 'WS_FILE_DELETE'
    
exporting
      file 
p_filenametxt.
endform.                    "run_macros
*&---------------------------------------------------------------------*
*&      Form  download_file
*&---------------------------------------------------------------------*
form download_file using p_formname type wwwdatatab-objid
                           fp_table 
type standard table
             
changing p_filenametxt type rlgrap-filename.

  
datatempdir type rlgrap-filename.

  
call function 'GUI_GET_DESKTOP_INFO'
    
exporting
      
type   4
    
changing
      
return tempdir.

  
concatenate tempdir '\' p_formname '-' sy-timlo '.txt' into p_filenametxt.

  
call function 'WS_DOWNLOAD'
    
exporting
      filename 
p_filenametxt
      filetype 
'DAT'
    
tables
      data_tab 
fp_table
    
exceptions
      
others   9.
  
check sy-subrc ne 0.
  
set country ''.
Удаляем фаил-txt с клиента
  
call function 'GUI_DELETE_FILE'
    
exporting
      file_name 
p_filenametxt.
  
message e129(sywith p_filenametxt 'WS_DOWNLOAD'.
endform.                    "f_ws_download
*&---------------------------------------------------------------------*
*&      Form  download_template
*&---------------------------------------------------------------------*
form download_template using p_formname type wwwdatatab-objid
                             p_filename 
type rlgrap-filename.
  
dataext(255),
        sy_subrc 
type sy-subrc,
        w_key    
type wwwdatatab.


  
call function 'WWWPARAMS_READ'
    
exporting
      relid  
'MI'
      objid  
p_formname
      name   
'fileextension'
    
importing
      
value  ext
    
exceptions
      
others 1.
  
if sy-subrc <> 0.
    
message e000(swwwwith p_formname.
    
stop.
  
endif.

  w_key
-relid 'MI'.
  w_key
-objid p_formname.
  
call function 'DOWNLOAD_WEB_OBJECT'
    
exporting
      
key         w_key
      destination 
p_filename
    
importing
      rc          
sy_subrc.
endform.                    " DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*&      Form  get_file_name
*&---------------------------------------------------------------------*
form get_file_name changing cv_file type rlgrap-filename.
  
datalv_fullpath type string,
        lv_path     
type string,
        lv_file     
type string,
        lv_return   
type i.


  
do.
    
clear cv_file.
    
call method cl_gui_frontend_services=>file_save_dialog
      
exporting
        default_extension 
'xls'
        default_file_name 
lv_file
        file_filter       
cl_gui_frontend_services=>filetype_excel
        initial_directory 
lv_path
      
changing
        filename          
lv_file
        path              
lv_path
        fullpath          
lv_fullpath
        user_action       
lv_return
      
exceptions
        
others            4.
    
if sy-subrc <> or lv_return <> 0exitendif.
    cv_file 
lv_fullpath.
    
if cv_file lv_fullpathexitendif.
    
message 'Полное имя файла должно быть не более 128 символов!' type 'S' display like 'E'.
  
enddo.
endform.                    "get_file_name



    Далее, нужно создать шаблон excel-файла, в котором будет запускаться макрос. Макрос будет подгружать данные из текстового файла. Там же можно создать макрос который будет запускать форматирование полученных данных в excel.
    Создайте excel-файл. Откройте его и нажмите ALT+F11. Слева в окне Project Explorer нажмите правую кнопку мыши и выберите insert -> module. В открывшемся окне вставьте текст:

Sub StartExecute(ByVal fp_FileTab As String)
    Open_File Application.ThisWorkbook, fp_FileTab, 1, "A1"
    Application.DisplayAlerts = False
 
    Range("A1").Select
    ActiveWorkbook.Save
    Application.Visible = True
End Sub

'--------------'
' открытие файла '
'--------------'
Private Sub Open_File(ByVal f_wb As Workbook, _
                          ByVal f_FileName1 As String, _
                          ByVal f_Idx As Integer, _
                          ByVal f_Range As String)
    Dim wb As Workbook
 
    Workbooks.OpenText Filename:=f_FileName1, Origin:=xlWindows, DataType:=xlDelimited, _
                                 other:=True, otherchar:="|", Tab:=True
    Set wb = Application.ActiveWorkbook
    wb.ActiveSheet.UsedRange.Copy (f_wb.Sheets(f_Idx).Range(f_Range))
    wb.Close
End Sub

Все шаблон готов, сохраняем и закрываем его. Шаблон excel-файла сохраняем ч/з транзакцию SMW0. Имя объекта для SMW0 выбирайте сами, это не принципиально, в моем случае это ZMS_EXL3. Выгрузка готова, можно пользоваться.