Не срабатывает событие OnDatasetDataChange

У меня на событие OnDatasetDataChange написана функция, которая отслеживает изменение поля "Цена" и при этом пересчитывает значение поля "Сумма".
Когда я редактирую датасет с помощью окна редактирования, то это событие срабатывает.
Когда же я пытаюсь сделать что-то наподобие этого:

var Dataset = Services.GetNewItemByUSI('ds_Dataset');
Dataset.Open();
while (!Dataset .IsEOF) {
 Dataset.Edit();
 Dataset.Values('Price') = 10;
 Dataset.Post();
 Dataset.GotoNext();
}
Dataset.Close();

то при изменении поля "Цена" поле "Сумма" не меняется. Подскажите, подчему функция не срабатывает на событие OnDataSetDataChange?

Нравится

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

событие написано в окне редактирование или на датасете?

Как обозначил Денис, у Вас событие может быть прописано на DatasetLink (dlData в окне редактирования). В Вашем случае событие нужно прописывать на сервисе ds_Dataset.

"Кошкаров Андрей Викторович" написал:

var Dataset = Services.GetNewItemByUSI('ds_Dataset');
Dataset.Open();
while (!Dataset .IsEOF) {
 Dataset.Edit();
 Dataset.Values('Price') = 10;
 Dataset.Post();
 Dataset.GotoNext();
}
Dataset.Close();


Андрей, это не очень хороший подход - тянуть записи на клиента, пересчитывать и сохранять. Конечно все зависит от логики, но в Вашем случае, как минимум нужно сделать отдельный UpdateQuery типа:

update [Dataset]
set [Price] = :Price

, как максимум - триггер.

"Денис М" написал:событие написано в окне редактирование или на датасете?

Событие описано в датасете ds_Dataset.

"Осауленко Александр" написал:Андрей, это не очень хороший подход - тянуть записи на клиента, пересчитывать и сохранять.

А почему это не очень хороший подход? Потому-что тянуться все значения полей записи, когда нужно изменить всего одно?
Просто в самой конфигурации Террасофт ЦРМ я не часто встречал использование UpdateQuery.

"Кошкаров Андрей Викторович" написал:А почему это не очень хороший подход?

Потому что, в результате, вместо одного UPDATE запроса, Вы получите один SELECT (который считывает значения всех полей) + кучу UPDATEов. Естественно, в этом случае пострадает производительность.

"Кошкаров Андрей Викторович" написал:
А почему это не очень хороший подход? Потому-что тянуться все значения полей записи, когда нужно изменить всего одно?

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

"Кошкаров Андрей Викторович" написал:Просто в самой конфигурации Террасофт ЦРМ я не часто встречал использование UpdateQuery.

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

"Кошкаров Андрей Викторович" написал:Просто в самой конфигурации Террасофт ЦРМ я не часто встречал использование UpdateQuery.

Где-то тут было про "программисты ленятся" :) Вот есть уже датасет. Апдейт можно и им сделать - UpdateQuery сгенерится автоматически. Вот им и делают. Потому что не хочется пользоваться этим далеко не самым удобным дизайнером, создавая UQ, потому что просто лень, потому что не успевают... да кучу причин найти можно :) К сожалению далеко не все что есть в коробочной конфигурации можно брать за пример :(

у использования updatequery или dataset для обновления значения поля имеют каждый свои преимущества
Underscore a.k.a. _, почему Вы не рассматриваете вариант, что были реализованы некоторые функции с помощью датасета, чтобы предусмотреть срабатывание логики, например, на изменения полей там, где более вероятно она появится

Я согласен, что есть и такие варианты, все зависит от ситуации. Но спорим, что я найду, и не одно, место, где используется DS вместо более правильного UQ:)
Кстати про "программисты ленятся" это же Ваши слова, если я не ошибаюсь :)

"Underscore a.k.a. _" написал:Но спорим, что я найду, и не одно, место, где используется DS вместо более правильного UQ:)

возможно, и найдете, но, думаю, насчет некоторых из этих мест можно будет еще подискутировать, ну а в остальном идеальных людей нет :)
"Underscore a.k.a. _" написал:Кстати про "программисты ленятся" это же Ваши слова, если я не ошибаюсь :)

Вы не злопамятный, Вы просто злой, и у Вас память хорошая? :)
эти слова относились к переименованию автоматически подставленных названий элементов управления, что по большому счету может повлиять на скорость нахождения нужного, но на быстродействие системы вцелом вряд ли :)
кроме того, мне казалось, мы определили бессмысленность этой фразы :)

"Раловец Ольга" написал: ну а в остальном идеальных людей нет :)

Согласен, такие долго не живут :)
"Раловец Ольга" написал:кроме того, мне казалось, мы определили бессмысленность этой фразы :)

Не помню что бы определились. Вот буквально сегодня был пример такой ленцы :)

"Осауленко Александр" написал:Да, у Вас я не увидел фильтра ограничивающий выборку, поэтому и решил что Вам необходимо обновить все записи. Или это просто набросок был?

Да, я перебираю все записи в таблице и меняю значение поля "Цена", если нужно.

Я так и не понял почему у меня не отрабатывает событие OnDataSetDataChange.

а вы случаем этот скрипт не в администраторе запускаете??

Да, что-то мы отвлеклись:) Простите за глупый вопрос, но бывает всякое. Может быть Вы мимо события промахнулись? И привязали скрипт к другому событию. Просто нормальных вариантов я не вижу.
И таки подумайте насчет UQ. Если записей будет мильйон, то такой проход да еще и в MSSQL будет очень тяжелым.

Поищите в коде может для этого датасета отключаются события через DisableEvents

"Агутин Алексей" написал:Поищите в коде может для этого датасета отключаются события через DisableEvents

Спасибо, Алексей. В этом и была проблема.

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