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

Вниз

Соединение таблиц многие к одним   Найти похожие ветки 

 
Ярослав   (2006-03-29 10:10) [0]

Доброго времени суток .
Подскажите пожалуйста, кто знает как правильно организовать соединение таблиц многие к одному
я делаю это всегда вот так …
У меня две таблицы  master  и одна detail.
Id первого мастера я получаю из datasource, а
Id второго мастера я получаю вот примерно таким образом (
procedure TDM.DataSource_SNDDataChange(Sender: TObject; Field: TField);
begin
DM.pFIBDataSet_NPG.ParamByName("ISND").AsInteger:=DM.pFIBDataSet_SND.FieldValues ["SND_ID"];
}
end; )


 
Sergey13 ©   (2006-03-29 10:17) [1]

>я делаю это всегда вот так …
И что перестало устраивать?
Я обычно вешаю смену параметра мастер_ИД на АфтерСкрол мастера. Там же переоткрываю детайл-датасет.


 
Ярослав   (2006-03-29 10:51) [2]

Меня это устраивает, конечно, но всегда приходится  писать кучу всяких условий, я думал что есть какая то мало документированная поддержка использования нескольких  datasource одновременно , и так просто интересно какие решения этой проблемы люди предлагают.


 
Виталий Панасенко   (2006-03-29 15:07) [3]

Я так понял, используешь FIBPlus ? почитай на www.devrace.com статьи по поводу организации мастер-детали в этих компонентах... В опциях можно настроить даже то, что не нужно открывать в коде деталь, достаточно открыть мастер таблицы. а деталь откроется сама. А, может, я не понял вопрос.


 
Ярослав   (2006-03-29 18:37) [4]

Я имел введу использование нескольких мастеров одновременно,  соединение таблиц .- «многие к одному»,

то что в fib настроить можно что угодно я заметил .
А вот варианты  передачи значения id второго мастера меня интересует.
Id первой мастер таблицы я получаю через  datasource
А id второго мастера я получаю FieldValues ["SND_ID"] это как по мне не всегда удобно при редактировании деталь таблицы..
Хотя кажись я уже придумал как я сделаю.


 
Виталий Панасенко   (2006-03-29 19:16) [5]

нифига не понял. как это "две мастер таблицы" ?!!!


 
Ярослав   (2006-03-29 20:36) [6]

Очень просто

Допустим  у нас 3и таблицы

Одна таблица  Наименований оборудования ;
Вторая таблица Предприятий ;
Третья таблица стоимостей;

Вот таблица стоимостей есть Detail таблицей .
Естественно когда мы  заполняем  таблицу стоимостей (прайс),  мы получаем ID наименований оборудования тем самым обозначая что вот эта единица  оборудования имеет вот такую стоимость,  

Так же мы получаем  и ID предприятия, тобишъ  обозначаем  что эта стоимость принадлежит определенному предприятию.

Для примера структура вот такая

Таблица наименования оборудования  поля->( OBORUD_ID, OBORUD_NAIM)
OBORUD_ID-  (ID единицы оборудования ) он же первичный ключ
OBORUD_NAIM -(наименование оборудования )

Таблица предприятий  поля->(PRED_ID, PRED_NAIM)
PRED_ID-( ID предприятия ) он же первичный ключ
PRED_NAIM (наименование предприятия)

Таблица Стоимостей поля -> (STOIM_ID,  ID_OBORUD,  ID_PRED,  STOIM)
STOIM_ID (ID стоимости) он же первичный ключ
ID_OBORUD (вот по этому полю связь с таблицей оборудования тобиш значение OBORUD_ID) внешний ключ
ID_PRED (вот по этому полю связь с таблицей оборудования тобиш значение PRED_ID) внешний ключ
STOIM (поле стоимости )

Вот я и связываю ID_OBORUD=OBORUD_ID, и ID_PRED=PRED_ID

Механизм получения  значения OBORUD_ID, Через  datasource
А вот значение PRED_ID, я получаю приблизительно  вот так

procedure TDM.DataSource_SNDDataChange(Sender: TObject; Field: TField);
begin
DM.pFIBDataSet_STOIM.ParamByName(" ID_PRED ").AsInteger:=DM.pFIBDataSet_PRED.FieldValues [" PRED_ID "];
end; )

Мой вопрос заключался в том  как можно более нормально это все организовать.
Мой вариант такой организации соединения  таблиц «многие к одному», неудобен тем что
пишу постоянно всякие условия для проверки на неопределенное значение. Вот от так
отрывок из пробного исходника ,

procedure TDM.DataSource_SNDDataChange(Sender: TObject; Field: TField);

begin

