dbgrid и сортировка

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: dbgrid и сортировка

Сообщение yuray » 03.06.2009 11:05:56

alexs писал(а):
yuray писал(а):Но если уж очень надо, а временами это удобный способ быстро получить доступ к последней или первой записи,

alexs писал(а):Лучше предоставить возможности по хорошей фильтрации данных - желательно незаметной для пользователя.

Вопросы?

Фильтрация - это хорошо. Но спрашивают именно о сортировке. Да и с фильтрацеей те же грабли. Где ее делать? Как по мне, то на сервере, включая в запрос конструкцию where. Подозреваю, что и тут будут замечания, что делать все это нужно на стороне клиента. Полемика в том, что одни предлагают сортировку (а может и фильтрацию, калькуляцию, подстановку и т.д.) выносить в клиент, а другие - поручить эти операции серверу. Уверен, что однозначного ответа нет, так как много зависит от условий эксплуатации приложения, его архитектуры.
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: dbgrid и сортировка

Сообщение Dmitry » 03.06.2009 18:34:53

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

Вот поэтому человек и спрашивал, как сделать сортировку средствами dbGrid
Dmitry
новенький
 
Сообщения: 52
Зарегистрирован: 05.07.2005 08:53:06

Re: dbgrid и сортировка

Сообщение alexs » 03.06.2009 21:23:12

SeventhSon писал(а):равно сортируются только по возрастанию

Я там недавно глюк в TRXMemDataSet (в примере именно он используется) подправил - текущая версия в svn должна нормально отрабатывать.

Добавлено спустя 2 минуты 39 секунд:
yuray писал(а):Да и с фильтрацеей те же грабли. Где ее делать? Как по мне, то на сервере, включая в запрос конструкцию where.

Однозначно на сервере. Причём стараться делать алгоритм так, чтобы пользователь даже не думал о том, что надо фильтровать данные. Просто выдавать ему данные, которые нужны в зависимости от текущего контекста.
Dmitry писал(а):Первая выборка - выбираются все записи с сервера на клиент в dbGrid

Все или всёж только после наложения условий фильтрации?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: dbgrid и сортировка

Сообщение Dmitry » 04.06.2009 12:32:01

alexs писал(а):
Dmitry писал(а):Первая выборка - выбираются все записи с сервера на клиент в dbGrid

Все или всёж только после наложения условий фильтрации?

Естесственно, что после наложения условия фильтрации, но при изменении фильтра к пользователю должны отправляться только измененные записи, а не все сразу.
Короче. Грустная история о визуальных средствах разработки:
Дали мне написать очередному студенту курсовик на дельфи. До этого я только мельком видел 6-й дельфи, а так на флешке сразу шла инсталляха 7-го.
Задачка простенькая - работа с локальной базой данных.
Ну я сразу кидаю на форму dbGrid и ищу, откуда он должен брать данные. Оказывается - из какого-то DataSet.
Нашел этот DataSet во вкладке 'Data Access'. Он хочет какой-то DataSource. Ничего с таким названием в компонентах не нашел.
Пошел от противного - кинул на форму компонент Table из BDE. В нем даже смог открыть локальную табличку. Как его привязать к остальным компонентам - совершенно не понятно. Нашел какие-то компоненеты типа SQLDataSource, LocalDataSource. Первый ищет какую-то SQL базу данных, второй лезет в ODBC и BDE. Я как человек вменяемый понимаю, что никто в том институте, где будет сдаваться этот курсак не будет в ODBC и BDE создавать ни какие таблицы и базы данных, а поэтому моя прога не заработает.
Нашел, что к table нужно привязывать или Base, или Session. Base лезет в BDE и хочет какие-то пароли. Session не понятно что делает.
Промучавшись пару часов я сумел таки привязать dbGrid к Table. Связка выглядела так Table - Session - DataSet - dbGrid.
Заработало. Кинул на форму dbNavigator. Начало работать. Все замечательно.
Захотел сделать редактирование пользователей в отдельнов окошке. Выставил свойство rowSelect=true и сделал обработчик onClick. В отдельном окошке меняю значения - они изменяются в базе данных. Замечательно. При нажатии на dbNavigator кнопки "добавить" зачем-то сразу добавляется пустое поле в базу данных. Как вместо этого перейти на форму с вводом полей - непонятно. Сообщение об удалении записи выводится на английском языке.

Короче. Промучавшись пол-дня я снес нафиг все эти db-приблуды. Тупо читаю базу вручную и вывожу ее в ListView. Редактирую - как хочу. Сортирую - как хочу. Пишу - как хочу. Фильтрую - как хочу.

Вопрос: Нафиг это графическое гуано, если с ним не возможно по человечески работать.
Dmitry
новенький
 
Сообщения: 52
Зарегистрирован: 05.07.2005 08:53:06

