Текущее время: Ср, июн 18 2025, 01:54

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ФМ для выгрузки отчетов в Excel (SMW0 + Visual Basic)
СообщениеДобавлено: Чт, апр 17 2008, 06:12 
Специалист
Специалист

Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
Это писано потому что:
- для себя
- я знаю 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.


Последний раз редактировалось zIk Ср, июн 18 2008, 10:01, всего редактировалось 31 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 13:58 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 12:45
Сообщения: 164
Откуда: Свердловская обл., г. Екатеринбург
Пол: Мужской
А в чем собственно отличие, от того что предложил нам Parazit ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:01 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, июн 23 2007, 14:56
Сообщения: 203
Цитата:
А в чем собственно отличие, от того что предложил нам Parazit ?

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:11 
Специалист
Специалист

Зарегистрирован:
Вт, май 22 2007, 08:26
Сообщения: 123
Откуда: S-Pb
У parazit-a есть возможность в шаблон переменные вне таблицы передавать - оформлять шапку и подвал отчета, к примеру.
Тут, как я понимаю, только таблица забивается?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:13 
Специалист
Специалист

Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
El Mario написал:
А в чем собственно отличие, от того что предложил нам Parazit ?
здесь SAPу - ABAP, Excelю - VB.
Здесь вы делаете только то что надо вам, Parazit, я подозреваю, делает все что может понадобится для тех, кто хочет работать только с ABAP.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:16 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
zIk написал:
здесь SAPу - ABAP, Excelю - VB.
Здесь вы делаете только то что надо вам, Parazit, я подозреваю, делает все что может понадобится для тех, кто хочет работать только с ABAP.
Нет. У Parazit'а тоже SAPу - ABAP, Excelю - VB.
Главное отличие: по большей части у Parazit'а разделены форма и содержание.
Т.е. и консультант, и юзер могут подправить формуляр, имея только тривиальные знания о Word'e и Excel'е.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:22 
Специалист
Специалист

Зарегистрирован:
Вт, май 22 2007, 08:26
Сообщения: 123
Откуда: S-Pb
sibrin написал:
Т.е. и консультант, и юзер могут подправить формуляр, имея только тривиальные знания о Word'e и Excel'е.


Как-то я долго и вдумчиво читала эту фразу, пытаясь понять глубокий смысл..
Наверное надо опробовать новую методику, чтобы самой "почувствовать разницу" :)

Автор, скажите, какие-то требования к созданию excel-шаблона есть?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:33 
Специалист
Специалист

Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
Silence написал(а):
У parazit-a есть возможность в шаблон переменные вне таблицы передавать - оформлять шапку и подвал отчета, к примеру.
Тут, как я понимаю, только таблица забивается?
в примере забивается таблица

но вот шапка
Code:
wa_vba = '      ActiveSheet.Cells(1, 1).Value = "Шапка"'. append wa_vba to it_vba.

а вот подвал
Code:
wa_vba = '      ActiveSheet.Cells(10, 1).Value = "Подвал"'. append wa_vba to it_vba.



в отчетах делал динамическое количество строк и столбцов, динамические тексты, цвета, рамки. все ограничивается возможностями VB - то есть никак не ограничивается


Последний раз редактировалось zIk Чт, апр 17 2008, 14:35, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 14:34 
Специалист
Специалист

Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
Silence написал(а):
Автор, скажите, какие-то требования к созданию excel-шаблона есть?
никаких


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 16:08 
Специалист
Специалист

Зарегистрирован:
Вт, май 22 2007, 08:26
Сообщения: 123
Откуда: S-Pb
у меня вылетает в дамп похоже в вызове:

Code:
call function 'DOWNLOAD_WEB_OBJECT'
    exporting
      key         = w_key
      destination = wa_path_xls
    importing
      rc          = wa_rc.
  check wa_rc = 0.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 16:10 
Специалист
Специалист

Зарегистрирован:
Вт, май 22 2007, 08:26
Сообщения: 123
Откуда: S-Pb
и еще в 4.6С пришлось вместо:

Code:
* выгрузка
  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.


сделать:
Code:
  call method cl_gui_frontend_services=>get_sapgui_directory
    changing
      SAPGUI_DIRECTORY  = wa_sapworkdir
    exceptions
      cntl_error            = 1
      others                = 5.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 16:45 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
nymbos написал(а):
Цитата:
А в чем собственно отличие, от того что предложил нам Parazit ?

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

Насколько я понял, макросы то используются. Просто у меня он один универсальный (для оптимизации), а в формах можно свои макросы вставлять. А у zIk-а каждый раз генерится макрос для кокретной формы.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, апр 17 2008, 16:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
zIk написал:
El Mario написал:
А в чем собственно отличие, от того что предложил нам Parazit ?
здесь SAPу - ABAP, Excelю - VB.
Здесь вы делаете только то что надо вам, Parazit, я подозреваю, делает все что может понадобится для тех, кто хочет работать только с ABAP.

Я постарался сделать так, чтобы не нужно было особо знать ни то ни другое. :)

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, апр 18 2008, 05:15 
Специалист
Специалист

Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
Silence написал(а):
у меня вылетает в дамп похоже в вызове:

Code:
call function 'DOWNLOAD_WEB_OBJECT'
    exporting
      key         = w_key
      destination = wa_path_xls
    importing
      rc          = wa_rc.
  check wa_rc = 0.
вопрос решился?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, апр 18 2008, 07:57 
Специалист
Специалист

Зарегистрирован:
Вт, май 22 2007, 08:26
Сообщения: 123
Откуда: S-Pb
zIk написал:
вопрос решился?

Не, я ночью спала :)
Сейчас начну тестить дальше
Вы что-то писали про пространство имен, может в этом дело?


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB