onDatasetChangeDataField VS onDatasetDataChange
Buenas tardes!
Вся философия - знать то, как думает компилятор.
Уважаемые знатоки, внимание вопрос.
Поясните пожалуйста момент срабатывания события onDatasetChangeDataField(Dataset, DataField);
(Событие, генерируемое при изменении активного поля записи набора данных. Активное поле набора данных определяется наличием фокуса в соответствующем визуальном элементе управления (IDataControl). При изменении фокуса генерируется данное событие.
), в чём его принципиальная особенность и отличие от onDatasetDataChange(DataField);
(Событие, генерируемое при изменении значения поля набора данных.)
На сколько я понял, события наступают одновременно. Первое после изменения отдельного IDataControl, и снятия с него фокуса, второе ... после изменения Dataset('Field');
. Что, подозреваю одно и тоже.
Абстракция Por examplo:
Есть форма на которой есть поле связанное с набором данных. Есть пользователь, который хочет отредактировать это поле, изменив данные и сохранив изменения в базе.
Прошу провести связь в абстракции от момента взаимодействия пользователя с формой, до момента возникновения данных событий чтобы ясно представлять себе конвейер в работе, и ликвидировать просветы в понимании механизма TerraSoft.
Буду очень благодарен за объяснение философии TerraSoft.
С уважением Ваш коллега.
Нравится
честно говоря, ни разу не пользовался onDatasetChangeDataField и не нашел ни одного использования в конфигурации. Рискну предположить, что это артефакт для обратной совместимости.
"Litvyakov Yegor Vladimirovich" написал:второе ... после изменения Dataset('Field')
при любом изменении любого поля в наборе данных (например, ввод очередного символа в строковое/числовое поле или выбор из справочника, или исполнение Dataset('Date') = new Date(System.Now()).getVarDate())
я тоже пытался выяснить этот вопрос, хотя с другой стороны немного
философия Террасофт заключается в том, что есть объекты Window, DatasetLink (обычно зовется dlData), Control, DataField, Dataset все связи между ними описаны в SDK. Что срабатывает первое - вопрос, оставшийся открытым. Но вроде как всегда сначала срабатывает событие на Dataset'e (но не уверен)
"Андросов Дмитрий" написал:при любом изменении любого поля в наборе данных
Дмитрий, получается - когда пользователь только ввёл символ в поле редактирование, dataset уже изменил соответствующее своё поле, текущего картежа, и готов к Post() для сохранения в базе?
поле можно изменить, если Dataset в состоянии dstInsert или dstEdit см SDK
в тех же состояниях он готов к Post() опять-таки см SDK (там правда опечатка должно быть:
1. Если набор данных находится в состоянии добавления или редактирования записи (значение свойства IDataset::State не равно "dstInsert" или "dstEdit"), то вызывает событие IDatasetEvents::OnDatasetBeforePost. Иначе метод завершает работу.
"Litvyakov Yegor Vladimirovich" написал:dataset уже изменил соответствующее своё поле
если Control и DataField связаны и действие не отменено где-нибудь (например в событии OnKeyPress у Control'a), то да
Огромное спасибо за пояснение, есть просвет)
Здравствуйте, коллеги!
По поводу onDatasetChangeDataField Дмитрий правильно предположил, это артефакт, и следует пользоваться событием onDatasetDataChange. Единственная разница между этими событиями - это то, что onDatasetChangeDataField не работает с BLOB полями.
По поводу вопроса, кто первый Control, DataField или Dataset сказать сложно. Обработка событий происходит в порядке подписки. Подписка выполняется ядром во время десериализации сервисов, а порядок подписки может быть разным, в зависимости от того, в какой момент устанавливается связь между объектами.
Например, для dlData может быть определен DataSet как в скрипте, так и с помощью установки соответсвующего свойства из интерфейса и т.д.
"Андрей Каспаревич" написал:По поводу вопроса, кто первый Control, DataField или Dataset сказать сложно.
Можно в обработчик каждого события впихнуть
Log.Write(1,"текст сообщения");
и посмотреть, кто за кем.