Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
2-1175423128
I-New
2007-04-01 14:25
2007.04.22
Помогите написать плиз


15-1175006565
oldman
2007-03-27 18:42
2007.04.22
Почему мы так поступили?


1-1172573346
Choco
2007-02-27 13:49
2007.04.22
Размер кадра видеофайла


11-1154280166
Vladimir Kladov
2006-07-30 21:22
2007.04.22
Версия 2.37


2-1175499588
Knock
2007-04-02 11:39
2007.04.22
record в record е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский