Dynamics AX 2012 の X++ コードから列挙型の要素を反復処理する方法
出版された: 2025年2月15日 23:10:40 UTC
この記事では、X++ コード例を含め、Dynamics AX 2012 で基本列挙の要素を列挙してループする方法について説明します。
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
この投稿の情報は Dynamics AX 2012 R3 に基づいています。他のバージョンでは有効ではない可能性があります。
最近、列挙型内の各要素の値を表示するフォームを作成していました。フィールドを手動で作成する (そして列挙型が変更された場合にフォームを保守する必要がある) のではなく、実行時にフィールドがデザインに自動的に追加されるように動的に実装することにしました。
しかし、実際に列挙型の値を反復処理するのは、やり方がわかってしまえば簡単ですが、少しわかりにくいことがすぐにわかりました。
当然、DictEnum クラスから始める必要があります。ご覧のとおり、このクラスには、インデックスと値の両方から名前やラベルなどの情報を取得するためのメソッドがいくつかあります。
インデックスと値の違いは、列挙型の要素が 0 から順番に番号付けされている場合、インデックスは列挙型内の要素の番号であるのに対し、値は要素の実際の「値」プロパティであることです。ほとんどの列挙型の値は 0 から順番に番号付けされているため、要素のインデックスと値は同じになることがよくありますが、必ずしも常に同じであるとは限りません。
しかし、列挙型にどの値が含まれているかはどうやってわかるのでしょうか。ここが混乱の元です。DictEnum クラスには values() というメソッドがあります。このメソッドは列挙型の値のリストを返すと思われるかもしれませんが、それは明らかに簡単すぎるので、代わりに列挙型に含まれる値の数を返します。ただし、値の数は実際の値とは何の関係もありません。そのため、この数値を、値ベースのメソッドではなく、インデックスベースのメソッドを呼び出すための基準として使用する必要があります。
このメソッドの名前を indexes() にしていれば、混乱は少なかったでしょう ;-)
また、列挙値 (および明らかにこれらの「インデックス」) は、1 から始まる X++ の配列およびコンテナー インデックスとは異なり、0 から始まることに注意してください。そのため、列挙内の要素をループするには、次のようにします。
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
これにより、列挙型内の各要素のシンボルとラベルが情報ログに出力されます。