AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.10.2017, 14:02   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от alicedr Посмотреть сообщение
В теории в АОТе не может быть 2х объектов одного типа с одинаковым названием, пусть они и лежат физически в разных моделях (читай папках)
может. объект - может. )))
меточные файлы - да - не могут.
см. "хитрый" вопрос на собеседование по акс7.

Цитата:
Сообщение от alicedr Посмотреть сообщение
Меток почти 2 тысячи, зато язык один.
Мерджить ничего не надо, слава Богу.
почему вы так думаете?

Если вы знаете что делаете, слушайте Макса Белугина.
Дополнительно к VSCode могу порекдомендовать Notepad++
)))
__________________
полезное на axForum, github, vk, coub.
Старый 08.11.2017, 12:45   #2  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Где теперь хранятся xrefs в 365?

Видится такой алгоритм реплейсера:
1. "прочёсывать" xrefs на предмет пути к исходнику содержащему метку "@OLD22";
2. открыть исходник объекта и заменить "@OLD22" на "@NEW22".

Upd:
База данных DYNAMICSXREFDB содержит построенные ссылки.
Запрос выбора ссылок для указанного объекта "@ANG5614":
X++:
use DYNAMICSXREFDB;

select top 100
	modules.Module
	,searchObject.Id as 'SearchObjectId'
	,searchObject.Path as 'SearchObjectPath'
	,xrefs.SourceId as 'ReferencedObjectId'
	,referencedObject.[Path] as 'ReferencedObjectPath'
	,xrefs.Line
	,xrefs.[Column]
	,xrefs.Kind
from [Names] searchObject
inner join [Modules] modules
	on modules.Id = searchObject.ModuleId
inner join [References] xrefs
	on xrefs.TargetId = searchObject.Id
inner join [Names] referencedObject
	on referencedObject.Id = xrefs.SourceId
where searchObject.Path like '%@ANG5614%'
Таблица References содержит поле Kind, и после некоторых попыток связать номера с типами объектов получил следующий маппинг:
1 Method
2 Class
3 Interface
4 Abstract class
5 ?
6 Property
7 Attribute
8 ?
9 Tag

Результат выглядит следующим образом:


Смапить с физическим расположением исходника - дело техники

Последний раз редактировалось MazZzDaI; 08.11.2017 в 14:19. Причина: Solution added
Старый 08.11.2017, 21:28   #3  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение

Таблица References содержит поле Kind, и после некоторых попыток связать номера с типами объектов получил следующий маппинг:
1 Method
2 Class
3 Interface
4 Abstract class
5 ?
6 Property
7 Attribute
8 ?
9 Tag
Поиск по форуму великолепный Что значит kind в xReference в ax7?

Последний раз редактировалось skuull; 08.11.2017 в 23:12.
За это сообщение автора поблагодарили: MazZzDaI (1).
Старый 13.11.2017, 11:11   #4  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Цитата:
Сообщение от skuull Посмотреть сообщение
Поиск по форуму великолепный Что значит kind в xReference в ax7?
Да, ты прав, Евгений, спасибо ^_^

Сделал приложение для замены кодов меток Ax7LabelsReplacer
Критика приветствуется.
За это сообщение автора поблагодарили: mazzy (4).
Старый 13.11.2017, 12:22   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Сделал приложение для замены кодов меток Ax7LabelsReplacer
Критика приветствуется.
Огромное спасибо за проект.
Пусть будет больше проектов - хороших и разных.

