dynamics-crm · microsoft dynamics crm 2016 introducción microsoft dynamics crm ha evolucionado...
TRANSCRIPT
dynamics-crm
#dynamics-
crm
Tabla de contenido
Acerca de 1
Capítulo 1: Empezando con la dinámica-crm 2
Observaciones 2
Versiones 2
Examples 2
Descargar Microsoft CRM SDK 2
Capítulo 2: Acciones de llamada utilizando la API web 3
Introducción 3
Examples 3
Acciones de llamada utilizando la API web 3
Capítulo 3: API web publica ejemplos de JSON 6
Observaciones 6
Examples 6
Creando una nota / anotación con adjunto 6
Creando una cuenta 6
Creando un contacto con un cliente padre 6
Creación de un detalle de cotización 7
Capítulo 4: CRM 2013: Cómo ocultar tipos de actividad no deseados de la subcuadrícula 8
Introducción 8
Examples 8
Añadir esta función a un recurso web javascript 8
Capítulo 5: Error: TurboForms Xrm.Page.data.save (). Then () Errores con ErrorCode "Null", 11
Examples 11
onChange () Llama a save (), desde un campo que no es válido 11
Pasos para reproducir (Turbo Forms, CRM 2015.1, -> CRM 2016.2) 11
Soluciones conocidas: 12
Capítulo 6: Qué no hacer al actualizar su Microsoft Dynamics CRM 2016 13
Introducción 13
Examples 13
Veamos algunos elementos obligatorios para marcar antes de sumergirse en un proceso de act 13
¿Los beneficios de la actualización superan los dolores de cabeza? ¿Vale la pena una actua 14
Capítulo 7: Usando la API web con jQuery 19
Examples 19
Usando la opción verbosa para obtener el conjunto de opciones y los valores de búsqueda 19
Usando select para reducir el número de campos 19
Usando expandir para obtener propiedades de búsqueda 19
Obteniendo cuentas 20
Usando el filtro para filtrar su consulta API 20
Creditos 21
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: dynamics-crm
It is an unofficial and free dynamics-crm ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official dynamics-crm.
The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con la dinámica-crm
Observaciones
Microsoft Dynamics CRM SDK permite a los desarrolladores extender el producto Microsoft Dynamics CRM, agregar nuevas funcionalidades y cumplir con los requisitos.
El SDK le permite operar y comunicarse con la plataforma mediante programación a través de mensajes de servicio web, así como agregar componentes de código personalizados como complementos, flujos de trabajo personalizados y acciones personalizadas.
Microsoft Dynamics CRM proporciona una biblioteca de SDK de JavaScript llamada Xrm en el lado del cliente, que permite ampliar la experiencia y la interfaz del usuario.
Versiones
VersiónVersión SDK
Enlace de descarga
Notas de la versión de enlace
Fecha de lanzamiento
1.0 1.0 2003-01-01
3.0 3.0 2005-12-01
4.0 4.0 Descargar Notas 2007-12-01
2011 5.0 Descargar Notas 2011-02-01
2013 6.0 Descargar Notas 2013-11-01
2015 7.0 Descargar Notas 2014-11-01
2016 (365)
8.0 Descargar Notas 2015-11-01
Examples
Descargar Microsoft CRM SDK
El último SDK se puede descargar aquí
Las últimas bibliotecas de SDK también están disponibles en NuGet bajo la cuenta crmsdk oficial de Microsoft
Lea Empezando con la dinámica-crm en línea: https://riptutorial.com/es/dynamics-crm/topic/1112/empezando-con-la-dinamica-crm
https://riptutorial.com/es/home 2
Capítulo 2: Acciones de llamada utilizando la API web
Introducción
Ejemplos de cómo llamar acciones unidas y no unidas.
Tenga en cuenta que en una función enlazada, el nombre completo de la función incluye el espacio de nombres Microsoft.Dynamics.CRM. Las funciones que no están vinculadas no deben usar el nombre completo.
Examples
Acciones de llamada utilizando la API web
function exampleCloseIncident(id, status){ var parameters = {}; var incidentresolution = {}; incidentresolution["[email protected]"] = "/incidents(" + id + ")"; incidentresolution["@odata.type"] = "Microsoft.Dynamics.CRM.incidentresolution"; parameters.IncidentResolution = incidentresolution; parameters.Status = status; callUnboundAction("CloseIncident", parameters, true, function(result){ Xrm.Utility.alertDialog("Incident closed"); }); } function exampleQualifyLead(id){ var payload = { "CreateAccount": createAccount, "CreateContact": createContact, "CreateOpportunity": false, "Status":3 }; callBoundAction("leads", id, "Microsoft.Dynamics.CRM.QualifyLead", payload, true, function(result){ Xrm.Utility.alertDialog("Lead qualified"); }); } function callUnboundAction(actionname, payload, async, successCallback, errorCallback) { var req = new XMLHttpRequest(); req.open("POST", encodeURI(getWebAPIPath() + actionname), async); req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("OData-Version", "4.0"); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.onreadystatechange = function () { if (this.readyState === 4) { req.onreadystatechange = null;
https://riptutorial.com/es/home 3
if (this.status == 200 || this.status == 204) { if (this.status == 200) { var result = JSON.parse(this.response); } if (successCallback) { successCallback(result); } } else { if(errorCallback) { errorCallback(this); } else{ Xrm.Utility.alertDialog(this.statusText); } } } }; if (payload) { req.send(JSON.stringify(payload)); } else { req.send(); } } function callBoundAction(entitysetname, id, actionname, payload, async, successCallback, errorCallback) { var req = new XMLHttpRequest(); req.open("POST", encodeURI(getWebAPIPath() + entitysetname + "(" + id + ")/" + actionname), async); req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("OData-Version", "4.0"); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.onreadystatechange = function () { if (this.readyState === 4) { req.onreadystatechange = null; if (this.status == 200 || this.status == 204) { if (this.status == 200) { var result = JSON.parse(this.response); } if (successCallback) { successCallback(result); } } else { if(errorCallback) { errorCallback(this); } else{ Xrm.Utility.alertDialog(this.statusText); } } } }; if (payload) {
https://riptutorial.com/es/home 4
req.send(JSON.stringify(payload)); } else { req.send(); } } function getClientUrl() { //Get the organization URL if (typeof GetGlobalContext == "function" && typeof GetGlobalContext().getClientUrl == "function") { return GetGlobalContext().getClientUrl(); } else { //If GetGlobalContext is not defined check for Xrm.Page.context; if (typeof Xrm != "undefined" && typeof Xrm.Page != "undefined" && typeof Xrm.Page.context != "undefined" && typeof Xrm.Page.context.getClientUrl == "function") { try { return Xrm.Page.context.getClientUrl(); } catch (e) { throw new Error("Xrm.Page.context.getClientUrl is not available."); } } else { throw new Error("Context is not available."); } } } function getWebAPIPath() { return getClientUrl() + "/api/data/v8.2/"; }
Lea Acciones de llamada utilizando la API web en línea: https://riptutorial.com/es/dynamics-crm/topic/9607/acciones-de-llamada-utilizando-la-api-web
https://riptutorial.com/es/home 5
Capítulo 3: API web publica ejemplos de JSON
Observaciones
Asegúrese de agregar el siguiente encabezado a la solicitud posterior. De lo contrario la solicitud fallará:
Content-Type: application/json
Examples
Creando una nota / anotación con adjunto
url: /api/data/v8.0/annotations
json:
{ "isdocument": true, "mimetype": "text/plain", "documentbody": "dGVzdA==", "[email protected]" : "/accounts(c6da77b6-d53e-e611-80b9-0050568a6c2d)", "filename": "test.txt" }
Como el objectid puede ser casi todas las entidades en CRM, debe definir la entidad con el nombre de la entidad después del objectid.
Creando una cuenta
url: /api/data/v8.0/accounts
json:
{ "name" : "New account" }
Creando un contacto con un cliente padre
url: /api/data/v8.0/contacts
json:
https://riptutorial.com/es/home 6
{ "firstname" : "New", "lastname" : "Contact", "[email protected]" : "/accounts(c6da77b6-d53e-e611-80b9-0050568a6c2d)" }
Como parentcustomerid puede ser una cuenta o contacto, debe definir el tipo de entidad que desea establecer con _entityname después de parentcustomerid.
Creación de un detalle de cotización
url: /api/data/v8.0/quotedetails
json:
{ "[email protected]": "/products(11c0dbad-91df-e311-b8e5-6c3be5a8b200)", "[email protected]" : "/quotes(69b5e1ae-037f-e611-80ed-fc15b428dcdc)", "[email protected]" : "/uoms(73a5daea-6ddc-e311-a678-6c3be5a8c0e8)", "quantity": 1 }
Lea API web publica ejemplos de JSON en línea: https://riptutorial.com/es/dynamics-crm/topic/6367/api-web-publica-ejemplos-de-json
https://riptutorial.com/es/home 7
Capítulo 4: CRM 2013: Cómo ocultar tipos de actividad no deseados de la subcuadrícula
Introducción
Hace poco tuve que modificar la subcuadrícula de actividad para eliminar ciertos tipos de actividad del menú Agregar actividad.
Tenga en cuenta que esto puede no ser un método compatible sobre cómo hacer esto, pero no hay una forma documentada de hacerlo, así que tuve que encontrar una solución y esto funcionó en CRM 2013 de todos modos.
Examples
Añadir esta función a un recurso web javascript
var _activitiesGridName = ''; function SetupActivityGridOnload(gridName) { var btnsToHide = [ 'AddserviceappointmentButton', 'AddcampaignresponseButton', 'AddappointmentButton' ]; _activitiesGridName = gridName; setTimeout(function () { //setting timeout beacuse subgid take some time to load after the form is loaded if (Xrm.Page != null && Xrm.Page != undefined) { //validating to check if the sub grid is present on the form var grid = Xrm.Page.getControl(_activitiesGridName); if (!grid) { // grid not loaded yet - call function again to recheck after timeout console.log('grid not loaded yet'); SetupActivityGridOnload(_activitiesGridName); } else { // grid loaded now hide unwanted activity buttons var menuItem = null; var parentMenu = null; $.each(btnsToHide, function (i, val) { menuItem = document.getElementByIdval); if (menuItem) { if (parentMenu == null) { // load parent node - if not already loaded parentMenu = menuItem.parentNode; } console.log('removing menu item: ' + val); parentMenu.removeChild(menuItem); }
https://riptutorial.com/es/home 8
else { console.log('menu not found: ' + val); } }); } } }, 2000); }
Luego, llame a la función desde el evento onload agregando el nombre de la cuadrícula como un parámetro similar.
https://riptutorial.com/es/home 9
Lea CRM 2013: Cómo ocultar tipos de actividad no deseados de la subcuadrícula en línea: https://riptutorial.com/es/dynamics-crm/topic/9836/crm-2013--como-ocultar-tipos-de-actividad-no-deseados-de-la-subcuadricula
https://riptutorial.com/es/home 10
Capítulo 5: Error: TurboForms Xrm.Page.data.save (). Then () Errores con ErrorCode "Null", Mensaje "Undefined"
Examples
onChange () Llama a save (), desde un campo que no es válido
Pasos para reproducir (Turbo Forms, CRM 2015.1, -> CRM 2016.2)
El formulario (con o sin otros campos obligatorios) tiene un campo que está vacío y es obligatorio.
1.
Pierda el foco en el campo vacío ("título" en este ejemplo), esto activa el icono de notificación de campo:
2.
Conecte el controlador de cambio en el campo vacío para guardar llamada:3.
function forceSaveOnChangeOfTitle(){ Xrm.Page.data.save().then(
https://riptutorial.com/es/home 11
function () {}, function (error, message) {console.error("Error: " + error + " Message: " + message);} ); }
Introduzca un valor en el campo vacío.4.
Resultado:
Guardar falla Devuelve la llamada al fallo con el número de error "null" y el mensaje "undefined".
•
La Notificación de campo desaparece, pero el mensaje requerido todavía se muestra en la
parte inferior derecha:
•
Soluciones conocidas:
Establecer el valor del atributo a sí mismo:
function forceSaveOnChangeOfTitle(){ var title = Xrm.Page.getAttribute("title"); title.setValue(title.getValue()); Xrm.Page.data.save().then( function () {}, function (error, message) {console.error("Error: " + error + " Message: " + message);} ); }
Use 1ms Timeout con:
function forceSaveOnChangeOfTitle(){ setTimeout(function() { Xrm.Page.data.save().then( function () {}, function (error, message) {console.error("Error: " + error + " Message: " + message);} ); }, 1); }
Lea Error: TurboForms Xrm.Page.data.save (). Then () Errores con ErrorCode "Null", Mensaje "Undefined" en línea: https://riptutorial.com/es/dynamics-crm/topic/4560/error--turboforms-xrm-page-data-save-----then----errores-con-errorcode--null---mensaje--undefined-
https://riptutorial.com/es/home 12
Capítulo 6: Qué no hacer al actualizar su Microsoft Dynamics CRM 2016
Introducción
Microsoft Dynamics CRM ha evolucionado drásticamente en los últimos años. Se han lanzado muchas actualizaciones y versiones, con una serie de nuevas características y mejoras en cada etapa del camino. Durante la actualización de un entorno Dynamics CRM, hay algunos puntos a tener en cuenta para garantizar un proceso de actualización sin problemas.
Examples
Veamos algunos elementos obligatorios para marcar antes de sumergirse en un proceso de actualización a gran escala
Copia de seguridad de base de datos
La copia de seguridad de la base de datos es una necesidad antes de iniciar cualquier proceso de actualización de Dynamics CRM. Esto es obligatorio para tener siempre la opción de retroceder en caso de cualquier obstáculo importante.
Estimación errónea
NO subestime el trabajo involucrado en un proceso de actualización de CRM.
Audite su actual Microsoft Dynamics CRM e identifique las soluciones de terceros en uso. Para estas soluciones de terceros, consulte el sitio web de su desarrollador para ver si es compatible con su versión de actualización de CRM prevista. Descargue la nueva solución y manténgala lista para probar una vez que se haya completado el proceso de migración.
Organización de CRM
NO actualice el CRM a ciegas.
Como primer paso, debemos preparar la organización de CRM para actualizar Microsoft Dynamics CRM.
Algunos consejos para preparar una organización.
Asegúrese de que su entorno CRM cumpla con los requisitos de componentes de software y hardware
Mientras actualiza CRM 4, elimine los registros de la tabla de la lista. (El sistema intentará eliminar todos los registros de las tablas siguientes cuando migramos a CRM 2011, en caso de que falle, tendremos que eliminar manualmente las entradas de estas tablas). Los registros en las
https://riptutorial.com/es/home 13
tablas enumeradas a continuación darán como resultado un rendimiento deficiente. del sistema.
AsyncOperationBase
WorkflowWaitSubscriptionBase
BulkDeleteFailureBase
WorkflowLogBase
DuplicateRecordBase
WorkflowWaitSubscriptionBase
Instale el último paquete acumulativo antes de actualizar CRM. Por ejemplo, para actualizar a CRM 2013, el servidor de CRM 2011 debe estar en el paquete acumulativo de actualizaciones 6, el paquete acumulativo de actualizaciones 14 o un paquete acumulativo posterior antes de que se pueda considerar una actualización. De lo contrario, al actualizar el entorno de Dynamics CRM, se producirá un error.
Para actualizar a MS CRM 2013, use la herramienta de validación de código personalizado para buscar códigos del lado del cliente no compatibles (JavaScript) que no funcionarán después de la actualización. Además, use la herramienta de verificación de características heredadas para detectar cualquier extensión de servidor que use el punto final de 2007 o las características de Microsoft Dynamics CRM 4.0.
Cada nueva versión de Microsoft Dynamics CRM presenta funcionalidades más potentes, pero junto con el atractivo de la última y mejor versión de software, surge la preocupación de cómo el proceso de actualización afectará su negocio.
¿Los beneficios de la actualización superan los dolores de cabeza? ¿Vale la pena una actualización?
Ahora, aquí hay algunos escollos comunes que pueden surgir al actualizar su sistema Dynamics CRM.
La base de datos de la organización seleccionada para la importación es una versión diferente a la base de datos de la organización que actualmente está implementada.
https://riptutorial.com/es/home 14
Para solucionar este problema, debemos instalar UR6 o una versión superior en el entorno MS CRM 2011 al actualizar a MS CRM 2013. Después de esto, la actualización a Dynamics CRM 2016 se puede completar sin problemas
La organización no se puede actualizar.
https://riptutorial.com/es/home 15
Para solucionar este problema, necesitamos instalar SP1 para MS CRM 2013. A continuación, se puede completar la actualización a Dynamics CRM 2016 sin problemas.
Desinstalación del conector de Microsoft Dynamics CRM para los servicios de informes de SQL Server
Para solucionar este problema, desinstale las extensiones de informes de Microsoft Dynamics CRM 2013 desde Programas instalados en el Panel de control antes de continuar con la actualización a Dynamics CRM 2016.
La cuenta de SQL Server Reporting Service es un usuario local y no se admite al actualizar de
https://riptutorial.com/es/home 16
CRM 2013 a CRM 2015
Si el servicio de informes de Microsoft SQL Server 2012 se instaló a través de la configuración predeterminada, entonces la cuenta de servicio está configurada en "ReportServer" - para resolver el problema, abra el Administrador de configuración de Reporting Services y actualice la cuenta de servicio a cualquier otra cosa, como "Sistema local" . Después de esto, no enfrentaremos ninguna inquietud al actualizar a MS CRM 2016.
https://riptutorial.com/es/home 17
Parte de nuestro aprendizaje ha sido simple y lógico, pero muchos pueden renunciar a ellos.
Al actualizar, no se vaya con la actualización, hay muchas características que pueden satisfacer los requisitos actuales de la organización que se implementan a través de la personalización. Estos se pueden modelar de forma inmediata para que se ajusten a los requisitos con versiones posteriores.
Además, tenga en cuenta los componentes de comunicación / integración con los que el sistema heredado o cualquier sistema existente está conectado con Microsoft Dynamics CRM. Estos son enlaces importantes que no deben verse afectados durante un proceso de actualización y, cuando se ven afectados, pueden tener un gran impacto en la productividad.
Lea Qué no hacer al actualizar su Microsoft Dynamics CRM 2016 en línea: https://riptutorial.com/es/dynamics-crm/topic/9616/que-no-hacer-al-actualizar-su-microsoft-dynamics-crm-2016
https://riptutorial.com/es/home 18
Capítulo 7: Usando la API web con jQuery
Examples
Usando la opción verbosa para obtener el conjunto de opciones y los valores de búsqueda
Por defecto, obtendrás códigos e id para conjuntos de opciones y búsquedas. Si también desea obtener la etiqueta, debe agregar un encabezado adicional a la llamada.
$.ajax({ url: Xrm.Page.context.getClientUrl() + '/api/data/v8.0/contacts', headers: { 'Accept': 'Application/json', 'Prefer': 'odata.include-annotations="OData.Community.Display.V1.FormattedValue"' } }).done(function (result) { $.each(result.value, function (key, value) { //sample to access a label var gendercodeLabel = value['[email protected]']; var gendercodeValue = value.gendercode; }); });
Usando select para reducir el número de campos
Por motivos de rendimiento, debe minimizar el número de campos que solicita de la API. Puede utilizar la propiedad de selección para hacerlo.
Este ejemplo obtiene la propiedad del nombre de todas las cuentas:
$.ajax({ url: Xrm.Page.context.getClientUrl() + '/api/data/v8.0/accounts?$select=name', headers: { 'Accept': 'Application/json' } }).done(function (result) { $.each(result.value, function (key, value) { var lastname = value.primarycontactid.lastname; }); });
Usando expandir para obtener propiedades de búsqueda
Si obtiene un solo registro y cuando ese registro tiene una búsqueda, también puede obtener los valores del valor de búsqueda utilizando la opción expandir. Esto reduce la cantidad de llamadas que necesita hacer a la API.
La muestra obtiene todas las cuentas y el apellido del contacto principal:
https://riptutorial.com/es/home 19
$.ajax({ url: Xrm.Page.context.getClientUrl() + '/api/data/v8.0/accounts?$select=name,primarycontactid&$expand=primarycontactid($select=lastname)', headers: { 'Accept': 'Application/json' } }).done(function (result) { $.each(result.value, function (key, value) { var lastname = value.primarycontactid.lastname; }); });
Obteniendo cuentas
Este ejemplo recupera cuentas utilizando un método jQuery ajax. Una cosa a tener en cuenta es que necesita establecer el encabezado en la llamada para hacer el trabajo.
$.ajax({ url: Xrm.Page.context.getClientUrl() + '/api/data/v8.0/accounts', headers: { 'Accept': 'Application/json' } }).done(function (result) { var accounts = result.value; });
Usando el filtro para filtrar su consulta API
Puede utilizar la propiedad de filtro para recuperar un subconjunto de valores de CRM. En este ejemplo, solo se devuelven las cuentas donde el nombre de la empresa es igual a CompanyName.
$.ajax({ url: Xrm.Page.context.getClientUrl() + '/api/data/v8.0/accounts?$filter=name eq CompanyName', headers: { 'Accept': 'Application/json' } }).done(function (result) { var accounts = result.value; });
Lea Usando la API web con jQuery en línea: https://riptutorial.com/es/dynamics-crm/topic/2243/usando-la-api-web-con-jquery
https://riptutorial.com/es/home 20
Creditos
S. No
Capítulos Contributors
1Empezando con la dinámica-crm
Arun Vinoth, Community, Daryl, Mehmet Seckin
2Acciones de llamada utilizando la API web
Arun Vinoth, Pawel Gradecki
3API web publica ejemplos de JSON
Arun Vinoth, Martijn Eikelenboom, winterfruit
4
CRM 2013: Cómo ocultar tipos de actividad no deseados de la subcuadrícula
M Costa
5
Error: TurboForms Xrm.Page.data.save (). Then () Errores con ErrorCode "Null", Mensaje "Undefined"
Daryl
6
Qué no hacer al actualizar su Microsoft Dynamics CRM 2016
Yuvaraj
7Usando la API web con jQuery
Arun Vinoth, Daryl, jcjr, Martijn Eikelenboom
https://riptutorial.com/es/home 21