Miklix

Dynamics AX 2012 の X++ から AIF ドキュメント サービスを直接呼び出す

出版された: 2025年2月16日 11:23:02 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 スキーマは非常に複雑であり、また、Dynamics AX には、他のツールではスキーマが有効である XML を拒否するバグがいくつかあるようです。つまり、全体として、思ったほど単純ではないことが判明しました。

この作業中、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企業に常勤している。ブログを書いていないときは、さまざまな興味、趣味、活動に余暇を費やしている。