![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Master-Detail многие ко многим? [D6, IB6.x]
Felan © (2004-04-21 11:58:00)Есть база на InterBase 6.0 и программа-клиент пишущаяся на D6 c FIB+ 5.2.
На форме есть два pFIBDataSet'a у каждого из которых есть свой DataSource. Первый pFIBDataSet выбирает из таблицы коды значений, второй по этим кодам выбирает занчения из других таблиц и показывает их в DBGrid.
SQL запросы выполняются путем установки свойства Active у pFIBDataSet (которые и содержат эти запросы, естественно)
Запрос второго pFIBDataSet'a содержит параметры, которые берутся из первого DataSource. Т.е. у втрого pFIBDataSet'a в свойстве DataSource прописан первый DataSource.
Все это работает, но DBGrid (второй DataSource) содержит только одну строку значений, котороая соответствует первой (в общем случае активной) строке параметров из первого DataSource (типичное отношение Master-Detail).
Вопрос, как сделать так, что бы DBGrid отображались значения, соответствующии всем строкам кодов из первого DataSet.
Нутром чую, что таким способом это не получтися, но как? Понятно, что для этого надо делать объединение таблиц в запросе во втором pFIBDataSet, но, дело в том, что это противоречит принципиальному моменту: коды занчений должны поставляться независимо от значений (разными pFIBDataSet'ами), т.е. надо в одном запросе получать коды значений (строки из одной таблицы), а во втором отображать значения, в соответствии с этими кодами (т.е. это теже строки, только вместо цифр нормальные названия).
Какие есть пути решения проблемы? Желательно на примерах... ссылки на толковые статьи приветствуются.
Зарание спасибо!
Johnmen (2004-04-22 15:09:00) [21]Тогда второй запрос
SELECT * FROM TABEL_EMPLOYEE
JOIN tabel_select_dep1 ON tabel_select_dep1.E_CODE =
TABEL_EMPLOYEE.s_emp
stud (2004-04-22 15:05:00) [22]тогда
SELECT * FROM TABEL_EMPLOYEE
WHERE (E_CODE in (select pole from....));
а иначе ты и получиш одну строку
stud (2004-04-22 15:00:00) [23]т.е. ты имееш один набор
код1
...
кодn
и хочеш, чтобы во втором наборе выводилось
код1 название
.....
кодn название
зачем тогда превый набор нужен? если вся информация во втором наборе содержится?
Felan (2004-04-22 15:00:00) [24]Блин, все форматирование таблиц похерилось :(
Вобщем там на одно поле одно однозначное число либо дата... В послследнем только строка.
Felan (2004-04-22 14:59:00) [25]Так. Поясняю по порядку.
То Олл: Я имел ввиду, что не мне надо организовать Master-Detail, а что фактически работает Master-Detail. Потому то я и написал сюда, что не погу сообразить как это обойти или как сделать подругому.
То Соловьев: Не совсем понял, что ты имеешь ввиду, но счас поковыряюсь на эту тему. Понятно, что это не мастер-детайл. Я наверно неудачно выразился, но думаю что счас все выяснится.
То Курдль: Лукап поля показывают одно значение, а надо таблицу... Прчем эта таблица есть таже таблица, что в первом, но только вмето кодов выводятся заначения из др. таблиц. Я дальше приведу запросы.
То Anatoly Podgoretsky & Johnmen: Да не, запросы работают, это просто так работают компоненты. Если в одном указать как источник параметров другой, то параметры беруться не из всего множества строк, а только из текущей (мне надо что б из всех строк брались), это и есть мастер-детайл :)
Запросы выглядят так:
Первый
SELECT * FROM tabel_select_dep1;
Вы водит примерно такую таблицу:
S_CODE S_DEP S_EMP S_POST S_RATE S_CLASS S_ACCEPTDATE
1 7 2 6 1 13 03.10.2003
2 7 1 10 2 6 23.02.2004
3 1 2 2 3 17 18.01.2004
S_FIREDATE S_CONTRACT
15.03.2004 FpWRXwvZ
07.04.2004 pdQiNHv
null ''
И Т.Д.
Второй (упращен до запроса к одной таблице)
SELECT * FROM TABEL_EMPLOYEE
WHERE (E_CODE in (:s_emp));
Выводит только одну строку из соотв. таблицы:
E_CODE E_NUM E_FAM E_NAM E_PAT
2 0 Пупкин Василий Алибабаевич
(очевидно, связь по полю s_emp - e_code)
А должен выводиться список в соответствии с первым запросом.
Еще раз хочу сказать, что проблем SQL нет! И правильный запрос, сам по себе я составлю без проблем. Я не соображу, как в принципе разнести получение параметров и вывод данных по ним.
Возможно предложение Соловьева сработает, сейчас попробую покапаться.
stud (2004-04-22 14:56:00) [26]так построй запрос, чтобы рядом с кодом выводилось название зачем отдельный грид?
Felan (2004-04-22 14:47:00) [27]Так. Поясняю по порядку.
То Олл: Я имел ввиду, что не мне надо организовать Master-Detail, а что фактически работает Master-Detail. Потому то я и написал сюда, что не погу сообразить как это обойти или как сделать подругому.
То Соловьев: Не совсем понял, что ты имеешь ввиду, но счас поковыряюсь на эту тему. Понятно, что это не мастер-детайл. Я наверно неудачно выразился, но думаю что счас все выяснится.
То Курдль: Лукап поля показывают одно значение, а надо таблицу... Прчем эта таблица есть таже таблица, что в первом, но только вмето кодов выводятся заначения из др. таблиц. Я дальше приведу запросы.
То Anatoly Podgoretsky & Johnmen: Да не, запросы работают, это просто так работают компоненты. Если в одном указать как источник параметров другой, то параметры беруться не из всего множества строк, а только из текущей (мне надо что б из всех строк брались), это и есть мастер-детайл :)
Запросы выглядят так:
Первый SELECT * FROM tabel_select_dep1;
Вы водит примерно такую таблицу:
Соловьев (2004-04-21 12:31:00) [28]
> Вопрос, как сделать так, что бы DBGrid отображались значения,
> соответствующии всем строкам кодов из первого DataSet.
Это не мастер-детайл
Anatoly Podgoretsky (2004-04-21 12:20:00) [29]Ошибка в запросах детайл таблицы
Johnmen (2004-04-21 12:15:00) [30]>Felan ©
Вообще говоря всё должно работать. Естественно при корректном указании всех необходимых свойств.
Поэтому, возможно, есть неточности в запросах 1 и 2.
Курдль (2004-04-21 12:05:00) [31]Может еще проще использовать Lookup-поля?
Но, несомненно, лучше всего получить все одним запросом с сервера и не париться!
Соловьев (2004-04-21 12:04:00) [32]Ну и какая же здесь мастер-детайл?
повесить на событие AfterScroll первого сорса ExLocate второго, где позиционировать на первую запись соответсвующую связи.