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

Вниз

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

 
Ярослав   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
15-1145951720
Игорь Н
2006-04-25 11:55
2006.05.21
API


3-1143444932
alxn
2006-03-27 11:35
2006.05.21
Как дублировать все записи в таблице


4-1141246917
Alsan
2006-03-02 00:01
2006.05.21
Reg edit !!! Как добавить тихо ???


15-1146104716
Игорь Н
2006-04-27 06:25
2006.05.21
На форме нужно открыть какую-либо программу


15-1145802899
Commirce
2006-04-23 18:34
2006.05.21
Обновление базы данных