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
Модератор
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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #4 : 09-12-2004 13:39 » |
|
sal, не там смотришь, не в инспекторе объектов, а в редакторе полей. Щёлкни дважды на TIbTable, и он откроется. в нём щёлкаешь правой кнопкой, добавляешь нужные поля, потом опять добавляешь поле, но уже не Data, а Lookup.
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #5 : 09-12-2004 13:40 » |
|
"добавляешь" - имеется в виду "New field... ". а остальные поля по "Add fields".
|
|
|
Записан
|
|
|
|
sal
Гость
|
|
« Ответ #6 : 10-12-2004 06:23 » |
|
И еще один глупый вопрос. Все ок. У меня получилось добавить поле Lookup, но не пойму, как связать Grid с IBTable или Grid уже использовать не получится?
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #7 : 10-12-2004 06:26 » |
|
так же, как обычно, через TDataSource.
|
|
|
Записан
|
|
|
|
sal
Гость
|
|
« Ответ #8 : 10-12-2004 07:31 » |
|
Ну вроде все так. Тогда мне непонятна иерархия: у меня так: TIBDatabase -> TIBTransaction -> TIBDataSet -> TDataSources -> DBGrid. А куда TIBTable засунуть? как-то он не вписывается в эту цепочку.
|
|
|
Записан
|
|
|
|
x77
Модератор
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
Модератор
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
Модератор
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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #15 : 10-12-2004 09:13 » |
|
sal, amen
|
|
|
Записан
|
|
|
|
he1p
Гость
|
|
« Ответ #16 : 16-04-2009 15:34 » |
|
поле в дбгриде работает, но при дублировании записей вылетает ошибка( что делать помогите пожалуйста
|
|
|
Записан
|
|
|
|
Freez1992
Гость
|
|
« Ответ #17 : 25-02-2010 14:53 » |
|
Здраствуйте, у меня такой вопрос: вот сделала я такие поля (lookup) допустим "улица" обычное поле(data) скрыл все работает...НО если в связанной таблице нету улицы которая допустим была введена вручную то и lookup поле "улица" остается пустое, хотя в это время в обычном поле "улица" (скрытое) имеет значение... как сделать чтобы в lookup поле показывалесь элементы которых нет в lookup-list'е..??
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #18 : 25-02-2010 14:57 » |
|
DFM формы в студию.
|
|
|
Записан
|
|
|
|
Freez1992
Гость
|
|
« Ответ #19 : 25-02-2010 15:23 » |
|
воть)
|
|
|
Записан
|
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #20 : 25-02-2010 15:59 » |
|
у вас не совпадают значения ключевых полей для LookUp поля.
Table1.Naim = 'Ленин', Table2.Naim = 'Ленина'. Значения "Кутузова" во второй таблице вообще нет. Поэтому лукап поле ничего не показывает.
|
|
|
Записан
|
|
|
|
Freez1992
Гость
|
|
« Ответ #21 : 25-02-2010 16:19 » |
|
Вопрос и был в том чтобы при отсутствии совпадения во второстепенной таблице (списке) лукап выводил бы оригинальное значение главной таблицы...т.е так сделать нельзя?
|
|
|
Записан
|
|
|
|
x77
Модератор
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
Постоялец
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
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #25 : 07-08-2010 13:40 » |
|
чему равно LookupListSource у lookup-поля?
з.ы. для месяцев заводить лукап-таблицу особого смысла нет, это константы, которые не меняются. (часто вам приходилось добавлять новый месяц к 12-и существующим?) все эти константы прописаны в модулях дельфи, и там имеет смысл либо выводить нужное значение "на-лету", где-нибудь в OnGetText, или использовать более современные гриды, типа cxGrid, GridEh и пр., которые позволяют задавать Pickup-листы для колонки с поддержкой не только названий, но и значений.
|
|
|
Записан
|
|
|
|
NeferSky
Постоялец
Offline
Бессмертный
|
|
« Ответ #26 : 09-08-2010 22:05 » |
|
Верно... Дело в том, что в грид как вносятся новые данные, так и редактируются в нем же. И я хотел, чтобы редактировать месяц можно было выпадающим списком. Инсертится же он через DecodeDate, то есть, как интежер. А с лукапом вот только что разобрался, спасибо) "Всегда обращай внимание на мелочи", как говорит один мой друг Вагон. В гриде жестко прописаны столбцы, и я, конечно, не переделал столбик месяцев для лукапа...
|
|
|
Записан
|
Не тронь налаженный механизм, и он тебя не подведет. Делать надо хорошо, а плохо - само получится.
|
|
|
x77
Модератор
Offline
Пол:
меняю стакан шмали на обратный билет с Марса.
|
|
« Ответ #27 : 10-08-2010 04:37 » |
|
я об этом и говорю, что для задания выпадающего списка необязательно заводить отдельную таблицу, достаточно заюзать свойство PickupList у колонки грида. но стандартный грид позволяет прописать только значения, т.е. "январь, февраль" и т.д. поэтому лучше сразу взять нормальный грид, который умеет в пикап-листе показывать одно, а в базу вставлять другое. выносить в отдельные таблицы имеет смысл только редактируемые справочники. а что можно редактировать в списке месяцов?
|
|
|
Записан
|
|
|
|
inviser
Новенький
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
Новенький
Offline
|
|
« Ответ #29 : 01-05-2012 06:58 » |
|
Все, получилось.
|
|
|
Записан
|
|
|
|
|