Не столько критика, сколько предложения для обсуждения:
  1. может не стоит хардкодить путь к аксапте? если уж не параметры командной строки, то хотя бы какой-нибудь в XML или брать из проекта. см.п.10
  2. И connection string к базе с перекрестными ссылками тоже.
  3. мне не кажется, что прямой запрос в базе с перекрестными ссылками является хорошей идеей. лучше воспользоваться хранимками, которые поставляются в этой базе. (см. приложенный скриншот). об эффективности и целесообразности прямых запросов по сравнению с хранимками можно поговорить
  4. насчет Replace в type - мне вот интересно, а сами разработчики в MS как с этим работают? наверняка какая-нибудь утилита есть для такой замены. А вообще говоря, яйца хочется оторвать тому, кто запроектировал множественное число.
  5. могу ошибаться, но не понимаю как будут найдены метки, которые используются в другой модели. например, метка объявлена в модели myModel, а используется в модели myModelTest. )))
  6. чтение файла - очень медленная операция. поэтому хотелось бы, чтобы алгоритм был более умным и читал только один раз. могу ошибаться, но мне кажется, что сейчас каждый xml-файл будет читаться столько раз, сколько меток в этом файле найдено перекрестными ссылками (retList - обычный список, который позволяет хранить дубли. в sql нет group by)
  7. в идеале хотелось бы видеть хотя бы подходы к распараллеливанию дисковых операций с xml-файлами
  8. текстовый replace в xml-файле... да еще заменяемые строки задаются пользователем в параметрах... мне кажется это слишком опасным - слишком легко сломать ВЕСЬ исходный код аксапты.
  9. if (!text.Contains(_fromLabel)) ПОСЛЕ замены выглядит прикольно )))
  10. на самом деле хотелось бы на выходе получить не тексты ошибок, а список измененных файлов, которые надо включить в проект и которые надо будет сбилдить. а лучше, чтобы проект сразу был бы обновлен утилитой.
  11. добавил после крепкого размышления "а стоит ли": ну и не Console.WriteLine, а вывод в канал для ошибок stderr, чтобы утилиту можно было запускать в автоматическом режиме, чтобы можно было перенаправлять потоки-каналы в файл и затем анализировать другими утилитами.
Миниатюры
Нажмите на изображение для увеличения
Название: ax7.PNG
Просмотров: 737
Размер:	32.4 Кб
ID:	11722  
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 13.11.2017 в 12:40.
За это сообщение автора поблагодарили: MazZzDaI (1).
Старый 13.11.2017, 13:55   #6  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Спасибо большое за отзыв!

Цитата:
Сообщение от mazzy Посмотреть сообщение
может не стоит хардкодить путь к аксапте? если уж не параметры командной строки, то хотя бы какой-нибудь в XML или брать из проекта. см.п.10
И connection string к базе с перекрестными ссылками тоже.
TODO

Цитата:
Сообщение от mazzy Посмотреть сообщение
мне не кажется, что прямой запрос в базе с перекрестными ссылками является хорошей идеей. лучше воспользоваться хранимками, которые поставляются в этой базе. (см. приложенный скриншот). об эффективности и целесообразности прямых запросов по сравнению с хранимками можно поговорить
TODO
Поиск на моём инстансе занимал 22 сек для каждой метки, для оптимизации перенёс все нужные References в отдельную таблицу путём select * into.

Цитата:
Сообщение от mazzy Посмотреть сообщение
насчет Replace в type - мне вот интересно, а сами разработчики в MS как с этим работают? наверняка какая-нибудь утилита есть для такой замены. А вообще говоря, яйца хочется оторвать тому, кто запроектировал множественное число.
Хороший вопрос, но в группу разработчиков ядра я пока не вхожу

Цитата:
Сообщение от mazzy Посмотреть сообщение
могу ошибаться, но не понимаю как будут найдены метки, которые используются в другой модели. например, метка объявлена в модели myModel, а используется в модели myModelTest. )))
Поиск исходников производится только в указанном каталоге независимо от наличия файла меток. Т.е. получил ссылку на файл, нашёл файл, переписал "ТестOLD" на "ТекстNEW".

Цитата:
Сообщение от mazzy Посмотреть сообщение
чтение файла - очень медленная операция. поэтому хотелось бы, чтобы алгоритм был более умным и читал только один раз. могу ошибаться, но мне кажется, что сейчас каждый xml-файл будет читаться столько раз, сколько меток в этом файле найдено перекрестными ссылками (retList - обычный список, который позволяет хранить дубли. в sql нет group by)
TODO

Цитата:
Сообщение от mazzy Посмотреть сообщение
в идеале хотелось бы видеть хотя бы подходы к распараллеливанию дисковых операций с xml-файлами
TODO

Цитата:
Сообщение от mazzy Посмотреть сообщение
текстовый replace в xml-файле... да еще заменяемые строки задаются пользователем в параметрах... мне кажется это слишком опасным - слишком легко сломать ВЕСЬ исходный код аксапты.
Если подвязана система контроля версий, то все изменения можно откатить (чем я и пользовался в процессе создания)

