28/9/15

Obtener roles y privilegios de un usuario con FetchXml

Los 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 Filtered 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:
  1. Crear un informe principal que obtiene información de seguridad del usuario actual.
  2. Crear un informe secundario con los datos que realmente queremos mostrar.
  3. En el informe principal, comprobar si el usuario tiene permisos de lectura en la entidad y, en caso afirmativo, mostrar el informe secundario.
¿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 CRM_FullName y llenando un DataSet con la información siguiente:

Para obtener los roles de seguridad del usuario actual:

<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>

Para obtener los privilegios de lectura del usuario actual:

<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>

Una vez creado el DataSet (lo he llamdo Privileges), controlamos la visibilidad del subinforme con una expresión similar a lo siguiente:

=Lookup("prvReadaccount",Fields!p_name.Value,Fields!rp_privilegedepthmaskValue.Value,"Privileges")

Que básicamente busca en el DataSet a través de la función Lookup un privilegio de nombre prvReadaccount. 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.

18/8/15

Enlazar a un informe estático desde un formulario

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 chorrada 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 webresource con el PDF y otro webresource con el enlace que apunte al primero. Pero hay un problema: los tipos de webresource son:

  • HTML
  • CSS
  • Javascript
  • XML, XSL
  • Imagen (jpg, gif, png)
  • Silverlight
  • Icono

¿Dónde está el tipo PDF? Pues no está, punto. Si creamos un PDF, le cambiamos la extensión, lo subimos como un CSS... muy complicado.

La solución viene de nuestros amigos los informes. La opción más habitual al crear un informe es cargar ficheros RDL con la opción Cargar un fichero existente. 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:

..../CRMReports/reportproperty.aspx?id=%7bFAFAFAFA-AAFA-FAFA-FAFA-111111111111%7d

Nos apuntamos el código GUID del informe, en este caso: FAFAFAFA-AAFA-FAFA-FAFA-111111111111

Y creamos un webresource de tipo HTML con el siguiente código, que incluye una llamada a crmreports/download.aspx que hace justo lo que su nombre sugiere.

<a href="/crmreports/download.aspx?id=%7bFAFAFAFA-AAFA-FAFA-FAFA-111111111111%7d">Descargar PDF</a>

Ojo, no olvidéis el %7b y el %7d, 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 webresource en una solución, exportamos e importamos, el enlace seguirá funcionando.

20/3/15

Error: Could not retrieve salesperson role

No 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:

Desde la versión 2011 Dynamics CRM permite importar registros de tipo Usuario y Equipo 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 Salesperson (Representante de ventas 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:

Could not retrieve salesperson role
Errores durante el proceso de importación

Por qué podría haber desaparecido el rol? Alguien bien intencionado ha hecho "limpia" y se ha pasado de la raya... En cualquier caso, la solución a este problema sería:

  1.  Ir a otra instalación de Dynamics CRM que sí tenga el rol Salesperson
  2.  Crear una solución vacía e incluir el rol Salesperson en la solución
  3.  Exportar e importar en la instalación original.
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:

a4be89ff-7c35-4d69-9900-999c3f603e6f

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.

8/5/14

Retornar JSON dinámico desde un servicio WCF

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 endpoint 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 System.Object, un string o un dynamic. Mi primera opción fue usar un string, 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 este blog de Carlos Figueira 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 Stream.

[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));
}

La línea en la que se establece el ContentType 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.

11/6/13

Oscuro error Javascript al ejecutar un informe

He aquí un error que he podido solucionar en minuto y medio gracias a una blogueresa (?) llamada Arpita y que de otra manera habría llevado horas. Al lío: al ejecutar un informe ocurre lo siguiente en el navegador:



Esto se debe (agárrate) a que:
1. El usuario actual se creó en una organización diferente a aquella en la que se está ejecutando el informe.
2. Esa organización primitiva está habilitada..
3. En esa organización, el usuario actual no tiene asignado rol de seguridad.

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.

Qué cosas...

Enlace al artículo completo:
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

29/5/13

Incluir librerías Javascript en una acción del Ribbon

El 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 jquery en esa función? El código de esa librería lo tendremos probablemente en otro 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 isNaN. En la siguiente captura, quiero añadir el código de la librería json2.js

La función "fantasma" justo encima de la que contiene el código que queremos ejecutar

La idea la encontré en este post de Rajeev Pentyala y la captura de pantalla es del Ribbon Editor del legendario autor de Dynamics CRM Tools Tanguy

8/5/13

Un mensaje de (des)esperanza

