postman dynamics 365 for finance and operations azure active directory

Consumir Servicios REST y OData en #MSDyn365FO desde Postman (2/2)

En el anterior artículo pudimos ver toda la configuración que necesitamos realizar en Azure Active Directory y en Microsoft Dynamics 365 for Finance and Operations para ser capaces de realizar integraciones utilizando para ello servicios REST u OData.

Ahora, vamos a ver los (sencillos) pasos a realizar para poder consumir estos servicios desde Postman. Como ya comentamos en el artículo anterior, lo primero que debemos hacer es instalar Postman, el cual se puede descargar desde este enlace.

Una vez tengamos Postman listo para usar, haremos la primera de las llamadas que necesitamos. Recordad que dijimos que iban a ser dos peticiones, la primera contra Azure AD para conseguir la autorización que nos permita conectar con el ERP y la segunda contra el recurso, en nuestro caso MSDyn365FO, para llevar a cabo la acción en si, tal y como podemos ver en la siguiente imagen.

Ahora, vamos a configurar esta primera petición. Será una llamada POST contra Azure Active Directory, en la que indicaremos todos los datos necesarios en el Body. Para configurarla necesitaremos los siguientes datos:

  • URL: https://login.microsoftonline.com/axazure.com/oauth2/token donde axazure.com es el Tenant Id para mi aplicación
  • Client Id: 642eda97-a3fe-4f4f-b519-d284c10d8d2b que es el Id. de la aplicación de AAD que creamos en el anterior post.
  • Client Secret: Clave secreta que configuramos también en la creación de la aplicación de AAD
  • Resource: El recurso es la URL de nuestra instancia del ERP. Nota: hay que poner la dirección del ERP pero sin la barra ( / ) del final.

Una vez que rellenemos estos datos en Postman nos quedará algo parecido a esto:

Ahora pulsamos el botón Send, y recibiremos una respuesta similar al siguiente JSON, en el que encontraremos el token de acceso a nuestro ERP, el cual, tendrá validez durante los próximos 3600 segundos (una hora).

El siguiente paso será configurar la segunda petición, que será la acción que queramos realizar. Tendremos que realizar una petición de tipo GET, POST, PATCH… dependiendo de la acción que necesitemos. En este caso vamos a realizar una llamada para obtener los Grupos de clientes que tenemos configurados en el sistema, por lo que la haremos de tipo GET.

Para hacer esta llamada, utilizaremos la entidad de datos CustomerGroups, a la que podemos acceder haciendo una llamada GET a la siguiente URL: https://jatomas.sandbox.operations.dynamics.com/data/CustomerGroups. A esta llamada le añadiremos el token de acceso que hemos recibido con la primera de las peticiones, quedando en Postman de la siguiente manera:

Volvemos a darle al botón Send para ejecutar la petición, y como podemos observar, el resultado es satisfactorio, puesto que recibimos una respuesta con estado 200 (OK), lo que significa que hemos obtenido acceso a MSDyn365FO consiguiendo consultar los datos de los Grupos de clientes vía OData. La respuesta que heoms recibido es la siguiente, en la que podemos ver los datos que hemos obtenido sobre los grupos de clientes:

Y hasta aquí esta breve serie de posts en la que hemos visto como, de una forma realmente sencilla, somos capaces de realizar toda clase de pruebas para consultar datos en MSDyn365FO o para ejecutar acciones.

Para más info sobre como consumir servicios REST y OData, podéis consultar la fantástica documentación que tiene Microsoft dentro del sitio docs.microsoft.com o a través del siguiente link.

PD: Como podréis imaginar, no soy ningún experto en la utilización de Postman, simplemente lo he usado para probar mis desarrollos, y la configuración que he realizado del mismo es bastante «rudimentaria» puesto que se puede trabajar dentro de el con todo tipo de entornos y variables que facilitan mucho más la configuración. Podéis consultar todo lo que necesitéis en la propia documentación oficial a través de este enlace.