Цитата:
Сообщение от mazzy Посмотреть сообщение
if (!text.Contains(_fromLabel)) ПОСЛЕ замены выглядит прикольно )))
Действительно

Цитата:
Сообщение от mazzy Посмотреть сообщение
на самом деле хотелось бы на выходе получить не тексты ошибок, а список измененных файлов, которые надо включить в проект и которые надо будет сбилдить. а лучше, чтобы проект сразу был бы обновлен утилитой.
TODO
При подключенной системе контроля версий все изменённые файлы сваливаются в Pending changes, выгребаю оттуда командой "tf status".

Цитата:
Сообщение от mazzy
при включенной системе контроля версий, в большинстве случаев у файлов будет включен ReadOnly атрибут.
Можно убрать атрибут (что потенциально опасно при совместной разработке) или настроить build

Цитата:
Сообщение от mazzy Посмотреть сообщение
добавил после крепкого размышления "а стоит ли": ну и не Console.WriteLine, а вывод в канал для ошибок stderr, чтобы утилиту можно было запускать в автоматическом режиме, чтобы можно было перенаправлять потоки-каналы в файл и затем анализировать другими утилитами.
и
Цитата:
Сообщение от ryik Посмотреть сообщение
...сканирование папок лучше завернуть в обертку try catch так как во время поиска возможны ошибки доступа и ошибки с пермишенами
Можем улучшить приложение совместно - кидайте ChangeRequest в GutHub

Последний раз редактировалось MazZzDaI; 13.11.2017 в 13:59.
Старый 13.11.2017, 14:29   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Поиск на моём инстансе занимал 22 сек для каждой метки,
еще бы! where like c первым символом '%' - почти гарантированный table scan ))))

Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
для оптимизации перенёс все нужные References в отдельную таблицу путём select * into.
оО!
а реентерабельность? а параллельная обработка? а разрастание tempDB на ровном месте?
значит, для "оптимизации". ладно, молчу-молчу...

Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Хороший вопрос, но в группу разработчиков ядра я пока не вхожу
чтобы задуматься над вопросом, не обязательно входить в группу разработчиков.

Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Поиск исходников производится только в указанном каталоге независимо от наличия файла меток. Т.е. получил ссылку на файл, нашёл файл, переписал "ТестOLD" на "ТекстNEW".
Т.е. это человек должен задумываться над тем, в каких каталогах искать?
это человек должен вручную запускать столько раз, сколько моделей он хочет изменить?

Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Если подвязана система контроля версий, то все изменения можно откатить (чем я и пользовался в процессе создания)
И я об этом же )))
Все - не хорошее слово. Как только появляется слово "все" - жди логической ошибки.

я правильно понимаю, что вы считаете, что в одном сеансе человек будет делать только метки? и человеку действительно улыбается откатить ВСЕ свои изменения из-за "не так" сработавших меток?

Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
При подключенной системе контроля версий все изменённые файлы сваливаются в Pending changes, выгребаю оттуда командой "tf status".
Даю маячок: при работе с нынешней аксаптой вполне обычное явление - рабочий список "Pending changes" из 200-400 файлов.

данная утилита добавит еще несколько десятков, а несколько десятков изменит непредсказуемым для человека образом. )))

Угу-угу. Все. Именно.

Кроме того, утилита не выдает(!) список измененных файлов. А только выводит сообщения на консоль. ))))

угу-угу. Сваливаются. Я об этом же.

Му-ха-ха-ха! Извините.

Вы точно не входите в команду разработчиков?
У вас ход мыслей очень похож.
Думаю, что вы нашли бы общий язык с ними.

Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Можем улучшить приложение совместно - кидайте ChangeRequest в GutHub
Можем.
пока предпочитаю потрыднеть на форуме. Сблизить подходы, так сказать.

прежде всего, лично я считаю, что подобные утилиты лучше делать так, чтобы их можно было добавлять в конвеер обработчиков. поэтому подобные утилиты лучше писать на powershell. ну, или хотя бы использовать stdin, stdout, stderr.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 13.11.2017 в 14:41.
Старый 14.11.2017, 12:27   #8  
ryik is offline
ryik
Участник
 
