Мельница данных- Интерфейсы взаимодействия с внешними подсистемами  (раздел целиком)  (24.03.2023)
Интерфейсы взаимодействия с внешними подсистемами

Системный слой платформы "Мельница данных" предоставляет сторонним системам ряд интерфейсов, дающих возможность обращаться к объектам базы данных и их свойствам, вызывать методы классов и объектов, осуществлять запросы к базе данных, управлять поведением элементов управления и проч.


1. Интерфейс IContext
01  IContext = interface(IDispatch)
02    ['{79847D79-A3BE-408F-B59F-662B91BC6350}']
03    function Handle: Integer;
04    function getName(ID: OleVariant): WideString;
05    function getDescription(ID: OleVariant): WideString;
06    function createDataSet(const TargetClassName: WideString):
07      IContextDataSet;
08    function executeMethod(const ClassName: WideString;
09      const MethodName: WideString;
10      Params: OleVariant): OleVariant;
11    function executeReport(const ClassName: WideString;
12      const TemplateName: WideString;
13      Params: OleVariant): IDispatch;
14    function getPropValue(const ClassName: WideString;
15      const PropName: WideString;
16      const ID: OleVariant): OleVariant;
17    procedure setPropValue(const ClassName: WideString;
18      const PropName: WideString;
19      const ID: OleVariant; Value: OleVariant);
20    function select(const ClassName: WideString;
21      QueryItems: OleVariant): IDispatch;
22    function enumerationItem(ItemIdentifier: OleVariant): WideString;
23    function getClass(const ClassName: WideString): WideString;
24    function createGUID: WideString;
25    procedure processStart(const Description: WideString;
26      ItemCount: Integer);
27    procedure processStep;
28    procedure processStop;
29    function PlaceDataSet(const Range: IDispatch;
30      const DataSet: IContextDataSet;
31      ShiftRows: WordBool; ShiftColumns: WordBool): Integer;
32    procedure DebugString(const Message: WideString);
33    procedure ExportObject(var Document: OleVariant; const ID: WideString;
34      const ClassID: WideString);
35    function callRoutine(const ClassName, RoutineName: WideString;
36      var RetValue: OleVariant; const ScriptPart: OleVariant): WordBool;
37    function getOleObject(const ClassID, AccessibleFileName: WideString): IDispatch;
38    function getResource(const Name: WideString): WideString;
39    function getTempFileName(const Extension: WideString): WideString;
40    function selectVaue(const ClassDomain: WideString;
41      const ExpressionContext: IContextExpressionInfo;
42      var Value: OleVariant): WordBool;
43    procedure raiseManagedException(const ExceptionMessage: WideString);
44    function getCRC(Data: OleVariant): WideString;
45    function downloadData(const Host: WideString; const Url: WideString;
46      const UserName: WideString; const Password: WideString;
47      NegotiateAuth: WordBool; PostData: OleVariant;
48      const PostContentType: WideString; PostDataIsBinary: WordBool;
49      CanCache: WordBool; NewSession: WordBool; TimeOut: Integer): OleVariant;
50    function createBinaryData: IDispatch;
51    function BinaryToBitmap(const Data: IDispatch): IDispatch; safecall;
52    function editValues(const ValuesList: WideString; const Title: WideString;
53      UseTabs: WordBool; HideOKButton: WordBool;
54      const ScriptPart: OleVariant): WordBool;
55    function MsgBox(const Prompt: WideString; Buttons: LongWord;
56      const Title: WideString;
57      const HelpFile: WideString; Context: LongWord): Integer;
58    function ShowMsgBox(const Prompt: WideString; Buttons: LongWord;
59      const Title: WideString;
60      const HelpFile: WideString; Context: LongWord): Integer;
61    function buildNamedFile(const Data: IDispatch; const StoredFileName: WideString;
62                            Propmpt: WordBool; Compress: WordBool): IDispatch;
63    procedure parseNamedFile(const NamedFile: IDispatch; out FileName: OleVariant;
64                             out Data: OleVariant);
65    procedure showView(const ViewName: WideString; Key: OleVariant;
66                       const DetailPropertyName: WideString);
67    procedure showDataSet(const DataSet: ContextDataSet; const Caption: WideString;
68                          ColumnCaptions: OleVariant; ColumnOnChangeHandlers: OleVariant;
69                          TakeActionsFromView: OleVariant);
70    function executeConsoleProcess(const CommandLine: WideString; MaxDuration: Integer;
71                                   const OutputData: OleVariant): Integer;
72    function createRaster: IDispatch;
73    function createZIPArchive: IDispatch;
74    function ConvertExcel(Source: OleVariant; const Format: WideString): IDispatch;
75    property ContextObject: IDispatch;
76    property Language: WideString;
77    property UserName: WideString;
78    property NegotiateAuth: WordBool;
79    property Variable[const Name: WideString; Persistent: WordBool]: OleVariant;
80  end;