if DM.pFIBDataSet_SND.FieldValues["SND_ID"]=null then
begin
…..
end  else
SND_SND_ID:=DM.pFIBDataSet_SND.FieldValues["SND_ID"];
DM.pFIBDataSet_NPG.ParamByName("ISND").AsInteger:=SND_SND_ID ;

end;
Хотя возможно и сам расдуплюсь.
Эли это очень просто, и я просто этого не знаю ..
Или соединение таблиц многое к одним , ни кто не использует и по этому вопросов таких ни у кого не возникает.
Плохо что все Вумные книжки, идут с простыми примерами, максимум что можно встретить это пример организации соединения таблиц, один ко многим…..


 
Johnmen ©   (2006-03-29 20:49) [7]

В общем, я кажись понЯл, в чем тут дело...:)
Автору срочно читать, а потом и делать, лукапные поля в наборе данных "Таблица Стоимостей" !!!
И не надо никаких тусклых корявых "способов".


 
Виталий Панасенко   (2006-03-30 09:17) [8]

Да, "ну очень сложный вопрос". Два несчастных справочника и одна рабочая таблица. И как там выбрать из справочника название, имея его айди ?!.Точно, задача типа теоремы Ферма: А*А+Б*Б=Ц*Ц.:-))


 
Ярослав   (2006-03-30 09:50) [9]

Нет дело тут не в том как выбрать !
Именно способов это сделать хватает и воображения тоже.
Я спрашивал как  лучше это делать, (тобишь получение текущего значения поля)
Это в примере просто 2а справочника … -)
Вобщем наверное я буду использовать класс Tfield и не …себе мозги .

Спасибо всем за помощь тема закрыта..


 
Виталий Панасенко   (2006-03-30 15:20) [10]

Все равно, ни хрена не понял. В чем вопрос ?...


 
vovnuke ©   (2006-03-30 15:34) [11]

2Виталий Панасенко
Как я понял надо было организовать два_мастера-детайл соотношение.


 
Ярослав   (2006-03-31 09:40) [12]

Да я говорил о- два_мастера-детайл соотношение  , но я спрашивал не как это делается в принципе ,
а  как это лучше всего организовывать- тоесть самый оптимальный постой и проверенный вариант.
 это в примере их 2-амастера_детал соотношения , а в жизни бывает намного больше, как я это делаю я показывал выше , «для кого то это и тусклый метод» -но так пол инета делает, некоторой народ вообще, для каждой таблички свой класс делает, декларируя там поля и..т.п.
По этому я и спросил , вы ведь наверное не один год базами занимаетесь, опыта много, перепробовали наверное много чего , чтоб облегчить себе жизнь.


 
vovnuke ©   (2006-03-31 09:49) [13]

А для чего возникла такая необходимость, если не секрет?


 
Ярослав   (2006-03-31 10:18) [14]

Нет не секрет, долбаюсь с одной базкой  не очень сложной вот у нее в следствии нормализации   чуть сложная структура взаимодействия таблиц получилась.
Кода несколько таких связей нету проблем, пользую то что умею.
а тут возникла проблемка такая , фактически  у меня получилось несколько табличек
с соединением типа (многие к одним)   к 1-й табличке обращается -2-а мастер справочника, к второй табличке обращается 1–я табличка как мастер и еще аж 3-и справочника, и 3-я табличка мастером для нее есть 1–я табличка и еще -2а справочника .
и для каждой из этих табличек еще и генерируется уникальное значение из строковой суммы ID полей , это моя 2-я база IB, раньше я делал подобное но пользовал я
AbsoluteDatabase –  нормально организовать такое взаимодействие  как по мне много кода.
Я сам не программист  , и не работаю программистом , но пришлось научится для облегчения себе жизни.
А понадобилось мне оно для того, что как правило нужно замутить базку не глючную , за сжатые сроки пару -«выходных»- по этому я и мщу оптимальный вариант , чтоб можно было написать какуето  функцию которую можно будет просто копировать и забыть о всяких поточных ошибках, которые возникают.


 
Sergey13 ©   (2006-03-31 10:31) [15]

2[14] Ярослав   (31.03.06 10:18)
Напиши единый обработчик переоткрытия детайла и повесь его на АфтерСкрол всех мастеров. Только тут надо следить за слишком частым переоткрытием детайла при создании формы/контролов - это иногда вызывает пролистывание всего датасета.



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

Форум: "Базы";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.013 c
4-1139121673
Aladin
2006-02-05 09:41
2006.05.21
tv tuner


2-1146328385
Damian
2006-04-29 20:33
2006.05.21
Доступ к данным на CD


6-1138024115
frEE)styler
2006-01-23 16:48
2006.05.21
Подсчитать трафик определенного сайта


4-1141072241
Grief
2006-02-27 23:30
2006.05.21
процессорное время для процесса.


15-1145869706
jack128
2006-04-24 13:08
2006.05.21
Найди группу на картинке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский