2. 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
3. ¿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
4. 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 info@zzzprojects.com
https://riptutorial.com/es/home 1
5. 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ón
Versió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
6. 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["incidentid@odata.bind"] = "/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
7. 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
8. 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
9. 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==",
"objectid_account@odata.bind" : "/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
10. {
"firstname" : "New",
"lastname" : "Contact",
"parentcustomerid_account@odata.bind" : "/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:
{
"productid@odata.bind": "/products(11c0dbad-91df-e311-b8e5-6c3be5a8b200)",
"quoteid@odata.bind" : "/quotes(69b5e1ae-037f-e611-80ed-fc15b428dcdc)",
"uomid@odata.bind" : "/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
11. 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
12. 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
13. 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
14. 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
15. 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
16. 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
17. 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
18. 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
19. 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
20. 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
21. 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
22. 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['gendercode@OData.Community.Display.V1.FormattedValue'];
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
23. $.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
24. Creditos
S.
No
Capítulos Contributors
1
Empezando con la
dinámica-crm
Arun Vinoth, Community, Daryl, Mehmet Seckin
2
Acciones de
llamada utilizando la
API web
Arun Vinoth, Pawel Gradecki
3
API 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
7
Usando la API web
con jQuery
Arun Vinoth, Daryl, jcjr, Martijn Eikelenboom
https://riptutorial.com/es/home 21