понедельник, 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 + 1 "При каждом входе наращиваем значение, т.к. каждая последующая запись, в одной строке эксель формы, должна быть записана в новую ячейку
  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 1 to s_tbx. "Наращиваем счетчик по строкам
    
clear: column. "Сбрасываем счетчик по колонкам
    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      = lines( lt_outtab ) "количество строк
      columns   
= 6. "количество столбцов
Этими же значениями заполняем таблицу диапазона ran определенную ранее как soi_range_list
  rangei-name = 'table1'.
  rangei
-rows = lines( lt_outtab ).
  rangei
-columns = 6.
  
append rangei to ran.

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

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

Комментариев нет:

Отправить комментарий