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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.09.2018, 16:45   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,987 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от gl00mie Посмотреть сообщение
...Полученное значение уже можно использовать, скажем, в new DictTable(tableId).makeRecord()
Поправил код с учетом ваших замечаний.

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]
public static anyType origFieldValue_MRC(Common _common, FieldId _fieldId)
{
    TableId     tableId;
    TableId     tableId4Field;
    FieldName   fieldName;

    Common      commonCasted;
    Common      commonOrig;

    DictTable   dictTable;

    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
    {
        dictTable = new DictTable(_common.TableId);

        if (!(dictTable && dictTable.supportInheritance()))
        {   // обычная табличка без наследования - все как обычно
            commonOrig = _common.orig();
            ret = commonOrig.(_fieldId);
        }
        else
        {   // обходим баг
            // [url]http://sashanazarov.blogspot.com/2014/01/dynamics-ax-2012-orig-method-fails-on.html[/url]
            // решаем проблемы с получением значений из родительских табличек для orig() буфера
            
            dictTable = new DictTable(tableName2id(_common.getInstanceRelationType()));
            
            if (dictTable)
            {
                // ищем tableId в иерархии наследования для которой первой определено поле _fieldId т.е. ту для которой оно было введено, а не отнаследовано.
                fieldName = fieldId2name(_common.TableId, _fieldId);
                tableId4Field = _common.TableId;

                if(fieldName)
                {
                    tableId = dictTable.extends();

                    while(tableId)
                    {
                        dictTable = new DictTable(tableId);

                        if (fieldName2id(tableId, fieldName))
                        {
                            tableId4Field = tableId;
                        }
                        else
                        {
                            break;
                        }

                        tableId = dictTable.extends();
                    }
                }
            }
            
            if (tableId4Field)
            {
                commonCasted = SysDictTable::as(_common, tableId2name(tableId4Field));
                commonOrig = commonCasted.orig();
                ret = commonOrig.(_fieldId);
            }
            else
            {
                // не должны сюда попасть. Можно кидать исключение.
                commonOrig = _common.orig();
                ret = commonOrig.(_fieldId);
            }
        }
    }

    return ret;
}
Теги
inheritance, 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:02.