Sử dụng truy vấn trong lớp hợp đồng dữ liệu SysOperation trong Dynamics AX 2012
Đã xuất bản: lúc 01:24:35 UTC 16 tháng 2, 2025
Bài viết này sẽ trình bày chi tiết về cách thêm truy vấn có thể định cấu hình và lọc được của người dùng vào lớp hợp đồng dữ liệu SysOperation trong Dynamics AX 2012 (và Dynamics 365 for Operations)
Using a Query in a SysOperation Data Contract Class in Dynamics AX 2012
Thông tin trong bài đăng này dựa trên Dynamics AX 2012 R3. Nó có thể hoặc không thể hợp lệ với các phiên bản khác. (Cập nhật: Tôi có thể xác nhận rằng điều này cũng hoạt động trên Dynamics 365 for Operations)
Tôi dường như luôn quên mất chi tiết về cách chỉ định và khởi tạo truy vấn trong khuôn khổ SysOperation. Tôi đoán rằng hầu hết các tác vụ hàng loạt mà tôi đã thực hiện không dựa trên các truy vấn có thể cấu hình của người dùng, nhưng thỉnh thoảng tôi cần thực hiện một tác vụ hàng loạt như vậy, vì vậy bài đăng này cũng để tôi tham khảo.
Đầu tiên, trong lớp hợp đồng dữ liệu, truy vấn sẽ được lưu trữ đóng gói trong một chuỗi. Phương thức parm của nó phải được trang trí bằng thuộc tính AifQueryTypeAttribute, như thế này (trong ví dụ này, tôi đã sử dụng truy vấn SalesUpdate, nhưng bạn có thể thay thế bằng bất kỳ truy vấn AOT nào):
DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', queryStr(SalesUpdate))
]
public str parmPackedQuery(str _packedQuery = packedQuery)
{
;
packedQuery = _packedQuery;
return packedQuery;
}
Nếu bạn muốn truy vấn được quyết định bởi lớp điều khiển thay vào đó, bạn cũng có thể sử dụng một chuỗi rỗng. Trong trường hợp đó, bạn cũng cần triển khai một vài phương thức trợ giúp (mà bạn có lẽ nên triển khai dù sao vì sự tiện lợi của riêng bạn khi bạn cần truy cập truy vấn):
{
;
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
public void setQuery(Query _query)
{
;
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
Nếu bạn cần khởi tạo truy vấn (ví dụ: thêm phạm vi), bạn nên triển khai phương thức initQuery:
{
Query queryLocal = this.getQuery();
;
// add ranges, etc...
this.setQuery(queryLocal);
}
Bạn cần đảm bảo gọi phương thức này từ lớp bộ điều khiển.