Digitalizacion de Procesos Con Herramientas de Office 365
Digitalizacion de Procesos Con Herramientas de Office 365
Digitalizacion de Procesos Con Herramientas de Office 365
1.- INTRODUCCION
En el presente trabajo titulado Digitalización de procesos con herramientas de Office
365 se responde a la necesidad de muchas empresas de pequeño o mediano tamaño al deseo
de pegar el salto a la llamada industria 4.0. Para muchas empresas normalmente no es posible
reservar una gran cantidad de capital para invertir en digitalizarse, pero siguen teniendo que,
por ejemplo, generar los informes diarios de ventas de una empresa, donde alguien tiene que
reservar todos los días las primeras horas de la mañana para realizar un informe del día
anterior.
En este proyecto se persigue mostrar formas sencillas de automatizar algunos de los
procesos que toda empresa realiza con reiteración aprovechándose de las herramientas
proporcionadas por Microsoft. Actualmente muchas empresas están optando por contratar
los servicios de Microsoft 365 para empresas ya que te permite usar las herramientas de
Office, además de Outlook y OneDrive desde la web. Sin embargo, eso no es todo lo que
viene en los paquetes de Microsoft 365 y, combinándolo con lo que ya se manejaba de
Office, se abre la puerta a una gran posibilidad de automatizaciones.
Así que en las siguientes páginas se mostrarán varios ejemplos de procesos
automatizados utilizando en todas las situaciones posibles programas de Microsoft. Si se
usase cualquier otro tipo de licencias de Microsoft, ya que tienen alguna utilidad no incluida
en la licencia de Microsoft 365, se comentará junto con las ventajas respecto a otra opción
que no la necesitase.
2.- JUSTIFICACIÓN
En este trabajo se presentan las experiencias que se han obtenido trabajando en una
empresa que se dedica a proporcionar asistencia tecnológica a empresas que no pueden
permitirse tener un informático propio, o no necesita uno a tiempo completo, o que quieren
tener un proveedor con el que tener una relación cercana y de confianza. A medida que
pasaba el tiempo cada vez más empresas contrataban migraciones de sus dominios de los
servicios de correos a Microsoft, esto se debe a que normalmente estas empresas contratan
otras empresas especializadas que, como Microsoft, te proporcionan un dominio y espacio
en sus servidores para almacenar todos los buzones de correo que crees con ese dominio. El
cambio de debía a que, con estas empresas se utilizan generalmente unos tipos de protocolos
llamados POP o IMAP, mientras que Microsoft utiliza Exchange con su oferta de Microsoft
365:
• El protocolo POP (Post Office Protocol), cuya versión más actual es POP3,
crea una copia local del correo que lees y lo borra del servidor donde esté
almacenado el correo original. Pero esto es tanto su punto fuerte como su
desventaja, ya que al eliminar el correo una vez descargado el buzón del correo
en el servidor que se tenga contratado no se llenará y no será necesario contratar
más espacio. Sin embargo, los correos solo podrán verse en el ordenador donde
se hayan descargado y si el archivo se corrompiese o se perdiese también se
perderían los correos.
• IMAP (Internet Message Access Protocol) a diferencia de POP sincroniza las
carpetas de correo del servidor con varios dispositivos, lo que permite acceder
a los correos desde varios sitios, como se ve en la figura 2.1, y que si se lee
desde uno queda marcado como leído en el resto. Pero al no eliminarse los
correos el espacio asignado para el buzón este se llenará, necesitándose
contratar más espacio o eliminar los correos a mano.
• Y por último Exchange que además de los correos, como IMAP, sincroniza
también los contactos y calendarios.
importante pero repetitiva que realizase en su empresa, aprovechando las herramientas que
ya han pagado pero que no tenían intención de usar. Así se le da más utilidad por el mismo
precio a las licencias de Microsoft y se ayuda a la empresa a realizar un pequeño primer salto
hacia una empresa más digital que tanto les cuesta dar a empresas de pequeño o mediano
tamaño pero que ya están muy bien establecidas.
Tras realizar varios proyectos de este ámbito para distintas empresas se pudo comparar
la eficiencia de varios métodos de automatización usando las herramientas a nuestra
disposición, recogiendo dicha experiencia en este trabajo, junto a los problemas que
surgieron de usar dichas herramientas.
Los actualizadores son otros dispositivos críticos de la capa física que interactúan con
el entorno o un objeto, como por ejemplo el controlador de luces en una carretera que se
tiene que encender cuando pasa una persona.
Las redes de malla están formadas por una serie de repetidores fáciles de instalar
ubicados en lugares elevados, como farolas o postes telefónicos, para formar una cama sobre
la zona de la que se desea obtener información.
Para ello, el Análisis de Big Data requiere unas herramientas y tecnologías que puedan
transformar todos esos datos en formatos estructurados, no estructurados o
4.- HERRAMIENTAS
En este apartado se explicarán las herramientas que se usaron para este trabajo y una
breve explicación de su funcionalidad.
4.1.- Excel
Excel es, junto a Word, la herramienta más conocida de Microsoft. Es un software de
hojas de cálculo que te da una gran libertad a la hora de trabajar con datos y con las fórmulas
ya proporcionadas por Microsoft para usar. Además, Excel tiene una serie de aplicaciones
que aumentan aún más las posibilidades de la herramienta:
4.1.1.- VBA
Microsoft VBA (Visual Basic for Applications) es un lenguaje de programación
simple integrado en Excel, y otras herramientas de Office, cuya utilidad principal es la de
crear macros que automaticen tareas sencillas. Esto lo haría perfecto para automatizar de
forma sencilla tareas simples que tenga que realizar el trabajador de forma constante en una
hoja de cálculo, como ajustar las dimensiones de una tabla automáticamente cada vez que se
trabaja en ella.
ThisWorkbook.Save
Application.Quit
End Sub
4.2.- Power Bi
Power Bi es una herramienta para analizar y presentar de forma interactiva grandes
cantidades de datos a través de una interfaz gráfica web, como se muestra con un ejemplo
en la figura 4.2:
A esta puerta de enlace le puedes configurar el nombre de usuario con el que realizar
las comunicaciones, para evitar así problemas de permisos. Además, una sola puerta de
enlace se puede usar para todas las herramientas de Microsoft que la necesiten sin necesidad
de configurar más.
Volviendo a el caso específico de Power Bi, una vez configurada la puerta de enlace,
entra en efecto el tipo de conexión que se le haya configurado. Si se eligió importar, Power
Bi te limita el número de actualizaciones diarias que se pueden realizar, mientras que en
Direct Query los datos de actualizan con las peticiones que se realizan cada vez que se
acceden a los informes que las contienen, ya que no están almacenados fuera de la base de
datos.
4.4.- Powershell
Y al ultima herramienta de Microsoft que se usó para el proyecto es Powershell, que,
aunque viene incluido con Windows y no con el paquete de Office 365, es de gran utilidad
para realizar montajes automáticos en el servidor.
Powershell es un shell de línea de comandos y un entorno para la automatización de
tareas basado en el Framework .NET, perfecto para la automatización de procesos. Este,
como ya se comentó, viene integrado con Windows 10 y Windows Server, pero se puede
obtener para versiones anteriores y Linux.
Powershell no es un lenguaje de programación compilado como C, si no que funciona
por scripts, contando con un conjunto de comandos preparados para ser usados por el
usuario. Entre la lista de comandos existentes hay para SQL servers y Excel, lo que permite
manejar los datos con los que queremos trabajar eliminando la necesidad del usuario para,
por ejemplo, ejecutar las macros de los Excel que se habían necesitado con VBA.
En cuanto a la base de datos que elegir para un montaje real, las racionales son las más
comúnmente usadas, como PostgreSQL o Microsoft SQL Server.
Las tablas de Microsoft SQL están, a su vez, contenidas en objetos denominados
esquemas, que también tienen la función de trabajar como límites de seguridad, dividiendo
la base de datos en niveles de esquemas y así separar a los usuarios en niveles de acceso.
Los esquemas pueden contener hasta 2.147.483.647 tablas con hasta 1024 columnas cada
una.
Cuando se diseña una tabla de una base de datos, las propiedades que se les asigne y
las columnas creadas dentro de las tablas controlaran los tipos de datos permitidos y el rango
de datos que se aceptaran. Un diseño adecuado de una tabla hará que sea más fácil y rápido
almacenar datos y recuperar los datos de ella.
Físicamente, las tablas de un servidor SQL se almacenan en una base de datos como
páginas de 8 KB de tamaño. Estas páginas se almacenan de forma predeterminada en una
sola partición junto con el grupo de archivos predeterminados primarios. Además, una tabla
se puede almacenar en múltiples particiones, en las que cada grupo de filas se almacenan en
varias particiones en función del contenido de una columna específica, como se representa
en la figura 5.2.
En cuanto a la escalabilidad, en casi todas las situaciones una base de datos SQL es
verticalmente escalable, es decir, que se puede aumentar la carga en un solo servidor
aumentando sus características, como RAM, CPU o añadiendo más memoria SSD.
similar a la que una RDBMS tradicional ejecutaría esa misma consulta en una base de datos
SQL.
Una base de datos NoSQL utiliza un esquema dinámico para manejar datos no
estructurados. Estos datos se almacenan de varias maneras, bien sea orientados a
documentos, columnas, gráficos u organizados, como un almacén KeyValue, que consiste
en un conjunto de registros que, a su vez, contienen diversos campos con datos. Esta
flexibilidad permite crear documentos sin tener que crear estructuras definidas primero.
Además, cada uno de los documentos podrá tener una estructura propia y única. En cuanto
a la sintaxis, varia de una base de datos a otra, y permite agregar campos a medida que se
avanza con más facilidad que con una base de datos SQL, que requeriría programar código
para hacerlo.
Las bases de datos NoSQL son escalables horizontalmente, viéndose la diferencia con
las bases de datos SQL en la figura 5.3. Esto significa que se maneja más tráfico al
fragmentar o agregar más servidores a la base de datos NoSQL. En consecuencia, una base
de datos NoSQL puede escalarse enormemente, siendo la mejor opción para grandes
conjuntos de datos y en constante cambio.
En resumen, las razones por las que se eligió una base de datos SQL sobre una NoSQL
son:
• Como el objetivo del proyecto es crear consultas e informes complejos, se
requiere crear un script que recupere y presente los datos deseados. NoSQL no
admite relaciones entre tipos de datos, limitando las posibilidades ya que en las
bases de datos se suele hacer referencia a otras tablas codificando el dato al que
hace referencia. Por ejemplo, si existe un cliente llamado Cliente01 codificado
con el número 001 en la tabla de clientes, donde se incluye el resto de
información de este, en la tabla de facturas, cuando hay una factura de este
cliente en vez de poner toda la información del cliente se pone su código 001,
haciendo muy útil las relaciones entre tablas.
• SQL es más adecuado para transacciones pesadas o complejas debido a que es
más estable y garantiza la integridad de los datos.
• Si no se esperan muchos cambios en los datos, ni se están trabajando con un
gran volumen de datos de distintos tipos no se estarían aprovechando las
ventajas de NoSQL.
• Las limitaciones con los Querys de datos y las diferencias de soporte
proporcionado por la comunidad de las bases de datos NoSQL generarían
muchos más problemas para montajes muy personalizados.
Sin embargo, eso no quiere decir que SQL sea la mejor solución en todas las
situaciones, depende de la información con la que se trabaje. NoSQL es muy flexible, lo
que permitiría añadir nuevas funciones y tipos de datos con facilidad.
Una conexión
Entorno local ODBC
directa que
no requiere
Herramienta
DB Informes del entorno
de análisis
local o una
locales local
y base de datos
Puerta de enlace Puerta de enlace en la nube de
Microsoft
6.- AUTOMATIZACIÓN
Debido a la enorme variedad entre los datos de cada empresa, como ya se comentó
antes, el análisis de dichos datos produce informes muy distintos de unos a otros. Sin
embargo, los procedimientos a realizar para llegar a poder analizar los datos pueden ser muy
similar entre ellos, por lo que, en este proyecto, se va a centrar en preparar el terreno para
realizar la presentación de los informes con los datos analizados
Para el proceso de automatización se preparó un escenario que incluye la arquitectura
más común encontrada a lo largo de los proyectos de automatización en empresas realizados:
un servidor SQL dentro de uno de los servidores físicos con Windows Server de la empresa.
Al que se tiene acceso constante gracias a una VPN (Virtual Private Network) [13] y con un
usuario administrador propio que ningún otro usuario va a usar.
Para aprovechar al máximo todas las aplicaciones proporcionadas por Microsoft se van
a realizar una variedad de procesos:
• Se va a utilizar Excel en el servidor para generar documentación local para los
trabajadores de la empresa.
• Se va a aprovechar Outlook para enviar correos diarios con algunos de los
informes generados en el punto anterior.
• Se va a aprovechar Power Automate para automatizar la gestión de correos y
reenviarlos a los trabajadores correctos.
• Se va a utilizar Power Bi para crear un análisis masivo de datos, explicado en
el apartado de Big Data Análisis, para que los trabajadores puedan consultar el
estado de los trabajos desde la web.
Definidas las bases, el montaje final del proceso será el representado en la figura 6.1:
Servidor local
IP: 192.168.0.10 Consulta
DB SQL
Datos
Excel Puerta de
enlace
Generar
informes
Outlook
Power Power
Bi Automate
Informe
web
Para la conexión con la base de datos, debido a que está situada en el mismo servidor
desde el que se está trabajando, no requiere ninguna cadena de conexión, el conector la
detectara automáticamente al introducir la IP del servidor. Si se hubiese necesitado levantar
una conexión externa, como ODBC, para poder acceder a los datos, se habría necesitado una
cadena de conexión.
Driver={PostgreSQL};Server=IP
address;Port=5432;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
Este ejemplo es para conectarse a una base de datos PostgreSQL externa a la que se ha
levantado un ODBC para conectarse. Además, habría que tener en cuenta el estándar con el
que se está enviando, como por ejemplo ANSI, ya que habría que especificarlo dentro de la
parte de Driver del código anterior. Y, si se intenta convertir a un estándar manejable una
columna de datos que no sea una cadena de datos, como un archivo json, la cadena de
conexión produciría error intentando acceder a ella. Para evitar errores de este tipo es posible
añadir solo las columnas deseadas:
SELECT column1, column2, ...
FROM table_name;
De esta forma reducimos la carga de datos de la consulta y evitamos los problemas de
las columnas incompatibles con el análisis de datos.
Una vez conectado a la base de datos, debemos elegir las tablas que necesitamos para
llevar a cabo el informe. Para este caso se usaron las tablas que muestran las ordenes, los
presupuestos de los que nacen dichas ordenes, la información de los clientes, las tareas
introducidas por los trabajadores para saber que se ha hecho con el trabajo y la lista de
albaranes para saber si el trabajo ya se ha enviado al cliente.
Si se ha realizado la conexión la conexión por Direct Query en vez de Importarlo,
dependiendo de las necesidades explicadas anteriormente, no sería posible modificar la
conexión con el Query, por ejemplo, filtrar los datos recibidos. Pero será posible trabajar con
ellos en los siguientes pasos del proyecto.
A continuación, es necesario crear las relaciones entre las tablas, como en la figura
6.2, para poder mostrar la información filtrada correctamente. Gracias al sistema con el que
montan los servidores SQL, las relaciones ya están bien definidas con los datos de las
columnas, por ejemplo, la tabla de ordenes tiene una columna que hace referencia al código
del presupuesto y del cliente al que pertenece.
funciones del Query de Power Bi. Sin embargo, existen otras funciones de Power Bi que te
permiten manejar los datos después de obtenerlos de la consulta, no reduciendo la carga de
datos de ella, pero permitiéndote manejar los datos igualmente. Es posible crear nuevas
columnas, que, aunque no se aplican a la consulta realizada a la base de datos, se aplican
constantemente en el informe de Power Bi. También se pueden crear medidas, que no es lo
mismo que una columna nueva, estas calculan un resultado a partir de unas fórmulas de
expresiones de análisis de datos (DAX), en resumen, son fórmulas de cálculos parecidas a
las de Excel, como SUM.
Una vez añadida la tabla con los datos de las ordenes activas se pueden añadir filtros
con los que el usuario que vea el informe puede interactuar, como los de figura 6.4, para
poder elegir la orden de la que ver la información detallada.
En este informe se incluyeron también otras páginas en las que se incluyen gráficos
de ventas y otras informaciones privadas de la empresa. Es por esta razón que el proyecto
tiene un enfoque tan general, solo se enseña el proceso para llegar al análisis y se están
explicando solo los detalles más importantes del proceso.
Power Bi está diseñado para crear páginas de informes que actúan únicamente en
ellas mismas y de forma muy limitada con las demás páginas del informe. Es por lo que
actualmente no hay forma de, por ejemplo, seleccionar con el ratón un cliente de la lista y
que te lleve a otra página donde te muestre la información detallada del mismo. Sin embargo,
existen métodos que simulan esta situación, como Drillthrough y una forma de revelar datos
una vez filtres en la página.
DrillThrough te permite ir a otra página del informe llevándote como filtro el dato
sobre el que estés. De esta forma, con el botón derecho del ratón, como se ve en la figura
6.5, podemos simular el mostrar la información del cliente llevándonos como filtro el código
del cliente a otra página donde se mostrará la información deseada.
La segunda opción es crear un sistema que, cuando se elija una orden en un filtro,
como el mostrado en la figura 6.4, se revele alguna parte del informe donde se representen
gráficos o se muestren datos que serían innecesarios si se estuviesen aplicando a más de un
código de orden. Para ello utilizaremos la función de añadir nuevas medidas a las tablas que
tenemos que nos proporciona Power Bi.
Las medidas, como ya se explicaron, actúan aplicando una función a todas las filas
de la tabla que se están mostrando en el informe en ese momento. Por eso, si creamos una
función que reaccione al filtrado de la tabla podremos crear el desencadenante para mostrar
el resto de los datos.
SlicerCheck = if(ISFILTERED(ORDENES[CODIGO]),1,2)
Con esta sencilla formula se creó un valor ‘SlicerCheck’, que será 1 cuando se esté
filtrando el código de las ordenes de cualquier forma, consiguiendo así el desencadenante
para mostrar el resto de la información. Si añadimos esta función a la página mostrada en la
figura 6.5 podemos escondes detrás de la tabla el resto de información de la orden para que
cuando se introduzca un filtro se muestre. Para ello hay que crear una nueva medida para
hacer transparente el fondo de la tabla para así ocultar el resto cuando no haya filtro y
mostrarlo cuando lo haya.
Make Transparent =
IF(
ISFILTERED(ORDENES[CODIGO]),
"#FFFFFF00",
"White"
)
Con esta modificación de la medida anterior tenemos el código que devuelve los
colores que aplicar al fondo de la tabla, que cambiará de valor automáticamente cuando se
produzca un filtrado. El código hexadecimal #FFFFFF00 representa al color transparente, lo
que nos permite hacer que se vea lo que hay detrás de la tabla de órdenes, como se representa
en la figura 6.7.
Como con Power Bi, Excel cuenta con la opción de realizar consultas directas con la
base de datos para obtener los datos deseados. Sin embargo, Excel es mucho más sensible al
formato de las columnas y, además, como traduce los datos de la consulta al formato de la
hoja de cálculos tras cada actualización. Excel tiene un tiempo de carga mayor que Power
Bi, por lo que es recomendable cargar únicamente las columnas con las que se van a trabajar.
SELECT [TABLA].[COLUMNA1], [TABLA].[COLUMNA2], …
FROM [DATABASE].[TABLA] WHERE [‘CONDICIÓN DE FILTRADO’]
Este proceso añade una nueva página a la hoja de cálculo con una tabla conteniendo
los datos de la consulta, hay que tener en cuenta que Excel tiene un número máximo de filas
de 1.048.576 filas, por lo que más datos que el límite de filas no se cargarán. Tras eso se
puede utilizar como una tabla de Excel normal para hacer referencia a su contenido.
Si se quieren representar algún tipo de suma de valores, como por ejemplo la suma de
las facturas mensuales de un representante, es preferible utilizar tablas dinámicas. Para ello,
a pesar de añadir un paso más de conexión en la consulta, se utilizó la extensión de Power
Bi para Excel, ya que la posibilidad de crear medidas con facilidad y el poder comprobar la
veracidad de las modificaciones antes de publicarlas en Power Bi desktop ayudan en el
montaje a futuro.
Además, trabajando con tablas dinámicas, Excel cuenta con comandos para acceder a
los datos de las medidas aplicando filtros en el propio código, permitiendo variar el filtrado
de forma activa, como por ejemplo la fecha actual, para representar los datos adecuados en
cada momento.
=SI.ERROR(
IMPORTARDATOSDINAMICOS(
"[Measures].[TIPO_C]";
Visitas_V!$A$3;
"[VISITA].[Mes]";
UNIRCADENAS(;;"[VISITA].[Mes].&[";MES("1"&"/"&B$3&"/"&"
1");"]");
"[VISITA].[REPRE]";
UNIRCADENAS(;;"[VISITA].[REPRE].&[";$O$4;"]");
0
)
Por ejemplo, este es un código usado en uno de los Excels cuyo objetivo es representar
el número de visitas que un representante ha realizado a clientes cada mes del año, sacando
Con esto ya se tiene acceso desde Excel a todos los datos de la base de datos y cualquier
tipo de información que solo, por ejemplo, los datos de las respuestas de encuestas de
satisfacción que se guardaron en una lista de Power Bi para ser mostradas por informes, pero
que se quiera pasar a Excel. Con esto ya se puede generar una gran variedad de informes que
guardar en Excel, como listas de clientes, o en PDF, como informes de las ventas del día.
Una vez obtenidos los datos hay que mantenerlos actualizados para mostrar los
correctos cuando se generen los informes desde ellos. Las consultas se pueden configurar
para que se actualicen al abrir la hoja de cálculo, pero para actualizar automáticamente se
utilizaron scripts de Powershell para automatizar la actualización y la generación de los
informes.
$app = New-Object -comobject Excel.Application
$app.Visible = $True
$app.DisplayAlerts = $FALSE
$wb = $app.Workbooks.Open("Excel a abrir")
$wb.Name
$wb.RefreshAll()
Start-Sleep -s 10
$wb.Save()
$wb.Saved = $true
$wb.Close()
$app.Quit()
Este script de Prowershell abre la hoja de cálculo, la actualiza y la cierra. Hay que
tener en cuenta que la conexión OLAP se actualiza antes que las conexiones de tablas, por
lo que, si se hace referencia con una tabla a los datos de una consulta, no hará falta actualizar
2 veces.
Powershell funciona con objetos, así que se empieza creando el objeto de Excel para
poder abrir la hoja de cálculo, si tenemos que cargar datos de Power Bi con el Excel la
función de abrir en segundo plano no actualiza esos datos. Entre el comando de actualizar,
Refreshall(), y el de guardar la hoja de cálculo, Save(), se añadió una pausa de 10 segundos
para dejar tiempo al Contenedor de Mashup de Microsoft a terminar de procesar la conexión
de datos y así no tener problemas al guardar.
Para un montaje que requiera mostrar listas de datos, como por ejemplo una lista de
clientes para cada uno de los representantes, se generaron varias tablas con los datos de
clientes filtrados para cada representante. Además, se llamó a cada página de la hoja de
cálculo como el representante filtrado, así con este código podemos dividir la hoja de cálculo
en varias para los representantes:
foreach($Worksheet in $wb.Worksheets) {
$ Worksheet.Connections.Item(1).Delete()
if($Worksheet.Name -EQ "REPRESENTANTE1"){
$pp = "E:\DOCS\VENTAS\INFORME REPRESENTANTE1 "+(Get-
Date).year+".xlsx"
$wb.SaveAs("E:\DOCS\VENTAS\INFORME REPRESENTANTE1
"+(Get-Date).year+".xlsx"
Este código barre todas las paginas existentes en la hoja de cálculos, donde, en cada
una, elimina las conexiones existentes, para evitar que cuando un usuario abra la hoja de
cálculo se intente actualicen los datos y les salga un error si no tuviesen permisos de acceso.
Luego comprueba el nombre de la página, si se llama “REPRESENTANTE1”, en este caso,
realizará una serie de pasos para poder guardar la página como un Excel en la carpeta
adecuada, dando acceso al representante solo a su información.
Primero hay que tener en cuenta que este es un proceso reiterado, actualizando
diariamente la hoja de cálculo para proporcionar datos actualizados. En este caso el archivo
resultante se pidió que fuese de solo lectura para que los representantes no pudiesen
modificarlo, así que cada vez que se quiera actualizar es necesario eliminar el estado de solo
lectura, con el código “Set-ItemProperty -path $pp -name IsReadOnly $false”, para después
sobrescribirlo y devolverle el estado de solo lectura.
Para generar archivos PDF de los informes, hay que tener en cuenta el tamaño de lo
que se quiere convertir, ya que si no está bien ajustado el resultado no será el deseado.
foreach($Worksheet in $wb.Worksheets) {
$TARGETDIR = "E:\DOCS\VENTAS"
$Worksheet.
.Range("A1:M33").ExportAsFixedFormat($xlFixedFormat::xlTypePDF,
$TARGETDIR+"\ALBARANES.PDF")
Este montaje está diseñado para, también, guardar los archivos en carpetas anuales,
por lo que a todos los Scripts se les añadieron comandos para guardar en las carpetas del año
actual.
if(!(Test-Path -Path $TARGETDIR)){
New-Item -ItemType directory -Path $TARGETDIR
}
Este código comprueba si existe una carpeta con el nombre de la variable
$TARGETDIR, esta variable es el nombre de la carpeta, creándola si no existe. A la variable
se le añadió el comando (Get-Date).year para que el nombre a buscar contenga el año actual,
creándose así una carpeta nueva cada año de forma automática y guardándose en esta los
archivos de este año.
Hasta ahora todos estos procesos guardan los archivos en carpetas compartidas en el
servidor que ya ese era el montaje anterior cuando el proceso era manual. Pero también es
posible, mediante Powershell, enviar los archivos generados por correo:
$SMTPClient.Send($SMTPMessage)
Este código utiliza el servidor API de SMTP de Microsoft 365 para enviar el correo
sin necesidad de utilizar Outlook en el servidor. Este código, sin embargo, no encripta la
contraseña del usuario, para ello habría que usar:
$pass = Get-Content "C:\Folder\Password.txt" | ConvertTo-SecureString -AsPlainText -
Force
Este método resultaba muy útil en el sentido de que se pueden agrupar los scripts que
se actualizan con la misma periodicidad en la misma tarea programada, en el orden deseado.
Además, te aseguras de que hasta que un proceso no termine uno de ellos el siguiente no se
ejecuta, esto resulta extremadamente útil si tienes Excel que dependan de otros, y para
reducir la carga del servidor evitando que cargue a la vez 2 Excel que tengan consultas con
grandes volúmenes de datos.
Este flujo desarrollado en el trabajo es una versión antigua del que está funcionando
actualmente en la empresa. Debido a que esa versión contiene una gran cantidad de
personalizaciones para solucionar los reenvíos al buzón de tratado que se comentó
anteriormente.
Para este caso se sabe que, aunque existen también caracteres que no son números, hay
como mínimo 5 números seguidos en el código. Este simple detalle permite reducir
enormemente la lista de posibles códigos, acelerando el procesado de cada correo.
Al final el primer bloque quedo como se ve en la figura 6.10:
toUpper(triggerBody()?['subject'])
• Inicializar variable ARRAY QUITAR: Esta variable consiste en la lista de
caracteres que se eliminarán del asunto y del cuerpo. Si los códigos solo pudiesen
contener números aquí se podrían añadir todos los caracteres del alfabeto para que
quedasen solo los números.
• Los siguientes dos bloques se encargan de pasar a través de cada variable del array
de quitar y eliminarlos del asunto. Este proceso se reproduce con el cuerpo del
correo.
replace(variables('ENTRADA ASUNTO'),item(),' ')
• NUMERO REENVIOS: Esta variable marca el número de veces que se ha
detectado una coincidencia y se ha reenviado el correo tratado. Esta parte es
importante ya que, en el cuerpo del correo, y en los archivos adjuntos, se quiere
saber si se encontró más de una coincidencia, por políticas de la empresa.
• CADENAS DE NÚMEROS ASUNTO Y CUERPO: Estos dos bloques cogen la
cadena después de habérsele eliminado los caracteres deseados y se divide en una
serie de matrices separando por los espacios. De esta manera si es texto es, por
ejemplo ‘Código 1234567’, este bloque acabara con 2 elementos: Código y
1234567.
split(uriComponentToString(replace(uriComponent(variables('ENTRADA ASUNT
O')), '%0A', ' ')), ' ')
Además, los retornos de carro dejan \r\n en la cadena de texto, para eliminarlo del
asunto y del cuerpo se pasa a formato URI, se reemplaza el código %0A,
correspondiente al retorno de carro, y se devuelve al formato original
• FILTRADO DE ASUNTO Y CUERPO: Por último, en cuatro bloques, dos para
asuntos y dos para el cuerpo, se filtran solo aquellos que, una vez eliminados todos
los caracteres que sean números, contienen al menos 5 números seguidos.
{
"inputs": {
"from": "@variables('CADENA NUMEROS ASUNTOS')",
"where": "@greaterOrEquals(length(replace(replace(replace(replace
(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(r
eplace(replace(replace(replace(replace(replace(replace(replace(replace(re
place(replace(replace(replace(replace(replace(replace(replace(item(), 'A'
, ''), 'B', ''), 'C', ''), 'D', ''), 'E', ''), 'F', ''), 'G', ''), 'H', '
'), 'I', ''), 'J', ''), 'K', ''), 'L', ''), 'M', ''), 'N', ''), 'Ñ', ''),
'O', ''), 'P', ''), 'Q', ''), 'R', ''), 'S', ''), 'T', ''), 'U', ''), 'V
', ''), 'W', ''), 'X', ''), 'Y', ''), 'Z', ''), '-
', ''), '_', ''), '.', ''), ',', ''), '/', ''), '\\', ''), '%', ''), '&',
''), '[', ''), ']', ''), '(', ''), ')', '')), 5)"
}
}
El segundo bloque se asegura que el código resultante contiene otros caracteres que
no sean 0.
LICENCIA PRECIO
Microsoft 365 E3 19,70 €/mes/usuario
30,40 €/mes
Precio final +
27,70 €/mes/usuario
7.- PROBLEMAS
Al realizar los proyectos de automatización surgieron varios problemas, algunos más
graves que otros, que ralentizaron e incluso cambiaron por completo el enfoque que se tenía
sobre cómo realizarlo. Entre ellos, el más importante de todos es que al utilizar herramientas
proporcionadas por Microsoft, que, aunque aceleran y facilitan la realización del proyecto,
te encuentras limitado a las opciones de configuración de dicha herramienta. Si necesitabas
más de ella te ves forzado a sacrificar algo a cambio, ya sea velocidad del proceso o la
sencillez que podría haber tenido, o a tener que programar una extensión tú mismo si no lo
ha hecho la comunidad.
Un ejemplo muy importante de este hecho es al usar Power Automate, al ser un
programa basado en bloques si no existe un bloque o una función que haga lo que necesitas
te ves obligado a improvisar, usando una herramienta distinta o un programa de terceros.
Con este problema hay muchas posibilidades: que exista un conector de otra empresa
asociada con Microsoft que te proporcione lo que necesites, como el caso de realizar un OCR
a un PDF, o tienes que renunciar a esa idea y realizarlo de otra forma.
Además, te encuentras atado a las políticas y cambios de Microsoft, pues ellos tienen
la última palabra a la hora de tomar las decisiones.
Respecto a usar Excel como intermediario para recoger los datos, aunque es una
herramienta muy útil para muchas situaciones, presentó a lo largo del desarrollo de los
proyectos una serie de problemas.
• La actualización en segundo plano no funciona con datos obtenidos de un
servidor SQL. Lo que obligaba a abrir físicamente el Excel para poder
actualizar la consulta con la base de datos, haciendo necesaria una cuenta
específica para el proceso para que trabajadores no puedan interferir en la
actualización ni les paren el trabajo. Esto también impedía que el programador
de tareas ejecute las tareas en segundo plano, obligando a dicha cuenta a estar
Figura 7.1- Error porque el Mashup no termino la conexión con el Excel (arriba) y Excel intentando
guardarlo con otro nombre (abajo).
Este error, además de significar también que puedes no tener permisos sobre el
Excel, es el mismo error que si intentas guardar un Excel que tiene otra persona
abierta (problema que suele pasar al trabajar en carpetas compartidas). Lo que
quiere decir que el proceso “Mashup” no libera el proceso del todo cuando se
termina de actualizar una conexión OLAP y produce este error.
Para arreglar este problema fue necesario modificar el código, guardándolo con
un nombre distinto, como por ejemplo “exceltrabajado_backup”, para luego
abrirlo y devolverlo al original, alargando el tiempo del proceso (pero no
mucho si evitas actualizar las conexiones cuando abres el segundo Excel):
…
$wb.SaveAs("E:\DOCS \ exceltrabajado_backup.xlsx")
…
$wb.Close()
$app.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($app)
#Y tras cerrar el Excel de trabajo abrimos el nuevo creado.
$app = New-Object -comobject Excel.Application
$app.Visible = $True
$app.DisplayAlerts = $FALSE
$wb=$app.Workbooks.Open("E:\DOCS \exceltrabajo_backup.xlsx")
$wb.Name
$Worksheet = $wb.Worksheets.item(1)
$wb.SaveAs("E:\DOCS \exceltrabajo.xlsx")
$wb.Saved = $true
$wb.Close()
$app.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($app)
Power Bi, aunque no presento muchos problemas a la hora de su uso, al ser sencillo de
manejar a bajo nivel, el número limitado de módulos a tu disposición y su baja
personalización llevó a producir dificultades y a tener que buscar alternativas mucho más
complicadas de lo normal (como los métodos explicados en el punto 6.1 para mostrar
información adicional de un código). Además, el hecho de necesitar Power Bi Pro por cada
usuario que quiera acceder al informe con un enlace o iframe, a no ser que se haga público,
limita mucho su uso en empresas con muchos trabajadores pero que no quieran gastarse más
al mes por usuario.
Por último, aunque el script de enviar correo correos electrónicos con los informes
adjuntos funcionó durante 2 meses, empezó a fallar hasta que finalmente dejaron de enviarse
los correos, así que se decidió cambiar al método de envío directo. Que consiste en utilizar
el punto final MX del dominio contratado con Microsoft para sustituir al servidor SMTP de
office 365 para enviar el correo, como explica Microsoft en la figura 7.2.
8.- MEJORAS
Los desarrollos mostrados en este trabajo provienen de la experiencia que he obtenido
trabajando solo en proyectos de este ámbito para distintas empresas con distintas situaciones,
desde el tipo de servidores SQL que usaban hasta el tipo de salidas de información que
esperaban.
Por lo tanto, hay montajes que se realizaron, en su momento, creyendo que eran la
mejor solución, pero de los que surgieron problemas con el tiempo. Algunos hasta meses
después de ponerse en marcha que, aunque no resultaban en problemas visibles ni
incorregibles, demostraron que había mucho en lo que se podía mejorar.
#Comandos a realizar
}
Catch {
El primer bloque dentro del Try seria el mismo código usado hasta ahora que realizaría
la misma función de antes, si no se produce ningún problema el proceso se terminará sin
diferencia. Pero en el momento en el que se produzca un mensaje de error que saldría en el
interfaz de Powershell, se pasará a segundo bloque donde se tratará el proceso en caso de
error.
Con esto podemos realizar maniobras de control estándar para cualquier tipo de error,
como: cerrar todas las estancias de Excel, de Mashup y enviar un correo avisando del error
que se ha producido.
Además, este comando permite poner varios ‘Catch’ seguidos. De forma que si poner
‘catch [ERROR.ESPECIFICO]’ solo se entrara en ese ‘Catch’ si se cumple el tipo de error
marcado entre los corchetes, por lo que si sabemos el tipo de error podemos actuar
adecuadamente y no necesitar enviar un correo de aviso si no es un error que lo requiera.
Una cosa que tener en cuenta con este comando es que solo se pasa a los catch los
errores ‘terminales’. Así que errores que Microsoft no considere terminales no se trataran,
una manera de solucionarlo es añadir -ErrorAction Stop después de los comandos que
puedan producir error, esto hará que si se produjese un error en la línea del script que
contiene este comando se saltaría al ‘Catch’ que no tenga ningún error especificado.
Powershell también cuenta con módulos instalables que le permiten acceder a archivos
de Sharepoint y Onedrive desde la web, sin necesidad de instalarlo en el servidor o de
configurar la cuenta. Esto podría aliviar la carga de datos del servidor realizando el Query
desde Power Automate y después accediendo a los datos desde Powershell y, con una
programación más avanzada orientada a modificar el contenido del Excel, transformar los
datos y crear los informes sin tener que lanzar una conexión OLAP.
En cuanto a Power Bi, aparte de construir los informes de una manera más eficiente,
existe una opción mucho más avanzada pero que no se tuvo en cuenta en el trabajo, ya que
estos proyectos estaban orientados a pequeñas o medianas empresas que querían emprender
el primer paso a digitalizar su trabajo y el precio de esta opción se disparaba. Pero, con los
avances de Microsoft con Azure y sus recientes reducciones de precios, se puede considerar
que esta opción pronto dejara de estar fuera del alcance de muchos: Power Bi Embedded, el
cual Microsoft representa con la imagen 8.1.
9.- CONCLUSIONES
En este proyecto se ha hablado de la importancia de manejar la información del
mercado, pues quien analice mejor los datos obtenidos podrá tomar las decisiones más
optimas y controlar el mercado. Pero para poder realizar algoritmos de aprendizaje y poder
prever lo que va a suceder en el futuro, es esencial, en primer lugar, aprovechar la
información generada, un hecho que muchas empresas ni siquiera realizan. Es por eso por
lo que el enfoque de este trabajo ha sido el de realizar el primer paso hacia este futuro.
Empezando por las representaciones simples de datos, en forma de automatizaciones de
procesos, para ayudar a empresas a entender las grandes posibilidades que proporciona la
digitalización de estos.
Para ello se han utilizaron, como base, únicamente herramientas de Microsoft, una
compañía conocida por todos y con la que se tiene un buen nivel de confianza, como para
que las empresas le permitan, en primer lugar, manejar la delicada información de sus bases
de datos. Y, aunque se encontraron varios problemas durante el proceso, como se explicó en
el proyecto, se llegaron a realizar, con satisfacción para la empresa, automatizaciones útiles,
las cuales, además de evitar errores humanos que surgían cuando tenían que producir los
informes a mano, les quitaban una enorme cantidad de trabajo esencial pero tedioso a las
empresas. La sorpresa de algunas llegaba hasta el punto de, una vez se terminaba una
automatización, organizar la digitalización de un proceso distinto, acercándose poco a poco
a ese futuro que es la industria 4.0.
10.- BIBLIOGRAFIA
[1] LEE, Jay, et al. Service innovation and smart analytics for industry 4.0 and big data
environment. Procedia Cirp, 2014, vol. 16, no 1, p. 3-8.
[2] STOCK, Tim; SELIGER, Günther. Opportunities of sustainable manufacturing in
industry 4.0. Procedia Cirp, 2016, vol. 40, p. 536-541.
[3] HEEKS, Richard. Do information and communication technologies (ICTs)
contribute to development?. Journal of international development, 2010, vol. 22, no 5, p.
625-640.
[4] EVANGELOS A, Kosmatos; NIKOLAOS D, Tselikas; ANTHONY C,
Boucouvalas. Integrating RFIDs and smart objects into a UnifiedInternet of Things
architecture. Advances in Internet of Things, 2011, vol. 2011.
[5] USTUNDAG, Alp; CEVIKCAN, Emre. Industry 4.0: managing the digital
transformation. Springer, 2017.
[6] SHARMA, Shree Krishna; WANG, Xianbin. Live data analytics with collaborative
edge and cloud processing in wireless IoT networks. IEEE Access, 2017, vol. 5, p. 4621-
4635.
[7] GANDOMI, Amir; HAIDER, Murtaza. Beyond the hype: Big data concepts,
methods, and analytics. International journal of information management, 2015, vol. 35, no
2, p. 137-144.
[8] DING, Kai; JIANG, Pingyu. RFID-based production data analysis in an IoT-enabled
smart job-shop. IEEE/CAA Journal of Automatica Sinica, 2017, vol. 5, no 1, p. 128-138.
[9] NICOLALDE, Fabián Constante, et al. Big Data analysis tools in IoT and their
challenges in open researches. En 2018 13th Iberian Conference on Information Systems
and Technologies (CISTI). IEEE, 2018. p. 1-6.
[10] THOMAS, Stephen. SSL and TLS essentials. New Yourk, 2000, vol. 3.
[11] BADIOZAMANY, Sobhan. Microsoft SQL server OLAP solution-A survey. 2010.
[12] EASTWICK, Michael W.; MISKIN, Gregory K. Integration of legacy database
management systems with ODBC-compliant application programs. U.S. Patent No
6,240,417, 29 Mayo 2001.
[13] DARUWALLA, Feisal Y.; FORSTER, James R.; LITWACK, Mark W. Technique
and apparatus for using node ID as virtual private network (VPN) identifiers. U.S. Patent
No 6,693,878, 17 Feb. 2004.
[14] NAJAFABADI, Maryam M., et al. Deep learning applications and challenges in big
data analytics. Journal of Big Data, 2015, vol. 2, no 1, p. 1.