Miklix

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

已發佈: 2025年2月16日 上午11:23:25 [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 中似乎存在一些錯誤,有時會導致它拒絕根據其他工具模式有效的 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 上

米克爾·邦·克里斯滕森

關於作者

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