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