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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.05.2019, 17:17   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,173 / 1923 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 1
Использование modifiedFieldValue() и modifiedField(). Как правильно.
Привет всем.

Попалась ссылка с описанием багов при использовании табличного метода modifiedFieldValue().
https://bkdynamics-ax.blogspot.com/2...ifference.html
Стал проверять, нашлось много интересного.

Axapta 2012 R3 CU13

1. При обычной работе в p-code при вызове super() из modifiedField() идет вызов modifiedFieldValue().

2. В стандартном коде есть места где идет вызов modifiedFieldValue(), соответственно если написать код в modifiedField() то в некоторых сценариях он никогда не вызовется.

3. Если табличка Table1 из иерархии наследования то super() в методе modifiedField() вызывает modifiedField() родительской таблички, и т.д. пока не дойдет вызов до корневой таблички. Super() корневой таблички вызывает Table1.modifiedFieldValue(), чей super() передает вызов в modifiedFieldValue() родительской и.т.д. пока не дойдем до корневой таблички в иерархии.


4. При работе в CIL п.1 не выполняется, что может приводить к отличиям в работе пакетных заданий от обычного запуска через p-code. (Об этом и было сообщение у индусов https://bkdynamics-ax.blogspot.com/2...ifference.html )

5. Пункт 3 работает с багами. Параметр _fieldName в метод modifiedFieldValue() передается как 'UNKNOWN'. Если наследования табличек нет то все ок.


В общем, какая-то жуть.


Вопросы:
а. Для чего был введен метод modifiedFieldValue ?

б. Куда правильнее помещать свой кастомизированный код, в modifiedField или в modifiedFieldValue ?

в. Какой из методов лучше вызывать из кода в случае необходимости. ModifiedField или modifiedFieldValue ?

г. Как быть с п.4 ? Как для CIL кода обойти баг ? (Или это не баг а так и задумано. Тогда в чем смысл ?)

д. Что делать с п.5 ? Как обойти багу ?


е. Как обстоят дела с Dynamics 365 ? Там поведение такое же или другое ?


Для иллюстрации приложил проект.
Класс пакетник, можно запусить в p-code можно в CIL и сравнить результаты в инфологе.

Вызов в p-code
Нажмите на изображение для увеличения
Название: Bad_PCode.png
Просмотров: 6
Размер:	108.8 Кб
ID:	12312

Вызов в CIL
Нажмите на изображение для увеличения
Название: Bad_CIL.png
Просмотров: 8
Размер:	81.3 Кб
ID:	12313
Вложения
Тип файла: zip PKoz_TestModifiedMethod_2012_upgrade_2019_05_16__17_09_All.zip (3.4 Кб, 9 просмотров)
За это сообщение автора поблагодарили: gl00mie (5), sukhanchik (10).
Старый 16.05.2019, 17:27   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,173 / 1923 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 1
Возможные ответы
б. Свой новый кастомизированный код лучше помешать в modifiedFieldValue(). Тогда он будет вызываться во всех возможных сценариях. (Защита от случаев когда стандартный код вызывает не modifedField, а modifiedFieldValue)

в. Но вызывать из кода при необходимости лучше modifiedField() - чтобы вся цепочка отработала.

г. - д. Явно баг. Для его обхода предлагается в табличке в методе modifedField() вместо вызова super() поставить такую строку кода
#TableModifiedFieldCallSuper_MRC(tableStr(Имя таблички))
в этом случае описанные баги не проявляются и поведение системы одинаково для p-code и CIL

Для проверки можно в прилагаемом проекте в методе
\Classes\TestModifiedMethods_MRC\fixOn
поставить
X++:
return true;
Для всех сценариев (p-code или CIL в сочетании с любым из вариантов: плоская табличка без наследования, корневая табличка в иерархии наследования, некорневая табличка в иерархии наследования) получится одинаковый результат как описано в 1-3. Баги 4-5 не воспроизводятся.

Инфолог:
Нажмите на изображение для увеличения
Название: Fixed.png
Просмотров: 7
Размер:	110.7 Кб
ID:	12314


Интересно попробовать в D365.

Кто может проверить ?

Последний раз редактировалось Logger; 16.05.2019 в 17:31.
Старый 16.05.2019, 17:34   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,173 / 1923 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 1
Еще есть validateFieldValue.
Его я не проверял. Подозреваю что, то же самое.
Старый 16.05.2019, 22:09   #4  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
630 / 660 (24) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
а. Может быть не любовь к Id. Если хранить и работать с именем поля то нет проблем с конфликтами id так как нет самих Id.
б. Об этом методе мало кто знает и все так и пишут в modifiedfield, включая МС. Для меня это ещё одна инициатива которая не взлетела, как defaultField.
За это сообщение автора поблагодарили: Logger (3).
Старый 17.05.2019, 07:04   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,173 / 1923 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 1
Ясно.
А можете проверить в 365-й?
Старый 17.05.2019, 13:25   #6  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
630 / 660 (24) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Пожалуйста

P.S. Для тех кто не ставит скобочки в аду отдельный котел
X++:
if (TestModifiedMethods_MRC::fixOn())
{
    #TableModifiedFieldCallSuper_MRC(tableStr(TableTestModifiedFlat_MRC))
 }
else
super(_fieldId);
Миниатюры
Нажмите на изображение для увеличения
Название: Untitled.png
Просмотров: 12
Размер:	93.9 Кб
ID:	12315  
За это сообщение автора поблагодарили: sukhanchik (5), Logger (10).
Старый 17.05.2019, 13:53   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,173 / 1923 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 1
Спс.
А это результат с включенным фиксом или без ?

TestModifiedMethods_MRC::fixOn() при этом что возвращает ?
(неужели они все исправили в 365-й. Даже не верится.)
Старый 17.05.2019, 14:35   #8  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
630 / 660 (24) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
fixOn возвращает false. У вас же 5 работает без проблем в CIL ? А в 7ке нет не CIL
Старый 17.05.2019, 14:53   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,173 / 1923 (71) ++++++++
Регистрация: 12.10.2004
Записей в блоге: 1
Цитата:
Сообщение от skuull Посмотреть сообщение
У вас же 5 работает без проблем в CIL ? А в 7ке нет не CIL
Не совсем так.
Там 2 бага и баг который проявляется в CIL(п.4) не дает проявиться 2-му багу (п.5), так как в CIL просто не вызывается ModifiedFieldValue из ModifiedField.


Цитата:
Сообщение от skuull Посмотреть сообщение
fixOn возвращает false.
Это радует.
Значит в 365-й оба бага пофиксили (надо будет еще поставить последнее ядро 2012-й и проверить не исправлено ли и там).
А наш программный фикс повторяет ту же логику которая и предполагалась разработчиками аксапты.
Теги
dax2012, modifiedfieldvalue, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ax2009, ax2012: как правильно отобразить фильтр на форме? mazzy DAX: Программирование 6 25.03.2019 19:09
Как правильно? куда вставить действия при старте AOS? ax2009, ax2012 и прочие версии mazzy DAX: Программирование 26 11.02.2019 12:21
D365 как правильно переопределить метод в таблице. Skolos DAX: Программирование 19 31.01.2018 18:57
Открытая сумма по счету-фактуре - как правильно вычислить? IKA DAX: Программирование 7 21.03.2011 19:46
Как правильно обращаться к элементам формы созданнй динамически из АОТ? 3oppo DAX: Программирование 2 29.11.2006 09:57
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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