Показать сообщение отдельно
Старый 10.08.2017, 11:15   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
пока у меня получается следующая чудовищная конструкция:

но она:
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;
    }
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 10.08.2017 в 11:27.
За это сообщение автора поблагодарили: sukhanchik (5).