Опять вопрос по обновлению отображения данных...
-
- Сообщения: 250
- Зарегистрирован: 25 июл 2007, 21:33
Опять вопрос по обновлению отображения данных...
Примеры и названия компонентов из Delphi поэтому приношу извинения не владеющим темой, просто так гораздо понятнее, чем в теории объяснять "на пальцах"...
Вот такие вопросы - по порядку:
Сейчас у меня используется Paradox данные из одной таблицы выбираются с помощью TTable и отображаются с DBCtrlGrid так как нужно не просто отображение a-la-Grig а более визуализированное - цвет поля, цвет разных текстовых пометок на поле, и так далее...
Так вот... Для обновления естественно делается Refresh для данного TTable. И всё работает нормально. То есть как бы полностью DBCtrlGrid не перерисовывается каждый раз - изменилась одна запись, она и перерисовалась...
Теперь ставлю вместо Ttable TQuery (пока в том же Paradox). Поскольку для TQuery метод Refresh толком ничего не даёт, использовать его бессмысленно (хотя, кстати, кое что даёт. В частности есть у меня в таблице определённое поле типа TimeStamp а в DBCtrlGrid нужно отображать время прошедшее с момента указанного в этом поле, до "сейчас". Так вот, при Refresh даже TQuery это время меняется, а вот изменения других полей - нифига...) То есть получается что надо переоткрывать Query. Закрывать и открывать. Ну про то, что надо запомнить текущую запись чтобы после открытия к ней вернуться, я даже не говорю, это мелочи... А вот факт, что открытие-закрытие Query вызывает полную перерисовку DBCtrlGrid сказать надо. Видно. Как бы "листается". Хотя таблица в общем не очень большая - порядка 600 записей вся, отображать надо единовременно ну, не менее 200 как правило. То есть при Refresh Ttable всё работает нормально, а при Close-Open TQuery - тормозит!
Правда это всё для Paradox.
А теперь собственно вопрос - в РСУБД (и в частности для FireBird) каким образом умеют обновляться данные в DataSet'ах? Например в том же наиболее популярном FIBPlus? Кто-нибудь сталкивался? Тоже по факту идёт полное переоткрытие DataSet и потом нужно позиционироваться на заранее сохранённую запись, которая была текущей до закрытия, и обрабатывать возможную ситуацию, что эта запись могла быть удалена другим пользователем во время перетокрытия текущим клиентом? Или есть встроенные меахнизмы?
Вроде в том же FIBDataSet есть SelectSQL, UpdateSQL... и в том числе и RefreshSQL который как бы отвечает за обновление текущей записи? То есть полного переполучения данных с сервера, не будет, в этом вроде и смысл клиент-сервера? То есть если я изменяю в FIBDataSet одну запись, по идее она с помощью RefreshSQL должна отобразиться правильно? И мой DBCtrlGrid должен это поймать и отрисовать... (ведь в случае с Ttable он же это делает?!?) Заморочка хорошая... Пытался искать компоненты на замену DBCtrlGrid но поиск не дал результатов - все Grid'ы заточены на отображение строковых данных с вариациями (объединение колонок, многострочные колонки и так далее). Ну в самом деле, не один же я вывожу данные не с помощью Гридов, а как-то иначе?!?
Вот такие вопросы - по порядку:
Сейчас у меня используется Paradox данные из одной таблицы выбираются с помощью TTable и отображаются с DBCtrlGrid так как нужно не просто отображение a-la-Grig а более визуализированное - цвет поля, цвет разных текстовых пометок на поле, и так далее...
Так вот... Для обновления естественно делается Refresh для данного TTable. И всё работает нормально. То есть как бы полностью DBCtrlGrid не перерисовывается каждый раз - изменилась одна запись, она и перерисовалась...
Теперь ставлю вместо Ttable TQuery (пока в том же Paradox). Поскольку для TQuery метод Refresh толком ничего не даёт, использовать его бессмысленно (хотя, кстати, кое что даёт. В частности есть у меня в таблице определённое поле типа TimeStamp а в DBCtrlGrid нужно отображать время прошедшее с момента указанного в этом поле, до "сейчас". Так вот, при Refresh даже TQuery это время меняется, а вот изменения других полей - нифига...) То есть получается что надо переоткрывать Query. Закрывать и открывать. Ну про то, что надо запомнить текущую запись чтобы после открытия к ней вернуться, я даже не говорю, это мелочи... А вот факт, что открытие-закрытие Query вызывает полную перерисовку DBCtrlGrid сказать надо. Видно. Как бы "листается". Хотя таблица в общем не очень большая - порядка 600 записей вся, отображать надо единовременно ну, не менее 200 как правило. То есть при Refresh Ttable всё работает нормально, а при Close-Open TQuery - тормозит!
Правда это всё для Paradox.
А теперь собственно вопрос - в РСУБД (и в частности для FireBird) каким образом умеют обновляться данные в DataSet'ах? Например в том же наиболее популярном FIBPlus? Кто-нибудь сталкивался? Тоже по факту идёт полное переоткрытие DataSet и потом нужно позиционироваться на заранее сохранённую запись, которая была текущей до закрытия, и обрабатывать возможную ситуацию, что эта запись могла быть удалена другим пользователем во время перетокрытия текущим клиентом? Или есть встроенные меахнизмы?
Вроде в том же FIBDataSet есть SelectSQL, UpdateSQL... и в том числе и RefreshSQL который как бы отвечает за обновление текущей записи? То есть полного переполучения данных с сервера, не будет, в этом вроде и смысл клиент-сервера? То есть если я изменяю в FIBDataSet одну запись, по идее она с помощью RefreshSQL должна отобразиться правильно? И мой DBCtrlGrid должен это поймать и отрисовать... (ведь в случае с Ttable он же это делает?!?) Заморочка хорошая... Пытался искать компоненты на замену DBCtrlGrid но поиск не дал результатов - все Grid'ы заточены на отображение строковых данных с вариациями (объединение колонок, многострочные колонки и так далее). Ну в самом деле, не один же я вывожу данные не с помощью Гридов, а как-то иначе?!?
Re: Опять вопрос по обновлению отображения данных...
1Kotъ-Begemotъ писал(а): ..................
А теперь собственно вопрос - в РСУБД (и в частности для FireBird) каким образом умеют обновляться данные в DataSet'ах? Например в том же наиболее популярном FIBPlus? Кто-нибудь сталкивался? Тоже по факту идёт полное переоткрытие DataSet и потом нужно позиционироваться на заранее сохранённую запись, которая была текущей до закрытия, и обрабатывать возможную ситуацию, что эта запись могла быть удалена другим пользователем во время перетокрытия текущим клиентом? Или есть встроенные меахнизмы?
...........
Ну в самом деле, не один же я вывожу данные не с помощью Гридов, а как-то иначе?!?
TpFIBDataSet.Refresh - обновляет в соответствии с запросом RefreshSQL (хоть одну, хоть 20) - поправка, сори, насчет 20 я поспешил - попробовал у себя - в гриде наблюдается бред


