Использование запроса в классе контракта данных SysOperation в Dynamics AX 2012
Опубликовано: 16 февраля 2025 г. в 01:23:05 UTC
Последнее обновление: 12 января 2026 г. в 08:47:19 UTC
В этой статье подробно описано, как добавить настраиваемый пользователем и фильтруемый запрос в класс контракта данных SysOperation в Dynamics AX 2012 (и Dynamics 365 for Operations).
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
Информация в этом сообщении основана на Dynamics AX 2012 R3. Она может быть или не быть применима к другим версиям. (Обновление: я могу подтвердить, что это также работает в Dynamics 365 for Operations)
Я постоянно забываю о деталях того, как задавать и инициализировать запрос в рамках SysOperation. Думаю, большинство пакетных заданий, которые я создаю, не основаны на запросах, настраиваемых пользователем, но время от времени мне всё же приходится создавать такие задания, поэтому этот пост также предназначен для моего собственного ознакомления.
Во-первых, в классе контракта данных запрос будет храниться в виде строки. Его метод parm должен быть помечен атрибутом AifQueryTypeAttribute, как показано ниже (в этом примере я использовал запрос SalesUpdate, но вы можете заменить его любым AOT-запросом):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Если вы хотите, чтобы запрос обрабатывался классом контроллера, вы также можете использовать пустую строку. В этом случае вам также потребуется реализовать пару вспомогательных методов (которые, вероятно, следует реализовать и так для вашего удобства при доступе к запросу):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Если вам необходимо инициализировать запрос (например, добавить диапазоны), следует реализовать метод initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Необходимо обязательно вызывать этот метод из класса контроллера.
Дополнительное чтение
Если вам понравился этот пост, вам также могут понравиться эти предложения:
- Ошибка «Не определен класс метаданных для объекта контракта данных» в Dynamics AX 2012
- Удаление юридического лица (счета компании) в Dynamics AX 2012
- Разница между data() и buf2Buf() в Dynamics AX 2012
