Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MultiSelect в Гриде [D7]


Дмитрий_Б ©   (2005-11-10 13:45:00) 

Здравствуйте. Такая задача: необходимо выделять вгриде несколько Master-записей, и в другом гриде выводить Detail-записи всех выделенных в первом гриде Master-ов. Пока мысль такая:
 в обработчике события OnCellClick использовать св-во Grid.Selection, получать master_id -ы выделенных записей, переопределять текс Detail-запроса, указывая в нем where detail_id in (master_id1, master_id2, .. , master_idN) и открывать Detail-запрос заново.

Может есть решение проще и эффективнее?


КиТаЯц   (2005-11-14 12:16:00) [1]


> Sergey13 ©   (10.11.05 13:57) [1]
> -Ну и запросы у вас, - сказала БД и повисла. (с) анекдот

:)))))


Дмитрий_Б   (2005-11-14 12:13:00) [2]

Какой живой интерес вызвал мой вопрос :)
Большой спасибо всем!!!
Сделал select id in (список мастер ID), запрос открываю при нажатии на кнопку. Выборка совсем маленькая и запрос выполняется без видимых задержек. Причем процедура эта будет делаться всего несколько раз в день.
Еще раз всем спасибо.


Sergey13   (2005-11-14 10:22:00) [3]

2[14] ANB ©   (14.11.05 10:05)
> Тут хуже другое - если конкретный запрос используется довольно часто (а в связке мастер-детал так и есть)
При такой постановке вопроса (по кнопке) тут уже нет М-Д связи. Просто выборка по, на лету формируемому, условию.
Другой вопрос, что узеру будет влом тыкать и выделять записи. Он скорее всего выделит все и скачает всю детальную таблицу.
Я бы пошел по пути максимального ограничения мастер-таблицы. А от нее уже плясал в детальной. Т.е. запрос к детали будет повторять (частично) мастер-запрос  - он (слегка модифицированный) будет в IN подзапросе детали.


ANB   (2005-11-14 10:05:00) [4]


> Dioman ©   (11.11.05 17:52) [13]

Перекомпиляция, в принципе, при не очень сложном запросе много времени не занимает и, если оператор SQL выполняется не пакетно в цикле, то, как правило, на это можно забить. Тут хуже другое - если конкретный запрос используется довольно часто (а в связке мастер-детал так и есть), то этот запрос забъет весь процедурный кэш оракла и вытеснит из него другие запросы, даже параметризованные. А это уже не кузяво.

Эффективность фильтрации на клиенте будет сильно зависить от размера таблиц. Плюс пользователь перестанет видеть изменения, сделанные другими пользователями - придется ручками делать полный рефреш детал таблицы. По кнопке - пользователь будет ленится, так как при приличном объеме детал таблицы это будет долго. По таймеру - это будет вообще убийца сервера и сетки. Отсюда пойдут грабли.


Dioman   (2005-11-11 17:52:00) [5]

оракл будет перекомпилировать запрос с константами каждый раз!!!! тогда как с параметрами не будет... ). Но если тестируемая производительность нормальная - то в принципе можно.

Я не могу врубиться почему там медленно работает??? может проблема не в этом... может что-то другое тормозит задачу????

А чем не нравится способ с фильтрами??? помойму фильтрация на клиенте будет работать быстрее всего.


ANB   (2005-11-11 17:26:00) [6]


> seg   (11.11.05 16:54) [11]

А я и писал - что это на любителя. А твое предложение уже было выше. Там один минус - такой запрос не параметризируешь. А, например, оракл такие вещи не сильно любит.


seg   (2005-11-11 16:54:00) [7]

Что мешает написать "select id in (список мастер ID)"
И открыть одним запросом после выбора пользователем всех мастер-записей путем нажатия на кнопочку?

И не нужно городить огород с дополнительными таблицами.


ANB   (2005-11-11 16:42:00) [8]


> where detail_id in (master_id1, master_id2, .. , master_idN)
> и открывать Detail-запрос заново.

Запрос будет не параметризированный. Если БД локальная - то, в принципе, по барабану. А если сервер, то некузяво. Есть решение - но громоздкое, посему на любителя, не настаиваю :

Заводим еще одну таблицу только для галок. Привязываем либо к сессии (оракл), либо к пользователю, но тогда нужно обеспечить, чтобы юзеры не могли входить под одним именем. В доп. поле будем писать ID выбранной записи мастер-таблицы. В грид выводим поле с галками. При клике по галке в гриде в таблицу галок заносим или удаляем строки. Потом выборка делается без параметров одним запросом.

А стандартный мастер-детайл не умеет по нескольким мастер-строкам работать.


antoxa2005   (2005-11-11 12:19:00) [9]


> елять текс Detail-запроса, указывая в нем where detail_id
> in (master_id1, master_id2, .. , master_idN) и открывать
> Detail-запрос заново.


Я так делал работает !


Dioman   (2005-11-10 15:35:00) [10]

а если в детайл таблице вызывать сразу все записи... а при переходе в мастер таблице просто фильтр изменять? Если записей не много, то на локальной машине все должно быстро работать


Дмитрий_Б   (2005-11-10 14:21:00) [11]

Да, от клика отказался, делаю с кнопочкой.


Дмитрий_Б   (2005-11-10 14:19:00) [12]

Все и огорчение в том что надо их все видеть. Эта куча - содержимое заявок, оператор их наблюдает глазами и подбирает соответствующие им данные из другой кучи. Просто видеть их сразу все ей (оператору) будет удобнее.


seg   (2005-11-10 14:17:00) [13]

в обработчике события OnCellClick использовать св-во Grid.Selection, получать master_id -ы выделенных записей, переопределять текс Detail-запроса, указывая в нем where detail_id in (master_id1, master_id2, .. , master_idN) и открывать Detail-запрос заново.

Пользователь будет ждать переоткрытие запроса после КАЖДОГО клика?
Может поставить кнопочку, при нажатии на которую откроются все дочерние записи выбранных записей?

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


Dioman   (2005-11-10 14:10:00) [14]

а чем этот способ не устраивает?


Sergey13   (2005-11-10 14:07:00) [15]

2[2] Дмитрий_Б   (10.11.05 14:02)
Ты отвлекись от БД на время. Подумай - зачем тебе такая информация: "Эта куча принадлежит той группе"? Кому конкретно чего и сколько - непонятно. Оно надо?

Возвращаясь к БД. Может лучше фильтр наложить на мастера (чтобы "лишние" не отвлекали) и показывать также как и раньше - нормальный м-д?


Дмитрий_Б   (2005-11-10 14:02:00) [16]

Тоже думаю, что сойдет с ума. Может Вы что то делали подобное ?


Sergey13   (2005-11-10 13:57:00) [17]

2Дмитрий_Б   (10.11.05 13:45)
А у тебя БД не сойдет с ума при таком подходе?

-Ну и запросы у вас, - сказала БД и повисла. (с) анекдот


Наверх

Титульная страница Поиск, карта сайта Написать письмо