Использование запроса в классе контракта данных SysOperation в Dynamics AX 2012
Опубликовано: 16 февраля 2025 г. в 01:23:05 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);
}
Вам необходимо обязательно вызвать этот метод из класса контроллера.