0

AX 2009 で、特定のドキュメントが投稿されたときに顧客に自動的に送信される電子メール テンプレートの設定に取り組んでいます。投稿された特定のドキュメントを特定の電子メール テンプレートに関連付けることができるフレームワークを用意しています。

現在、電子メールの情報を動的に入力するために、キーと値のペアを保持するマッピング オブジェクトを使用しています。このキーは、テンプレート自体の特定の変数に関連付けられています ( Dynamics Ax 2009の質問のサンプルを参照してください。メール テンプレート)。ただし、利用可能にする必要がある情報が大幅に変更されていることを非常に簡単に確認できるため、クラス内の実際のコードを変更することなく、このマッピングを変更できるようにしたいと考えています。

私の考えは、2 つの文字列フィールドを含む単純なテーブルを持つことです。1 つはマッピングのキーで、もう 1 つは情報が見つかった場所の文字列表現です"salesTable.SalesId"

値の文字列式を評価して、自動的に「SO-XXXXXXXX」を取得することはできますか? この場合、評価の時点で salesTable バッファーが既に存在すると想定できます。eval()これは Javascriptコマンドに似ています。また、(理想的には) などのより複雑な式も評価する必要"CustTable::find(salesTable.InvoiceAccount).CustGroup"がありますが、現時点では、それを求めるには多すぎる可能性があります。

私が見ることができる他の唯一の代替手段は、可能なすべてのマッピングを含み、フレームワーク全体でそれを使用する巨大なマッピングオブジェクトを作成することですが、それでもテンプレートに必要なすべての情報が含まれていないというリスクがあるため、不足している情報を取得するための追加のコード変更。

4

1 に答える 1

3

値の文字列式を評価して、自動的に「SO-XXXXXXXX」を取得することはできますか?

カスタムコードなしではありません。基本フレームワーク\Data Dictionary\Tables\SysEmailTable\Methods\sendMailは、キーと値のマッピングと XML データを処理します。

また、これらの式を評価すると AX のセキュリティが回避される可能性があり、ユーザーが本来は表示できないデータを表示したり、カスタム コードを実行したりできるようになる可能性があるため、注意が必要です。

あなたが考えているよりも少ないシナリオを計画していますが、本当に解決策が必要な場合は、いくつかのアイデアがあります.

  1. SysDictTable/SysDictField オブジェクトを使用して、必要ないくつかのテーブル (SalesTable、CustTable) をクロールすることで、大規模なマッピングを体系的に構築できます。これにより、非常に簡単なソリューションが得られます。「_common」パラメーターを受け入れてマップを作成する概念実証ジョブのサンプルを次に示します。この同様のスタイルが使用されている別の場所を次に示します: ( \Classes\BIGenerator\record2DataSetXml)

    static void Job33(Args _args) {

    SysDictTable    sysDictTable;
    SysDictField    sysDictField;
    SalesTable      salesTable;
    Common          _common;
    int             i;
    Map             map = new Map(Types::String, Types::String);
    str             value;
    FieldId         fieldId;
    
    MapEnumerator   me;
    ;
    
    select firstonly salesTable;
    _common = salesTable;
    
    sysDictTable = new SysDictTable(_common.TableId);
    
    if (sysDictTable)
    {
        for(i=1; i<=sysDictTable.fieldCnt(); i++)
        {
            fieldId = sysDictTable.fieldCnt2Id(i);
    
            sysDictField = sysDictTable.fieldObject(fieldId);
    
            if (sysDictField.isSystem())
                continue;
    
            value = '';
    
            if (sysDictField.baseType() == Types::Container)
            {
                value = enum2str(sysDictField.baseType());
            }
            else if (sysDictField.arraySize() == 1)
            {
                value = _common.(fieldId);
            }
    
            map.insert(sysDictTable.name()+'.'+sysDictField.name(), value);
        }
    }
    
    me = map.getEnumerator();
    
    while (me.moveNext())
    {
        info(strfmt("%1 = %2", me.currentKey(), me.currentValue()));
    }
    

    }

  2. XML と XSLT の組み合わせを作成すると、生成された単純な XML ファイルをテンプレートに渡すことができ、XSLT を変更してアップロードするだけで済みます。これを行う方法は、次の私のブログ投稿から確認できます。

http://alexondax.blogspot.com/2013/12/how-to-create-xslt-to-transform-ax-xml.html

于 2014-05-13T16:10:05.553 に答える