пока у меня получается следующая чудовищная конструкция:
но она:
1. работает через полный перебор объектов AOT
2. должна знать о подчиненных элементах (table.Extensions)
в общем - фигня какая-то.
Хочу отметить, что набор методов явно писался в переходные времена, когда еще не было решено что будет ключом - int Id или String Name.
Также, набор методов явно писало несколько абсолютно равнодушных и криворуких людей, которые проектировали под единственный сценарий использования - сначала загрузить все в память (в кэш-объект), потом работать только с этим объектом (стиль SysModelMetaData). Другие сценарии при программировании похоже даже не рассматривались. Либо я чего-то не понимаю.
Собственно отсюда и вопрос ветки:
Как правильно получить элементы AOT заданной модели? В X++? В SQL? в акс2012? в акс7? А extension?
X++:
protected set getTableNamesFromModels()
{
boolean inModel(str modelDisplayName, str objname, System.Type type)
{
var models = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetModelsOfMetadataArtifact(objName, type);
var modelsEnumerator = models.getEnumerator();
while (modelsEnumerator.moveNext())
{
Microsoft.Dynamics.AX.Metadata.MetaModel.ModelInfo modelInfo = modelsEnumerator.Current;
if( ModelDisplayName == modelInfo.DisplayName )
{
return true;
}
}
return false;
}
set result = new set(Types::String);
var modelName = 'Fleet Management Extension';
var axTableType = new Microsoft.Dynamics.AX.Metadata.MetaModel.AxTable();
var axTableExtType = new Microsoft.Dynamics.AX.Metadata.MetaModel.AxTableExtension();
var t = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::TableNames(); // Why Enumerator?
while ( t.moveNext() )
{
var tname = t.get_current();
if ( inModel(ModelName, tname, axTableType.GetType()) )
{
result.add(tname);
continue;
}
var tExt = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetTableExtensionNames(tname); // Why collection?
var tExtEnum = tExt.GetEnumerator();
while( tExtEnum.moveNext() )
{
var tExtName = tExtEnum.Get_Current();
if ( inModel(ModelName, tExtName, axTableExtType.GetType()) )
{
result.add(tExtName);
continue;
}
}
}
return result;
}