在 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)建立類似的作業。
{
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”替換為您要查看的客戶帳號。
進一步閱讀
如果您喜歡這篇文章,您可能也會喜歡這些建議:
- 在 Dynamics AX 2012 中刪除法人實體(公司帳戶)
- 在 Dynamics AX 2012 中的 SysOperation 資料契約類別中使用查詢
- 在 Dynamics AX 2012 中使用巨集和 strFmt 進行字串格式化