Inauguro aquí la sección crueldad en los mensajes de error. El siguiente me lo he encontrado al intentar guardar un formulario de CRM, y la verdad, no deja mucho lugar al optimismo.

















Con cursiva y en español es más bonito aún, fijáos:

"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."

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.

5/4/13

Añadir enlaces en el SiteMap a un tipo específico de actividad

La 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 este que te acaba de resolver la duda.

Necesitaba un enlace a la actividad correo electrónico pero lo que obtenía en lugar de eso era un enlace a la lista general de actividades. El resultado es que el usuario tiene que hacer otros dos clicks para llegar hasta la vista.

El formato que estaba usando es:

_root/homepage.aspx?etn=email&viewid=%7b4C8B1482-BD55-E211-85BE-005056A379C7%7d&viewtype=1039

Y el detalle que falta: especificar el tipo con type=x

_root/homepage.aspx?etn=email&type=email&viewid=%7b4C8B1482-BD55-E211-85BE-005056A379C7%7d&viewtype=1039

¡Gracias, internet!

31/1/13

Incluir una imagen en un formulario

Esta 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 WebResource de tipo HTML y de nombre imageContainer. El código siguiente iría en el evento OnLoad del formulario contenedor:

$(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);
 }

6/6/12

Generando un script de SQL de exportación de datos

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 Microsoft SQL Server Management Studio, o sea, la herramienta de gestión de toda la vida. 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.

1. Seleccionar la base de datos y escoger Generate scripts en el menú de contexto.

1_generatescripts

2. Escoger las tablas para exportar.

2_selectobjects

3. Pulsar Advanced -  para mostrar las opciones avanzadas.

3_options

4. Seleccionar la el valor Schema and data en la opción Types of data to script.

4_advanced

5. Y ya está, obtendremos un script con todos los INSERT que necesitamos para recrear la base de datos en su estado actual.

7_script

16/5/12

Afinando la configuración del E-Mail Router

Me refiero al E-mail Router 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 Microsoft.Crm.Tools.EmailAgent.xml En concreto, para una instalación en la que estoy trabajando, pensamos en modificar el parámetro BatchSize, que originalmente está a 5 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 enlace.

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 aquí.

image

Para solucionar esto hay un hotfix. Después de aplicado, podemos modificar los valores pero no directamente, sino añadiendo una nueva sección ProviderOverrides. Ejemplo:

image

Cómo hacer que los parámetros sean óptimos ya es harina de otro costal…

19/9/11

CRM Reports Uploader and LOcalizer

Hace unos meses (antes del verano, parecen años…) comenté en este blog 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) dos informes (en realidad un informe y un sub-informe) que había que publicar en tres idiomas. Cada vez que había que hacer un cambio, por lo tanto tenía que, en el peor de los casos:

  • Modificar los informes en el idioma base
  • Modificar las cuatro traducciones
  • Subir los seis informes a CRM

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 CRM Reports Uploader and LOcalizer (CrmRULO) y lo he colgado en codeplex.

crmrulo

Si hay alguien ahí fuera, por favor, que deje comentarios, críticas, alabanzas… en el sitio de codeplex.

5/9/11

Importar ficheros adjuntos en CRM 2011

Un tema poco documentado y que puede ser fuente de bastantes frustraciones: aunque el nuevo sistema de importación de CRM está muy bien, ¿qué pasa cuando tenemos un montón de datos en forma de ficheros adjuntos? Los ficheros adjuntos se representan internamente con la entidad attachment aunque en la interfaz de usuario aparecen como Notas.

El proceso es así:

  1. Exportar los registros Nota que nos interesen mediante una búsqueda avanzada. No olvidar incluir la columna Regarding apuntando al registro padre de la nota. Los registros padre deben haber sido importados previamente.
  2. Guardar el excel obtenido con formato XML Spreadsheet 2003 Por ejemplo notes.xmlattachments_-1
  3. Añadir el campo PhysicalFileName con el mismo contenido que la columna File name.attachments_00
  4. Crear una carpeta Attachments y copiar en ella los ficheros adjuntos que queramos importar.
  5. Crear un fichero zip con el fichero notes.xml y la carpeta Attachments.
    Nota: si el tamaño total del fichero resultante es mayor de 8 MB ver la sección Ficheros grandes.
    attachments_01
  6. Desde el importador, mapear el campo PhysicalFileName a Document
  7. Mapear también el campo Regarding al nombre (o campo principal) de la entidad padre.attachments_02
  8. Por último podemos guardar el mapa creado por si necesitamos reutilizarlo más adelante.


Ficheros grandes

