0

Assume I need to get AOT objects belongs to a model

  • For example table objects
  • I need Tables and Table Extensions
  • Result objects can be treeNode or DictTable

Question: How to get AOT objects from model in...

  1. X++?
  2. T-SQL?
  3. C# code?

Thanks.


For example: There is a model name Fleet Management Extension. I can to get objects with Visual Studio. How to get this objects from x++, t-sql, c#?

enter image description here


My current x++ code. It's awful.
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;
}
mazzy
  • 1,025
  • 1
  • 13
  • 26

1 Answers1

1

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 script: 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 can be created in his own image.

mazzy
  • 1,025
  • 1
  • 13
  • 26