Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

при обновл. датасета оставить DBGrid в той же позиции скроллинга? [D7, XP]


Страницы:   1 2

ari_9 ©   (2007-10-28 12:10:00) 

использую QuantumGrid 6

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

допустим, запрос выдает 100 строк, в грид помещается 20. пользователь скроллингом "спустился" до просмотра записей с 80 по 100. но при этом курсор датасета остался на первой записи. потом происходит рефреш (по сути закрытие и открытие запроса). как перед этим зафиксировать состояние скроллбара cxGrid'а и потом установить его ?


ari_9   (2007-10-29 14:45:00) [1]

jack128_

спасибо


jack128_   (2007-10-29 14:39:00) [2]


>   // этот метод переоткрывает в том числе и DocumentGrid.DataSet
>    dmMain.RefreshDocDataSets;

ну и восстанавливает текущую запись, естественно.


jack128_   (2007-10-29 14:35:00) [3]

Писалось для DBGridEh, но думаю без проблем мона переписать и для cxGrid

procedure TfrmMain.RefreshDocDataSets;
var
 Row: Integer;
 MoveCount: Integer;
begin
 Row := DocumentGrid.Grid.Row;
 DocumentGrid.DataSet.DisableControls;
 try
  // этот метод переоткрывает в том числе и DocumentGrid.DataSet
   dmMain.RefreshDocDataSets;
   // Эти махинации нуны, что бы текущая запись в гриде отображалась
   // в том же месте в гриде.
   MoveCount := DocumentGrid.DataSet.MoveBy(DocumentGrid.Grid.VisibleRowCount - Row - 1);
   DocumentGrid.DataSet.MoveBy(-MoveCount);
 finally
   DocumentGrid.DataSet.EnableControls;
 end;
end;


Ega23   (2007-10-29 14:25:00) [4]


> да какая разница, если эти 40 записей у вас не влезут все
> по высоте, точно так же как и сто тысяч :)


У меня влезает.


ari_9   (2007-10-29 14:12:00) [5]

вопрос закрыт, проблема решена

спасибо


ari_9   (2007-10-29 14:11:00) [6]

да какая разница, если эти 40 записей у вас не влезут все по высоте, точно так же как и сто тысяч :)


Sergey13   (2007-10-29 14:10:00) [7]

> [18] ari_9   (29.10.07 13:58)
> но давайте про предметную область не будем спорить

Почему? Это 90% решения задачи. У тебя как раз, ИМХО, проблема в неверной модели.

> получается, де-факто стандартом является игнорирование положения
> выбранной записи в окне скроллинга после обновления данных ?
Стандартом де-факто является обновление данных по требованию юзера. При этом смена положения грида - это нормальное и ожидаемое поведение программы.


Ega23   (2007-10-29 14:05:00) [8]


> интересно другое. как я понимаю, все после рефреша в своих
> приложениях делают Locate, чтобы отпозиционироваться на
> ранее выбранную запись. в обычном гриде никаких TopRecordIndex
> и TopRowIndex нет. получается, де-факто стандартом является
> игнорирование положения выбранной записи в окне скроллинга
> после обновления данных ?
>


Стандартом де-факто считается тащить на клиент выборку в 20-40 записей. А не 10000 и не 100000.


ari_9   (2007-10-29 13:58:00) [9]

я всем признателен за комментарии, но давайте про предметную область не будем спорить. в диспетчерской сидит шесть девочек, обычно занято 4-5 линий. за сутки проходит порядка двух тысяч заказов

Sergey13

ну да .... но мы сервер будем долбить "легкими" запросами в рид-онли транзакциях. понятно, что любые действия по обновлению пойдут отдельно. и потом, при "ушел в туалет" эти запросы будут только тогда, когда остальные активно редактируют - если ушли все - от БД не будет эвентов

Правильный_Вася

ПОСЛЕ того, как какая-то операция пользователем выполнена, естественно рефреш будет. а если диспетчер смотрит на экран и ждет заказ с определенными характеристиками, который можно будет поставить "в пару" к какому-то уже взятому на выполнение ... ей что, десять минут ежесекундно кнопку "обновить" нажимать ?

>>вообще дубовая организация работы
возможно, но это вне моей компетенции

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

интересно другое. как я понимаю, все после рефреша в своих приложениях делают Locate, чтобы отпозиционироваться на ранее выбранную запись. в обычном гриде никаких TopRecordIndex и TopRowIndex нет. получается, де-факто стандартом является игнорирование положения выбранной записи в окне скроллинга после обновления данных ?


Правильный_Вася   (2007-10-29 13:41:00) [10]


> ari_9   (29.10.07 11:30) [7]
> и снова, и снова, я не устану повторять  .... (с)
> мне хочется сохранить ПОЗИЦИЮ ОКНА СКРОЛЛИНГА на наборе
> данных.

что мешает совместить переход на нужную позицию с совмещением окна?

а вообще дубовая организация работы
диспетчер не должен видеть все, если таких, как он, несколько
он отвечает за свой участок работы
и тогда обновлять имеет смысл после операций ЭТОГО диспетчера, а не всей толпы


Ega23   (2007-10-29 13:17:00) [11]


> с другой стороны, данные не обновились - диспетчер кликает
> на заказ, который уже взят кем-то другим и физически в БД
> его статус уже изменен, то есть мы просто не успели убрать
> его из грида - тоже плохо. причем плохо и в варианте окна
> с сообщением, и при "тихом игноре". в первом случае вынуждаем
> еще раз кликнуть на "Ok", во втором можно запутаться, что
> происходит


Как кто-то "захватил запись", при попытке другого оператора изменить эту запись выдавать сообщение: "Запись редактируется тем-то и тем-то". Этого вполне достаточно.
А когда программа, которой я пользуюсь, вдруг начинает что-то делать без моего ведома - я эту программу выбрасываю.


Sergey13   (2007-10-29 13:16:00) [12]

> [14] ari_9   (29.10.07 13:06)
> в первом случае вынуждаем еще раз кликнуть на "Ok",

Ах бедняжка. Лучше мы програмно будем сервер БД долбить обновлениями, даже если диспетчер в туалете газету читает.

> [14] ari_9   (29.10.07 13:06)
> в реальности "висящих" заказов редко когда более двадцати

Сейчас еще окажется, что и заводят то их раз в час, и на обработке сидит один чел на неполном рабочем дне. 8-)

> вроде бы люди привыкли
Привыкнуть можно ко всему. Это не показатель. Ты поговори с людьми то, изложи варианты. Осчастливливать людей без их информирования как то некузяво.


ari_9   (2007-10-29 13:06:00) [13]

Sergey13

с другой стороны, данные не обновились - диспетчер кликает на заказ, который уже взят кем-то другим и физически в БД его статус уже изменен, то есть мы просто не успели убрать его из грида - тоже плохо. причем плохо и в варианте окна с сообщением, и при "тихом игноре". в первом случае вынуждаем еще раз кликнуть на "Ok", во втором можно запутаться, что происходит

в реальности сейчас уже есть предыдущая версия ПО - там разработчик не заморачиваясь с эвентами, скроллами и прочим просто повесил рефреш запроса на таймер

вроде бы люди привыкли ... в реальности "висящих" заказов редко когда более двадцати


Sergey13   (2007-10-29 12:58:00) [14]

> [12] ari_9   (29.10.07 12:13)
> но все это как-то .... как гланды через анальный проход

По мне, так твой подход под это определение подходит на 120%.
Ни один человек не сможет принять решение (выбрать 1 из сотни вариантов), если условия перед ним меняются раз в секунду. У авиадиспетчеров и то условия проще.
Ты пытаешься достичь некоего умозрительно-теоретического идеала, а благими намерениями, как известно, вылоежна дорога в ад.

ИМХО.


ari_9   (2007-10-29 12:13:00) [15]

Sergey13

вопросов нет, диспетчер человек и за десятые заказ не примет. но когда он выбирает какой заказа обрабатывать (передавать на исполнение), то есть по сути просто смотрит на список, и, гад такой, иногда его даже скроллит 8-), вот тут то и нужно обновление по КАЖДОМУ эвенту. иначе он просто не увидит, что вот этот две секунды назад появился, а тот секунду назад другой диспетчер взял

в случае, когда я откладываю рефреш датасета до тех пор, пока он не отожмет мышу над гридом, я просто логически предполагаю, что нельзя не закончив скроллинг еще и кликнуть на строку грида. вариант, что можно мышой таскать, а стрелочками с энтером параллельно выбирать что-то, мышь не отпуская - это к терапевту 8-) .... но все это как-то .... как гланды через анальный проход


Sergey13   (2007-10-29 11:51:00) [16]

> [10] ari_9   (29.10.07 11:46)
> эвенты приходят примерно раз в секунду

Ну и что? А оператор например может обработать 1 заявку в минуту максимум. Какой смысл показывать ему новые данные чаще?


ari_9   (2007-10-29 11:46:00) [17]

Sergey13

диспетчера вносят заказы. каждый видит данные остальных. в среднем заказ вносится за 3 секунды и подтверждается еще через 10-20. эвенты приходят примерно раз в секунду

Ega23

да читаю модули .... пока туго (

если у кого аналогичная проблема для Eh -  здесь кое-что есть http://www.sql.ru/forum/actualthread.aspx?tid=169750


Sergey13   (2007-10-29 11:35:00) [18]

> [6] ari_9   (29.10.07 11:27)

Сделай простую кнопку обновить и нарисуй какую нибудь лейблу с надписью "Данные в БД изменились. Для обновления нажмите на кнопку."


Ega23   (2007-10-29 11:34:00) [19]


> ari_9   (29.10.07 11:30) [7]


посмотрите внимательно реализацию TDBGrid.


ari_9   (2007-10-29 11:30:00) [20]

Правильный_Вася

и снова, и снова, я не устану повторять  .... (с)

мне хочется сохранить ПОЗИЦИЮ ОКНА СКРОЛЛИНГА на наборе данных. открыли датасет, в нем куча записей. курсор датасета стоит на первой. пользователь не кликая на собственно столбцы и соответственно не перемещая курсор датасета проскроллил грид до последней записи. как в этом случае поможет Locate ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо