26.10.2015, 12:22 | #1 |
Участник
|
Триггеры
Доброго времени суток!
Нужно обновлять запись при вставке\обновлении при определенных условиях. Дописал в метод 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 |
Участник
|
Описанный Вами подход, для изменения значений в полях таблиц, очень затрудняет поддержку кода. Кроме того, записи могут создаваться/обновляться и без вызова методов insert()/update().
Советую найти класс, который создает запись или является классом оберткой (например SalesLineType), и в нем добавить необходимую логику. Также обратите внимание на методы с префиксом initFrom...() на таблицах. |
|
26.10.2015, 13:22 | #3 |
Участник
|
У меня работает.
X++: public void insert() { this.Field1 = strFmt('%1%2', 'Horrey', this.Field1); super(); } |
|
26.10.2015, 13:36 | #4 |
Участник
|
У меня не работает. Может дело в том что у меня запись приходит по порту Aif? Какие есть еще варианты? Нужно что бы это работало и в формах и через входящий порт.
|
|
26.10.2015, 13:45 | #5 |
Участник
|
Метод insert(), перекрытый на таблице, не будет выполняться если:
1. Создание строки было выполнено через метод common.doInsert() 2. Перед созданием строки была дана команда common.skipDataMethods(true)
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
26.10.2015, 13:48 | #6 |
Участник
|
|
|
26.10.2015, 14:05 | #7 |
Участник
|
Вручную проконтролировать этот факт.
По перекрестным ссылкам найти все вызовы 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 |
Участник
|
|
|
26.10.2015, 14:26 | #9 |
Участник
|
В классе 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 |
Участник
|
Еще можно при тесте включить логирование изменений в sysDatabaselog в котором дописать логирование стека вызовов. Сразу видно какой код вызывает проблемы.
|
|
26.10.2015, 16:20 | #11 |
Участник
|
Цитата:
т.е. для определения места вызова я писал триггер на таблице который возвращал ошибку при вставке. далее уже в АХ можно было посмотреть стек вызовов и решить что с этим делать |
|
26.10.2015, 16:31 | #12 |
Участник
|
Цитата:
Имеется в виду триггер на SQL?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|