mercoledì 6 marzo 2019

AX 2012 - Impostare il filtro di una query di un report in base ai record selezionati su una grid

Molto spesso capita di dover lanciare un report filtrandolo per i record selezionati su un grid. In questo esempio vogliamo stampare il report del giornale/i inventariale selezionati. Nel metodo prePromptModifyContract() della nostra controller possiamo creare un metodo set range che costruisce il range in base ai record selezionati dall'utente sul grid:

 public void setRanges(Query _query)  
 {  
   QueryBuildDataSource    qbds;  
   InventJournalTable     inventJournalTable;  
   FormDataSource       fds;  
   
   qbds = _query.dataSourceTable(tablenum(InventJournalTable));  
   
   while (qbds.findRange(fieldNum(InventJournalTable, JournalId)))  
   {  
     qbds.clearRange(fieldNum(InventJournalTable, JournalId));  
   }  
   
   if (this.parmArgs())  
   {  
     switch (this.parmArgs().dataset())  
     {  
       case tableNum(InventJournalTable):  
   
         inventJournalTable = this.parmArgs().record();  
   
         fds = inventJournalTable.dataSource();  
   
         if (inventJournalTable.isFormDataSource() && inventJournalTable.dataSource() && fds.anyMarked())  
         {  
           for (inventJournalTable = fds.getFirst(fds.anyMarked()); inventJournalTable; inventJournalTable = fds.getNext())  
           {  
             qbds.addRange(fieldNum(InventJournalTable, JournalId)).value(inventJournalTable.JournalId);  
           }  
         }  
         else  
         {  
           //nessun record selezionato, prendi il record corrente  
           qbds.addRange(fieldNum(InventJournalTable, JournalId)).value(inventJournalTable.JournalId);  
         }  
         break;  
   
       default:  
         throw error(strFmt("@SYS19306",funcName()));  
     }  
   }  
 }