TpFIBDataSet.FullRefresh - полностью обновляет набор
TpFIBDataSet также обрабатывает удаление
опций там море всяких разных, так что лучше читать доку от создателей
2
Не совсем понял, что нужно от грида
набор EhLib не подходит?
PS
От сервера это не зависит - это клиент (компоненты)
как захочешь, так и будет.
тебе так лениво прочитатьА теперь собственно вопрос - в РСУБД (и в частности для FireBird) каким образом умеют обновляться данные в DataSet'ах? Например в том же наиболее популярном FIBPlus?
www.ibase.ru/devinfo/bde.htm#cache
и
www.ibase.ru/devinfo/ibx.htm#ibdataset
в части как они данные обновляют? Ты еще не забывай, что Paradox это локальный движок, где перечитывать данные очень просто. Это не клиент-сервер.
потом еще прочитай
www.ibase.ru/devinfo/client.htm
и затем
www.ibase.ru/devinfo/clientrefresh.htm
все же на сайте есть, ё-мое, причем собрано в одном месте...
-
- Сообщения: 250
- Зарегистрирован: 25 июл 2007, 21:33
Да нет, не лениво, читаю с удовольствием, спасибо. Просто как-то не обращал внимания на эти ссылки, не думал что там к моему вопросу есть что-то относящееся...kdv писал(а):тебе так лениво прочитатьА теперь собственно вопрос - в РСУБД (и в частности для FireBird) каким образом умеют обновляться данные в DataSet'ах? Например в том же наиболее популярном FIBPlus?
www.ibase.ru/devinfo/bde.htm#cache
и
www.ibase.ru/devinfo/ibx.htm#ibdataset
в части как они данные обновляют? Ты еще не забывай, что Paradox это локальный движок, где перечитывать данные очень просто. Это не клиент-сервер.
потом еще прочитай
www.ibase.ru/devinfo/client.htm
и затем
www.ibase.ru/devinfo/clientrefresh.htm
все же на сайте есть, ё-мое, причем собрано в одном месте...
Re: Опять вопрос по обновлению отображения данных...
Слазил в исходники ФИбов - при Refresh запрос выполняется, как есть, то есть может вернуть сколь угодно строк (если сделать его идентичным SelectSQL), но значения полей берутся из первой записи, соответственно в гриде отобразятся данные не выбранной записи, а первой, возвращеннной запросом.stix-s писал(а): TpFIBDataSet.Refresh - обновляет в соответствии с запросом RefreshSQL (хоть одну, хоть 20) - поправка, сори, насчет 20 я поспешил - попробовал у себя - в гриде наблюдается бред- все-таки он для одной строки
![]()
Обработки на ошибку в данной ситуации не углядел
Странно, хотя это может только у меня так в версии 6.4
не защитились от таких экпериментаторов как яkdv писал(а): а зачем это как ошибку воспринимать? refreshSQL должен возвращать одну запись. Если возвращает больше, остальные можно игнорировать.
я думаю, в FIBPlus просто таким образом защитились от нечитателей доки. И работает все, и ошибок "непонятных" нет.

и от тех, кто ручками пропишет неправильный RefreshSQL
ИМХО, я бы при Рефреше все-же вывел сообщение, что возвращено несколько строк, а не как положено 1