Question Excel is hanging after quit

g-nf-5

New Member
I'm troubled by Excel hanging after I terminate the process. A piece of the code is below:

SESSION:SET-WAIT-STATE("GENERAL").

CREATE "Excel.Application":U chExcel.
ASSIGN chExcel:VISIBLE = NO
chExcel:displayAlerts = FALSE
cExcelName = cExcelName + STRING(TIME)
chWorkbook = chExcel:Workbooks:Add()
iWorkSheets = 0.
FOR EACH ttData WHERE NOT ttData.Manual
BREAK BY ttData.Whs BY ttData.LineNo:
IF FIRST-OF(ttData.Whs) THEN
RUN CreateHeader.
RUN CreateLine.
IF LAST-OF(ttData.Whs) THEN
RUN FinishOrder.
DELETE ttData.
END.

IF iWorkSheets LT 3 THEN
DO i = 3 TO (iWorkSheets + 1) BY -1:
chWorksheet = chWorkbook:Worksheets(i).
chWorkSheet:delete.
END.

chWorkBook:SaveAs(cExcelName,56,,,,,).
ASSIGN chExcel:displayAlerts = YES.
chWorkBook:CLOSE().
chExcel:QUIT.
RELEASE OBJECT chWorkBook.
RELEASE OBJECT chWorkSheet.
RELEASE OBJECT chExcel.
SESSION:SET-WAIT-STATE("").


The same 4 lines starting with the QUIT terminates Excel if I am reading, but when writing out it does not. This is Office 2007 using OpenEdge 10.2A on a Windows 7 64 bit machine.

Any help would be much appreciated.
 

Stefan

Well-Known Member
Please put code between code tags.

You can simplify your code further so that anyone can copy / paste / execute it and watch Excel hang.

Your problem is that you are not cleaning up what you are (implicitly) creating. The chWorksheet = chWorkbook:Worksheets(i) creates an object and assigns it to chWorksheet. However, this is in a loop -> leak + hang.

You need to RELEASE OBJECT chWorksheet within that loop:

Code:
DEF VAR chExcel AS COM-HANDLE NO-UNDO.
DEF VAR chWorkBook AS COM-HANDLE NO-UNDO.
DEF VAR chWorkSheet AS COM-HANDLE NO-UNDO.
 
DEF VAR cexcelname AS CHAR NO-UNDO INIT "c:\temp\excel".
DEF VAR iworksheets AS INT NO-UNDO INITIAL 1.
DEF VAR ii AS INT NO-UNDO.
 
SESSION:SET-WAIT-STATE("GENERAL").
 
CREATE "Excel.Application":U chExcel.
ASSIGN chExcel:VISIBLE = NO.
chExcel:displayAlerts = FALSE.
cExcelName = cExcelName + STRING(TIME).
chWorkbook = chExcel:Workbooks:Add().
 
IF iWorkSheets < 3 THEN DO ii = 3 TO (iWorkSheets + 1) BY -1:
   chWorksheet = chWorkbook:Worksheets(ii).
   chWorkSheet:delete.
   RELEASE OBJECT chworksheet. /* <---  here */
END.
 
chWorkBook:SaveAs(cExcelName,56,,,,,).
ASSIGN chExcel:displayAlerts = YES.
chWorkBook:CLOSE().
chExcel:QUIT.
 
/* RELEASE OBJECT chWorkSheet. <--- not here */
RELEASE OBJECT chWorkBook.
RELEASE OBJECT chExcel.
 
SESSION:SET-WAIT-STATE("").
 
Top