Во-первых, 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 ++-запросов лучше, чем построение запросов.
Отличный ответ. Когда вы говорите, что выбор X ++ переводится на вызовы конструкции Query, откуда вы это знаете? –
Посмотрев на CIL, сгенерированный XML. На самом деле это не вызовы, а конкретные op-коды. Пример «Метод BankCheckLayout.find» (строка 15): <Найти offset = '187' dataset = '9' /> <Где смещение = '193' /> ... –
Запросы также должны использоваться, когда вам нужны [выражения в диапазонах запросов] (https://msdn.microsoft.com/nl-be/library/aa893981.aspx) –