![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Организация модификации данных в связанных таблицах.
Kostafey © (2007-04-04 13:28:00)Подскажите пожалуйста как сделать следующее.
Пусть у нас есть 2 связанные таблицы. Первая с данными, вторая спрвочная.
Например:
Table1
T1_id - автоинкрементное поле
FIO - поля с данными
T2_id - поле связи
Table2
T2_id - автоинкрементное поле
Gorod - поля с данными
Нужно выполнить, например, добавление записи в основную таблицу (Table1).
При этом в поле ввода (пусть это будет DBComboBox) хотелось бы видеть
значениясоответствующей справочной таблицы (Gorod).
Набор данных, в который производиться добавление записи должен содержать
только 1 таблицу. Поэтому понадобиться еще один набор данных для справочной таблицы.
А значание поля связи (T2_id) можно располагать в DBComboBox.Tag.
Это все хорошо для приведенного примера о двух таблицах. Но если таблиц больше.
Наверняка есть более рациональный путь ?
Kostafey (2007-04-04 19:30:00) [1]Начал копать в сторону TXXXField.
Интересно ж получается LookupKeyFields может быть несколко,
а вот LookupResultField - только одно.
ничего не понимаю (с)
Kostafey (2007-04-04 17:46:00) [2]Вообще, фактически вопрос можно свести к следующему:
Как сделать так чтобы DBLookupListBox или DBLookupComboBox выводили бы
значение соответствующее толькотекущей записи Table1 из Table2 ?
Это уже знчительно упростило бы задачу.
Kostafey (2007-04-04 17:37:00) [3]Кроме того, не понятно как загружать в форме редактирования значений Table1
текущее значение в Edit1.text. Это ж фактически нужно еще один набор данных
делать специально чтобы получить и вывести это единственное значение.
Kostafey (2007-04-04 17:22:00) [4]> У тебя 2 поля заносятся в 1 Edit? А как ты их различаешь?
Псевдокод, конечно:
//ADODataSet2 - подключен н Table2
Edit1.text:=ADODataSet2.FieldByName('Strana').asString+' '+ADODataSet2.FieldByName('Gorod').asString;
Edit1.tag:=ADODataSet2.FieldByName('T2_id').asInteger;
...
//ADODataSet1 - подключен н Table1
ADODataSet1.FieldByName('FK_T2_id').asInteger:=Edit1.tag;
ADODataSet1.Post;
Теперь понимяу чего я хочу?
Работать-то оно работает, но уж больно притянуто за уши...
Sonia (2007-04-04 17:15:00) [5]
> А вот результат этого выбора может быть представлен одним-
> двумя полями Table2 которые заносятся в поле DBEdit формы
У тебя 2 поля заносятся в 1 Edit? А как ты их различаешь?
Kostafey (2007-04-04 16:55:00) [6]> [7] Sonia © (04.04.07 16:33)
Все-то это хорошо, все-то это здорово.
Но несколько не то...
Дело в том, что с Table1,2 я взял для простоты.
В реальности Table2 точно такая же таблица со множеством полей и своими полями связей, берущими значения из справочных таблиц, и т.д.
Поэтому для выбора значения записи таблицы, будем называть ее Table2 я делал отдельную форму.
А вот результат этого выбора может быть представлен одним-двумя полями Table2 которые заносятся в поле DBEdit формы
редактирования занчений записи Table1. Так вот я хотел чтобы T2_id из Table2 заносилось в FK: T2_id из Table1 при выполнении Post.
Хотел узнать как это правильнее реализовать, где хранить T2_id и т.д.
Во всяком случае, спасибо за участие!
Sonia (2007-04-04 16:33:00) [7]
> Просто вывести значение Gorod (для приведеннго примера)
> в компонент типа TDBEdit
> (не весь список значений а только значение соответствующее
> текущей записи)
А почему нельзя для этого использовать DBLookupComboBox?
> и при этом иметь в этом же компоненте фактическое значение
> FK: T2_id.
Ты и получишь T2_id при выборе значения из DBLookupComboBox, если правильно организуешь select
> 2) Выводить значения нескольких полей в какой-то аналог
> ListField, но если у нас
> есть помимо значение Gorod еще и Strana?
ТЫ можешь организовать select так, что при выборе в DBLookupComboBox города в DBEdit, например, у тебя будет выводиться страна
Или создать на страну отдельный DBLookupComboBox
Kostafey (2007-04-04 16:12:00) [8]> Sonia, Sergey13, Megabyte
Вот спасибо как хорошо все объяснили !!!
Но вот что. Я нашел только 2 Lookup компонента (DBLookupListBox, DBLookupComboBox).
А как быть если нужно например:
1) Просто вывести значение Gorod (для приведеннго примера) в компонент типа TDBEdit
(не весь список значений а только значение соответствующее текущей записи)
и при этом иметь в этом же компоненте фактическое значение FK: T2_id.
В таком случае есть более грамотное решение чем в [0]?
2) Выводить значения нескольких полей в какой-то аналог ListField, но если у нас
есть помимо значение Gorod еще и Strana?
Sonia (2007-04-04 14:15:00) [9]Указываешь KeyField для справочной таблицы и в DataField указываешь FK на справочную
Sergey13 (2007-04-04 14:13:00) [10]> [2] Kostafey © (04.04.07 14:09)
Почитай про лукап-поля. Для каждого справочника должно быть создано лукап-поле и быть открыт соответствующий датасет со справочными данными.
Sonia (2007-04-04 14:12:00) [11]ListSource, ListField - это для справочника, а
DataSource, DataField - это для Table1
Kostafey (2007-04-04 14:09:00) [12]> По-моему, тебе надо DBLookupComboBox.
Гм. что-т не могу понять как он работает.
DataSource - фактическая привязка к Table1
ListSource - выводимый список значений. Или нет так ?
А как осушествляется например добавление в основную таблицу поля связи
(для приведенного примера T2_id в Table1)
Megabyte (2007-04-04 13:54:00) [13]По-моему, тебе надо DBLookupComboBox.