Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

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

 
Kostafey ©   (2007-04-04 13:28) [0]

Подскажите пожалуйста как сделать следующее.
Пусть у нас есть 2 связанные таблицы. Первая с данными, вторая спрвочная.
Например:
Table1
T1_id - автоинкрементное поле
FIO   - поля с данными
T2_id - поле связи

Table2
T2_id - автоинкрементное поле
Gorod - поля с данными

Нужно выполнить, например, добавление записи в основную таблицу (Table1).
При этом в поле ввода (пусть это будет DBComboBox) хотелось бы видеть
значения соответствующей справочной таблицы (Gorod).

Набор данных, в который производиться добавление записи должен содержать
только 1 таблицу. Поэтому понадобиться еще один набор данных для справочной таблицы.
А значание поля связи (T2_id) можно располагать в DBComboBox.Tag.

Это все хорошо для приведенного примера о двух таблицах. Но если таблиц больше.
Наверняка есть более рациональный путь ?


 
Megabyte ©   (2007-04-04 13:54) [1]

По-моему, тебе надо DBLookupComboBox.


 
Kostafey ©   (2007-04-04 14:09) [2]

> По-моему, тебе надо DBLookupComboBox.

Гм. что-т не могу понять как он работает.
DataSource - фактическая привязка к Table1
ListSource - выводимый список значений. Или нет так ?
А как осушествляется например добавление в основную таблицу поля связи
(для приведенного примера T2_id в Table1)


 
Sonia ©   (2007-04-04 14:12) [3]

ListSource, ListField - это для справочника, а
DataSource, DataField  - это для Table1


 
Sergey13 ©   (2007-04-04 14:13) [4]

> [2] Kostafey ©   (04.04.07 14:09)

Почитай про лукап-поля. Для каждого справочника должно быть создано лукап-поле и быть открыт соответствующий датасет со справочными данными.


 
Sonia ©   (2007-04-04 14:15) [5]

Указываешь KeyField для справочной таблицы и в DataField указываешь FK на справочную


 
Kostafey ©   (2007-04-04 16:12) [6]

> Sonia, Sergey13, Megabyte
Вот спасибо как хорошо все объяснили !!!

Но вот что. Я нашел только 2 Lookup компонента (DBLookupListBox, DBLookupComboBox).
А как быть если нужно например:

1) Просто вывести значение Gorod (для приведеннго примера) в компонент типа TDBEdit
(не весь список значений а только значение соответствующее текущей записи)
и при этом иметь в этом же компоненте фактическое значение FK: T2_id.
В таком случае есть более грамотное решение чем в [0]?

2) Выводить значения нескольких полей в какой-то аналог ListField, но если у нас
есть помимо значение Gorod еще и Strana?


 
Sonia ©   (2007-04-04 16:33) [7]


>  Просто вывести значение Gorod (для приведеннго примера)
> в компонент типа TDBEdit
> (не весь список значений а только значение соответствующее
> текущей записи)

А почему нельзя для этого использовать DBLookupComboBox?

> и при этом иметь в этом же компоненте фактическое значение
> FK: T2_id.

Ты и получишь T2_id при выборе значения из DBLookupComboBox, если правильно организуешь select


> 2) Выводить значения нескольких полей в какой-то аналог
> ListField, но если у нас
> есть помимо значение Gorod еще и Strana?

ТЫ можешь организовать select так, что при выборе в DBLookupComboBox города в DBEdit, например, у тебя будет выводиться страна
Или создать на страну отдельный DBLookupComboBox


 
Kostafey ©   (2007-04-04 16:55) [8]

> [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 17:15) [9]


> А вот результат этого выбора может быть представлен одним-
> двумя полями Table2 которые заносятся в поле DBEdit формы

У тебя 2 поля заносятся в 1 Edit? А как ты их различаешь?


 
Kostafey ©   (2007-04-04 17:22) [10]

> У тебя 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;


Теперь понимяу чего я хочу?
Работать-то оно работает, но уж больно притянуто за уши...


 
Kostafey ©   (2007-04-04 17:37) [11]

Кроме того, не понятно как загружать в форме редактирования значений Table1
текущее значение в Edit1.text. Это ж фактически нужно еще один набор данных
делать специально чтобы получить и вывести это единственное значение.


 
Kostafey ©   (2007-04-04 17:46) [12]

Вообще, фактически вопрос можно свести к следующему:
Как сделать так чтобы DBLookupListBox или DBLookupComboBox выводили бы
значение соответствующее только текущей записи Table1 из Table2 ?

Это уже знчительно упростило бы задачу.


 
Kostafey ©   (2007-04-04 19:30) [13]

Начал копать в сторону TXXXField.
Интересно ж получается LookupKeyFields может быть несколко,
а вот LookupResultField - только одно.
ничего не понимаю (с)



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
15-1174876350
Slider007
2007-03-26 06:32
2007.04.22
С днем рождения ! 25 марта


2-1175179064
Sinus
2007-03-29 18:37
2007.04.22
Запрос на сравнение


9-1147893805
Vitec
2006-05-17 23:23
2007.04.22
Какой движок лучше?


8-1155109605
Alpine
2006-08-09 11:46
2007.04.22
Как повернуть рисунок (ROTATE) в TImage ?


1-1172676041
DenisNew
2007-02-28 18:20
2007.04.22
ширина закладки ttabsheet