|
|
#19 |
|
Участник
|
Цитата:
Я для комфорта завел несколько вспомогательных методов на SysDictTable as_ByFieldId и as_ByFieldName Их попроще использовать С учетом их метод глобала стал таким X++: // обходим баг вызова orig() для табличек с наследованием // [url=http://axforum.info/forums/showthread.php?p=412642#post412642]Приведение типов для таблиц ax2012[/url] // [url]http://sashanazarov.blogspot.com/2014/01/dynamics-ax-2012-orig-method-fails-on.html[/url] // [url=http://axforum.info/forums/showthread.php?p=328140#post328140]Опасный orig[/url] // DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024 public static anytype origFieldValue_MRC(Common _common, FieldId _fieldId) { Common commonCasted; Common commonOrig; anytype ret; ; if (_common.RecId == 0) { // обходим баг // [url=http://axforum.info/forums/showthread.php?p=328140#post328140]Опасный orig[/url] commonOrig = _common.orig(); commonOrig.doClear(); ret = commonOrig.(_fieldId); } else { commonCasted = SysDictTable::as_ByFieldId(_common, _fieldId); commonOrig = commonCasted.orig(); ret = commonOrig.(_fieldId); } return ret; } Там вообще, все печальнее, так как багу подвержен не только orig но и другие методы. Цитирую коммент из кода для as_ByFieldId X++: // приводит табличный буфер к заданному типу // работает аналогично оператору as // отличие в том, что 2-м операндом принимает идентификатор поля // т.е. на этапе компиляции тип может быть неизвестен // актуально для табличек с наследованием // так как для них бывает важно получить буфер с табличным типом таким, для // которого как раз определено поле с идентификатором _fieldId // это важно так как из-за кривого ядра в 2012-й аксапте некоторые методы ядра // для табличек с наследованием корректно работают только если вызваны на // переменной с таким типом // Пример // xRecord.orig() // xRecord.isFieldDataRetrieved() // и.т.п. // похоже, в ядре забыли в реализации подобных методов учесть, что появилось // наследование и если на типе табличного буфера не определено поле _fieldId (но // определено на каком-то из родителей) то указанные методы работали неправильно // или даже выбрасывали исключение // поэтому чтобы обойти эти проблемы перед вызовом таких методов сперва приводим // табличный буфер к нужному типу, например, вызываем // не common.isFieldDataRetrieved(fieldName) // а SysDictTable::as_ByFieldId(common, fieldName2Id(common.TableId, fieldName)).isFieldDataRetrieved(fieldName) |
|
|
| Теги |
| inheritance, isfielddataretrieved, orig, table inheritance, type cast |
|
|
|