Limitaciones de la API web de Microsoft Dynamics 365

 

Publicado: enero de 2017

Se aplica a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

La API web de Microsoft Dynamics 365 proporcionará paridad completa con las capacidades de servicio de la organización. Para Microsoft Dynamics 365 (en línea y local), este tema describe algunas de las limitaciones.

En este tema

Limitaciones de Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local)

Limitaciones abordadas en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local)

Limitaciones abordadas en Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1

Limitaciones abordadas en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016

Limitaciones de Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local)

En esta sección se proporciona información sobre las limitaciones en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

  • Algunas acciones personalizadas no disponibles en la API web

  • Funciones y acciones que faltan para algunos mensajes de servicio de la organización

Algunas acciones personalizadas no disponibles en la API web

Si define una acción personalizada que incluya un valor de devolución complejo y un valor de devolución simple, una acción correspondiente no está disponible en la API web pero está disponible mediante el extremo de 2011 SOAP. Un valor de devolución complejo es una EntityReference, Entity, o EntityCollection. Puede tener cualquier combinación de valores de devolución simples o un solo valor de devolución complejo.Más información:Crear acciones propias

Funciones y acciones que faltan para algunos mensajes de servicio de la organización

La siguiente tabla enumera los mensajes que no tienen una función o una acción correspondiente después de que se apliquen Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

GrantAccessRequest

ModifyAccessRequest

ReactivateEntityKeyRequest

RemoveMemberListRequest

RemoveItemCampaignRequest

RemoveItemCampaignActivityRequest

Para obtener una lista de las funciones y acciones que faltan de la versión inicial, combine esta lista con la lista de Las funcionalidades y acciones agregadas en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016 y Las funcionalidades y acciones agregadas en Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1.

Limitaciones abordadas en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local)

En esta sección se proporciona información sobre las limitaciones abordadas en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

  • API web no habilitada para Microsoft Dynamics 365 para Outlook con acceso sin conexión mientras el usuario está sin conexión

  • No se pueden consultar valores de fecha

  • Cuando se llama a acciones con parámetros de la colección de entidades, así como otros parámetros, se debe pasar un parámetro de colección como último parámetro en el cuerpo

  • No puede crear un atributo de búsqueda de clientes

  • No se pueden recuperar metadatos sin publicar

Nuevas operaciones agregadas

Las operaciones siguientes se han agregado a la API web para Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

QualifyLead Action

RetrieveByResourcesService Function

RetrieveFilteredForms Function

API web no habilitada para Microsoft Dynamics 365 para Outlook con acceso sin conexión mientras el usuario está sin conexión

Nota

Este problema se aborda en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

El código JavaScript que ese ejecuta en scripts de formularios, comandos de la cinta de opciones, o los recursos web HTML no puede usar la API web. Ahora está habilitado en el servidor local usado cuando el usuario se desconecta.

No se pueden consultar valores de fecha

Este problema no era realmente una limitación, solo un problema de sintaxis. No use comillas simples al especificar una fecha como valor para un filtro.

Cuando consulte una propiedad de fecha, como la fecha de nacimiento de un contacto, la siguiente sintaxis de consulta funciona.

/contacts?$select=fullname,birthdate&$filter=birthdate eq 1990-01-01

La siguiente sintaxis no funcionará:

/contacts?$select=fullname,birthdate&$filter=birthdate eq '1990-01-01'

Cuando se llama a acciones con parámetros de la colección de entidades, así como otros parámetros, se debe pasar un parámetro de colección como último parámetro en el cuerpo

Nota

Este problema se aborda en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

Las acciones siguientes contienen un parámetro de colección de entidades, además de otros parámetros.

AddListMembersList Action

AddPrivilegesRole Action

CompoundUpdateDuplicateDetectionRule Action

DeliverIncomingEmail Action

DeliverPromoteEmail Action

InstantiateTemplate Action

QualifyMemberList Action

ReplacePrivilegesRole Action

SendTemplate Action

SetLocLabels Action

