Gọi AIF Document Services trực tiếp từ X++ trong Dynamics AX 2012
Đã xuất bản: lúc 11:23:31 UTC 16 tháng 2, 2025
Trong bài viết này, tôi sẽ giải thích cách gọi các dịch vụ tài liệu Application Integration Framework trong Dynamics AX 2012 trực tiếp từ mã X++, mô phỏng cả các cuộc gọi đến và đi, giúp tìm và gỡ lỗi trong mã AIF dễ dàng hơn đáng kể.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Thông tin trong bài đăng này dựa trên Dynamics AX 2012 R3. Thông tin này có thể đúng hoặc không đúng với các phiên bản khác.
Gần đây tôi đã giúp một khách hàng triển khai cổng vào Application Integration Framework (AIF) để tạo khách hàng dựa trên dữ liệu họ nhận được từ một hệ thống khác. Vì Dynamics AX đã cung cấp dịch vụ tài liệu CustCustomer, triển khai logic cho việc này, chúng tôi quyết định giữ cho nó đơn giản và sử dụng giải pháp tiêu chuẩn.
Tuy nhiên, chẳng mấy chốc, người ta phát hiện ra rằng có rất nhiều vấn đề trong việc khiến hệ thống bên ngoài tạo ra XML mà Dynamics AX chấp nhận. Sơ đồ XML do Dynamics AX tạo ra khá phức tạp và có vẻ như có một số lỗi trong Dynamics AX đôi khi khiến nó từ chối XML hợp lệ với sơ đồ theo các công cụ khác, vì vậy, nhìn chung, nó không đơn giản như tôi nghĩ.
Trong quá trình thực hiện, tôi thường gặp khó khăn trong việc tìm ra chính xác vấn đề với một số tệp XML nhất định vì thông báo lỗi do AIF cung cấp không cung cấp nhiều thông tin. Cũng rất tẻ nhạt vì tôi phải đợi hệ thống bên ngoài gửi tin nhắn mới qua MSMQ rồi lại đợi AIF nhận tin nhắn và xử lý trước khi tôi có thể thấy lỗi.
Do đó, tôi đã tìm hiểu xem có thể gọi mã dịch vụ trực tiếp bằng tệp XML cục bộ để thử nghiệm nhanh hơn không và kết quả là có thể - không chỉ vậy, việc này thực sự rất dễ thực hiện và thực sự cung cấp nhiều thông báo lỗi có ý nghĩa hơn.
Công việc ví dụ bên dưới đọc một tệp XML cục bộ và cố gắng sử dụng nó với lớp AxdCustomer (là lớp tài liệu được dịch vụ CustCustomer sử dụng) để tạo một khách hàng. Bạn có thể tạo các công việc tương tự cho tất cả các lớp tài liệu khác, ví dụ như AxdSalesOrder, nếu bạn cần.
{
FileNameOpen fileName = @'C:\\TestCustomerCreate.xml';
AxdCustomer customer;
AifEntityKey key;
#File
;
new FileIoPermission(fileName, #IO_Read).assert();
customer = new AxdCustomer();
key = customer.create( XmlDocument::newFile(fileName).xml(),
new AifEndpointActionPolicyInfo(),
new AifConstraintList());
CodeAccessPermission::revertAssert();
info('Done');
}
Đối tượng AifEntityKey được trả về bởi phương thức customer.create() (tương ứng với hoạt động dịch vụ "create" trong AIF) chứa thông tin về khách hàng nào đã được tạo, trong số những thông tin khác có RecId của bản ghi CustTable đã tạo.
Nếu bạn đang cố gắng kiểm tra một cổng Outbound hoặc nếu bạn chỉ cần một ví dụ về cách XML trông như thế nào trên cổng Inbound, bạn cũng có thể sử dụng lớp tài liệu để xuất khách hàng vào một tệp bằng cách gọi phương thức read() (tương ứng với hoạt động dịch vụ "đọc") như sau:
{
FileNameSave fileName = @'C:\\TestCustomerRead.xml';
Map map = new Map( Types::Integer,
Types::Container);
AxdCustomer customer;
AifEntityKey key;
XMLDocument xmlDoc;
XML xml;
AifPropertyBag bag;
#File
;
map.insert(fieldNum(CustTable, AccountNum), ['123456']);
key = new AifEntityKey();
key.parmTableId(tableNum(CustTable));
key.parmKeyDataMap(map);
customer = new AxdCustomer();
xml = customer.read(key,
null,
new AifEndpointActionPolicyInfo(),
new AifConstraintList(),
bag);
new FileIoPermission(fileName, #IO_Write).assert();
xmlDoc = XmlDocument::newXml(xml);
xmlDoc.save(fileName);
CodeAccessPermission::revertAssert();
info('Done');
}
Tất nhiên bạn phải thay thế '123456' bằng số tài khoản của khách hàng mà bạn muốn đọc.