Члены интерфейса доступны для использования в скриптах форм задания параметров, а также в отчетах как члены класса передаваемого контекстного объекта.

  • Функция Handle возвращает дескриптор главного окна приложения.
  • Функция getName возвращает имя объекта по его идентификатору.
  • Функция getDescription возвращает наименование объекта по его идентификатору.
  • Функция createDataSet создает набор данных, основанный на экземплярах класса, имя которого передано как параметр. Возвращаемый объект реализует интерфейс IContextDataSet.
  • Функция executeMethod осуществляет вызов метода с параметрами. Имя класса передается в параметре ClassName, имя вызываемого метода - в параметре MethodName. Если вызываемый метод явяется функцией, то результат ее выполнения возвращается как результат вызова executeMethod. Параметры вызова метода передаются через параметр Params следующим образом:
    • Для методов класса без параметров можно передавать любое значение, например, Null.
    • Для методов класса, имеющих один параметр, значение Params есть значение этого единственного параметра.
    • Для методов класса, имеющих более одного параметра, значение Params есть массив значений параметров.
      Пример
      VBScript, VBA LValue = executeMethod("TObject", "Round", Array(10.24, 1))
      JScript LValue = executeMethod("TObject", "Round", new Array(10.24, 1));
      Object Pascal LValue := executeMethod('TObject', 'Round', VarArrayOf([10.24, 1]));
    • Для методов экземпляра без параметров значение Params есть идентификатор объекта, для которого вызывается метод.
    • Для методов экземпляра, имеющих параметры, значение Params есть массив значений параметров. При этом первым элементом массива является идентификатор объекта, для которого вызывается метод.
      Пример
      VBScript, VBA executeMethod "TObject", "MergeTo", Array(LOldObject, LNewObject)
      JScript executeMethod("TObject", "MergeTo", new Array(LOldObject, LNewObject));
      Object Pascal executeMethod('TObject', 'MergeTo', VarArrayOf([LOldObject, LNewObject]));
  • Функция executeReport осуществляет вызов отчета с параметрами. Имя класса передается в параметре ClassName, имя вызываемого метода - в параметре TemplateName. Параметры вызова передаются в параметре Params аналогично вызову executeMethod. В результате вызова функции возвращается ссылка на рабочую книгу Microsoft Excel, документ Microsoft Word и так далее. Судьба приложения, в рамках которого создан возвращенный объект, остается на усмотрение вызывающей стороны. Если вызывающая сторона предполагает взаимодействие объекта с пользователем, то необходимо обеспечить видимость объекта-приложения (Application.Visible := True;). В противном случае необходимо закрыть приложение после освобождения объекта документа (Application.Quit).
  • Функция getPropValue возвращает значение свойства объекта. Имя класса, имя свойства и идентификатор объекта задаются в параметрах.
  • Процедура setPropValue устанавливает значение свойства объекта в значение, заданное параметром Value. Для очистки значения можно использовать пустую строку или значение Null. Имя класса, имя свойства и идентификатор объекта задаются в параметрах.
  • Функция select возвращает ссылку на XML-документ, содержащий в корневом элементе элементы, представляющие собой записи набора данных на основе класса ClassName (с полями, разнесенными по элементам), определяемого структурой параметра QueryItems.
  • Функция enumerationItem возвращает идентификатор элемента перечисления по имени.
    Пример
    VBScript, VBA LItemID = enumerationItem("rsReplicatableMetadata")
    JScript LItemID = enumerationItem("rsReplicatableMetadata");
    Object Pascal LItemID := enumerationItem('rsReplicatableMetadata');
  • Функция getClass возвращает идентификатор объекта типа Класс TClass (Классы) по имени.
    Пример
    VBScript, VBA LClassID = getClass("TDocumentType")
    JScript LClassID = getClass("TDocumentType");
    Object Pascal LClassID := getClass('TDocumentType');
  • функция createGUID является оберткой над функцией Windows API CoCreateGuid. Возвращает сгенерированный глобально-уникальный идентификатор, преобразованный в строку.
  • процедура processStart информирует систему о необходимости показать окно выполнения длительного процесса. Текст, описывающий процесс (он появляется в показываемом окне) задается параметром Description. В случае, если есть возможность определить количество "шагов" процесса, то это количество необходимо передать в параметре ItemCount. В случае, если параметр ItemCount больше нуля, окно выполнения будет снабжено индикатором прогресса. Если значение ItemCount равно нулю, то окно появится без индикатора прогресса. Если значение ItemCount меньше нуля, то решение о появлении окна будет принято системой самостоятельно на основании загрузки процессора и окно процесса не появится, если процесс завершится достаточно быстро.
  • процедура processStep информирует систему о завершении очередного "шага" процесса, что найдет отражение в индикаторе прогресса окна выполнения длительного процесса, если таковые случатся.
  • процедура processStop информирует систему о завершении длительного процесса, что приведет к закрытию окна выполнения длительного процесса, если таковое случится.
  • функция PlaceDataSet осуществляет перенос данных из набора, задаваемого параметром DataSet в некоторое место документа Microsoft Office. Место назначения определяется параметром Range следующим образом:
    Microsoft Word
    • Объект Range. По месту расположения этого объекта будет создана таблица (Table), в которой будут размещены данные из набора.
      Пример
      PlaceDataSet ThisDocument.Bookmarks("BookMarkName").Range, LDataSet
      Пример
      PlaceDataSet Selection.Range, LDataSet
    • Объект Document. В самом начале переданного документа будет создана таблица (Table), в которой будут размещены данные из набора.
      Пример
      PlaceDataSet ThisDocument, LDataSet
    Microsoft Excel
    • Объект Range. По месту расположения этого объекта (диапазона) будут размещены данные из набора. Если параметр ShiftRows задан и равен True, то заданный диапазон будет расширен вниз на необходимое количество строк, и информация, лежащая ниже переданного диапазона, будет по-прежнему лежать ниже. Если нет, то она (скорее всего) будет затёрта данными набора. Если параметр ShiftColumns задан и равен True, то этот диапазон будет расширен вправо на необходимое количество столбцов, и информация, лежащая правее переданного диапазона, будет по-прежнему лежать правее. Если нет, то она (скорее всего) будет затёрта данными набора.
      Пример
      PlaceDataSet Range("C4"), LDataSet
    • Объект WorkSheet. На переданном листе будут размещены данные из набора.
      Пример
      PlaceDataSet WorkSheets("HiddenSheet"), LDataSet
    Функция возвращает количество размещенных записей.
  • процедура DebugString выводит переданную в качестве аргумента строку в отладочный монитор.
  • процедура ExportObject осуществляет экспорт информации об объекте, задаваемом параметром ID в XML-документ, передаваемый в параметре Document. Если объект документа не был создан, то он создается автоматически. Если документ не имеет корневого узла, он будет создан автоматически.
    Пример
    01set LDataSet = CreateDataSet("TSecurityAccount")
    02
    03LDataSet.AddQueryItem qpWhat, "ID"
    04
    05set LDocument = CreateObject("Msxml2.DOMDocument.4.0") 'Не обязательно.
    06
    07while not LDataSet.Eof
    08  ExportObject LDocument, LDataSet.Field("ID")
    09  LDataSet.Next
    10wend
    11
    12LDocument.save "c:\RolesAndUsers.xml"
          
  • Функция callRoutine осуществляет вызов подпрограммы. Параметры будут запрошены у пользователя обычным порядком (с показом формы задания параметров, отработки ее скрипта и т. д.). Имя класса передается в параметре ClassName, имя вызываемой подпрограммы - в параметре RoutineName. Если пользователь разрешил выполнение подпрограммы (либо для выполнения не требовалось разрешения пользователя), функция вернет True, иначе False. Значение, возвращаемое подпрограммой, может быть возвращено через необязательный параметр RetValue. Через значение необязательного параметра ScriptPart можно передать скрипт на языке VBScript, который будет "приклеен" сверху к скрипту формы параметров вызываемой подпрограммы.
  • Функция getOleObject возвращает ссылку на Ole-объект с идентификатором класса, переданном в параметре ClassID. Объект создается на основе библиотеки кода, сохраненной в доступном файле с именем, заданным параметром AccessibleFileName. Регистр символов имени доступного файла важен.
  • Функция getResource возвращает значение ресурсной строки по имени ресурса (элемента перечислимого домена Resource strings или перевода (объекта класса TLanguageTranslation).
    Пример
    MsgBox getResource("rssMyErrorMessage")
          
  • Функция getTempFileName возвращает сгенерированное системой имя временного файла с расширением, переданным в параметре Extension.
  • Функция selectVaue позволяет пользователю выбрать значение на основе ссылочного домена, имя которого передается в параметре ClassDomain. Вызывающая сторона может реализовать интерфейс IContextExpressionInfo, через который передается информация о контексте вызова для интерпретации выражений условий отбора, и передать ссылку на него через параметр ExpressionContext. Выбранное значение передается в обе стороны через параметр Value. Если пользователь подтвердил выбор значения, функция возвращает значение True, и устанавливает значение параметра Value, равное идентификатору выбранного пользователем объекта. Если пользователь отказался от выбора, функция возвращает значение False.
  • Процедура raiseManagedException возбуждает управляемую исключительную ситуацию с сообщением для пользователя, заданным параметром ExceptionMessage.
  • Функция getCRC возвращает шестнадцатиричное представление контрольной суммы переданных в параметре Data данных. Параметр может быть
    • Объектом, реализующим интерфейс IBinaryData
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Объектом, реализующим интерфейс IFile объектной модели FileSystemObject
    • Строкой данных. Строка будет преобразована в байты в соответствии с кодировкой UTF-8.
  • Функция downloadData осуществляет обращение к указанному ресурсу по протоколу http (https), и возвращает ответ сервера в виде объекта, реализующего интерфейс IBinaryData. Параметр Host определяет http-сервер, параметр Url - Url, к которому будет происходить обращение. Параметры UserName и Password определяют имя пользователя и пароль, если http-сервер требует авторизовать пользователя. Параметр NegotiateAuth устанавливает режим аутентификации. (Basic или Negotiate). Параметры PostData, PostContentType и PostDataIsBinary определяют содержимое тела POST-запроса (если не определено, функция отправит GET-запрос). Параметр CanCache позволяет использовать локальный кеш http-ответов. Параметр NewSession требует принудительного создания новой сессии при вызове функции. Параметр TimeOut определяет максимальное время ожидания ответа в секундах.
  • Функция createBinaryData создает пустой объект, реализующий интерфейс IBinaryData.
  • Функция BinaryToBitmap  конвертирует переданный графический файл в формат BMP. Объекты во входном и выходном параметрах должны реализовывать интерфейс IBinaryData.
  • Функция editValues создает и показывает форму редактирования группы значений. Параметр ValuesList содержит идентификатор объекта класса TObjectList. Этот список содержит ссылки на редактируемые значения (объекты класса TTypedValue), и командные кнопки формы (объекты класса TTypedValueButton). Параметр Title определяет заголовок формы, параметр UseTabs определяет, будут ли показаны закладки на форме редактирования. Параметр HideOKButton позволяет скрыть кнопку "OK" на показываемой форме. Параметр ScriptPart определяет скрипт показываемой формы.

    Пример
    01  LValue1 = executeMethod ("TTypedValue", "CreateStrValue", _
    02    Array("Value1", "Первый параметр", Null, Null, _
    03    "TLongString", Null, Null, Null, Null, Null, "Значение по  умолчанию первого параметра"))
    04  LValue2 = executeMethod ("TTypedValue", "CreateStrValue", _
    05    Array("Value2", "Второй параметр", Null, Null, _
    06    "TLongString", Null, Null, Null, Null, Null, "Значение по  умолчанию второго параметра"))
    07
    08  LValues = executeMethod("TObjectList", "CreateFromString", _
    09    LValue1 & ";" & LValue2)
    10
    11  if editValues(LValues, "Введите два строковых значения, друзья", True, False, "") then
    12    MsgBox getPropValue("TTypedValue", "StrValue", LValue1) & _
    13      " " & _
    14      getPropValue("TTypedValue", "StrValue", LValue2)
    15  end if
    16
    17  executeMethod "TObject", "Destroy", LValues
    18  executeMethod "TObject", "Destroy", LValue1
    19  executeMethod "TObject", "Destroy", LValue2
            

    Пример
    01  LScriptPart =  "Buttons(""NextButton"").Enabled = ParentForm.NavigatorCanNext" & Chr(10) & _
    02    "Buttons(""PrevButton"").Enabled = ParentForm.NavigatorCanPrevious"
    03
    04  LValue1 = executeMethod ("TTypedValue", "CreateStrValue", _
    05    Array("Value1", "Первый параметр", Null, Null, "TLongString", Null, Null, Null, Null, Null, _
    06    "Значение по  умолчанию первого параметра"))
    07  LValue2 = executeMethod ("TTypedValue", "CreateStrValue", _
    08    Array("Value2", "Второй параметр", Null, Null, "TLongString", Null, Null, Null, Null, Null, _
    09    "Значение по  умолчанию второго параметра"))
    10
    11  LNextButton = executeMethod ("TTypedValueButton", "Create", Array("NextButton", "Вперед!", _
    12    Null, Null, Null, Null, 0, Null, Null, _
    13    "ParentForm.NavigatorNext"  & Chr(10) & LScriptPart, enumerationItem("scPublic"), 1, Null))
    14
    15  LPrevButton = executeMethod ("TTypedValueButton", "Create", Array("PrevButton", "Назад!", _
    16    Null, Null, Null, Null, 1, Null, Null, _
    17    "ParentForm.NavigatorPrevious" & Chr(10) & LScriptPart, enumerationItem("scPublic"), 1, Null))
    18
    19  LValues = executeMethod("TObjectList", "CreateFromString", _
    20    LValue1 & ";" & LValue2 & ";" & LNextButton & ";" & LPrevButton)
    21
    22  if editValues(LValues, "Введите два строковых значения, друзья", True, True, LScriptPart) then
    23    MsgBox getPropValue("TTypedValue", "StrValue", LValue1) & _
    24      " " & _
    25      getPropValue("TTypedValue", "StrValue", LValue2)
    26  end if
    27
    28  executeMethod "TObject", "Destroy", LValues
    29  executeMethod "TObject", "Destroy", LValue1
    30  executeMethod "TObject", "Destroy", LValue2
    31  executeMethod "TObject", "Destroy", LNextButton
    32  executeMethod "TObject", "Destroy", LPrevButton
            

  • Функции MsgBox и ShowMsgBox (это синонимы одной точки входа) полностью аналогичны функции Basic MsgBox по поведению и набору параметров.
  • Функция buildNamedFile формирует значение типа "Именованный файл" на основе объекта, реализующего интерфейс IBinaryData (параметр Data) и информации об имени и параметрах именованного файла.
  • Процедура parseNamedFile разбирает значение типа "Именованный файл". Выходной параметр FileName будет содержать сохраненное имя файла, выходной параметр Data - объект, реализующего интерфейс IBinaryData и содержащий данные именованного файла.
  • Свойство ContextObject позволяет получить ссылку на этот же самый контекстный объект.
  • Свойство UserName позволяет получить логин текущего пользователя.
  • Свойство NegotiateAuth позволяет получить признак доменной аутентификации пользователя.
  • Свойство Language позволяет получать и устанавливать текущий языковой контекст, в котором будут выполняться обращения к БД. Значение свойства либо пустая строка (используется язык БД по умолчанию), либо имя объекта класса TLanguage
  • Свойство Variable позволяет сохранять и получать произвольные значения, которые могут хранится постоянно (в реестре) или только в текущем сеансе, в зависимости от параметра Persistent.
    Пример
    1'сохранить на время текущего сеанса значение в переменную с именем SameVariableName
    2Variable("SameVariableName", False) = "Value"
    3
    4'получить значение переменной с именем SameVariableName хранимой в текущем сеансе
    5LValue = Variable("SameVariableName", False)
          
  • Процедура showView осуществляет показ в модальном окне представления с именем ViewName. С помощью параметров DetailPropertyName и Key можно наложить на представление дополнительное условие отбора.

2. Интерфейс IContextDataSet
01  IContextDataSet = interface(IDispatch)
02    ['{466F3AF7-F899-4BC1-869D-1B17DCB86159}']
03    procedure AddQueryItem(Part: TQueryPart; const Name: WideString;
04      Value: OleVariant; Special: TQuerySpecial; Context: OleVariant);
05    function Eof: WordBool;
06    function Field(const Name: WideString): OleVariant;
07    function FieldCount: Integer;
08    function FieldName(Index: Integer): WideString;
09    procedure Next;
10  end;

Интерфейс предоставляет возможности формирования и выполнения запросов к базе данных с целью получения свойств объектов определенного класса, предоставляет доступ к объекту набора данных. Работа с объектом, реализующим интерфейс IContextDataSet заключается в формировании структуры набора данных и последующих обращениях к ним.

  • Процедура AddQueryItem добавляет элемент набора данных. Элементы могут добавляться в любом порядке до первого обращения к данным набора. Символические имена всех предопределенных для параметров этого метода констант являются членами интерфейса IConstants.
    • часть запроса определяется параметром Part, который может принимать одно из следующих предопределенных значений:
      Символическое имя Числовое значение Описание
      qpWhat 0 Добавляет поле (столбец), определяемое параметром Name, к результирующему набору данных. Параметр Value игнорируется.
      qpWhere 1 Определяет условие, налагаемое на свойства объектов класса, передаваемое остальными параметрами.
      qpOrder 2 Определяет порядок сортировки записей результирующего набора данных. Параметр Value игнорируется.
      qpGroup 3 Определяет, что записи результирующего набора данных будут сгруппированы по столбцу, переданному в параметре Name. Параметры Value и Special игнорируются.
    • параметр Name должен быть именем свойства класса, на котором основан набор данных, либо зарезервированным словом "ID" (без кавычек).
    • параметр Value (необязательный) определяет условия отбора, накладываемые на свойство, заданное параметром Name. Имеет смысл только если значение параметра Part равно qpWhere. Условие задается посредством строки, интерпретируемой следующим образом:
      • строка разделяется на части посредством системного разделителя
      • каждая часть интерпретируется самостоятельно, и эти части объединяются логическим "ИЛИ"
      • при интерпретации каждой части проверяются следующие условия:
        * проверка значения на непустоту (IS NOT NULL)
        !* проверка значения на пустоту (IS NULL)
        начинается с символов
        '<=', '<', '>=', '>'
        проверка соответствующего отношения между значением свойства, переданного параметром Name и оставшейся частью строки
        включает в себя символы '*' и/или '?' проверка соответствия значения шаблону, в котором знак '?' соответствует одному любому символу, а знак '*' - любому количеству любых символов
        начинается с символа '!' символ '!' означает отрицание условия, переданного оставшейся частью строки
        представляет собой строку в апострофах (одиночных кавычках) содержание строки не анализируется по приведенным выше условиям
        любая другая строка проверка равенства значения свойства, переданного параметром Name значению, переданному строкой
    • параметр Special (необязательный) обеспечивает дополнительное поведение набора данных (если параметр Special используется, необходимо использовать и параметр Value, можно передавать пустую строку):
      Символическое имя Числовое значение Описание
      qsNone 0 Параметр не используется. Значение по умолчанию.
      qsDescending 7 Используется при значении qpOrder параметра Part. В этом случае производится сортировка по убыванию.
      qsCount 8 Используется при значении qpWhat параметра Part. Определяют тип агрегации по свойству, заданному параметром Name.
      qsSum 9
      qsMin 10
      qsMax 11
      qsAverage 12
      qsFunction 22 Используется для включения в запрос вызова функции. Используется при значении qpWhat параметра Part.
    • параметр Context (необязательный) определяет дополнительные параметры элемента запроса.
    Пример
    01'включить в набор данных свойство Name
    02LDataSet.AddQueryItem 0, "Name"
    03'включить в набор данных среднее значение цены
    04LDataSet.AddQueryItem 0, "Price", "", 12
    05'включить в набор данных идентификатор объекта
    06LDataSet.AddQueryItem 0, "ID"
    07'включить в набор данных вызов функции. В поле IsCompany будет значение True, если объект является организацией
    08LDataSet.AddQueryItem 0, "IsCompany", "TObject.IsInstanceOf", 22, Array(getClass("TCompany"))
    09'наложить на набор данных условие
    10LDataSet.AddQueryItem 1, "Organization", "фирма Елочка"
          
    Пример
    1LDataSet.AddQueryItem 0, "Organization"              '(1)
    2LDataSet.AddQueryItem 0, "SalesCount", "", "9"       '(2)
    3LDataSet.AddQueryItem 1, "SaleDate", ">10.09.2005"   '(3)
    4LDataSet.AddQueryItem 2, "Organization"              '(4)
    5LDataSet.AddQueryItem 3, "Organization"              '(5)
          
    Производится отбор из класса, описывающего число продаж некоего продукта различными организациями. При этом в набор данных включаются колонки "Organization" (строка 1) и "SalesCount" (строка 2). При этом будет произведена группировка по свойству "Organization" (строка 5) (что гарантирует вхождение каждой организации в результирующий набор данных не более одного раза). Набор данных будет отсортирован по организации (строка 4). При этом в колонке "SalesCount" будет сумма (строка 2) всех продаж, осуществленных каждой организацией после 10.09.2005 (строка 3).
  • Функция FieldCount возвращает количество полей (столбцов) набора данных.
  • Функция FieldName возвращает имя поля (столбца) с номером, переданным в параметре Index.
  • Функция Field возвращает значение, содержащееся в поле с именем или индексом, заданным параметром Name (строкового типа) текущей записи набора данных. При первом обращении к набору данных текущей является первая запись. Если параметр определяет номер, то поиск поля производится по номеру. Если имя, то по имени.
  • Процедура Next осуществляет переход к следующей записи набора данных.
  • Функция Eof возвращает False, если текущая запись набора данных существует; в случаях, если набор данных пустой, или при помощи метода Next достигнут конец набора данных, возвращает True.
    Пример
    01If LDataSet.Eof then
    02  'набор данных пуст. Ничего не отобрано.
    03Else
    04  While Not LDataSet.Eof
    05    'работа с очередной отобранной записью
    06    Cells(LRow, 1).Value = LDataSet.Field("Name")
    07    Cells(LRow, 2).Value = LDataSet.Field("Description")
    08    Cells(LRow, 2).Value = LDataSet.Field("Count")
    09    'переход к следующей записи
    10    LDataSet.Next
    11    LRow = LRow + 1
    12  Wend
    13End If
          

3. Интерфейс IConstants
01  IConstants = interface(IDispatch)
02    ['{7E7B2D66-5E7C-496A-AE06-EFC485007500}']
03    property qpWhat: Integer;
04    property qpWhere: Integer;
05    property qpOrder: Integer;
06    property qpGroup: Integer;
07    property qpHaving: Integer;
08    property qsNone: Integer;
09    property qsObjectID: Integer;
10    property qsParentID: Integer;
11    property qsHasChildren: Integer;
12    property qsFilterCondition: Integer;
13    property qsUplink: Integer;
14    property qsRootOnly: Integer;
15    property qsDescending: Integer;
16    property qsCount: Integer;
17    property qsSum: Integer;
18    property qsMin: Integer;
19    property qsMax: Integer;
20    property qsAverage: Integer;
21    property qsMasterLink: Integer;
22    property qsSelectedOnly: Integer;
23  end;

Интерфейс предоставляет символические имена констант, необходимых для работы с объектом, реализующим интерфейс IContextDataSet.

СвойствоЗначение
qpWhat0
qpWhere1
qpOrder2
qpGroup3
qpHaving4
qsNone0
qsObjectID1
qsParentID2
qsHasChildren3
qsFilterCondition4
qsUplink5
qsRootOnly6
qsDescending7
qsCount8
qsSum9
qsMin10
qsMax11
qsAverage12
qsMasterLink13
qsSelectedOnly14

4. Интерфейс IFormContext
01  IFormContext = interface(IDispatch)
02    ['{1944F1C8-CAEA-4CF9-9A4D-CE3423508FF7}']
03    function ChangedControl: OleVariant;
04    function ControlCount: Integer;
05    function ButtonCount: Integer;
06    function ID: WideString;
07    procedure Cancel;
08    function ControlExists(const Name: WideString): WordBool;
09    function ChangedControlName: WideString;
10    function ParentForm: OleVariant;
11    function RoutineID: WideString;
12    procedure PreInitControl(const Name: WideString; Value: OleVariant);
13    procedure NavigatorNext;
14    procedure NavigatorPrevious;
15    function NavigatorCanNext: WordBool;
16    function NavigatorCanPrevious: WordBool;
17    procedure RefreshView(RefreshAll: WordBool);
18    function ExpressionContextValue(const Name: WideString): OleVariant; safecall;
19    property Controls[Name: OleVariant]: IControl;
20    property Buttons[Name: OleVariant]: IButton;
21    property Enabled: WordBool;
22  end;

Представляет собой модель формы задания параметров. Члены интерфейса доступны для использования в скриптах форм задания параметров.

  • Функция ChangedControl возвращает объект, реализующий интерфейс IControl, соответствующий элементу управления, изменение которого вызвало исполнение скрипта формы параметров. Если выполнение скрипта вызвано инициализацией формы задания параметров, то значение функции - Empty. Пустоту значения можно проверить с помощью функции VBScript IsEmpty.
  • Функция ControlCount возвращает число элементов управления на форме параметров, как видимых так и невидимых.
  • Функция ButtonCount возвращает число командных кнопок на форме параметров, как видимых так и невидимых.
  • Функция ID возвращает значение идентификатора объекта, для которого вызван метод. Для методов класса возвращает пустое значение.
  • Функция ControlExists возвращает True, если элемент управления с именем Name существует на форме, и, соответственно, существует соответствующий параметр.
  • Функция ChangedControlName возвращает имя элемента управления, изменение которого вызвало исполнение скрипта формы параметров. Если выполнение скрипта вызвано инициализацией формы задания параметров, то значение функции - пустая строка.
  • Процедура Cancel прекращет работу формы задания параметров. Форма закрывается, выполнение действия блокируется.
  • Функция ParentForm возвращает ссылку на контекст родительской формы в цепочке вызовов. В контексте первой формы (вызванной с грида немодальной формы) возвращает пустое значение (Empty). Пустоту значения можно проверить с помощью функции VBScript IsEmpty.
  • Функция RoutineID возвращает идентификатор подпрограммы, для которой вызвана форма.
  • Процедура PreInitControl имитирует предварительную инициализацию элемента управления с именем Name значением, переданным в параметре Value. Сам элемент управления при этом будет скрыт, и не будет показан вплоть до следующего вызова формы пользователем.
  • Процедура NavigatorNext выполняет переход к следующему объекту набора данных, для которого показывается форма параметров.
  • Процедура NavigatorPrevious выполняет переход к предыдущему объекту набора данных, для которого показывается форма параметров.
  • Функция NavigatorCanNext возвращает True, если возможен переход к следующему объекту набора данных, для которого показывается форма параметров.
  • Функция NavigatorCanPrevious возвращает True, если возможен переход к предыдущему объекту набора данных, для которого показывается форма параметров.
  • Процедура RefreshView обновляет набор данных, для которого показывается форма параметров. Если значение параметра RefreshAll равно True, то будет обновлен весь набор, если False, то только выделенные записи.
  • Свойство Controls позволяет обращаться к элементам управления на форме задания параметров, их свойствам и методам. Каждый элемент управления реализует интерфейс IControl. В параметре Name (строкового типа)может быть передано как имя элемента управления, так и его индекс (в этом случае индекс должен быть передан как строка). Имена элементов управления на форме параметров соответствуют именам параметров подпрограммы (метода, отчета, etc).
  • Свойство Buttons позволяет обращаться к командным кнопкам на форме задания параметров, их свойствам и методам. Каждая командная кнопка реализует интерфейс IButton. В параметре Name (строкового типа)может быть передано как имя командной кнопки, так и ее индекс (в этом случае индекс должен быть передан как строка).
  • Свойство Enabled позволяет получать и устанавливать доступность кнопки OK на форме задания параметров. Если на форме есть невалидные (имеющие недопустимые значения) элементы управления, значение свойства всегда равно False и устанавливать его в явном виде в True не рекомендуется. Для учета дополнительного условия рекомендуется использовать следующую конструкцию: Enabled = Enabled and (Controls("SalesCount").Value > 10)
  • Функция ExpressionContextValue возвращает значение переменной контекста с именем Name, которая используется для интeрпретации выражений условий отбора на форме.

5. Интерфейс IControl
01  IControl = interface(IDispatch)
02    ['{0662001F-D3D5-4F28-98AC-9B499F70E856}']
03    function Name: WideString;
04    procedure SetHint(const Value: WideString);
05    procedure RefreshLinkedView;
06    property Value: OleVariant;
07    property ReadOnly: WordBool;
08    property IsValid: WordBool;
09    property IsEmpty: WordBool;
10  end;

Моделирует элемент управления на форме задания параметров. Позволяет управлять поведением элементов управления на форме.

  • Функция Name возвращает имя элемента управления; имена элементов управления всегда совпадают с именамим соответствующих параметров подпрограммы.
  • Процедура SetHint устанавливает текст всплывающей подсказки элемента управления. Всплывыющая подсказка показывается только если значение элемента управления недопустимо (свойство IsValid равно False).
  • Процедура RefreshLinkedView обновит связанное с элементом управления представление.
  • Свойство Value позволяет получать и устанавливать значение, введенное в элемент управления.
  • Свойство ReadOnly позволяет получать и устанавливать доступность элемента управления для записи; при значении True элемент управления не доступен для записи и отображается неактивным.
  • Свойство IsValid позволяет получать и устанавливать "валидность" элемента управления; по умолчанию валидным элемент управления является в том случае, если введенное в него значение соответствует домену соответствующего параметра подпрограммы с учетом наложенного на него условия отбора.
  • Свойство IsEmpty имеет значение True в случае, если в элемент управления не введено никакого значения (элемент управления пустой), в противном случае имеет значение False.

6. Интерфейс IButton
1  IButton = interface(IDispatch)
2    ['{1618406F-B9F1-4C5F-BC35-C2A154837CA9}']
3    function Name: WideString; safecall;
4    procedure Click; safecall;
5    property Enabled: WordBool;
6  end;

Моделирует командную кнопку на форме задания параметров. Позволяет управлять поведением кнопки на форме.

  • Функция Name возвращает имя кнопки.
  • Процедура Click эмулирует нажатие на кнопку.
  • Свойство Enabled позволяет получать и устанавливать доступность кнопки.

7. Интерфейс IBinaryData
01  IBinaryData = interface(IDispatch)
02    ['{8A9F7CB3-230A-4048-B938-852CBF6ADB2D}']
03    procedure Load(const Src: OleVariant);
04    procedure Append(const Src: OleVariant);
05    procedure Save(const Dst: OleVariant);
06    function Size: Cardinal;
07    function ToString(Encoding: WideString): WideString;
08    procedure FromString(Data: OleVariant);
09    procedure AppendString(Data: OleVariant);
10    function ToBase64: WideString;
11    procedure FromBase64(Data: OleVariant);

Представляет набор двоичных данных.

  • Процедура Load загружает двоичные данные из переданного источника. Источник может быть
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Строкой, содержащей имя файла
  • Процедура Append добавляет двоичные данные из переданного источника. Источник может быть
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Строкой, содержащей имя файла
  • Процедура Save сохраняет двоичные данные в переданный приемник. Приемник может быть
    • Объектом, реализующим интерфейс IStream
    • Объектом, реализующим интерфейс ISequentialStream
    • Строкой, содержащей имя файла
  • Функция ToString переводит данные в строку. Байты, содержашиеся в объекте, будут рассматриваться как содержащие строку в кодировке, заданной параметром Encoding. По умолчанию используется кодировка UTF-8
  • Процедура FromString загружает данные из строки, переданной в параметре Data, перекодировав ее в кодировку UTF-8
  • Процедура AppendString  добавляет данные из строки, переданной в параметре Data, перекодировав ее в кодировку UTF-8
  • Функция ToBase64 возвращает строку, полученную путем кодирования в формат Base64, данных содержащихся в объекте
  • Процедура FromBase64 загружает данные из строки, переданной в параметре Data, раскодировав ее из формата Base64

8. Интерфейс IContextExpressionInfo
1  IContextExpressionInfo = interface(IUnknown)
2    ['{C7518427-B515-4EB4-B698-88656E6CBF7C}']
3    function Count: Integer;
4    function ItemName(Index: Integer): WideString;
5    function ItemValue(Index: Integer): OleVariant;
6    function ItemDomain(Index: Integer): OleVariant;
7  end;

Через реализацию этого интерфейса передаются значения контекстных переменных при обращении к функции selectValueинтерфейса IContext.

  • Функция Count возвращает количество используемых контекстных переменных. Нумерация контекстных переменных начинается с нуля.
  • Функция ItemName возвращает имя контекстной переменной c номером, переданным в параметре Index.
  • Функция ItemValue возвращает значение контекстной переменной c номером, переданным в параметре Index.
  • Функция ItemDomain возвращает имя домена контекстной переменной c номером, переданным в параметре Index.

9. Интерфейс IExceptionHandler
1  IExceptionHandler = interface(IDispatch)
2    ['{3C3C7202-5ED5-4EB4-9CDD-A929C18CA8BD}']
3    procedure HandleException(ContextObject: OleVariant;
4      const Message: WideString;
5      const ExtentedInfo: WideString);
6  end;

Реализовав интерфейс IExceptionHandler разработчик решений может получать уведомления о возникающих при работе исключительных ситуациях. При возникновении исключения объект, реализующий интерфейс, получит текст сообщения об ошибке и расширенную информацию.

Для реализации интерфеса используется библиотека hse.tlb, входящая в состав поставки решения. Перед началом работы с ней, необходимо зарегистрировать ее в операционной системе.

Для установки настроек интерфейса необходимо открыть Системную форму раздела АДМИНИСТРАТОРУ, перейти на вкладку  Настройки и в столбце "Заголовок закладки" установить фильтр "Обработка ошибок".

После этого в качестве значения Идентификатора класса установить "IExceptionHandler" без кавычек.

Для Библиотеки кода указать значение HSE.tlb