giovedì 30 agosto 2012

AX 2009 - Esportazione dati in XML

Come primo articolo vedremo come esportare in XML dati di una tabella e successivamente effettuare l'import in AX.
Come esempio esporteremo dati dalle tabelle SalesTable e SalesLine collegate tra di loro secondo la logica testata-righe,  tale soluzione si può comunque estendere a qualsiasi tabella.
Il campo che lega le due tabelle è SalesId.

L'XML che andremo a creare rispecchierà tale logica nella sua struttura.

In particolare esporteremo due campi di testata (SalesId, SalesStatus) e due campi di riga(InventTransId, LineNum)

L'avanzamento complessivo della procedura è dato dalla progressbar.

 public void export()
{
    SalesTable          SalesTable, ST;
    SalesLine           SalesLine;
    #AviFiles
    SysOperationProgress simpleProgressTask, simpleProgressReq;
    int numSales;
    int row;
    XmlDocument         doc;
    XmlElement          nodeTable;
    XmlElement          nodeXml;
    XmlElement          nodeStatus;
    XmlElement          linesRoot;
    XmlElement          nodeSalesLine;
    XmlElement          nodeLineNum;

    ;

    doc = XmlDocument::newBlank(); // creo un XML vuoto

    nodeXml = doc.createElement('Sales'); // imposta il nodo radice
    doc.appendChild(nodeXml); // aggiungi il nodo radice al documento

    row = 0;

    select count(recId) from ST;
       numSales = ST.RecId;

    simpleProgressTask = SysOperationProgress::newGeneral(#aviUpdate, 'Sales export...', numSales);

    new InteropPermission(InteropKind::ClrInterop).assert();

    while select  SalesTable
    {

        simpleProgressTask.incCount(1);
        simpleProgressTask.setText(strfmt("Percent: %1"+'%', (row/numSales)*100));
        simpleProgressTask.update(true);

        nodeTable = doc.createElement(tablestr(SalesTable));
        nodeTable.setAttribute(fieldstr(SalesTable, SalesId), SalesTable.SalesId); // imposto il valore dell'attributo dell'elemento
        nodeXml.appendChild(nodeTable);

        nodeStatus = doc.createElement(fieldstr(SalesTable, SalesStatus));
        nodeStatus.appendChild(doc.createTextNode(enum2str(SalesTable.SalesStatus))); // il nome dell'elemento coincide con il nome del campo
        nodeTable.appendChild(nodeStatus);

        // aggiungi quì altri campi di testata da esportare

        linesRoot = doc.createElement('Lines'); //elemento radice che conterrà le righe
        nodeTable.appendChild(linesRoot);

        while select  SalesLine
            where SalesLine.SalesId == SalesTable.SalesId
        {
            nodeSalesLine = doc.createElement(tablestr(SalesLine));
            nodeSalesLine.setAttribute(fieldstr(SalesLine, InventTransId), SalesLine.InventTransId);
            linesRoot.appendChild(nodeSalesLine);

            nodeLineNum = doc.createElement(fieldstr(SalesLine, lineNum));
            nodeLineNum.appendChild(doc.createTextNode(num2str(SalesLine.LineNum,-1,-1,-1,-1)));
            nodeSalesLine.appendChild(nodeLineNum);

            // aggiungi quì gli altri campi di riga da esportare

        }

        row++;
    }


    doc.save(fileName);

    CodeAccessPermission::revertAssert();

    return;

}



Questo il file XML che andremo ad ottenere:

 
 <?xml version="1.0" encoding="utf-8"?>  
 <Sales>   
  <SalesTable SalesId="C0901542">  
   <SalesStatus>Ordine aperto</SalesStatus>  
   <Lines />  
  </SalesTable>  
  <SalesTable SalesId="C0901724">  
   <SalesStatus>Ordine aperto</SalesStatus>  
   <Lines>  
    <SalesLine InventTransId="926038">  
     <lineNum>32,00</lineNum>  
    </SalesLine>  
    <SalesLine InventTransId="926038">  
     <lineNum>33,00</lineNum>  
    </SalesLine>  
    <SalesLine InventTransId="926038">  
     <lineNum>34,00</lineNum>  
    </SalesLine>  
    <SalesLine InventTransId="925879.1">  
     <lineNum>110,00</lineNum>  
    </SalesLine>  
   </Lines>  
  </SalesTable>  
 </Sales>  

Nessun commento:

Posta un commento