A menudo se requiere diseñar procesos que integren el envío automático de mails con informes de datos que vienen de SAP. La clase estándar CL_BCS de SAP nos permite enviar mails de forma sencilla. Sin embargo, crear y adjuntar documentos Excel en ocasiones resulta más problemático.
En este artículo veremos cómo convertir una tabla interna en un Excel para poder enviarlo por mail en un proceso de fondo (por ejemplo, un job diario).
Como muestra de la problemática, en el report estándar BCS_EXAMPLE_7 encontramos un ejemplo para enviar un mail con Excel adjunto. Sin embargo, a la hora de abrir el adjunto, se nos muestra un mensaje de error.
Esto es debido a que el método add_attachment solamente admite 3 caracteres para el tipo de documento; no obstante, el formato que deseamos es ‘XLSX’ (4 caracteres).
SAP propone corregir esto en la nota 1459896. La idea es añadir una cabecera al adjunto y, de este modo, forzarle a tomar de dicha cabecera la extensión deseada.
Sin embargo, aunque hayamos conseguido modificar la extensión, encontramos que el fichero que se adjunta no se abre. Esto se debe a que, aunque se le haya indicado que la extensión debe ser XLSX, en realidad el fichero que se ha creado no tiene ese formato, que se trataría de un CSV. De hecho, observamos que si modificamos la cabecera con la extensión CSV, el fichero ya se abriría sin avisos:
No obstante, nosotros lo que deseamos es adjuntar un fichero con formato XLSX. Para convertir una tabla interna en un fichero con dicho formato, realizaremos lo siguiente.
Vamos a crear una clase Z en SAP, con dos métodos estáticos. El primero de ellos, nos permitirá convertir dinámicamente cualquier tabla en un fichero XLSX. El segundo, hará uso de la clase estándar CL_BCS para realizar el envío del mail con el fichero de Excel adjunto.
El método convertir_tabla_en_excel, convertirá la tabla en una variable de tipo xstring que contendrá nuestro fichero XLSX. Usaremos la clase CL_SALV_TABLE para recoger el catálogo de campos de la tabla. Posteriormente, convertiremos la tabla (indicándole el formato XLSX mediante el atributo estático mc_format_xlsx).
El método enviar_mail_adjunto, llamará al método anterior para convertir la tabla interna en el fichero XLSX, adjuntarlo y enviarlo al destinatario.
Observamos que el método convertir_tabla_en_excel, convierte la tabla interna en un xstring con el fichero XLSX. Es necesario llamar al método xstring_to_solix de la clase CL_BCS_CONVERT, para convertir este xstring en una tabla binaria. Esta tabla binaria será la que se adjunte al mail.
Forzamos la extensión XLSX en la cabecera con la cadena ‘<(>&< )SO_FILENAME=Informacion.xlsx’.
El método add_attachment se encarga de adjuntar el fichero XLSX. El resto de métodos se utilizan para construir el cuerpo del mail (en formato html), añadir el destinatario y enviar el documento.
Para probar que el envío funciona correctamente, vamos a elaborar un sencillo report. El usuario puede seleccionar el tipo de tabla cuya información se desea enviar por mail; así como la dirección del destinatario.
Ejecutamos el report, y comprobamos en la transacción SOST que el Excel se ha adjuntado y se abre correctamente.
Recuerda que puedes dejar tus dudas en los comentarios o ponerte en contacto con nosotros.