Buenas tardes!

Вся философия - знать то, как думает компилятор.
Уважаемые знатоки, внимание вопрос.
Поясните пожалуйста момент срабатывания события onDatasetChangeDataField(Dataset, DataField); (Событие, генерируемое при изменении активного поля записи набора данных. Активное поле набора данных определяется наличием фокуса в соответствующем визуальном элементе управления (IDataControl). При изменении фокуса генерируется данное событие.
), в чём его принципиальная особенность и отличие от onDatasetDataChange(DataField); (Событие, генерируемое при изменении значения поля набора данных.)

На сколько я понял, события наступают одновременно. Первое после изменения отдельного IDataControl, и снятия с него фокуса, второе ... после изменения Dataset('Field');. Что, подозреваю одно и тоже.

Абстракция Por examplo:
Есть форма на которой есть поле связанное с набором данных. Есть пользователь, который хочет отредактировать это поле, изменив данные и сохранив изменения в базе.

Прошу провести связь в абстракции от момента взаимодействия пользователя с формой, до момента возникновения данных событий чтобы ясно представлять себе конвейер в работе, и ликвидировать просветы в понимании механизма TerraSoft.

Буду очень благодарен за объяснение философии TerraSoft.

С уважением Ваш коллега.

Нравится

6 комментариев

честно говоря, ни разу не пользовался 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,"текст сообщения");

и посмотреть, кто за кем.

Показать все комментарии

В событиях контролов нет событий, связанных с изменением данных в DataSet. В событиях DataSet нет очевидной связи с формой(Свойства у DataSet не содержат ссылок на форму или я их не нашел). Как при событие изменения DataSet, менять свойства контролов, создавать новые контролы? По факту наверное нужен путь в событие DataSet: DataSet.xxxx.xxxx.xxxx.Window или способ создать на эллементе событие "change".

Краткий итог: Control - dlData - Dataset. Задача решаеться через событие dlDataOnDatasetDataChange.

Нравится

14 комментариев

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

к полю привязывается объект DataField, у которого есть ParentDataset.
При изменении DataField срабатывает Dataset/OnDatasetDataChange, которое вызывает (перед или после выполнения - так и не разорался) DatasetLink/OnDatasetDataChange. А DatasetLink является объектом окна - вот вам и связь

"Александр Кудряшов" написал:

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



Такое обращение не работает.

Непосредственное обращение к эллементам работает. Спасибо.

используйте
var q = Self
или
var w = dlData.ParentWindow

"Андросов Дмитрий" написал:

используйте
var q = Self
или
var w = dlData.ParentWindow


Спасибо. Все таки странно, что на котролах нет DataChange, а нужно лезть dlData, в котором общие события, там ставить анализ, что приходит и дописывать уже нужный код.

"Борисов Михаил Евгеньевич" написал:Все таки странно, что на котролах нет DataChange

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

Так как датаконтролы связаны с полем датасета, а у датасета в свою очередь можно определить обработчик события OnDatasetDataChange – для датаконтролов не выносили событие OnChange (чтобы не дублировать).
У простых контролов нет связки с датасетом, поэтому событие OnChange вынесено.

"Борисов Михаил Евгеньевич" написал:Control - dlData - Dataset

Window - Control - DataField - Dataset - dlData - Window
или
Control - Window - dlData - Dataset - DataField

"Андросов Дмитрий" написал:Борисов Михаил Евгеньевич пишет:

Control - dlData - Dataset

Window - Control - DataField - Dataset - dlData - Window
или
Control - Window - dlData - Dataset - DataField


Если говорить о доступе, то первое неверно, я так понял. Если говорить о последовательности событий, то хз, уже сто раз писали, что нужна табличка с цепочками событий с основными задачами которые в них решаются(но по названиям все же очевидно).

"Борисов Михаил Евгеньевич" написал:Если говорить о доступе, то первое неверно, я так понял

ну да :exclaim:
Window - Control - DataField - Dataset

"Борисов Михаил Евгеньевич" написал:Если говорить о последовательности событий, то хз, уже сто раз писали, что нужна табличка с цепочками событий с основными задачами которые в них решаются(но по названиям все же очевидно).

В SDK приведены основные события элементов и их описание. Например: http://www.terrasoft.ru/sdk/!!MEMBERTYPE_Methods_IDatasetEvents.html

"Андросов Дмитрий" написал:Борисов Михаил Евгеньевич пишет:

Если говорить о доступе, то первое неверно, я так понял

ну да :exclaim:
Window - Control - DataField - Dataset


выяснили же, что с dlDataOnDatasetDataChange можно непосредственно вызывать контролы по имени. Цепочка Window - Control - DataField - Dataset - dlData говорит о том что вам нужно обращаться к Dataset что бы обратиться к Control.

"Бондарь Наталия" написал:Борисов Михаил Евгеньевич пишет:

Если говорить о последовательности событий, то хз, уже сто раз писали, что нужна табличка с цепочками событий с основными задачами которые в них решаются(но по названиям все же очевидно).

В SDK приведены основные события элементов и их описание. Например: http://www.terrasoft.ru/sdk/!!MEMBERTYPE_Methods_IDatasetEvents.html


Такую документированность видел только в MIT проектах(бесплатных). За образец, считаю MSDN.

Михаил Евгеньевич, Ваше пожелание передано техническим писателям и будет рассмотрено при формировании последующей документации.

Показать все комментарии