Continuamos con la serie de artículos sobre Power Automate y las distintas operaciones que pueden realizarse sobre Microsoft Dynamics 365 Finance and Operations apps.
Como vimos en el artículo anterior, gracias al conector premium de MSDyn365FO para Power Automate, disponemos de una serie de desencadenadores y acciones para interactuar con nuestro sistema. En este nuevo artículo vamos a empezar a hablar de las acciones, concretamente de las distintas acciones de lectura que existen, que son:
Si quieres aprender más sobre el desencadenador disponible, echa un vistazo a este artículo en el que verás un caso práctico de como lanzar un Cloud Flow de Power Automate cuando un evento de negocio ocurre: No-Code: Extender MSDyn365FO con la Power Platform – Juan Antonio Tomás (jatomas.com)
Obtener lista de entidades
La primera acción que vamos a ver es la de Obtener lista de entidades. Esta es una acción bastante sencilla en la que únicamente debemos indicar un parámetro de entrada, que es la URL de la instancia sobre la que se ejecutará.
El resultado que nos devuelve la ejecución de la misma es bastante precedible, un listado con todas las entidades públicas que tenemos en el sistema, tal y como podemos ver en la siguiente captura.
Si vamos a ver el log del IIS sobre el que estamos ejecutando las operaciones, podemos comprobar que la operación que estamos lanzando sobre el sistema no es más que una llamada GET a la url https://jatomas.cloudax.dynamics.com/data/.
1 |
2020-12-12 07:33:59 GET /data/ - 443 ja.tomas@axazure.com |
Es decir, que el resultado es el mismo que el que obtenemos cuando hacemos una llamada a esa URL desde el propio navegador, solo que en formato JSON.
Obtener un registro
Si lo que queremos es realizar una consulta sobre un registro concreto de la base de datos, podemos utilizar la acción Obtener un registro. Para ello, necesitamos indicar los siguientes parámetros:
- Instancia: Url de la instancia de MSDyn365FO sobre la que queremos actuar.
- Nombre de entidad: Nombre de la entidad sobre la que queremos realizar la consulta (Clientes, Grupos de clientes, Proveedores, Productos…).
- Id de objeto: Identificador único del registro que deseamos obtener.
El Id de objeto, por lo general, está formado por el código de la empresa (dataAreaId), seguido de el valor o valores de los campos que componen la clave primaria de la entidad. Podemos consultar los valores que forman este id de objeto de diferentes formas. Por ejemplo, pongamos que queremos obtener un Grupo de clientes concreto. Una opción sería ir a Visual Studio, buscar la DataEntity CustCustomerGroupEntity y ver los campos que forman la PK de la misma.
Por otro lado, podemos utilizar un pequeño truco dentro de Power Automate, ejecutando la acción únicamente con el código de empresa en el Id de objeto. Obviamente, la ejecución será errónea, pero en el resultado de la misma nos indica cuales son los valores que tenemos que indicar.
En este caso concreto, debemos indicar el DataAreaId y el CustomerGroupId.
IMPORTANTE: Los valores dentro del Id de objeto, deben ir exactamente en el orden indicado, separados por coma ( , ), y sin espacios entre ellos, tal y como vemos en la imagen anterior.
Una vez completados los parámetros correctamente, podemos ver el resultado de la ejecución en el que obtenemos un JSON con todos los datos del grupo de clientes que hemos indicado.
Vamos de nuevo a revisar el log del IIS para comprobar las operaciones que se realizan durante la ejecución.
1 2 |
2020-12-12 08:02:56 GET /data/CustomerGroups(dataAreaId='10',CustomerGroupId='USMF') ja.tomas@axazure.com - 404 2020-12-12 08:07:58 GET /data/CustomerGroups(dataAreaId='USMF',CustomerGroupId='10') ja.tomas@axazure.com - 200 |
Como podemos ver, la ejecución de la acción resulta en una llamada GET sobre la entidad CustomerGroups, pasando por parámetros el código de empresa y el id del grupo de clientes. Aquí podemos comprobar también la importancia del orden de los parámetros. En la primera ejecución el orden no es el correcto, por lo obtenemos un error 404, mientras que en la segunda, la ejecución se realiza de forma satisfactoria y obtenemos un 200.
Limitaciones
Pues sí, esta acción concreta tiene una limitación bastante grande: Solo podemos obtener registros de la empresa que tenemos asociada por defecto en el sistema a través de las preferencias de usuario.
Como todos sabéis, todos los usuarios tienen una empresa a la que se accede por defecto, y que puede ser modificada desde las preferencias del usuario:
¿Qué ocurre si hacemos una consulta sobre una empresa que no es la que tenemos asociada? Pues como podemos ver en la siguiente imagen, así como en el log de IIS, al intentar obtener un registro de una empresa diferente, el sistema devuelve un error 404 – Not found.
1 |
2020-12-12 08:15:37 GET /data/CustomerGroups(dataAreaId='USRT',CustomerGroupId='10') ja.tomas@axazure.com - 404 |
Esto en realidad, no es una limitación de Power Automate como tal, si no un tema relacionado con como gestiona Dynamics 365 las llamadas OData para cambios de empresa. Si realizas la misma llamada directamente en el navegador, verás que el resultado es un array vacío, por lo que tampoco encuentra el registro en cuestión.
¿Cómo podemos solucionar este «problema»? Pues igual que hacemos con X++, para poder consultar datos de distintas empresas, debemos utilizar la sentencia cross-company. Si a la URL anterior, en el navegador, le añades cross-company=true ya te permite realizar búsquedas de las distintas empresas del sistema y filtrar por el dataAreaId, pero, esta acción concreta de Power Automate no nos permite utilizar dicho parámetro, por lo que vamos a ver la última de las acciones de lectura para ver como solventar esta situación.
Muestra los elementos presentes en la tabla
La última de las acciones que vamos a ver hoy es bastante más flexible que la anterior. Por una parte te permite obtener más de un registro de una tabla concreta, y por otra, tiene muchos más parámetros, que ya no tienen tanto que ver con los valores necesarios para buscar un registro en Dynamics 365, sino, con los parámetros u opciones que OData nos brinda para flexibilizar la búsqueda de los mismos.
Lo primero que vamos a ver al seleccionar esta acción es que necesitamos indicar la instancia sobre la que estamos trabajando, así como la entidad sobre la que vamos a buscar, pero además, podemos ver una serie de opciones avanzadas que nos darán la flexibilidad que mencionábamos.
Estas opciones nos van a permitir:
- Aggregation transformation: Nos permite utilizar transformaciones de agregación de OData como sum, max, average…
- Filter Query: Realizar filtros por campos específicos utilizando los operadores para el filtrado como eq (equal), greater than (gt)…
- Order By: Ordenar los resultados que obtenemos por una serie de campos
- Top Count: Obtener los N primeros registros que cumplan con las condiciones indicadas.
- Skip Count: Desechar del resultado los N primeros registros obtenidos. (Utilizando esta opción junto con Top Count podemos obtener valores paginados, teniendo en cuenta que tenemos una limitación de 10k registros por llamada).
- Select Query: Indicar los campos que queremos obtener.
- Cross Company: Obtener registros de distintas empresas.
Aquí puedes obtener más información sobre el uso de OData en Dynamics 365 F&O apps: Open Data Protocol (OData) – Finance & Operations | Dynamics 365 | Microsoft Docs.
Como podéis ver e imaginar, estamos ante una acción mucho más potente que la anterior, y combinando de forma correcta las distintas opciones que avanzadas que tenemos, podemos conseguir que la obtención de los datos sea mucho más rápida y eficiente. Ej: No es lo mismo hacer un select * from table, que indicar la lista de campos que queremos obtener y que necesitamos.
Siguiendo con el ejemplo anterior, ahora si que somos capaces de obtener el Grupo de clientes de una empresa que no es la que tenemos asociada por defecto utilizando las siguientes opciones avanzadas:
A diferencia que con la acción anterior, en este caso podemos esperar obtener más de un registro, por lo que en la acción posterior a esta, Power automate incluye directamente un Apply to each de forma que se ejecute en todos y cada uno de los elementos obtenidos.
Y una vez que ejecutamos el flow, podemos ver como Power Automate «traduce» la ejecución de esta acción a una llamada http en el log de IIS, utilizando los parámetros filter, top, select y cross-company.
1 |
2020-12-12 08:25:08 GET /data/CustomerGroups %24filter=dataAreaId+eq+%27USRT%27+and+CustomerGroupId+eq+%2710%27&%24top=1&%24select=CustomerGroupId%2cDescription&cross-company=true ja.tomas@axazure.com - 200 |
Y podemos ver también, como esta última acción se aplica a cada uno de los elementos obtenidos, y el resultado para cada uno de ellos.
Y con esto lo dejamos por hoy, espero que os haya resultado interesante, y cualquier duda ya sabéis, nos leemos en los comentarios.
Gracias!!
2 comments / Add your comment below