Dynamics AX 2012 の X++ から AIF ドキュメント サービスを直接呼び出す
出版された: 2025年2月16日 11:23:02 UTC
最終更新日 2026年1月12日 8:55:16 UTC
この記事では、Dynamics AX 2012 のアプリケーション統合フレームワーク ドキュメント サービスを X++ コードから直接呼び出し、受信呼び出しと送信呼び出しの両方をエミュレートする方法について説明します。これにより、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スキーマは非常に複雑で、他のツールではスキーマとして妥当と判断されるXMLをDynamics AXが拒否してしまうバグもいくつかあるようです。つまり、全体として、思ったほど単純ではないことが判明したのです。
この作業中、AIF が提供するエラーメッセージは情報が不足していたため、特定の XML ファイルで何が問題なのかを正確に把握するのに苦労することがよくありました。また、外部システムが 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 の "create" サービス操作に対応) によって返される 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 SysOperation Framework の概要
- Dynamics AX 2012 の X++ コードから列挙型の要素を反復処理する方法
- SysExtension フレームワークを使用して Dynamics AX 2012 でインスタンス化するサブクラスを見つける
