воскресенье, 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!