Hola a todos. En este artículo daré algunos tips cruciales para que tus flujos sean rápidos y sobre todo óptimos.
A la hora de hacer un flujo con Power Automate hay una serie de puntos muy importantes: Orden, control de errores, optimización, velocidad, etc.
En este artículo quiero hacer hincapié en 1 de ellos, la optimización.
Este suele ser el gran olvidado, especialmente si tenemos pocos flujos. Esto es normal, pues podríamos pensar, si un flujo funciona y además lo hace rápido ¿Para qué voy a optimizarlo más?
Y si bien este razonamiento puede parecer correcto, cuando nos encontramos en situaciones con grandes volúmenes de datos (muchas filas, muchas operaciones, muchos flujos que funcionan con la conexión del mismo usuario, etc.) la cosa cambia. Pues puede darse el caso, de que, de repente, nuestro flujo empiece a funcionar mucho más despacio y no entendamos el por qué.
El motivo de esto puede ser porque hayamos hecho demasiadas peticiones a la API que estemos usando y hayamos alcanzado su límite. Si no sabes de lo que te hablo, te sugiero mirar estos enlaces:
Un momento ¿Peticiones? Si no estoy haciendo ninguna llamada HTTP ¿o sí?
Cuando estamos usando un conector de Power Automate, es decir una de sus cajitas en este caso el conector de Dataverse, por debajo lo que estamos haciendo es una llamada HTTP, con lo cual, si metemos un conector, por ejemplo, el de CREAR UNA FILA dentro de un bucle que realiza 4000 vueltas, estaremos haciendo la friolera de 4000 llamadas a la API.
¿Y cómo podríamos optimizar esto?
Haciendo uso de las funciones de BATCH que la api de DV ofrece, por ejemplo, para actualizar, crear o borrar. En este ejemplo voy a mostrar como crear hasta 1000 registros con una sola petición.
Lo primero es obtener la url del Entorno en el que voy a escribir, para ello pulso en el engranaje y en Recursos de desarrollador.
A continuación, copiamos el valor
que aparezca justo debajo de “Extremo de la API web”.
Una vez lo tengamos ya podemos ponernos con nuestro flujo.
Como veis en la imagen, la primera acción (sin contar el desencadenador) es un compose donde pondremos un json con los siguientes parámetros:
SiteAddres: Aquí pegaremos el recurso que copiamos anteriormente.
ListName: Aquí colocaremos el nombre de la lista sobre la que vayamos a hacer la operación, ya sea crear, borrar o actualizar (aunque en este caso tendríamos que modificar ligeramente la llamada).
Acciones: La operación que vayamos a hacer (CreateMultiple, DeleteMultiple, etc).
BatchSize: Con un máximo de 1000 en el caso de DV.
En el siguiente conector estoy obteniendo una serie de filas de una tabla en Azure, pero daría igual si esos datos los obtuviese de una lista de SharePoint, otra tabla de DV, un json, etc.
El siguiente conector en un Select donde estoy generando para cada valor del paso anterior, un json que contiene en el lado izquierdo el campo de la tabla destino y en la parte derecha el valor correspondiente. De tal manera que si en el paso anterior obtuve 300 registros aquí generaré un json con 300 objetos.
En este paso lo importante es que debemos tener el campo ‘@oata.type’ pero si ponemos @ nuestro flujo fallará, posiblemente haya alguna manera de saltarse el carácter y poder colocarlo directamente. Igualmente ponerlo sin @ y en el paso siguiente ponérselo también funciona.
A continuación, tengo un compose que resulta clave, ya que está haciendo 2 cosas, primero cambia ‘odata’ por ‘@odata’ y por otro lado está eliminando los saltos de línea.
replace(replace(string(body('Seleccionar_|_mapear')),'odata','@odata'), '%0A', '')
Por último, hacemos la llamda http con las siguientes cabeceras y teniendo en cuanta una cosa muy importante, en la url el nombre de la lista debe ir en plural, en mi caso con añadirle una ‘s’ al final es suficiente.
Con este método podemos hacer más de mil insert con apenas 2 llamdas y en menos de 10 segundos. Aunque para esta prueba solo inserte unos pocos registros, pero vemos que funciona perfectamente.
¿Y si necesito hacer más de 1000 inserciones?
Para eso podemos hacer uso de algunas funciones como el Select, Take y Skip, aunque para no hacer más largo el post, hablaré de estas funciones en la siguiente entrada. Espero que os sea de utilidad.
Un saludo.
Hi there, just became alert to your blog through Google, and found that it is really
informative. I am going to watch out for brussels.
I will be grateful if you continue this in future.
Many people will be benefited from your writing.
Cheers! Escape room
Thank you very much for your words 🙂