Korzystanie z zapytania w klasie kontraktu danych SysOperation w systemie Dynamics AX 2012
Opublikowano: 16 lutego 2025 01:23:01 UTC
W tym artykule omówiono szczegółowo sposób dodawania konfigurowalnego przez użytkownika i filtrowalnego zapytania do klasy kontraktu danych SysOperation w systemie Dynamics AX 2012 (i Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
Informacje w tym poście są oparte na Dynamics AX 2012 R3. Mogą być lub nie być ważne dla innych wersji. (Aktualizacja: Mogę potwierdzić, że to działa również w Dynamics 365 for Operations)
Zawsze zapominam szczegółów dotyczących określania i inicjowania zapytania w ramach SysOperation. Podejrzewam, że większość zadań wsadowych, które tworzę, nie opiera się na konfigurowalnych przez użytkownika zapytaniach, ale od czasu do czasu muszę wykonać takie zadanie wsadowe, więc ten post jest również dla mojego własnego odniesienia.
Najpierw w klasie kontraktu danych zapytanie zostanie zapisane spakowane w ciągu. Jego metoda parm musi być ozdobiona atrybutem AifQueryTypeAttribute, tak jak tutaj (w tym przykładzie użyłem zapytania SalesUpdate, ale możesz je zastąpić dowolnym zapytaniem AOT):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Jeśli chcesz, aby zapytanie zostało określone przez klasę kontrolera, możesz również użyć pustego ciągu. W takim przypadku musisz również zaimplementować kilka metod pomocniczych (które prawdopodobnie powinieneś zaimplementować w każdym razie dla własnej wygody, gdy będziesz potrzebować dostępu do zapytania):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Jeśli zachodzi potrzeba zainicjowania zapytania (na przykład dodania zakresów), należy zaimplementować metodę initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Należy pamiętać o wywołaniu tej metody z klasy kontrolera.