venerdì 31 agosto 2012

AX 2009 - Importazione da XML

Il codice sottostante importa i dati in SalesTable, SalesLine dal file XML generato tramite esportazione:
 public void run()  
 {  
     SalesTable         SalesTable;  
     SalesLine          SalesLine;  
     int             i,numSales;  
     SalesStatus         SalesStatus;  
     InventTransId        InventTransId;  
     SalesId           salesid;  
     SysOperationProgress    prog = new SysOperationProgress();  
     XMLNodeList         ReqNodeList;  
     XMLNodeList         LinesNodeList;  
     SysOperationProgress    simpleProgressTask;  
     XMLDocument         doc;  
     XMLNode           rootNode;  
     XMLNodeList         salesLines;  
     XMLElement         element,lineElement;  
     ;  
     doc = new XMLDocument();  
     doc.load(fileName);  
     rootNode          = doc.documentElement();  
     ReqNodeList         = rootNode.selectNodes("/Sales/SalesTable"); // caricamento della lista degli ordini  
     numSales          = ReqNodeList.length();  
     simpleProgressTask     = SysOperationProgress::newGeneral(#aviUpdate, 'Sales import...',numSales);  
     ttsbegin;  
     prog.setCaption("Import in AX in progress...");  
     prog.setAnimation(#AviTransfer);  
     i = 0;  
     for(element = ReqNodeList.nextNode(); element; element = ReqNodeList.nextNode()) // ciclo sugli ordini cliente  
     {  
       simpleProgressTask.incCount(1);  
       simpleProgressTask.setText(strfmt("Percent: %1"+'%', (i/numSales)*100));  
       simpleProgressTask.update(true);  
       salesId = element.selectSingleNode("@SalesId").value();  
       if(SalesTable::find(salesId)) //l'ordine è gà prensente, occorre fare un update  
       {  
         select forupdate SalesTable where SalesTable.SalesId == salesId;  
         SalesTable.SalesStatus       = str2enum(SalesStatus, element.selectSingleNode(fieldstr(SalesTable, SalesStatus)).innerText());  
         //Inserire quì gli altri campi di testata da importare  
         SalesTable.Update();  
       }  
       else // ordine non presente, occorre crearlo e fare l'insert  
       {  
         SalesTable.SalesId     = salesId;  
         SalesTable.SalesStatus   = str2enum(SalesStatus, element.selectSingleNode(fieldstr(SalesTable, SalesStatus)).innerText());  
         //Inserire quì gli altri campi di testata da importare  
         SalesTable.Insert();  
       }  
       LinesNodeList = element.selectNodes("Lines/SalesLine"); // caricamento della lista delle righe dell'ordine che stò ciclando  
       for(lineElement = LinesNodeList.nextNode(); lineElement; lineElement = LinesNodeList.nextNode()) // ciclo sulle righe  
       {  
         InventTransId = lineElement.selectSingleNode("@InventTransId").value();  
         if(SalesLine::findInventTransId(InventTransId)) // la riga ordine è gà prensente, occorre fare un update  
         {  
           select forupdate SalesLine where SalesLine.InventTransId == InventTransId;  
           SalesLine.LineNum      = str2num(lineElement.selectSingleNode(fieldstr(SalesLine, LineNum)).innerText());  
           //Inserire quì gli altri campi di riga da importare  
           SalesLine.Update();  
         }  
         else // la riga d'ordine non è presente, occorre crearlo e fare l'insert  
         {  
           SalesLine.InventTransId   = InventTransId;  
           SalesLine.LineNum      = str2num(lineElement.selectSingleNode(fieldstr(SalesLine, LineNum)).innerText());  
           //Inserire quì gli altri campi di riga da importare  
           SalesLine.Insert();  
         }  
       }  
       i++;  
     }  
     ttscommit;  
 }  

Nessun commento:

Posta un commento