如何获取 AOT 对象(例如表)属于 ax7 中的模型?
How to get AOT objects (tables for example) belongs to a model in ax7?
假设我需要得到 AOT objects
属于 model
- 例如table个对象
- 我需要
Tables
和 Table Extensions
- 结果对象可以是
treeNode
或DictTable
问题:如何从模型中获取 AOT 对象...
- X++?
- T-SQL?
- C# 代码?
谢谢。
例如:有一个模型名称Fleet Management Extension
。我可以使用 Visual Studio 获取对象。如何从 x++、t-sql、c#? 获取此对象
我当前的 x++ 代码。太可怕了。
protected set getTableNamesFromModels()
{
boolean inModel(str modelDisplayName, str objname, System.Type type)
{
var models = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetModelsOfMetadataArtifact(objName, type);
var modelsEnumerator = models.getEnumerator();
while (modelsEnumerator.moveNext())
{
Microsoft.Dynamics.AX.Metadata.MetaModel.ModelInfo modelInfo = modelsEnumerator.Current;
if( ModelDisplayName == modelInfo.DisplayName )
{
return true;
}
}
return false;
}
set result = new set(Types::String);
var modelName = 'Fleet Management Extension';
var axTableType = new Microsoft.Dynamics.AX.Metadata.MetaModel.AxTable();
var axTableExtType = new Microsoft.Dynamics.AX.Metadata.MetaModel.AxTableExtension();
var t = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::TableNames(); // Why Enumerator?
while ( t.moveNext() )
{
var tname = t.get_current();
if ( inModel(ModelName, tname, axTableType.GetType()) )
{
result.add(tname);
continue;
}
var tExt = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetTableExtensionNames(tname); // Why collection?
var tExtEnum = tExt.GetEnumerator();
while( tExtEnum.moveNext() )
{
var tExtName = tExtEnum.Get_Current();
if ( inModel(ModelName, tExtName, axTableExtType.GetType()) )
{
result.add(tExtName);
continue;
}
}
}
return result;
}
X++: https://gist.github.com/mazzy-ax/4d4d06ec2fddd885b67527623467aee8
class Tables
{
public static void Main(Args _args)
{
str aosServiceBin = 'C:\AOSService\webroot\bin';
str packageDir = 'C:\AOSService\PackagesLocalDirectory';
//or
var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment();
packageDir = environment.get_Aos().get_PackageDirectory();
// it's kind of magic
var runtimeProviderConfiguration = New Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration(packageDir);
var metadataProviderFactory = New Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory();
var provider = metadataProviderFactory.CreateRuntimeProvider(runtimeProviderConfiguration);
// object names
print provider.Tables.ListObjectsForModel('FleetManagement');
print provider.Tables.ListObjectsForModel('FleetManagementExtension');
print provider.TableExtensions.ListObjectsForModel('FleetManagement');
print provider.TableExtensions.ListObjectsForModel('FleetManagementExtension');
// single object by name
var custTransMetaData = provider.Tables.Read('CustTrans');
}
}
Powershell 脚本:https://gist.github.com/mazzy-ax/292f2ce1a8e79c39d1fc753bfca9c529
$aosServiceBin = 'C:\AOSService\webroot\bin'
$packageDir = 'C:\AOSService\PackagesLocalDirectory'
# or
add-type -path (Join-Path $aosServiceBin 'Microsoft.Dynamics.ApplicationPlatform.Environment.dll')
$environment = [Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory]::GetApplicationEnvironment()
$packageDir = $environment.get_Aos().get_PackageDirectory()
# it's kind of magic
add-type -path (Join-Path $aosServiceBin 'Microsoft.Dynamics.Ax.Metadata.Storage.dll')
$runtimeProviderConfiguration = New-Object Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration $packageDir
$metadataProviderFactory = New-Object Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory
$provider = $metadataProviderFactory.CreateRuntimeProvider($runtimeProviderConfiguration)
# object names
$provider.Tables.ListObjectsForModel('FleetManagement').count
$provider.Tables.ListObjectsForModel('FleetManagementExtension').count
$provider.TableExtensions.ListObjectsForModel('FleetManagement').count
$provider.TableExtensions.ListObjectsForModel('FleetManagementExtension').count
# single object by name
$provider.Tables.Read('CustTrans')
C#,T-SQL可以自己镜像创建
假设我需要得到 AOT objects
属于 model
- 例如table个对象
- 我需要
Tables
和Table Extensions
- 结果对象可以是
treeNode
或DictTable
问题:如何从模型中获取 AOT 对象...
- X++?
- T-SQL?
- C# 代码?
谢谢。
例如:有一个模型名称
Fleet Management Extension
。我可以使用 Visual Studio 获取对象。如何从 x++、t-sql、c#? 获取此对象
我当前的 x++ 代码。太可怕了。
protected set getTableNamesFromModels()
{
boolean inModel(str modelDisplayName, str objname, System.Type type)
{
var models = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetModelsOfMetadataArtifact(objName, type);
var modelsEnumerator = models.getEnumerator();
while (modelsEnumerator.moveNext())
{
Microsoft.Dynamics.AX.Metadata.MetaModel.ModelInfo modelInfo = modelsEnumerator.Current;
if( ModelDisplayName == modelInfo.DisplayName )
{
return true;
}
}
return false;
}
set result = new set(Types::String);
var modelName = 'Fleet Management Extension';
var axTableType = new Microsoft.Dynamics.AX.Metadata.MetaModel.AxTable();
var axTableExtType = new Microsoft.Dynamics.AX.Metadata.MetaModel.AxTableExtension();
var t = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::TableNames(); // Why Enumerator?
while ( t.moveNext() )
{
var tname = t.get_current();
if ( inModel(ModelName, tname, axTableType.GetType()) )
{
result.add(tname);
continue;
}
var tExt = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetTableExtensionNames(tname); // Why collection?
var tExtEnum = tExt.GetEnumerator();
while( tExtEnum.moveNext() )
{
var tExtName = tExtEnum.Get_Current();
if ( inModel(ModelName, tExtName, axTableExtType.GetType()) )
{
result.add(tExtName);
continue;
}
}
}
return result;
}
X++: https://gist.github.com/mazzy-ax/4d4d06ec2fddd885b67527623467aee8
class Tables
{
public static void Main(Args _args)
{
str aosServiceBin = 'C:\AOSService\webroot\bin';
str packageDir = 'C:\AOSService\PackagesLocalDirectory';
//or
var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment();
packageDir = environment.get_Aos().get_PackageDirectory();
// it's kind of magic
var runtimeProviderConfiguration = New Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration(packageDir);
var metadataProviderFactory = New Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory();
var provider = metadataProviderFactory.CreateRuntimeProvider(runtimeProviderConfiguration);
// object names
print provider.Tables.ListObjectsForModel('FleetManagement');
print provider.Tables.ListObjectsForModel('FleetManagementExtension');
print provider.TableExtensions.ListObjectsForModel('FleetManagement');
print provider.TableExtensions.ListObjectsForModel('FleetManagementExtension');
// single object by name
var custTransMetaData = provider.Tables.Read('CustTrans');
}
}
Powershell 脚本:https://gist.github.com/mazzy-ax/292f2ce1a8e79c39d1fc753bfca9c529
$aosServiceBin = 'C:\AOSService\webroot\bin'
$packageDir = 'C:\AOSService\PackagesLocalDirectory'
# or
add-type -path (Join-Path $aosServiceBin 'Microsoft.Dynamics.ApplicationPlatform.Environment.dll')
$environment = [Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory]::GetApplicationEnvironment()
$packageDir = $environment.get_Aos().get_PackageDirectory()
# it's kind of magic
add-type -path (Join-Path $aosServiceBin 'Microsoft.Dynamics.Ax.Metadata.Storage.dll')
$runtimeProviderConfiguration = New-Object Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration $packageDir
$metadataProviderFactory = New-Object Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory
$provider = $metadataProviderFactory.CreateRuntimeProvider($runtimeProviderConfiguration)
# object names
$provider.Tables.ListObjectsForModel('FleetManagement').count
$provider.Tables.ListObjectsForModel('FleetManagementExtension').count
$provider.TableExtensions.ListObjectsForModel('FleetManagement').count
$provider.TableExtensions.ListObjectsForModel('FleetManagementExtension').count
# single object by name
$provider.Tables.Read('CustTrans')
C#,T-SQL可以自己镜像创建