在 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)執行類似的工作。
{
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() 方法(對應於“讀取”服務操作),如下所示:
{
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”替換為您想要讀取的客戶的帳號。