在 Dynamics AX 2012 中的 SysOperation 数据契约类中使用查询
已出版: 2025年2月16日 UTC 01:23:11
本文详细介绍了如何在 Dynamics AX 2012(和 Dynamics 365 for Operations)中向 SysOperation 数据契约类添加用户可配置和可过滤的查询
为了使尽可能多的人能够访问本页面,本页面由英文机译而成。遗憾的是,机器翻译技术尚不完善,因此可能会出现错误。如果您愿意,可以在此处查看原始英文版本:
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
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;
}
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());
}
{
;
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);
}
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
您需要确保从控制器类调用此方法。