Miklix

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ể.


Trang này được dịch máy từ tiếng Anh để có thể tiếp cận được với nhiều người nhất có thể. Thật không may, dịch máy vẫn chưa phải là công nghệ hoàn thiện, do đó có thể xảy ra lỗi. Nếu bạn thích, bạn có thể xem phiên bản tiếng Anh gốc tại đây:

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.

static void CustomerCreate(Args _args)
{
    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:

static void CustomerRead(Args _args)
{
    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.

Chia sẻ trên BlueskyChia sẻ trên FacebookChia sẻ trên LinkedInChia sẻ trên TumblrChia sẻ trên XChia sẻ trên LinkedInGhim trên Pinterest

Mikkel Bang Christensen

Về tác giả

Mikkel Bang Christensen
Mikkel là người sáng lập và chủ sở hữu của miklix.com. Ông có hơn 20 năm kinh nghiệm làm lập trình viên máy tính/nhà phát triển phần mềm chuyên nghiệp và hiện đang làm việc toàn thời gian cho một tập đoàn CNTT lớn của Châu Âu. Khi không viết blog, ông dành thời gian rảnh rỗi cho nhiều sở thích, thú vui và hoạt động, có thể được phản ánh ở một mức độ nào đó trong nhiều chủ đề được đề cập trên trang web này.