Несмотря на то что в Oracle есть свой построитель отчетов, иногда возникает потребность в нерегламентированных отчетах, то есть в тех отчетах, которые были не предусмотрены в ходе проектирования системы. Существует необходимость в
В этой главе мы рассмотрим возможные способы экспорта и импорта данных между приложениями Excel и
Oracle Objects for
Особенно хорошо то, что вы можете использовать
Ниже приведен простой пример создания соединения с базой данных Oracle на Visual Basic:
Sub Form_Load ()
Dim OraSession As Object 'Declare variables as OLE Objects
Dim OraDatabase As Object
Dim OraDynaset As Object
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.DbOpenDatabase("SQL*Net_Connect_
String", "scott/tiger", 0)
MsgBox "Connected to " OraDatabase.Connect "@" OraDatabase.DatabaseName
'Create the OraDynaset Object and display the first value
Set OraDynaset = OraDatabase.DbCreateDynaset("select empno, ename from emp", 0)
MsgBox "Employee " OraDynaset.Fields("empno").value ", #" OraDynaset.Fields("ename").value
End Sub
Технология OO40 имеет солидное преимущество над другим подходом - VB/JET/ODBC:
SELECT * FROM EMP WHERE ENAME = :name "). PL/SQL также поддерживает связывание переменных.Пакет
Пакет
Возможность использовать пакет
declare
out_file Text_IO.File_Type;
flnm varchar2(200);
begin
flnm := GET_FILE_NAME ('H:\', 'file_name.xls',
'XLS Files (*.xls)|*.xls|', NULL, SAVE_FILE, TRUE);
out_file:=Text_IO.Fopen (flnm, 'w');
LOOP
Text_IO.New_Line (out_file);
Text_IO.Put (out_file, :eid);
Text_IO.Put (out_file, CHR(9));
Text_IO.Put (out_file, :NM);
IF :system.last_record = 'TRUE' THEN
EXIT;
ELSE
next_record;
END IF;
Text_IO.Fclose (out_file);
end;
В этом разделе мы рассмотрели и проработали возможные варианты работы с Excel-файлами. Такое количество подходов дает вам возможность выбрать для себя наиболее удобный способ импорта и экспорта данных. Мы же с вами рассмотрим пример с использованием технологии .
Мы уже изучали подробно эту технологию, когда применяли
Для того чтобы манипулировать объектами , необходимо использовать определенный тип данных, который предназначен исклю-
чительно для работы с пакетом
DECLARE App ole2.obj_type; Book ole2.obj_type; Cell ole2.obj_type; Args ole2.list_type; … <другие переменные> … BEGIN Null; END;
Для вызова методов пакета нужно указывать ключевое слово - . Показанный в примере тип данных служит для объявления объектов используется для объявления списка аргументов. Если провести аналогию, то тип данных очень похож на тип данных ParamList, который также содержит список параметров.
Следующим нашим шагом в изучении пакета
DECLARE
App ole2.obj_type;
BEGIN
App:=OLE2.Create_Obj('Excel.Application');
END;
Для того чтобы проверить вышеописанный код, создайте произвольную форму с одной кнопкой. Создайте для кнопки обработчик WHEN-BUTTON-PRESSED и выполните в нем приведенный код. Когда в режиме выполнения формы вы нажмете на кнопку, ничего не произойдет, но это на первый взгляд, на самом же деле если вы откроете "Диспетчер задач", то увидите процесс EXCEL.EXE. Теперь, для того чтобы увидеть электронную таблицу в рабочей области, а не в диспетчере задач, добавьте в тело триггера код, приведенный в листинге 11.3, который не только отображает приложение EXCEL, но и загружает указанный файл.
DECLARE
App ole2.obj_type;
Book ole2.obj_type;
DocName varchar2(100);
WorkbooksCollection ole2.obj_type;
Sheets ole2.obj_type;
Sheet 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);
END;
Для того чтобы вам было легко разобраться с примерами, которые будут приведены далее, ознакомьтесь с синтаксисом некоторых методов пакета (табл. 11.1).
OLE2 .Add_Arg - добавляет аргумент в OLE2 .Add_Arg_Obj - добавляет объект-аргумент в OLE2 .Create_arglist - создает OLE2 .Create_Obj - создает объект OLE2 .Destroy_Arglist - уничтожает OLE2 .Get_Char_Property - возвращает свойство объекта OLE2 Automation .OLE2 .Get_Num_Property - возвращает идентификатор значения объекта OLE2 Automation .OLE2 .Get_Obj_Property - возвращает значение OLE2 Automation .OLE2 .Invoke - выполняет метод OLE2 .Invoke_Num - возвращает числовое (number) значение объекта OLE2 Automation , используя указанный метод.OLE2 .Invoke_Char - возвращает символьное (character) значение объекта OLE2 Automation , используя указанный метод.OLE2 .Invoke_Obj - возвращает значение типа объекта OLE2 .IsSupported - возвращает TRUE, если OLE2 .Last_Exception - возвращает идентификатор последнего возбужденного исключения.OLE2 .Release_Obj - сигнализирует объекту OLE2 Automation , что PL/SQL-клиент больше не нуждается в нем.OLE2 .Set_Property - устанавливает значение указанного свойства объекта OLE2 Automation .| Метод | Параметр | Тип | Значение |
|---|---|---|---|
| PROCEDURE OLE2.ADD_ARG (параметры) | list | LIST TYPE | Имя списка аргументов, |
| value | VARCHAR2 [NUMBER] | Значение добавляемого аргумента | |
| PROCEDURE OLE2.ADD_ARG_OBJ (параметры) | list | LIST TYPE | Ссылка на объект списка |
| value | Значение аргумента obj_type, передаваемое серверу |
||
| FUNCTION OLE2.CREATE _ARGLIST RETURN LIST_TYPE | Возвращает ссылку на объект список | ||
| FUNCTION OLE2.CREATE_OBJ (параметры) RETURN OBJECT_TYPE | object | VARCHAR2 | Создает указанный объект |
| PROCEDURE (параметры) OLE2.DESTROY_ARGLIST | list | LIST TYPE | Имя списка аргументов, |
| FUNCTION OLE2.GET_NUM _PROPERTY (параметры) RETURN NUMBER | object | Объект |
|
| property | VARCHAR2 | Название свойства объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.GET_OBJ_PROPERTY (парамет ры) RETURN OBJ_TYPE | object | Объект |
|
| property | VARCHAR2 | Название свойства объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| PROCEDURE OLE2.INVOKE (парамет ры) | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| list | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.INVOKE_NUM (парамет ры) RETURN NUMBER | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.INVOKE_CHAR (парамет ры) RETURN VARCHAR2 | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.INVOKE_OBJ (парамет ры) RETURN OBJ_TYPE | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.ISSUPPORTED RETURN BOOLEAN | Возвращает TRUE, если |
||
| FUNCTION OLE2.LAST_EXCEPTION RETURN NUMBER | message OUT | VARCHAR2 | Содержит текст ошибки |
| PROCEDURE OLE2.RELEASE_OBJ (параметры) | object | Объект |
|
| PROCEDURE OLE2.SET_PROPERTY (параметры) | object | Объект |
|
| property | VARCHAR2 | Название свойства объекта |
|
| value | NUMBER [VARCHAR2] | Значение свойства | |
| arglist | LIST TYPE | Имя списка аргументов, |
|
В листинге 11.3 для отображения приложения EXCEL на экране применяется процедура . В этом примере мы также использовали тип данных для создания списка аргументов. Для того чтобы загрузить в EXCEL нужный нам файл, мы добавили аргумент docname, в который сохраняли имя запускаемого файла, а затем активировали его с помощью параметра " Open " процедуры Invoke_obj.
Теперь, когда мы ознакомились со всеми методами пакета
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, то после выбора файла значение "Value from Forms" загрузится в
... <листинг 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;
На этом наше знакомство с возможностями управления приложением Excel не закончено, так как в конце главы будет показано несколько полезных примеров, которые научат вас управлять шрифтами и цветами, а пока приступим к рассмотрению примера
Когда мы работаем с приложением Excel, то реже всего мы сталкиваемся с обратной проблемой, а именно с загрузкой данных в форму из электронной таблицы. В листинге 11.6 приведен код функции, которая возвращает значение 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;
Основным отличием функции From_xls от предыдущего примера является строка , которая получает значение указанной
Создайте кнопку и в триггере WHEN-BUTTON-PRESSED вызовите функцию From_xls, как показано в листинге 11.7.
Message('Value from Excel: '||from_xls(1,1));
Мы с вами рассмотрели простые примеры, в которых передавали значение из Excel в Forms и наоборот, но иногда требуется выгружать целые таблицы из Forms в Excel или, наоборот, загружать сложные документы Excel в форму. Рассмотрим пример, когда необходимо разработать систему приема заказов, причем все заказы приходят в виде Excel-заявок. Для рассмотрения примера мы будем использовать форму Master_Detail, созданную в главе "Блоки". На рис. 11.1 показан файл Excel -
Как видите, файл "Заказ" имеет сложную структуру и поэтому состоит из трех частей:
Перед нами стоит задача загрузки документа в форму по одному нажатию кнопки, то есть мы должны проследить, чтобы данные были не только загружены, но и сохранены в том порядке и соотношении, в котором они находятся. Приведенный пример не является оптимальным, поэтому в ваших силах написать более производительное и функциональное решение.
Перед тем как вставлять полученные данные в рабочие таблицы, выгрузим данные документа во временные таблицы Excel1 и Excel2.
В таблицу Excel1 мы будем выгружать информацию о товаре, а в таблицу Excel2 - информацию о свойствах и количестве товара. В листинге 11.8 приведен пример загрузки документа во временные таблицы. Для упрощения примера процедура разбита на две части, где первая часть - это выгрузка информации о заказчике, а вторая часть - выгрузка информации о товаре и его характеристиках.
(рис 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;
Как видите, процедура получается довольно-таки объемной, хотя мы загрузили только первую часть документа. Перейдем ко второй части - загрузка информации о товаре. Для получения таблицы 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;
Перейдем к третьей части - получению информации о характеристических данных товара. Для выгрузки данных напишем новую процедуру - 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;
Информация получена, и документ в раздробленном состоянии находится в базе. Наша дальнейшая задача - это связывание данных, находящихся в таблицах 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;
В этом листинге мы объявили два курсора, чтобы считать данные с таблиц Excel1 и Excel2, причем
Теперь, когда мы научились обмениваться данными между приложениями 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;
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;
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;
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;
Несмотря на то что в Oracle есть свой построитель отчетов, иногда возникает потребность в нерегламентированных отчетах, то есть в тех отчетах, которые были не предусмотрены в ходе проектирования системы. Существует необходимость в
В этой главе мы рассмотрим возможные способы экспорта и импорта данных между приложениями Excel и
Oracle Objects for
Особенно хорошо то, что вы можете использовать
Ниже приведен простой пример создания соединения с базой данных Oracle на Visual Basic:
Sub Form_Load ()
Dim OraSession As Object 'Declare variables as OLE Objects
Dim OraDatabase As Object
Dim OraDynaset As Object
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.DbOpenDatabase("SQL*Net_Connect_
String", "scott/tiger", 0)
MsgBox "Connected to " OraDatabase.Connect "@" OraDatabase.DatabaseName
'Create the OraDynaset Object and display the first value
Set OraDynaset = OraDatabase.DbCreateDynaset("select empno, ename from emp", 0)
MsgBox "Employee " OraDynaset.Fields("empno").value ", #" OraDynaset.Fields("ename").value
End Sub
Технология OO40 имеет солидное преимущество над другим подходом - VB/JET/ODBC:
SELECT * FROM EMP WHERE ENAME = :name "). PL/SQL также поддерживает связывание переменных.Пакет
Пакет
Возможность использовать пакет
declare
out_file Text_IO.File_Type;
flnm varchar2(200);
begin
flnm := GET_FILE_NAME ('H:\', 'file_name.xls',
'XLS Files (*.xls)|*.xls|', NULL, SAVE_FILE, TRUE);
out_file:=Text_IO.Fopen (flnm, 'w');
LOOP
Text_IO.New_Line (out_file);
Text_IO.Put (out_file, :eid);
Text_IO.Put (out_file, CHR(9));
Text_IO.Put (out_file, :NM);
IF :system.last_record = 'TRUE' THEN
EXIT;
ELSE
next_record;
END IF;
Text_IO.Fclose (out_file);
end;
В этом разделе мы рассмотрели и проработали возможные варианты работы с Excel-файлами. Такое количество подходов дает вам возможность выбрать для себя наиболее удобный способ импорта и экспорта данных. Мы же с вами рассмотрим пример с использованием технологии .
Мы уже изучали подробно эту технологию, когда применяли
Для того чтобы манипулировать объектами , необходимо использовать определенный тип данных, который предназначен исклю-
чительно для работы с пакетом
DECLARE App ole2.obj_type; Book ole2.obj_type; Cell ole2.obj_type; Args ole2.list_type; … <другие переменные> … BEGIN Null; END;
Для вызова методов пакета нужно указывать ключевое слово - . Показанный в примере тип данных служит для объявления объектов используется для объявления списка аргументов. Если провести аналогию, то тип данных очень похож на тип данных ParamList, который также содержит список параметров.
Следующим нашим шагом в изучении пакета
DECLARE
App ole2.obj_type;
BEGIN
App:=OLE2.Create_Obj('Excel.Application');
END;
Для того чтобы проверить вышеописанный код, создайте произвольную форму с одной кнопкой. Создайте для кнопки обработчик WHEN-BUTTON-PRESSED и выполните в нем приведенный код. Когда в режиме выполнения формы вы нажмете на кнопку, ничего не произойдет, но это на первый взгляд, на самом же деле если вы откроете "Диспетчер задач", то увидите процесс EXCEL.EXE. Теперь, для того чтобы увидеть электронную таблицу в рабочей области, а не в диспетчере задач, добавьте в тело триггера код, приведенный в листинге 11.3, который не только отображает приложение EXCEL, но и загружает указанный файл.
DECLARE
App ole2.obj_type;
Book ole2.obj_type;
DocName varchar2(100);
WorkbooksCollection ole2.obj_type;
Sheets ole2.obj_type;
Sheet 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);
END;
Для того чтобы вам было легко разобраться с примерами, которые будут приведены далее, ознакомьтесь с синтаксисом некоторых методов пакета (табл. 11.1).
OLE2 .Add_Arg - добавляет аргумент в OLE2 .Add_Arg_Obj - добавляет объект-аргумент в OLE2 .Create_arglist - создает OLE2 .Create_Obj - создает объект OLE2 .Destroy_Arglist - уничтожает OLE2 .Get_Char_Property - возвращает свойство объекта OLE2 Automation .OLE2 .Get_Num_Property - возвращает идентификатор значения объекта OLE2 Automation .OLE2 .Get_Obj_Property - возвращает значение OLE2 Automation .OLE2 .Invoke - выполняет метод OLE2 .Invoke_Num - возвращает числовое (number) значение объекта OLE2 Automation , используя указанный метод.OLE2 .Invoke_Char - возвращает символьное (character) значение объекта OLE2 Automation , используя указанный метод.OLE2 .Invoke_Obj - возвращает значение типа объекта OLE2 .IsSupported - возвращает TRUE, если OLE2 .Last_Exception - возвращает идентификатор последнего возбужденного исключения.OLE2 .Release_Obj - сигнализирует объекту OLE2 Automation , что PL/SQL-клиент больше не нуждается в нем.OLE2 .Set_Property - устанавливает значение указанного свойства объекта OLE2 Automation .| Метод | Параметр | Тип | Значение |
|---|---|---|---|
| PROCEDURE OLE2.ADD_ARG (параметры) | list | LIST TYPE | Имя списка аргументов, |
| value | VARCHAR2 [NUMBER] | Значение добавляемого аргумента | |
| PROCEDURE OLE2.ADD_ARG_OBJ (параметры) | list | LIST TYPE | Ссылка на объект списка |
| value | Значение аргумента obj_type, передаваемое серверу |
||
| FUNCTION OLE2.CREATE _ARGLIST RETURN LIST_TYPE | Возвращает ссылку на объект список | ||
| FUNCTION OLE2.CREATE_OBJ (параметры) RETURN OBJECT_TYPE | object | VARCHAR2 | Создает указанный объект |
| PROCEDURE (параметры) OLE2.DESTROY_ARGLIST | list | LIST TYPE | Имя списка аргументов, |
| FUNCTION OLE2.GET_NUM _PROPERTY (параметры) RETURN NUMBER | object | Объект |
|
| property | VARCHAR2 | Название свойства объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.GET_OBJ_PROPERTY (парамет ры) RETURN OBJ_TYPE | object | Объект |
|
| property | VARCHAR2 | Название свойства объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| PROCEDURE OLE2.INVOKE (парамет ры) | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| list | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.INVOKE_NUM (парамет ры) RETURN NUMBER | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.INVOKE_CHAR (парамет ры) RETURN VARCHAR2 | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.INVOKE_OBJ (парамет ры) RETURN OBJ_TYPE | object | Объект |
|
| method | VARCHAR2 | Метод объекта |
|
| arglist | LIST TYPE:=0 | Имя списка аргументов, |
|
| FUNCTION OLE2.ISSUPPORTED RETURN BOOLEAN | Возвращает TRUE, если |
||
| FUNCTION OLE2.LAST_EXCEPTION RETURN NUMBER | message OUT | VARCHAR2 | Содержит текст ошибки |
| PROCEDURE OLE2.RELEASE_OBJ (параметры) | object | Объект |
|
| PROCEDURE OLE2.SET_PROPERTY (параметры) | object | Объект |
|
| property | VARCHAR2 | Название свойства объекта |
|
| value | NUMBER [VARCHAR2] | Значение свойства | |
| arglist | LIST TYPE | Имя списка аргументов, |
|
В листинге 11.3 для отображения приложения EXCEL на экране применяется процедура . В этом примере мы также использовали тип данных для создания списка аргументов. Для того чтобы загрузить в EXCEL нужный нам файл, мы добавили аргумент docname, в который сохраняли имя запускаемого файла, а затем активировали его с помощью параметра " Open " процедуры Invoke_obj.
Теперь, когда мы ознакомились со всеми методами пакета
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, то после выбора файла значение "Value from Forms" загрузится в
... <листинг 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;
На этом наше знакомство с возможностями управления приложением Excel не закончено, так как в конце главы будет показано несколько полезных примеров, которые научат вас управлять шрифтами и цветами, а пока приступим к рассмотрению примера
Когда мы работаем с приложением Excel, то реже всего мы сталкиваемся с обратной проблемой, а именно с загрузкой данных в форму из электронной таблицы. В листинге 11.6 приведен код функции, которая возвращает значение 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;
Основным отличием функции From_xls от предыдущего примера является строка , которая получает значение указанной
Создайте кнопку и в триггере WHEN-BUTTON-PRESSED вызовите функцию From_xls, как показано в листинге 11.7.
Message('Value from Excel: '||from_xls(1,1));
Мы с вами рассмотрели простые примеры, в которых передавали значение из Excel в Forms и наоборот, но иногда требуется выгружать целые таблицы из Forms в Excel или, наоборот, загружать сложные документы Excel в форму. Рассмотрим пример, когда необходимо разработать систему приема заказов, причем все заказы приходят в виде Excel-заявок. Для рассмотрения примера мы будем использовать форму Master_Detail, созданную в главе "Блоки". На рис. 11.1 показан файл Excel -
Как видите, файл "Заказ" имеет сложную структуру и поэтому состоит из трех частей:
Перед нами стоит задача загрузки документа в форму по одному нажатию кнопки, то есть мы должны проследить, чтобы данные были не только загружены, но и сохранены в том порядке и соотношении, в котором они находятся. Приведенный пример не является оптимальным, поэтому в ваших силах написать более производительное и функциональное решение.
Перед тем как вставлять полученные данные в рабочие таблицы, выгрузим данные документа во временные таблицы Excel1 и Excel2.
В таблицу Excel1 мы будем выгружать информацию о товаре, а в таблицу Excel2 - информацию о свойствах и количестве товара. В листинге 11.8 приведен пример загрузки документа во временные таблицы. Для упрощения примера процедура разбита на две части, где первая часть - это выгрузка информации о заказчике, а вторая часть - выгрузка информации о товаре и его характеристиках.
(рис 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;
Как видите, процедура получается довольно-таки объемной, хотя мы загрузили только первую часть документа. Перейдем ко второй части - загрузка информации о товаре. Для получения таблицы 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;
Перейдем к третьей части - получению информации о характеристических данных товара. Для выгрузки данных напишем новую процедуру - 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;
Информация получена, и документ в раздробленном состоянии находится в базе. Наша дальнейшая задача - это связывание данных, находящихся в таблицах 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;
В этом листинге мы объявили два курсора, чтобы считать данные с таблиц Excel1 и Excel2, причем
Теперь, когда мы научились обмениваться данными между приложениями 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;
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;
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;
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;
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.