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-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.