lunedì 15 aprile 2013

AX 2009 - Duplicazione dati multiriga su form grid

Molte volte capita di dover duplicare i dati presenti su una o più righe di una griglia appartenente ad un form. Generalmente all griglia è associato un datasource specificato nel form.

Per prima cosa possiamo creare un bottone, che una volta schiacciato si assicurerà di effettuare l'operazione di duplica. Per permettere questa operazione in multiriga è necessario impostare la proprietà "MultiSelect" del bottone a "Yes".

Dopodichè basterà inserire questa logica (ne esistono comunque diverse varianti) nel metodo "clicked" del bottone stesso:

   DataSource  dataSourceLocale;  
   DataSource  dataSourceNuovo;  
   MultiSelectionHelper selection = MultiSelectionHelper::construct();  
   super();
  
   selection.parmDatasource(DataSource_ds);  
   dataSourceLocale = selection.getFirst();  

   while (DSLunchOrderslocal.RecId != 0)  
   {  
       dataSourceNuovo.field1 = dataSourceLocale.field1;  
       dataSourceNuovo.field2 = dataSourceLocale.field2;  
       ....  
       dataSourceNuovo.insert();  
       dataSourceLocale = selection.getNext();  
   }  
   DataSource_ds.executeQuery();  
    

Come si vede dal codice basta dichiarare due buffer dello stesso tipo della tabella che è impostata nella griglia, e un oggetto "MultiSelectionHelper" che ci aiuterà a scorrere le righe selezionate.

Il primo buffer (dataSourceLocale) serve per raccogliere i record che mano a mano vogliamo copiare, ovvero ogni singola riga, e il secondo serve per l'inserimento nel database.

Dopo aver inizializzato l'oggetto "MultiSelectionHelper", lo si parametrizza con i dati selezionati dal form e lo si inizia a scorrere partendo dal primo record con "getFirst()" parametrizzando il primo buffer. All'interno del ciclo si parametrizza il secondo buffer con gli stessi valori del primo che viene via via ciclato con "getNext()".

Infine per visualizzare le nuove righe nel form basta effettuare il metodo "executeQuery()" del datasource dello stesso.

martedì 9 aprile 2013

AX 2009 - Lookup su tabelle e campi

In questo post vediamo come creare un un semplice form con due campi: il primo campo apre una lookup su tutte le tabelle, il secondo apre una lookup su tutti i campi della tabella selezionata. Il nostro form dovrà contenere due controlli di ti po string che chiameremo rispettivamente "Tables" in autodeclaration e "Fields". Effettuiamo l'override del metodo lookup sul campo tables:

 static void lookup(FormStringControl _ctrl)  
 {  
   SysTableLookup       sysTableLookup =  
   SysTableLookup::newParameters(tablenum(UtilidElements), _ctrl);  
   Query            query = new Query();  
   QueryBuildDataSource    queryBuildDataSource;  
   QueryBuildRange       nameQBR, typeQBR;  
   ;  
   sysTableLookup.addLookupfield(fieldnum(UtilidElements, Name));  
   sysTableLookup.addLookupfield(fieldnum(UtilidElements, Id));  
   queryBuildDataSource = query.addDataSource(tablenum(UtilidElements));  
    
   typeQBR = queryBuildDataSource.addRange(fieldnum(UtilidElements, recordType));  
   typeQBR.value(SysQuery::value(UtilElementType::Table));  
   sysTableLookup.parmQuery(query);  
   sysTableLookup.performFormLookup();  
 }  

A livello di class declaration dichiariamo una variabile che conterrà l'id della tabella selezionata:

 public class FormRun extends ObjectRun  
 {  
   TableId TableId;  
 }  

Questa variabile verrà settata nel modified field del controllo "Tables"

 public boolean modified()  
 {  
   boolean ret;  
   ret = super();  
   TableId = TableName2Id(this.text());  
   return ret;  
 }  

Scriviamo a questo punto il metodo lookup del controllo "Fields"

 public void lookup()  
 {  
   SysTableLookup       sysTableLookup =  
   SysTableLookup::newParameters(tablenum(UtilidElements), this);  
   Query            query = new Query();  
   QueryBuildDataSource    queryBuildDataSource;  
   QueryBuildRange       nameQBR, typeQBR;  
   ;  
   sysTableLookup.addLookupfield(fieldnum(UtilidElements, Name));  
   sysTableLookup.addLookupfield(fieldnum(UtilidElements, Id));  
   queryBuildDataSource = query.addDataSource(tablenum(UtilidElements));  
   nameQBR = queryBuildDataSource.addRange(fieldnum(UtilidElements,  
   ParentId));  
   nameQBR.value(queryValue(TableId));  
   typeQBR = queryBuildDataSource.addRange(fieldnum(UtilidElements, recordType));  
   typeQBR.value(SysQuery::value(UtilElementType::TableField));  
   sysTableLookup.parmQuery(query);  
   sysTableLookup.performFormLookup();  
 }  

Possiamo verificare il funzionamento del form selezionando "CustTable"