2016-12-08 3 views
3

В АХ программирования передовой практики, которая является лучшим способом:Какова разница между использованием АОТОМ запросов и X ++ оператором выбором

  • с помощью запроса, созданного из АОТА,
  • с помощью оператора выбора с X ++ код,
  • используя запрос, созданный с X ++ код в запросе Classe ...

И когда использовать каждый из них?

ответ

2

Основные методы для выбора записей в базе данных следующим образом:

  • ЗЕЬЕСТ
  • Запрос

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

Используйте оператор выбора, когда:

  • Критерии отбора являются сложными.
  • Вы выбираете набор записей из X ++. Пользователь не собирается изменять критерии выбора.

Используйте запрос, если:

  • Пользователь может выбрать, какие записи будут выбраны.
  • Пользователь может изменить диапазон записей, которые необходимо выбрать.
  • Критерии выбора не сложнее, чем может удовлетворить запрос.
  • Когда вы используете запросы, разработайте их в дереве объектов приложения (AOT) или создайте их с нуля в своем коде. В обеих ситуациях запрос может быть изменен в коде. Запрос, созданный с нуля в коде, можно сохранить так, чтобы он выполнялся в AOT. Однако этого обычно следует избегать.

Построить запрос в AOT, когда:

  • Конкретное определение запроса используется во многих местах. (Запрос в AOT может быть повторно использован.)
  • Запрос должен содержать код.
  • Определение запроса более сложное. AOT обеспечивает визуальное представление запроса.
9

Во-первых, AX всегда использует запросы внутри, выбор X ++ преобразуется в запросы вызовов конструкций, которые выполняются во время выполнения. Запрос переводится на SQL во время выполнения на первых queryRun.next() или datasource.executeQuery(). Таким образом, нет разницы в производительности, используя тот или иной.

Формы также используют запросы, чаще всего они автоматически создаются для вас, потому что свойство AutoQuery имеет значение по умолчанию Yes. You может использовать метод X ++ в методе executeQuery, но я бы подумал об этой плохой практике, так как у пользователя не будет параметров фильтрации или сортировки. Всегда используйте запросы в формах, предпочитайте использовать автоматические запросы. Добавьте диапазоны или сортировку в методе init, используя, если необходимо, this.queryBuildDatasource(). Исключение составляют списки, которые всегда используют запрос AOT.

В классах RunBase предпочитают использовать запросы, так как у пользователя будет возможность изменить запрос. Вы можете использовать простой X ++-выбор во внутреннем цикле, но подумайте о том, чтобы включить его в предварительно запрошенный запрос, если это возможно.

В противном случае ваша основная задача как программиста (помимо решения проблемы) состоит в том, чтобы минимизировать количество строк кода.

Запросы, определенные в AOT, начинаются с нулевых строк кода, которые считаются в их пользу. Таким образом, если есть серверные статически определенные диапазоны, ссылки или сложные объединения, используйте запросы AOT. Вы не можете бить:

QueryRun qr = new QueryRun(queryStr(MyQuery)) 
qr.query().dataSourceTable(tableNum(MyTable)).findRange(fieldNum(MyTable,MyField)).value('myValue'); 

С:

Query q = new Query(); 
QueryRun qr = new QueryRun(q); 
QueryBuildDataSource ds = q.addDataSource(tableNum(MyTable)); 
QueryBuildRange qbr = ds.addRange(fieldNum(MyTable,MyField)); 
qbr.value('myValue'); 
qbr.locked(true); 

Таким образом, в статическом случае предпочитают использовать АОТ запросы, а затем изменить запрос во время выполнения, если это необходимо. С другой стороны, если ваша таблица известна только во время выполнения, вы не можете использовать запросы AOT, а также выбрать X ++, и вам нужно будет создать свой запрос во время выполнения. Хорошим примером этого является браузер таблицы.

Что осталось для X ++?

  • Простой выбор с небольшими предложениями и с простым или отсутствующим объединением.
  • Случаи, когда вы не можете использовать запросы (пока), delete_from, update_recordset и insert_recordset Приходит на ум.
  • Иногда может быть более важным избегать внешних зависимостей (например, запросов AOT).
  • Удобство чтения X ++-запросов лучше, чем построение запросов.
+1

Отличный ответ. Когда вы говорите, что выбор X ++ переводится на вызовы конструкции Query, откуда вы это знаете? –

+2

Посмотрев на CIL, сгенерированный XML. На самом деле это не вызовы, а конкретные op-коды. Пример «Метод BankCheckLayout.find» (строка 15): <Найти offset = '187' dataset = '9' /> <Где смещение = '193' /> ... –

+1

Запросы также должны использоваться, когда вам нужны [выражения в диапазонах запросов] (https://msdn.microsoft.com/nl-be/library/aa893981.aspx) –

Смежные вопросы