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

Проверка изменения поля

Добавлено: 11 апр 2019, 12:49
alexchuk
Приветствую, коллеги!

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

Сохранить состояние при входе и потом сравнить при выходе?

Re: Проверка изменения поля

Добавлено: 12 апр 2019, 13:52
Alexei Sytch
alexchuk, Попробуйте OnObjectSave - зкрипт будет запусаться ПОСЛЕ того, как изменения сохранены но до того, как вы выходите из поля (объекта).
(или от OnObjectExit - срабатывает ДО сохранения (если надо что-то проверить до того как записать).

Re: Проверка изменения поля

Добавлено: 12 апр 2019, 16:37
andrey volkov
OnObjectSave - зкрипт будет запусаться ПОСЛЕ того, как изменения сохранены но до того, как вы выходите из поля (объекта).
(или от OnObjectExit - срабатывает ДО сохранения (если надо что-то проверить до того как записать).
Рекомендацию Алексея поддерживаю, но считаю себя обязанным уточнить:
OnObjectSave запускается при выходе из поля ТОЛЬКО в том случае, если в поле производилась попытка изменить данные (даже если сами данные остались не измененными, триггер все равно запустится)
OnObjectExit - срабатывает ВСЕГДА при выходе из поля.

В момент запуска триггера OnObjectSave изменения ЕЩЕ НЕ сохранены и их можно откатить назад (команда UNDO)

Сохранить состояние при входе и потом сравнить при выходе?
это неизбежно придется делать, если нужна уверенность, что поле действительно поменяло свое значение
Ну, или как вариант - запомнить текущее значение, выполнить команду Undo и получить начальное значение. А потом принять решение.
Только эту самую команду Undo придется в цикле выполнять несколько раз, пока не будет получено сообщение об ошибке.

Re: Проверка изменения поля

Добавлено: 17 апр 2019, 12:15
Arcady
Культурно ;)
- на тригере onObjectEnter запоминаете значение поля в глобальную переменную (типы $$currentFieldValueReserv )
- на тригере onObjectSave сравниваете значение поля со значением $$currentFieldValueReserv, принимаете решение что значение корректно и что с ним делать (если надо откатываете значение из резерва )
- очищаете $$currentFieldValueReserv

таким образом если у пользователя курсор в поле, то в $$currentFieldValueReserv всегда хранится первоначальное значение поля, если курсора в поле нет, то $$currentFieldValueReserv - пустое (собственно и самой переменной в памяти нет)
Можно повесить аналогичные тригеры на несколько полей - в $$currentFieldValueReserv будет всегда первоначальное значение активного поля.