Miklix

Использование запроса в классе контракта данных 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;
}

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

public Query getQuery()
{
    ;

    return new Query(SysOperationHelper::base64Decode(packedQuery));
}

public void setQuery(Query _query)
{
    ;

    packedQuery = SysOperationHelper::base64Encode(_query.pack());
}

Если вам необходимо инициализировать запрос (например, добавить диапазоны), вам следует реализовать метод initQuery:

public void initQuery()
{
    Query queryLocal = this.getQuery();
    ;

    // add ranges, etc...

    this.setQuery(queryLocal);
}

Вам необходимо обязательно вызвать этот метод из класса контроллера.

Поделиться на BlueskyПоделиться на FacebookПоделиться на LinkedInПоделиться на TumblrПоделиться на XПоделиться на LinkedInЗакрепить на Pinterest

Миккель Банг Кристенсен

Об авторе

Миккель Банг Кристенсен
Миккель - создатель и владелец сайта miklix.com. Он имеет более чем 20-летний опыт работы в качестве профессионального программиста/разработчика программного обеспечения и в настоящее время работает на полную ставку в крупной европейской IT-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.