martedì 12 marzo 2024

AX 2012 - Job per scrivere i metodi di una classe in un unico file di testo

Questo semplice job che ho scritto può essere di aiuto quando si deve migrare il codice di una classe da ax 2012 a D365FFO. 

Come sappiamo in ax 2012 il sorgente di una classe viene mostrato "spezzettato" per singolo metodo cioè:



Mentre in D365 il sorgente è contenuto in un'unica schermata. Dobbiamo quindi aprire ciascun metodo ed incollarlo in Visual Studio.

Se la classe contiene molti metodi l'operazione può risultare pesante.

Il job prende come input il nome della classe e produce un unico file .txt con tutti i metodi, pronti per essere incollati in Visual studio:

 static void LIL_Ax2012To365ClassesSourceCode(Args _args)  
 {  
   SysDictClass      dictClass;  
   SysDictMethod      dictMethod;  
   int           i;  
   Source         Source;  
   TextIo         textIo;  
   Set           methodsSet;  
   SetEnumerator      methodsSetEnum;  
   str           filePath;  
   ClassId         classId;  
   str           addSpaceToNewLineRegex;  
   container        conFilter = ["TXT", "*.txt"];  
   #File  
   #xppTexts  
   
   classId = classNum(Tutorial_RunbaseBatch);  
   
   dictClass = new SysDictClass(classId);  
   
   for (i=1;i<=dictClass.objectMethodCnt();i++)  
   {  
     dictMethod = new SysDictMethod(UtilElementType::ClassInstanceMethod, dictClass.id(), dictClass.objectMethod(i));  
   
     if(dictMethod.name() == identifierStr(classDeclaration))  
     {  
       Source += dictMethod.getSource() + #newline;  
   
       Source = strRem(Source, "}");  
     }  
   }  
   
   methodsSet = dictClass.methods(true,true,false);  
   
   methodsSetEnum = methodsSet.getEnumerator();  
   
   methodsSetEnum.reset();  
   
   while(methodsSetEnum.moveNext())  
   {  
     dictMethod = methodsSetEnum.current();  
   
     Source += dictMethod.getSource();  
   
     Source += #newline + #newline;  
   }  
   
   source += "}";  
   
   filePath = WinAPI::getSaveFileName(  
     0,  
     conFilter,  
     "",  
     "@SYS56237",  
     ".txt",  
     dictClass.name());  
   
   textIo = new TextIo(filePath, #IO_WRITE);  
   
   textIo.write(Source);  
 }