Miklix

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など、他のすべてのドキュメントクラスに対して同様のジョブを作成できます。

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 の "create" サービス操作に対応) によって返される 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企業に常勤している。ブログを書いていないときは、さまざまな興味、趣味、活動に余暇を費やしている。