Search code examples
axaptax++dynamics-ax7

How to get AOT objects (tables for example) belongs to a model in ax7?


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;
}

Solution

  • 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.