| 
			| 
					
						| 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 »  |  | 
 
 Все, получилось. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |