![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AfterPost
Fynjy1984 © (2006-02-07 08:36:00)Не знаю к чему отнести этот вопрос к датасету или DBGridEh. Вобщем после изменения данных выполняются расчеты, я засунул их в обработчик AfterPost. Но при копировании в Grid обработчик запускается после изменения каждой записи (логично). Как мне отловить начало копирования, отключить обработчик, дождаться окончания, включить обработчик.
msguns (2006-02-07 12:12:00) [1]Не поленюсь и поясню [16] чтоб не обвинили в неуважении, пренебрежении, оскорблении и т.д.
Все же следует четко понимать следующие вещи:
1. То, что отображается "на клиенте" далеко не всегда соответствует тому, что в базе (на "сервере")
2. Множественные изменения в БД, составляющие единое логическое целое, должны выполняться полностью или не выполняться вообще. Для этого служат транзакции либо специальный аппарат, состоящий из генрераторов (последовательностей, автоикрементов и т.д.), триггеров, хранимых процедур и функций, в совокупности составляющих бизнес-логикуБД. Часто большинство сложных операций по преобразованию и пересчету данных в БД выносят именно в бизнес-логику, "облегчая" "клиента" и отделяя хранениеданных от их отображения. Таким образом обеспечивается высокая степень независимости клиентских приложений работы с данными БД от собственно данных БД.
3. Для того, чтобы можно было квалифицированно посоветовать, надо как миниму ясно объяснить суть задачии снять покров тайны с типа БД и компонентов доступа. В противном случае любая помощь в большинстве случаев уподобляется консультации оперирующего хирурга по телефону.
ЗЫ. События датасета(BeforeXXX, AfterXXX) служат для вспомогательныхцелей исключительно на клиенте, поэтому использовать их надо с большой осторожностью дабы не поставить впросак пользователя.
msguns (2006-02-07 11:57:00) [2]Операция проистекает дальше. Хирург чего-то у кого-то отрезал, телефонные консультанты умнО покивали головами.
Чтоотрезал, у кого- несущественно
;)
DUDAS (2006-02-07 10:39:00) [3]Ок! Удачи...
Fynjy1984 (2006-02-07 10:34:00) [4]
> DUDAS © (07.02.06 10:06) [11]
> Если вставка из буфера происходит по нажатию клавиш Ctrl
> + V:
> можно ввести глобальную переменую и на событие DBGridEh1KeyDown
> переводить ее в False, а на событие DBGridEh1KeyUp в True.
> А в AfterPost ее проверять.
Попробовал: то что надо! Осталось чуток доработать (Shift+Ins)
evvcom (2006-02-07 10:31:00) [5]
> Fynjy1984 © (07.02.06 10:03) [10]
Хорошо. Теперь каков признак того, что уже пора пересчитывать? Кто или что этот момент определяет? Если пользователь сразу должен видеть результат пересчета, то все уже и так правильно. Если же только после того, как он сам решил, что пора, то делается кнопка, по которой данные сохраняются и соответственно наступает момент пересчета.
Sergey13 (2006-02-07 10:06:00) [6]2[8] msguns © (07.02.06 10:01)
>Не советуй дурни.
Чего хочу - того и советую. Не ндравится - посоветуй умни. 8-)
DUDAS (2006-02-07 10:06:00) [7]Если вставка из буфера происходит по нажатию клавиш Ctrl + V:
можно ввести глобальную переменую и на событие DBGridEh1KeyDown
переводить ее в False, а на событие DBGridEh1KeyUp в True. А в AfterPost ее проверять.
Fynjy1984 (2006-02-07 10:03:00) [8]
> evvcom © (07.02.06 09:55) [7]
Данные вставляются юзером, отвечает за это DBGridEh. Т.е. моего кода там нет. Вот я и думал может кто знает как отловить начало и конец копирования.
ZeroDivide (2006-02-07 10:02:00) [9]то перерасчет происходит после добавления каждой, а надо после добавления последней
Как узнать какая из "каждой" окажется "последней"?
когда в таблицу вставляется из буфера несколько записей
Вот сразу после этого и делай свои расчеты. В чем проблема?
msguns (2006-02-07 10:01:00) [10]>Sergey13 © (07.02.06 09:42) [5]
>Сделай задержку по таймеру на полсекунды (или около того).
Не советуй дурни.
evvcom (2006-02-07 09:55:00) [11]Из буфера кто вставляет эти записи? Если в коде цикл, то перед циклом отключи, после включи. Если пользователь вставляет, то каким-то образом ты же, наверное, отлавливаешь момент, когда юзер коммитит свои действия. Вот тебе и нужный момент.
Fynjy1984 (2006-02-07 09:55:00) [12]
> Сделай задержку по таймеру на полсекунды (или около того).
Спасибо попробую.
Sergey13 (2006-02-07 09:42:00) [13]2[4] Fynjy1984 © (07.02.06 09:37)
> Но когда в таблицу вставляется из буфера несколько записей то перерасчет происходит после добавления каждой, а надо после добавления последней.
Сделай задержку по таймеру на полсекунды (или около того).
Fynjy1984 (2006-02-07 09:37:00) [14]
> Может лучше было бы начать рассчеты по какому-то другому
> событию?
Я всеми руками за. По какому?
Таблицу можно отредактировать вручную (поменять одно значение), тогда все отлично. Но когда в таблицу вставляется из буфера несколько записей то перерасчет происходит после добавления каждой, а надо после добавления последней.
Конечно можно кинуть кнопку "Обновить" и производить расчет после ее нажатия, но хотелось что нибудь по культурнее.
msguns (2006-02-07 09:32:00) [15]>Вобщем после изменения данных выполняются расчеты
?
Отдели мух (отображение данных) от котлет (хранение данных) и проблема, думаю, исчезнет
Sergey13 (2006-02-07 09:32:00) [16]Что за расчеты? Может калк-поле? Или по кнопке запустить?
DUDAS (2006-02-07 09:28:00) [17]Может лучше было бы начать рассчеты по какому-то другому событию?