[AX 2012 R3 - How To] Exportar una tabla a Excel
Exportar una tabla a excel es muy simple, desde cualquier formulario en Dynamics AX. Simplemente se debe hacer clic en el ícono con el logo de Microsoft Excel en la barra de herramientas.Pero ¿Qué ocurre cuando debemos exportar datos modificados o filtrados?
Es ahí donde este tutorial puede ser de ayuda para los desarrolladores de Dynamics AX.
En un método crearemos el libro y llamaremos a los métodos que cargan la cabecera y los datos. Primeramente definimos la exportación al Excel:
void export2Excel() { SysExcelApplication xlsApplication; SysExcelWorkBooks xlsWorkBookCollection; SysExcelWorkBook xlsWorkBook; SysExcelWorkSheets xlsWorkSheetCollection; SysExcelWorkSheet xlsWorkSheet; SysExcelWorksheet xlsWorkSheetToBeDeleted; SysExcelRange xlsRange; SysExcelCells cells; SysExcelCell cell; str fileName; ; //Cargar datos temporales //tmpTable = element.loadTmpTable(); //Nombre de archivo fileName = FilePathControl.text(); //Iniciamos la instancia de Excel xlsApplication = SysExcelApplication::construct(); //Creamos el Libro y Hoja de Excel xlsWorkBookCollection = xlsApplication.workbooks(); xlsWorkBook = xlsWorkBookCollection.add(); xlsWorkSheetCollection = xlsWorkBook.worksheets(); xlsWorkSheet = xlsWorkSheetCollection.itemFromNum(1); //Celdas corespondientes a la Cabecera cells = element.fillExcelHeader(xlsWorkSheet.cells()); //Cargar celdas de datos cells = element.fillExcelData(xlsWorkSheet.cells()); //Eliminar hojas que no se utilizarán while(xlsWorkSheetCollection.count() > 1) { xlsWorkSheetToBeDeleted = xlsWorkSheetCollection.itemFromNum(2); xlsWorkSheetToBeDeleted.delete(); } //Ajustar columnas xlsWorkSheet.columns().autoFit(); //Verificar si el archivo ya existe, para eliminarlo if(WinApi::fileExists(fileName)) WinApi::deleteFile(fileName); //Guardar documento Excel xlsWorkbook.saveAs(fileName); //Abrir documento Excel xlsApplication.visible(true); }Ahora, procedemos a cargar la cabecera (generalmente corresponde al texto de la columna):
SysExcelCells fillExcelHeader(SysExcelCells _cells) { //Reemplazamos la X por el índice(empieza en 1) de columna _cells.item(1,X).value(fieldPName(TABLA, COLUMNA)); return _cells; }Y por último accedemos a los datos para cargar el Excel:
SysExcelCells fillExcelData(SysExcelCells _cells) { #AviFiles real calculatedProportion; int indiceProgress = 0; int row = 1; //row = 1 corresponde a la cabecera int tickCount; Array rowArr; COMVariant comArr; COM comRange; ; select Count(RecId) from TABLA; cantidadRegistros = TABLA.RecId; progress.setCaption("Cargando datos..."); progress.setAnimation(AviTransfer); progress.setTotal(cantidadRegistros); //Obtener los datos necesario para cargar los datos. while select * from TABLA { try { //Manejar el indicador de Progreso indiceProgress++; progress.setText(strfmt("Registro %1 de %2", indiceProgress, int642str(cantidadRegistros))); progress.setCount(indiceProgress, 1); //Filas tickCount = WinAPI::getTickCount(); row++; // Crear un array para completar la fila completa rowArr = new Array(Types::String); // Cargar cada celda rowArr.value(1, TABLA.COLUMNA); // Almacenar el Array comArr = new COMVariant(); comArr.safeArray(rowArr, COMVariantType::VT_BSTR); //Establecer el rango de columnas, reemplazar X por la letra de columna que corresponde al Excel comRange = _cells.range(strFmt("A%1:X%1", row)).comObject(); //Agregar fila al rango comRange.value2(comArr); } catch { } } indiceProgress = 0; //Cerramos el indicador de progreso progress.kill(); return _cells; }