martedì 23 dicembre 2025

D365FFO - Stampare le informazioni sugli indici delle tabelle

Con questo job è possibile recuperare le informazioni sugli indici e sulla tabelle a cui appartengono.

Questo link è stato molto utile:

https://gist.github.com/mazzy-ax/4d4d06ec2fddd885b67527623467aee8


 internal final class LIL_getIndexInfo  
 {  
   public static void main(Args _args)  
   {  
     str60          moduleName, tableName;  
     CLRObject        moduleModels, sanModels, tables;  
     CLRObject        modelEnumerator, sanEnumerator, tablesEnumerator;  
     str60          moduleVersion;  
     DictTable        dictTable;  
     DictIndex        dictIndex;      
     int           i;  
     FieldId         fieldId;  
     TableId         tableId;  
     DictField        dictField;  
     boolean         isUnique;  
   
     Microsoft.Dynamics.AX.Metadata.MetaModel.ModelInfo modelInfo;  
   
     // Recupera i moduli installati  
     moduleModels  = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetInstalledModuleNames();  
     modelEnumerator = moduleModels.GetEnumerator();  
   
     // Recupera la directory dei package  
     str packageDir;  
     var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment();  
     packageDir   = environment.get_Aos().get_PackageDirectory();  
   
     // Configurazione provider metadati  
     var runtimeProviderConfiguration = new Microsoft.Dynamics.AX.Metadata.Storage.Runtime.RuntimeProviderConfiguration(packageDir);  
     var metadataProviderFactory   = new Microsoft.Dynamics.AX.Metadata.Storage.MetadataProviderFactory();  
     Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider provider = metadataProviderFactory.CreateRuntimeProvider(runtimeProviderConfiguration);  
   
     // Loop sui package  
     while (modelEnumerator.moveNext())  
     {  
       moduleName  = modelEnumerator.get_Current();  
       sanModels  = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetModelsInModuleSortedByDisplayName(moduleName);  
       sanEnumerator = sanModels.GetEnumerator();  
         
       // Loop sui modelli nel package  
       while (sanEnumerator.MoveNext())  
       {  
         modelInfo = sanEnumerator.get_Current();  
   
         tables      = provider.Tables.ListObjectsForModel(modelInfo.Name);  
         tablesEnumerator = tables.GetEnumerator();  
   
         // Loop sulle tabelle del modello  
         while (tablesEnumerator.moveNext())  
         {  
           tableName = tablesEnumerator.get_Current();  
   
           if (tableName)  
           {  
             tableId  = tableName2Id(tableName);  
             dictTable = new DictTable(tableId);  
   
             if (dictTable)  
             {  
               // Loop sugli indici della tabella  
               for (i = 1; i <= dictTable.indexCnt(); i++)  
               {  
                 dictIndex = new DictIndex(dictTable.id(), dictTable.indexCnt2Id(i));  
                 isUnique = !dictIndex.allowDuplicates();  
   
                 // Stampa informazioni  
                 info(strFmt(  
                   "Table = %1 | Indice: %2 | Model = %3 | Package = %4 | Modules = %5 | Unique: %6",  
                   tableName,  
                   dictIndex.name(),  
                   modelInfo.Name,  
                   moduleName,  
                   dictTable.modules(),  
                   isUnique ? "Yes" : "No"  
                 ));  
               }  
             }  
           }  
         }  
       }  
     }  
   }