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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.11.2017, 13:09   #21  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
- Прочитайте про collection initializers в C#
- .NET FW по умолчанию Case sensitive, для того, чтобы строковые функции не учитывали регистр, надо передавать специальный параметр.
За это сообщение автора поблагодарили: MazZzDaI (1).
Старый 13.11.2017, 13:55   #22  
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   #23  
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, 08:27   #24  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
часть обсуждения выделена в отдельную ветку
Этикет CodeReview
__________________
полезное на axForum, github, vk, coub.
Старый 14.11.2017, 12:27   #25  
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); }
            }
        }
Теги
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, время: 10:28.