Antes de Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local), cuando use estas acciones, el parámetro que incluye la colección de entidades se debe pasar como último parámetro en JSON o el sistema devolverá un error. Por ejemplo, recibirá un error al usar QualifyMemberList Action y pasar los valores de parámetro de la siguiente manera.

{
"ListMember": [
  {
   "@odata.type": "Microsoft.Dynamics.CRM.account",
   "accountid": "483F8080-6976-E511-9172-0024E8436263"
  },
  {
   "@odata.type": "Microsoft.Dynamics.CRM.account",
   "accountid": "4D3F8080-6976-E511-9172-0024E8436263"
  }
 ],
"OverrideorRemove": true
}

Pero lo siguiente deberá tener éxito.

{
 "OverrideorRemove": true,
 "ListMember": [
  {
   "@odata.type": "Microsoft.Dynamics.CRM.account",
   "accountid": "483F8080-6976-E511-9172-0024E8436263"
  },
  {
   "@odata.type": "Microsoft.Dynamics.CRM.account",
   "accountid": "4D3F8080-6976-E511-9172-0024E8436263"
  }
 ]
}

No puede crear un atributo de búsqueda de clientes

Nota

Este problema se aborda en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

Crear atributo de búsqueda de clientes mediante la API web no es compatible con Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1.

Para crear un atributo de búsqueda de clientes con la API web mediante Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local), vea Crear un atributo de búsqueda de clientes.

No se pueden recuperar metadatos sin publicar

Nota

Este problema se aborda en Actualización de diciembre de 2016 para Microsoft Dynamics 365 (online) y Service Pack de diciembre de 2016 para Microsoft Dynamics 365 (local).

Los mensajes de servicios de la organización que recuperan metadatos incluyen un parámetro RetrieveAsIfPublished que proporciona la opción de devolver definiciones de metadatos que aún no se han confirmado mediante publicación. Esta característica es útil cuando se está creando una aplicación que usaría para editar metadatos y necesitaría para permitir guardar cambios no confirmados. En Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1, todas las operaciones de recuperación con metadatos sólo devuelven los metadatos publicados.Más información:Usar la API web con metadatos de Dynamics 365 y Publicación de personalizaciones.

Limitaciones abordadas en Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1

Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1 han agregado funciones y acciones, y abordan los problemas siguientes con la API web:

  • Las funcionalidades y acciones agregadas en Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1

  • No se pueden filtrar consultas en función del valor de una propiedad de navegación de un solo valor

Las funcionalidades y acciones agregadas en Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1

En la tabla siguiente se muestran las funciones y las acciones agregadas para Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1.

Book Action

Reschedule Action

CalculateRollupField Function

No se pueden filtrar consultas en función del valor de una propiedad de navegación de un solo valor

Nota

Este problema se soluciona parcialmente en Actualización 1 de Microsoft Dynamics CRM Online 2016 y Microsoft Dynamics CRM 2016 Service Pack 1. Ahora puede filtrar consultas en la propiedad de navegación de un solo valor si la propiedad de navegación hace referencia al valor de atributo principal de la entidad a la que se hace referencia.Más información:Filtrar registros en función de propiedad de navegación de un solo valor

Si usa la propiedad de una propiedad de navegación de un solo valor como filtro en una consulta, verá un error 501. Por ejemplo, la siguiente consulta intenta recuperar todas las cuentas donde el valor de la propiedad firstname del contacto principal sea "Renee".

  • Solicitud

    GET 
    [Organization URI]/api/data/v8.0/accounts?$select=name&$filter=primarycontactid/firstname eq 'Renee' HTTP/1.1
    Accept: application/json
    OData-MaxVersion: 4.0
    OData-Version: 4.0
    
  • Respuesta

    HTTP/1.1 501 Not Implemented
    Content-Type: application/json; odata.metadata=minimal
    OData-Version: 4.0
    
    {  
     "error": {    
      "code": "",
       "message": "The query node (0) is not supported",
       "innererror": {      
       "message": "The query node (0) is not supported",
       "type": "Microsoft.Crm.CrmHttpException",
       "stacktrace": 
                            <stacktrace value removed for brevity>
      }  
     }
    }
    

