Показаны сообщения с ярлыком AX2012. Показать все сообщения
Показаны сообщения с ярлыком AX2012. Показать все сообщения
воскресенье, 23 сентября 2018 г.
AX2012: Работа с текстовыми файлами
TextIo
TextIo сохраняет текст в
кодировки Unicode.
Экспорт данных в текстовый файл с
помощью TextIo:
Чтение данных из текстового файла
с помощью TextIo:
TextBuffer
Помимо нативных средств для
работы с текстовыми файлами Dynamics AX предоставляет возможность вызывать
классы .NET для чтения/записи файлов, TextBuffer – один из таких классов.
Экспорт данных в текстовый файл с
помощью TextBuffer:
Чтение данных из текстового файла с помощью TextBuffer:
Happy DAXing!
понедельник, 17 сентября 2018 г.
AX2012: работа со складскими аналитиками
Попробуем разобраться с механизмом работы со складскими аналитиками в Dynamics AX2012.
В Dynamics AX доступны разные складские аналитики: сайт, склад, ячейка, паллет, партия, серийный номер и т.п. Эти характеристики применяются к номенклатурам.
Рассмотрим пример: у нас есть номенклатура с ItemId «ITEM001» для которой активны аналитики сайт, склад, ячейка, паллет, совершим складскую проводку на Сайт «S1», Склад «WHS01», Ячейку «LOC001», Паллет «PLT001». Для хранения проводки потребуется таблица с полями складских аналитик:
Попробуем все это упростить, создав новое поле ID, которое будет ссылаться на комбинацию этих значений. Например, «IDIM001» относится к Сайту «S1», Складу «WHS01», Ячейке «LOC001» и Паллету «PLT001». Кроме того, создадим отдельную таблицу для хранения значений всех этих 10 полей вместе с новым ID полем и добавим наше новое поле в таблицу проводок. Теперь все эти 100 записей мы можем сохранить лишь в одном ID поле.
Теперь больше не требуется хранить данные о 10 складских аналитиках в 100 записях, вместо этого нам нужно сохранить лишь одно поле, указывающее на определенную комбинацию этих складских аналитик. Пример таких таблиц можно увидеть ниже:
Такое поле ID в Dynamics AX называется InventDimId и таблица, в которой хранятся комбинации складских аналитик, а также это поле InventDimId называется InventDim:
Эта таблица играет крайне важную роль в Dynamics AX - каждая таблица, связанная со складскими аналитиками, как SalesLine, PurchLine, InventTrans - все имеют связь с InventDim.
Существуют уже готовые функции для создания и поиска InventDimId для различных комбинаций складских аналитик. Наиболее часто используется findOrCreate() для поиска складской аналитики - если InventDimId уже существует для заданной комбинации, тогда система вернет значение, если нет, то создаст новое значение и вернет его.
Если необходимо создать новые таблицы для хранения складских аналитик, то пользуйтесь уже готовым решением.
Happy DAXing!
Подсчет времени в X++
При выполнении некоторых времязатратных операций, например, чтение данных из Excel, выполнение запроса, выгрузка данных и т.п., бывает нужно знать длительность каждой операции – порой это помогает оптимизировать логику или запрос.
Для этой цели можно использовать функцию WinAPI::getTickCount():
WinAPI::getTickCount() возвращает значение в миллисекундах, данные необходимо приводить к необходимому виду – секунды, минуты.
Happy DAXing!
update_recordSet, insert_recordset и delete_from
update_recordSet, insert_recordset и delete_from
В Dynamics AX2012 уделено много внимания повышению производительности и система предоставляет инструменты для доступа (вставка, удаление, обновление) к базе данных с меньшими затратами (меньшим количеством обращений к БД), используя функционал SQL Server.
В AX 2012 есть несколько способов обновления записей в БД, один из них - последовательный перебор, используя while select. Но есть более эффективный способ - update_recordSet позволяет обновить совокупность записей за одно обращение к серверу.
Например, следующий запрос SQL:
можно в AX выполнить следующим образом:
update_recordSet позволяет использовать join:
Для вставки новых записей и удаления записей из таблиц без использования циклов используются функции delete_from:
и insert_recordset:
Happy DAXing!
понедельник, 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!
Ярлыки:
Блокировки,
индексы,
Перекрестные ссылки,
Разработка,
Советы,
AX2012,
Cross-reference,
Dynamics AX,
firstOnly,
Locks,
Select statement
воскресенье, 23 октября 2016 г.
Советы начинающим разработчикам DAX (часть 1)
Введение
В этом посте я хочу поделиться некоторыми полезными советами начинающим разработчикам Dynamics AX. Во второй части я затрону некоторые тонкости разработки в X++.Группы полей таблиц
Каждое поле таблицы, которое планируется отображать на формах, лучше помещать в группы. Рассмотрим таблицу BankAccountTable и, например, группу полей Description (Описание). Обратите внимание, что поля в группе полей Description соответствуют группе Описание на форме:Если в таблице создать новое поле и добавить его в группу полей Description, то оно автоматически появится и в группе на форме:
Однако, нельзя добавить в группу на форме поле, которое не состоит в этой группе используя механизм Drag&Drop. Все дело в том, что свойство DataGroup на форме определено группой полей таблицы, тем не менее можно добавлять элементы на форму вручную, если удалить значение свойства DataGroup.
Формы в DAX: поиск, изменение, поля и методы
Когда только начинаешь изучать AX, не сразу понятно, как найти конкретную форму и какие поля и методы используются на форме.Откройте форму, которая вам нужна, вызовите контекстное меню на самой форме и выберите Персонализация:
На вкладке Информация вы найдете название формы в AOT и, кликнув на Правка, откроете форму прямо в AOT:
Перенос и вставка полей
Если в редакторе формы в 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!
Подписаться на:
Сообщения (Atom)




















































