SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Проблема при повторном открытии Excel



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
seal
Участник
Участник



Joined: 25 Sep 2007
Posts: 18

PostPosted: Mon Oct 08, 2007 10:26 am    Post subject: Проблема при повторном открытии Excel Reply with quote

Из ALV отчета открываю по кнопке Excel для формирования документа по отдельной позиции. Открывается нормально. Закрываю Excel и снова перехожу в ALV. Нажимаю кнопку для формирования документа для второй позиции, Excel открывается, но поля не заполняются. В чем может быть дело?
Back to top
View user's profile Send private message
Lord
Профессионал
Профессионал



Joined: 10 Sep 2007
Posts: 168

PostPosted: Tue Oct 09, 2007 11:06 am    Post subject: Reply with quote

На 95% причины ошибки в том, что остался в памяти предыдущий экземпляр Excel.
Проверь, что освобождаются все OLE2 объекты после использования, и что важно, нет повтороного использования еще не освобожденных объектов.

Code:
TYPE-POOLS: OLE2 .

DATA: H_EXCEL TYPE OLE2_OBJECT, " Excel object
H_MAPL TYPE OLE2_OBJECT, " list of workbooks
H_SHEET TYPE OLE2_OBJECT,
RANGE TYPE OLE2_OBJECT.

CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.

SET PROPERTY OF H_EXCEL 'Visible' = 1.

CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.

CALL METHOD OF H_MAPL 'Open'
EXPORTING
#1 = 'C:\Temp\text.xls'.

CALL METHOD OF H_EXCEL 'WORKSHEETS' = H_SHEET
  EXPORTING
    #1 = 1. "первая по счету страница

* change name of sheet
SET PROPERTY OF H_SHEET 'NAME' = 'Items Overview'.

CALL METHOD OF H_SHEET 'Activate'.
CALL METHOD OF H_SHEET 'RANGE' = RANGE
EXPORTING
#1 = 'A1:A1'.

CALL METHOD OF RANGE 'SELECT'.

SET PROPERTY OF H_EXCEL 'Visible' = 1.

CALL METHOD OF H_EXCEL 'QUIT'.

FREE OBJECT H_EXCEL.
FREE OBJECT H_MAPL.
FREE OBJECT H_SHEET.
FREE OBJECT RANGE.
Back to top
View user's profile Send private message
lepricosha
Участник
Участник



Joined: 21 Apr 2008
Posts: 17

PostPosted: Fri Jan 23, 2009 6:54 pm    Post subject: Reply with quote

Lord wrote:
На 95% причины ошибки в том, что остался в памяти предыдущий экземпляр Excel.
Проверь, что освобождаются все OLE2 объекты после использования, и что важно, нет повтороного использования еще не освобожденных объектов.

Code:


У меня похожая проблема, Но я в конце работы программы делаю FREE всех объектов, у пользователя файл открывается только из моей программы, а потом после того как он жмет СОХРАНИТЬ КАК и выходит, открыть повторно получается только если почистить процессы.....
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Fri Jan 23, 2009 10:23 pm    Post subject: Reply with quote

Все равно дело в неосвобождении объектов.

Нужно освобождать в обратной последовательности от создания.

Причем, часто создают несколько раз объект с тем же именем, забыв сделать free object, что приводит к перетиранию ссылки на объект. Например, получили ссылку на объект ячейка, провери с ней операцию. Потом снова получили ссылку на другую ячейку в тот же самый указатель, а нужно было предварительно удалить его через free object.

Освобождать объекты желательно сразу, после использования, в этой же подпрограмме, чтобы избежать ошибок с перетиранием ссылок.

Приводите ваш код, посмотрим.
Back to top
View user's profile Send private message Blog Visit poster's website
lepricosha
Участник
Участник



Joined: 21 Apr 2008
Posts: 17

PostPosted: Mon Jan 26, 2009 1:18 pm    Post subject: Reply with quote

Хорошо, а то я уже погрязла в free object
к сожалению программа - под названием без 100 грамм не разобраться - потому что моя первая по выгрузке в Ex Sad
в основной программе идут вызовы двух процедур по работе с Ex:

Code:
 CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.

 SET PROPERTY OF H_EXCEL  'Visible' = 0.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
           TEXT       = 'Идет выгрузка в Эксель...'
       EXCEPTIONS
            OTHERS     = 1.

  CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.

  PERFORM ERR_HDL.

  CALL METHOD OF H_MAPL 'Add' = H_MAP.
    free object h_mapl.
   free object h_map.

  PERFORM ERR_HDL.


PERFORM FILL_CELL USING y 1 1 shap 12.
...... таких вызовов будет много

**** при некоторых условиях мне надо форматировать текст разными способами - таких вызовов тоже много
perform selec using y h y  h1 0 0 3 .

 SET PROPERTY OF H_EXCEL  'Visible' = 1.

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
           TEXT       = 'ok'
       EXCEPTIONS
            OTHERS     = 1.

  FREE OBJECT o_cells.
 FREE OBJECT               o_sheet.
 FREE OBJECT               o_start.
 FREE OBJECT               o_end.
 FREE OBJECT               o_column.
 FREE OBJECT               o_range.
 FREE OBJECT               o_interior.
 FREE OBJECT               o_borders.
 FREE OBJECT               H_MAP.
 FREE OBJECT               H_ZL.
 FREE OBJECT               H_F.
 FREE OBJECT               H_EXCEL.
 FREE OBJECT               H_MAPL.

[b]сами процедуры[/b]

FORM FILL_CELL USING I J BOLD VAL SIZE.

    CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_ZL 'Value' = VAL .
  PERFORM ERR_HDL.
  GET PROPERTY OF H_ZL 'Font' = H_F.
  FREE OBJECT               H_ZL.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_F 'Bold' = BOLD .
  PERFORM ERR_HDL.
  if ( SIze <> 0 ).
  SET PROPERTY OF H_F 'Size' = Size .
  PERFORM ERR_HDL.
    endif.

 FREE OBJECT               H_F.