Limitaciones abordadas en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016

Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM Online 2016 tienen capacidades y acciones agregadas, y han abordado los problemas siguientes con la API web.

  • Las funcionalidades y acciones agregadas en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016

  • Error al consultar relaciones de varios a varios que hacen referencia a sí mismas

  • $select puede ignorarse en algunas expresiones $expand

  • Las propiedades de navegación de un solo valor no se pueden devolver desde una consulta $expand si tienen un valor nulo

  • Las consultas FetchXML vinculadas a activitypointer no pueden incluir campos vinculados

  • Las propiedades de valor nulo pueden no devolverse en resultados de propiedad de navegación expandidas

Las funcionalidades y acciones agregadas en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016

En la tabla siguiente se muestran las funciones y las acciones agregadas para Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016.

CheckIncomingEmail Function

FindParentResourceGroup Function

GetQuantityDecimal Function

IncrementKnowledgeArticleViewCount Function

InitializeFrom Function

IsValidStateTransition Function

QueryMultipleSchedules Function

RetrieveAllEntities Function

RetrieveDuplicates Function

RetrieveLocLabels Function

RetrievePrincipalAccess Function

RetrieveRecordWall Function

RetrieveUnpublishedMultiple Function

SearchByBodyKbArticle Function

SearchByKeywordsKbArticle Function

SearchByTitleKbArticle Function

ValidateRecurrenceRule Function

Error al consultar relaciones de varios a varios que hacen referencia a sí mismas

Nota

Este problema se aborda en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016.

Hay dos entidades del sistema con relaciones de varios a varios que hacen referencia a sí mismas: connectionrole EntityType tiene connectionroleassociation_association y campaign EntityType tiene campaigncampaign_association. Si intenta una consulta que usa estas propiedades de navegación valoradas como colección, se espera el siguiente error HTTP Status 400: Reflexive relationship must specify direction using ReflexiveManyToManyRelationship.

Si necesita consultar datos utilizando estas relaciones de varios a varios, puede usar las entidades que se cruzan en su lugar. Para la propiedad de navegación valorada como colección campaigncampaign_association, la entidad campaignitem EntityType es la entidad de intersección especial que define las relaciones. Para connectionroleassociation_association, connectionroleassociation es la entidad de intersección ordinaria que contiene los datos que definen esta relación de varios a varios. Las entidades de intersección ordinarias no se incluyen en la documentación de referencia pero están disponibles en la API web. Puede obtener acceso a la entidad connectionroleassociation mediante este URI: /api/data/v8.0/connectionroleassociations.Más información:Propiedades de navegación valoradas como colección

$select puede ignorarse en algunas expresiones $expand

Nota

Este problema se aborda en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016.

Al recuperar dos propiedades de navegación, si la última propiedad de navegación no tiene opción de consulta $select, todas las propiedades de la primera propiedad de navegación se devuelven. Por ejemplo, si crea la siguiente consulta:

GET 
[Organization URI]/api/data/v8.0/accounts(0495779B-F67F-E511-80C2-00155DB09B03)$select=name&$expand=contact_customer_accounts($select=lastname),opportunity_customer_accounts

Usted espera la propiedad name de la cuenta, lastname de los contactos asociados utilizando contact_customer_accounts y todas las propiedades de las oportunidades asociadas utilizando opportunity_customer_accounts.

Sin embargo, obtendrá todas las propiedades de los contactos así como todas las propiedades de oportunidades relacionadas. Se recomienda usar siempre $select para limitar las propiedades en cualquier operación de recuperación, por lo que seguir esta recomendación le garantizará obtener el máximo rendimiento y no recuperar más datos de los que necesita.

Las propiedades de navegación de un solo valor no se pueden devolver desde una consulta $expand si tienen un valor nulo

Nota

Este problema se aborda en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016.

