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