Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Создание lookup поля в DBGrid  (Прочитано 63766 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
sal
Гость
« : 08-12-2004 10:13 » 

Добрый день!

Есть такая проблема:

Есть Interbase база данных. Есть две таблицы. Первая - Time_Intervals (главная таблица - в нее стекаются данные), вторая - Team (из нее идут данные в Time_Intervals). В обоих таблицах есть поле ID_Team по которому идет связь.
Применена следующая цепоцка: TIBDatabase -> TIBTransaction -> TIBDataSet -> TDataSource -> TDBGrid.
Проблема заключается в следующем. Я не могу понять, как мне сделать в главной таблице Time_Interval в компоненте TDBGrid lookup поле, чтобы из выпадающего списка можно было выбирать значения таблицы Team по полю ID_Team.

P.S. И если не трудно, объясните, чем принципиально отличается использование компонент TIBTable и TIBDataSet.
Записан
sal
Гость
« Ответ #1 : 09-12-2004 09:59 » 

Блин ..... ни уж то нет никого, кто в этом разбирается  :?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 09-12-2004 11:16 » 

sal, нужно в редакторе полей основной таблицы (Fields Editor) добавить поле, указать его тип - Lookup, и заполнить остальные поля (keyfield, listfield, и т.д.).

TIbDataSet - это общий предок компонентов TIbTable и TIbQuery. Если нужен функционал квери, т.е. запроса, то лучше использовать TIbQuery, а когда нужен табличный, т.н. навигационный доступ к даным - юзается TIbTable. а датасет это унифицированная вещь, с помощью оторой можно реализовать и то, и это. реально - я, например, вообще его не использую.
Записан

sal
Гость
« Ответ #3 : 09-12-2004 13:29 » 

Я не знаю конечно, может я и тормоз, но такого свойства у меня нет.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 09-12-2004 13:39 » 

sal, не там смотришь, не в инспекторе объектов, а в редакторе полей. Щёлкни дважды на TIbTable, и он откроется. в нём щёлкаешь правой кнопкой, добавляешь нужные поля, потом опять добавляешь поле, но уже не Data, а Lookup.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 09-12-2004 13:40 » 

"добавляешь" - имеется в виду "New field... ". а остальные поля по "Add fields".
Записан

sal
Гость
« Ответ #6 : 10-12-2004 06:23 » 

И еще один глупый вопрос. Улыбаюсь

Все ок. У меня получилось добавить поле Lookup, но не пойму, как связать Grid с IBTable или Grid уже использовать не получится?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #7 : 10-12-2004 06:26 » 

так же, как обычно, через TDataSource.
Записан

sal
Гость
« Ответ #8 : 10-12-2004 07:31 » 

Ну вроде все так. Тогда мне непонятна иерархия:  у меня так:
TIBDatabase -> TIBTransaction -> TIBDataSet -> TDataSources -> DBGrid. А куда TIBTable засунуть? как-то он не вписывается в эту цепочку.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #9 : 10-12-2004 07:43 » 

Вместо TIbDataSet. либо lookup-поле создать в самом TbDataSet, он это тоже умеет, а таблицу не использовать вообще.

эта цепочка, отвечающая за отображение в гриде. а будет ещё одна, отвечающая за предоставление значений для лукап-поля, типа

IBDatabase1 -> IBTransaction1 -> IBDataSet1 -> DataSource1 -> Dbrid1
IBDatabase1 -> IBTransaction1 -> IBTable2 -> DataSource2

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

sal
Гость
« Ответ #10 : 10-12-2004 08:00 » 

А не мог бы ты  еще пояснить значение полей Key Fields, Lookup Keys и Result Field.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #11 : 10-12-2004 08:10 » 

Key fields - ключевое поле (одно или несколько через точку с запятой), в твоём случае - ID_TEAM

Lookup Keys - ключевые поля в дочерней таблице, долны соответствовать полям в ключевой таблице (у тебя - также ID_TEAM)

Result Field - поле в дочерней таблице, которое будет выводиться на экран в момент выбора lookup-поля.
Записан

sal
Гость
« Ответ #12 : 10-12-2004 08:24 » 

странно, но мне пишут -  Invalid Value for field <lookup поле>. Там какой DataSet нужно выбрать?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #13 : 10-12-2004 08:41 » 

допустим, есть две таблицы:

MainTable
Main_Id
Lookup_Id

Lookup_Table
Lookup_Id
Lookup_Name

в MainTable добавляем Main_Lookup_Name и настраиваем его следующим образом:

KeyFields := 'Lookup_Id';
DataSet = 'LookupTable';
LookupKeys = 'Lookup_Id';
ResultFields = 'Lookup_Name';

теперь прикручиваем DbGrid к MainTable и любуемся на всё это дело.

надо учесть, что типы Main_Lookup_Name и Lookup_Name должны совпадать.
Записан

sal
Гость
« Ответ #14 : 10-12-2004 08:54 » 

Заработало!!!! Огромное спасибо!
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #15 : 10-12-2004 09:13 » new

sal, amen Улыбаюсь
Записан

he1p
Гость
« Ответ #16 : 16-04-2009 15:34 » 

поле в дбгриде работает, но при дублировании записей вылетает ошибка(
что делать помогите пожалуйста
Записан
Freez1992
Гость
« Ответ #17 : 25-02-2010 14:53 » 

Здраствуйте, у меня такой вопрос: вот сделала я такие поля (lookup) допустим "улица" обычное поле(data) скрыл все работает...НО если в связанной таблице нету улицы которая допустим была введена вручную то и lookup поле "улица" остается пустое, хотя в это время в обычном поле "улица" (скрытое) имеет значение... как сделать чтобы в lookup поле показывалесь элементы которых нет в lookup-list'е..??
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #18 : 25-02-2010 14:57 » 

DFM формы в студию.
Записан

Freez1992
Гость
« Ответ #19 : 25-02-2010 15:23 » 

воть)

* lookup.rar (364.99 Кб - загружено 3300 раз.)
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #20 : 25-02-2010 15:59 » 

у вас не совпадают значения ключевых полей для LookUp поля.

Table1.Naim = 'Ленин', Table2.Naim = 'Ленина'. Значения "Кутузова" во второй таблице вообще нет. Поэтому лукап поле ничего не показывает.
Записан

Freez1992
Гость
« Ответ #21 : 25-02-2010 16:19 » 

Вопрос и был в том чтобы при отсутствии совпадения во второстепенной таблице (списке) лукап выводил бы оригинальное значение главной таблицы...т.е так сделать нельзя?
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #22 : 25-02-2010 16:30 » 

можно. у каждого поля есть событие OnGetText, возникающее каждый раз, когда значение поля запрашивается для вывода на экран. поэтому можно сделать так:

Код:
procedure TForm1.IBTable1ULICA1GetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  if Text = '' then
    Text := IBTable1ULICA.AsString;
end;

т.е. откройте редактор полей у IbTable1, и в методе OnGetText поля ULICA1 вставьте вышеприведённый код.
Записан

Freez1992
Гость
« Ответ #23 : 25-02-2010 16:57 » 

Спасибо огромное!!! Как раз то что мне было нужно!!!
Записан
NeferSky
Постоялец

ua
Offline Offline
Бессмертный


« Ответ #24 : 07-08-2010 13:27 » 

То ли я делаю что-то не так, то ли одно из двух. Не работает. Итак. У меня есть главная таблица, в которой есть поле "месяц", там валяются номера месяцев: 1, 2, 3... Есть еще одна таблица с двумя полями id и month, там валяются сами месяцы, id и название. На форме валяется грид, ibtable, ibdataset, datasource. База и транзакция на соседней форме. Ibdataset привязан к главной таблице sql-запросом "select * ...". Редактор полей заполнил "add all fields", потом создал новое поле, обозвал "lookup", тип выставил String, т.к. названия месяцев тоже string, тип поля лукап, KeyFields - поле с id месяцев из главной таблички, dataset - ibtable, привязанная к таблице с месяцами, LookupKeys - поле "id" таблицы с месяцами, ResultField - название месяца из таблицы с месяцами. Запускаю. В гриде - номера месяцев. Где я ошибся?
Записан

Не тронь налаженный механизм, и он тебя не подведет.
Делать надо хорошо, а плохо - само получится.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #25 : 07-08-2010 13:40 » 

чему равно LookupListSource у lookup-поля?

з.ы. для месяцев заводить лукап-таблицу особого смысла нет, это константы, которые не меняются. (часто вам приходилось добавлять новый месяц к 12-и существующим?) все эти константы прописаны в модулях дельфи, и там имеет смысл либо выводить нужное значение "на-лету", где-нибудь в OnGetText, или использовать более современные гриды, типа cxGrid, GridEh и пр., которые позволяют задавать Pickup-листы для колонки с поддержкой не только названий, но и значений.
Записан

NeferSky
Постоялец

ua
Offline Offline
Бессмертный


« Ответ #26 : 09-08-2010 22:05 » 

Верно...  Дело в том, что в грид как вносятся новые данные, так и редактируются в нем же. И я хотел, чтобы редактировать месяц можно было выпадающим списком. Инсертится же он через DecodeDate, то есть, как интежер.
А с лукапом вот только что разобрался, спасибо) "Всегда обращай внимание на мелочи", как говорит один мой друг Вагон. В гриде жестко прописаны столбцы, и я, конечно, не переделал столбик месяцев для лукапа...
Записан

