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>