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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.10.2015, 12:22   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Триггеры
Доброго времени суток!

Нужно обновлять запись при вставке\обновлении при определенных условиях. Дописал в метод insert (до вызова super, после тоже пробовал) код:

this.TestField1 = strFmt('%1%2', 'Horrey', this.TestField1 );
this.TestField2 = strFmt('%1%2', 'Horrey', this.TestField2 );
this.TestField3 = strFmt('%1%2', 'Horrey', this.TestField3 );

Не работает.

То же нужно проделывать при обновлении. Причем в случае с обновлением мне нужно получать запись до обновления и после, что бы сравнить значения в данных полях и выполнить определенные действия.

Подскажите какие есть варианты решения?
Старый 26.10.2015, 13:16   #2  
Morpheus is offline
Morpheus
Участник
Аватар для Morpheus
Соотечественники
 
602 / 164 (7) ++++++
Регистрация: 30.03.2005
Адрес: Київ-København-Düsseldorf
Описанный Вами подход, для изменения значений в полях таблиц, очень затрудняет поддержку кода. Кроме того, записи могут создаваться/обновляться и без вызова методов insert()/update().

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

Также обратите внимание на методы с префиксом initFrom...() на таблицах.
Старый 26.10.2015, 13:22   #3  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
У меня работает.
X++:
public void insert()
{
    this.Field1 = strFmt('%1%2', 'Horrey', this.Field1);
    
    super();
}
Цитата:
Сообщение от syl Посмотреть сообщение
Причем в случае с обновлением мне нужно получать запись до обновления и после, что бы сравнить значения в данных полях и выполнить определенные действия.
Получить запись до обновления - "this.orig()".
Старый 26.10.2015, 13:36   #4  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от Napalm Посмотреть сообщение
У меня работает.
X++:
public void insert()
{
    this.Field1 = strFmt('%1%2', 'Horrey', this.Field1);
    
    super();
}
Получить запись до обновления - "this.orig()".
У меня не работает. Может дело в том что у меня запись приходит по порту Aif? Какие есть еще варианты? Нужно что бы это работало и в формах и через входящий порт.
Старый 26.10.2015, 13:45   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Метод insert(), перекрытый на таблице, не будет выполняться если:

1. Создание строки было выполнено через метод common.doInsert()
2. Перед созданием строки была дана команда common.skipDataMethods(true)
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 26.10.2015, 13:48   #6  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Метод insert(), перекрытый на таблице, не будет выполняться если:

1. Создание строки было выполнено через метод common.doInsert()
2. Перед созданием строки была дана команда common.skipDataMethods(true)
Как тогда поступить что бы мой код выполнялся 100%?
Старый 26.10.2015, 14:05   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от syl Посмотреть сообщение
Как тогда поступить что бы мой код выполнялся 100%?
Вручную проконтролировать этот факт.

По перекрестным ссылкам найти все вызовы doInsert() и skipDataMethod() для твоей таблицы

Сервис \ Средства разработки \ Перекрестные ссылки \ Имена

В открывшемся окне указать значения

Имя типа = имя нужной таблицы
Имя объекта приложения = doinsert, insert, update, doupdate, write

Метод skipDataMethod(), к сожалению, таким способом не найдешь. Но этот метод обычно вызывается перед собственно вставкой, поэтому можно поискать "рядом" с insert(). Также таким способом не найдешь insert_recordset и update_recordset

После нажатия Ok будет получен список объектов. Кнопа "Чем используется", покажет в каких местах кода используются данные методы

- Если это возможно по логике кода, то заменить вызов doInsert() на insert() и отменить вызов skipDataMethod()
- Если это невозможно, то на таблице создать новые методы по модификации данных и вызывать эти методы непосредственно перед командами doInsert() или insert().

Замечание: Перекрестные ссылки не смогут найти косвенные вызовы, когда вместо имени таблицы в коде используется common без явного переопределения источника данных. Это, например, характерно для Aif.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 26.10.2015, 14:07   #8  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от syl Посмотреть сообщение
У меня не работает. Может дело в том что у меня запись приходит по порту Aif? Какие есть еще варианты? Нужно что бы это работало и в формах и через входящий порт.
Для AIF меняйте соответствующие классы.
Старый 26.10.2015, 14:26   #9  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
В классе AIF такой код
X++:
public AfStronglyTypedDataContainerList parmValues(AfStronglyTypedDataContainerList _value = null)
{
    if (!prmisdefault(_value))
    {
        this.set_List(#Values, _value);
    }

    return this.get_List(#Values);
}
передаю туда массив, а оно принимает только первую строку
Старый 26.10.2015, 14:27   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Еще можно при тесте включить логирование изменений в sysDatabaselog в котором дописать логирование стека вызовов. Сразу видно какой код вызывает проблемы.
Старый 26.10.2015, 16:20   #11  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от Logger Посмотреть сообщение
Еще можно при тесте включить логирование изменений в sysDatabaselog в котором дописать логирование стека вызовов. Сразу видно какой код вызывает проблемы.
Кстати как показывает практика 2012 во многих местах "настоящие программисты" так-же вызывают методы skipDatabaseLog(true).
т.е. для определения места вызова я писал триггер на таблице который возвращал ошибку при вставке. далее уже в АХ можно было посмотреть стек вызовов и решить что с этим делать
Старый 26.10.2015, 16:31   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от trud Посмотреть сообщение
Кстати как показывает практика 2012 во многих местах "настоящие программисты" так-же вызывают методы skipDatabaseLog(true).
Э... Вообще-то, "так положено". Если сделать только skipDataMethod(), без skipDatabaseLog(), то update_recordset - перестает быть групповой и вырождается в стандартный цикл. Т.е. теряем выигрыш в производительности и получаем просто укороченную нотацию цикла. Или в 2012 в этой части что-то изменилось?

Цитата:
Сообщение от trud Посмотреть сообщение
т.е. для определения места вызова я писал триггер на таблице который возвращал ошибку при вставке. далее уже в АХ можно было посмотреть стек вызовов и решить что с этим делать
Имеется в виду триггер на SQL?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:09.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.