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
|
|