ошибка: FRM47337 Tree node label can not be null при выполнении скрипта DECLARE |
Oracle Forms и Excel
Выгрузка данных в Excel
Теперь, когда мы ознакомились со всеми методами пакета OLE2, можно перейти к следующему шагу - дополним пример возможностью передавать значение в ячейку листа электронной таблицы (листинг 11.4).
PROCEDURE Into_xls (val_xls varchar2) IS App ole2.obj_type; Book ole2.obj_type; DocName varchar2(100); WorkbooksCollection ole2.obj_type; Sheets ole2.obj_type; Sheet ole2.obj_type; cell ole2.obj_type; args ole2.list_type; begin docname:=GET_FILE_NAME(''); App:=OLE2.Create_Obj('Excel.Application'); OLE2.Set_Property(App,'VISIBLE', 1 ); WorkbooksCollection:=OLE2.GET_OBJ_PROPERTY(App, 'Workbooks' ); args:=OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, docname); Book:=OLE2.Invoke_Obj(WorkbooksCollection,'Open', args); OLE2.DESTROY_ARGLIST(args); Sheets:=OLE2.GET_OBJ_PROPERTY(Book,'Worksheets'); Sheet:= OLE2.GET_OBJ_PROPERTY(Book, 'ActiveSheet'); args := ole2.create_arglist; ole2.add_arg(args,4); ole2.add_arg(args,10); cell := ole2.get_obj_property(sheet,'Cells',args); ole2.destroy_arglist(args); ole2.set_property(cell,'Value',val_xls); ole2.release_obj(cell); end;Листинг 11.4. Объявление типов данных пакета OLE2
Если вы в точности выполнили код, приведенный в листинге 11.4, то после выбора файла значение "Value from Forms" загрузится в ячейку с координатой 10:4. Завершим этот пример добавлением в тело триггера кода, который позволяет выйти из приложения EXCEL и очистить переменные (листинг 11.5).
... <листинг 11.4> args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 0); OLE2.INVOKE(book, 'Close', args); OLE2.DESTROY_ARGLIST(args); OLE2.INVOKE(app,'Quit'); ole2.release_obj(sheet); ole2.release_obj(sheets); ole2.release_obj(book); ole2.release_obj(WorkbooksCollection); ole2.release_obj(app); END;Листинг 11.5 . Объявление типов данных пакета OLE2
На этом наше знакомство с возможностями управления приложением Excel не закончено, так как в конце главы будет показано несколько полезных примеров, которые научат вас управлять шрифтами и цветами, а пока приступим к рассмотрению примера загрузки данных из листа EXCEL в Forms.
Загрузка данных вида Мастер-Деталь
Когда мы работаем с приложением Excel, то реже всего мы сталкиваемся с обратной проблемой, а именно с загрузкой данных в форму из электронной таблицы. В листинге 11.6 приведен код функции, которая возвращает значение ячейки Excel. Параметры функции col_number и rec_ number - это координаты ячейки, значение которой требуется получить.
FUNCTION From_xls (col_number number, rec_number number) RETURN varchar2 IS App ole2.obj_type; Book ole2.obj_type; DocName varchar2(100):=get_file_name(''); WorkbooksCollection ole2.obj_type; Sheets ole2.obj_type; Sheet ole2.obj_type; cell ole2.obj_type; args ole2.list_type; val_xls varchar(100); BEGIN /* Read Excel document */ App:=OLE2.Create_Obj('Excel.Application'); --OLE2.Set_Property(App,'VISIBLE', 1 ); WorkbooksCollection:=OLE2.GET_OBJ_PROPERTY(App, 'Workbooks' ); args:=OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, DocName); Book:=OLE2.Invoke_Obj(WorkbooksCollection,'Open', args); OLE2.DESTROY_ARGLIST(args); Sheets:=OLE2.GET_OBJ_PROPERTY(Book,'Worksheets'); Sheet:= OLE2.GET_OBJ_PROPERTY(Book, 'ActiveSheet'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, col_number); ole2.add_arg(args, rec_number); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); val_xls:=ole2.get_char_property(cell, 'Value'); args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 0); OLE2.INVOKE(book, 'Close', args); OLE2.DESTROY_ARGLIST(args); OLE2.INVOKE(app,'Quit'); ole2.release_obj(sheet); ole2.release_obj(sheets); ole2.release_obj(book); ole2.release_obj(WorkbooksCollection); ole2.release_obj(app); RETURN val_xls; END;Листинг 11.6 . Функция From_xls. Загрузка данных из Excel
Основным отличием функции From_xls от предыдущего примера является строка ole2.get_char_property(cell, 'Value'), которая получает значение указанной ячейки.
Создайте кнопку и в триггере WHEN-BUTTON-PRESSED вызовите функцию From_xls, как показано в листинге 11.7.
Message('Value from Excel: '||from_xls(1,1));Листинг 11.7 . WHEN-BUTTON-PRESSED
Загрузка документа в форму
Мы с вами рассмотрели простые примеры, в которых передавали значение из Excel в Forms и наоборот, но иногда требуется выгружать целые таблицы из Forms в Excel или, наоборот, загружать сложные документы Excel в форму. Рассмотрим пример, когда необходимо разработать систему приема заказов, причем все заказы приходят в виде Excel-заявок. Для рассмотрения примера мы будем использовать форму Master_Detail, созданную в главе "Блоки". На рис. 11.1 показан файл Excel - Inquiry.xls, "который мы будем называть "Заказ" и который мы будем загружать в нашу БД".
Как видите, файл "Заказ" имеет сложную структуру и поэтому состоит из трех частей:
- Описание письма и заказчика.
- Товар.
- Характеристика товара.
Перед нами стоит задача загрузки документа в форму по одному нажатию кнопки, то есть мы должны проследить, чтобы данные были не только загружены, но и сохранены в том порядке и соотношении, в котором они находятся. Приведенный пример не является оптимальным, поэтому в ваших силах написать более производительное и функциональное решение.
Перед тем как вставлять полученные данные в рабочие таблицы, выгрузим данные документа во временные таблицы Excel1 и Excel2.
В таблицу Excel1 мы будем выгружать информацию о товаре, а в таблицу Excel2 - информацию о свойствах и количестве товара. В листинге 11.8 приведен пример загрузки документа во временные таблицы. Для упрощения примера процедура разбита на две части, где первая часть - это выгрузка информации о заказчике, а вторая часть - выгрузка информации о товаре и его характеристиках.
Информацию о заказчике мы будем выгружать непосредственно в форму, а именно в элементы блока данных " PZAK ". В листинге 11.8 приведен пример процедуры Excel_to_Forms, которая заполняет блок " PZAK " информацией из файла Excel.
PROCEDURE EXCEL_to_form (DocName varchar2) IS App ole2.obj_type; Book ole2.obj_type; DocName varchar2(100):=get_file_name(''); WorkbooksCollection ole2.obj_type; Sheets ole2.obj_type; Sheet ole2.obj_type; cell ole2.obj_type; args ole2.list_type; BEGIN App:=OLE2.Create_Obj('Excel.Application'); OLE2.Set_Property(App,'VISIBLE', 1 ); WorkbooksCollection:=OLE2.GET_OBJ_PROPERTY(App, 'Workbooks' ); args:=OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args,docname); Book:=OLE2.Invoke_Obj(WorkbooksCollection,'Open', args); OLE2.DESTROY_ARGLIST(args); Sheets:=OLE2.GET_OBJ_PROPERTY(Book,'Worksheets'); Sheet:= OLE2.GET_OBJ_PROPERTY( Book, 'ActiveSheet'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 6); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :nlet :=ole2.get_char_property(cell, 'Value');-- получение номера письма из заявки args:=OLE2.CREATE_ARGLIST; :sdat:=sysdate; --запись текущей даты ole2.add_arg(args, 8); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :nfirm:=ole2.get_char_property(cell, 'Value'); -- наименование заказчика args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 10); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :srpost :=ole2.get_char_property(cell, 'Value'); --срок поставки args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 12); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :yslp :=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 6); ole2.add_arg(args, 15); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :pdat:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 14); ole2.add_arg(args, 5); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :tpus:=ole2.get_num_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 14); ole2.add_arg(args, 6); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); tmin:=ole2.get_num_property(cell, 'Value'); :tmin:=tlm; args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 0); OLE2.INVOKE(book, 'Close', args); OLE2.DESTROY_ARGLIST(args); OLE2.INVOKE(app,'Quit'); ole2.release_obj(sheet); ole2.release_obj(sheets); ole2.release_obj(book); ole2.release_obj(WorkbooksCollection); ole2.release_obj(app); END;Листинг 11.8 . Процедура Excel_to_Forms
Как видите, процедура получается довольно-таки объемной, хотя мы загрузили только первую часть документа. Перейдем ко второй части - загрузка информации о товаре. Для получения таблицы Excel2 и ее заполнения информацией из заявки, модифицируйте процедуру Excel_ To_Forms, добавив в нее код, приведенный в листинге 11.9.
PROCEDURE Excel_to_Forms (DocName varchar2) IS App ole2.obj_type; Book ole2.obj_type; DocName varchar2(100):=get_file_name(''); WorkbooksCollection ole2.obj_type; Sheets ole2.obj_type; Sheet ole2.obj_type; cell ole2.obj_type; args ole2.list_type; BEGIN App:=OLE2.Create_Obj('Excel.Application'); OLE2.Set_Property(App,'VISIBLE', 1 ); WorkbooksCollection:=OLE2.GET_OBJ_PROPERTY(App, 'Workbooks' ); args:=OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args,docname); Book:=OLE2.Invoke_Obj(WorkbooksCollection,'Open', args); OLE2.DESTROY_ARGLIST(args); Sheets:=OLE2.GET_OBJ_PROPERTY(Book,'Worksheets'); Sheet:= OLE2.GET_OBJ_PROPERTY( Book, 'ActiveSheet'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 6); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :nlet :=ole2.get_char_property(cell, 'Value'); -- получение номера письма из заявки args:=OLE2.CREATE_ARGLIST; :sdat:=sysdate; --запись текущей даты ole2.add_arg(args, 8); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :nfirm:=ole2.get_char_property(cell, 'Value'); -- наименование заказчика args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 10); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :srpost :=ole2.get_char_property(cell, 'Value'); --срок поставки args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 12); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :yslp :=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 6); ole2.add_arg(args, 15); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :pdat:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 14); ole2.add_arg(args, 5); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :tpus:=ole2.get_num_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 14); ole2.add_arg(args, 6); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); tmin:=ole2.get_num_property(cell, 'Value'); :tmin:=tlm; ------------ Получение данных о товаре for i in 1..2000 loop args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 1); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); if ole2.get_char_property(cell, 'Value')='Grade of steel' then args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i-1); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); sm:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+2); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); priemka :=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+4); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); doptr:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+6); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); dopmr:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+8); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); lot:=ole2.get_char_property(cell, 'Value'); -------------------------- insert into excel2 (smarka, priem, doptr, dopls, lot) values (sm, priemka, substr(doptr,0,300), substr(dopmr,0,300), lot); forms_ddl('commit'); end if; end loop; args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 0); OLE2.INVOKE(book, 'Close', args); OLE2.DESTROY_ARGLIST(args); OLE2.INVOKE(app,'Quit'); ole2.release_obj(sheet); ole2.release_obj(sheets); ole2.release_obj(book); ole2.release_obj(WorkbooksCollection); ole2.release_obj(app); END;Листинг 11.9 . Процедура Excel_to_Forms
Перейдем к третьей части - получению информации о характеристических данных товара. Для выгрузки данных напишем новую процедуру - Excel_To_Form2 (листинг 11.10), потому что, если добавить новый код в предыдущую процедуру, она будет довольно тяжелой для восприятия.
PROCEDURE Excel_to_Forms2 (docname varchar2) IS App ole2.obj_type; Book ole2.obj_type; cell ole2.obj_type; MyChar varchar2(30); GOST varchar2(2000); mk varchar2(2000); NP NUMBER; DLN NUMBER; SHR NUMBER; TLS NUMBER; KOL NUMBER; WorkbooksCollection ole2.obj_type; Sheets ole2.obj_type; Sheet ole2.obj_type; args ole2.list_type; BEGIN /* Read Excel document */ App:=OLE2.Create_Obj('Excel.Application'); WorkbooksCollection:=OLE2.GET_OBJ_PROPERTY(App, 'Workbooks' ); args:=OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, docname); Book:=OLE2.Invoke_Obj(WorkbooksCollection,'Open', args); OLE2.DESTROY_ARGLIST(args); Sheets:=OLE2.GET_OBJ_PROPERTY(Book,'Worksheets'); Sheet:= OLE2.GET_OBJ_PROPERTY(Book, 'ActiveSheet'); for i in 1..2000 loop args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 1); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); if ole2.get_NUM_property(cell, 'Value')!=0 then args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i-3); ole2.add_arg(args, 1); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); if ole2.get_char_property(cell, 'Value')='ЛОТ/LOT' then args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i-3); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); mk :=ole2.get_char_property(cell, 'Value'); end if; args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 1); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); NP :=ole2.get_NUM_property(cell, 'Value'); --:smarka:=sm; args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 2); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); TLS :=ole2.get_NUM_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 3); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); SHR:=ole2.get_NUM_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 4); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); DLN:=ole2.get_NUM_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); KOL:=ole2.get_NUM_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 6); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); GOST:=ole2.get_char_property(cell, 'Value'); INSERT INTO excel3 (mk,NP,DLN,SHR,TLS,COL,GOST) VALUES(mk,NP, DLN,SHR,TLS,KOL,GOST); FORMS_DDL('commit'); end if; end loop; FORMS_DDL('commit'); OLE2.RELEASE_OBJ(cell); OLE2.RELEASE_OBJ(Sheet); OLE2.RELEASE_OBJ(Sheets); OLE2.RELEASE_OBJ(Book); OLE2.INVOKE (App,'Quit'); OLE2.RELEASE_OBJ(App); END;Листинг 11.10 . Процедура Excel_to_Forms2
Информация получена, и документ в раздробленном состоянии находится в базе. Наша дальнейшая задача - это связывание данных, находящихся в таблицах Excel1 и Excel2, между собой и с данными в форме. Для этого модифицируйте процедуру Excel_To_Forms, как показано в листинге 11.11 где приведен конечный вид процедуры для загрузки документа Excel.
PROCEDURE EXCEL_to_form (DocName varchar2) IS App ole2.obj_type; Book ole2.obj_type; DocName varchar2(100):=get_file_name(''); WorkbooksCollection ole2.obj_type; Sheets ole2.obj_type; Sheet ole2.obj_type; cell ole2.obj_type; args ole2.list_type; CURSOR EX1 IS SELECT * FROM asunz.EXCEL2; EX2 EX1%ROWTYPE; CURSOR c1 IS SELECT * FROM asunz.EXCEL3 order by np asc; c2 c1%ROWTYPE; BEGIN App:=OLE2.Create_Obj('Excel.Application'); OLE2.Set_Property(App,'VISIBLE', 1 ); WorkbooksCollection:=OLE2.GET_OBJ_PROPERTY(App, 'Workbooks' ); args:=OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args,docname); Book:=OLE2.Invoke_Obj(WorkbooksCollection,'Open', args); OLE2.DESTROY_ARGLIST(args); Sheets:=OLE2.GET_OBJ_PROPERTY(Book,'Worksheets'); Sheet:= OLE2.GET_OBJ_PROPERTY( Book, 'ActiveSheet'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 6); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :nlet :=ole2.get_char_property(cell, 'Value'); -- получение номера письма из заявки args:=OLE2.CREATE_ARGLIST; :sdat:=sysdate; --запись текущей даты ole2.add_arg(args, 8); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :nfirm:=ole2.get_char_property(cell, 'Value'); -- наименование заказчика args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 10); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :srpost :=ole2.get_char_property(cell, 'Value'); --срок поставки args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 12); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :yslp :=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 6); ole2.add_arg(args, 15); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :pdat:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 14); ole2.add_arg(args, 5); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); :tpus:=ole2.get_num_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, 14); ole2.add_arg(args, 6); cell:=ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); tmin:=ole2.get_num_property(cell, 'Value'); :tmin:=tlm; ------------ Получение данных о товаре for i in 1..2000 loop args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i); ole2.add_arg(args, 1); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); if ole2.get_char_property(cell, 'Value')='Grade of steel' then args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, i-1); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); sm:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+2); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); priemka :=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+4); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); doptr:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+6); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); dopmr:=ole2.get_char_property(cell, 'Value'); args:=OLE2.CREATE_ARGLIST; ole2.add_arg(args, (i-1)+8); ole2.add_arg(args, 5); cell:= ole2.get_obj_property(Sheet, 'Cells', args); ole2.destroy_arglist(args); lot:=ole2.get_char_property(cell, 'Value'); -------------------------- insert into excel2 (smarka, priem, doptr, dopls, lot) values (sm, priemka, substr(doptr,0,300), substr(dopmr,0,300), lot); forms_ddl('commit'); end if; end loop; args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 0); OLE2.INVOKE(book, 'Close', args); OLE2.DESTROY_ARGLIST(args); OLE2.INVOKE(app,'Quit'); ole2.release_obj(sheet); ole2.release_obj(sheets); ole2.release_obj(book); ole2.release_obj(WorkbooksCollection); ole2.release_obj(app); Excel_To_Form (docname); OPEN EX1; select count(*) into j from asunz.excel2; select count(*) into k from asunz.excel3; for i in 1..j loop fetch ex1 into ex2; :ppzak.smarka:=ex2.smarka; :ppzak.priem:=ex2.priem; :ppzak.doptr:=ex2.doptr; :ppzak.dopls:=ex2.dopls; :ppzak.lot:=ex2.lot; commit; open c1; for v in 1..k loop fetch c1 into c2; if ex2.lot=c2.mk or (ex2.lot is null and c2.mk is null ) then :dln=c2.dln; :shr:=c2.shr; :tls:=c2.tls; :ton:=c2.col; :PZAK_ATR.gost:=c2.gost; :num:=c2.np; go_block('pzak_atr'); next_record; end if; end loop; close c1; commit; go_block('ppzak'); next_record; end loop; CLOSE EX1; delete from excel2; delete from excel3; forms_ddl('commit'); END;Листинг 11.11 . Excel_to_Forms
В этом листинге мы объявили два курсора, чтобы считать данные с таблиц Excel1 и Excel2, причем общим критерием для связывания таблиц служит номер лота.
Управление параметрами Excel
Теперь, когда мы научились обмениваться данными между приложениями Excel и Forms, можно перейти к не менее важной части - управлению функциональными возможностями электронной таблицы. Ниже приведены небольшие примеры, которые позволят вам научиться управлять форматированием ячеек и основными командами меню "Файл" Excel.
- В листинге 11.12 показан пример добавления листа (Sheet) Excel.
Declare app OLE2.OBJ_TYPE; workbooks OLE2.OBJ_TYPE; workbook OLE2.OBJ_TYPE; worksheet OLE2.OBJ_TYPE; Sheets OLE2.OBJ_TYPE; args OLE2.LIST_TYPE; begin Excel := OLE2.CREATE_OBJ('Excel.Application'); OlE2.SET_PROPERTY(app,'Visible', TRUE); workbooks := OLE2.GET_OBJ_PROPERTY(Excel, 'Workbooks'); workbook := OLE2.INVOKE_OBJ(workbooks,'Add'); Sheets := OLE2.GET_OBJ_PROPERTY(workbook, 'Sheets'); OLE2.INVOKE(Sheets, 'Add'); ... exception when others then Message('Ошибка OLE'); end;Листинг 11.12 . Добавление листа
- Опираясь на пример, приведенный в листинге 11.13, вы можете управлять свойствами столбца, такими как высота, ширина, цвет шрифта и другие.
app OLE2.OBJ_TYPE; workbook OLE2.OBJ_TYPE; workbooks OLE2.OBJ_TYPE; worksheet OLE2.OBJ_TYPE; worksheets OLE2.OBJ_TYPE; col OLE2.OBJ_TYPE; font OLE2.OBJ_TYPE; args OLE2.List_Type; BEGIN application := OLE2.CREATE_OBJ('Excel.Application'); OLE2.SET_PROPERTY(app, 'Visible', 'True'); workbooks := OLE2.GET_OBJ_PROPERTY(app, 'Workbooks'); workbook := OLE2.INVOKE_OBJ(workbooks,'Add'); worksheets := OLE2.GET_OBJ_PROPERTY(workbook, 'Worksheets'); worksheet := OLE2.INVOKE_OBJ(worksheets,'Add'); -- Устанавливаем ширину столбцов в диапазоне G:J args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 'G:J'); -- Устанавливаем диапазон столбцов col:= OLE2.GET_OBJ_PROPERTY(worksheet, 'Columns', args); OLE2.DESTROY_ARGLIST(args); font := OLE2.GET_OBJ_PROPERTY(col, 'Font', args); -- Устанавливаем ширину ячеек в диапазоне G:J OLE2.SET_PROPERTY(col, 'ColumnWidth', 100); -- Установка ширины столбца OLE2.RELEASE_OBJ(col); -- Установка значений ячеек OLE2.SET_PROPERTY(font, 'Name', 'Arial'); -- Устанавливаем наименование шрифта OLE2.SET_PROPERTY(font, 'Size', 20); -- Устанавливаем размер шрифта равным 20 OLE2.SET_PROPERTY(font, 'Strikethrough', 'True'); OLE2.SET_PROPERTY(font, 'Bold', 'True'); -- Устанавливаем жирный шрифт OLE2.SET_PROPERTY(font, 'ColorIndex', 3);-- Устанавливаем красный цвет шрифта OLE2.RELEASE_OBJ(font); OLE2.RELEASE_OBJ(worksheet); OLE2.RELEASE_OBJ(worksheets); OLE2.RELEASE_OBJ(workbook); OLE2.RELEASE_OBJ(workbooks); OLE2.RELEASE_OBJ(app); EXCEPTION WHEN others THEN OLE2.Release_Obj( app ); message('Ошибка OLE'); END;Листинг 11.13. Форматирование ячейки и столбца Declare
- Пример, приведенный в листинге 11.14, показывает, как можно управлять свойствами ячейками, такими как высота и ширина.
application OLE2.OBJ_TYPE; workbook OLE2.OBJ_TYPE; workbooks OLE2.OBJ_TYPE; worksheet OLE2.OBJ_TYPE; worksheets OLE2.OBJ_TYPE; row OLE2.OBJ_TYPE; args OLE2.List_Type; BEGIN application := OLE2.CREATE_OBJ('Excel.Application'); OLE2.SET_PROPERTY(application, 'Visible', 'True'); workbooks := OLE2.GET_OBJ_PROPERTY(app, 'Workbooks'); workbook := OLE2.INVOKE_OBJ(workbooks,'Add'); worksheets := OLE2.GET_OBJ_PROPERTY(workbook, 'Worksheets'); worksheet := OLE2.INVOKE_OBJ(worksheets,'Add'); args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, '1:10'); -- Задаем диапазон ячеек с первой по десятую row := OLE2.GET_OBJ_PROPERTY(worksheet, 'Rows', args); OLE2.DESTROY_ARGLIST(args); OLE2.SET_PROPERTY(row , 'RowHeight', 20); -- Устанавливаем высоту ячейки OLE2.SET_PROPERTY(row, 'Value', 4); -- Утанавливаем значение ячеек в диапазоне 1:10 равным четырем OLE2.RELEASE_OBJ(row); OLE2.RELEASE_OBJ(worksheet); OLE2.RELEASE_OBJ(worksheets); OLE2.RELEASE_OBJ(workbook); OLE2.RELEASE_OBJ(workbooks); OLE2.RELEASE_OBJ(app); EXCEPTION WHEN others THEN OLE2.Release_Obj( app ); message('Ошибка OLE'); END;Листинг 11.14. Размер ячейки DECLARE
- Вы можете применять функции Excel (листинг 11.15), используя для их вызова такие же имена, как и в Excel. Название этих функций можно просмотреть в окне "Мастер функций", которое вызывается командой меню Вставка|Функции.
Declare app OLE2.OBJ_TYPE; workbook OLE2.OBJ_TYPE; workbooks OLE2.OBJ_TYPE; worksheet OLE2.OBJ_TYPE; worksheets OLE2.OBJ_TYPE; cell OLE2.OBJ_TYPE; args OLE2.List_Type; BEGIN application := OLE2.CREATE_OBJ('Excel.Application'); OLE2.SET_PROPERTY(app, 'Visible', 'True'); workbooks := OLE2.GET_OBJ_PROPERTY(app, 'Workbooks'); workbook := OLE2.INVOKE_OBJ(workbooks,'Add'); -- Устанавливаем значение ячейки G7 равным 100 args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 7); OLE2.ADD_ARG(args, 'G'); cell := OLE2.GET_OBJ_PROPERTY(worksheet, 'Cells', args); OLE2.DESTROY_ARGLIST(args); OLE2.SET_PROPERTY(cell, 'Value', 100); OLE2.RELEASE_OBJ(cell); --Устанавливаем значение ячейки G8 равным 44 args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 8); OLE2.ADD_ARG(args, 'G'); cell := OLE2.GET_OBJ_PROPERTY(worksheet, 'Cells', args); OLE2.DESTROY_ARGLIST(args); OLE2.SET_PROPERTY(cell, 'Value', 44); OLE2.RELEASE_OBJ(cell); --Суммируем значение ячеек G7 и G8 args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 9); OLE2.ADD_ARG(args, 'G'); cell := OLE2.GET_OBJ_PROPERTY(worksheet, 'Cells', args); OLE2.DESTROY_ARGLIST(args); OLE2.SET_PROPERTY(cell, 'Formula', '=СУММ(G7;G8)'); OLE2.RELEASE_OBJ(cell); -- Извлекаем корень из значения ячейки G9 args := OLE2.CREATE_ARGLIST; OLE2.ADD_ARG(args, 10); OLE2.ADD_ARG(args, 'G'); cell := OLE2.GET_OBJ_PROPERTY(worksheet, 'Cells', args); OLE2.DESTROY_ARGLIST(args); OLE2.SET_PROPERTY(cell, 'Formula', '=КОРЕНЬ(G9)'); OLE2.RELEASE_OBJ(cell); OLE2.RELEASE_OBJ(worksheet); OLE2.RELEASE_OBJ(worksheets); OLE2.RELEASE_OBJ(workbook); OLE2.RELEASE_OBJ(workbooks); OLE2.RELEASE_OBJ(app); EXCEPTION WHEN others THEN OLE2.Release_Obj( app ); message('Ошибка OLE'); END;Листинг 11.15 . Использование формул Excel