Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Lookup-поле в dbGrid


Автор: Bose 31.10.2005, 13:00
есть 2 таблицы(ADO):
поля таблицы 1: name(text), type_id(integer)
поля таблицы 2: id(integer), type(text)

на форме есть: ADOtable1, ADOtable2, datasetTable1 и datasetTable2 и dbGridTable1(связанный с datasetTable1 - т.е. содержимое таблицы1 отображается в гриде).

как сделать, чтобы в dbGridTable1 в поле type_id вместо цифры(integer) отображался соответствующий текст(поле type) из таблицы2 (т.е. поле таблица1.type_id должно быть связано с полем таблица2.type)?


Автор: bas 31.10.2005, 13:16
Цитата(Bose @ 31.10.2005, 13:00)
(т.е. поле таблица1.type_id должно быть связано с полем таблица2.type)?

Да.

Автор: Bose 31.10.2005, 13:32
ой... вообще вопрос был не в том, должно ли поле таблица1.type_id должно быть связано с полем таблица2.type;-) , а в том как сделать чтобы в поле type_id открывался ComboBox, в котором можно было выбрать нужный тип. И чтобы значения для этого ComboBoxа брались из соответствующей таблицы(таблица2). Короче. Нужно сделать Lookup. только у меня почему-то не получается это сделать со стандартным dbGrid'ом.

Что я делал:
в ADOtable1 открыл список полей.
Выделил поле type_id.
Поставил для него FieldKind:=fkLookup,
в LookupDataSet указал ADOtable2,
KeyFields указал type_id,
LookupKeyFields:=id,
LookupResultField:=type.

Вроде все сделал как надо.
Но в столбце type_id у меня ничего не показывается. И никаких намеков на ComboBox... smile

Автор: lotax 31.10.2005, 14:02
используй PickList (закидай туда данные)...

Автор: Bose 31.10.2005, 14:07
PickList не подходит. Мне надо, чтобы в поле отображался текст, а хранились индексы...

Автор: lotax 31.10.2005, 14:23
smile , тоесть ты хочешь, чтоб из списка выбрать type и показать type_id

Автор: Bose 31.10.2005, 14:30
нет... smile
я хочу чтобы, юзер вместо type_id видел type, и выбирал из списка возможных type(которые хранятся в таблице2), но чтобы в базе в таблице сохранялся не текст type, а id этого type'a - type_id. smile

Автор: lotax 31.10.2005, 14:58
создай логическое поле, в Gride за этим полем закрепи PickList, также положи Combobox(сделай его невидимым если он тебе не нужен), далее кидай данные в PickList -type, а в Combobox -id, а потом по индексу ищи ID и запоминай его в таблице.

Автор: Bose 31.10.2005, 15:07
это слишком сложно=). В Дельфи(7) должны быть встроенные средства, для выполнения таких задач. С ними-то я и не могу разобраться.

Сейчас я продвинулся чуть дальше. Теперь я не изменяю свойства поля type_id, а добавляю новое поле MyType к ADotable1, и настраиваю его свойства для выполнения Lookup'a...
Пока что, при попытке установить курсор в поле MyType получаю сообщение EVariantTypeCastError. Cannot convert variant of type(string) into type(double). Сижу и недоумеваю, откуда там double взялся..

Автор: Bose 31.10.2005, 15:35
yep! smile
я разрешил свою проблему. Оно заработало. smile

Ошибка преобразования типов выскакивала, потому, что когда я добавлял новое поле MyType к ADotable1, я указывал его тип такаким же как и у поля type_id(integer), а надо было как у поля type(string).

p.s> а откуда float брался, до сих пор не ведаю... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)