|
09.08.2017, 21:16 | #1 |
Участник
|
Как правильно получить элементы AOT заданной модели? В X++? В SQL? в акс2012? в акс7? А extension?
Начал разбираться с вопросом и слегка прифигел от разнообразия программных велосипедов.
Фиг с ним, что нет напрашивающегося класса DictModel. я также не нашел методов выход на на модель из treenode... Как правильно получить элементы AOT заданной модели? В X++? В SQL? в акс2012? в акс7? как получить отдельно Extension-объекты, отдельно основные объекты модели? |
|
09.08.2017, 21:56 | #2 |
Administrator
|
AX 2012: См метод WHSParameters::version().
Суть: У класса Treenode есть метод (нестатический) AOTGetModel(), возвращающий ID модели. ID модели преобразуется в DisplayName через получение и распарсивание XML-ки, которую сгенерит метод SysModelStore::getModelManifest(modelId) D365: С ходу не нашел. У TreeNode метод AOTGetModel() еще остался, но я не уверен в его использовании в коде. Класса SysModelStore нет, но есть класс SysModelMetaData из методов которого неочевидно - могут ли они по ID модели получить название.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
09.08.2017, 22:12 | #3 |
Участник
|
Цитата:
точно! не используется. Точно! этого класса в акс7 нет. а акс6 у меня сейчас под рукой нет. Цитата:
я не хотел с начинать ветку с матюков. поэтому решил спросить - может я чего не понимаю. предлагаю оставить обсуждение этого класса в конец. или в отдельную ветку. может будет таки что-то конструктивное? Последний раз редактировалось mazzy; 09.08.2017 в 22:16. |
|
09.08.2017, 22:33 | #4 |
Участник
|
Посмотрел еще раз внутрь.
1. класс SysModelMetaData - это модель всего AOT, без учета моделей (вот такая фигня, маляты) 2. я вспомнил, что эти редиски (нехорошие люди) программно генерируют метод init и вызывают его только из метода main. но не "смогли" выполнить генерацию из new. кто бы сомневался! *мат-поскипан*. выбрали, блин, универсальный метод-билдер... *мат-поскипан* в общем, SysModelMetaData точно давайте оставим на потом. если кому-нибудь хочется - открывайте новую ветку про этот класс. а пока вопрос: Как правильно получить элементы AOT заданной модели? В X++? В SQL? в акс2012? в акс7? А extension? |
|
10.08.2017, 02:34 | #5 |
Участник
|
В общем, фиг. в моем инстансе для всех таблиц возвращает 15.
|
|
09.08.2017, 22:39 | #6 |
Administrator
|
А вопрос по AX 2012 не снялся?
__________________
Возможно сделать все. Вопрос времени |
|
09.08.2017, 23:06 | #7 |
Участник
|
как бы тебе сказать...
ты ответил как можно сделать в принципе. я спрашивал "Как правильно". Я не уверен, что "распарсивание XML-ки" это правильный подход. ) я в самом начале написал, что вижу велосипеды. есть тут некий бразильский модуль. в нем такооое происходит... поискал вокруг аналоги. есть еще пара мест в региональных функционалах... я не уверен, что этот код пойдет в продакшн. поэтому не уверен, что на него вообще ссылаться можно. но сам вопрос "как правильно" обсудить вполне можно. я так считаю. |
|
09.08.2017, 23:32 | #8 |
Участник
|
Для примера что я хочу получить:
|
|
10.08.2017, 08:44 | #9 |
Участник
|
|
|
10.08.2017, 10:04 | #10 |
Участник
|
не, не то.
в директориях могут быть просто файлы. и модули, не инсталированные в аксапту. "замучаешься пыль глотать" Цитата:
в акс7 код редактируется в Visual Studio. Аксаптовские вещи в VS сделаны через аддоны. Фреймворк аддонов ооочень сильно отличается от кода и окружения, которое "живет" в аксапте. |
|
10.08.2017, 09:31 | #11 |
Злыдни
|
А в 7-ке функция сборки в проект всех объектов одной модели осталась (Сервис / Управление моделью / Создать проект на основе модели, класс SysModelCreateProject)?
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
10.08.2017, 10:06 | #12 |
Участник
|
X++: private Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider getMetadataProvider() { var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment(); Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration runtimeProviderConfiguration = new Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration(environment.get_Aos().get_PackageDirectory()); Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory metadataProvicerFactory = new Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory(); return metadataProvicerFactory.CreateRuntimeProvider(runtimeProviderConfiguration); } ... MetadataProvider.Classes.ListObjectsForModel(ModelName) |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
10.08.2017, 11:09 | #13 |
Участник
|
да, подобный велосипед я тоже видел.
очень смущает вот эта конструкция: можешь в нескольких словах рассказать как она работает? что будет, если в структуру каталогов попадет что-то левое? например, в результате бесчеловечных программистских опытов в каталогах останутся неинсталлированные модули или другие ошметки файлов. а также что будет, если используется несколько АОСов? Последний раз редактировалось mazzy; 10.08.2017 в 11:31. |
|
10.08.2017, 12:47 | #14 |
Участник
|
Насколько я помню DIct* работает через то же самое, то есть будет то же самое . Как оно внутри - надо смотреть исходники.
|
|
10.08.2017, 12:50 | #15 |
Участник
|
Цитата:
я всегда думал, что через псевдотаблицу UtilElements. раньше aod - это база данных внутреннего формата, которая хранит UtilElements. Все остальное - обертка над этой базой. теперь это файлы? хм... а что будет, если кто-то нехороший при работающей аксапте начнет файлы трогать? например, добавлять в файлы/каталоги что-нибудь полезное (или вредоносное)? |
|
10.08.2017, 13:48 | #16 |
Участник
|
Ладно, давайте вернемся к теме. Будем надеятся, что внутри таки окажется чистый дух воды.
Еще раз спасибо. Я посмотрю провайдера и вокруг. Правильно я понимаю, что всякие SysDict, treeNode, UtilElement можно считать устаревшими и не стоит рассчитывать, что они будут развиваться? Я правильно понимаю, что сейчас актуальны namespace Microsoft.Dynamics.Ax.*? И если что и будет развиваться, то в первую очередь они? |
|
10.08.2017, 11:15 | #17 |
Участник
|
пока у меня получается следующая чудовищная конструкция:
но она: 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; } Последний раз редактировалось mazzy; 10.08.2017 в 11:27. |
|
|
За это сообщение автора поблагодарили: sukhanchik (5). |
10.08.2017, 12:54 | #18 |
Участник
|
Что будет если то же самое кто-то будет делать для любого остального софта, который не использует базу данных для хранения кода а только каталоги? Мне кажется, проблема надумана
|
|
10.08.2017, 13:08 | #19 |
Участник
|
|
|
11.08.2017, 08:43 | #20 |
Злыдни
|
Я не прог, но посмотрел бы еще на DynamicsAX-model MANAGEMENT-view all package dependencies. Что делает, как собирает.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
Теги |
ax2012, ax7, модель |
|
|