tag:blogger.com,1999:blog-216197302024-03-08T00:09:14.923+01:00CRM a diario Todo acerca de Microsoft Dynamics CRM (y alrededores)Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.comBlogger107125tag:blogger.com,1999:blog-21619730.post-52310443369764521182015-09-28T15:53:00.000+02:002015-09-28T15:57:38.453+02:00Obtener roles y privilegios de un usuario con FetchXmlLos datos que muestran los informes en CRM están filtrados por el perfil de seguridad del usuario
que los ejecuta. Hasta aquí, todo bien: nuestros informes no serán un hueco de seguridad, siempre
que usemos las vistas <em>Filtered</em> de la base de datos como fuente. En CRM Online (o On-Premise
con Claims Authentication) la cosa cambia: la consulta se escribe como una expresión FetchXml que
igualmente está filtrada según los privilegios. El problema viene cuando un usuario no tiene el permiso
mínimo de lectura a nivel usuario. En este caso el informe simplemente lanzará una excepción, cuando
tal vez lo que esperaríamos es que mostrara una lista vacía. Para evitar esto no queda más remedio
que hacer un pequen˜o rodeo:<br />
<ol>
<li>Crear un informe principal que obtiene información de seguridad del usuario actual.</li>
<li>Crear un informe secundario con los datos que realmente queremos mostrar.</li>
<li>En el informe principal, comprobar si el usuario tiene permisos de lectura en la entidad y, en
caso afirmativo, mostrar el informe secundario.</li>
</ol>
¿Y cómo obtenemos la información de seguridad (roles y privilegios) de un usuario? De eso va esta entrada.
Empezamos por anadir el parámetro estándar <b>CRM_FullName</b> y llenando un DataSet con la información
siguiente:<br />
<h3>
Para obtener los <b>roles de seguridad</b> del usuario actual:</h3>
<pre class="xml:nogutter" name="code"><fetch>
<entity name="systemuserroles">
<link-entity alias="u" from="systemuserid" name="systemuser" to="systemuserid">
<filter>
<condition attribute="fullname" operator="eq" value="@CRM_FullName" />
</filter>
</link-entity>
<link-entity alias="r" from="roleid" name="role" to="roleid">
<attribute name="name" />
</link-entity>
</entity>
</fetch>
</pre>
<h3>Para obtener los <b>privilegios de lectura</b> del usuario actual:</h3>
<pre class="xml:nogutter" name="code"><fetch>
<entity name="systemuserroles">
<link-entity alias="u" from="systemuserid" name="systemuser" to="systemuserid">
<filter>
<condition attribute="fullname" operator="eq" value="@CRM_FullName">
</condition></filter>
</link-entity>
<link-entity alias="_r" from="roleid" name="role" to="roleid">
<link-entity alias="r" from="roleid" name="role" to="parentrootroleid">
<link-entity alias="rp" from="roleid" name="roleprivileges" to="roleid">
<attribute name="privilegedepthmask">
<link-entity alias="p" from="privilegeid" name="privilege" to="privilegeid">
<attribute name="name">
<filter>
<condition attribute="name" operator="like" value="prvRead%">
</condition></filter>
</attribute></link-entity>
</attribute></link-entity>
</link-entity>
</link-entity>
</entity>
</fetch>
</pre>
<p>Una vez creado el DataSet (lo he llamdo <i>Privileges</i>), controlamos la visibilidad del subinforme con una expresión similar
a lo siguiente:</p>
<span style="font-family: Courier New, Courier, monospace; font-size: small;">=Lookup("prvReadaccount",Fields!p_name.Value,Fields!rp_privilegedepthmaskValue.Value,"Privileges")
</span>
<p>Que básicamente busca en el DataSet a través de la función Lookup un privilegio de nombre <b>prvReadaccount</b>. En el valor
de esta expresión obtenemos un 1 si el privilegio es nivel usuario, un 2 si es de unidad de negocio, 4 si es "deep" y 8 si es
global.</p>
Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-8874766087462510112015-08-18T16:55:00.000+02:002015-08-18T16:55:17.871+02:00Enlazar a un informe estático desde un formulario
<p>A veces hay requisitos de usuario que parecen sencillos y que sin embargo requieren mucho trabajo de desarrollo. Lo que técnicamente (en España al menos) se conoce como una <i>chorrada</i> que luego nos lleva horas o días de investigación y desarrollo (= buscar en Google muy fuerte). Esta es una de ellas: imaginad un formulario en CRM con unos cálculos tan complejos que su explicación requiere un PDF de varias páginas. Algo que no podemos simplemente enchufar como una ristra de HTML porque visualmente no encaja. El primer pensamiento es: no pasa nada, creo un <i>webresource</i> con el PDF y otro <i>webresource</i> con el enlace que apunte al primero. Pero hay un problema: los tipos de <i>webresource</i> son:
<ul>
<li>HTML</li>
<li>CSS</li>
<li>Javascript</li>
<li>XML, XSL</li>
<li>Imagen (jpg, gif, png)</li>
<li>Silverlight</li>
<li>Icono</li>
</ul>
</p>
<p>¿Dónde está el tipo <b>PDF</b>? Pues no está, punto. Si creamos un PDF, le cambiamos la extensión, lo subimos como un CSS... muy complicado.</p>
<p>La solución viene de nuestros amigos los <b>informes</b>. La opción más habitual al crear un informe es cargar ficheros RDL con la opción <i>Cargar un fichero existente</i>. Pero nada impide que este fichero existente sea de otros tipos (PDF, DOC, PPT etc.) siempre que el navegador de nuestro cliente sepa qué hacer con él. Una vez subido el fichero, nos fijamos en la URL del formulario de edición del informe. Tendrá aproximandamente este aspecto:
</p>
<code>
..../CRMReports/reportproperty.aspx?id=%7b<b>FAFAFAFA-AAFA-FAFA-FAFA-111111111111</b>%7d
</code>
<p>
Nos apuntamos el código GUID del informe, en este caso:
<code>
FAFAFAFA-AAFA-FAFA-FAFA-111111111111
</code>
</p>
<p>Y creamos un <i>webresource</i> de tipo HTML con el siguiente código, que incluye una llamada a <b>crmreports/download.aspx</b> que hace justo lo que su nombre sugiere.
</p>
<pre>
<a href="/crmreports/download.aspx<b>?id=%7bFAFAFAFA-AAFA-FAFA-FAFA-111111111111%7d</b>">Descargar PDF</a>
</pre>
<p>Ojo, no olvidéis el <b>%7b</b> y el <b>%7d</b>, de otra manera no funcionará. Otra buena noticia es que este código sigue funcionando entre distintos entornos, de modo que si incluimos informe y <i>webresource</i> en una solución, exportamos e importamos, el enlace seguirá funcionando. </p>Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com2tag:blogger.com,1999:blog-21619730.post-32386391076980715152015-03-20T16:56:00.000+01:002015-03-20T16:56:10.487+01:00Error: Could not retrieve salesperson roleNo es un error que nos vayamos a encontrar todos los días, pero aun así... ¡a mí me pasó y dolió! Queda aquí para la próxima vez. Pero bueno, al grano:<br />
<br />
Desde la versión 2011 Dynamics CRM permite importar registros de tipo <b>Usuario</b> y <b>Equipo</b> mediante el proceso estándar de importación. Esto introduce una opción interesante para dar de alta usuarios (o equipos) en bloques y simultáneamente asociarlos a una unidad de negocio. Pero siempre hay un "pero": no permite agregar también un rol de seguridad para los usuarios durante la importación. Un usuario sin roles no puede ser propietario de otros registros, así que el sistema, por su cuenta y riesgo, asocia el rol de seguridad <i>Salesperson</i> (<i>Representante de ventas</i> en español) a los nuevos usuarios. Si por el motivo que sea, ese rol no existe en el sistema, la importación fallará en cada registro. El registro de errores de la importación tiene este aspecto:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7YsLZn2k8hnjn8cYJz-PHQCNhGWd2E5C0J_DBiO8w6dxEw9C4BJHFJhKCX8HQqcDhJEW1mz1EJ0FTFx8jaiPUV4aj2qy4UbzyPHcLHt4y4eCXId0MTLutGA0XRemX_jYfOvz/s1600/could+not+retrieve+salesperson+role.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Could not retrieve salesperson role" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7YsLZn2k8hnjn8cYJz-PHQCNhGWd2E5C0J_DBiO8w6dxEw9C4BJHFJhKCX8HQqcDhJEW1mz1EJ0FTFx8jaiPUV4aj2qy4UbzyPHcLHt4y4eCXId0MTLutGA0XRemX_jYfOvz/s1600/could+not+retrieve+salesperson+role.png" height="295" title="" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Errores durante el proceso de importación</td></tr>
</tbody></table>
<br />
Por qué podría haber desaparecido el rol? Alguien <i>bien intencionado </i>ha hecho "limpia" y se ha pasado de la raya... En cualquier caso, la solución a este problema sería:<br />
<br />
<ol>
<li> Ir a otra instalación de Dynamics CRM que sí tenga el rol <i>Salesperson</i></li>
<li> Crear una solución vacía e incluir el rol <i>Salesperson</i> en la solución</li>
<li> Exportar e importar en la instalación original.</li>
</ol>
<div>
Otra opción, un poco más rebuscada (y en caso de que no tuviéramos acceso a otra instalación de CRM) sería crear una solución con un rol cualquiera, exportarla, editar el XML resultante y cambiar el GUID del rol por el siguiente:</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: large;">a4be89ff-7c35-4d69-9900-999c3f603e6f</span></div>
<div>
<br /></div>
<div>
Esto se puede hacer así porque aparentemente los roles de seguridad estándar tienen siempre el mismo GUID independientemente de la instalación en la que estemos.</div>
Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-46935268661947581172014-05-08T14:05:00.000+02:002014-05-08T14:05:16.121+02:00Retornar JSON dinámico desde un servicio WCF<p>Un escenario común asociado a servicios WCF que extraen información de CRM es que los valores retornados correspondan con entidades de CRM. Para crear un <em>endpoint</em> de WCF que devuelva esa información en XML o JSON necesitamos especificar un tipo de retorno, pero si queremos que el servicio sea genérico, no podemos atarnos a una implementación concreta de una clase de .NET. Se necesita un tipo que acepte "de todo", como un <em>System.Object</em>, un <em>string</em> o un <em>dynamic</em>. Mi primera opción fue usar un <em>string</em>, pero me encontré que como el valor ya estaba expresado en JSON, WCF lo estaba volviendo a serializar, con lo que acababa con un string con un montón de comillas y caracteres "escapados". Bueno, pues en <a href="http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx">este blog</a> de <b>Carlos Figueira</b> encontré una opción que no conocía y que permite manejar hasta el nivel de byte el resultado que genera el servicio WCF: devolver un <b>Stream</b>.
</p>
<pre class="csharp:nogutter" name="code">
[WebInvoke(Method = "GET",
UriTemplate = "search/{queryName}/{searchString}",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
public Stream Search(string queryName, string searchString)
{
var jsonString = ".....";
WebOperationContext.Current.OutgoingResponse.ContentType =
"application/json; charset=utf-8";
return new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
}
</pre>
<p>La línea en la que se establece el <em>ContentType</em> ayudará al cliente a determinar cuál es el tipo. En este caso sigue siendo JSON, pero igualmente podría ser un generador de imágenes, o cualquier otro tipo de contenido.
</p>Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-27314930780120180162013-06-11T14:25:00.001+02:002013-06-11T14:25:30.196+02:00Oscuro error Javascript al ejecutar un informeHe aquí un error que he podido solucionar en minuto y medio gracias a una blogueresa (?) llamada <a href="http://blogs.msdn.com/b/arpita/">Arpita</a> y que de otra manera habría llevado horas. Al lío: al ejecutar un informe ocurre lo siguiente en el navegador:<br />
<br />
<img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-50-77/2475.1.png" /><br />
<br />
Esto se debe (agárrate) a que:<br />
1. El usuario actual se creó en una organización diferente a aquella en la que se está ejecutando el informe.<br />
2. Esa organización primitiva está habilitada..<br />
3. En esa organización, el usuario actual no tiene asignado rol de seguridad.<br />
<br />
Sobre el punto (1) nada podemos hacer, pero sí podemos (a) inhabilitar la organización primitiva o (b) otorgar roles de seguridad al usuario en esta organización.<br />
<br />
Qué cosas...<br />
<br />
Enlace al artículo completo:<br />
<a href="http://blogs.msdn.com/b/arpita/archive/2012/07/21/microsoft-dynamics-crm-2011-unable-to-run-any-reports-due-to-missing-security-role-in-default-organization.aspx">http://blogs.msdn.com/b/arpita/archive/2012/07/21/microsoft-dynamics-crm-2011-unable-to-run-any-reports-due-to-missing-security-role-in-default-organization.aspx</a>Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-91984346958454095572013-05-29T09:33:00.000+02:002013-05-29T09:36:27.335+02:00Incluir librerías Javascript en una acción del RibbonEl escenario es el siguiente: queremos añadir alguna acción adicional (o modificar una de las existentes) al Ribbon de una entidad o al de nivel de aplicación. El código que responde a la acción suele ser una función en Javascript que está incluida en un Web Resource que hemos cargado previamente en la solución. Hasta ahí, todo correcto.Pero ¿qué ocurre si queremos incluir, por ejemplo, código <b>jquery</b> en esa función? El código de esa librería lo tendremos probablemente en <b>otro </b>Web Resource que utilizamos en otros lados (por ejemplo en eventos de formulario). El truco para conseguir que el Ribbon incluya ese otro Web Resource es crear una función fantasma junto a la verdadera. En esa función especificamos la librería que necesitamos y establecemos como nombre de función una función estándar de Javascript que "no haga nada", por ejemplo <b>isNaN. </b>En la siguiente captura, quiero añadir el código de la librería <b>json2.js</b><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><span style="margin-left: auto; margin-right: auto;"><img border="0" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSQhUJamGL3BM_5tqxG1oKtT73AyTbwk4MpuXjtG1l_jzV0Kh_KbuOUA4kLKlciU_rM-gJbarh_4SGRvFI935YZDev6GxRqOL6GoPNfLuLreavNMSsGAuuCs9YtI378BH9xu_9/s640/ribbon.png" width="590" /></span></td></tr>
<tr><td class="tr-caption" style="text-align: center;">La función "fantasma" justo encima de la que contiene el código que queremos ejecutar</td></tr>
</tbody></table>
<br />
La idea la encontré en este <a href="http://rajeevpentyala.wordpress.com/2012/05/23/loading-dependent-jscript-libraries-in-ribbon-buttons-execution-crm-2011/">post</a> de <a href="http://rajeevpentyala.wordpress.com/">Rajeev Pentyala</a> y la captura de pantalla es del <a href="http://ribboneditor.codeplex.com/">Ribbon Editor</a> del legendario autor de Dynamics CRM Tools <a href="http://mscrmtools.blogspot.com/">Tanguy</a>
Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-79776824227859469232013-05-08T09:43:00.001+02:002013-05-08T09:43:22.917+02:00Un mensaje de (des)esperanzaInauguro aquí la sección <b>crueldad en los mensajes de error</b>. El siguiente me lo he encontrado al intentar guardar un formulario de CRM, y la verdad, no deja mucho lugar al optimismo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEA3Fdo0ntOXRpzEo7jS3by1YZ5M_c58EhjxkB6pqWR4NRb7RxNnDI89g6o-Zc0uiFiFLpQd7Rc6QwFWVwHWFVT6JjraQy4yeAamY8siPzgUv-wii_sbxI3A-cB1y5m0PNMhN8/s1600/mensajeoptimista.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEA3Fdo0ntOXRpzEo7jS3by1YZ5M_c58EhjxkB6pqWR4NRb7RxNnDI89g6o-Zc0uiFiFLpQd7Rc6QwFWVwHWFVT6JjraQy4yeAamY8siPzgUv-wii_sbxI3A-cB1y5m0PNMhN8/s640/mensajeoptimista.png" width="590" /></a></div>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
<i><br /></i>
Con cursiva y en español es más bonito aún, fijáos:<br />
<i><br /></i>
<i>"El destinatario no está disponible y desapareció; todas las conexiones son inválidas. La llamada no se ejecutó, las flores se marchitan, el invierno llegará y la última esperanza se deshace como una lágrima en la lluvia."</i><br />
<i><br /></i>
PD: Hay que culpar al Update 2 de Visual Studio 2012 de la creación de esta entrada. Por el error, y por el tiempo libre inesperado sin máquina de desarrollo.Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-76543011148348553952013-04-05T11:47:00.000+02:002013-04-05T11:47:40.672+02:00Añadir enlaces en el SiteMap a un tipo específico de actividadLa posibilidad de añadir enlaces al SiteMap es muy útil, pero como siempre tiene algunos detalles escondidos, de esos de darse cabezazos contra una pared hasta que encuentras un post como <a href="http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/66894b67-7aed-44fe-8da7-e7ebe96feb45">este</a> que te acaba de resolver la duda.<br/><br/>
Necesitaba un enlace a la actividad <b>correo electrónico</b> pero lo que obtenía en lugar de eso era un enlace a la lista <b>general</b> de actividades. El resultado es que el usuario tiene que hacer otros dos clicks para llegar hasta la vista.<br/><br/>
El formato que estaba usando es:<br/><br/>
<code>
_root/homepage.aspx?etn=email&viewid=%7b4C8B1482-BD55-E211-85BE-005056A379C7%7d&viewtype=1039
</code>
<br/><br/>
Y el detalle que falta: especificar el tipo con <b>type=x</b> <br/><br/>
<code>
_root/homepage.aspx?etn=email&<b>type=email</b>&viewid=%7b4C8B1482-BD55-E211-85BE-005056A379C7%7d&viewtype=1039
</code>
<br/><br/>
¡Gracias, internet!Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-79570223023614145582013-01-31T11:38:00.000+01:002013-04-05T11:48:46.672+02:00Incluir una imagen en un formularioEsta personalización es un clásico popular: se trata de añadir un mini-panel en el formulario de alguna entidad de CRM (contacto, cuenta, etc.) que muestre una imagen. Un ejemplo podría ser mostrar el logotipo de una empresa en el formulario de Cuenta o la foto de una persona en el formulario de Contacto. Esta aproximación es simplista (para variar) y simplemente toma la primera nota asociada al registro y que sea de tipo imagen (jpeg). Requiere que el formulario tenga previamente añadido un <i>WebResource</i> de tipo HTML y de nombre <b>imageContainer</b>. El código siguiente iría en el evento OnLoad del formulario contenedor:
<pre class="csharp:nogutter" name="code">
$(function () {
var ctx = GetGlobalContext();
var page = window.parent.Xrm.Page;
objectId = page.data.entity.getId();
if (objectId == null)
return;
SDK.JQuery.retrieveMultipleRecords(
"Annotation",
"$top=1&$orderby=CreatedOn desc&$select=DocumentBody&$filter=MimeType eq 'image/pjpeg' and ObjectId/Id eq (guid'" + objectId + "')",
function (results) {
var note = results[0];
$("#imageContainer").attr("src", "data:image/pjpeg;base64," + note.DocumentBody);
},
errorMessageHandler,
function () { }
);
});
function errorMessageHandler(error) {
alert('Error: ' + error.message);
}
</pre>
Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-66607191237162297232012-06-06T10:30:00.001+02:002012-06-06T10:30:25.494+02:00Generando un script de SQL de exportación de datos<p>He aquí un truco para exportar los datos de una base de datos en forma de código T-SQL, es decir, como instrucciones INSERT. Es muy habitual que trabajemos en entornos diferentes: desarrollo, pre-producción, producción etc. Aunque siempre se pueden hacer backups y restaurar bases de datos completas, aún hay veces en que lo que queremos es un pequeño script que introduce unos datos de prueba (o datos maestros, configuración etc.) en una base de datos. Ese script o bien lo escribimos a mano o conseguimos que alguien o algo lo genere para nosotros. Ese algo es <strong>Microsoft SQL Server Management Studio</strong>, o sea, la herramienta de gestión <em>de toda la vida</em>. Lo siguiente es válido para la versión 2008 R2. Lo cuento porque es una opción que está un poco escondida para mi gusto.</p> <p>1. Seleccionar la base de datos y escoger <em><strong>Generate scripts</strong> </em>en el menú de contexto.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLw4eZVQmoUas4lF6WcSs7vIJS-J5j6TXSvim57sXVqeh9g4HcmOygarWyCI-zmghiYOJUuZtjoefbdewxhOmbhcTW0-JorZ5Hlp9gIkPnsZeAE6nkVLeqQGAPHa2eDC9e_oM/s1600-h/1_generatescripts%25255B14%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="1_generatescripts" border="0" alt="1_generatescripts" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwetNWzs5X8H2uo8DrwH5EoQ2Lhk_vlreRWsct4SIZ88Fjuzpn7uFewB9NK_qUItV5gmMRkwcmzg31hRLOHUTEYrHGHY7SsY_vlBY79N0s3-E3hDry1SWA6jzZAakRDsAWsR9/?imgmax=800" width="378" height="320" /></a></p> <p>2. Escoger las tablas para exportar.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhwqFgY1uS2DEM6Xi-G2hw5Mx_ZKn-mJDwi-DwZVrYwwz0KwOUhi7bGw-2PIaHkz36PXuaOyf1zFkSvP-Z8wb8xpAC4ms1JpxpQ4zS4Dl221y0qsELu9nGc4uheQpSPGBEZlsn/s1600-h/2_selectobjects%25255B9%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="2_selectobjects" border="0" alt="2_selectobjects" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT8sTGa9ZixXUhvKMEIwvBupgekiuBFw1b4DlRSTW2ArO7mIlSQNSfZfEL_f_QPq7fqahgxvNfZY_FG6tFR9tcaVREHAHM6-h1p-MPSFBYL1BlxZRDAK4_0Tp53TgkF7MuahaW/?imgmax=800" width="524" height="484" /></a></p> <p>3. Pulsar <strong><em>Advanced</em> </strong>-  para mostrar las opciones avanzadas.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAWvrTBo-BO14ssxl-cj9EXFUtO3bgMYVRE8t-ZAblbHeWPeS0Z2QG6b2fSnoshSYjKYb7Rzcq2eL0lpJQmBZkbthu6F8O2jNYMWFNzEpXJFJxMsEylBJDWmxxzdZD3jzxj0rf/s1600-h/3_options%25255B7%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="3_options" border="0" alt="3_options" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3BkWu2OSAp4mpsBqHKMF-vcSeC81Zxu9l0fOdjT9q2iyIyulSTYnpvbX6XnInSNgqjHeHN3WLL_qhHbeyWnHMDKDE44PnmG4waZKgvhn1Gpe_SRcBmYsXcUo7uvG6s2R_oT7o/?imgmax=800" width="537" height="493" /></a></p> <p>4. Seleccionar la el valor <strong>Schema and data </strong>en la opción <strong>Types of data to script</strong>.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk-5CVKtzGW2-XkeNEI4YzI-ulcohQIvEawQhKZ7IK00PbL1-CZIoievfWAkn9JErlVan5lcQEIPE8hTKlLgRn1fhP-FCQG-Broz_eAodm2D5j43NDFgE7kkdgzxkdzTfnjPzj/s1600-h/4_advanced%25255B8%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="4_advanced" border="0" alt="4_advanced" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqYf96O4Dnp2TQMnf54-lwOhvBAUf-mCFMhRGsQPs4JEmKzjiuUu1wd1dZynYqlXk2_yhyAz5kq5n46FTuVLb91X2ZstK-HYIJv79h_DoaBXOM1Gn4cUc51VYodNWiynQ3tDPE/?imgmax=800" width="353" height="309" /></a></p> <p>5. Y ya está, obtendremos un script con todos los INSERT que necesitamos para recrear la base de datos en su estado actual.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_0o635TAEpiCtU8nuS7ZM_Su1PdS0Umsqp7ftQf0RLqgwqZYWBIKGU1Up-2GCuDa6pfm1hSqo7KWXqFUYK_lzHYBjmM8VhlUKcDoC9iFHl8DUbxykTGxMiwXHCoa2RNILwJRS/s1600-h/7_script%25255B3%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="7_script" border="0" alt="7_script" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOWZ686YJKzwSVARo3RlazDw8fLbQhyphenhyphenarqPL7UjcoCLKaJxDjNt-IDp1Z48Ba_3zxLK6zhp41cvl_Q-mXueWB-18LrrXRvuZ0kmxhDKPZyZBZZmXwOcRSofMLHq1juykkuW4m4/?imgmax=800" width="387" height="181" /></a></p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com1tag:blogger.com,1999:blog-21619730.post-89286701576576427922012-05-16T09:30:00.001+02:002012-05-16T09:32:22.342+02:00Afinando la configuración del E-Mail Router<p>Me refiero al <strong>E-mail Router </strong>de Dynamics CRM 4.0. Aunque tiene una herramienta visual para configurar los parámetros para el correo de entrada y salida, hay algunos que sólo se pueden modificar directamente sobre el fichero <strong>Microsoft.Crm.Tools.EmailAgent.xml</strong> En concreto, para una instalación en la que estoy trabajando, pensamos en modificar el parámetro <strong>BatchSize</strong>, que originalmente está a <strong>5</strong> y que determina el tamaño de los bloques de correo que trata el router en cada ciclo. Más información sobre todos los parámetros del router en este <a href="http://blogs.msdn.com/b/crm/archive/2008/07/02/email-router-configuration-xml-file-explained.aspx">enlace</a>.</p> <p>Pues bien, por más que los cambies en el fichero de configuracion, en el momento en que publicas las reglas, vuelven a su valor original. Resulta que esto es un bug, como explican <a href="http://support.microsoft.com/kb/972150/es">aquí</a>.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEsmXX-3QuTQwUoFZh4XalOJV27wteqQ_knWgUATvRG0TmPSmSdlsWkiEeHefmyUbZziCbLPqFmKD4ti949kWbeLNXEgLb8OxJ5cVwbLQM_9irK1xRKitSmhD7H9L5zBIksm6j/s1600-h/image%25255B25%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnZ1S8DffM-sK4P9tcjBPZa-43f2r_pkh-7jD3PbNLIPo_zZXsrAhp_TTrD4slA0cIe9MC8rcQbmWBFGSDPOfVdb0o3KlGGjOZ5fEkQU5nq0Wa_ktTEVFGCT1XfyQ-8CjiL-HW/?imgmax=800" width="604" height="117" /></a></p> <p>Para solucionar esto hay un hotfix. Después de aplicado, podemos modificar los valores pero no directamente, sino añadiendo una nueva sección <strong>ProviderOverrides</strong>. Ejemplo:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieJHf5II5mvseACey3Av9MN3CAdcKZpDs00gL0M-wuWjIvIsZxy3MtGzAGaeUwjCZi_1f2_r5BLUWE4MFZNKXPGDbvUwzpLgURJOhY2F36HPsL9OIBAjsxXVOHi_k-r8sfSqHn/s1600-h/image%25255B24%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTOypJyeSfwqV9E4IQyu6hGP49Y58msggfE6UIvQ1tr1REIlMyFyqQtDmRdLAhC5E2qLY7SCp9ht7fxvzrpKixb-eZ_sGycgrsgjndyuc4dkeR6CrZy6X4uRp3iN8pC6_L6tOP/?imgmax=800" width="600" height="351" /></a></p> <p>Cómo hacer que los parámetros sean óptimos ya es harina de otro costal…</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-9660913357573284372012-01-12T08:57:00.000+01:002012-01-12T08:57:51.813+01:00Funciones Javascript para CRM 2011: una chuletaSacado del blog de <a href="http://andreaswijayablog.blogspot.com">Andreas Wijaya</a>: una lista de scripts para incluir en formularios de CRM 2011, que puede ser de ayuda en un momento de mala memoria.<br /><a href="http://andreaswijayablog.blogspot.com/2011/07/crm-2011-javascript-functions.html?spref=bl">Andreas Wijaya's Blog: CRM 2011 Javascript Functions</a>Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-76703727640194340262011-09-19T09:09:00.001+02:002011-09-19T09:09:52.085+02:00CRM Reports Uploader and LOcalizer<p>Hace unos meses (antes del verano, parecen años…) <a href="http://crmadiario.blogspot.com/2011/08/reports-en-crm-2011-lecciones.html" target="_blank">comenté en este blog</a> si alguien se animaba a hacer una mini-herramienta para permitir localización de informes en Microsoft Dynamics CRM. Estaba trabajando en un proyecto en el que tenía (en ese momento) <strong>dos </strong>informes (en realidad un informe y un sub-informe) que había que publicar en <strong>tres </strong>idiomas. Cada vez que había que hacer un cambio, por lo tanto tenía que, en el peor de los casos:</p> <ul> <li>Modificar los informes en el idioma base </li> <li>Modificar las cuatro traducciones </li> <li>Subir los seis informes a CRM </li> </ul> <p>Total, que cada pequeño cambio era un drama. Pues nada, al final me he animado a hacer la herramienta yo mismo. En un alarde de creatividad lo he llamado <strong>CRM R</strong>eports <strong>U</strong>ploader and <strong>LO</strong>calizer (CrmRULO) y lo he colgado en <a href="http://crmrulo.codeplex.com" target="_blank">codeplex</a>.</p> <p><a href="http://crmrulo.codeplex.com"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="crmrulo" border="0" alt="crmrulo" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjurhOV3G0B4pcxtWLTg366TBAoT_aLBECM6bT8KdX4Aq1ayAs-SGxfrBAEMVjCnjzvN2hkMfw09NwXgGefBbmC1J1oXRWVYfbamX0wMif_zHT5MYt555qkZEFranx13y7hrEM/?imgmax=800" width="534" height="305" /></a></p> <p>Si hay alguien ahí fuera, por favor, que deje comentarios, críticas, alabanzas… en el sitio de codeplex.</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com1tag:blogger.com,1999:blog-21619730.post-12796246146723464632011-09-05T10:39:00.001+02:002011-09-05T10:39:13.574+02:00Importar ficheros adjuntos en CRM 2011<p>Un tema poco documentado y que puede ser fuente de bastantes frustraciones: aunque <a href="http://crmadiario.blogspot.com/2011/07/dos-cosas-buenas-del-importador-de.html" target="_blank">el nuevo sistema de importación de CRM está muy bien</a>, ¿qué pasa cuando tenemos un montón de datos en forma de <strong>ficheros adjuntos</strong>? Los ficheros adjuntos se representan internamente con la entidad <strong>attachment</strong> aunque en la interfaz de usuario aparecen como <strong>Notas</strong>.</p> <p>El proceso es así:</p> <ol> <li>Exportar los registros <strong>Nota</strong> que nos interesen mediante una búsqueda avanzada. No olvidar incluir la columna <strong>Regarding</strong> apuntando al registro <em>padre</em> de la nota. Los registros <em>padre </em>deben haber sido importados previamente.</li> <li>Guardar el excel obtenido con formato <strong>XML Spreadsheet 2003</strong> Por ejemplo <strong>notes.xml<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRpO7iz6MS5v7927KuiIg_wKLN6NuIujD_oV5e9T278uxg7Rf6jsIwE_0EPI_jRFW_pCgjtTEiarQe1gOqUAQq1Mk6E6JBcHbY1IAEHkRiOkNpz7KwvG81YEgWp3soRSzoM0SC/s1600-h/attachments_-1%25255B5%25255D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="attachments_-1" border="0" alt="attachments_-1" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV-Q4b6ILmnHhbQrEw2LKdx3WAKoDG0yTNZCC0Cu105g7p7vTlYsBtTqUfwqpgIEFX1SA_LOOIQyZfVT6Ceyzp18jX-7xX1V5dhLA0mVqL7BdL5iMLNRo34x-1GlaO211_uDuz/?imgmax=800" width="244" height="51" /></a></strong></li> <li>Añadir el campo <strong>PhysicalFileName</strong> con el mismo contenido que la columna <strong>File name</strong>.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsn3LgSlKooV64M5u5Pf4QgkYPLyqZsfJM8ac5XfSN_FC3AlTW8YaaNO8ZUd-P-_lv_bcydLG_iNzFRWpy8VlVq4p2yLpSkAuuwvfV7Yt-IburrIwL7r1JDBHKYCdTfOB85rpa/s1600-h/attachments_00%25255B2%25255D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="attachments_00" border="0" alt="attachments_00" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJcsHLgTMlw3WGsFL6fkD464L2C4Ax62n4aq7UWX0K3JHuvGsFrzRrcoYfDnSqrsNF4eJkzFiDJkji-XmG8dQxcgylkrvvVnuLOuP9RGtCNrs8PJbHMQonwxbFqcUIqQ9PHeDS/?imgmax=800" width="244" height="151" /></a></li> <li>Crear una carpeta <strong>Attachments</strong> y copiar en ella los ficheros adjuntos que queramos importar.</li> <li>Crear un fichero <strong>zip </strong>con el fichero <strong>notes.xml</strong> y la carpeta <strong>Attachments</strong>. <br /><strong>Nota</strong>: si el tamaño total del fichero resultante es mayor de 8 MB ver la sección <em>Ficheros grandes. <br /></em><em><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivJ-MLTaEuHSH4EaPlZeVYT9Hc3rMHeqUk1DIY5FtxMNPaFxGAWbK61k8V7kUO68KXJsC-n0mxNiWFszxSC6XAhyphenhyphenqQs0aR-CQ_h6QfutwbwLhPnAH9kSP7RglnMbtUZiGrweuA/s1600-h/attachments_01%25255B2%25255D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="attachments_01" border="0" alt="attachments_01" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq_C9nvVnckif8aU2-tLpyaalByVjcknqt4TlKPn7H7xBrBzmnrMCIrFM0fWCvyvLtN-CmxzHDaWkRMIdgCb6QO6qQjzf_8Fqc1129YubdHAyCCToiESNn67I7qY37TGQ2ShHm/?imgmax=800" width="230" height="118" /></a></em></li> <li>Desde el importador, mapear el campo <strong>PhysicalFileName</strong> a <strong>Document</strong></li> <li>Mapear también el campo <strong>Regarding </strong>al nombre (o campo principal) de la entidad <em>padre.<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9C8gMaKfi9iUauJiOk2VeMaaVWgxowQNOL8e9Oe-arHyrVp_1bxf4QJFqVdqyrlfIXDulRd1cYRvGXRXtuqCnOut7ZaszIpX_vcw-g7B4yP6s7CnWHlMsz2hz6rGUMH_pTpFQ/s1600-h/attachments_02%25255B6%25255D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="attachments_02" border="0" alt="attachments_02" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF-4R3IfUpGNchdU1zfjjIRrP28hycG6QLhdl5dYXusatQsWF17L0impTfAtnI5Q4QI8RsnX-V46YqwNaGUoTVr7bF6DkIoDavb8r_675btCDqn1mQZbRV2lkRkgwz-7C-3Sj9/?imgmax=800" width="197" height="244" /></a></em></li> <li>Por último podemos guardar el mapa creado por si necesitamos reutilizarlo más adelante.</li> </ol> <p> <br /></p> <h3>Ficheros grandes</h3> <p>Lo que significa aquí <em>grande </em>depende de vuestra implementación de CRM. En la mía resultó ser de 8MB el límite de tamaño de los ficheros adjuntos.</p> <ol> <li>Repartir los ficheros en varias carpetas para que cada zip resultante sea de aproximadamente 5 MB.</li> <li>Copiar el fichero <strong>notes.xml </strong>en cada una de las carpetas.</li> <li>Crear n ficheros <strong>attachments1.zip</strong>, <strong>attachments2.zip</strong> etc</li> <li>Repetir el proceso de arriba para cada fichero <strong>zip</strong>.</li> </ol> <p>Hay que tener en cuenta que en cada importación fallarán los registros para los que no existe el fichero correspondiente en la carpeta del zip. De todas formas, al final del proceso se habrán importado todos.</p> <p>Gracias a <a href="http://www.linkedin.com/groups/How-Import-attachments-in-CRM-21231.S.54058105" target="_blank">David E.</a> que comentó el punto clave del atributo <strong>PhysicalFileName</strong>.</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-63529101907527151082011-08-05T12:00:00.001+02:002011-08-05T12:00:22.534+02:00Reports en CRM 2011: lecciones aprendidas<p>Llevo unos días trabajando en un proyecto de migración del CRM de mi empresa a Microsoft <strong>Dynamics CRM 2011 Online</strong>. Incluye algunos temas de reporting, y el más básico de ellos es la impresión de facturas automatizada. No debería ser un problema, ¿no? En realidad, no, pero aún así hay algunas cosas que he descubierto por el camino y que … aquí van:</p> <ul> <li>Si nuestra instalación de CRM es <strong>Online</strong>, los reports <strong>no se pueden basar en consultas SQL</strong>, sino en FetchXML. Para que el <strong>BIDS</strong> (Business Inteligence Development Studio) funcione con estos reports hay que instalar un complemento que viene incluido en el instalador de CRM.</li> <li>No existe soporte a localización de los informes, como ocurre con otros proyectos .NET. Esto no es específico de CRM, sino de Reporting Services, así que toca olvidarse de ficheros de recursos <strong>resx</strong>. Hay algunas alternativas, como por ejemplo incluir código .NET en el informe, pero esto <strong>no </strong>es posible en la versión Online, ya que requiere instalar las DLLs en la GAC.</li> <li>Si se requiere un sub-informe (por ejemplo Factura y Líneas de factura) se debe subir primero el informe padre y luego el informe hijo. En el informe hijo habrá que rellenar el atributo <strong>parentreportid</strong>.</li> <li>Las vistas por defecto de informes muestran los que están en el idioma del usuario y los marcados como <em>Todos los idiomas (-1)</em> En un momento un poco ridículo pensé que quería decir “Todos los idiomas menos uno”, he, he. Pues no, quiere decir que si ponemos el atributo <strong>languagecode</strong> a <strong>–1</strong> los usuarios verán el informe independientemente del idioma que hayan seleccionado.</li> <li>Cuando se hacen cambios, subir cada vez el report al servidor es un proceso tedioso. Más aún si tenemos subreports y versiones localizadas.</li> </ul> <p>Conclusión: estaría bien fabricar una <strong>herramienta</strong> que permita:</p> <ul> <li>Localizar un report a varios otros idiomas.</li> <li>Publicar un conjunto de reports al servidor en una sola acción.</li> </ul> <p>¿Alguien se anima a hacerla? <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sonrisa" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgohSBhvJT4NlFsr6MdCRCEgPOO1Wdg6hrwI2IbTlvllnmSHvhDcxE_3D3GjPmriw-zKANA92fUqKHsAzs701NrN7ZC31Kc5rTtfp4p69eZVpBuo-nG455SGylY0AegZ9jHsVJe/?imgmax=800" /></p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-68872770509149978652011-07-22T13:27:00.001+02:002011-07-22T13:27:41.403+02:00Tribulaciones con Silverlight en IFD<p>Hace poco (poquísimo, o sea, hoy) he tenido que investigar un problema que surge cuando instalamos el <strong>Internet Facing Deployment </strong>en una instalación de Dynamics CRM 4.0</p> <p>Una vez superados los temas propios de IFD (cabeceras, DNS etc) me esperaba un problema añadido: las páginas que había añadido a esta organización en <strong>Silverlight</strong>. El problema es que mis páginas Silverlight se comunican con un servicio WCF que he colgado en la carpeta ISV del servidor. </p> <p>Al acceder a este servicio salta el error:</p> <h3>This collection already contains an address with scheme http</h3> <p>Pues bien, para que ese servicio funcione con la nueva URL, tenemos que hacer este cambio en su <strong>web.config:</strong></p> <p><font face="Courier New"><serviceHostingEnvironment aspNetCompatibilityEnabled="false"> <br />  <baseAddressPrefixFilters> <br />    <add prefix="</font><a href="http://deploy.crmdomain.local"/"><font face="Courier New">http://deploy.crmdomain.local"/</font></a><font face="Courier New">> <br />  </baseAddressPrefixFilters> <br /></serviceHostingEnvironment></font></p> <p>Este truco lo encontré en este <a href="http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/e028cea6-5b40-4a43-b395-d966bc93ffd5" target="_blank">post</a> de los foros de Microsoft por <a href="http://social.msdn.microsoft.com/profile/dan%20crowell/" target="_blank">Dan Crowell</a>.</p> <p>Por otro lado, tuve que recompilar el servicio para añadirle un atributo ya que de otra manera, el módulo Silverlight pedía credenciales después de haber hecho login a CRM con éxito.</p> <p><font face="Courier New">[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]</font></p> <p>Esta solución viene del post <a href="http://forums.silverlight.net/p/205815/482872.aspx" target="_blank"><strong>Calling silverlight WCF service over IFD deployment of CRM</strong></a> de los foros de CRM, y hay que agradercérselo a <a href="http://forums.silverlight.net/members/rajeshreddy.keesara.aspx" target="_blank">Rajeshreddy Keesara</a> de los foros de Silverlight.</p> <p>¡Gracias!</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-84575042625566296312011-07-20T11:20:00.001+02:002011-07-20T11:20:42.552+02:00Dos cosas buenas del importador de datos en CRM 2011<p>Y digo dos porque seguro que hay más, que aún no he acabado de explorarlo. En el pasado, para importar datos de otras plataformas teníamos la <em>herramienta</em> <strong>DMF</strong> o <strong>Data Migration Framework</strong>, que da miedo de sólo escribirlo. Era una de esas herramientas que no sabías muy bien dónde ubicar: los datos los debía conocer un usuario de negocio, pero requería conocimientos de nivel de administrador de base de datos SQL. El resultado no solía ser muy satisfactorio. Pues bien, la última versión de Dynamics CRM incluye una interfaz integrada en la herramienta para hacer importaciones … digamos que bastante complejas.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5D0jIZPqgk7VXmtxFVz7AfkANZ5AoA6pDcB4DmRNsqHshwZfrrQbHCemAoiVrmvNFdKVO2nY7Mxspu0H_2DBzPNpYcDjelUSDdvjEiHTgGK_fAkxqLKpkPObqneaBoOS7jSkL/s1600-h/importador%25255B6%25255D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="importador" border="0" alt="importador" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS48AmJG25roijjTCW5ij7uoON7ZhqrSinISsphnY3jMmSAsiD4dDUh3XVjDVmt3CusNS5VhYdF6bI8mAcoq0tZWoiHDS9WpMO-l1FdWhaZ4GQ8NzLdqjX_f6jEp41gvi055pl/?imgmax=800" width="447" height="332" /></a></p> <p>En esta foto podéis apreciar las dos funcionalidades que comento:</p> <p>1) <strong>Se pueden importar ficheros zip con más de una entidad a la vez</strong>. Esto es imprescindible cuando tenemos referencias circulares. (El contacto pertenece a una cuenta que tiene como contacto principal al contacto, toma trabalenguas)</p> <p>2) <strong>Se puede hacer <em>rollback </em>de la importación</strong>. Si algo va mal (me da la risa) se crea un proceso asíncrono de borrado de todos los elementos que se han importado.</p> <p>Además, como los procesos de importación siempre tardan un poquillo, pues … te da tiempo a escribir un post rápido en tu blog :-)</p> <p>En fin, que seguimos mejorando.</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-82367765705908767772011-06-23T09:56:00.001+02:002011-06-23T09:56:19.653+02:00Nuevo kit de demostración para CRM Online<p>Acaba de publicarse un recurso que será de mucha utilidad para comerciales, ingenieros pre-venta y aficionados a CRM en general. Se trata del <a href="http://blogs.msdn.com/b/crm/archive/2011/06/14/microsoft-dynamics-crm-online-demonstration-kit.aspx" target="_blank">Microsoft Dynamics CRM Online Demonstration Kit</a> y es un conjunto de personalizaciones, datos de prueba y un guión de demo para mostrar algunas de las funcionalidades destacadas de Dynamics CRM 2011.</p> <p>Incluye un montón de recursos:</p> <ul> <li>13 Dashboards</li> <li>17 Workflows</li> <li>2 Diálogos</li> <li>1 Web Resource (jscript para formateo de números de teléfono)</li> <li>1 Option Set</li> <li>2 Plantillas de correo electrónico</li></ul> <p>Por cierto, que los <em>dashboards </em>dan pistas sobre cómo aprovechar la nueva entidad <strong>Objetivo </strong>(Goal)<strong> </strong>en su versión reporting. </p> <p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; border-top: 0px; border-right: 0px; padding-top: 0px" border="0" src="http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-55-55-metablogapi/5810.image_5F00_20.png" width="560" height="423"></p> <p>Gracias al equipo de Dynamics CRM, de nuevo.</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-48458339910946441552011-06-08T16:15:00.001+02:002011-06-08T16:15:52.713+02:00Acceso directo a la FAQ de Dynamics CRM<p>Pues sí, parece que funciona. Los editores de contenido de Dynamics CRM (sistema de ayuda, documentación de la SDK) están disponibles para responder preguntas directamente desde una cajita que sale abajo a la derecha de cualquier artículo: <strong>Send feedback</strong>. </p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY96ECZJr6DDreI1nbFTHUjys5gb0Svg5PpGPuICvJH187k3MfnoMOFDM9TpvuNIiNymUqc6_q_Rzk2DauYFOcSy6rYvUPT7JaH3oezkXG0JjyA2F8ZLkCQpT0NoV5IZnU77x1/s1600-h/image%25255B10%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIx60mmBnxrixS-6yt9nMKuORVzvI0J_tm1P1hBLwWhln8dGlZ7hj3swgiQ6rTNxoeBmWe4QCEODz7JCuPc_R2bgUgHPUxk7-VKZApZty2KKUfuCD37M0aWO29MuVIiEVc6Lp7/?imgmax=800" width="565" height="229" /></a></p> <p>Se han dedicado a recoger preguntas reales de usuarios y clientes de CRM y responderlas en una FAQ que se puede acceder aquí: <a href="http://rc.crm.dynamics.com/rc/2011/en-us/online/5.0/faq.aspx">http://rc.crm.dynamics.com/rc/2011/en-us/online/5.0/faq.aspx</a></p> <p>Muy útil como primera medida, antes incluso de ponerse a buscar en los foros.</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-52070809647333310192011-05-04T08:50:00.001+02:002011-05-04T08:50:45.822+02:00Nuevo blog de Dynamics CRM en español<p>Esto no ocurre todos los días: aprovechando, supongo, el tirón del lanzamiento de Dynamics CRM 2011, este trío de desarrolladores acaban de lanzar <a href="http://www.elblogdedynamicscrm.com" target="_blank">el blog de Dynamics CRM</a>. Son <strong>Pablo Peralta</strong>, <strong>Jimmy Larrauri </strong>y <strong>Atilio Rosas</strong>, viejos conocidos de los grupos de news de CRM en español. </p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvraJuZZZLagYoisoScT3KAAemTf2OX779ze7wO8Gv9CA6tUIZbrNO1W28bs9_ck-SAsUUe2EQIe1TAQKhEqaKe7NJiepesF67VYtMxMqLIuvAmqsPuU5WXDogzplw3jHqQouU/s1600-h/elblog%5B5%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="elblog" border="0" alt="elblog" align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhneq5B8mQJtt52rYOBSu1Y1ncsM363WQlPZ82d4_vG0DA4eZqyqp8Ljibu2fbBs4XdKmElNO11jpwzIZDNw_1YoX1VW1AzBeF_jnd30nSuoP1NvGD8BfMKHUaZo1FkDoPVjqbF/?imgmax=800" width="244" height="135" /></a></p> <p>Vienen a llenar un hueco que se acusaba desde hace tiempo: hay pocos blogs que publiquen información útil sobre Dynamics CRM en castellano: las comunidades de España y Latinoamérica están de suerte.</p> <p>Han empezado por una serie muy útil sobre instalación paso a paso de la versión 2011 y prometen crear artículos de valor con trucos y recetas similares para desarrolladores. Por cierto, aceptan contribuciones, así que ya sabéis.</p> <p>¡Bienvenidos!</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com2tag:blogger.com,1999:blog-21619730.post-15380176872998126792011-03-29T12:57:00.001+02:002011-03-29T12:57:23.757+02:00Error al ejecutar código de CRM 4.0 en un CRM 2011<p>La situación es la siguiente: estoy en el proceso de cambio de entorno de desarrollo entre la versión 4.0 y la 2011. En los proyectos nuevos uso esta última, pero aún hay código para otros clientes que usa la versión 4.0. Bueno, pues al ejecutar cualquier código (cliente, test, web etc.) sorbe la máquina de desarrollo en la que tengo instalado CRM 2011 me encuentro con un error del estilo <em>Ensamblado no encontrado</em> o <em>No coincide la versión de ensamblado</em>.</p> <p><font size="2" face="Courier New">System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Crm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) <br />File name: 'Microsoft.Crm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ---> System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) <br />File name: 'Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'</font> <br /> <br />La solución la da el gran <strong>David Jennaway</strong> en su <a href="http://mscrmuk.blogspot.com/2011/02/using-crm-40-assemblies-on-crm-2011.html" target="_blank">blog</a>. Hay que crear una sección del .config para invalidar una redirección de ensamblado en una política (incorrecta) introducida en CRM 2011.</p> <p><font face="Courier New"><configuration> <br /> <runtime> <br />  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <br />  <dependentAssembly> <br />   <assemblyIdentity name="Microsoft.Crm.Sdk" <br />     publicKeyToken="31bf3856ad364e35" culture="neutral" /> <br />   <publisherPolicy apply="no" /> <br />  </dependentAssembly> <br />  </assemblyBinding> <br /> </runtime> <br /></configuration></font></p> <p>¡Gracias, David!</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-48987094522504011412011-03-22T12:53:00.001+01:002011-03-22T12:58:18.738+01:00File - New - Project - Hola CRM 2011<p>Si habéis entendido el título estáis en el sitio adecuado. Esto es, un ejemplo de código minimalista para conectarse a CRM 2011 a través de la SDK, tanto <i>On-Premise</i> como <i>On-line</i>.</p> <p>Abrimos Visual Studio 2010 y creamos un proyecto de tipo <i>Consola</i> sobre .NET framework 4.0 (¡Primera vez que los desarrolladores de CRM no vamos un paso por detrás del Framework!).</p> <p>Añadimos las referencias:</p> <ul> <li><strong>System.ServiceModel</strong> porque usamos WCF </li> <li><strong>System.Runtime.Serialization</strong> serialización estándar de .NET </li> <li><strong>microsoft.xrm.sdk</strong> para las clases específicas de CRM (en la carpeta <b>bin</b> de la SDK) </li> </ul> <p>Añadimos los namespaces:</p> <pre class="csharp:nogutter" name="code">using System;<br />using System.ServiceModel.Description;<br />using Microsoft.Xrm.Sdk;<br />using Microsoft.Xrm.Sdk.Client;<br /><br />namespace HolaCRM2011<br />{<br /> class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> }<br /> }<br />}</pre><br /><p>La forma de crear un proxy para llamar a los servicios WCF de CRM <i>On Premise</i> es bien sencilla. La clase <b>ServiceConfigurationFactory</b> nos proporciona un método <b>CreateConfiguration</b> que devuelve un objecto de configuración que representa la mitad de la información que necesitamos para conectarnos a CRM: el <i>endpoint</i> de WCF. Esta dirección la podemos recordar navegando a la sección <i>Configuration - Settings - Customizatins - Developer resources</i> </p><br /><pre class="csharp:nogutter" name="code">var config = <br /> ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(<br /> new Uri("http://localhost:5555/MiOrganizacion"));<br />var servicio = new OrganizationServiceProxy(config, new ClientCredentials());</pre><br /><p>Y por último, invocar un método CRUD sobre el servicio. En este caso, el clásico "Crear contacto". La novedad aquí es que ya no tenemos que usar las clases <i>wrapper</i> de CRM sino que podemos tirar directamente con los tipos básicos de .NET. Así, por ejemplo, en lugar de usar un CrmNumber usamos directamente un int.</p><br /><pre class="csharp:nogutter" name="code">var contacto = new Entity("contact");<br />contacto["firstname"] = "Nombre";<br />contacto["lastname"] = "Apellidos";<br />contacto["numberofchildren"] = 2;<br />var id = servicio.Create(contacto);</pre><br /><p>Si queremos trabajar con CRM Online, la cosa se complica un poco. Afortunadamente para programadores como yo (con facilidad para "abstraernos") toda esa complicación está resuelta en la clase de ayuda <b>CrmConnection</b> que encontramos en la dll <strong>microsoft.xrm.client</strong> </p><br /><pre class="csharp:nogutter" name="code">var connectionString =<br /> @"Url=https://miorg.crm4.dynamics.com;<br /> Username=miliveid@hotmail.com;<br /> DeviceID=MIDEVICEID-aa9f617b2e6d;<br /> DevicePassword=MiDevicePass@word;<br /> Password=MiPass@word";<br />var connection = CrmConnection.Parse(connectionString);<br />var servicio = new OrganizationService(connection);</pre><br /><p>Como se ve, la cadena de conexión tiene la misma pinta que las de ADO.NET de toda la vida e incluye también las credenciales. Lo que daba más guerra en versiones anteriores de la SDK (vamos por la 5.0.2) era <b>registrar el dispositivo</b>(Aquí resuelto con DeviceID y DevicePassword). Este parte de la conexión controla la <b>autenticación basada en claims</b>, que es un tema demasiado vasto y desconocido para mi como para hincarle el diente. La parte buena es que ... funciona. La primera vez que se llama al servicio, si no conoce el dispositivo, lo registra contra Live con el password especificado y obtiene un token. En las siguientes llamadas no necesitará este paso y llama directamente a CRM, aunque como programadores "abstraídos" ni nos enteraremos...</p><br /><p>El programa completo quedaría así:</p><br /><pre class="csharp:nogutter" name="code">using Microsoft.Xrm.Client;<br />using Microsoft.Xrm.Client.Services;<br />using Microsoft.Xrm.Sdk;<br /><br />namespace HolaCRM2011<br />{<br /> class Program<br /> {<br /> static void Main(string[] args)<br /> {<br /> var connectionString =<br /> @"Url=https://miorg.crm4.dynamics.com;<br /> Username=miliveid@hotmail.com;<br /> DeviceID=MIDEVICEID-aa9f617b2e6d;<br /> DevicePassword=MiDevicePass@word;<br /> Password=MiPass@word";<br /> var connection = CrmConnection.Parse(connectionString);<br /> var servicio = new OrganizationService(connection);<br /><br /> var contacto = new Entity("contact");<br /> contacto["firstname"] = "Nombre";<br /> contacto["lastname"] = "Apellidos";<br /> contacto["numberofchildren"] = 2;<br /> var id = servicio.Create(contacto);<br /> }<br /> }<br />}</pre><br /><p>Sólo hay que cambiar los datos particulares (todos los que empiezan por "Mi") por los de la organización de CRM 2011 online. También se puede escoger un identificador de dispositivo y password de dispositivo propios. </p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com2tag:blogger.com,1999:blog-21619730.post-77646989937015079212011-03-14T10:00:00.001+01:002011-03-14T10:04:05.869+01:00Nuevo explorador de metadatos en CRM 2011<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7a7nGIZUGg1d3y_rLC_O3LiGAh4VpA2z4BHdHpWMjp6qL9LitYdceimxACHuFF-xDSPh52-q5E0LVIcHPTZobc4WYJqB67mt9HfzzDVfpjyG1b1hPPGTWr4Nbv1sneh2Kfi2U/s1600-h/cap1%5B6%5D.png"><img style="background-image: none; border-right-width: 0px; margin: 5px 7px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="cap1" border="0" alt="cap1" align="left" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht4YjVTwncEvXxVMhAMPPlH52T3vpRHjlPcyC4ZGta0K3FTPJLwFuAOf1FV_g8tAXLwtUPde0YHBrU9vi0GgjGnCkJ2W3TpWvC6Fw_4ZGgi6q8zbDuOV-ft2-5_rRHwiJV6sW1/?imgmax=800" width="189" height="192" /></a>Es agradable ver que las herramientas que tienes que usar cada día van mejorando con cada versión. Hoy le toca al <strong>Metadata browser</strong> de CRM. En la versión 2011 el equipo de la SDK ha hecho un gran trabajo y ha escuchado las <strike>quejas</strike> sugerencias de los desarrolladores que tuvimos que vérnoslas con el <strong>/sdk/list.aspx</strong> de las versiones anteriores. Ahora está empaquetado como una solución que se puede importar al entorno de desarrollo y que se entrega como un <em>web resource</em> en HTML y JavaScript, muy rápido y sencillo de manejar.</p> <p> </p> <p>Para usarlo, hay que descargar la SDK (desde <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=420f0f05-c226-4194-b7e1-f23ceaa83b69" target="_blank">aquí</a>), navaegar a la carpeta <strong>sdk/tools/metadatabrowser </strong>e instalar en CRM la solución <em>gestionada </em><strong>metadatabrowser_1_0_0_1_managed.zip</strong></p> <p>El resultado es una herramienta muy útil para el desarrollador, que permite ver todas las entidades, atributos y recursos desplegados en una solución de CRM.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJZ_fSl0oKK_63P6Rn6dORcaH8nEeoMcEI-tNoS0wKliDC5aALvQwr0BCt6MzOIlKSpZs3UmlN16UnsmeD6FUrxvug-SObhiGQW4lushCBd5MlmjKJpo0POnTcgwHMVEVaD75z/s1600-h/cap2%5B8%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="cap2" border="0" alt="cap2" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIYCQKhOOU4JRwPe-N32chmCNcjxe5RAHciLXXdA6i5cJDFNtOgO5VTDK8kYf8ZX61zKDTSPzVP8PDAe_5Ajf6X8PYXa5nAPjOI_65mG0-l8KHjYlncBE53TOuTK0AKt2kIsnN/?imgmax=800" width="572" height="364" /></a></p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-51688515888268582532011-02-15T11:44:00.001+01:002011-02-15T11:44:39.036+01:00Dynamics CRM 2011 Developer Training Kit<p>Microsoft acaba de publicar un <em>paquete</em> de ayuda para el desarrollador .NET que ha decidido subirse a la plataforma de Microsoft Dynamics CRM 2011 para crear aplicaciones tanto <em>on-premise</em> como <em>on line</em>. Se compone de <strong>presentaciones</strong>, <strong>vídeos</strong> y <strong>labs </strong>y supone una oportunidad de primera para los que no podáis (podamos) acudir a un curso presencial.</p> <p> <table border="0" cellspacing="5" cellpadding="2" width="600"><tbody> <tr> <td valign="top"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheQoKXFYNqB8Y7JQWxZDtFff9pFmb_Et9CAApJjPJbKqRxdWkx7tml1nPNVUyU6-8OPtOxfeJg63hSed9kv2zKRKWNE17zV0qwHtGPkdhB9G97nYPkfYOmRKmJzUxJ6aacKw7d/s1600-h/5280.image_4%5B2%5D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="5280.image_4" border="0" alt="5280.image_4" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBZO78J8vVEMlmt0gNQrlnSg0hDRxBF2mIJUKRvCNSDqAdTes0rbPCaP4ZTZBhVarGZqf25p8_md8D0bw-tZo7KxqZLh4WZTeTcIW5oBCgZJi05eltqneyHlDLpwMVw6LLrDPG/?imgmax=800" width="244" height="233" /></a></td> <td valign="top"> <h2>Contenidos</h2> <ul> <li>Soluciones </li> <li>Extensibilidad de Experiencia de Usuario </li> <li>Visualizaciones y Dashboards </li> <li>WCF Web Services </li> <li>LINQ y oData </li> <li>Plugins </li> <li>Procesos </li> <li>Programación en cliente </li> <li>Silverlight </li> <li>SharePoint y CRM </li> <li>Windows Azure y CRM </li> <li>Actualización de CRM 4.0 a CRM 2011 </li> <li>Dynamics Marketplace </li> </ul> </td> </tr> </tbody></table> </p> <p>Se puede acceder <a href="http://blogs.msdn.com/b/crm/archive/2011/02/14/announcement-microsoft-dynamics-crm-2011-developer-training-kit.aspx" target="_blank">aquí</a> al artículo original y <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=78498c29-28ac-440b-9c20-ec5da6ee6e98&displaylang=en" target="_blank">aquí</a> a la descarga del paquete (¡127 MB de diversión!).</p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0tag:blogger.com,1999:blog-21619730.post-80749588478039692972010-12-22T10:16:00.001+01:002010-12-22T10:16:27.749+01:00Disponible Microsoft Dynamics CRM 2011 RC<p>Nada que no se haya dicho ya: como se anunció en el <a href="http://blogs.msdn.com/b/crm/archive/2010/12/14/microsoft-dynamics-crm-2011-release-candidate-rc-announcement.aspx">blog del equipo de Dynamics</a>, está disponible el instalador de la versión RC de <strong>Microsoft Dynamics CRM 2011</strong> y la correspondiente SDK. Mi gran aportación: corregir los enlaces rotos que he visto en muchos posts por ahí (te redirigen a una página de OWA, ???). </p> <p><strong>Extra</strong>: En Softpedia dicen que ... <i>Además de la documentación, este paquete descargable incluye las <strong>asambleas</strong> y las herramientas necesarias para el desarrollo....</i> </p> <p>¡Por fin un CRM democrático, viene con asambleas!</p> <p>Ahí van los enlaces:</p> <ul> <li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c3f82c6f-c123-4e80-b9b2-ee422a16b91d" target="_blank">Microsoft Dynamics CRM 2011 Server Release Candidate</a> Disponible sólo en inglés. </li> <li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=22dc423a-7194-491e-a169-6ace16bfdd36" target="_blank">Microsoft Dynamics CRM 2011 for Microsoft Office Outlook</a> Disponible en 25 idiomas </li> <li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=db44c564-2338-407e-980a-c9c83ad37729" target="_blank">Microsoft Dynamics CRM 2011 Language Pack</a> Disponible en 41 idiomas </li> <li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a995f6ad-0099-42fd-9b22-cf7b3d40a2bf" target="_blank">Microsoft Dynamics CRM 2011 E-mail Router</a> Disponible en 25 idiomas </li> <li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=64a09b75-8376-4b9d-aea3-8a83a1837c4d" target="_blank">Microsoft Dynamics CRM 2011 Report Authoring Extension</a> Disponible en 25 idiomas </li> <li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=23c0f351-8694-4d92-9ddf-34a949aec6a7" target="_blank">Microsoft Dynamics CRM 2011 List Component for Microsoft SharePoint Server 2010</a> Disponible en 41 idiomas </li> <li><a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=420f0f05-c226-4194-b7e1-f23ceaa83b69" target="_blank">Microsoft Dynamics CRM 2011 Software Development Kit (SDK)</a> </li> </ul> <p>Por cierto, que habrá novedades en la creación de reports, la herramienta “Report Authoring Extension” permitirá crear informes “basados en FetchXML”. A ver si tengo tiempo de contar aquí qué tal funciona esta operación (también en mi cabeza hay que hacer “upgrade”).</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigwnknagvH_0I8HQ9xGZPQcBFUgEBSOPPL4RajTJ2UHnRU1Mh2weZy8JNJfY5RfOjvT_4cIRt1w1ZcYVP4ukxgw0_xpXQczOFaghwoYZzp1JlW78hGsGTgBrJfKwIQq9taleFK/s1600-h/updgrade%5B6%5D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="updgrade" border="0" alt="updgrade" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrXgpnFDmXFKkGEz9I-VNyOCl5uZWOHgZy1-5r09F7nU3YPrQHNZm1phal2J_lFdbyvm-xonDtsvwV7_722bUne9S0A4rhF4qGuRJaScajQar71KhGR_ZS8guoVH9VIMwUvarO/?imgmax=800" width="557" height="484" /></a></p> Daniel Sabaterhttp://www.blogger.com/profile/13432225659109438828noreply@blogger.com0