Не тронь налаженный механизм, и он тебя не подведет.
Делать надо хорошо, а плохо - само получится.
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #27 : 10-08-2010 04:37 » 

я об этом и говорю, что для задания выпадающего списка необязательно заводить отдельную таблицу, достаточно заюзать свойство PickupList у колонки грида. но стандартный грид позволяет прописать только значения, т.е. "январь, февраль" и т.д. поэтому лучше сразу взять нормальный грид, который умеет в пикап-листе показывать одно, а в базу вставлять другое.

выносить в отдельные таблицы имеет смысл только редактируемые справочники. а что можно редактировать в списке месяцов? Ага
Записан

inviser
Новенький

ru
Offline Offline

« Ответ #28 : 30-04-2012 20:15 » 

допустим, есть две таблицы:

MainTable
Main_Id
Lookup_Id

Lookup_Table
Lookup_Id
Lookup_Name

в MainTable добавляем Main_Lookup_Name и настраиваем его следующим образом:

KeyFields := 'Lookup_Id';
DataSet = 'LookupTable';
LookupKeys = 'Lookup_Id';
ResultFields = 'Lookup_Name';

теперь прикручиваем DbGrid к MainTable и любуемся на всё это дело.

надо учесть, что типы Main_Lookup_Name и Lookup_Name должны совпадать.

У меня такая же проблема, надо чтобы вместо ключа подставлял значение из справочника...сделал все как написали, но в поле ничего не отображается((
Записан
inviser
Новенький

ru
Offline Offline

« Ответ #29 : 01-05-2012 06:58 » 

Все, получилось.
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines