Miklix

Utilisation d'une requête dans une classe de contrat de données SysOperation dans Dynamics AX 2012

Publié : 16 février 2025 à 01:22:22 UTC

Cet article décrit en détail comment ajouter une requête configurable et filtrable par l'utilisateur à une classe de contrat de données SysOperation dans Dynamics AX 2012 (et Dynamics 365 for Operations)


Cette page a été traduite de l'anglais afin de la rendre accessible au plus grand nombre. Malheureusement, la traduction automatique n'est pas encore une technologie parfaite, et des erreurs peuvent donc se produire. Si vous préférez, vous pouvez consulter la version originale en anglais ici :

Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012

Les informations contenues dans cet article sont basées sur Dynamics AX 2012 R3. Elles peuvent ou non être valables pour d'autres versions. (Mise à jour : je peux confirmer que cela fonctionne également sur Dynamics 365 for Operations)

J'ai tendance à oublier les détails sur la façon de spécifier et d'initialiser une requête dans le framework SysOperation. Je suppose que la plupart des tâches par lots que j'ai effectuées ne sont pas basées sur des requêtes configurables par l'utilisateur, mais de temps en temps, j'ai besoin de créer une telle tâche par lots, donc cet article est également pour ma propre référence.

Tout d'abord, dans la classe de contrat de données, la requête sera stockée sous forme de chaîne. Sa méthode parm doit être décorée avec l'attribut AifQueryTypeAttribute, comme suit (dans cet exemple, j'ai utilisé la requête SalesUpdate, mais vous pouvez la remplacer par n'importe quelle requête AOT) :

[
    DataMemberAttribute,
    AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
    ;

    packedQuery = _packedQuery;
    return packedQuery;
}

Si vous souhaitez que la requête soit décidée par la classe du contrôleur, vous pouvez également utiliser une chaîne vide. Dans ce cas, vous devez également implémenter quelques méthodes d'assistance (que vous devriez probablement implémenter de toute façon pour votre propre commodité lorsque vous devez accéder à la requête) :

public Query getQuery()
{
    ;

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

public void setQuery(Query _query)
{
    ;

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

Si vous devez initialiser la requête (par exemple, ajouter des plages), vous devez implémenter une méthode initQuery :

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

    // add ranges, etc...

    this.setQuery(queryLocal);
}

Vous devez vous assurer d'appeler cette méthode à partir de la classe du contrôleur.

Partager sur BlueskyPartager sur FacebookPartager sur LinkedInPartager sur TumblrPartager sur XPartager sur LinkedInÉpingler sur Pinterest

Mikkel Bang Christensen

A propos de l'auteur

Mikkel Bang Christensen
Mikkel est le créateur et le propriétaire de miklix.com. Il a plus de 20 ans d'expérience en tant que programmeur informatique professionnel/développeur de logiciels et travaille actuellement à plein temps pour une grande entreprise européenne de TI. Lorsqu'il ne blogue pas, il consacre son temps libre à un large éventail d'intérêts, de passe-temps et d'activités, ce qui peut se refléter dans une certaine mesure dans la variété des sujets abordés sur ce site web.