Мельница данных   (23.09.2017)
Интерфейс IContext
  IContext = interface(IDispatch)
    ['{79847D79-A3BE-408F-B59F-662B91BC6350}']
    function Handle: Integer;
    function getName(ID: OleVariant): WideString;
    function getDescription(ID: OleVariant): WideString;
    function createDataSet(const TargetClassName: WideString):
      IContextDataSet;
    function executeMethod(const ClassName: WideString;
      const MethodName: WideString;
      Params: OleVariant): OleVariant;
    function executeReport(const ClassName: WideString;
      const TemplateName: WideString;
      Params: OleVariant): IDispatch;
    function getPropValue(const ClassName: WideString;
      const PropName: WideString;
      const ID: OleVariant): OleVariant;
    procedure setPropValue(const ClassName: WideString;
      const PropName: WideString;
      const ID: OleVariant; Value: OleVariant);
    function select(const ClassName: WideString;
      QueryItems: OleVariant): IDispatch;
    function enumerationItem(ItemIdentifier: OleVariant): WideString;
    function getClass(const ClassName: WideString): WideString;
    function createGUID: WideString;
    procedure processStart(const Description: WideString;
      ItemCount: Integer);
    procedure processStep;
    procedure processStop;
    function PlaceDataSet(const Range: IDispatch;
      const DataSet: IContextDataSet;
      ShiftRows: WordBool; ShiftColumns: WordBool): Integer;
    procedure DebugString(const Message: WideString);
    procedure ExportObject(var Document: OleVariant; const ID: WideString;
      const ClassID: WideString);
    function callRoutine(const ClassName, RoutineName: WideString;
      var RetValue: OleVariant; const ScriptPart: OleVariant): WordBool;
    function getOleObject(const ClassID, AccessibleFileName: WideString): IDispatch;
    function getResource(const Name: WideString): WideString;
    function getTempFileName(const Extension: WideString): WideString;
    function selectVaue(const ClassDomain: WideString;
      const ExpressionContext: IContextExpressionInfo;
      var Value: OleVariant): WordBool;
    procedure raiseManagedException(const ExceptionMessage: WideString);
    function getCRC(Data: OleVariant): WideString;
    function downloadData(const Host: WideString; const Url: WideString;
      const UserName: WideString; const Password: WideString;
      NegotiateAuth: WordBool; PostData: OleVariant;
      const PostContentType: WideString; PostDataIsBinary: WordBool;
      CanCache: WordBool; NewSession: WordBool; TimeOut: Integer): OleVariant;
    function createBinaryData: IDispatch;
    function BinaryToBitmap(const Data: IDispatch): IDispatch; safecall;
    function editValues(const ValuesList: WideString; const Title: WideString;
      UseTabs: WordBool; HideOKButton: WordBool;
      const ScriptPart: OleVariant): WordBool;
    function MsgBox(const Prompt: WideString; Buttons: LongWord;
      const Title: WideString;
      const HelpFile: WideString; Context: LongWord): Integer;
    function ShowMsgBox(const Prompt: WideString; Buttons: LongWord;
      const Title: WideString;
      const HelpFile: WideString; Context: LongWord): Integer;
    function buildNamedFile(const Data: IDispatch; const StoredFileName: WideString;
                            Propmpt: WordBool; Compress: WordBool): IDispatch;
    procedure parseNamedFile(const NamedFile: IDispatch; out FileName: OleVariant;
                             out Data: OleVariant);
    procedure showView(const ViewName: WideString; Key: OleVariant;
                       const DetailPropertyName: WideString);
    procedure showDataSet(const DataSet: ContextDataSet; const Caption: WideString;
                          ColumnCaptions: OleVariant; ColumnOnChangeHandlers: OleVariant;
                          TakeActionsFromView: OleVariant);
    function executeConsoleProcess(const CommandLine: WideString; MaxDuration: Integer;
                                   const OutputData: OleVariant): Integer;
    function createRaster: IDispatch;
    function createZIPArchive: IDispatch;
    function ConvertExcel(Source: OleVariant; const Format: WideString): IDispatch;
    property ContextObject: IDispatch;
    property Language: WideString;
    property UserName: WideString;
    property NegotiateAuth: WordBool;
    property Variable[const Name: WideString; Persistent: WordBool]: OleVariant;
  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. Если объект документа не был создан, то он создается автоматически. Если документ не имеет корневого узла, он будет создан автоматически.
           
    set LDataSet = CreateDataSet("TSecurityAccount")
    
    LDataSet.AddQueryItem qpWhat, "ID"
    
    set LDocument = CreateObject("Msxml2.DOMDocument.4.0") 'Не обязательно.
    
    while not LDataSet.Eof
      ExportObject LDocument, LDataSet.Field("ID")
      LDataSet.Next
    wend
    
    LDocument.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 определяет скрипт показываемой формы.

           
      LValue1 = executeMethod ("TTypedValue", "CreateStrValue", _
        Array("Value1", "Первый параметр", Null, Null, _
        "TLongString", Null, Null, Null, Null, Null, "Значение по  умолчанию первого параметра"))
      LValue2 = executeMethod ("TTypedValue", "CreateStrValue", _
        Array("Value2", "Второй параметр", Null, Null, _
        "TLongString", Null, Null, Null, Null, Null, "Значение по  умолчанию второго параметра"))
    
      LValues = executeMethod("TObjectList", "CreateFromString", _
        LValue1 & ";" & LValue2)
    
      if editValues(LValues, "Введите два строковых значения, друзья", True, False, "") then
        MsgBox getPropValue("TTypedValue", "StrValue", LValue1) & _
          " " & _
          getPropValue("TTypedValue", "StrValue", LValue2)
      end if
    
      executeMethod "TObject", "Destroy", LValues
      executeMethod "TObject", "Destroy", LValue1
      executeMethod "TObject", "Destroy", LValue2
            

           
      LScriptPart =  "Buttons(""NextButton"").Enabled = ParentForm.NavigatorCanNext" & Chr(10) & _
        "Buttons(""PrevButton"").Enabled = ParentForm.NavigatorCanPrevious"
    
      LValue1 = executeMethod ("TTypedValue", "CreateStrValue", _
        Array("Value1", "Первый параметр", Null, Null, "TLongString", Null, Null, Null, Null, Null, _
        "Значение по  умолчанию первого параметра"))
      LValue2 = executeMethod ("TTypedValue", "CreateStrValue", _
        Array("Value2", "Второй параметр", Null, Null, "TLongString", Null, Null, Null, Null, Null, _
        "Значение по  умолчанию второго параметра"))
    
      LNextButton = executeMethod ("TTypedValueButton", "Create", Array("NextButton", "Вперед!", _
        Null, Null, Null, Null, 0, Null, Null, _
        "ParentForm.NavigatorNext"  & Chr(10) & LScriptPart, enumerationItem("scPublic"), 1, Null))
    
      LPrevButton = executeMethod ("TTypedValueButton", "Create", Array("PrevButton", "Назад!", _
        Null, Null, Null, Null, 1, Null, Null, _
        "ParentForm.NavigatorPrevious" & Chr(10) & LScriptPart, enumerationItem("scPublic"), 1, Null))
    
      LValues = executeMethod("TObjectList", "CreateFromString", _
        LValue1 & ";" & LValue2 & ";" & LNextButton & ";" & LPrevButton)
    
      if editValues(LValues, "Введите два строковых значения, друзья", True, True, LScriptPart) then
        MsgBox getPropValue("TTypedValue", "StrValue", LValue1) & _
          " " & _
          getPropValue("TTypedValue", "StrValue", LValue2)
      end if
    
      executeMethod "TObject", "Destroy", LValues
      executeMethod "TObject", "Destroy", LValue1
      executeMethod "TObject", "Destroy", LValue2
      executeMethod "TObject", "Destroy", LNextButton
      executeMethod "TObject", "Destroy", LPrevButton
            

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