Miklix

Використання запиту в класі контрактів даних SysOperation в Dynamics AX 2012

Опубліковано: 16 лютого 2025 р. о 01:23:10 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 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.