在 Dynamics AX 2012 中的 SysOperation 数据契约类中使用查询
已出版: 2025年2月16日 UTC 01:23:11
最后更新 2026年1月12日 UTC 08:47:23
本文详细介绍了如何在 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);
}
你需要确保从控制器类中调用此方法。
进一步阅读
如果您喜欢这篇文章,您可能还会喜欢这些建议:
- 在 Dynamics AX 2012 中删除法人实体(公司帐户)
- Dynamics AX 2012 中 data() 和 buf2Buf() 之间的区别
- 在 Dynamics AX 2012 中直接从 X++ 调用 AIF 文档服务
