2

MS Dynamics AX 2012 プロジェクトがあり、.Net 相互運用機能を使用しています。static class呼び出された内に C# メソッドがありますDatabase

 public static List<String> GetAllDatabases(string dataSource)

このアセンブリを参照した後、X++ で実行できます。

ADOMD.ADOMD.Model.Database::GetAllDatabases();

しかし、返された文字列リストを読み取ることができません。次のようなものを使用したいと思います:

List databaNameCollection = new List( Types::String ); 
;

databaNameCollection =  ADOMD.ADOMD.Model.Database::GetAllDatabases();

しかし、それはエラーを引き起こします:

Error executing code:  (object) has no valid runable code in method 'GetSID'.

どうすればできますか?

-------編集済み------

この投稿を見つけました:

http://blogs.msdn.com/b/x/archive/2010/01/19/traversing-elements-in-an-ienumerable-from-x.aspx

しかし、それは 2010 年のことで、おそらく AX 2009 のために、次のように割り当てようとしました。

ClrObject enumerator; 
str theValue;
;

enumerator = ADOMD.ADOMD.Model.Database::GetAllDatabases();
while (enumerator.MoveNext()) 
    { 
        theValue = enumerator.get_Current(); 
        print theValue; 
    } 

GetallDatabases メソッドは別の .Net プロジェクトで動作しており、10 個のオブジェクトを返していますが、X++ コードでは何も返していません。

ありがとう

4

2 に答える 2

2

get_{x}X++およびの .NET 型に関する質問に答えるにはset_{x}:

.NET プロパティは、X++ でメソッドとして表示されます。たとえば、以下の C# の get & set プロパティ

string Name {get;set;}

X++ で次のように表示されます。

string get_Name();
void set_Name(str value);

基本的に、C# のプロパティは単なるシンタックス シュガーです。C# コンパイラは、get プロパティごとに get_{x} メソッドを作成し、set プロパティごとに set_{x} メソッドを作成します。

あなたの場合、NamecubeDef オブジェクトのプロパティにアクセスする場合は、X++ で次のように記述する必要があります。

info(cubeDef.get_Name());
于 2012-06-05T05:06:38.513 に答える
0

http://blogs.msdn.com/b/x/archive/2010/01/19/traversing-elements-in-an-ienumerable-from-x.aspxの例を使用して作成しました。

しかしenumerator.MoveNext()、X++ オブジェクトではないため、forループに変更すると、最終的なコードは次のようになります。

ClrObject enumerator;  
str theValue;
int i;
int length = 0; 
List databaNameCollection = new List( Types::String );
;  

try
  { 
    permission = new InteropPermission(InteropKind::CLRInterop);
    if (permission == null)
    {
            return;
    }
    permission.assert();
    enumerator = ADOMD.ADOMD.Model.Database::GetAllDatabases();
    length = enumerator.get_Count();

    for (i = 0; i < length; i++)
    {
        stringElement = enumerator.get_Item(i);
        databaNameCollection.addStart(stringElement);
    }
     CodeAccessPermission::revertAssert();
 }
 catch (Exception::CLRError)
 {
     CodeAccessPermission::revertAssert();
     info(CLRInterop::getLastException().ToString());
 }

しかし、いくつかの疑問が残っています:

1)databaNameCollection.addStart(enumerator.get_Item(i));直接割り当てることはできません。

2) 次のような複雑なオブジェクトの属性にアクセスできません。

cubeDef  = enumerator.get_Item(i);
info(cubeDef.Name);

cubeDefタイプは次のとおりMicrosoft.AnalysisServices.AdomdClient.CubeDefです。

3)これらのメソッドを説明するCLRObjectget_{propertyName}のドキュメントが見つかりません。元:get_Item

よろしくお願いします

于 2012-05-29T08:54:47.913 に答える