Показать сообщение отдельно
Старый 25.09.2018, 16:45   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 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;
}