Страница 1 из 1

Опять вопрос по обновлению отображения данных...

Добавлено: 28 авг 2007, 00:42
Kotъ-Begemotъ
Примеры и названия компонентов из 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'ы заточены на отображение строковых данных с вариациями (объединение колонок, многострочные колонки и так далее). Ну в самом деле, не один же я вывожу данные не с помощью Гридов, а как-то иначе?!?

Re: Опять вопрос по обновлению отображения данных...

Добавлено: 28 авг 2007, 05:54
stix-s
Kotъ-Begemotъ писал(а): ..................
А теперь собственно вопрос - в РСУБД (и в частности для FireBird) каким образом умеют обновляться данные в DataSet'ах? Например в том же наиболее популярном FIBPlus? Кто-нибудь сталкивался? Тоже по факту идёт полное переоткрытие DataSet и потом нужно позиционироваться на заранее сохранённую запись, которая была текущей до закрытия, и обрабатывать возможную ситуацию, что эта запись могла быть удалена другим пользователем во время перетокрытия текущим клиентом? Или есть встроенные меахнизмы?
...........
Ну в самом деле, не один же я вывожу данные не с помощью Гридов, а как-то иначе?!?
1
TpFIBDataSet.Refresh - обновляет в соответствии с запросом RefreshSQL (хоть одну, хоть 20) - поправка, сори, насчет 20 я поспешил - попробовал у себя - в гриде наблюдается бред :) - все-таки он для одной строки :)
TpFIBDataSet.FullRefresh - полностью обновляет набор
TpFIBDataSet также обрабатывает удаление
опций там море всяких разных, так что лучше читать доку от создателей
2
Не совсем понял, что нужно от грида
набор EhLib не подходит?
PS
От сервера это не зависит - это клиент (компоненты)
как захочешь, так и будет.

Добавлено: 28 авг 2007, 08:34
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

все же на сайте есть, ё-мое, причем собрано в одном месте...

Добавлено: 28 авг 2007, 18:31
Kotъ-Begemotъ
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: Опять вопрос по обновлению отображения данных...

Добавлено: 29 авг 2007, 08:42
stix-s
stix-s писал(а): TpFIBDataSet.Refresh - обновляет в соответствии с запросом RefreshSQL (хоть одну, хоть 20) - поправка, сори, насчет 20 я поспешил - попробовал у себя - в гриде наблюдается бред :) - все-таки он для одной строки :)
Слазил в исходники ФИбов - при Refresh запрос выполняется, как есть, то есть может вернуть сколь угодно строк (если сделать его идентичным SelectSQL), но значения полей берутся из первой записи, соответственно в гриде отобразятся данные не выбранной записи, а первой, возвращеннной запросом.
Обработки на ошибку в данной ситуации не углядел
Странно, хотя это может только у меня так в версии 6.4

Добавлено: 29 авг 2007, 11:21
kdv
а зачем это как ошибку воспринимать? refreshSQL должен возвращать одну запись. Если возвращает больше, остальные можно игнорировать.
я думаю, в FIBPlus просто таким образом защитились от нечитателей доки. И работает все, и ошибок "непонятных" нет.

Добавлено: 29 авг 2007, 12:15
stix-s
kdv писал(а): а зачем это как ошибку воспринимать? refreshSQL должен возвращать одну запись. Если возвращает больше, остальные можно игнорировать.
я думаю, в FIBPlus просто таким образом защитились от нечитателей доки. И работает все, и ошибок "непонятных" нет.
не защитились от таких экпериментаторов как я :)
и от тех, кто ручками пропишет неправильный RefreshSQL
ИМХО, я бы при Рефреше все-же вывел сообщение, что возвращено несколько строк, а не как положено 1

Добавлено: 29 авг 2007, 12:28
WildSery
stix-s писал(а):ИМХО, я бы при Рефреше все-же вывел сообщение, что возвращено несколько строк, а не как положено 1
Multiple rows in sigleton select :)

Добавлено: 29 авг 2007, 12:37
stix-s
WildSery писал(а):
stix-s писал(а):ИМХО, я бы при Рефреше все-же вывел сообщение, что возвращено несколько строк, а не как положено 1
Multiple rows in sigleton select :)
В моей версии фибов 6.4 все проходит тихо и незаметно, без всяких сообщений

Добавлено: 29 авг 2007, 12:41
WildSery
stix-s писал(а):В моей версии фибов 6.4 все проходит тихо и незаметно, без всяких сообщений
Я тебе просто формат сообщения предлагаю :)
Это сугубо мой вымысел, такого нет, конечно же.

Добавлено: 29 авг 2007, 12:54
stix-s
WildSery писал(а):
stix-s писал(а):В моей версии фибов 6.4 все проходит тихо и незаметно, без всяких сообщений
Я тебе просто формат сообщения предлагаю :)
Это сугубо мой вымысел, такого нет, конечно же.
а, теперь понял :)