Re: dbgrid и сортировка

Сообщение Mr.Smart » 04.06.2009 14:01:24

Dmitry писал(а):Короче. Промучавшись пол-дня я снес нафиг все эти db-приблуды. Тупо читаю базу вручную и вывожу ее в ListView. Редактирую - как хочу. Сортирую - как хочу. Пишу - как хочу. Фильтрую - как хочу.

Я так всегда делал и не парился :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: dbgrid и сортировка

Сообщение Vadim » 04.06.2009 14:11:43

Я так понял, книжек никто не читает. :D Да оно может и к лучшему - меньше знаешь - крепче спишь. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: dbgrid и сортировка

Сообщение Mr.Smart » 04.06.2009 14:38:23

Vadim писал(а):Я так понял, книжек никто не читает. :D Да оно может и к лучшему - меньше знаешь - крепче спишь. :)

Причём здесь книжки? В своих разработках некогда не использовал DB* компоненты ибо они убогие и не удобные...

а вообще каждый программист реализует задачу по своему. например я всегда стараюсь не пользоваться чужими компонентами, проще самому реализовать функцианальность, чем отлавливать чужие баги...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: dbgrid и сортировка

Сообщение Dmitry » 04.06.2009 14:46:22

Vadim писал(а):Я так понял, книжек никто не читает. :D Да оно может и к лучшему - меньше знаешь - крепче спишь. :)

А просветите, тогда, пожалуйста, как в dbGrid можно выводить отрицательные числа другим цветом, сделать активной любую строчку и т.п.
Меня вот попросили, чтобы когда заново открывался список из базы, список уже был передвинут на ту позицию, которая редактировалась последней.

Я вот вообще не понимаю, как можно пользоваться этим костылем вместо нормальных SQL запросов.
Привидите пример чего-нибудь более удобного вместо
QUERY := Format('select * from foo_base where id="%s";'+#0, [id]);
mysql_query(sock, @QUERY[1]);
Это если учесть, что написано мной более 5 лет назад, когда db* компоненты были в зачаточном состоянии, и работает успешно без всяких GUI тулзов.
Dmitry
новенький
 
Сообщения: 52
Зарегистрирован: 05.07.2005 08:53:06

Re: dbgrid и сортировка

Сообщение Vadim » 04.06.2009 15:58:53

Mr.Smart писал(а):а вообще каждый программист реализует задачу по своему. например я всегда стараюсь не пользоваться чужими компонентами, проще самому реализовать функцианальность, чем отлавливать чужие баги...

Для меня важнее быстрота. И писать свой DBGrid, если есть чужой, я не хочу. ;)

Добавлено спустя 7 минут 34 секунды:
Dmitry писал(а):А просветите, тогда, пожалуйста, как в dbGrid...
...Я вот вообще не понимаю, как можно пользоваться этим костылем вместо нормальных SQL запросов.

К сожалению вообще потерял нить Ваших рассуждений. Это больше смахивает на винигрет - мешать в одну кучу DBGrid и SQL запросы. Каждый компонент занимается своим делом: компонент Query посылает запросы и принимает данные этого запроса, а DBGrid принятые данные отображает. На организацию связки уходит не более 3-ёх минут.
К сожалению я не понял, что Вы у меня спрашиваете, извините. :)
Dmitry писал(а):Привидите пример чего-нибудь более удобного вместо
QUERY := Format('select * from foo_base where id="%s";'+#0, [id]);
mysql_query(sock, @QUERY[1]);

Запросто:
Код: Выделить всё
Query.SQL.Text:='select * from foo_base where id='+IntToStr(id);
Query.Open;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: dbgrid и сортировка

Сообщение Dmitry » 04.06.2009 16:37:48

Я про то, что для хранения значений dbGrid все равно использует какой-то массив/список/и т.п. и сортировка может быть на стороне клиента.
Так почему он не может нормально с ним работать, а только через кучу непонятных компонентов.
Я вообще не понимаю, что такое компоненты DataSet и DataSource. Вот объясните мне, почему я не могу напрямую связать компонент Table и dbGrid? Религия запрещает? Тем более, что сам компонент Table умеет и фильтровать запросы, и читать данные и т.п.
Получается, что в памяти хранятся как минимум две копии данных, прочитанных их таблицы.
И еще, мне надо чтобы некоторые значения подсвечивались другим цветом. Я долго и нудно искал, как сделать это, но так и не нашел.
Dmitry
новенький
 
Сообщения: 52
Зарегистрирован: 05.07.2005 08:53:06

Re: dbgrid и сортировка

Сообщение yuray » 04.06.2009 16:45:10

Dmitry писал(а):А просветите, тогда, пожалуйста, как в dbGrid можно выводить отрицательные числа другим цветом, сделать активной любую строчку и т.п.
Меня вот попросили, чтобы когда заново открывался список из базы, список уже был передвинут на ту позицию, которая редактировалась последней.

Очень просто такие вещи делаются. Разноцветный грид делается с помощью OnDrawColumnCell. Позиционирование - с помощью locate. Гугля в помощь.
Mr.Smart писал(а):а вообще каждый программист реализует задачу по своему. например я всегда стараюсь не пользоваться чужими компонентами, проще самому реализовать функцианальность, чем отлавливать чужие баги...

Да, согласен. С чужими компонентами иметь дело не очень хорошо. Я тоже стараюсь не использовать db-контролы. Но не использовать штатный dbgrid - это уже крайность.
Vadim писал(а):Каждый компонент занимается своим делом: компонент Query посылает запросы и принимает данные этого запроса, а DBGrid принятые данные отображает. На организацию связки уходит не более 3-ёх минут.

3 минуты?!! Что-то много времени. :D

Оффтоп.
Последний раз редактировалось yuray 04.06.2009 17:07:38, всего редактировалось 1 раз.
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: dbgrid и сортировка

Сообщение Vadim » 04.06.2009 16:57:46

yuray писал(а):3 минуты?!! Что-то много времени.

Ну простите, я в это время ещё и чай с малиновым вареньем и бубликами пью. Надо же от работы и удовольствие получать. :) А вообще торопливость вредна. Я однажды поторопился и кинул на форму вместо DBGrid - StringGrid, а потом долго чесал тыковку, отчего это я не могу запрос туда присобачить. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: dbgrid и сортировка