ENDFORM.

FORM selec  USING    P_TOP_1
                     P_LEFT_1
                     P_TOP_2
                     P_LEFT_2
                     clr
                     wid
                     en.

CALL METHOD OF h_excel 'Cells' = o_cells.
CALL METHOD OF o_cells 'Select'.
FREE OBJECT               o_cells.

  CALL METHOD OF h_excel 'ActiveSheet' = o_sheet.

*** Start
  CALL METHOD OF o_sheet 'Cells' = o_start
    EXPORTING
    #1 = p_top_1
    #2 = p_left_1.

*** End
  CALL METHOD OF o_sheet 'Cells' = o_end
    EXPORTING
    #1 = p_top_2
    #2 = p_left_2.

  CALL METHOD OF o_sheet 'range' = o_range
    EXPORTING
    #1 = o_start
    #2 = o_end.

FREE OBJECT               o_sheet.
FREE OBJECT               o_start.
FREE OBJECT               o_end.


CALL METHOD OF o_range 'Select'.

***установка цвета****
if ( clr <> 0 ).
  GET PROPERTY OF o_range 'Interior' = o_interior.
  SET PROPERTY OF o_interior 'ColorIndex' = clr .
    FREE OBJECT               o_interior.

endif.
*** установка ширины****
if ( wid <> 0 ).
  GET PROPERTY OF o_range 'Columns' = o_column.
  FREE OBJECT               o_range.
  SET PROPERTY OF o_column 'ColumnWidth' = wid .
  FREE OBJECT               o_column.

endif.

***ОБЪЕДИНЯЕМ СТОЛБЦЫ***
if ( en = 3 ).
CALL METHOD OF o_range 'Merge'.
if p_top_1 >= 7.
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 9.
FREE OBJECT               o_range.
  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
   FREE OBJECT               o_borders.


endif.
endif.

***ОКОНЧАТЕЛЬНОЕ ФОРМАТИРОВАНИЕ ВЫДЕЛЯЕМ ТОЛЬКО ТАБЛИЦУ***
if ( en = 2 ).
  GET PROPERTY OF o_range 'Font' = H_F.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_F 'Size' = 8 .
  free object h_f.
** граница
  CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 7.

  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
"  SET PROPERTY OF o_borders 'ColorIndex' = l_brd_color.
free object     o_borders.
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 11.
  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
free object     o_borders.
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 10.
  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
free object     o_borders.
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 8.
  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
free object     o_borders.
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 9.
FREE OBJECT               o_range.

  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
  FREE OBJECT               o_borders.

    FREE OBJECT               H_F.

endif.


***ОКОНЧАТЕЛЬНОЕ ФОРМАТИРОВАНИЕ ВЫДЕЛЯЕМ ВСЕ***
if ( en = 1 ).
  SET PROPERTY OF o_range 'HorizontalAlignment' =  -4108.
  SET PROPERTY OF o_range 'NumberFormat' =  '#,##0'.
FREE OBJECT               o_range.

endif.

***Печатаем жирным***

if ( en = 4 ).
  GET PROPERTY OF o_range 'Font' = H_F.
FREE OBJECT               o_range.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_F 'Bold' = 1 .
    FREE OBJECT               H_F.
endif.
** Горизонтальные границы
if ( en = 5 ).
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 8.
  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
  FREE OBJECT               o_borders.
CALL METHOD OF o_range 'Borders' = o_borders
    EXPORTING
      #1 = 12.
   FREE OBJECT               o_range.
  SET PROPERTY OF o_borders 'LineStyle' = 1.
  SET PROPERTY OF o_borders 'Weight' = -4138.
   FREE OBJECT               o_borders.

endif.
  FREE OBJECT o_cells.
 FREE OBJECT               o_sheet.
 FREE OBJECT               o_start.
 FREE OBJECT               o_end.
 FREE OBJECT               o_column.
 FREE OBJECT               o_range.
 FREE OBJECT               o_interior.
 FREE OBJECT               o_borders.
 FREE OBJECT               H_ZL.
 FREE OBJECT               H_F.

ENDFORM.                    " selec
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 170
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Jan 26, 2009 3:06 pm    Post subject: Reply with quote

Здравствуйте, повнимательней вечером посмотрю. На беглый вгляд есть нарушения последовательности создания и удаления объектов. Например:

Code:
CALL METHOD OF h_excel 'ActiveSheet' = o_sheet.

*** Start
  CALL METHOD OF o_sheet 'Cells' = o_start
    EXPORTING
    #1 = p_top_1
    #2 = p_left_1.

*** End
  CALL METHOD OF o_sheet 'Cells' = o_end
    EXPORTING
    #1 = p_top_2
    #2 = p_left_2.

  CALL METHOD OF o_sheet 'range' = o_range
    EXPORTING
    #1 = o_start
    #2 = o_end.

FREE OBJECT               o_sheet.
FREE OBJECT               o_start.
FREE OBJECT               o_end.


Попробуйте уничтожать так:

Code:
FREE OBJECT               o_start.
FREE OBJECT               o_end.
FREE OBJECT               o_sheet.
Back to top
View user's profile Send private message Blog Visit poster's website
lepricosha
Участник
Участник



Joined: 21 Apr 2008
Posts: 17

PostPosted: Mon Jan 26, 2009 3:59 pm    Post subject: Reply with quote

Огромное Вам спасибо, что помогли - я тщательно просмотрела всю программу - сделала освобождение объектов в нужном порядке - и теперь все работает - за что Вам БОЛЬШОЕ спасибо
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.