Forms9i, OLE2, Excel - вопрос

vzt
Дата: 07.06.2006 12:57:01
Добрый день, Алл.

После того, как сохраняю результаты выборки в Екселевском файле и очищаю все OLE-объекты, в процессах Винды все равно остается Excel. Это я чего пропустил или Forms глючит?

ExcelApp OLE2.OBJ_TYPE := NULL;
workbooks OLE2.OBJ_TYPE := NULL;
workbook OLE2.OBJ_TYPE := NULL;
worksheets OLE2.OBJ_TYPE := NULL;
worksheet OLE2.OBJ_TYPE := NULL;
cell OLE2.OBJ_TYPE := NULL;
args OLE2.LIST_TYPE := NULL;

............................................................

args := NULL;
cell := NULL;
worksheet := NULL;
worksheets := NULL;
workbook := NULL;
workbooks := NULL;
ExcelApp := NULL;

делал также через OLE2.Release_Obj(...)
Кудрявцев Леонид
Дата: 07.06.2006 13:29:04
Скорее всего что-то пропустил:
1) Где-то у тебя остаются не удаленные объекты (скорее всего!). Для всех созданных или полученный объектов нужно вызывать OLE2.RELEASE_OBJ.
2) Неправильно закрывается документ
3) При создании worksheet'а, Excel обязательно должен быть видимым (свойство visible должно быть True)
4) что-то еще. :=)
someBody_07
Дата: 07.06.2006 16:32:44
>>3) При создании worksheet'а, Excel обязательно должен быть видимым (свойство visible должно быть True)

Может это и верно для Forms9i, но что-то я сильно сомневаюсь. Думаю, это зависит от EXCEL, а не от Forms. По крайней мере, для Forms 4.5 это не верное утверждение. Я формирую EXCEL-файл с "не видимым" и "видимым" приложением одинаково безглючно.

Считаю, что процесс в памяти остается из-за неверного обращения к свойствам EXCEL в процессе работы алгоритма или из-за не полного освобождения памяти от объектов вроде workbooks, cell перед завершением работы. Может автор темы приведет весь текст программы?
Sergey_Evdokimov
Дата: 07.06.2006 17:24:47
Кудрявцев Леонид
Скорее всего что-то пропустил:
1) Где-то у тебя остаются не удаленные объекты (скорее всего!). Для всех созданных или полученный объектов нужно вызывать OLE2.RELEASE_OBJ.
2) Неправильно закрывается документ
3) При создании worksheet'а, Excel обязательно должен быть видимым (свойство visible должно быть True)
4) что-то еще. :=)

5) Переходи на Tidestone Formula One
6) что-то еще. :=)
vzt
Дата: 07.06.2006 17:26:11
someBody_07
>>3) При создании worksheet'а, Excel обязательно должен быть видимым (свойство visible должно быть True).....
Считаю, что процесс в памяти остается из-за неверного обращения к свойствам EXCEL в процессе работы алгоритма или из-за не полного освобождения памяти от объектов вроде workbooks, cell перед завершением работы. Может автор темы приведет весь текст программы?


Вы правы. Совсем не обязательно Visible=True.
Тело кода? Легко.
.........................................................
ExcelApp OLE2.OBJ_TYPE := NULL;
workbooks OLE2.OBJ_TYPE := NULL;
workbook OLE2.OBJ_TYPE := NULL;
worksheets OLE2.OBJ_TYPE := NULL;
worksheet OLE2.OBJ_TYPE := NULL;
cell OLE2.OBJ_TYPE := NULL;
args OLE2.LIST_TYPE := NULL;
ConnectionId EXEC_SQL.CONNTYPE;
CursorId EXEC_SQL.CURSTYPE;
DMLString VarChar2(1000);
field1 VarChar2(30);
field2 VarChar2(50);
NumRows PLS_INTEGER; -- For compatibility only
CurRow PLS_INTEGER := 0;
-- bIsConnected BOOLEAN;
TmpVar VarChar2(75);

BEGIN

TmpVar := :System.Cursor_Item;

ConnectionId := EXEC_SQL.Default_Connection;
-- bIsConnected := EXEC_SQL.IS_CONNECTED(connection_id);
-- IF bIsConnected = FALSE THEN
-- Message('No present connection to any data source. Please connect before retrying.');
-- RETURN;
-- END IF;
CursorId := EXEC_SQL.OPEN_CURSOR(ConnectionId);
DMLString := 'select field1, field2 from table1';
EXEC_SQL.PARSE(ConnectionId, CursorId, DMLString);
EXEC_SQL.DEFINE_COLUMN(ConnectionId, CursorId, 1, field1, 30);
EXEC_SQL.DEFINE_COLUMN(ConnectionId, CursorId, 2, filed2, 50);

NumRows := EXEC_SQL.EXECUTE(ConnectionId, CursorId);

ExcelApp := OLE2.Create_Obj('Excel.Application');
workbooks := OLE2.Get_Obj_Property(ExcelApp, 'Workbooks');
workbook := OLE2.Invoke_Obj(workbooks,'Add');
worksheets := OLE2.Get_Obj_Property(workbook, 'Worksheets');
worksheet := OLE2.Invoke_Obj(worksheets, 'Add');

WHILE ( EXEC_SQL.FETCH_ROWS(ConnectionId, CursorId) > 0 ) LOOP
CurRow := CurRow + 1;
EXEC_SQL.COLUMN_VALUE(ConnectionId, CursorId, 1, field1);
EXEC_SQL.COLUMN_VALUE(ConnectionId, CursorId, 2, field2);

args:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args, CurRow);
OLE2.ADD_ARG(args, 1);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', args);
OLE2.Invoke(cell, 'select');
OLE2.set_property( cell, 'Value', field1);
OLE2.DESTROY_ARGLIST(args);
OLE2.Release_Obj(cell);

args:=OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args, CurRow);
OLE2.ADD_ARG(args, 2);
cell:=OLE2.get_OBJ_property(worksheet, 'cells', args);
OLE2.Invoke(cell, 'select');
OLE2.set_property( cell, 'Value', field2);
OLE2.DESTROY_ARGLIST(args);
OLE2.Release_Obj(cell);
END LOOP;
EXEC_SQL.CLOSE_CURSOR(ConnectionId, CursorId);

args := OLE2.Create_ArgList;
OLE2.Add_Arg(args, 'c:\temp\out.xls');
OLE2.Invoke(workbook,'SaveAs',args);
OLE2.Destroy_ArgList(args);
OLE2.Invoke(workbooks,'Close');
OLE2.Invoke(ExcelApp, 'Quit');

IF worksheet IS NOT NULL THEN
OLE2.Release_Obj(worksheet);
END IF;
IF worksheets IS NOT NULL THEN
OLE2.Release_Obj(worksheets);
END IF;
IF workbook IS NOT NULL THEN
OLE2.Release_Obj(workbook);
END IF;
IF workbooks IS NOT NULL THEN
OLE2.Release_Obj(workbooks);
END IF;
IF ExcelApp IS NOT NULL THEN
OLE2.Release_Obj(ExcelApp);
END IF;

EXCEPTION
WHEN OLE2.OLE_ERROR THEN
......................................
WHEN OTHERS THEN
......................................
Go_Item(TmpVar);

END Data_To_Excel;
Sergey_Evdokimov
Дата: 07.06.2006 17:32:16
Sergey_Evdokimov
5) Переходи на Tidestone Formula One
Пардон что навязываюсь, но кода будет в 7 раз меньше, работать будет раз в 10 быстрей :)
vzt
Дата: 07.06.2006 18:01:13
Sergey_Evdokimov
Sergey_Evdokimov
5) Переходи на Tidestone Formula One
Пардон что навязываюсь, но кода будет в 7 раз меньше, работать будет раз в 10 быстрей :)


Спасибо за инфу. Зашел сейчас на ихний сайт.
SomeBody_07
Дата: 07.06.2006 18:08:59
C OLE2 операторами у вас правильно. Думаю, что срабатывает эксепшн, например, в результате, вставки NULL командой OLE2.set_property( cell, 'Value', field1). Хотелось бы увидеть, что у вас в "WHEN OLE2.OLE_ERROR" и "WHEN OTHERS THEN" вместо ".........................".

Но, если в случае непредвиденного выхода, то есть в эксепшене, выполнить:

IF worksheet IS NOT NULL THEN
OLE2.Release_Obj(worksheet);
END IF;
IF worksheets IS NOT NULL THEN
OLE2.Release_Obj(worksheets);
END IF;
IF workbook IS NOT NULL THEN
OLE2.Release_Obj(workbook);
END IF;
IF workbooks IS NOT NULL THEN
OLE2.Release_Obj(workbooks);
END IF;
IF ExcelApp IS NOT NULL THEN
OLE2.Release_Obj(ExcelApp);
END IF;

то после закрытия приложения EXCEL, процесс исчезнет из памяти.
vzt
Дата: 07.06.2006 23:49:50
SomeBody_07
C OLE2 операторами у вас правильно. Думаю, что срабатывает эксепшн, например, в результате, вставки NULL командой OLE2.set_property( cell, 'Value', field1). Хотелось бы увидеть, что у вас в "WHEN OLE2.OLE_ERROR" и "WHEN OTHERS THEN" вместо ".........................".

Но, если в случае непредвиденного выхода, то есть в эксепшене, выполнить:

IF worksheet IS NOT NULL THEN
OLE2.Release_Obj(worksheet);
END IF;
IF worksheets IS NOT NULL THEN
OLE2.Release_Obj(worksheets);
END IF;
IF workbook IS NOT NULL THEN
OLE2.Release_Obj(workbook);
END IF;
IF workbooks IS NOT NULL THEN
OLE2.Release_Obj(workbooks);
END IF;
IF ExcelApp IS NOT NULL THEN
OLE2.Release_Obj(ExcelApp);
END IF;

то после закрытия приложения EXCEL, процесс исчезнет из памяти.


Именно это у меня в обработке эксепшн и применяется :(. Более того, это выглядит как
When OLE2.OLE2_ERROR Then
Message('There is an OLE Exception'); -- !!!
If worksheet Is Not Null Then ... и т.д.
When OTHERS Then
Message('There is an Unknown Exception'); -- !!!
If worksheet Is Not Null Then ... и т.д.

И если возникает эксепшн, то я это сразу вижу на консоли.
Я уж грешил на Office Assistant, который у меня запускается вместе оффисными прогами (а вдруг...). Отключил, та же хрень :(
SomeBody_08
Дата: 08.06.2006 14:31:45
Я в таких не определенных случаях комментирую отдельные участки кода до тех пор, пока после его отработки процесса в памяти не остается. Закомментированная область и будет "проблемной".