Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Организация модификации данных в связанных таблицах.


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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо