Библиотека
ParusInfoProvider.dll содержит реализацию провайдера для БД Парус8. Провайдер реализует, в дополнение к обязательным, интерфейс, позволяющий управлять им посредством механизма "Пользовательских приложений":
IParusProvider = interface(IDispatch)
['{4864AE99-80E6-4FC6-9DB0-EAB248F72362}']
procedure Connect(const Database: WideString;
const UserName: WideString;
const Password: WideString); safecall;
property QueryObject: OleVariant;
property StoredProcObject: OleVariant;
end;
Объект-провайдер может установить связь с БД либо самостоятельно с использованием переданных в метод Connect параметров соединения, либо с помощью объектов
Query и
StoredProc , предоставляемых системой Парус8 для использования в пользовательских приложениях. В свою очередь, созданный провайдер с установленным соединением может быть передан в метод
Execute объекта
QueryBuilder.Application . Вторым параметром может быть передано значение, представляющее структуру запроса. Это может быть либо строка с указанием имени файла, либо объект, реализующий интерфейс
IStream (например,
MSXML.DOMDocument ), либо строка, представляющая собой xml-документ. Все средства манипуляции структурой и поведением запроса предоставляются на уровне работы с xml-документом, описывающим запрос.
| Пример скрипта пользовательского приложения на DelphiScript
procedure QueryBuilderTest;
var
LApplication: OleVarint;
LProvider: OleVarint;
LDocument: OleVariant;
begin
//описание структуры запроса. Из BLOB, из файла, из строки - откуда угодно
LDocument := CreateOleObject('MSXML.DOMDocument');
//LDocument реализует IXMLDOMDocument и IStream
LDocument.loadXML('<Query Provider="{B3079C97-6EBC-43EB-880F-58F094B322B0}">' +
'<Item Type="Table" Table="AGNLIST" Alias="MAIN" TableAlias="MAIN">' +
'<Item ColumnIndex="0" Type="Field" Field="AGNABBR" Table="AGNLIST" ' +
'Alias="MAIN_AGNABBR" TableAlias="MAIN"/>' +
'<Item ColumnIndex="1" Type="Field" Field="VERSION" Table="AGNLIST" ' +
'Alias="MAIN_VERSION" TableAlias="MAIN"/>' +
'</Item>' +
'</Query>');
//Скрытие дерева структуры
LDocument.documentElement.setAttribute('TreeWidth', 0);
//Наложение условий отбора на колонку
LDocument.selectSingleNode('/*/Item/Item[@Field="AGNABBR" and @Table="AGNLIST"]').
setAttribute('ColumnFilter', 'Б*');
//Переименование колонки
LDocument.selectSingleNode('/*/Item/Item[@Field="VERSION" and @Table="AGNLIST"]').
setAttribute('Caption', 'Версия');
//создание провайдера и передача ему объектов для соединения с БД
LProvider := CreateOleObject('ParusInfoProvider.ParusProvider');
LProvider.QueryObject := Query;
LProvider.StoredProcObject := StoredProc;
//создание и использование объекта-приложения QueryBuilder
LApplication := CreateOleObject('QueryBuilder.Application');
//В качестве второго параметра передается ОБЪЕКТ, через
// IStream содержащий структуру запроса
LApplication.Execute(LProvider, LDocument);
LApplication.Visible := True;
//Ожидание завершения работы с приложением
repeat
Application.ProcessMessages;
until not LApplication.Visible;
end;
|
Интерфейс автоматизации поддерживает также метод для автоматического применения шаблона для переноса в Excel.
| Допустим, .MQR-файл, описывающий запрос, содержащий шаблон с именем "Простой Перенос" загружен в раздел "Модули пользовательских приложений" с мнемокодом "QueryData". Для этого необходимо создать модуль пользовательского приложения с типом "COM-сервер" или "Надстройка Excel" и загрузить из файла .MQR-файл. Проверки соответствия формата загружаемого файла заявленному типу модуля пользовательского приложения Парус не производит, что позволяет воспользоваться этим трюком. Тогда:
procedure QueryBuilderTemplateTest;
var
LApplication: OleVarint;
LProvider: OleVarint;
S: string;
begin
Query.SQL.Text := 'select BMODULE from V_UAMODULES where SCODE = :CODE';
//мнемокод модуля пользовательского приложения, содержащего
//загруженный .MQR-файл
Query.ParamByName('CODE').Value := 'QueryData';
Query.Open;
S := Query.FieldByName('BMODULE').AsString;
Query.Close;
//создание провайдера и передача ему объектов для соединения с БД
LProvider := CreateOleObject('ParusInfoProvider.ParusProvider');
LProvider.QueryObject := Query;
LProvider.StoredProcObject := StoredProc;
//создание и использование объекта-приложения QueryBuilder
LApplication := CreateOleObject('QueryBuilder.Application');
//В качестве второго параметра передается СТРОКА, содержащая xml с описанием
//структуры запроса и шаблоны для переноса в Excel
LApplication.ExecuteTemplate(LProvider, S, 'Простой Перенос');
end;
|