23 comments / Add your comment below

      1. Hola Juan Antonio, ahora me topo con querer hacer una actualización en una entidad, entiendo que para hacerla con postman, debería ser con PATCH, pero me manda error de «More than one resource was found when selecting for update.» y en el body estoy enviando:
        {
        «RateTypeName»: «ESPAÑA»,
        «FromCurrency»: «GBP»,
        «ToCurrency»: «MXN»,
        «StartDate»: «2020-04-25T12:00:00Z»,
        «RateTypeDescription»: «Tipo de cambiO España»,
        «Rate»: 19.5,
        «ConversionFactor»: «One»
        }

  1. Hola, tengo la misma configuracion hecha pero postman me devuelve 403 – Forbidden. Tuviste este problema en algun momento? Gracias

    1. Buenas Leonel,
      Dos comprobaciones. Primero asegúrate que le has dado a Conceder permisos para que la aplicación tenga permisos para conectar con el ERP.
      Segundo, hay un nuevo parámetro, dentro de la aplicación de AAD, en el apartado de autenticación, verás un punto que pone «Tipo de cliente predeterminado. Trate la aplicación como cliente público.» Prueba a marcar ese check con el valor Sí. Disculpa por no ponerlo en el artículo, pero las opciones de azure cambian realmente rápido.
      Revisa si con eso solventa y me comentas el resultado.
      Un saludo y gracias por la visita!

      1. Gracias por la rapida respuesta!. Verifique y esta con el valor «Si», tambien en la parte de permisos me figuran las 3 opciones como concedidas para el tenant al que pertenece mi usuario.

          1. Si, tiene concedido los permisos. Por lo que estuve investigando, OAuth2 no usa los mismos permisos que user and password, y por lo tanto habria que configurar diferente los permisos para que el token los tenga. Actualmente si logueo con user and password, me devuelve una lista de permisos. Pero con client_credentials, si reviso el accessToken, no tiene ningun rol ni privilegio asignado. Sigo investigando esto, pero al parecer viene por ese lado. Nose si lo habran cambiado despues de tu post, pero no estoy encontrando solucion por el momento

          2. Pues revisa todo bien, porque tal y como indico en el post debería de seguir funcionando, de echo, nosotros lo estamos utilizando actualmente.

  2. Super buena la Pagina he aprendido mucho ya que recién estoy aprendiendo del ERP. gracias..
    Pero como ya te dije recien estoy aprendiendo hice todo el ejemplo pero la respuesta de la entidad SalesInvoiceHeadersV2 me sale que no se pueden hacer insert, update ni delete que es solo lectura ¿Cómo puedo agregar una factura en el ERP?

    1. Hola Claudio, muchas gracias por tus palabras!. Efectivamente, para hacer una factura de ventas, no es posible «crearla» sin más, es un procedimiento más complejo en el que tienes que partir de un pedido de venta, y facturarlo. Si necesitas facturar los pedidos a través de OData, puedes hacer una acción de OData que reproduzca el procedimiento de facturar y consumirla desde fuera. Las acciones de OData no son más que métodos en las propias entidades que van decorados con el atributo [SysODataAction]. Un saludo!

  3. Hola, tengo el siguiente problema, tengo una entidad que tiene grandes volumen de datos, cuando hago una consulta se demora mucho, fui paginando la consulta trayendo de 1000 registro y se demoraba al rededor de un minuto y medio, a media que iba avansando tuve que ir bajando la cantidad de 1000 a 100 y de 10 lo que haceinviable la respuesta. Existe alguna forma de optimizar la entidad para grandes volumenes de datos.

    1. Buenos días Claudio,
      Lo cierto es que la consulta de entidades via OData para un gran volumen de datos no tiene buen rendimiento. Qué entidad concreta estas consultando? Quizá no hayas establecido la mejor estrategia para el propósito que persigues.

      1. hola,
        tu eres mi ultima salvación jajaja, tengo esta entidad CustomerPaymentJournalLines
        y estoy haciendo un PUT urlDynamic/CustomerPaymentJournalLines(dataAreaId=’FD’,JournalBatchNumber=’FD-047216′,LineNumber=1)?cross-company=true
        y el el cuerpo tengo esto
        {
        «AccountType»: «Ledger»,
        «AccountDisplayValue»: «1109209»,
        «CurrencyCode»: «CLP»,
        «JournalBatchNumber»: «FD-047216»,
        «LineNumber»: 1,
        «dataAreaId»: «FD»
        }

        y el error que me muestra es:
        {
        «error»: {
        «code»: «»,
        «message»: «An error has occurred.»,
        «innererror»: {
        «message»: «update not allowed for field ‘MarkedInvoice'»,
        «type»: «Microsoft.Dynamics.Platform.Integration.Services.OData.ODataSecurityException»,
        «stacktrace»: » at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.UpdateProcessor.UpdateEntity_Save(ChangeOperationContext context, ChangeInfo changeInfo)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.ChangeInfo.b__1_0(ChangeOperationContext operationContext)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.ChangeInfo.ExecuteActionsInCompanyContext(IEnumerable`1 actionList, ChangeOperationContext operationContext)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.ChangeInfo.TrySave(ChangeOperationContext operationContext)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.UpdateManager.SaveChanges()\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.AxODataDelegatingHandler.d__3.MoveNext()»
        }
        }
        }

        Como puedo actualizar

        1. Buenas Claudio,
          El error es bastante claro, no se puede modificar el campo «MarkedInvoice», pero también está claro que tu no estás mandando ese campo en el body para actualizar.
          Dos cosas, primero, prueba a realizar la actualización con una operación de tipo PATCH en lugar de PUT. Por ejemplo, cuando lanzas un flow de Microsoft Power Automate a actualizar registros en D365FO mediante el conector estándar, el flow lanza un patch contra el registro.
          Por otro lado, me puedes decir la versión de la aplicación que estás utilizando. Con eso, intentaré hacer una prueba a ver si encuentro algo.
          Por último, decirte que me he encontrado en situaciones en las que las entidades hacían cosas raras como esta que te está ocurriendo, y que finalmente tuvimos que abrir un caso de soporte porque era un bug, y lo arreglaron en siguientes versiones.
          Un saludo!

  4. Gracia, ja.Tomas, por la respuesta, pero esa era una alternativa a una solución que estoy tratando de hacer.
    la version es:
    Versión de producto instalada: 10.0.11 (10.0.464.10002)
    Versión de plataforma instalada: Update35 (7.0.5644.35548)

    pero en realidad quiero hacer esto por integracion ya sea postman o LogicApp
    url: xxxx/Data/CustomerPaymentJournalLines
    {«AccountDisplayValue»: «BSANT»,
    «AccountType»: «Bank»,
    «CreditAmount»: 0,
    «CurrencyCode»: «CLP»,
    «DebitAmount»: 0,
    «DefaultDimensionsForAccountDisplayValue»: «|||OPERACIONAL|||||||»,
    «JournalBatchNumber»: «FD-047304»,
    «LineNumber»: 2,
    «dataAreaId»: «FD»
    }
    y el error que me muestra es
    «error»: {
    «code»: «»,
    «message»: «An error has occurred.»,
    «innererror»: {
    «message»: «Field validation failed on table of type ‘CustomerPaymentJournalLineEntity’ for the following fields: AccountType. Infolog: Warning: El tipo de cuenta Banco no es válido..»,
    «type»: «Microsoft.Dynamics.Platform.Integration.Services.OData.AxODataFieldValidationException»,
    «stacktrace»: » at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.UpdateProcessor.CreateEntity_Save(ChangeOperationContext context, ChangeInfo changeInfo)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.UpdateManager.c__DisplayClass6_0.b__1(ChangeOperationContext context)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.ChangeInfo.ExecuteActionsInCompanyContext(IEnumerable`1 actionList, ChangeOperationContext operationContext)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.ChangeInfo.TrySave(ChangeOperationContext operationContext)\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.Update.UpdateManager.SaveChanges()\r\n at Microsoft.Dynamics.Platform.Integration.Services.OData.AxODataDelegatingHandler.d__3.MoveNext()»
    }
    }

    sin embargo si ingreso al dynamic puedo hacer el ingreso
    con dos lineas
    una donde va el cliente y la factura
    y la otra método de cobro que es banco.

    por integración me deja hacer en una linea el cliente factura y la contrapartida banco

    1. Buenas Claudio, efectivamente, estoy viendo que la entidad CustomerPaymentJournalLineEntity tiene una validación que no te permite poner un Tipo de cuenta distinto de cliente, ni te permite poner un tipo de cuenta de contrapartida distinto de Banco o Contabilidad, por lo que tiene pinta que solo se puede hacer con la contrapartida en la misma línea.

      Que tipo de diario utilizas desde la UI para generar el asiento?.

Responder a Juanan Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR

Aviso de cookies