А вот сами методы класса SysDictTable
X++:
// см. \Classes\SysDictTable\as_ByFieldId
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024
public static TableId getConcreteTableIdByFieldId_MRC(Common _common, FieldId _fieldId)
{
DictTable dictTable;
TableId tableId;
TableId tableId4Field;
str fieldName;
;
dictTable = new DictTable(_common.TableId);
if (!(dictTable && dictTable.supportInheritance()))
{
return _common.TableId;
}
// Get concrete table for inheritance
dictTable = new DictTable(tableName2id(_common.getInstanceRelationType()));
if (dictTable)
{
// ищем tableId в иерархии наследования для которой первой определено поле _fieldId т.е. ту для которой оно было введено, а не отнаследовано.
// fieldName = fieldId2name(_common.TableId, _fieldId);
fieldName = fieldId2name(dictTable.id(), _fieldId); // в CIL для таблиц с наследованием лучше использовать не _common.TableId а tableName2id(_common.getInstanceRelationType())
// а еще лучше SysDictTable::getConcreteTable() так как он работает для любых табличек
// метод getInstanceRelationType() для ненаследуемых табличек выдает пустую строку но в нашем случае можно его юзать так как заведомо наследование есть в этом месте,
// а работать будет быстрее чем SysDictTable::getConcreteTable()
// см. [url=http://axforum.info/forums/showthread.php?p=412646#post412646]Приведение типов для таблиц ax2012[/url]
// tableId4Field = _common.TableId;
tableId4Field = dictTable.id();
if (fieldName)
{
tableId = dictTable.extends();
while (tableId)
{
dictTable = new DictTable(tableId);
if (fieldName2id(tableId, fieldName))
{
tableId4Field = tableId;
}
else
{
break;
}
tableId = dictTable.extends();
}
}
}
if (!tableId4Field)
{
// не должны сюда попасть. Можно кидать исключение.
throw error(strFmt("Не получилось определить таблицу для буфера %1, RecId = %2, поле = %3 (id поля = %4)",
tableId2name(SysDictTable::getConcreteTable(_common)),
_common.RecId,
fieldId2name(_common.TableId, _fieldId),
_fieldId
));
}
return tableId4Field;
}X++:
// см. \Classes\SysDictTable\as_ByFieldName
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024
public static TableId getConcreteTableIdByFieldName_MRC(Common _common, FieldName _fieldName)
{
TableId tableId;
FieldId fieldId;
TableId ret;
;
// fieldId = fieldName2id(_common.TableId, _fieldName);
tableId = SysDictTable::getConcreteTable(_common);
fieldId = fieldName2Id(tableId, _fieldName);
ret = SysDictTable::getConcreteTableIdByFieldId_MRC(_common, fieldId);
return ret;
}X++:
// [url=https://axforum.info/forums/showthread.php?t=78933]Приведение типов для таблиц ax2012[/url]
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024
public static Common as_ByFieldId(
Common _common,
FieldId _fieldId
)
{
anytype anyBuffer;
TableId tableId;
Common ret;
;
if (_fieldId)
{
tableId = SysDictTable::getConcreteTableIdByFieldId_MRC(_common, _fieldId);
if (tableId)
{
// anyBuffer = _common as tableId2Name(tableId);
anyBuffer = new DictTable(tableId).makeRecord();
anyBuffer = _common;
ret = anyBuffer;
}
}
return ret;
}X++:
// [url=https://axforum.info/forums/showthread.php?t=78933]Приведение типов для таблиц ax2012[/url]
// DevRecordInfo_FixRetrieve "Исправление ошибок "Поле "XXX" в таблице "YYY" не было явным образом выбрано.", "Аргумент метода isF", PKoz 15.08.2024
public static Common as_ByFieldName(
Common _common,
FieldName _fieldName
)
{
anytype anyBuffer;
TableId tableId;
Common ret;
;
if (_fieldName)
{
tableId = SysDictTable::getConcreteTableIdByFieldName_MRC(_common, _fieldName);
if (tableId)
{
// anyBuffer = _common as tableId2Name(tableId);
anyBuffer = new DictTable(tableId).makeRecord();
anyBuffer = _common;
ret = anyBuffer;
}
}
return ret;
}