Это писано
потому что:
- для себя
- я знаю VB
- на VB можно сделать ЛЮБОЕ форматирование в Excel
- я знаю ABAP
- я знаю, что OLE тормозит
- я не люблю OLE в ABAP
- я не люблю встроенные макросы в шаблонах
- я люблю когда все просто (вызов одного ФМ, необязательно специальный шаблон)
- быстрее способа выводить и форматировать инфу в Excel я не знаю
спасибо Parazit-y за его
разработку - я познакомился с SMW0.
Чтобы это заработало у Вас -
достаточно:
- создать ФМ "ZSMW0_OPEN_XLS",
- создать ФМ "ZPROGRESS" (я люблю когда пользователю видно на каком этапе процесс выполнения),
- загружать шаблоны через тр. SMW0.
моя система написал(а):
SAP_BASIS 620
SAP_ABA 620
SAP_APPL 470
SAP_HR 470
ABA_PLUS 100
...
в 4.6С нет
cl_gui_frontend_services=>get_sapgui_workdir - чем заменяется я не знаю.
Дима написал:
итак, для 4.6С (мой уровень ABAP-обновления 54):
метод
cl_gui_frontend_services=>get_sapgui_workdirнужно заменить на:
Code:
CALL METHOD cl_gui_frontend_services=>get_sapgui_directory
CHANGING
sapgui_directory = wa_sapworkdir
EXCEPTIONS
CNTL_ERROR = 1
others = 2.
после секции
удаление прошлых выгрузок отчета добавить строку:
Code:
CALL METHOD cl_gui_cfw=>flush.
Ну и напоследок несколько советов по сохранению шаблона в Excel2007:
1) шаблон нужно сохранять с типом xlsm (т.е. с поддержкой макросов)
2) убедитесь, что не установлена защита книги
3) сам шаблон в SMW0 нужно сохранять в двоичном формате
Примеры отчетов (скриншоты):

таблица с группами данных

