Несколько вопросов по применению TDBGrig

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Несколько вопросов по применению TDBGrig

Сообщение ger_kar » 26.08.2012 (Вс) 12:50

С контролом TDBGrid поставляется довольно много всевозможных примеров его применения и тем не менее на все возникающие вопросы, изучение этих примеров, ответы не дает. Поэтому задам их на форуме. Контрол не очень редкий, особенно у Дельфистов. Может и на нашем форуме его знают.
Вот и первый вопрос:
Исходные данные: контрол связан с базой данных через ADODB.Recordset. AdoDc и TDataLite не используются. К рекордсету применяется фильтр, поэтому набор отображаемых данных в TDBGrid может меняться в зависимости от фильтра.
А сам вопрос таков как можно пронумеровать отображаемые данные? Т.е. в отдельно выделенной колонке выводить номер записи. Ну и по некоторым колонкам нужно подбить итоги. Итоги посредством запроса не подходят ибо при применении фильтра их нужно пересчитать, а итоги если делать их через запрос считаются без учета фильтра.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Несколько вопросов по применению TDBGrig

Сообщение ger_kar » 27.08.2012 (Пн) 7:18

Это уже скорее вопрос по рекордсету, но тем не менее он призван решить проблему, обозначенную выше с подведением итогов. Кк показали небольшие тесты, самый быстрый способ подведения итогов - сделать это через SQL запрос. Применительно к предыдущей задаче с фильтром на выходе рекордсета имеется набор отфильтрованных записей, которые собственно TDBGrid просто отображает. Так вот вопрос таков, можно ли сделать новый запрос не к базе данных, а к уже имеющимусю открытому рекордсету, и если это вообще возможно, то как это можно проделать?
Ведь по сути рекордсет это такая же таблица с отобранными записями, только временная. Или я не прав?
Бороться и искать, найти и перепрятать

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Несколько вопросов по применению TDBGrig

Сообщение FireFenix » 27.08.2012 (Пн) 7:46

ger_kar писал(а):А сам вопрос таков как можно пронумеровать отображаемые данные?

Наскока я понимаю TDBGrid есть разновидность DataGrid'a или подобных ему контролов.

Суть в том что такие вещи при прямой связи с БД выступают посредником, а не фронт-энд компонентом, тем самым просто отображает результат выполненного запроса.
Т.е. если компонент использовать не в виде таблицы, а промежутка к БД, то данные будут отображены только те которые получены в результате запроса.
Тем самым чтобы добавить колонку, нужно использовать по другому компонент или добавить колонку в таблицу БД

ger_kar писал(а):Так вот вопрос таков, можно ли сделать новый запрос не к базе данных, а к уже имеющимусю открытому рекордсету

Нет

ger_kar писал(а):и если это вообще возможно, то как это можно проделать?

1) Правильную организацию БД
2) Сложный запрос
3) Временные таблицы
4) В два запроса
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Несколько вопросов по применению TDBGrig

Сообщение ger_kar » 27.08.2012 (Пн) 9:29

FireFenix писал(а):Наскока я понимаю TDBGrid есть разновидность DataGrid'a или подобных ему контролов.
Да, но только с сильно расширенным функционалом.
FireFenix писал(а):Т.е. если компонент использовать не в виде таблицы, а промежутка к БД, то данные будут отображены только те которые получены в результате запроса.
Ну да, так оно и есть. Применили например фильтр к рекордсету - изменяется и набор выводимых записей.
FireFenix писал(а):Тем самым чтобы добавить колонку, нужно использовать по другому компонент или добавить колонку в таблицу БД
Дык саму то колонку можно добавить без проблем, а если точнее я ее уже добавил. Вопрос теперь в том, как ее заполнить так, чтобы в ней отражались текущие порядковые номера записей. Т.е. первой записи соответствовал номер 1 и так далее. И чтобы после применения фильтрации нумерация обновлялась в соответствии с обновленным набором.
FireFenix писал(а):4) В два запроса
В смысле запрос с вложенным подзапросом чтоли? Или два отдельных?
FireFenix писал(а):1) Правильную организацию БД
К сожалению база уже есть и заполнена данными, я делаю оболочку и приходится работать, с тем что дал заказчик.
FireFenix писал(а):2) Сложный запрос
Так запрос и так сложный. Этот сложный запрос выдает набор записей. Далее к нему могут применяться фильтры. В таком исполнении все работает быстро. Если отказаться от фильтров, то тоже самое конечно можно сделать и через запрос, просто включив в него соответствующие условия отбора, но в этом случае вместо простой и быстрой фильтрации уже имеющихся данных будет снова выполняться этот еще более усложнившийся запрос, что как мне кажется будет очень не оптимально. Кроме того это будут даже не один, а два сложных запроса один для отбора самих записей и потом второй, подводящий итоги.
FireFenix писал(а):3) Временные таблицы
Т.е. результат сложного запроса скидывать во временную таблицу, а вместо фильтрации применять новый запрос, но уже к этой таблице?
А зачем тогда придумали фильтрацию. И разве результат запроса в виде записей рекордсета не представляет из себя временную таблицу?
Но тогда почему к нему нельзя обратится как к таблице?
Бороться и искать, найти и перепрятать

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Несколько вопросов по применению TDBGrig

