16.05.2019, 17:17 | #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 Вызов в CIL |
|
|
За это сообщение автора поблагодарили: sukhanchik (10), gl00mie (5). |
16.05.2019, 17:27 | #2 |
Участник
|
Возможные ответы
б. Свой новый кастомизированный код лучше помешать в modifiedFieldValue(). Тогда он будет вызываться во всех возможных сценариях. (Защита от случаев когда стандартный код вызывает не modifedField, а modifiedFieldValue) в. Но вызывать из кода при необходимости лучше modifiedField() - чтобы вся цепочка отработала. г. - д. Явно баг. Для его обхода предлагается в табличке в методе modifedField() вместо вызова super() поставить такую строку кода #TableModifiedFieldCallSuper_MRC(tableStr(Имя таблички)) в этом случае описанные баги не проявляются и поведение системы одинаково для p-code и CIL Для проверки можно в прилагаемом проекте в методе \Classes\TestModifiedMethods_MRC\fixOn поставить X++: return true; Инфолог: Интересно попробовать в D365. Кто может проверить ? Последний раз редактировалось Logger; 16.05.2019 в 17:31. |
|
16.05.2019, 17:34 | #3 |
Участник
|
Еще есть validateFieldValue.
Его я не проверял. Подозреваю что, то же самое. |
|
16.05.2019, 22:09 | #4 |
Участник
|
а. Может быть не любовь к Id. Если хранить и работать с именем поля то нет проблем с конфликтами id так как нет самих Id.
б. Об этом методе мало кто знает и все так и пишут в modifiedfield, включая МС. Для меня это ещё одна инициатива которая не взлетела, как defaultField. |
|
|
За это сообщение автора поблагодарили: Logger (3). |
17.05.2019, 07:04 | #5 |
Участник
|
Ясно.
А можете проверить в 365-й? |
|
17.05.2019, 13:25 | #6 |
Участник
|
Пожалуйста
P.S. Для тех кто не ставит скобочки в аду отдельный котел X++: if (TestModifiedMethods_MRC::fixOn()) { #TableModifiedFieldCallSuper_MRC(tableStr(TableTestModifiedFlat_MRC)) } else super(_fieldId); |
|
|
За это сообщение автора поблагодарили: sukhanchik (5), Logger (10). |
17.05.2019, 13:53 | #7 |
Участник
|
Спс.
А это результат с включенным фиксом или без ? TestModifiedMethods_MRC::fixOn() при этом что возвращает ? (неужели они все исправили в 365-й. Даже не верится.) |
|
17.05.2019, 14:35 | #8 |
Участник
|
fixOn возвращает false. У вас же 5 работает без проблем в CIL ? А в 7ке нет не CIL
|
|
17.05.2019, 14:53 | #9 |
Участник
|
Не совсем так.
Там 2 бага и баг который проявляется в CIL(п.4) не дает проявиться 2-му багу (п.5), так как в CIL просто не вызывается ModifiedFieldValue из ModifiedField. Это радует. Значит в 365-й оба бага пофиксили (надо будет еще поставить последнее ядро 2012-й и проверить не исправлено ли и там). А наш программный фикс повторяет ту же логику которая и предполагалась разработчиками аксапты. |
|
Теги |
dax2012, modifiedfield, modifiedfieldvalue, как правильно |
|
|