данные за разные периоды в одной таблице
Модель отчета я делю на части, оформляю их в xls-шаблоне (цвет, рамка, стиль,...), именую и в последствии в программе обращаюсь к ним по имени - в дальнейшем, редактировать оформление могут непрограммисты.
Из VB
использую:
* установка значения в именованной ячейке
Code:
concatenate 'Range("sh2").Value = "' wa_str '"' into wa_vba. append wa_vba to it_vba.
* копирование шаблонных-именных частей
Code:
* ШАПКА ***********************************************************
wa_vba = 'Application.Goto Reference:="sh_fin"'. append wa_vba to it_vba.
wa_vba = 'Selection.Copy'. append wa_vba to it_vba.
wa_vba = 'Cells(wa_nrow, wa_ncol).Select'. append wa_vba to it_vba.
wa_vba = 'ActiveSheet.Paste'. append wa_vba to it_vba.
* копирование-вставка строк (именованная ячейка "cur" при этом сдвигается вниз. то есть, чтобы добавить несколько строк - надо выполнить один и тот же код несколько раз)
Code:
wa_vba = 'Cells(wa_nrow_t, wa_ncol_t).EntireRow.Select'. append wa_vba to it_vba.
wa_vba = 'Selection.Copy'. append wa_vba to it_vba.
wa_vba = 'Range("cur").EntireRow.Insert'. append wa_vba to it_vba.
* установка формул (незабыть: формулы надо
по-английски + разделители в формулах иногда
не совпадают с разделителями в формулах листа + длина строки формулы
не больше 1024)
Code:
concatenate '=SUMIF(R[-' wa_str ']C5:R[-1]C5,""ХС"",R[-' wa_str ']C:R[-1]C)'
into wa_str.
concatenate 'Cells(wa_nrow , ' wa_i_str ').FormulaR1C1 = "' wa_str '"'
into wa_vba. append wa_vba to it_vba.
* разбиение длинных строк
Code:
wa_vba = 'wa_str = "=IF((" & wa_itogo_pp_st & ")=0,0,(" & wa_itogo_pf_st & ")"'. append wa_vba to it_vba.
wa_vba = 'wa_str = wa_str & "/(" & wa_itogo_pp_st & ")*100)"'. append wa_vba to it_vba.
wa_vba = 'Cells(wa_nrow , wa_ncol).FormulaR1C1 = wa_str'. append wa_vba to it_vba.
* объединение ячеек
Code:
wa_vba = 'Range(Cells(wa_nrow, wa_ncol_b),Cells(wa_nrow, wa_ncol + 1)).Select'. append wa_vba to it_vba.
wa_vba = 'Selection.Merge'. append wa_vba to it_vba.
* использую переменные внутри VB
Code:
" запоминаем высоту левой таблицы
wa_vba = 'wa_nrow_h = Selection.CurrentRegion.Rows.Count'. append wa_vba to it_vba.
* в конце формирования отчетов очищаю область шаблонов-заготовок
Code:
wa_vba = 'Range("service_st","service_end").EntireRow.Delete'. append wa_vba to it_vba.
* была задача "формирование и сохранение/печать огромного количества актов ОС-1".
Сделал так: выгрузка шаблонов актов (через фм ZSMW0_GET_FILE - урезанный ZSMW0_OPEN_XLS), выгрузка (через ZSMW0_OPEN_XLS) исп. флаг
i_background управляющего xls с макросом заполнения шаблонов актов + кнопка старта макроса. То есть пользователь видит xls с одной кнопкой - "Старт". Нажав на нее - макрос генерит акты и печатает их.
Code:
concatenate 'Workbooks.Open Filename:="' wa_path_xls_os1 '"' into wa_vba. append wa_vba to it_vba.
wa_vba = 'Application.DisplayAlerts = False'. append wa_vba to it_vba.
Тестовая программа - открывает шаблон (ZEXCELTEST.XLS - имя объекта в SMW0, а не имя файла который туда загрузили) и заполняет область таблицы 10*20 текстом 'Hi!':
Code:
report zexceltest.
data
: it_vba type standard table of string
, wa_vba type string
.
wa_vba = 'Dim i As Integer, j As Integer'. append wa_vba to it_vba.
wa_vba = 'Dim sMsg As String'. append wa_vba to it_vba.
wa_vba = 'For i = 1 To 20'. append wa_vba to it_vba.
wa_vba = ' For j = 1 To 10'. append wa_vba to it_vba.
**wa_vba = ' sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"'. append wa_vba to it_vba.
wa_vba = ' sMsg = "Hi!"'. append wa_vba to it_vba.
wa_vba = ' ActiveSheet.Cells(i, j).Value = sMsg'. append wa_vba to it_vba.
wa_vba = ' Next j'. append wa_vba to it_vba.
wa_vba = 'Next i'. append wa_vba to it_vba.
call function 'ZSMW0_OPEN_XLS'
exporting
wa_fid = 'ZEXCELTEST.XLS'
tables
it_vba = it_vba
exceptions
sapworkdir_not_found = 1
excel_init_error = 2
excel_open_error = 3
others = 4
.
* ФМ
zsmw0_open_xls для формирования отчета на основе EXCEL-шаблона
* модуль загружает шаблон на локальный ПК
* и выполняет VB-скрипт из IT_VBA_TOP и IT_VBA
Code:
function zsmw0_open_xls.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(WA_FID) LIKE WWWDATATAB-OBJID
*" REFERENCE(WA_DEBUG_VBA) TYPE C DEFAULT ''
*" REFERENCE(TOTALSTEP) TYPE I DEFAULT 2
*" REFERENCE(I_BACKGROUND) TYPE C DEFAULT ''
*" TABLES
*" IT_VBA_TOP TYPE STANDARD TABLE OPTIONAL
*" IT_VBA TYPE STANDARD TABLE OPTIONAL
*" CHANGING
*" REFERENCE(CURSTEP) TYPE I DEFAULT 0
*" EXCEPTIONS
*" SAPWORKDIR_NOT_FOUND
*" EXCEL_INIT_ERROR
*" EXCEL_OPEN_ERROR
*"----------------------------------------------------------------------
* ФМ для формирования отчета на основе EXCEL-шаблона
* модуль загружает шаблон на локальный ПК
* и выполняет VB-скрипт из IT_VBA_TOP и IT_VBA
*"----------------------------------------------------------------------
*" параметры ФМ:
*" WA_FID
*" - ID шаблона в SMW0
*"
*" WA_DEBUG_VBA (необязательный параметр)
*" - в VB будет вставлена ошибочная строка Range(1 , 1).Value = ""
*" выполнение VB остановится в отладчике на этой строке,
*" ее надо закоментировать и можно отлаживать средствами VB
*"
*" IT_VBA_TOP (необязательный параметр)
*" - объявление глобальных переменных
*"
*" IT_VBA (необязательный параметр)
*" - VB-скрипт для преобразования шаблона в отчет
*"
*" ZPROGRESS - вывод в статусе сообщения о текущем этапе процесса
*"
*" CURSTEP (необязательный параметр)
*" - текущий шаг
*" для вывода в статусе текущего шага формирования отчета
*"
*" TOTALSTEP (необязательный параметр)
*" - сколько всего шагов
*" для вывода в статусе текущего шага формирования документа
*"
*" I_BACKGROUND (необязательный парметр)
*" - загрузить шаблон, НЕ выполнять макрос (в конец макроса
*" выполнения добавляется вывод окошка об успешном окончании)
*"
* шаблоны грузить тр. SMW0
* пример: ZEXCELTEST
*"----------------------------------------------------------------------
include ole2incl.
define progress. " для индикации в статусе этапа выполнения
call function 'ZPROGRESS'
exporting
totalcnt = &2
txt = &3
changing
curcnt = &1.
end-of-definition.
data
: wa_sapworkdir type string
, wa_filter type string
, it_file type standard table of file_info
, wa_file type file_info
, wa_file_name type string
, wa_file_cnt type i
, wa_path_xls type rlgrap-filename
, w_key type wwwdatatab
, xlapplication type ole2_object
, xlworkbook type ole2_object
, xlsheet type ole2_object
, xlvbe type ole2_object
, xlactivevbproject type ole2_object
, xlvbcomponents type ole2_object
, xlremove type ole2_object
, xlrun type ole2_object
, wa_rc type i
, it_vba_res type standard table of string
, wa_vba_res type string
, begin of wa_module
, it_vba_res type standard table of string
, wa_path_bas_s type string
, wa_path_bas type rlgrap-filename
, xlimport type ole2_object
, end of wa_module
, it_module like standard table of wa_module
, wa_10 type i
, wa_sub_cnt type i
, wa_500 type i
, wa_save_pos type i
, wa_i_str type string
, wa_vba type string
.
**********************************************************************
* разбивка BAS (Visual Basic script) на модули -
* в Excel существует [b]ограничение[/b] на размер подпрограмм
* + существует [b]ограничение[/b] на размер загружаемого модуля с макросами
* wa_10 - количество процедур в файле-модуле
* wa_500 - количество строк в процедуре
progress curstep totalstep 'Разбивка VBA на модули'.
it_vba_res[] = it_vba_top[].
" Sub s0() - процедура пустышка для проверки возможности запуска макросов
wa_vba_res = 'Sub s0()'. append wa_vba_res to it_vba_res.
wa_sub_cnt = 0.
wa_i_str = wa_sub_cnt. condense wa_i_str.
wa_10 = 0.
wa_500 = 0.
loop at it_vba into wa_vba.
if wa_500 = 0.
concatenate 'End Sub ''' wa_i_str into wa_vba_res. append wa_vba_res to it_vba_res.
add 1 to wa_sub_cnt.
wa_i_str = wa_sub_cnt. condense wa_i_str.
wa_vba_res = ''. append wa_vba_res to it_vba_res.
wa_vba_res = ''. append wa_vba_res to it_vba_res.
wa_vba_res = ''. append wa_vba_res to it_vba_res.
if wa_10 = 0.
clear wa_module.
wa_module-it_vba_res[] = it_vba_res[].
append wa_module to it_module.
refresh it_vba_res.
wa_10 = 10. " количество процедур в одном файле-модуле
endif.
concatenate 'Sub s' wa_i_str '()' into wa_vba_res. append wa_vba_res to it_vba_res.
wa_500 = 500. " количество строк в процедуре
subtract 1 from wa_10.
endif.
append wa_vba to it_vba_res.
subtract 1 from wa_500.
endloop.
concatenate 'End Sub ''' wa_i_str into wa_vba_res. append wa_vba_res to it_vba_res.
wa_vba_res = 'Sub DoVBA()'. append wa_vba_res to it_vba_res.
if wa_debug_vba = 'X'.
wa_vba_res = 'Application.Visible = True'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Range(1 , 1).Value = ""'. append wa_vba_res to it_vba_res.
else.
wa_vba_res = 'Application.ScreenUpdating = False'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Application.Calculation = xlCalculationManual'. append wa_vba_res to it_vba_res.
endif.
wa_vba_res = 'Dim wa_xlSelection as range'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Set wa_xlSelection = Application.Selection'. append wa_vba_res to it_vba_res.
wa_vba_res = 'wa_xlAddress = wa_xlSelection.Address'. append wa_vba_res to it_vba_res.
do wa_sub_cnt times.
wa_i_str = sy-index. condense wa_i_str.
concatenate 'Call s' wa_i_str into wa_vba_res. append wa_vba_res to it_vba_res.
enddo.
wa_vba_res = 'Application.CutCopyMode = False'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Range(wa_xlAddress).Select'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Application.Calculation = xlCalculationAutomatic'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Application.ScreenUpdating = True'. append wa_vba_res to it_vba_res.
if i_background = 'X'.
wa_vba_res = 'tmp = MsgBox("Программа выполнена успешно и будет закрыта", vbOKOnly, "Действия выполнены")'. append wa_vba_res to it_vba_res.
wa_vba_res = 'Application.Quit'. append wa_vba_res to it_vba_res.
endif.
wa_vba_res = 'Application.Visible = True'. append wa_vba_res to it_vba_res.
wa_vba_res = 'End Sub'. append wa_vba_res to it_vba_res.
clear wa_module.
wa_module-it_vba_res[] = it_vba_res[].
append wa_module to it_module.
**********************************************************************
* выгрузка
call method cl_gui_frontend_services=>get_sapgui_workdir
changing
sapworkdir = wa_sapworkdir
exceptions
get_sapworkdir_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
others = 5.
if sy-subrc <> 0.
raise sapworkdir_not_found.
endif.
**http://sapboard.ru/forum/viewtopic.php?t=4880&start=360
**DFH
**Если у вас в программе используется пространство имён вида /NAME1/NAME2 и
**соответственно шаблоны также загружены в данном пространстве имён с обратными слэшами,
**то при формировании имени временного файла c использованием W_KEY-OBJID в MACROSFLNAME
**уходит недопустимое для Windows имя файла. Соответственно импорт завершается с ошибкой.
**
**Поможет некритичная замена в форме DOWNLOADMACROS. Например:
**
*** CONCATENATE W_KEY-OBJID '_' SY-TIMLO EXT INTO MACROSFLNAME.
**CONCATENATE 'ZWWW_MACROS' '_' SY-TIMLO EXT INTO MACROSFLNAME.
concatenate wa_sapworkdir '\~form_' wa_fid '_' sy-datum '_' sy-uzeit '.xls' into wa_path_xls.
* удаление прошлых выгрузок отчета
concatenate '~form_' wa_fid '_*' into wa_filter.
call method cl_gui_frontend_services=>directory_list_files
exporting
directory = wa_sapworkdir
filter = wa_filter " старые SAP GUI не отрабатывают фильтры, можно закоментить
files_only = 'X'
changing
file_table = it_file
count = wa_file_cnt
exceptions
cntl_error = 1
directory_list_files_failed = 2
wrong_parameter = 3
error_no_gui = 4
not_supported_by_gui = 5
others = 6.
if sy-subrc = 0.
loop at it_file into wa_file.
if wa_file-filename cp wa_filter and sy-fdpos = 0. " старые SAP GUI не отрабатывают фильтры
concatenate wa_sapworkdir '\' wa_file-filename into wa_file_name. " хотя в некоторых SAP GUI работало и через '/'
call method cl_gui_frontend_services=>file_delete
exporting
filename = wa_file_name
changing
rc = wa_rc
exceptions
access_denied = 1.
endif.
endloop.
endif.
**********************************************************************
* выгрузка .xls
w_key-relid = 'MI'.
w_key-objid = wa_fid.
call function 'DOWNLOAD_WEB_OBJECT'
exporting
key = w_key
destination = wa_path_xls
importing
rc = wa_rc.
check wa_rc = 0.
**********************************************************************
* выгрузка сценария в файлы .bas
loop at it_module into wa_module.
wa_save_pos = sy-tabix.
wa_module-wa_path_bas_s = sy-tabix. condense wa_module-wa_path_bas_s.
concatenate wa_path_xls '.' wa_module-wa_path_bas_s '.bas' into wa_module-wa_path_bas_s.
call method cl_gui_frontend_services=>gui_download
exporting
filename = wa_module-wa_path_bas_s
changing
data_tab = wa_module-it_vba_res.
wa_module-wa_path_bas = wa_module-wa_path_bas_s.
modify it_module from wa_module index wa_save_pos.
endloop.
**********************************************************************
* OLE
create object xlapplication 'excel.application'.
call method of xlapplication 'Workbooks' = xlworkbook.
if sy-subrc ne 0. raise excel_init_error. endif.
call method of xlworkbook 'Open'
exporting #1 = wa_path_xls.
if sy-subrc ne 0. raise excel_init_error. endif.
call method of xlapplication 'Worksheets' = xlsheet
exporting #1 = 1.
if sy-subrc ne 0. raise excel_init_error. endif.
* импорт файла в Excel
call method of xlapplication 'VBE' = xlvbe.
call method of xlvbe 'ActiveVBProject' = xlactivevbproject.
call method of xlactivevbproject 'VBComponents' = xlvbcomponents.
loop at it_module into wa_module.
wa_save_pos = sy-tabix.
call method of xlvbcomponents 'Import' = wa_module-xlimport
exporting #1 = wa_module-wa_path_bas.
modify it_module from wa_module index wa_save_pos.
call method cl_gui_frontend_services=>file_delete
exporting
filename = wa_module-wa_path_bas_s
changing
rc = wa_rc
exceptions
access_denied = 1.
endloop.
" проверка на возможность запуска макросов
" запуск макроса-пустышки 's0', а не сразу 'Dovba',
" потому что, если в макросе есть 'ActiveWorkbook.Close', то sy-subrc <> 0 тоже
call method of xlapplication 'Run' = xlrun
exporting #1 = 's0'.
if sy-subrc ne 0.
call function 'POPUP_TO_INFORM'
exporting
titel = 'Ошибка создания отчета'
txt1 = 'Необходимо сделать следующее:'
txt2 = '1) открыть Excel - Меню - Сервис - Макрос - Безопасность - '
txt3 = 'Надежные издатели - Доверять доступ к Visual Basic Project (поставить галочку)'
txt4 = '2) закрыть Excel и заново сформировать отчет'.
else.
if i_background <> 'X'.
progress curstep totalstep 'Формирование отчета в Excel'.
call method of xlapplication 'Run' = xlrun
exporting #1 = 'Dovba'.
endif.
endif.
if i_background <> 'X'.
loop at it_module into wa_module.
call method of xlvbcomponents 'Remove' = xlremove
exporting #1 = wa_module-xlimport.
free object wa_module-xlimport.
endloop.
endif.
set property of xlapplication 'DisplayAlerts' = 0.
if sy-subrc ne 0. raise excel_open_error. endif.
call method of xlapplication 'Save'.
if sy-subrc ne 0. raise excel_open_error. endif.
set property of xlapplication 'Visible' = 1.
if sy-subrc ne 0. raise excel_open_error. endif.
free object xlapplication. " надо очищать - иначе Excel даже после закрытия висит в процессах
free object xlworkbook.
free object xlsheet.
free object xlvbe.
free object xlactivevbproject.
free object xlvbcomponents.
free object xlremove.
free object xlrun.
endfunction.
Индикация
в статусе этапа выполнения (
Пример: 1 из 10 Инициализация)
Code:
function zprogress.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(TOTALCNT) TYPE I
*" REFERENCE(TXT) TYPE STRING
*" CHANGING
*" REFERENCE(CURCNT) TYPE I
*"----------------------------------------------------------------------
data percentage type i.
data tmp_txt1 type string.
data tmp_txt2 type string.
data text like sy-ucomm.
check sy-batch = ''.
percentage = ( curcnt * 100 ) div totalcnt.
tmp_txt1 = curcnt.
shift tmp_txt1 left deleting leading space.
tmp_txt2 = totalcnt.
shift tmp_txt2 left deleting leading space.
concatenate tmp_txt1 'из' tmp_txt2 txt into text separated by space.
curcnt = curcnt + 1.
if percentage = 0. percentage = 1. endif.
call function 'SAPGUI_PROGRESS_INDICATOR'
exporting
percentage = percentage
text = text.
endfunction.
* ФМ
zsmw0_get_file(урезанный zsmw0_open_xls) для выгрузки шаблона на локальный ПК
Code:
function zsmw0_get_file.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(WA_FID) LIKE WWWDATATAB-OBJID
*" EXPORTING
*" REFERENCE(WA_FNAME) TYPE STRING
*" EXCEPTIONS
*" SAPWORKDIR_NOT_FOUND
*" ERROR_DOWNLOAD_WEB_OBJECT
*"----------------------------------------------------------------------
* ФМ для выгрузки шаблона на локальный ПК
*"----------------------------------------------------------------------
*" параметры ФМ:
*" WA_FID
*" - ID шаблона в SMW0
*"
*" WA_FNAME
*" - полный путь до выгруженного файла
*"
* шаблоны грузить тр. SMW0
data
: wa_sapworkdir type string
, wa_path_file type rlgrap-filename
, wa_filter type string
, it_file type standard table of file_info
, wa_file type file_info
, wa_file_name type string
, wa_file_cnt type i
, wa_rc type i
, w_key type wwwdatatab
.
**********************************************************************
* выгрузка
call method cl_gui_frontend_services=>get_sapgui_workdir
changing
sapworkdir = wa_sapworkdir
exceptions
get_sapworkdir_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
others = 5.
if sy-subrc <> 0.
raise sapworkdir_not_found.
endif.
**http://sapboard.ru/forum/viewtopic.php?t=4880&start=360
**DFH
**Если у вас в программе используется пространство имён вида /NAME1/NAME2 и
**соответственно шаблоны также загружены в данном пространстве имён с обратными слэшами,
**то при формировании имени временного файла c использованием W_KEY-OBJID в MACROSFLNAME
**уходит недопустимое для Windows имя файла. Соответственно импорт завершается с ошибкой.
**
**Поможет некритичная замена в форме DOWNLOADMACROS. Например:
**
*** CONCATENATE W_KEY-OBJID '_' SY-TIMLO EXT INTO MACROSFLNAME.
**CONCATENATE 'ZWWW_MACROS' '_' SY-TIMLO EXT INTO MACROSFLNAME.
concatenate wa_sapworkdir '\~form_' wa_fid '_' sy-datum '_' sy-uzeit '.xls' into wa_path_file.
* удаление прошлых выгрузок отчета
concatenate '~form_' wa_fid '_*' into wa_filter.
call method cl_gui_frontend_services=>directory_list_files
exporting
directory = wa_sapworkdir
filter = wa_filter " старые SAP GUI не отрабатывают фильтры, можно закоментить
files_only = 'X'
changing
file_table = it_file
count = wa_file_cnt
exceptions
cntl_error = 1
directory_list_files_failed = 2
wrong_parameter = 3
error_no_gui = 4
not_supported_by_gui = 5
others = 6.
if sy-subrc = 0.
loop at it_file into wa_file.
if wa_file-filename cp wa_filter and sy-fdpos = 0. " старые SAP GUI не отрабатывают фильтры
concatenate wa_sapworkdir '\' wa_file-filename into wa_file_name.
call method cl_gui_frontend_services=>file_delete
exporting
filename = wa_file_name
changing
rc = wa_rc
exceptions
access_denied = 1.
endif.
endloop.
endif.
**********************************************************************
* выгрузка .xls
w_key-relid = 'MI'.
w_key-objid = wa_fid.
call function 'DOWNLOAD_WEB_OBJECT'
exporting
key = w_key
destination = wa_path_file
importing
rc = wa_rc.
if wa_rc <> 0.
raise error_download_web_object.
endif.
wa_fname = wa_path_file.
endfunction.