Lo que significa aquí grande 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.

  1. Repartir los ficheros en varias carpetas para que cada zip resultante sea de aproximadamente 5 MB.
  2. Copiar el fichero notes.xml en cada una de las carpetas.
  3. Crear n ficheros attachments1.zip, attachments2.zip etc
  4. Repetir el proceso de arriba para cada fichero zip.

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.

Gracias a David E. que comentó el punto clave del atributo PhysicalFileName.

5/8/11

Reports en CRM 2011: lecciones aprendidas

Llevo unos días trabajando en un proyecto de migración del CRM de mi empresa a Microsoft Dynamics CRM 2011 Online. 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:

  • Si nuestra instalación de CRM es Online, los reports no se pueden basar en consultas SQL, sino en FetchXML. Para que el BIDS (Business Inteligence Development Studio) funcione con estos reports hay que instalar un complemento que viene incluido en el instalador de CRM.
  • 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 resx. Hay algunas alternativas, como por ejemplo incluir código .NET en el informe, pero esto no es posible en la versión Online, ya que requiere instalar las DLLs en la GAC.
  • 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 parentreportid.
  • Las vistas por defecto de informes muestran los que están en el idioma del usuario y los marcados como Todos los idiomas (-1) 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 languagecode a –1 los usuarios verán el informe independientemente del idioma que hayan seleccionado.
  • 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.

Conclusión: estaría bien fabricar una herramienta que permita:

  • Localizar un report a varios otros idiomas.
  • Publicar un conjunto de reports al servidor en una sola acción.

¿Alguien se anima a hacerla? Sonrisa

22/7/11

Tribulaciones con Silverlight en IFD

Hace poco (poquísimo, o sea, hoy) he tenido que investigar un problema que surge cuando instalamos el Internet Facing Deployment en una instalación de Dynamics CRM 4.0

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 Silverlight. El problema es que mis páginas Silverlight se comunican con un servicio WCF que he colgado en la carpeta ISV del servidor.

Al acceder a este servicio salta el error:

This collection already contains an address with scheme http

Pues bien, para que ese servicio funcione con la nueva URL, tenemos que hacer este cambio en su web.config:

<serviceHostingEnvironment aspNetCompatibilityEnabled="false">
  <baseAddressPrefixFilters>
    <add prefix="
http://deploy.crmdomain.local"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

Este truco lo encontré en este post de los foros de Microsoft por Dan Crowell.

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.

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]

Esta solución viene del post Calling silverlight WCF service over IFD deployment of CRM de los foros de CRM, y hay que agradercérselo a Rajeshreddy Keesara de los foros de Silverlight.

¡Gracias!

20/7/11

Dos cosas buenas del importador de datos en CRM 2011

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 herramienta DMF o Data Migration Framework, 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.

importador

En esta foto podéis apreciar las dos funcionalidades que comento:

1) Se pueden importar ficheros zip con más de una entidad a la vez. Esto es imprescindible cuando tenemos referencias circulares. (El contacto pertenece a una cuenta que tiene como contacto principal al contacto, toma trabalenguas)

2) Se puede hacer rollback de la importación. Si algo va mal (me da la risa) se crea un proceso asíncrono de borrado de todos los elementos que se han importado.

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 :-)

En fin, que seguimos mejorando.

23/6/11

Nuevo kit de demostración para CRM Online

Acaba de publicarse un recurso que será de mucha utilidad para comerciales, ingenieros pre-venta y aficionados a CRM en general. Se trata del Microsoft Dynamics CRM Online Demonstration Kit 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.

Incluye un montón de recursos:

  • 13 Dashboards
  • 17 Workflows
  • 2 Diálogos
  • 1 Web Resource (jscript para formateo de números de teléfono)
  • 1 Option Set
  • 2 Plantillas de correo electrónico

Por cierto, que los dashboards dan pistas sobre cómo aprovechar la nueva entidad Objetivo (Goal) en su versión reporting.

Gracias al equipo de Dynamics CRM, de nuevo.

8/6/11

Acceso directo a la FAQ de Dynamics CRM

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: Send feedback.

image

Se han dedicado a recoger preguntas reales de usuarios y clientes de CRM y responderlas en una FAQ que se puede acceder aquí: http://rc.crm.dynamics.com/rc/2011/en-us/online/5.0/faq.aspx

Muy útil como primera medida, antes incluso de ponerse a buscar en los foros.

4/5/11

Nuevo blog de Dynamics CRM en español

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 el blog de Dynamics CRM. Son Pablo Peralta, Jimmy Larrauri y Atilio Rosas, viejos conocidos de los grupos de news de CRM en español.

elblog

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.

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.

¡Bienvenidos!