Цитата:
Сообщение от
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;
}