Совершенствование приложений Oracle Forms

Oracle Forms и Excel

Разбить на страницы
Показывать лекцию целиком

Чтение данных из Excel

Несмотря на то что в Oracle есть свой построитель отчетов, иногда возникает потребность в нерегламентированных отчетах, то есть в тех отчетах, которые были не предусмотрены в ходе проектирования системы. Существует необходимость в загрузке данных из различных внешних источников, что обусловлено многообразием форм представления и хранения данных. Каждая среда разработки предоставляет различные интерфейсы экспорта и импорта данных; Oracle Forms, в свою очередь, поддерживает достаточно много технологий для осуществления загрузки и выгрузки данных из внешних источников.

В этой главе мы рассмотрим возможные способы экспорта и импорта данных между приложениями Excel и Oracle Forms с помощью пакета . В конце главы будет приведен пример экспорта и импорта данных с помощью технологии .

Oracle Objects for OLE (OO4O)

Oracle Objects for OLE ( OO4O ) - это разработанный компанией Oracle набор СОМ-компонентов, совместимых с OLE Automation, который позволяет работать с Oracle из клиентских приложений с использованием скриптовых языков. Этот метод лучше подходит для работы с Oracle, чем Microsoft Open Database Connectivity (ODBC), к тому же OO4O предоставляют полную поддержку PL/SQL. Oracle Objects состоят из трех компонент:

  • OLE 2.0 Automation (InProcess) Server - эта компонента предоставляет интерфейс OLE Automation для приложений, поддерживающих OLE automation scripting (например, Visual Basic).
  • Oracle Data Control - управляющий элемент для Visual Basic.
  • Two C++ Class Libraries - C-библиотеки для Microsoft Foundation Classes (MFC) и Borland (OWL).
  • Особенно хорошо то, что вы можете использовать OO4O из любых приложений MS Office, применяющих VB-подобный язык макросов.

    Ниже приведен простой пример создания соединения с базой данных 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:

  • Доступ к данным осуществляется через идентификатор строки - rowid, а не через первичный ключ или уникальный индекс в подходе VB/ODBC. Если rowid доступен, то данные доступны для корректировки.
  • Возможность создавать связываемые переменных в SQL-предложениях (т. е. " SELECT * FROM EMP WHERE ENAME = :name "). PL/SQL также поддерживает связывание переменных.
  • Пакет TEXT_IO

    Пакет TEXT_IO в Oracle Forms обеспечивает доступ к файлам операционной системы.

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

    Возможность использовать пакет Text_IO появилась в Oracle Developer 2000 (Forms 4.5). Рассмотрим пример выгрузки данных с помощью набора процедур и функций пакета TEXT_IO:

    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-файлами. Такое количество подходов дает вам возможность выбрать для себя наиболее удобный способ импорта и экспорта данных. Мы же с вами рассмотрим пример с использованием технологии .

    Object Linking and Embedding

    Мы уже изучали подробно эту технологию, когда применяли OLE-контейнер в нашем приложении. Сейчас же мы рассмотрим несколько иной вариант, а именно - встроенный пакет , который поддерживается во всех последних версиях Forms. Пакет сопровождает PL/SQL API для создания, манипулирования и доступа к атрибутам пакета .

    Запуск и установка соединения с EXCEL

    Для того чтобы манипулировать объектами , необходимо использовать определенный тип данных, который предназначен исклю-

    чительно для работы с пакетом OLE2. В листинге 11.1 в секции DECLARE показан пример объявления переменных пакета.

    DECLARE
    App ole2.obj_type;
    Book ole2.obj_type; 
    Cell ole2.obj_type; 
    Args ole2.list_type;
    …
    <другие переменные>
    … 
    BEGIN
     Null; 
    END;

    Для вызова методов пакета нужно указывать ключевое слово - ole2.[метод, тип]. Показанный в примере тип данных ole2.obj_type служит для объявления объектов OLE2, а ole2.list_type используется для объявления списка аргументов. Если провести аналогию, то тип данных ole2.list_type очень похож на тип данных ParamList, который также содержит список параметров.

    Следующим нашим шагом в изучении пакета OLE2 будет создание объектов OLE2 (листинг 11.2).

    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.
  • OLE2.Create_Obj - создает объект OLE2 Automation, например, Microsoft Word, Microsoft Excel.
  • OLE2.Destroy_Arglist - уничтожает список аргументов.
  • OLE2.Get_Char_Property - возвращает свойство объекта OLE2 Automation.
  • OLE2.Get_Num_Property - возвращает идентификатор значения объекта OLE2 Automation.
  • OLE2.Get_Obj_Property - возвращает значение объектного типа объекта OLE2 Automation.
  • OLE2.Invoke - выполняет метод OLE2.
  • OLE2.Invoke_Num - возвращает числовое (number) значение объекта OLE2 Automation, используя указанный метод.
  • OLE2.Invoke_Char - возвращает символьное (character) значение объекта OLE2 Automation, используя указанный метод.
  • OLE2.Invoke_Obj - возвращает значение типа объекта OLE2.
  • OLE2.IsSupported - возвращает TRUE, если OLE2 поддерживается на текущей платформе.
  • OLE2.Last_Exception - возвращает идентификатор последнего возбужденного исключения.
  • OLE2.Release_Obj - сигнализирует объекту OLE2 Automation, что PL/SQL-клиент больше не нуждается в нем.
  • OLE2.Set_Property - устанавливает значение указанного свойства объекта OLE2 Automation.
  • Методы пакета OLE2
    Метод Параметр Тип Значение
    PROCEDURE OLE2.ADD_ARG (параметры) list LIST TYPE Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    value VARCHAR2 [NUMBER] Значение добавляемого аргумента
    PROCEDURE OLE2.ADD_ARG_OBJ (параметры) list LIST TYPE Ссылка на объект списка
    value OBJ TYPE Значение аргумента obj_type, передаваемое серверу OLE2
    FUNCTION OLE2.CREATE _ARGLIST RETURN LIST_TYPE Возвращает ссылку на объект список
    FUNCTION OLE2.CREATE_OBJ (параметры) RETURN OBJECT_TYPE object VARCHAR2 Создает указанный объект OLE2 Automation
    PROCEDURE (параметры) OLE2.DESTROY_ARGLIST list LIST TYPE Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.GET_NUM _PROPERTY (параметры) RETURN NUMBER object OBJ TYPE Объект OLE2 Automation
    property VARCHAR2 Название свойства объекта OLE2, значение которого нужно изменить
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.GET_OBJ_PROPERTY (парамет ры) RETURN OBJ_TYPE object OBJ TYPE Объект OLE2 Automation
    property VARCHAR2 Название свойства объекта OLE2, значение которого нужно изменить
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    PROCEDURE OLE2.INVOKE (парамет ры) object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    list LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.INVOKE_NUM (парамет ры) RETURN NUMBER object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.INVOKE_CHAR (парамет ры) RETURN VARCHAR2 object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.INVOKE_OBJ (парамет ры) RETURN OBJ_TYPE object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.ISSUPPORTED RETURN BOOLEAN Возвращает TRUE, если OLE2 поддерживается на текущей платформе
    FUNCTION OLE2.LAST_EXCEPTION RETURN NUMBER message OUT VARCHAR2 Содержит текст ошибки OLE2
    PROCEDURE OLE2.RELEASE_OBJ (параметры) object OBJ TYPE Объект OLE2 Automation
    PROCEDURE OLE2.SET_PROPERTY (параметры) object OBJ TYPE Объект OLE2 Automation
    property VARCHAR2 Название свойства объекта OLE2, значение которого нужно изменить
    value NUMBER [VARCHAR2] Значение свойства
    arglist LIST TYPE Имя списка аргументов, созданного функцией OLE2.Create_Arglist

    В листинге 11.3 для отображения приложения EXCEL на экране применяется процедура OLE2.SET_PROPERTY. В этом примере мы также использовали тип данных ole2.list_type для создания списка аргументов. Для того чтобы загрузить в EXCEL нужный нам файл, мы добавили аргумент docname, в который сохраняли имя запускаемого файла, а затем активировали его с помощью параметра " Open " процедуры Invoke_obj.

    Выгрузка данных в 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, то после выбора файла значение "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;

    На этом наше знакомство с возможностями управления приложением 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;

    Основным отличием функции From_xls от предыдущего примера является строка ole2.get_char_property(cell, 'Value'), которая получает значение указанной ячейки.

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

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

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

    Перед тем как вставлять полученные данные в рабочие таблицы, выгрузим данные документа во временные таблицы 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

    Теперь, когда мы научились обмениваться данными между приложениями Excel и Forms, можно перейти к не менее важной части - управлению функциональными возможностями электронной таблицы. Ниже приведены небольшие примеры, которые позволят вам научиться управлять форматированием ячеек и основными командами меню "Файл" Excel.

  • В листинге 11.12 показан пример добавления листа (Sheet) Excel.
  • Declare
    app OLE2.OBJ_TYPE;
    workbooks OLE2.OBJ_TYPE;
    workbook OLE2.OBJ_TYPE;
    worksheet OLE2.OBJ_TYPE;
    Sheets OLE2.OBJ_TYPE;
    args OLE2.LIST_TYPE; begin
    Excel := OLE2.CREATE_OBJ('Excel.Application');
    OlE2.SET_PROPERTY(app,'Visible', TRUE);
    workbooks := OLE2.GET_OBJ_PROPERTY(Excel, 'Workbooks');
    workbook := OLE2.INVOKE_OBJ(workbooks,'Add');
    Sheets := OLE2.GET_OBJ_PROPERTY(workbook, 'Sheets'); OLE2.INVOKE(Sheets, 'Add'); ... exception
    when others then
    Message('Ошибка OLE'); end;
  • Опираясь на пример, приведенный в листинге 11.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.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;
  • Вы можете применять функции 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;
    Страницы:

    Чтение данных из Excel

    Несмотря на то что в Oracle есть свой построитель отчетов, иногда возникает потребность в нерегламентированных отчетах, то есть в тех отчетах, которые были не предусмотрены в ходе проектирования системы. Существует необходимость в загрузке данных из различных внешних источников, что обусловлено многообразием форм представления и хранения данных. Каждая среда разработки предоставляет различные интерфейсы экспорта и импорта данных; Oracle Forms, в свою очередь, поддерживает достаточно много технологий для осуществления загрузки и выгрузки данных из внешних источников.

    В этой главе мы рассмотрим возможные способы экспорта и импорта данных между приложениями Excel и Oracle Forms с помощью пакета . В конце главы будет приведен пример экспорта и импорта данных с помощью технологии .

    Oracle Objects for OLE (OO4O)

    Oracle Objects for OLE ( OO4O ) - это разработанный компанией Oracle набор СОМ-компонентов, совместимых с OLE Automation, который позволяет работать с Oracle из клиентских приложений с использованием скриптовых языков. Этот метод лучше подходит для работы с Oracle, чем Microsoft Open Database Connectivity (ODBC), к тому же OO4O предоставляют полную поддержку PL/SQL. Oracle Objects состоят из трех компонент:

  • OLE 2.0 Automation (InProcess) Server - эта компонента предоставляет интерфейс OLE Automation для приложений, поддерживающих OLE automation scripting (например, Visual Basic).
  • Oracle Data Control - управляющий элемент для Visual Basic.
  • Two C++ Class Libraries - C-библиотеки для Microsoft Foundation Classes (MFC) и Borland (OWL).
  • Особенно хорошо то, что вы можете использовать OO4O из любых приложений MS Office, применяющих VB-подобный язык макросов.

    Ниже приведен простой пример создания соединения с базой данных 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:

  • Доступ к данным осуществляется через идентификатор строки - rowid, а не через первичный ключ или уникальный индекс в подходе VB/ODBC. Если rowid доступен, то данные доступны для корректировки.
  • Возможность создавать связываемые переменных в SQL-предложениях (т. е. " SELECT * FROM EMP WHERE ENAME = :name "). PL/SQL также поддерживает связывание переменных.
  • Пакет TEXT_IO

    Пакет TEXT_IO в Oracle Forms обеспечивает доступ к файлам операционной системы.

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

    Возможность использовать пакет Text_IO появилась в Oracle Developer 2000 (Forms 4.5). Рассмотрим пример выгрузки данных с помощью набора процедур и функций пакета TEXT_IO:

    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-файлами. Такое количество подходов дает вам возможность выбрать для себя наиболее удобный способ импорта и экспорта данных. Мы же с вами рассмотрим пример с использованием технологии .

    Object Linking and Embedding

    Мы уже изучали подробно эту технологию, когда применяли OLE-контейнер в нашем приложении. Сейчас же мы рассмотрим несколько иной вариант, а именно - встроенный пакет , который поддерживается во всех последних версиях Forms. Пакет сопровождает PL/SQL API для создания, манипулирования и доступа к атрибутам пакета .

    Запуск и установка соединения с EXCEL

    Для того чтобы манипулировать объектами , необходимо использовать определенный тип данных, который предназначен исклю-

    чительно для работы с пакетом OLE2. В листинге 11.1 в секции DECLARE показан пример объявления переменных пакета.

    DECLARE
    App ole2.obj_type;
    Book ole2.obj_type; 
    Cell ole2.obj_type; 
    Args ole2.list_type;
    …
    <другие переменные>
    … 
    BEGIN
     Null; 
    END;

    Для вызова методов пакета нужно указывать ключевое слово - ole2.[метод, тип]. Показанный в примере тип данных ole2.obj_type служит для объявления объектов OLE2, а ole2.list_type используется для объявления списка аргументов. Если провести аналогию, то тип данных ole2.list_type очень похож на тип данных ParamList, который также содержит список параметров.

    Следующим нашим шагом в изучении пакета OLE2 будет создание объектов OLE2 (листинг 11.2).

    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.
  • OLE2.Create_Obj - создает объект OLE2 Automation, например, Microsoft Word, Microsoft Excel.
  • OLE2.Destroy_Arglist - уничтожает список аргументов.
  • OLE2.Get_Char_Property - возвращает свойство объекта OLE2 Automation.
  • OLE2.Get_Num_Property - возвращает идентификатор значения объекта OLE2 Automation.
  • OLE2.Get_Obj_Property - возвращает значение объектного типа объекта OLE2 Automation.
  • OLE2.Invoke - выполняет метод OLE2.
  • OLE2.Invoke_Num - возвращает числовое (number) значение объекта OLE2 Automation, используя указанный метод.
  • OLE2.Invoke_Char - возвращает символьное (character) значение объекта OLE2 Automation, используя указанный метод.
  • OLE2.Invoke_Obj - возвращает значение типа объекта OLE2.
  • OLE2.IsSupported - возвращает TRUE, если OLE2 поддерживается на текущей платформе.
  • OLE2.Last_Exception - возвращает идентификатор последнего возбужденного исключения.
  • OLE2.Release_Obj - сигнализирует объекту OLE2 Automation, что PL/SQL-клиент больше не нуждается в нем.
  • OLE2.Set_Property - устанавливает значение указанного свойства объекта OLE2 Automation.
  • Методы пакета OLE2
    Метод Параметр Тип Значение
    PROCEDURE OLE2.ADD_ARG (параметры) list LIST TYPE Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    value VARCHAR2 [NUMBER] Значение добавляемого аргумента
    PROCEDURE OLE2.ADD_ARG_OBJ (параметры) list LIST TYPE Ссылка на объект списка
    value OBJ TYPE Значение аргумента obj_type, передаваемое серверу OLE2
    FUNCTION OLE2.CREATE _ARGLIST RETURN LIST_TYPE Возвращает ссылку на объект список
    FUNCTION OLE2.CREATE_OBJ (параметры) RETURN OBJECT_TYPE object VARCHAR2 Создает указанный объект OLE2 Automation
    PROCEDURE (параметры) OLE2.DESTROY_ARGLIST list LIST TYPE Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.GET_NUM _PROPERTY (параметры) RETURN NUMBER object OBJ TYPE Объект OLE2 Automation
    property VARCHAR2 Название свойства объекта OLE2, значение которого нужно изменить
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.GET_OBJ_PROPERTY (парамет ры) RETURN OBJ_TYPE object OBJ TYPE Объект OLE2 Automation
    property VARCHAR2 Название свойства объекта OLE2, значение которого нужно изменить
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    PROCEDURE OLE2.INVOKE (парамет ры) object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    list LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.INVOKE_NUM (парамет ры) RETURN NUMBER object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.INVOKE_CHAR (парамет ры) RETURN VARCHAR2 object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.INVOKE_OBJ (парамет ры) RETURN OBJ_TYPE object OBJ TYPE Объект OLE2 Automation
    method VARCHAR2 Метод объекта OLE2
    arglist LIST TYPE:=0 Имя списка аргументов, созданного функцией OLE2.Create_Arglist
    FUNCTION OLE2.ISSUPPORTED RETURN BOOLEAN Возвращает TRUE, если OLE2 поддерживается на текущей платформе
    FUNCTION OLE2.LAST_EXCEPTION RETURN NUMBER message OUT VARCHAR2 Содержит текст ошибки OLE2
    PROCEDURE OLE2.RELEASE_OBJ (параметры) object OBJ TYPE Объект OLE2 Automation
    PROCEDURE OLE2.SET_PROPERTY (параметры) object OBJ TYPE Объект OLE2 Automation
    property VARCHAR2 Название свойства объекта OLE2, значение которого нужно изменить
    value NUMBER [VARCHAR2] Значение свойства
    arglist LIST TYPE Имя списка аргументов, созданного функцией OLE2.Create_Arglist

    В листинге 11.3 для отображения приложения EXCEL на экране применяется процедура OLE2.SET_PROPERTY. В этом примере мы также использовали тип данных ole2.list_type для создания списка аргументов. Для того чтобы загрузить в EXCEL нужный нам файл, мы добавили аргумент docname, в который сохраняли имя запускаемого файла, а затем активировали его с помощью параметра " Open " процедуры Invoke_obj.

    Выгрузка данных в 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, то после выбора файла значение "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;

    На этом наше знакомство с возможностями управления приложением 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;

    Основным отличием функции From_xls от предыдущего примера является строка ole2.get_char_property(cell, 'Value'), которая получает значение указанной ячейки.

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

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

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

    Перед тем как вставлять полученные данные в рабочие таблицы, выгрузим данные документа во временные таблицы 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

    Теперь, когда мы научились обмениваться данными между приложениями Excel и Forms, можно перейти к не менее важной части - управлению функциональными возможностями электронной таблицы. Ниже приведены небольшие примеры, которые позволят вам научиться управлять форматированием ячеек и основными командами меню "Файл" Excel.

  • В листинге 11.12 показан пример добавления листа (Sheet) Excel.
  • Declare
    app OLE2.OBJ_TYPE;
    workbooks OLE2.OBJ_TYPE;
    workbook OLE2.OBJ_TYPE;
    worksheet OLE2.OBJ_TYPE;
    Sheets OLE2.OBJ_TYPE;
    args OLE2.LIST_TYPE; begin
    Excel := OLE2.CREATE_OBJ('Excel.Application');
    OlE2.SET_PROPERTY(app,'Visible', TRUE);
    workbooks := OLE2.GET_OBJ_PROPERTY(Excel, 'Workbooks');
    workbook := OLE2.INVOKE_OBJ(workbooks,'Add');
    Sheets := OLE2.GET_OBJ_PROPERTY(workbook, 'Sheets'); OLE2.INVOKE(Sheets, 'Add'); ... exception
    when others then
    Message('Ошибка OLE'); end;
  • Опираясь на пример, приведенный в листинге 11.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.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;
  • Вы можете применять функции 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;
    Вернуться к учебному плану