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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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