Мельница данных- Разработка шаблонов  (раздел целиком)  (31.03.2020)
Разработка шаблонов

Шаблон представляет собой обычную рабочую книгу Excel.

Шаблоны для переноса данных в Excel физически интегрируются внутрь .MQR-файла и хранятся вместе с запросом. Разработку шаблона можно вести независимо, используя только Microsoft Excel (запуская его самостоятельно), а потом загрузить в файл запроса, а можно воспользоваться пунктом меню "Редактировать" на странице "Шаблоны".

Для взаимодействия с источником данных рабочая книга-шаблон должна содержать в любом модуле макрос с именем "Template" (без кавычек) с одним параметром. При выполнении переноса данных по этому шаблону QueryBuilder произведет вызов этого метода, передав в качестве фактического значения параметра объект, реализующий интерфейс IExternalQuery. Никаких других требований к рабочей книге-шаблону не выдвигается.
       
        В примере показан запрос на таблицу AGNLIST (провайдер Oracle), показывающий как простой перенос данных, так и сводную таблицу со сводной диаграммой распределения записей таблицы по полю CRN.
Пример запроса с шаблонами
В примере показан запрос на таблицу "TField" (провайдер Мельницы Данных), показывающий как простой перенос данных, так и сводную таблицу со сводной диаграммой распределения записей таблицы.
Пример запроса с шаблонами для Мельницы Данных`


1. Интерфейс IExternalQuery
Объект, реализующий этот интерфейс, передается в макрос генерации отчета Excel (Template). Все его свойства и методы доступны для испоьзования в процессе генерации отчета
  IExternalQuery = interface(IDispatch)
    ['{1A86D1DA-A56E-4D53-88F9-7A035D7D12B4}']
    function Select(const SQL: WideString): IExternalDataSet; safecall;
    function SelectedRecordsCount: Integer; safecall;
    function SelectedRecord(Index: Integer): OleVariant; safecall;
    procedure PlaceCurrentQuery(const Sheet: IDispatch; 
      CaptionsNeeded: WordBool = False; Row: Integer = 1; 
      Column: Integer = 1; ShiftRows: WordBool = True; 
      ShiftColumns: WordBool = False); safecall;
    procedure PlaceQuery(const Sheet: IDispatch; const DataSet: ExternalDataSet;
      Row: Integer = 1; Column: Integer = 1; ShiftRows: WordBool = True; 
      ShiftColumns: WordBool = False); safecall;
    property CurrentQuery: WideString;
  end;
  • функция Select возвращает объект, реализующий интерфейс IExternalDataSet с данными, полученными в результате запроса, заданного параметром SQL. Фактически метод является оберткой метода Perform объекта-провайдера IInfoProvider
  • функция SelectedRecordsCount возвращает количество записей, отмеченных пользователем в гриде в момент выгрузки в Excel
  • функция SelectedRecord возвращает первичный ключ отмеченной пользователем записи с номером Index
  • процедура PlaceCurrentQuery осуществляет перенос в указанное положение указанного рабочего листа данных текущего табличного представления. Параметр Sheet указывает на рабочий лист Excel, на который будет осуществляться перенос, параметр CaptionsNeeded определяет необходимость переноса заголовков колонок, параметры Row и Column определяют соответственно номер строки и столбца на рабочем листе Excel, начиная с которых будут расположены данные. Параметр ShiftRows определяет необходимость сдвига строк вниз при переносе данных (информация в ячейках, лежащих НИЖЕ строки, определенной параметром Row, будет либо затерта, либо сдвинута на требуемое число строк вниз. Параметр ShiftColumns определяет необходимость сдвига колонок вправо при переносе данных (информация в ячейках, лежащих ПРАВЕЕ столбца, определенного параметром Column, будет либо затерта, либо сдвинута на требуемое число строк вниз.
  • процедура PlaceQuery осуществляет перенос в указанное положение указанного рабочего листа данных заданного параметром DataSet набора данных. Параметр Sheet указывает на рабочий лист Excel, на который будет осуществляться перенос, параметр CaptionsNeeded определяет необходимость переноса заголовков колонок, параметры Row и Column определяют соответственно номер строки и столбца на рабочем листе Excel, начиная с которых будут расположены данные. Параметр ShiftRows определяет необходимость сдвига строк вниз при переносе данных (информация в ячейках, лежащих НИЖЕ строки, определенной параметром Row, будет либо затерта, либо сдвинута на требуемое число строк вниз. Параметр ShiftColumns определяет необходимость сдвига колонок вправо при переносе данных (информация в ячейках, лежащих ПРАВЕЕ столбца, определенного параметром Column, будет либо затерта, либо сдвинута на требуемое число строк вниз.
  • свойство CurrentQuery возвращает строку запроса, на основе которого постоено текущее табличное представление.

2. Интерфейс IExternalDataSet
Фактически, обертка над интерфейсом IDataSet .
  IExternalDataSet = interface(IDispatch)
    ['{CDC7992C-BB30-431C-9F81-3215175AD5AB}']
    procedure Next; safecall;
    function Eof: WordBool; safecall;
    property FieldCount: Integer;
    property FieldName[Index: Integer]: WideString;
    property Field[FieldIndex: OleVariant]: OleVariant;
  end;
Набор данных представляет собой однонаправленный курсор, каждая строка которого является набором именованных и нумерованных полей.
  • процедура Next осуществляет переход к следующей записи курсора.
  • функция Eof возвращает True в случае достижения конца курсора.
  • свойство FieldCount возвращает количество полей в строке курсора.
  • свойство FieldName возвращает имя поля с номером Index.
  • свойство Field возвращает значение поля, имя или номер которого задан параметром (если строка, то имя, если число, то номер). Допустимо возвращать значение Null для пустых полей.