2009-08-19 3 views
2

У меня есть набор данных, для которого мне нужно поле поиска. Проблема в том, что структура этого набора данных определяется результатом запроса. Я не могу добавить поле в качестве TFieldDef перед установкой .Active = true;, потому что он перезаписывается, и я не могу добавить его после, выполняющего запрос, потому что вы не можете изменить структуру открытого набора данных.Как добавить поле поиска в набор данных?

Должен быть какой-то способ сделать это. Кто-нибудь знает как?

EDIT: Кажется, что возникает некоторая путаница в отношении того, что я ищу. Я не ищу поиска во время запроса. Я искал поле поиска , объект TField, где FieldKind = fkLookup, так что его можно использовать с комбинированным полем поиска данных, предназначенным для редактирования данных после того, как запрос вернул результат. Это не имеет ничего общего с SQL и все, что связано с моделью данных Delphi и элементами управления, ориентированными на данные.

ответ

3

Самый простой способ - определить постоянные поля во время разработки.

Вы также можете изменить инструкцию SQL для получения вычисленных значений с сервера.

+0

мне нужно что-то, что может быть изменен во время выполнения через колонку поиска в элементе управления сетки , и это специально требует поля поиска в наборе данных. –

+0

Вопрос касался вычисленных полей, а не поисковых полей. Я не уверен, что понимаю вашу проблему, но вы можете также определить постоянные поля в коде во время выполнения, прежде чем открывать набор данных. Другими словами, создайте FieldDefs, созданный вашим кодом, а не автоматически с помощью набора данных. Там вы также можете определить вычисленные или поисковые поля. –

+0

Интересно, отредактировал ли вы этот вопрос, или я галлюцинировал. ;-) Я думал, что речь идет о рассчитанных полях. –

2

Вам необходимо создать поля самостоятельно, прежде чем открывать набор данных.

Сначала получите все ваши определения полей из базы данных

DataSet.FieldDefs.Update; 

Затем петли через каждый fielddef и создать нормальное поле, а также создать поле поиска, где это необходимо. Упрощенная версия кода, подобного этому;

for I := 0 to DataSet.FieldDefs.Count - 1 do 
    begin 
    // Allocate a normal field 
    AField := DataSet.FieldDefs[I].CreateField(DataSet); 

    // Add lookup field if we have another table to look it up from 
    if (??? this is the key field of a lookup table) then 
    begin 
     AField := TStringField.Create(DataSet.Owner); 
     AField.FieldName := ???; 
     AField.DataSet := DataSet; 
     AField.FieldKind := fkLookup; 
     AField.KeyFields := ???; 
     AField.LookupKeyFields := ???; 
     AField.LookupDataSet := ???; 
     AField.LookupResultField := ???; 
    end; 
    end; 

Затем вы можете открыть набор данных.

0

У вас есть два набора данных на форме (скажем tblOrder, tblCustomer)
Одно поле в том порядке, является внешним ключом к таблице клиентов CUSTOMERID
Ключ поля таблицы клиентов является Id, Name = Имени

Добавить все поля (правая кнопка мыши на редакторе наборов данных, поля, добавить все поля.

Затем щелкните правой кнопкой мыши на таблице заказов и выберите редактор полей, затем щелкните правой кнопкой мыши новое поле.

Имя = myLookup, Тип - строка, Размер xx, Поле Тип = Поиск.
Ключевое поле = customerid, dataset = tblCustomer, lookup Key = Id, поле результата = имя.

Теперь ваше поле поиска определено.
Чтобы заставить его работать в редакторе (скажем, в TDBLookupCombo)
Добавить к источникам данных формы dsOrder
Подключите его к tblOrder.

Теперь установите DataSource = dsOrder, Поле = myLookup
Вы не должны установить источник подстановок ...

Смежные вопросы