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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.03.2026, 15:16   #19  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4,017 / 3301 (119) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Maximin Посмотреть сообщение
Перечислять поля и писать методы - это долго.
...
Если уровней наследования будет больше - buf2buf нужно сделать несколько раз.
Согласен, что неудобно по нескольку раз писать.
Я для комфорта завел несколько вспомогательных методов на 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

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
[AX2012] Наследование таблиц. iCloud DAX: Программирование 4 26.03.2014 15:28
AX2012 - изменение связи таблиц на форме DTD DAX: Программирование 4 10.12.2013 16:30
Как сравнить financials dimensions у двух таблиц (AX2012) ? DTD DAX: Программирование 0 17.07.2013 15:16
AX2012: drag'n'drop и поля таблиц wojzeh DAX: Программирование 2 18.01.2012 22:07
приведение типов в select simply2double DAX: Программирование 3 30.09.2004 11:24

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:01.