2 / 12 (1) ++
Регистрация: 13.11.2017
Адрес: Киев
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Можем улучшить приложение совместно - кидайте ChangeRequest в GutHub
На выходе функции "SearchFiles" будет foundFiles со списком файлов найденных в папке(rootDirectory) и ее подпапках согласно заданному критерию поиска (SearchPattern), за исключением папок и файлов с ошибками доступа. В myLogFile будет записан лог с добавленными файлами для изменений и ошибками доступа.

Код:
private List<string> foundFiles = new List<string>();

private void SearchFiles(string myLogFile, string rootDirectory, string SearchPattern) // Search Document at disks by its pattern
        {
            var Coder = Encoding.GetEncoding(65001);
            File.AppendAllText(myLogFile, ";Changing history:\n", Coder);

            Stack<string> dirs = new Stack<string>(100);

            if (!Directory.Exists(rootDirectory))
            { throw new ArgumentException(); }
            dirs.Push(rootDirectory);

            while (dirs.Count > 0 )
            {
                string currentDir = dirs.Pop();
                string[] subDirs;
                try { subDirs = Directory.GetDirectories(currentDir); }
                catch (UnauthorizedAccessException e)
                {
                    File.AppendAllText(myLogFile, "; Wrong Access to the Folder:  " + currentDir + " \n", Coder);
                    continue;
                }
                catch { continue; }

                string[] files = null;
                try
                { files = Directory.GetFiles(currentDir); }
                catch (UnauthorizedAccessException e)
                {
                    File.AppendAllText(myLogFile, "; Wrong Access to Files in the Folder:  " + currentDir + " \n", Coder);
                    continue;
                }
                catch { continue; }
                foreach (string file in files)
                {
                    try
                    {
                        FileInfo fi = new FileInfo(file); 
                        if (fi.FullName.ToString().ToLower().Contains(SearchPattern) == true) 
                        {
                            File.AppendAllText(myLogFile, fi.FullName + " - add to list\n", Coder);
                            foundFiles.Add(fi.FullName, Coder);
                        }
                    }
                    catch (FileNotFoundException e) 
                    { 
                    File.AppendAllText(myLogFile, "; The File was deleted" + " \n", Coder);
                    continue; 
                    } 
                    catch { continue; }
                }
                foreach (string str in subDirs)
                { dirs.Push(str); }
            }
        }
Старый 13.11.2017, 12:38   #9  
ryik is offline
ryik
Участник
 
2 / 12 (1) ++
Регистрация: 13.11.2017
Адрес: Киев
Цитата:
Сообщение от MazZzDaI Посмотреть сообщение
Да, ты прав, Евгений, спасибо ^_^

Сделал приложение для замены кодов меток Ax7LabelsReplacer
Критика приветствуется.
После развернутого ответа mazzy мне осталось только дополнить, что сканирование папок лучше завернуть в обертку try catch так как во время поиска возможны ошибки доступа и ошибки с пермишенами - и программа будет просто вывалиться.
За это сообщение автора поблагодарили: mazzy (2).
Старый 13.11.2017, 12:48   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ryik Посмотреть сообщение
возможны ошибки доступа и ошибки с пермишенами - и программа будет просто вывалиться.
угу.
и, при включенной системе контроля версий, в большинстве случаев у файлов будет включен ReadOnly атрибут.
__________________
полезное на axForum, github, vk, coub.
Теги
ax7, d365, label

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxinsight: AX7/D365/Operations: Enable/Disable form control in X++ Blog bot DAX Blogs 0 14.09.2017 13:11
dynamicsaxinsight: AX7/D365/Operations: Create custom data entity Blog bot DAX Blogs 0 14.09.2017 13:11
dynamicsaxinsight: AX7/D365/Operations: Data import using data entities Blog bot DAX Blogs 0 14.09.2017 13:11
patrickmouwen: 1yr with AX7 Data Management – My top 12 learnings Blog bot DAX Blogs 2 12.10.2016 15:14
patrickmouwen: AX7 – My top 12 highlights Blog bot DAX Blogs 0 27.02.2016 13:11

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:36.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.