Los códigos QR están muy presentes en nuestras vidas como una forma de compartir información, URL u otros datos de una forma rápida y sencilla.

¡Yo tengo el poder! (De generar códigos QR)
¡Yo tengo el poder! (De generar códigos QR)

En este post vamos a ver cómo mostrar uno en un formulario o informe SSRS de Dynamics 365 usando una librería que se incluye en nuestras máquinas de desarrollo: QRCoder.

Generar un código QR

QRCoder es una librería open source de .NET que nos ayuda a generar códigos QR con solo unas líneas de código. Por ejemplo, en X++ haríamos lo siguiente:

public void generateQR(str _text)
{
    QRCodeGenerator             qrGenerator     = new QRCodeGenerator();
    QRCodeGenerator.ECCLevel    eccLevel        = QRCodeGenerator.ECCLevel::Q;
    QRCodeData                  qrCodeData      = qrGenerator.CreateQrCode(_text, eccLevel);
    QRCode                      qrCode          = new QRCode(qrCodeData);
    System.Drawing.Bitmap       qrCodeImage     = qrCode.GetGraphic(20);
}

Con únicamente este trocito de código ya tendríamos un Bitmap de .NET con nuestro texto. ¡No os olvidéis de añadir using QRCoder; en la parte superior de vuestra clase o formulario!

QRCoder

QRCoder viene en las referencias estándar, y supongo que es un substituto (o complemento) de la antigua librería Microsoft.Dynamics.QRCode. Podéis encontrar ambas en el AOT.

Con ella podremos generar diferentes tipos de contenido incluyendo mensajes de WhatsApp, contraseñas wifi, geolocaliczación, teléfonos, SMS, etc.

Podéis leer su documentación en su página de proyecto en GitHub, donde hay multitud de ejemplos.

De acuerdo, vamos a volver al X++. ¿Cómo usamos QRCoder para mostrar un código QR en un formulario o informe? Vamos a verlo.

Mostrar un QR en un formulario

Como acabamos de ver partimos de un Bitmap de .NET, del namespace System.Drawing. ¿Cómo lo convertimos en un objeto Image de X++ que se pueda usar en un form? Vamos a utilizar un objeto Binary para convertir el Bitmap en un container que se pueda utilizar en un control de tipo imagen en el formulario.

En este ejemplo voy a mostrar un código QR con un enlace a esta página en un form con un pattern custom. El control que he añadido en el formulario (QRCodeCrtl en el código) es de tipo imagen. Ahora anulamos el método init y hacemos esto después de la llamada a super:

public void init()
{
    super();
    QRCodeGenerator             qrGenerator = new QRCodeGenerator();
    QRCodeGenerator.ECCLevel    eccLevel    = QRCodeGenerator.ECCLevel::Q;        
    QRCodeData                  qrCodeData  = qrGenerator.CreateQrCode("https://ariste.info", eccLevel);
    QRCode                      qrCode      = new QRCode(qrCodeData);        
    System.Drawing.Bitmap       qrCodeImage = qrCode.GetGraphic(20);
    System.IO.MemoryStream      memS        = new System.IO.MemoryStream();
    memS.Position = 0;
    qrCodeImage.Save(memS, System.Drawing.Imaging.ImageFormat::Jpeg);
    Binary      b   = Binary::constructFromMemoryStream(memS);
    container   c   = b.getContainer();
    Image       im  = new Image(c);
    QRCodeCtrl.image(im);        
}

Y cuando cargue el formulario veremos esto:

Código QR en un formulario
Código QR en un formulario

Podéis probar a escanearlo con el móvil y ver el enlace. Fácil, ¿verdad?

Añadir un código QR a un informe SSRS

Para añadir el código QR a un informe de SSRS he ido por otro camino: guardar la imágen del QR como una cadena Base64 en un campo cadena (de tamaño Memo) en la tabla del data provider del informe, y luego en el diseño del report lo decodificamos de nuevo a una imagen.

Este es el código que llamo en mi clase DP para guardar la imagen como un Base64:

public str genBase64QR(str _text)
{
    QRCodeGenerator             qrGenerator = new QRCodeGenerator();
    QRCodeGenerator.ECCLevel    eccLevel    = QRCodeGenerator.ECCLevel::Q;        
    QRCodeData                  qrCodeData  = qrGenerator.CreateQrCode(_text, eccLevel);
    QRCode                      qrCode      = new QRCode(qrCodeData);
    System.Drawing.Bitmap       qrCodeImage = qrCode.GetGraphic(20);
    System.IO.MemoryStream      memS        = new System.IO.MemoryStream();
    memS.Position = 0;
    qrCodeImage.Save(memS, System.Drawing.Imaging.ImageFormat::Jpeg);
    return System.Convert::ToBase64String(memS.ToArray());
}

Podéis ver que es la mayor parte lo mismo que en el report, excepto que aquí convierto el objeto MemoryStream a un Base64 y lo devuelvo.

Luego en el diseñador del informe voy a añadir una imagen y en sus propiedades usar database como origen y como MIME type image/jpg. El tipo depende del formato en el que estéis guardando el stream, en mi caso Jpeg. Así es como deberíais ver las propiedades:

Propiedades en el diseño SSRS
Propiedades en el diseño SSRS

Y en la expresión haremos esto:

=System.Convert.FromBase64String(First(Fields!QRBase64.Value, "AASQRTestDP"))

Y el resultado será:

Código QR en informe SSRS
Código QR en informe SSRS

Como con el formulario podéis usar el móvil para ver que funciona.

Se me ha puesto cara de código QR
Se me ha puesto cara de código QR

¡Y listo! ¡Ahora ya podemos añadir códigos QR en todo lo que queramos!

¡Suscríbete!

Recibe un correo cuando se publique un nuevo post
Author

Microsoft Dynamics 365 Finance & Operations technical architect and developer. Business Applications MVP since 2020.

Write A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

ariste.info