[AX 2012 R3 - How To] Exportar una tabla a Excel

julio 05, 2016 Christian Amado 0 Comentarios

Microsoft Dynamics AX 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;
}