Сообщение FireFenix » 27.08.2012 (Пн) 11:42

ger_kar писал(а):Дык саму то колонку можно добавить без проблем, а если точнее я ее уже добавил. Вопрос теперь в том, как ее заполнить так, чтобы в ней отражались текущие порядковые номера записей. Т.е. первой записи соответствовал номер 1 и так далее. И чтобы после применения фильтрации нумерация обновлялась в соответствии с обновленным набором.

Если ты добавил колонку в таблицу, то в каждой СУБД есть ключевое поле, которое само ведёт нумерацию кортежей, чаще всего которое используют как Id

ger_kar писал(а):В смысле запрос с вложенным подзапросом чтоли? Или два отдельных?

Ты ж не написал какая СУБД, поэтому многие СУБД не поддерживают вложенные запросы => 2 отдельных запроса

ger_kar писал(а):К сожалению база уже есть и заполнена данными, я делаю оболочку и приходится работать, с тем что дал заказчик.

И что что она есть. При достаточном желании можно немного по другому сконфигурировать с сохранением данных, чтобы избежать лишних запросов

ger_kar писал(а):Так запрос и так сложный. Этот сложный запрос выдает набор записей. Далее к нему могут применяться фильтры. В таком исполнении все работает быстро. Если отказаться от фильтров, то тоже самое конечно можно сделать и через запрос, просто включив в него соответствующие условия отбора, но в этом случае вместо простой и быстрой фильтрации уже имеющихся данных будет снова выполняться этот еще более усложнившийся запрос, что как мне кажется будет очень не оптимально. Кроме того это будут даже не один, а два сложных запроса один для отбора самих записей и потом второй, подводящий итоги.

Я не знаю как работает твой контрол, но судя по тому что запрос и фильтры отдельно, то работа с фильтрами самая не производительная. СУБД сортирует по параметрам быстрее любого контрола.
Сложный запрос в том плане, чтобы за один запрос выбрать все требуемые данные, а не только промежуточные

ger_kar писал(а):Т.е. результат сложного запроса скидывать во временную таблицу, а вместо фильтрации применять новый запрос, но уже к этой таблице?

Да

ger_kar писал(а):А зачем тогда придумали фильтрацию. И разве результат запроса в виде записей рекордсета не представляет из себя временную таблицу?
Но тогда почему к нему нельзя обратится как к таблице?

Я не знаю про какие фильтры ты говоришь, наверняка фильтры для производительности применяются как часть запроса.
На твоём пути СУБД -> Драйвер ADODB -> Контрол, где АдоДб и контрол имеет свой буфер значений. Что контрол, что драйвер АдоДб спроектированы только так, как посредник в передачи данных между СУБД => они работают с самой СУБД для эффективности, а не со своим буфером.

Конечно если получить доступ у буферу значений или найти функции которые к нему обращаются, то всё возможно. Но как правило такие вещи работают только с БД
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Несколько вопросов по применению TDBGrig

Сообщение ger_kar » 27.08.2012 (Пн) 14:12

FireFenix писал(а):Ты ж не написал какая СУБД
Самая простая Access 'овская в файле .mbd
FireFenix писал(а):Я не знаю как работает твой контрол, но судя по тому что запрос и фильтры отдельно, то работа с фильтрами самая не производительная.
Сам контрол собственно ничего и не сортирует и не фильтрует, фильтрует ADODB.recordset.Filter.
При применении фильтра набор записей меняется практически мгновенно и неуловимо, если вместо фильтра делать перезапрос с измененными условиями отбора то задержка уже вполне чувствуется, а с разрастанием базы это будет только прогрессировать.
FireFenix писал(а):Если ты добавил колонку в таблицу, то в каждой СУБД есть ключевое поле, которое само ведёт нумерацию кортежей, чаще всего которое используют как Id
НУ такое поле конечно есть, но какой от него толк? Например в одном запросе запись с этим номером будет в одной строке (например 1), а в другом она может быть вообще в другом месте. ID привязан к конкретной записи а не к ее порядковому номеру в текущем наборе записей.
Бороться и искать, найти и перепрятать

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Несколько вопросов по применению TDBGrig

Сообщение ark » 10.09.2012 (Пн) 10:43

Насколько я помню, в Access нету @Row_Number, поэтому придется вручную - добавь Unbound column (что нить типа Grid.Columns.Add, наверное) и заполняй
Код: Выделить всё
For i=1 To Grid.Rows.Count
Grid.Rows(i-1).Cells(0).Value=i' Ну, или Grid(i-1,0).Value=i - не знаю, какой там синтаксис
Next

По сумме - два варианта.
1. Добавить поле(поля) суммы через Sum и Group By в начальном запросе и объединить (не помню точно, через RIGHT или INNER) JOIN с остальными полями
2. В том же цикле (см. выше) считать сумму и выводить в еще одну Unbound Column

vice4
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 31.05.2011 (Вт) 7:01

Re: Несколько вопросов по применению TDBGrig

Сообщение vice4 » 14.09.2012 (Пт) 10:58

ger_kar писал(а):НУ такое поле конечно есть, но какой от него толк? Например в одном запросе запись с этим номером будет в одной строке (например 1), а в другом она может быть вообще в другом месте. ID привязан к конкретной записи а не к ее порядковому номеру в текущем наборе записей.

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 1

    TopList