|
04.10.2013, 13:21 | #1 |
Участник
|
При изменении значения в ячейке в текущей записи, изменить значения в других...
Добрый день!
Дело такое: имеется запись в таблице. в этой записи через форму меняется некоторое значение N в некоторой ячейке. необходимо сделать так, чтобы в других записях в этих же ячейках (записи отбираются по какому-то правилу) изменялось на N. То есть, изменилось в одном месте - изменилось в других. Как это реализаоть? на уровне таблицы? или датасорса? или контролов? ПС Выделить в отдельную сущность не годится... |
|
04.10.2013, 13:41 | #2 |
NavAx
|
Варианты:
1. Table.modiedField() 2. Table.update() Правильнее сделать класс, где запрашивать критерий и менять по критерию для всех подходящих записей. |
|
04.10.2013, 13:43 | #3 |
Участник
|
На уровне таблицы. В табличном методе update. Если важна целостность данных, то изменения делать в одной транзакции. Величину на которое изменилось значение можно определить сравнив новое значение с оригинальным this.orig().
|
|
04.10.2013, 13:46 | #4 |
Участник
|
Сделал через modifiedField - выполняется дважды. почему?
|
|
04.10.2013, 13:53 | #5 |
Участник
|
Если делать через update, то произойдет дополнительное многократное выполнение update. Рекурсия произойдет..
|
|
04.10.2013, 14:02 | #6 |
MCTS
|
Фунцию можно вызывать в update, а в функции обновлять через doupdate().
__________________
I could tell you, but then I would have to bill you. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
04.10.2013, 14:10 | #7 |
Участник
|
Цитата:
А если doupdate не подойдёт (например каждая запись должна при обновлении выполнять какую-нибудь свою бизнесс логику), то можно выкрутиться так: Сделайте необязательный параметр в методе, через который сообщайте коду что вызывать update для соседних записей не нужно. X++: void update(boolean _updateMultiRecord = true) { ; ttsbegin(); if (_updateMultiRecord) { // otherRecord.update(false); } super(); // other code ttscommit(); } Последний раз редактировалось S.Kuskov; 04.10.2013 в 14:23. |
|
04.10.2013, 14:27 | #8 |
Участник
|
В общем, такой код получился, все работает
X++: public void update() { NVAOMAAirLines nVAOMAAirLines; ttsbegin; //Если изменился тип маршрута if (this.RouteType != this.orig().RouteType) { super(); //Отбираем все рейсы, которые хоть как-то связаны с данной строкой и... while select forupdate * from nVAOMAAirLines where (nVAOMAAirLines.AirLinesOwner == this.Num || nVAOMAAirLines.AirLinesOwner == this.AirLinesOwner) { //Меняем у них маршрут nVAOMAAirLines.RouteType = this.RouteType; nVAOMAAirLines.doUpdate(); } } ttscommit; } |
|
04.10.2013, 14:33 | #9 |
Ищущий знания...
|
Цитата:
Сообщение от Vasiliusis
В общем, такой код получился, все работает
X++: public void update() { NVAOMAAirLines nVAOMAAirLines; ttsbegin; //Если изменился тип маршрута if (this.RouteType != this.orig().RouteType) { super(); //Отбираем все рейсы, которые хоть как-то связаны с данной строкой и... while select forupdate * from nVAOMAAirLines where (nVAOMAAirLines.AirLinesOwner == this.Num || nVAOMAAirLines.AirLinesOwner == this.AirLinesOwner) { //Меняем у них маршрут nVAOMAAirLines.RouteType = this.RouteType; nVAOMAAirLines.doUpdate(); } } ttscommit; }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
04.10.2013, 14:20 | #10 |
Участник
|
modifiedField для решения таких задач не подходит потому что это событие пользовательского интерфейса, а не событие обновления данных. modifiedField вызывается ядром когда пользователь изменяет значение в соответствующем контроле. Сами изменения могут записаться в БД намного позже либо вообще не записаться (свет отключат или validate не пропустит).
|
|
04.10.2013, 14:35 | #11 |
Участник
|
Ещё можно добавить условие nVAOMAAirLines.recId != this.RecId
|
|
04.10.2013, 14:47 | #12 |
Участник
|
|
|