Miklix

在 Dynamics AX 2012 中直接從 X++ 呼叫 AIF 文件服務

已發佈: 2025年2月16日 上午11:23:25 [UTC]
最後更新: 2026年1月12日 上午8:55:26 [UTC]

在本文中,我將解釋如何直接從 X++ 程式碼調用 Dynamics AX 2012 中的應用程式整合框架文件服務,模擬入站和出站調用,這可以大大簡化查找和調試 AIF 程式碼中的錯誤。


該頁面是由英語機器翻譯而來的,以便盡可能多的人可以訪問。不幸的是,機器翻譯還不是一項完善的技術,因此可能會出現錯誤。如果您願意,可以在這裡查看原始英文版本:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

本文中的資訊是基於 Dynamics AX 2012 R3 版本,可能不適用於其他版本。

我最近在幫助一位客戶實施一個應用程式整合框架 (AIF) 入站端口,用於根據從另一個系統接收的資料建立客戶。由於 Dynamics AX 已經提供了 CustCustomer 文件服務來實現這一邏輯,我們決定簡化流程,使用標準解決方案。

然而,很快我就發現,要讓外部系統產生Dynamics AX能夠接受的XML文件,有許多問題。 Dynamics AX產生的XML架構相當複雜,而且Dynamics AX本身似乎也存在一些bug,有時會導致它拒絕其他工具識別為架構有效的XML檔案。總而言之,這比我想像的要複雜得多。

在這個過程中,我經常難以確定某些 XML 檔案究竟出了什麼問題,因為 AIF 提供的錯誤資訊不夠詳細。而且,這也很繁瑣,因為我必須先等待外部系統透過 MSMQ 發送新訊息,然後再等待 AIF 接收並處理該訊息,之後才能看到錯誤訊息。

因此,我調查了是否可以使用本機 XML 檔案直接呼叫服務程式碼以加快測試速度,結果發現是可以的——不僅如此,這樣做還非常簡單,並且實際上提供了更有意義的錯誤訊息。

以下範例作業讀取本機 XML 文件,並嘗試將其與 AxdCustomer 類別(CustCustomer 服務使用的文件類別)一起使用以建立客戶。如有需要,您可以為所有其他文件類別(例如 AxdSalesOrder)建立類似的作業。

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');
}

customer.create() 方法(對應於 AIF 中的「建立」服務作業)傳回的 AifEntityKey 物件包含有關建立哪個客戶的信息,其中包括建立的 CustTable 記錄的 RecId。

如果您要測試的是出站端口,或者您只是需要一個入站端口 XML 的範例,您也可以使用文檔類,透過呼叫 read() 方法(對應於「讀取」服務操作)將客戶匯出到文件,如下所示:

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');
}

當然,您應該將“123456”替換為您要查看的客戶帳號。

進一步閱讀

如果您喜歡這篇文章,您可能也會喜歡這些建議:


分享至 Bluesky在 Facebook 分享在 LinkedIn 分享在 Tumblr 上分享分享至 X在 LinkedIn 分享固定在 Pinterest 上

Mikkel Christensen

關於作者

Mikkel Christensen
麥可 是 miklix.com 的創建者和所有者。他有超過 20 年的專業電腦程式設計師/軟體開發人員經驗,目前全職受僱於一家歐洲大型 IT 公司。不寫部落格時,他會將業餘時間花在各種各樣的興趣、愛好和活動上,這在一定程度上反映在本網站所涵蓋的主題的多樣性上。