AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.10.2013, 13:21   #1  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
При изменении значения в ячейке в текущей записи, изменить значения в других...
Добрый день!

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

То есть, изменилось в одном месте - изменилось в других.

Как это реализаоть? на уровне таблицы? или датасорса? или контролов?


ПС Выделить в отдельную сущность не годится...
Старый 04.10.2013, 13:41   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Варианты:
1. Table.modiedField()
2. Table.update()

Правильнее сделать класс, где запрашивать критерий и менять по критерию для всех подходящих записей.
Старый 04.10.2013, 13:43   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
На уровне таблицы. В табличном методе update. Если важна целостность данных, то изменения делать в одной транзакции. Величину на которое изменилось значение можно определить сравнив новое значение с оригинальным this.orig().
Старый 04.10.2013, 13:46   #4  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Сделал через modifiedField - выполняется дважды. почему?
Старый 04.10.2013, 13:53   #5  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
На уровне таблицы. В табличном методе update. Если важна целостность данных, то изменения делать в одной транзакции. Величину на которое изменилось значение можно определить сравнив новое значение с оригинальным this.orig().
Если делать через update, то произойдет дополнительное многократное выполнение update. Рекурсия произойдет..
Старый 04.10.2013, 14:02   #6  
twilight is offline
twilight
MCTS
MCBMSS
 
876 / 237 (9) ++++++
Регистрация: 17.10.2004
Адрес: Королёв
Цитата:
Сообщение от Vasiliusis Посмотреть сообщение
Если делать через update, то произойдет дополнительное многократное выполнение update. Рекурсия произойдет..
Фунцию можно вызывать в update, а в функции обновлять через doupdate().
__________________
I could tell you, but then I would have to bill you.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 04.10.2013, 14:10   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от twilight Посмотреть сообщение
Фунцию можно вызывать в update, а в функции обновлять через doupdate().
Простой и надежный вариант.

А если 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  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
В общем, такой код получился, все работает
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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от 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;
}
я бы super() вынес из if и разместил его перед ним. А то у Вас не будет происходить изменение таблицы, без изменения поля RouteType (усли вдруг, например, изменится какое то другое поле).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 04.10.2013, 14:20   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
modifiedField для решения таких задач не подходит потому что это событие пользовательского интерфейса, а не событие обновления данных. modifiedField вызывается ядром когда пользователь изменяет значение в соответствующем контроле. Сами изменения могут записаться в БД намного позже либо вообще не записаться (свет отключат или validate не пропустит).
Старый 04.10.2013, 14:35   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ещё можно добавить условие nVAOMAAirLines.recId != this.RecId
Старый 04.10.2013, 14:47   #12  
Vasiliusis is offline
Vasiliusis
Участник
 
225 / 13 (1) ++
Регистрация: 30.01.2013
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ещё можно добавить условие nVAOMAAirLines.recId != this.RecId
согласен, я его почему-то убрал..
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как изменить значения полей из кода? andriy_s DAX: Программирование 12 19.03.2010 23:37
Присвоение значения полю активной записи по его имени HorrR DAX: Программирование 9 06.06.2008 12:13
Добавление строк при изменении значения контрола 36AC DAX: Программирование 3 11.08.2005 12:56
Ошибка при изменении записи nicko DAX: Администрирование 1 05.05.2004 11:23
Автоматическое увеличение значения поля при создании новой записи. sguryev DAX: Программирование 3 06.02.2003 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:12.