De acuerdo con la especificación de OData, cuando expande una sola propiedad de navegación y no contiene ningún valor, la propiedad se debe incluir con conjunto nulo. El comportamiento actual es que la propiedad no se incluirá en la respuesta de JSON. En el ejemplo siguiente, se solicita la propiedad de navegación de un solo valor primarycontactid de la cuenta, pero dado que no ningún contacto asociado con esa propiedad de navegación, el valor es nulo.

  • Solicitud

    GET 
    [Organization URI]/api/data/v8.0/accounts(25DD0B31-ED8B-E511-80D2-00155D2A68D4)?$select=name&$expand=primarycontactid($select=fullname) HTTP/1.1
    Accept: application/json
    Content-Type: application/json; charset=utf-8
    OData-MaxVersion: 4.0
    OData-Version: 4.0
    
  • Respuesta esperada

    HTTP/1.1 200 OK
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#accounts(name,primarycontactid,primarycontactid(fullname))/$entity",
     "@odata.etag": "W/\"504724\"",
     "name": "A. Datum Corporation (sample)",
     "accountid": "25dd0b31-ed8b-e511-80d2-00155d2a68d4",
     "primarycontactid": null
    }
    
  • Respuesta real

    HTTP/1.1 200 OK
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#accounts(name,primarycontactid,primarycontactid(fullname))/$entity",
     "@odata.etag": "W/\"504724\"",
     "name": "A. Datum Corporation (sample)",
     "accountid": "25dd0b31-ed8b-e511-80d2-00155d2a68d4"
    }
    

Las consultas FetchXML vinculadas a activitypointer no pueden incluir campos vinculados

Nota

Este problema se aborda en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016.

Al crear una consulta con FetchXML que incluya activitypointer como entidad vinculada, los valores de propiedad serán nulos. Por ejemplo, si usa el siguiente fetchXML:

<fetch version="1.0"
       output-format="xml-platform"
       mapping="logical"
       distinct="true">
  <entity name="account">
    <attribute name="name" />
    <link-entity name="activitypointer"
                 from="regardingobjectid"
                 to="accountid"
                 link-type="inner">
      <attribute name="subject" />
    </link-entity>
  </entity>
</fetch>

Está solicitando el activitypointer relacionado. Valor de subject que se devolverá. Se devuelve con un valor nulo cuando existe un valor real.

  • Solicitud

    GET 
    [Organization URI]/api/data/v8.0/accounts?fetchXml=%3Cfetch%20version=%221.0%22%20output-format=%22xml-platform%22%20mapping=%22logical%22%20distinct=%22true%22%3E%3Centity%20name=%22account%22%3E%3Cattribute%20name=%22name%22%20/%3E%3Clink-entity%20name=%22activitypointer%22%20from=%22regardingobjectid%22%20to=%22accountid%22%20link-type=%22inner%22%3E%3Cattribute%20name=%22subject%22%20/%3E%3C/link-entity%3E%3C/entity%3E%3C/fetch%3E HTTP/1.1
    Accept: application/json
    OData-MaxVersion: 4.0
    OData-Version: 4.0
    
  • Respuesta esperada

    HTTP/1.1 200 OK
    Content-Type: application/json; odata.metadata=minimal
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#accounts(name)",
     "value": [
      {
       "name": "A. Datum Corporation (sample)",
       "activitypointer1.subject": "Task Subject Value"
      }
     ]
    }
    
  • Respuesta real

    HTTP/1.1 200 OK
    Content-Type: application/json; odata.metadata=minimal
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#accounts(name)",
     "value": [
      {
       "name": "A. Datum Corporation (sample)",
       "activitypointer1.subject": null
      }
     ]
    }
    

Más información:Usar FetchXML personalizado

Las propiedades de valor nulo pueden no devolverse en resultados de propiedad de navegación expandidas

Nota

Este problema se aborda en Actualización 0.1 de Microsoft Dynamics CRM Online 2016 y Actualización 0.1 de Microsoft Dynamics CRM 2016.