Сообщение Climber » 04.06.2009 17:02:27

Mr.Smart писал(а):Причём здесь книжки? В своих разработках некогда не использовал DB* компоненты ибо они убогие и не удобные...

... например я всегда стараюсь не пользоваться чужими компонентами, проще самому реализовать функцианальность, чем отлавливать чужие баги...

Странное дело, с первым утверждением согласен, со вторым - нет...

У DB компонентов есть одно свойство, за которое я их сильно не люблю: при разрыве соединения с сервером все содержимое грида сразу же пропадает. Казалось бы, ерунда какая. А вот работал я как-то в коллекторском агентстве, у некоторых наших филиалов провайдеры были фиговые. Связь рвалась каждые 5 минут. Выгрузил человек список телефонов, и давай по ним звонить. И тут список пропадает... И содержание вчерашней беседы, записанной в базе, тоже. Вот облом. И рабочий день уходит не на беседы с клиентом, а на всякую ерунду. Мы не использовали эти компоненты и я об этом не жалею. Хотя как побочный эффект - приходится пару дней убить на свой "костыль".
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: dbgrid и сортировка

Сообщение Vadim » 04.06.2009 17:02:57

Dmitry
DataSet - это тот самый массив(список) откуда DBGrid берет данные для отображения.
TTable - это потомок DataSet'а, в котором реализованы некоторые дополнительные функции, не являющиеся общими для всех без исключения наборов данных.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: dbgrid и сортировка

Сообщение Dmitry » 04.06.2009 17:54:51

yuray писал(а):
Dmitry писал(а):А просветите, тогда, пожалуйста, как в dbGrid можно выводить отрицательные числа другим цветом, сделать активной любую строчку и т.п.
Меня вот попросили, чтобы когда заново открывался список из базы, список уже был передвинут на ту позицию, которая редактировалась последней.

Очень просто такие вещи делаются. Разноцветный грид делается с помощью OnDrawColumnCell. Позиционирование - с помощью locate. Гугля в помощь.

Мда. Уж очень не очевидно. Не понимаю, почему к каждой ячейке нельзя приспособить стиль, а нужнно делать это только в момент Repaint или т.п.
И еще такой вопрос, я вот помню, по-моему еще в Clarion 3 можно было объединять несколько колонок в группу под общим заголовком. Как с этим обстоит у dbGrid? Ни в Delphi, ни в Lazarus я такого не нашел. Может есть какие-нибудь компоненты для этого?
Я помню, что для Delphi были какие-то компоненты от Opaque Software.

B еще вопрос. Буду очень благодарен, если ответите. Запустил я Lazarus. У меня есть две вкладки компонентов: 'Data Controls' и 'Data Access'
В 'Data Access' есть только один компонент: DataSource.
Вопрос: Где взять DataSet для него? Система: FreeBSD 7.2, Lazarus 0.9.26.2
Кинул на форму dbGrid и DataSource. В свойствах dbGrid.DataSource ничего не выбирается. Т.е. dbGrid упорно не видит, что на форме кроме него присутствует еще и этот компонент.
Dmitry
новенький
 
Сообщения: 52
Зарегистрирован: 05.07.2005 08:53:06

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 38

Рейтинг@Mail.ru