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

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

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]

Может лучше было бы начать рассчеты по какому-то другому событию?


Наверх

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