Введение
В предыдущем посте я собрал советы по разработке с использованием интерфейса 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!