Imprimir report de Dynamics AX/365FO en Power Apps

Imprimir report en Power Apps

En este artículo veremos como visualizar y/o imprimir un informe procedente de Dynamics AX o Dynamics 365FO a través de una Power App. No obstante, cabe mencionar que el mismo proceso puede aplicarse a cualquier documento PDF generado desde otro software.

Para lograr este objetivo, seguiremos los siguientes pasos:

  1. Generar el informe en PDF en el ERP
  2. Guardar el informe en una carpeta del servidor
  3. Crear un servicio web que devolverá el PDF en base64
  4. Recuperar la cadena de texto en base64 en Power Apps
  5. Mostrar el informe usando el visor de PDF de Power Apps
  6. Convertir el formato base64 en PDF utilizando Power Automate
  7. Guardar el documento en OneDrive o Sharepoint, utilizando Power Automate, para poder descargarlo

Existe otra alternativa (o seguramente muchas) en la que no sería necesario utilizar el formato base64, pero uno de los objetivos de este artículo también consiste en trabajar con este formato. La alternativa sería la siguiente, sobre todo para software cloud, como Dynamics 365FO, en el que no tenemos la posibilidad de dejar los documentos PDF en un servidor local:

  1. Generar el informe en PDF en el ERP
  2. Subir el informe a un servicio en la nube (Azure Storage, OneDrive, Sharepoint, etc…)
  3. Crear un servicio web para recuperar el link del informe
  4. Recuperar el link en Power Apps
  5. Mostrar el informe usando el visor de PDF de Power Apps
  6. Descargar el documento a través del link proporcionado

En este artículo nos centraremos en la primera propuesta, utilizando Dynamics AX 2012 “on premise” como ERP. Si optáis por la segunda solución, recordad que en este post podéis ver como subir archivos a Azure Storage directamente desde D365FO.

Crear servicio web para generar el informe y devolver el PDF en base64

No veremos en detalle como crear un servicio web en Dynamics AX 2012, ya que no es el objetivo principal, y además, existen muchos recursos en la web para realizar dicha tarea, como por ejemplo, este post.

De hecho, nos basaremos en la misma clase utilizada en el post anterior, PowerAppCustomerService, y añadiremos una nueva función a la que llamaremos createReport:

[SysEntryPointAttribute(true),
AifCollectionTypeAttribute('return', Types::String),
AifCollectionTypeAttribute('customerId', Types::String)]
public str createReport(CustAccount customerId)
{        
    CustTable                           custTable;    
    BinData                             binData;
    str                                 pdfBase64;
    SRSPrintDestinationSettings         settings;            
    Filename                            filename;
    smmReportsController                controller = new smmReportsController();
    Args                                reportArgs = new Args();
            
    controller.parmReportName(ssrsReportStr(CustListReport, Report));                    
               
    custTable = CustTable::find(customerId);
        
    filename = @'C:\Reports\' + custTable.AccountNum + ".pdf";        
    
    settings = controller.parmReportContract().parmPrintSettings();
    settings.printMediumType(SRSPrintMediumType::File);
    settings.fileFormat(SRSReportFileFormat::PDF);
    settings.overwriteFile(true);
    settings.fileName(filename);
    
    reportArgs.record(custTable);
    
    controller.parmArgs(reportArgs);
    controller.parmShowDialog(false);        
    controller.parmLoadFromSysLastValue(false);    
    controller.startOperation();

    binData = new BinData();
    binData.loadFile(filename);

    pdfBase64 = binData.base64Encode();                     

    return pdfBase64;
}

Esta función realiza las siguientes acciones:

  • Dado un identificador de cliente, generar un informe con los datos del mismo
  • Guardar el informe en formato PDF en la carpeta “C:\Reports” del servidor
  • Devolver el documento PDF en base64

Los que estáis familiarizados con Dynamics AX, seguramente ya habréis generado muchos informes en PDF, cosa que logramos utilizando la clase SRSPrintDestinationSettings. Por otra parte, la clase BinData, nos sirve para transformar el PDF en base64.

Recuperar el PDF en base64 en Power Apps y mostrar el informe

En este punto, tenemos que añadir esta nueva función a la API desarrollada en .NET para que pueda ser consumida desde Power Apps, y posteriormente, añadirla también al conector personalizado de Power Apps. Este proceso, lo podéis consultar en detalle en este artículo anterior.

Llegados a este punto, ya podemos crear una app de tipo canvas para probar la funcionalidad. En esta aplicación le pediremos al usuario que introduzca un id de cliente (1). Con este identificador y a través de un botón (2), llamaremos a la función createReport para obtener el pdf en base64. Guardaremos el resultado en la variable varPDFbase64.

El contenido de la variable debería ser algo parecido a esto:

Para visualizar el informe directamente en la Power App, podemos utilizar el visor de PDFs, que actualmente está en preview. Para tal propósito, utilizaremos la siguiente fórmula, en la propiedad Document del visor:

IMPORTANTE: Si en la propiedad Document del visor ponemos únicamente el valor de la variable varPDFbase64 no veríamos el informe, ya que se tiene que añadir el prefijo “data:application/pdf;base64,” para que interprete correctamente el contenido en base64. Además, tenemos que eliminar cualquier salto de línea que pueda existir. El salto de línea está representado por el carácter 10, y podemos utilizar la función Substitute para eliminarlos.

Descargar el informe utilizando Power Automate

El visor de PDF integrado en Power Apps no permite descargar el documento, por lo que tendremos que recurrir a otra solución para poder incorporar esta funcionalidad a nuestra aplicación. Una posible solución a este escenario consiste en crear un documento en Sharepoint o OneDrive, y obtener el link que nos permitirá abrir o descargar el documento desde la aplicación. Todas estas acciones las podemos llevar a cabo utilizando un flujo de Power Automate.

Como se puede observar en la imagen anterior, el flujo está formado por 4 pasos:

  1. El flujo se inicia desde Power Apps.
  2. Se crea un fichero en OneDrive utilizando dos parámetros que se envían desde la aplicación: el nombre y el contenido del fichero, en base64.
  3. Con el ID del fichero creado en el paso 2, obtenemos un link para compartir el fichero.
  4. Devolvemos el link a a la aplicación, utilizando el campo FileLink

Una vez creado el flujo, ya podemos llamarlo desde Power Apps, a través de la propiedad OnSelect del siguiente botón:

Por parámetro, indicamos el nombre del fichero y el contenido del mismo, que no es otro que el almacenado en la variable varPDFbase64. En este caso, no será necesario añadir el prefijo ni eliminar los saltos de línea. Guardamos el resultado (el link) en la variable varReportLink.

Una vez que ya tenemos el link en Power Apps, simplemente nos queda utilizar la función Launch para abrir el enlace en una nueva pestaña:

Desde esta nueva pestaña, ya podemos abrir, imprimir o descargar el informe:

Además, también podemos ir a OneDrive y acceder al informe directamente, sin necesidad de utilizar la app:

Con esto llegamos al final del artículo, que espero os sirva de ayuda, entre otras cosas, para trabajar con el formato base64 en Power Apps y Power Automate.

Follow the power!

Comparte:
Soy Miquel Vidal, ingeniero técnico en informática de sistemas, y actualmente trabajo como analista técnico y formador especializado en las soluciones empresariales de Microsoft (Office 365, Dynamics AX/365 y Power Platform).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Volver arriba