Мельница данных   (23.09.2017)
Интерфейс IContextDataSet
  IContextDataSet = interface(IDispatch)
    ['{466F3AF7-F899-4BC1-869D-1B17DCB86159}']
    procedure AddQueryItem(Part: TQueryPart; const Name: WideString;
      Value: OleVariant; Special: TQuerySpecial; Context: OleVariant);
    function Eof: WordBool;
    function Field(const Name: WideString): OleVariant;
    function FieldCount: Integer;
    function FieldName(Index: Integer): WideString;
    procedure Next;
  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 (необязательный) определяет дополнительные параметры элемента запроса.
           
    'включить в набор данных свойство Name
    LDataSet.AddQueryItem 0, "Name"
    'включить в набор данных среднее значение цены
    LDataSet.AddQueryItem 0, "Price", "", 12
    'включить в набор данных идентификатор объекта
    LDataSet.AddQueryItem 0, "ID"
    'включить в набор данных вызов функции. В поле IsCompany будет значение True, если объект является организацией
    LDataSet.AddQueryItem 0, "IsCompany", "TObject.IsInstanceOf", 22, Array(getClass("TCompany"))
    'наложить на набор данных условие
    LDataSet.AddQueryItem 1, "Organization", "фирма Елочка"
          
           
    LDataSet.AddQueryItem 0, "Organization"              '(1)
    LDataSet.AddQueryItem 0, "SalesCount", "", "9"       '(2)
    LDataSet.AddQueryItem 1, "SaleDate", ">10.09.2005"   '(3)
    LDataSet.AddQueryItem 2, "Organization"              '(4)
    LDataSet.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.
           
    If LDataSet.Eof then
      'набор данных пуст. Ничего не отобрано.
    Else
      While Not LDataSet.Eof
        'работа с очередной отобранной записью
        Cells(LRow, 1).Value = LDataSet.Field("Name")
        Cells(LRow, 2).Value = LDataSet.Field("Description")
        Cells(LRow, 2).Value = LDataSet.Field("Count")
        'переход к следующей записи
        LDataSet.Next
        LRow = LRow + 1
      Wend
    End If