Cuando una de las propiedades expandidas de una propiedad de navegación valorada como colección es nula, la propiedad ampliada no se incluirá en los resultados. El primer ejemplo muestra los datos cuando uno de los contactos relacionados con una cuenta tiene un valor nulo para la propiedad emailaddress1 expandida. La propiedad emailaddress1 no se devuelve incluso para el contacto donde tiene un valor.

  • Solicitud

    GET 
    [Organization URI]/api/data/v8.0/accounts(25DD0B31-ED8B-E511-80D2-00155D2A68D4)?$select=name&$expand=contact_customer_accounts($select=emailaddress1,lastname,firstname) HTTP/1.1
    Accept: application/json
    Content-Type: application/json; charset=utf-8
    OData-MaxVersion: 4.0
    OData-Version: 4.0
    
  • Respuesta esperada

    HTTP/1.1 200 OK
    Content-Type: application/json; odata.metadata=minimal
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#accounts(name,contact_customer_accounts,contact_customer_accounts(emailaddress1,lastname,firstname))/$entity",
     "@odata.etag": "W/\"504724\"",
     "name": "A. Datum Corporation (sample)",
     "accountid": "25dd0b31-ed8b-e511-80d2-00155d2a68d4",
     "contact_customer_accounts": [
      {
       "@odata.etag": "W/\"504749\"",
       "emailaddress1": null,
       "lastname": "Valdes (sample)",
       "firstname": "Rene",
       "contactid": "8bdd0b31-ed8b-e511-80d2-00155d2a68d4"
      },
      {
       "@odata.etag": "W/\"503647\"",
       "emailaddress1": someone_l@example.com,
       "lastname": "Burk (sample)",
       "firstname": "Susan",
       "contactid": "91dd0b31-ed8b-e511-80d2-00155d2a68d4"
      }
     ]
    }
    
  • Respuesta real

    HTTP/1.1 200 OK
    Content-Type: application/json; odata.metadata=minimal
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#accounts(name,contact_customer_accounts,contact_customer_accounts(emailaddress1,lastname,firstname))/$entity",
     "@odata.etag": "W/\"504724\"",
     "name": "A. Datum Corporation (sample)",
     "accountid": "25dd0b31-ed8b-e511-80d2-00155d2a68d4",
     "contact_customer_accounts": [
      {
       "@odata.etag": "W/\"504749\"",
       "lastname": "Valdes (sample)",
       "firstname": "Rene",
       "contactid": "8bdd0b31-ed8b-e511-80d2-00155d2a68d4"
      },
      {
       "@odata.etag": "W/\"503647\"",
       "lastname": "Burk (sample)",
       "firstname": "Susan",
       "contactid": "91dd0b31-ed8b-e511-80d2-00155d2a68d4"
      }
     ]
    }
    

La siguiente consulta que utiliza directamente la propiedad de navegación valorada como colección contact_customer_accounts sin expandir devuelve los datos esperados.

  • Solicitud

    GET 
    [Organization URI]/api/data/v8.0/accounts(25DD0B31-ED8B-E511-80D2-00155D2A68D4)/contact_customer_accounts?$select=emailaddress1,lastname,firstname HTTP/1.1
    Accept: application/json
    Content-Type: application/json; charset=utf-8
    OData-MaxVersion: 4.0
    OData-Version: 4.0
    
  • Respuesta

    HTTP/1.1 200 OK
    Content-Type: application/json; odata.metadata=minimal
    OData-Version: 4.0
    
    {
     "@odata.context": "
    [Organization URI]/api/data/v8.0/$metadata#contacts(emailaddress1,lastname,firstname)",
     "value": [
      {
       "@odata.etag": "W/\"504749\"",
       "emailaddress1": null,
       "lastname": "Valdes (sample)",
       "firstname": "Rene",
       "contactid": "8bdd0b31-ed8b-e511-80d2-00155d2a68d4"
      },
      {
       "@odata.etag": "W/\"503647\"",
       "emailaddress1": "someone_l@example.com",
       "lastname": "Burk (sample)",
       "firstname": "Susan",
       "contactid": "91dd0b31-ed8b-e511-80d2-00155d2a68d4"
      }
     ]
    }
    

Ver también

Use la API web de Microsoft Dynamics 365
Autenticarse en Microsoft Dynamics 365 con la API web
Tipos y operaciones de API web
Realizar operaciones mediante la API web

Microsoft Dynamics 365

© 2017 Microsoft. Todos los derechos reservados. Copyright