SAPфорум.RU
https://sapboard.ru/forum/

OLE не удаляется процесс Excel
https://sapboard.ru/forum/viewtopic.php?f=13&t=96261
Страница 1 из 1

Автор:  Galych [ Чт, апр 05 2018, 17:38 ]
Заголовок сообщения:  OLE не удаляется процесс Excel

Коллеги, добрый вечер.

У меня имеется excel файл с двумя вкладками. Мне нужно сохранить данные этих вкладок в текстовые файлы.
Ниже указан код, который выполняет необходимые условия. Но после выполнения процесс Excel не "убивается", а остается висеть в диспетчере задач.
Не могу понять в чем причина. Помогите, пожалуйста!!!

Code:
DATA:
  ls_application      TYPE ole2_object,
  ls_workbooks        TYPE ole2_object,
  ls_active_workbook  TYPE ole2_object,
  ls_active_workbook2 TYPE ole2_object,
  ls_sheet            TYPE ole2_object,
  lv_filename_1       TYPE string,
  lv_filename_2       TYPE string.

START-OF-SELECTION.

  lv_filename_1 = |C:\\TEMP\\TAB_1{ sy-datum }{ sy-uzeit }.TXT|.
  lv_filename_2 = |C:\\TEMP\\TAB_2{ sy-datum }{ sy-uzeit }.TXT|.

  CREATE OBJECT ls_application 'Excel.Application'.
  SET PROPERTY OF ls_application 'DisplayAlerts' = 0.
  SET PROPERTY OF ls_application 'ScreenUpdating' = 0.
  SET PROPERTY OF ls_application 'Visible' = 0.

  CALL METHOD OF ls_application 'Workbooks' = ls_workbooks.
  CALL METHOD OF ls_workbooks 'Open' EXPORTING #1 = 'C:\TEMP\1800000045.XLSX'.
  CALL FUNCTION 'FLUSH'.

*** сохранение 1 вкладки
  CALL METHOD OF ls_application 'ActiveWorkbook' = ls_active_workbook.
  CALL METHOD OF ls_active_workbook 'Worksheets' = ls_sheet EXPORTING #1 = 1.
  CALL METHOD OF ls_sheet 'Copy'.
  CALL METHOD OF ls_application 'ActiveWorkbook' = ls_active_workbook2.

  CALL METHOD OF ls_active_workbook2 'SaveAs'
    EXPORTING
      #1 = lv_filename_1
      #2 = 42. " xlUnicodeText

  CALL METHOD OF ls_active_workbook2 'Close' EXPORTING #1 = 0.
  CALL FUNCTION 'FLUSH'.

  FREE OBJECT ls_active_workbook.
  FREE OBJECT ls_active_workbook2.
  FREE OBJECT ls_sheet.

*** сохранение 2 вкладки
  CALL METHOD OF ls_application 'ActiveWorkbook' = ls_active_workbook.
  CALL METHOD OF ls_active_workbook 'Worksheets' = ls_sheet EXPORTING #1 = 2.
  CALL METHOD OF ls_sheet 'Copy'.
  CALL METHOD OF ls_application 'ActiveWorkbook' = ls_active_workbook2.

  CALL METHOD OF ls_active_workbook2 'SaveAs'
    EXPORTING
      #1 = lv_filename_2
      #2 = 42. " xlUnicodeText

  CALL METHOD OF ls_active_workbook2 'Close' EXPORTING #1 = 0.

  " закрываем excel
*  CALL METHOD OF ls_active_workbook 'Close' EXPORTING #1 = 0.
  CALL METHOD OF ls_application 'Quit'.
  CALL FUNCTION 'FLUSH'.

  " освобождаем память
  FREE OBJECT ls_active_workbook2.
  FREE OBJECT ls_sheet.
  FREE OBJECT ls_active_workbook.
  FREE OBJECT ls_workbooks.
  FREE OBJECT ls_application.
  CALL FUNCTION 'FLUSH'.

Автор:  Parazit [ Чт, апр 05 2018, 19:02 ]
Заголовок сообщения:  Re: OLE не удаляется процесс Excel

Насколько помню, это из-за QUIT. Т.е. приложение само-убивается, а ссылки на него где-то подвисают в SAP GUI. Поэтому ссылки максимально надо чистить до QUIT.

Автор:  Galych [ Пт, апр 06 2018, 09:54 ]
Заголовок сообщения:  Re: OLE не удаляется процесс Excel

Сделал перед выходом Quit очистку ссылок. Не помогло.
Code:
  FREE OBJECT ls_active_workbook2.
  FREE OBJECT ls_sheet.
  FREE OBJECT ls_active_workbook.
  FREE OBJECT ls_workbooks.
  CALL FUNCTION 'FLUSH'.

  " закрываем excel
  CALL METHOD OF ls_application 'Quit'.
  CALL FUNCTION 'FLUSH'.

  " освобождаем память
  FREE OBJECT ls_application.
  CALL FUNCTION 'FLUSH'.

Эта проблема возникает с Excel 2013. С версией excel 2010 работает без проблем, т.е. после работы процесс Excel "убивается".
Причем если закомментировать сохранение, то процесс excel после работы удаляется.
Code:
  CALL METHOD OF ls_active_workbook2 'SaveAs'
    EXPORTING
      #1 = lv_filename_1
      #2 = 42. " xlUnicodeText
  CALL FUNCTION 'FLUSH'.


Думаю обновить у себя SAP GUI. Сейчас у меня стоит 7.40 с патч уровнем 15.

Автор:  UKY [ Пт, апр 13 2018, 10:18 ]
Заголовок сообщения:  Re: OLE не удаляется процесс Excel

Посмотрите код метода cl_rsdd_xls_factory=>free( ). Там много всего подчищается.

Автор:  ghost [ Пт, апр 13 2018, 11:45 ]
Заголовок сообщения:  Re: OLE не удаляется процесс Excel

я в таких случаях использую возможности трассировки на стороне GUI.
SAPGUI Automation Trace
Единственное надо указать чтобы трассировка включала все, не только ошибки и предупреждения.
В файле трассировки можно увидеть всю картину от создания OLE объекта до его уничтожения. Там же можно и увидеть
какой объект создан но не уничтожен или нарушен порядок его уничтожения.

Автор:  Malych [ Пт, май 04 2018, 16:35 ]
Заголовок сообщения:  Re: OLE не удаляется процесс Excel

в таком виде работает...

SET PROPERTY OF excel 'DisplayAlerts' = 0.
CALL METHOD OF excel 'QUIT'.
CALL FUNCTION 'FLUSH'
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2
OTHERS = 3.
IF SY-SUBRC = 0.
FREE OBJECT book NO FLUSH.
FREE OBJECT workbooks NO FLUSH.
FREE OBJECT excel NO FLUSH.
ENDIF.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/