Опубликован: 25.09.2009 | Уровень: специалист | Доступ: платный
Лекция 11:

Oracle Forms и Excel

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

Выгрузка данных в 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, "который мы будем называть "Заказ" и который мы будем загружать в нашу БД".

Как видите, файл "Заказ" имеет сложную структуру и поэтому состоит из трех частей:

  1. Описание письма и заказчика.
  2. Товар.
  3. Характеристика товара.

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

Перед тем как вставлять полученные данные в рабочие таблицы, выгрузим данные документа во временные таблицы Excel1 и Excel2.

В таблицу Excel1 мы будем выгружать информацию о товаре, а в таблицу Excel2 - информацию о свойствах и количестве товара. В листинге 11.8 приведен пример загрузки документа во временные таблицы. Для упрощения примера процедура разбита на две части, где первая часть - это выгрузка информации о заказчике, а вторая часть - выгрузка информации о товаре и его характеристиках.

Макет файла Excel

Рис. 11.1. Макет файла Excel

Информацию о заказчике мы будем выгружать непосредственно в форму, а именно в элементы блока данных " 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.

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
< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет
Андрей Кошелев
Андрей Кошелев
Россия, Москва, Московская Финансово-Юридическая Академия
Артем Чуйко
Артем Чуйко
Россия, Самара