![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Соединение таблиц многие к одним [D7, IB6.x]
Ярослав © (2006-03-29 10:10:00)Доброго времени суток .
Подскажите пожалуйста, кто знает как правильно организовать соединение таблиц многие к одному
я делаю это всегда вот так …
У меня две таблицы 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-31 10:31:00) [1]2[14] Ярослав (31.03.06 10:18)
Напиши единый обработчик переоткрытия детайла и повесь его на АфтерСкрол всех мастеров. Только тут надо следить за слишком частым переоткрытием детайла при создании формы/контролов - это иногда вызывает пролистывание всего датасета.
Ярослав (2006-03-31 10:18:00) [2]Нет не секрет, долбаюсь с одной базкой не очень сложной вот у нее в следствии нормализации чуть сложная структура взаимодействия таблиц получилась.
Кода несколько таких связей нету проблем, пользую то что умею.
а тут возникла проблемка такая , фактически у меня получилось несколько табличек
с соединением типа (многие к одним) к 1-й табличке обращается -2-а мастер справочника, к второй табличке обращается 1–я табличка как мастер и еще аж 3-и справочника, и 3-я табличка мастером для нее есть 1–я табличка и еще -2а справочника .
и для каждой из этих табличек еще и генерируется уникальное значение из строковой суммы ID полей , это моя 2-я база IB, раньше я делал подобное но пользовал я
AbsoluteDatabase – нормально организовать такое взаимодействие как по мне много кода.
Я сам не программист , и не работаю программистом , но пришлось научится для облегчения себе жизни.
А понадобилось мне оно для того, что как правило нужно замутить базку не глючную , за сжатые сроки пару -«выходных»- по этому я и мщу оптимальный вариант , чтоб можно было написать какуето функцию которую можно будет просто копировать и забыть о всяких поточных ошибках, которые возникают.
vovnuke (2006-03-31 09:49:00) [3]А для чего возникла такая необходимость, если не секрет?
Ярослав (2006-03-31 09:40:00) [4]Да я говорил о- два_мастера-детайл соотношение , но я спрашивал не как это делается в принципе ,
а как это лучше всего организовывать- тоесть самый оптимальный постой и проверенный вариант.
это в примере их 2-амастера_детал соотношения , а в жизни бывает намного больше, как я это делаю я показывал выше , «для кого то это и тусклый метод» -но так пол инета делает, некоторой народ вообще, для каждой таблички свой класс делает, декларируя там поля и..т.п.
По этому я и спросил , вы ведь наверное не один год базами занимаетесь, опыта много, перепробовали наверное много чего , чтоб облегчить себе жизнь.
vovnuke (2006-03-30 15:34:00) [5]2 Виталий Панасенко
Как я понял надо было организовать два_мастера-детайл соотношение.
Виталий Панасенко (2006-03-30 15:20:00) [6]Все равно, ни хрена не понял. В чем вопрос ?...
Ярослав (2006-03-30 09:50:00) [7]Нет дело тут не в том как выбрать !
Именно способов это сделать хватает и воображения тоже.
Я спрашивал как лучше это делать, (тобишь получение текущего значения поля)
Это в примере просто 2а справочника … -)
Вобщем наверное я буду использовать класс Tfield и не …себе мозги .
Спасибо всем за помощь тема закрыта..
Виталий Панасенко (2006-03-30 09:17:00) [8]Да, "ну очень сложный вопрос". Два несчастных справочника и одна рабочая таблица. И как там выбрать из справочника название, имея его айди ?!.Точно, задача типа теоремы Ферма: А*А+Б*Б=Ц*Ц.:-))
Johnmen (2006-03-29 20:49:00) [9]В общем, я кажись понЯл, в чем тут дело...:)
Автору срочно читать, а потом и делать, лукапные поля в наборе данных "Таблица Стоимостей" !!!
И не надо никаких тусклых корявых "способов".
Ярослав (2006-03-29 20:36:00) [10]Очень просто
Допустим у нас 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;
Хотя возможно и сам расдуплюсь.
Эли это очень просто, и я просто этого не знаю ..
Или соединение таблиц многое к одним , ни кто не использует и по этому вопросов таких ни у кого не возникает.
Плохо что все Вумные книжки, идут с простыми примерами, максимум что можно встретить это пример организации соединения таблиц, один ко многим…..
Виталий Панасенко (2006-03-29 19:16:00) [11]нифига не понял. как это "две мастер таблицы" ?!!!
Ярослав (2006-03-29 18:37:00) [12]Я имел введу использование нескольких мастеров одновременно, соединение таблиц .- «многие к одному»,
то что в fib настроить можно что угодно я заметил .
А вот варианты передачи значения id второго мастера меня интересует.
Id первой мастер таблицы я получаю через datasource
А id второго мастера я получаю FieldValues ['SND_ID'] это как по мне не всегда удобно при редактировании деталь таблицы..
Хотя кажись я уже придумал как я сделаю.
Виталий Панасенко (2006-03-29 15:07:00) [13]Я так понял, используешь FIBPlus ? почитай на www.devrace.com статьи по поводу организации мастер-детали в этих компонентах... В опциях можно настроить даже то, что не нужно открывать в коде деталь, достаточно открыть мастер таблицы. а деталь откроется сама. А, может, я не понял вопрос.
Ярослав (2006-03-29 10:51:00) [14]Меня это устраивает, конечно, но всегда приходится писать кучу всяких условий, я думал что есть какая то мало документированная поддержка использования нескольких datasource одновременно , и так просто интересно какие решения этой проблемы люди предлагают.
Sergey13 (2006-03-29 10:17:00) [15]>я делаю это всегда вот так …
И что перестало устраивать?
Я обычно вешаю смену параметра мастер_ИД на АфтерСкрол мастера. Там же переоткрываю детайл-датасет.