понедельник, 13 ноября 2017 г.

Немного о CIL

В Microsoft Dynamics AX код может быть откомпилирован в CIL и запущен в .NET CLR. 
Разберемся по порядку что это значит.

Компиляция – интерпретация исходного кода в машинноисполняемый формат, который может быть исполнен на сервере или клиенте.

CIL (Common Intermediate Language) – единый переходный язык, работающий совместно с CLI (Common Language Infrastructure) – многоязыковой инфраструктурой, базирующейся на наборе правил языков программирования, которые компилируются в CIL. Одним из самых важных свойств CIL является набор инструкций, не зависящих от платформы и ЦП, что позволяет выполнять код в разных средах.

На рисунке ниже показано, как языки первично компилируются в CIL после чего CLR (многоязыковая среда выполнения) компилирует платформонезависимый код CIL в код, читаемый машиной:





Многоязыковая среда выполнения (CLR – Common Language Runtime) понимает CIL и знает как выполнять этот код. CLR не нужно понимать все языки (C#, VB или F#), ей достаточно знать только один язык, т.к. все они преобразуются в CIL.

Microsoft Dynamics AX может преобразовывать откомпилированный X++ код в код CIL, соответственно, может запускать код X++ в CIL. Необходимо не забывать про CIL при разработке, т.к. код, запускаемый на сервере, такой как пакетные задания и службы, будет запускаться в CIL и, соответственно, такой код X++ нужно предварительно откомпилировать в CIL.

Т.к. компиляция в CIL требует времени, то она не выполняется автоматически при компиляции X++. Необходимо выполнять ее вручную при изменении кода, используя кнопки компиляции на рабочем интерфейсе разработчика.

Можно запустить полную или инкрементную CIL-компиляцию. Основная разница между ними в том, что инкрементная компиляция выполняется только для объектов, измененных со времени последней компиляции, а полная компиляция выполняется для всех объектов. Инкрементная компиляция выполняется быстрее, чем полная, но необходимо понимать, что не всегда достаточно инкрементной компиляции.

Итак, CIL-компиляция выполнена. Но что изменилось и где можно найти результаты этого процесса? Ответ на этот вопрос можно найти в папке bin на сервере. По умолчанию она находится здесь: %ProgramFiles%\Microsoft Dynamics AX\60\Server\<Server Name>\bin\XppIL. 


В этой папке можно найти итоговый файл сборки Dynamics.Ax.Application.dll вместе со списком файлов *.NetModule. Файлы *.NetModule отличаются от сборок .Net, - они не содержат манифеста сборки. Файлы *.NetModule содержат только типовые метаданные и откомпилированный код. Также в этой папке можно найти файлы с разрешением .xpp - эти файлы содержат исходный X++ код и могут использоваться при отладке кода X++ в Visual Studio, таким образом редактор и отладчик могут показывать актуальный исходный код.

Примечание: если установлено несколько экземпляров AOS, то необходимо остановить все экземпляры, и затем перезапустить их. Это необходимо для того, чтобы экземпляры AOS загрузили обновленную сборку.



ПС: если в материале есть какие-либо неточности, то прошу поправить в личном сообщении или в комментарии.
Happy DAXing!

суббота, 16 сентября 2017 г.

Синхронизация словаря данных


В работе с АХ крайне важным является выполнение синхронизации словаря данных [Data dictionary]. Если не понимать, что это за процесс и для чего он нужен, то в какой-то момент можно столкнуться с проблемами, связанными с синхронизацией.

Запускается синхронизация словаря данных из AOT:


Попробуем разобраться что же такое "синхронизация словаря данных".
Рассмотрим как АХ работает с SQL-сервером. Определения таблиц (имя таблицы, имена столбцов, их тип, длина и т.п.) хранятся в AX. Однако, так или иначе эти данные должны содержаться на SQL-сервере, иначе невозможно будет хранить данные в БД. 

Для этого и используется синхронизация словаря данных. Синхронизация происходит в случае, если таблица еще не существует на SQL сервере, если же таблица существует, то при синхронизации происходит поиск изменений в таблице и АХ пытается внести эти изменения на SQL-сервер. 

На самом деле все довольно просто. Вы просто запускаете синхронизацию таблицы, которую создали, и АХ обработает расхождения. После запуска процедуры синхронизации SQL получит все необходимые данные по физической таблице и сервер сможет работать с данными.

SQL Словарь

Теперь рассмотрим идентификаторы объектов (ID) и SQL-словарь таблиц на SQL-сервере. Каждый объект в АХ получает идентификатор. В АХ идентификатор присваивается объекту в момент его создания (также в момент импорта *.xpo или нового объекта в AOT, или импорта модели).

Разберем как АХ работает с таблицами на SQL сервере. Система берет параметры таблицы в AOTе и переносит их (поля, их названия, длину, тип и т.п.) на SQL. Как же АХ отслеживает, что хранится на SQL сервере? Будет ли достаточно проверки имен объектов? 
Таблица на SQL может быть проверена по имени в AOT. Итак, представим, что изменилось имя поля таблицы с columnA на columnB. Таблица, которая изменилась, не содержит никаких пометок, что ее поля были изменены.

Что же произойдет на SQL сервере, когда будет выполняется синхронизация словаря данных по таблице? Останется старое поле columnA и создастся новое поле columnB? Удалятся ли значения в исходном поле?
Для этого используются «системные» таблицы AX, в которых хранится информация о том, что АХ записала на SQL сервер. Таблица SQLDictionary содержит имена объектов АХ, их имена на SQL сервере и их ID в AX.

ID объектов АХ не могут быть изменены разработчиком вручную в IDE (Integrated Development Environment - интегрированной среде разработки), таким образом, это значение может использоваться для идентификации объекта в случае изменения его имени. Итак, теперь можно дать ответ на вопрос, указанный выше: если изменится имя столбца, то АХ будет искать в SQLDictionary запись, соответствующую столбцу и, если найдет, то обновит ее (заменив старое имя на новое), а если не найдет, то создаст новую запись с новым именем.
Happy DAXing!

воскресенье, 13 ноября 2016 г.

Советы начинающим разработчикам DAX (часть 2)

Введение

В предыдущем посте я собрал советы по разработке с использованием интерфейса Dynamics AX. Материал для второй части посвящен советам по разработки в X++.

Группы полей таблиц

При использовании оператора select крайне рекомендуется указывать список необходимых полей в случае, когда в выборке требуются не все поля таблицы. Однако, запомните, что значения содержатся только в перечисленных полях. Если дальше в коде попытаться использовать другое поле, то результат будет далек от ожидаемого. 
В примере условие if будет всегда возвращать false, т.к. поле имеет значение null.

То же самое касается и exists/notexists join. В следующем запросе буфер записей custBankAccount не содержит данные.

Оператор where и индексы

При использовании оператора select в коде X++, используйте оператор where к полям, которые содержат индексы. Если это невозможно, то стоит рассмотреть вариант добавления в таблицу индекса, совпадающего с тем, что содержится в операторе where. Если содержимое за оператором where не соответствует индексам, то будут перебираться записи таблицы, что может серьезно отразиться на производительности, если в таблицах большое количество записей. Особенно это актуально для запросов к таблицам проводок.
Избегайте запросов, подобных указанному ниже, где таблица SalesTable не содержит индекса для поля DeliveryDate:

FirstOnly

В случаях проверки условия на истинность, используйте в запросах select слово firstonly для получения первой найденной записи из таблицы. Например, firstonly может использоваться для проверки есть ли в заказах на продажу необходимые строки, т.к. достаточно найти всего одну строку для подтверждения истинности. При использовании firstonly поиск прекратится сразу, как только будет найдена первая запись. См пример кода:

Блокировки

Если операторы ttsbegin и ttscommit используются внутри других операторов ttsbegin и ttscommit, то блокировки на записях таблицы будут держаться до тех пор, пока выполнение кода не дойдет до внешнего ttscommit, поэтому старайтесь помещать как можно меньше кода между ttsbegin и ttscommit. Кроме того, т.к. блокировки держатся до ttscommit, избегайте вызовов диалогов, требующих вмешательства пользователя, внутри tts-операторов.
В следующем примере кода блокировки вызываются обоими операторами update и эти блокировки не снимутся пока не будет достигнут внешний ttscommit:

Табличные методы

Прежде чем начинать писать код на доступ к таблице или ее обновлению, просмотрите методы этой таблицы. У большинства таблиц в AX уже есть встроенные методу, которые вы можете использовать для выполнения основных задач, таких, как поиск записей, получение значений полей и т.п.
Описание методов таблиц можно найти здесь: https://msdn.microsoft.com/en-us/library/aa852568.aspx

Классы в AX

Метод super() используется в наследовании. Если один класс наследуется от другого, то его называют дочерним, а исходный – родительским.
Например, класс InventMov_Sales наследуется от InventMovement.
Обратите внимание,  что префикс в имени класса часто указывает на родительский класс.
Дочерний класс имеет переопределенный метод canBeUpdatedRegistered. В него добавлена новая логика для определения является ли заказ на продажу продажей между компаниями, если да, то обновление не происходит. Если нет, тогда вызов super() выполнит тот же самый метод в исходном классе. См. скриншот ниже:
Будьте внимательны, когда добавляете код в переопределяемый метод, т.к. размещение кода до или после вызова super() может привести к разным результатам.

Поиск ошибок в AX

При обнаружении ошибок в AX может быть полезным добавление точек останова в метод Add в классе Info, т.к. все сообщения об ошибках проходят через этот метод:
Часто непонятно какой именно класс/метод выдает ошибку, с точкой останова в Info мы получаем доступ к стеку.

Перекрестные ссылки

Для начинающих осваивать Dynamics AX очень удобен такой инструмент как Перекрестные ссылки. Перекрестные ссылки позволяют видеть связи между объектами. Перекрестные ссылки очень удобны, когда в AX необходимо найти где используются расширенные типы данных, поля или методы. Это просто бесценный инструмент для быстрого поиска примеров кода в системе, кроме того он позволяет изучить и следовать стандартам программирования.

Запустить обновление перекрестных ссылок можно как из интерфейса AOT, так и через код.

Для запуска обновления перекрестных ссылок через AOT необходимо открыть форму обновления перекрестных ссылок (меню Сервис - Перекрестные ссылки - Периодические операции - Обновить):
Откроется форма обновления перекрестных ссылок, выберите опции и нажмите Ok: 
Описание опций:
Опция
Описание
Удалить все
Удалить существующую информацию по перекрестным ссылкам.
Обновить все
Обновить информацию по перекрестным ссылкам.
Выбрано
Обновить только определенную информацию по перекрестным ссылкам (для выбора обновляемой информации необходимо настроить фильтр по кнопке «Выбрать»).
Обновить модель данных
Обновление информации по перекрестным ссылкам для реверс-инжиниринга.

Для обновления через код создайте джоб:
Обновление перекрестных ссылок выполняется довольно долго. В моем случае это заняло 11 часов 30 минут.
Как только джоб отработает, у вас появится пункт Перекрестные ссылки:
Теперь можно найти, как и где используется выбранный метод, в примере ниже указано использование метода find для таблицы CustTable:

На этом все.
Happy DAXing!

воскресенье, 23 октября 2016 г.

Советы начинающим разработчикам DAX (часть 1)

Введение

В этом посте я хочу поделиться некоторыми полезными советами начинающим разработчикам Dynamics AX. Во второй части я затрону некоторые тонкости разработки в X++.

Группы полей таблиц

Каждое поле таблицы, которое планируется отображать на формах, лучше помещать в группы. Рассмотрим таблицу BankAccountTable и, например, группу полей Description (Описание). Обратите внимание, что поля в группе полей Description соответствуют группе Описание на форме:
Если в таблице создать новое поле и добавить его в группу полей Description, то оно автоматически появится и в группе на форме:

Однако, нельзя добавить в группу на форме поле, которое не состоит в этой группе используя механизм Drag&Drop. Все дело в том, что свойство DataGroup на форме определено группой полей таблицы, тем не менее можно добавлять элементы на форму вручную, если удалить значение свойства DataGroup.

Формы в DAX: поиск, изменение, поля и методы

Когда только начинаешь изучать AX, не сразу понятно, как найти конкретную форму и какие поля и методы используются на форме.
Откройте форму, которая вам нужна, вызовите контекстное меню на самой форме и выберите Персонализация:
На вкладке Информация вы найдете название формы в AOT и, кликнув на Правка, откроете форму прямо в AOT:

На вкладке Выходная форма для любого выделенного поля формы в поле Системное имя указан источник в формате table.fieldname (таблица.поле):
Если значение table.fieldname заканчивается на (), то поле является display- или edit-методом:

Перенос и вставка полей

Если в редакторе формы в AOT вы перенесете поля, используя механизм Drag&Drop (попросту перетянули), из Data Source (источник данных) в раздел Design (дизайна формы) они не всегда оказываются там, где нужно. Перетянуть потом поле вверх или вниз по списку полей является не самой простой и легкой задачей. Самым простым способом является использование клавиши [Alt] вместе со стрелками [Вверх]/[Вниз]. Для этого выделите поле, нажмите [Alt] и, не отпуская, нажимайте стрелку [Вверх] или [Вниз] в зависимости от того, где вам необходимо разместить поле.
Первоначальная форма:
Добавление поля:

Перемещение поля:


Надеюсь, советы будут полезными.

Happy DAXing!

вторник, 11 октября 2016 г.

Удаление установленных экземпляров портала мобильных устройств

Введение

Недавно я разместил 2 поста о том, как установить и настроить портал мобильных устройств, в этом посте я расскажу о том, как правильно удалить один или более экземпляров портала. 

Удаление экземпляра Портала мобильных устройств

Для удаления экземпляра портала необходимо запустить установку Microsoft Dynamics AX 2012 и выбрать Установить Компоненты Microsoft Dynamics AX:
Когда дойдете до шага выбора между добавлением и удалением компонентов, выберите Удалить компоненты и нажмите Далее:
На следующем шаге отметьте пункт Портал мобильных устройств склада:
На следующем шаге необходимо выбрать какой из экземпляров будет удален, при этом можно удалить только один экземпляр портала за раз, и выбрать можно только по номеру экземпляра:
Теперь я хочу обратить внимание на мой предыдущий пост. Как вы видите, здесь нет никакой информации, чтобы можно было понять где какой экземпляр портала. В предыдущем посте о портале мобильных устройств я упоминал, что лучше оставлять номера экземпляров в именах web-сайтов в  Internet Information Server.
Я хочу удалить экземпляр, относящийся к немецкой компании (DEMF), поэтому я понимаю, что мне нужно удалить экземпляр 02. Итак, мы можем выбрать экземпляр и продолжить процедуру удаления. На итоговой форме остается только нажать только кнопку Удалить:
После окончания операции выбранный мобильный портал будет удален и больше не будет доступен для подключения.

Кое-что еще…

Операция удаления сама не все удаляет. Если у вас есть файлы, которые вы настраивали сами в папке портала, то эти файлы не будут удалены.
Для окончательного удаления этих файлов вам придется вручную очистить папку портала.
Это все. До встречи!
Happy DAXing!

Настройка и обслуживание нескольких Порталов мобильных устройств

Введение

В одном из предыдущих постов я рассказал, как установить Портал мобильных устройств. В этом посте я расскажу, как установить несколько порталов для работы с мобильными устройствами на складе. 
Если в организации несколько компаний, то может возникнуть необходимость использовать складские терминалы сбора данных для каждой компании отдельно. Подобных опций для смены компании вы не найдете ни в настройках Портала мобильных устройств, ни в настройках самой Microsoft Dynamics AX 2012 R3. Как упоминалось ранее, Портал мобильных устройств (WMDP) взаимодействует с внутренними пользователями AX, у которых есть настроенная по умолчанию компания.
Таким образом, для соединения с Порталом для определенной компании необходим отдельный пользователь с этой настроенной для него по умолчанию компанией.

В зависимости от нагрузки на IIS сервер, используемый для Портала и нагрузки на сам Портал может понадобиться установка еще одного Портала на другой сервер. Я не занимался тестированием загрузки WMPD, поэтому не могу дать детальной информации по масштабированию, однако, исходя из личного опыта, могу лишь сказать, что Портал не является узким местом и современный даже не самый мощный сервер вполне потянет работу с сотней пользователей, гораздо важнее производительность сервера БД.
Установка Портала на другой сервер производится так же, как я уже описывал в одном из прошлых постов. Для соединения необходимо задать новое имя сервера и номер порта. Т.к. это уже другой сервер, то порт может быть тем же самым.

Но сейчас более интересен вопрос можно ли установить несколько порталов на один сервер и как это сделать. Приступим!

Установка дополнительного Портала мобильных устройств

Необходимо запустить установщик Microsoft Dynamics AX и выбрать пункт Установить Компоненты Microsoft Dynamics AX:
На шаге выбора добавления или удаления компонентов выберите Добавить или изменить компоненты:

На шаге Добавить или изменить компоненты вы увидите, что некоторые компоненты отмечены и не активны для изменения. Эти компоненты уже установлены на машину и не могут быть установлены еще раз. Портал мобильных устройств склада уже установлен, но пункт для установки активен, значит можно установить несколько экземпляров. Отмечаем пункт и нажимаем Далее для продолжения:
В окне конфигурации портала необходимо указать Имя пользователя, которое связано с другой компанией по умолчанию. Порт веб-сайта должен быть отличен от уже используемого для портала/ов порта. В своей предыдущей установке я использовал порт 8010. Я укажу порт 8020, который больше нигде не используется:
Когда вы закончите установку, то можете открыть Диспетчер служб IIS и увидеть там новый экземпляр приложения:
Имя нового экземпляра отлично от первого установленного. Если установить третий экземпляр портала, то номер в названии экземпляра увеличится.
Сайт приложения ссылается на папку на сервере:
Обратите внимание, что для нового экземпляра Портала создалась новая подпапка в Папке портала. После окончания установки вы сможете полноценно использовать ее для работы с мобильными устройствами (ТСД).

Кое-что еще...

Обратите внимание, что файлы для каждого экземпляра Портала хранятся в отдельных папках. Так, если вы изменяете, например, файлы CSS стилей, или добавляете новые в первый экземпляр Портала, то нужно будет скопировать эти файлы и для других экземпляров Портала, если хотите, чтобы они там действовали. Это также относится и к изменениям в файлах ASP.NET и других файлах.
Чтобы было проще ориентироваться в установленных порталах в Диспетчере служб IIS, их можно переименовать. Можно использовать в названиях ID компаний, как в примере ниже:
После переименования сайтов нет необходимости в перезапуске сервисов. О том, почему у меня в названиях сайтов сохранены номера я расскажу в следующем посте.
На этом все. До встречи!
Happy DAXing!

воскресенье, 25 сентября 2016 г.

Настройка строки состояния Microsoft Dynamics AX 2012

Введение

Вы обращали внимание на то, что строка состояния в Microsoft Dynamics AX  состоит из отдельных элементов?  Знаете ли вы что все эти элементы означают?  Знаете ли вы, что можно настроить строку состояния под себя и выводить только важную для вас информацию?

Настройка строки состояния в Dynamics AX 2012

Для настройки строки состояния нужно пройти по меню: Файл – Сервис – Параметры – Строка состояния. Отметьте галочками пункты, информацию по которым вы хотите видеть у себя на строке состояния.

Рассмотрим доступные поля:

Отображение строки состояния – для отображения строки состояния выберите значение "Обычный", для скрытия выберите "Нет".
Предупреждение об изменении компании – включите эту опцию, если у вас настроено несколько подключений для переключения между разными юридическими лицами. Эта функция предупреждает пользователя при подключении к рабочей среде другого юридического лица, помогая избежать внесения информации или проводок в неверном юридическом лице.
Отобразить сведения о компании в заголовке формы – включает отображение информации о юридическом лице в заголовке формы. Обратите внимание, что окна, не определенные компаниями/не зависимые от компаний никогда не содержат компанию в заголовке. Например, компания не может содержаться в форме «Пользователь», т.к. записи пользователей не принадлежат/не определяются компаниям.

Отобразить текст справки – включает/выключает отображение текста в строке состояния для обновляемых полей.
Текущее время – включает/отключает отображение текущего времени в строке состояния.
Состояние клавиши CapsLock – включает/выключает вывод информации в строку состояния о состоянии клавиши CapsLock.
Показать мероприятие – отображать/не отображать передачу данных и активность базы данных. (ПС: На самом деле корявая адаптация, стоило бы перевести как "Показать активность").
Показать дату сеанса – включает/отключает показ даты сеанса в строке состояния.
Показать уровень служебной программы – отображать/не отображать текущий уровень объекта приложения/слой объекта приложения (ПС: снова корявая адаптация, по факту "Показать рабочий слой").
Состояние клавиши NumLock - включает/выключает вывод информации в строку состояния о состоянии клавиши NumLock.
Показать компанию – включает/отключает вывод ID компании для сессии выбранного юридического лица.
Показать валюту - включает/отключает показ выбранной по умолчанию валюты для текущего юридического лица в строке состояния. Внимание: вы можете изменить выводимую в окне валюту щелчком по этому значку/указателю.
Код пользователя - включает/отключает вывод логина текущего пользователя в строке состояния.
Показывать поле настраиваемой подсказки – включает/выключает показ настраиваемого поля в строке состояния. Значение настраиваемого поля должно быть определено/задано разработчиком.
Отобразить состояние оповещения – показывает количество непрочитанных уведомлений.
Показать раздел – показывает раздел, к которому пользователь подсоединен в момент работы.
Показать имя AOS - включает/выключает показ имени используемого AOS-а, к которому пользователь подключен во время работы. Очень полезно для пользователей, работающих в нескольких окружениях, например, в рабочем и тестовом. 
Отобразить текущую модель – показать используемую модель.
Показывать кнопку вложений документа – включает/выключает отображение иконки передачи документа/связанных документов.
Показывать кнопки навигации записи – показывает кнопки навигации, которые позволяют пользователю перемещаться вперед и назад по записям, не возвращаясь к таблице.
Показывать кнопку просмотра/изменения записи – отображает кнопку «Правка».
Показывать кнопку просмотра сведений/сетки на форме подробных сведений – добавляет кнопки вариантов просмотра: Просмотр сведений (детали) или Вид сетки (таблица).

Happy DAXing!