Мельница данных  (06.12.2022)
Использование пользовательских приложений.
Библиотека ParusInfoProvider.dll содержит реализацию провайдера для БД Парус8. Провайдер реализует, в дополнение к обязательным, интерфейс, позволяющий управлять им посредством механизма "Пользовательских приложений":
1  IParusProvider = interface(IDispatch)
2    ['{4864AE99-80E6-4FC6-9DB0-EAB248F72362}']
3    procedure Connect(const Database: WideString;
4      const UserName: WideString; 
5      const Password: WideString); safecall;
6    property QueryObject: OleVariant;
7    property StoredProcObject: OleVariant;
8  end;
Объект-провайдер может установить связь с БД либо самостоятельно с использованием переданных в метод Connect параметров соединения, либо с помощью объектов Query и StoredProc , предоставляемых системой Парус8 для использования в пользовательских приложениях. В свою очередь, созданный провайдер с установленным соединением может быть передан в метод Execute объекта QueryBuilder.Application . Вторым параметром может быть передано значение, представляющее структуру запроса. Это может быть либо строка с указанием имени файла, либо объект, реализующий интерфейс IStream (например, MSXML.DOMDocument ), либо строка, представляющая собой xml-документ. Все средства манипуляции структурой и поведением запроса предоставляются на уровне работы с xml-документом, описывающим запрос.
Пример
Пример скрипта пользовательского приложения на DelphiScript
01procedure QueryBuilderTest;
02var
03  LApplication: OleVarint;
04  LProvider: OleVarint;
05  LDocument: OleVariant;
06begin
07  //описание структуры запроса. Из BLOB, из файла, из строки - откуда угодно
08  LDocument := CreateOleObject('MSXML.DOMDocument');
09  //LDocument реализует IXMLDOMDocument и IStream
10  LDocument.loadXML('<Query Provider="{B3079C97-6EBC-43EB-880F-58F094B322B0}">' +
11    '<Item Type="Table" Table="AGNLIST" Alias="MAIN" TableAlias="MAIN">'  +
12      '<Item ColumnIndex="0" Type="Field" Field="AGNABBR" Table="AGNLIST" ' + 
13        'Alias="MAIN_AGNABBR" TableAlias="MAIN"/>' +
14      '<Item ColumnIndex="1" Type="Field" Field="VERSION" Table="AGNLIST" ' + 
15        'Alias="MAIN_VERSION" TableAlias="MAIN"/>' +
16    '</Item>' +
17  '</Query>');
18
19  //Скрытие дерева структуры
20  LDocument.documentElement.setAttribute('TreeWidth', 0);
21
22  //Наложение условий отбора на колонку
23  LDocument.selectSingleNode('/*/Item/Item[@Field="AGNABBR" and @Table="AGNLIST"]').
24    setAttribute('ColumnFilter', 'Б*');
25
26  //Переименование колонки
27  LDocument.selectSingleNode('/*/Item/Item[@Field="VERSION" and @Table="AGNLIST"]').
28    setAttribute('Caption', 'Версия');
29
30
31  //создание провайдера и передача ему объектов для соединения с БД
32  LProvider := CreateOleObject('ParusInfoProvider.ParusProvider');
33  LProvider.QueryObject := Query;
34  LProvider.StoredProcObject := StoredProc;
35
36  //создание и использование объекта-приложения QueryBuilder
37  LApplication := CreateOleObject('QueryBuilder.Application');
38
39  //В качестве второго параметра передается ОБЪЕКТ, через 
40  //   IStream содержащий структуру запроса
41  LApplication.Execute(LProvider, LDocument);
42  LApplication.Visible := True;
43
44  //Ожидание завершения работы с приложением
45  repeat
46    Application.ProcessMessages;
47  until not LApplication.Visible;
48
49end;
50
Интерфейс автоматизации поддерживает также метод для автоматического применения шаблона для переноса в Excel.
Пример
Допустим, .MQR-файл, описывающий запрос, содержащий шаблон с именем "Простой Перенос" загружен в раздел "Модули пользовательских приложений" с мнемокодом "QueryData". Для этого необходимо создать модуль пользовательского приложения с типом "COM-сервер" или "Надстройка Excel" и загрузить из файла .MQR-файл. Проверки соответствия формата загружаемого файла заявленному типу модуля пользовательского приложения Парус не производит, что позволяет воспользоваться этим трюком. Тогда:
01procedure QueryBuilderTemplateTest;
02var
03  LApplication: OleVarint;
04  LProvider: OleVarint;
05  S: string;
06begin
07  Query.SQL.Text := 'select BMODULE from V_UAMODULES where SCODE = :CODE';
08  //мнемокод модуля пользовательского приложения, содержащего
09  //загруженный .MQR-файл
10  Query.ParamByName('CODE').Value := 'QueryData';
11  Query.Open;
12  S := Query.FieldByName('BMODULE').AsString;
13  Query.Close;
14
15 //создание провайдера и передача ему объектов для соединения с БД
16  LProvider := CreateOleObject('ParusInfoProvider.ParusProvider');
17  LProvider.QueryObject := Query;
18  LProvider.StoredProcObject := StoredProc;
19
20  //создание и использование объекта-приложения QueryBuilder
21  LApplication := CreateOleObject('QueryBuilder.Application');
22
23  //В качестве второго параметра передается СТРОКА, содержащая xml с описанием
24  //структуры запроса и шаблоны для переноса в Excel
25  LApplication.ExecuteTemplate(LProvider, S, 'Простой Перенос');
26end;