viernes, 28 de diciembre de 2012

“Polaris” (UR12) y su impacto en implantaciones actuales

Hola, como muchos conocerán, este mes está saliendo la nueva actualización de Dynamics CRM 2011 conocida como “Polaris”, “UR12”, o “December 2012 Service Update”. Sinceramente esto de los nombres, versiones y demás, cada vez es mas complicado. Creo que el lío de los nombres pasa porque hay que ponerle un nombre técnico, otro de “marketing” y otro con un marco temporal.

En definitiva, está saliendo el nuevo rollup, que incluye entre otras mejoras integración con Yammer, Skype, y Bing Maps, compatibilidad con Microsoft Office 2013, y la nueva API de gestión de datos masivos (bulk data API). Además se incluyen nuevos navegadores soportados por Dynamics CRM (el tan esperado “cross-browser”)

Las fechas estimativas de despliegue de esta actualización son las siguientes (https://community.dynamics.com/product/crm/crmnontechnical/b/nakedcrm/archive/2012/12/18/polaris-release-dates.aspx):

  • Nuevos CRM trial registrados en EEUU desde el 14 ene 2013
  • Nuevos CRM trial registrados en EMEA y APAC desde el 16 ene 2013
  • Clientes existentes desde el 1 de ene 2013 hasta el 31 de ene 2013
  • Para versiones “On premise” estará disponible el 10 de ene 2013
  • Integración con Yammer y IPAD desde feb 2013 hasta el 28 de feb 2013

Bien, como ven esto se nos viene encima a partir del año nuevo, pero la pregunta es: ¿podemos actualizar sin mas nuestros entornos actuales a la nueva UR12?

Antes de hacer esta actualización, lo mejor sería tener en cuenta unos controles y pasos a seguir que nos harán dar el paso de forma segura (basado en lo recomendado por Steven Foster):

  1. Descargar e instalar el “Microsoft Dynamics CRM 2011 Custom Code Validation Tool”, desde Microsoft (gratis): http://www.microsoft.com/en-us/download/details.aspx?id=30151
  2. Importar la solución en el CRM en el entorno de desarrollo
  3. Ejecutando la solución, nos identificará con colores que partes del código podrían fallar con el UR12
  4. Será necesario un desarrollador para solucionar estos errores modificando el código javascript
  5. Una vez modificado el javascript, se deberá probar la actualización, a ver si funciona todo ok.

Existen una serie de videos en la “Microsoft Partner Network” (MPN) que enseñan como serán las nuevas funcionalidades (http://blogs.msdn.com/b/ukcrm/archive/2012/11/16/crm-online-polaris-release-q4-2012-details.aspx):

Ver también el artículo de Steven Foster: https://community.dynamics.com/product/crm/crmnontechnical/b/nakedcrm/archive/2012/12/27/microsoft-dynamics-crm-2011-polaris-release-and-its-potential-impact-on-current-deployments.aspx?wa=wsignin1.0

un saludo,

martes, 11 de diciembre de 2012

Usuarios y Roles de seguridad

Hola, hoy voy a poner un par de ejemplos de como trabajar con los temas de los roles de seguridad y los usuarios con un par de métodos que suelen ser necesarios.
Frecuentemente necesitamos consultar que usuarios tienen un rol o que roles tiene un usuario determinado. Los roles de seguridad tienen un funcionamiento un poco extraño. Al crearnos un nuevo rol de seguridad, en realidad se duplica el rol por cada una de las unidades de negocio que hay en el sistema. Por esto hay que tener mucho cuidado, ya que si nuestro sistema tiene una gran cantidad de unidades de negocio (mas de mil, por ejemplo), con cada rol que creemos, en realidad se irán creando mil registros. Esto provoca que todo el sistema se ralentice mucho, así que hay que tener mucho cuidado de no crear grandes volúmenes de unidades de negocio.
A continuación, detallo un par de métodos que pueden ser útiles para el trabajo con usuarios y sus roles. En realidad son simplemente dos ejemplos que muestran como mediante consultas de tipo “FetchXml”, se puede consultar. Ambos métodos devuelven un objeto de tipo ArrayList con los resultados.

1) Para consultar que roles tiene un usuario (por guid del usuario):

   1: public ArrayList getUserRoles(string User_Guid)

   2:        {
   3:            ArrayList user_roles = new ArrayList();
   4:            StringBuilder fetch2 = new StringBuilder();
   5:            fetch2.Append("<fetch distinct='true' mapping='logical' output-format='xml-platform' version='1.0'> ");
   6:            fetch2.Append(" <entity name='role'>");
   7:            fetch2.Append(" <attribute name='name'/> ");
   8:            fetch2.Append(" <order descending='false' attribute='name'/> ");
   9:            fetch2.Append("     <link-entity name='systemuserroles' intersect='true' visible='false' to='roleid' from='roleid'>");
  10:            fetch2.Append("         <link-entity name='systemuser' to='systemuserid' from='systemuserid' alias='aa'> ");
  11:            fetch2.Append("             <filter type='and'> ");
  12:            fetch2.Append(String.Concat("   <condition attribute='systemuserid' value='{0}' uitype='systemuser' operator='eq'/> ",User_Guid));
  13:            fetch2.Append("             </filter> ");
  14:            fetch2.Append("         </link-entity> ");
  15:            fetch2.Append("     </link-entity> ");
  16:            fetch2.Append(" </entity> ");
  17:            fetch2.Append("</fetch>");
  18:  
  19:            EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2.ToString()));
  20:  
  21:            foreach (var c in result.Entities)
  22:            {
  23:                user_roles.Add(c.Attributes["name"].ToString());
  24:            }
  25:            return user_roles;
  26:        }



2) Para consultar qué usuarios están en un determinado rol (por nombre del rol):


   1: public ArrayList getUserinRole(string Role_Name)
   2:         {
   3:             ArrayList usersinrole = new ArrayList();
   4:             StringBuilder fetch2 = new StringBuilder();
   5:             fetch2.Append("<fetch distinct='true' mapping='logical' output-format='xml-platform' version='1.0'> ");
   6:             fetch2.Append(" <entity name='systemuser'>");
   7:             fetch2.Append(" <attribute name='systemuserid'/> ");
   8:             fetch2.Append("     <link-entity name='systemuserroles' intersect='true' visible='false' to='systemuserid' from='systemuserid'> ");
   9:             fetch2.Append("         <link-entity name='role' to='roleid' from='roleid' alias='aa'> ");
  10:             fetch2.Append("                <filter type='and'> ");
  11:             fetch2.Append(String.Concat("                     <condition attribute='name' value='{0}' operator='eq'/> ",Role_Name));
  12:             fetch2.Append("                 </filter> ");
  13:             fetch2.Append("         </link-entity> ");
  14:             fetch2.Append("     </link-entity>");
  15:             fetch2.Append(" </entity> ");
  16:             fetch2.Append("</fetch>");
  17:  
  18:             EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2.ToString()));
  19:  
  20:             foreach (var c in result.Entities)
  21:             {
  22:                 usersinrole.Add(c.Attributes["systemuserid"].ToString());
  23:             }
  24:             return usersinrole;
  25:         }
 
 

Un saludo,

jueves, 29 de noviembre de 2012

Microsoft Community Contributor (MCC)

MCC12_Logo_Horizontal_Full-color

Ayer he recibido un email informándome que he sido galardonado con el reconocimiento como “Microsoft Community Contributor” (MCC). Es la primera vez que he sido seleccionado para esta distinción.

Hoy me siento muy orgulloso y agradecido a Microsoft de haber sido seleccionado, y espero poder seguir ayudando a la gente como hasta ahora por diferentes vías (blog, foros, twitter, codeplex, etc.).

Ya aparezco en el listado con todos los MCC’s: https://www.microsoftcommunitycontributor.com/current-recipients.aspx

Descripción del programa MCC:

Through the Microsoft® Community Contributor badge program, we express our thanks to individuals who freely volunteer their time and energy to help improve the Microsoft online technical community experience for others.

More and more technology users are seeking ideas and solutions for enhancing their technology experience through online resources. At Microsoft, we help our customers find answers when and where they want them through online forums such as TechNet, MSDN® and Answers.

Today, up to 4,000,000 people gain valuable information through Microsoft online forums--and that number is growing.

These valuable resources are enhanced by the contributions of Microsoft Community Contributors, who help other participants in a range of ways, such as providing helpful answers, translating online resources into local languages and serving as moderators.

Un saludo,

lunes, 12 de noviembre de 2012

CRM2011GuidFinder en Codeplex (v1.0)

Hola, a raíz de una idea que me daba vueltas por la cabeza, he creado un nuevo proyecto en Codeplex.
Esta vez el funcionamiento que buscaba era que introduciendo un “GUID” (código interno de los registros en CRM), se pueda saber si existe en CRM y si es positivo saber en que entidad existe el mismo.
Para esto he publicado el proyecto en la dirección de codeplex: http://crm2011guidfinder.codeplex.com

Además el código fuente completo del plugin esta disponible aquí: http://crm2011guidfinder.codeplex.com/SourceControl/changeset/view/15414

La solución al importarla incluye:
  • Nueva entidad “Guid Finder”
  • Dll con un Plugin
  • Un paso en el pre-create de la entidad “Guid Finder”
El funcionamiento es muy sencillo. Al crear un nuevo registro de “Guid Finder” se puede introducir el Guid a buscar. Además se le puede decir al plugin que busque en todas las entidades de CRM, o solamente en algunas filtradas (separadas por comas en el campo “Filter Entities"").
Algunas capturas de esta nueva solución:
img1
img2
Además puede verse como resultado el campo “Found Entity” para saber si se ha encontrado el guid en algún sitio, y ademas de un “Execution Log” para ver como se ha ido ejecutando.
A pesar de que pueda parecer poco optimizado en cuanto a rendimiento, no suele tardar mucho en buscar en “All” las entidades.
Espero les sirva, un abrazo!
Demian.

jueves, 8 de noviembre de 2012

Exportador / Importador de datos de relaciones N-N

Hola, hoy voy a publicar una utilidad desarrollada por Andrii Butenko (blog: http://a33ik.blogspot.com.es/) en Codeplex.
Su solución esta desarrollada en Silverlight y está destinada a la posibilidad de exportar/importar datos de relaciones N-N en CRM.
La idea es que lo exportes en un entorno en formato CSV, y luego lo importes en otro entorno.
Los pasos que he realizado son los siguientes:
1) Descarga de la solucion de Codeplex: https://crm2011manytomany.codeplex.com/releases/view/91062
2) importar la solución.
3) he creado una nueva entidad de Paises con una relacion N-N con Contactos:
image
4) me cree unos cuantos países y se los relacioné a un contacto:
imageimage
5) Fui a la aplicación de silverlight (en crm online tarda un poquillo en cargar los desplegables, esperen…), seleccioné la entidad y la relación:
image
6) Exporte en un CSV y me ha dejado lo siguiente:
image
7) luego ya se puede importar ese csv en otro entorno:
image

La funcionalidad la verdad que me ha encantado, solo tiene una pequeña “pega”, que para que funcione es necesario que los “Guids” (códigos internos de CRM) sean los mismos en ambos entornos.
Espero les guste y les sirva a todo.
Un saludo!

martes, 16 de octubre de 2012

Modificando el campo “Fecha de creación” (createdon) en Dynamics CRM 2011

Muchas veces cuando tenemos importaciones o sincronizaciones de datos en CRM, teníamos el problema de que el campo automático de “Fecha de creación” (createdon) se rellenaba automáticamente con los datos de la fecha actual.
Esto provoca que los datos del CRM no sean los mismos que en el origen de la información. Hasta ahora había dos soluciones para esto:
  • Crearse un nuevo campo personalizado de tipo fecha para almacenar esta información
  • Actualizar de forma no soportada la fecha directamente en la base de datos SQL Server.
En CRM 2011, existe otro funcionamiento que permite actualizar este campo de forma soportada. Me parece una funcionalidad muy útil y necesaria. Para explicar esto, me baso en las soluciones propuestas por Vincent Zhong en el blog http://www.magnetism.co.nz/blog.aspx:
Intentaré resumir lo que plantea aquí. Por un lado, se plantea la solución de como actualizar este campo de tipo fecha por código:
   1: private static Guid ModifyCreatedOnDate()

   2:         {

   3:             DateTime thisYear = new DateTime(2012, 1, 24, 10, 30, 00);
   4:             DateTime lastYear = new DateTime(2011, 1, 24, 10, 30, 00);
   5:  
   6:              Entity contact = new Entity("contact");
   7:             contact["firstname"] = "Modify";
   8:             contact["lastname"] = "CreatedOn 2";
   9:             contact["createdon"] = thisYear;
  10:             contact["overriddencreatedon"] = lastYear;
  11:             return sdk.Create(contact);
  12:         }





How to Modify the Created On Value of Dynamics CRM 2011 Part 1


La idea es que al actualizar el campo “overrideddcreatedon”, en realidad lo que se actualiza es el campo “createdon” y la fecha actual (automática) se almacena en el campo “overrideddcretedon” (“Record Created On”). De esta forma, podemos simular que determinados registros fueron creados en otra fecha, sin perder por otro lado la fecha real de creación del registro.

Por otro lado, hay que tener en cuenta que este campo también puede ser modificado mediante el asistente de importación de .CSV estándar de CRM. Simplemente se debe añadir el “mapping” del campo de fecha del CSV al campo “createdon” ya que el campo “overrideddcreatedon” no está disponible para el mapeo.

Espero les sirva esta aportación, un saludo,

Publicado el Rollup 11 para CRM 2011

Hola, la semana pasada ha sido publicado el Rollup 11 para Dynamics CRM 2011. Publicado en el blog del equipo de CRM la semana pasada: http://blogs.msdn.com/b/crm/archive/2012/10/11/update-rollup-11-for-microsoft-dynamics-crm-2011.aspx
Los enlaces de interés son:
Un resumen de lo que dice el artículo de la KB que incluye es:
  • When you upgrade an organization from Microsoft Dynamics CRM 4.0 to Microsoft Dynamics CRM 2011, permissions for the SystemForm entities are not assigned correctly.
  • When you run the Set Regarding function on an email message, the lookup view lists all active accounts. However, you should be able to set a different default view for the lookup.
  • The WAUTH parameter is not supported in Federation Provider properties in the deployment web service.
  • When you run the Mail Merge function, the CRM add-in crashes on the Word Automation services.
  • When you change the First Week of Year setting in the organization settings, the changes are not considered when the system uses the fetch functionality to retrieve some date data that is grouped by week.
  • After you change the reminder time in Outlook, recurring appointments are corrupted.
  • When you perform a Quick Find search on the Activities view, the search may return unexpected results.
  • You cannot hide CRM ribbons in Outlook 2010.
  • The Address Book Sync Entity list is not filtered by security permissions.
  • When you perform bulk operations in Microsoft Dynamics CRM 2011 client for Outlook, you experience slow performance.
  • When you access a CRM website in a claims authentication deployment, the Authentication Engine may reject the request. In this situation, you receive the following error message: 404 - File or directory not found.
  • When you browse to the Discovery service, you receive the following error message: The server was unable to process the request due to an internal error.
    This issue occurs because of the address in the deployment manager.
  • The Rule Deployment wizard does not work in a Microsoft Exchange Server 2003 and Exchange Server 2010 mixed environment.
  • When you use custom menu options, an Internet Explorer script error may occur.
  • The Quick Find search does not apply the user's default date-format setting.
  • The secondary sorting function does not work in a view in Microsoft Dynamics CRM 2011 client. This issue occurs when the DisableMapiCaching registry key is enabled.
  • Workflow instances that are upgraded from Microsoft Dynamics CRM 4.0 workflow definitions do not work correctly when the workflow definitions use owning users or owning teams.
  • The CreatedOn and ModifiedOn values for a UOM Primary Unit record are generated in incorrect formats in the database.
  • Microsoft Dynamics CRM 4.0 client for Outlook does not work correctly when you connect the client to a Dynamics CRM 2011 organization.
  • When you perform a synchronization in Outlook 2007 that has the Cached Exchange mode disabled, the synchronization tries to re-promote CRM email activities that were sent through a web client.
  • When you try to close the Print Preview form, a script error occurs. This issue occurs when a tab that contains a subgrid is hidden.
  • When you import a managed solution, audit records are generated unexpectedly.
  • Dynamics CRM claims-based authentication does not work with trusted partner Active Directory Federation Service (ADFS) users.
  • After you change the searchable setting for a Dynamics CRM 2011 attribute in the editor form, all fields in the editor form are dimmed unexpectedly.
  • When you import a solution that contains a field that has the searchable value set to No, the searchable setting of the field is not updated correctly.
  • When you install Microsoft Dynamics CRM 2011 client for Outlook on a computer that is running Windows 8, Windows Identity Foundation (WIF) is not enabled.
  • The JavaScript editor is limited to 2,000 characters unexpectedly. In this situation, a script that contains more than 2,000 characters may be truncated.
  • When you configure Microsoft Dynamics CRM 2011 client for Outlook to use SQL Server CE 4.0, the client crashes.
  • When you try to import a solution, you receive the following error message: The solution package cannot be imported because it contains invalid XML.
  • The Quick Find search fails and displays no result.
  • When you save a form, the save action may be blocked by an update action of the background main page grid.
  • The following error message is logged in the Microsoft Dynamics CRM client trace log: NullReferenceException <InvalidateItemCache>
  • Save of a form is blocked by refresh of the background main page grid.
  • Scheduling dialog box form pops up after you save a rescheduled service activity.
  • Duplicate Detection job does not show more than 12 records, and page navigation is disabled.
  • "There was an error displaying the records in this view" error message when you use special filters Incidents.
  • Cannot set X and Y fields in charts in Outlook.
Un saludo,

viernes, 5 de octubre de 2012

Microsoft Dynamics CRM 2011 Rollup 10: Publicado (de nuevo)

Hola, desde la publicación del último UR 10 (Update Rollup 10), algunos hemos experimentado una serie de errores, especialmente graves en entornos que habían sido previamente migrados de la versión de CRM 4.0.
Después de muchas incidencias abiertas a soportes por parte de los partners y clientes de todas partes, se ha publicado un nuevo “release” del mismo Rollup.
El enlace para la descarga es el mismo que el anterior: http://www.microsoft.com/en-us/download/details.aspx?id=30711 pero atención a dos cosas:
  • La fecha de publicación es del 4 de Octubre
  • La versión es 05.00.9690.2740 ( la anterior era 05.00.9690.2730)
Por otro lado la KB del Rollup no ha sido actualizada (por lo menos hasta el momento de la publicación de este post), pero en los foros de CRM he podido encontrar esta información de lo que se resuelve proporcionada por una persona Microsoft:
Hay mas información acerca de estos errores en: http://social.msdn.microsoft.com/Forums/es-AR/crmdeployment/thread/19adc0c0-b888-499d-aa3a-d922e0c691da

De todos modos, el próximo 10/10/2012 está planificada la publicación del siguiente Rollup 11: http://support.microsoft.com/kb/2739504/en-us (allí dice "Update Rollup 11 for Microsoft Dynamics CRM 2011 will be available for on-premises customers on October 10, 2012. ")

Un saludo,

jueves, 4 de octubre de 2012

Universal Search para Dynamics CRM 2011

Las búsquedas avanzadas y las búsquedas rápidas de Dynamics CRM están muy bien, pero hay algo que no logran hacer (al menos de momento): Buscar de forma mediante un filtro único en varias entidades diferentes.
Recientemente se ha publicado una solución que permite realizar búsquedas en varios registros a la vez de forma que aparezca algo como lo siguiente:
image
Para acceder al mismo, se añade un nuevo botón en el “Ribbon”:
image
La gran ventaja de esta solución no solo es que es gratuita (FREE!) sino también que permite personalizar y definir bastantes parámetros de su funcionamiento.
Esta solución ha sido desarrollada por Sonoma Partners y puede ser descargada directamente del Microsoft Dynamics Marketplace: http://pinpoint.microsoft.com/en-us/applications/universal-search-for-microsoft-dynamics-crm-2011-free-12884946856 y hay un ejemplo de su funcionamiento en este vídeo: http://www.youtube.com/watch?feature=player_embedded&v=KGaVQtSEFiM
Al descargarse e importar la solución tiene una configuración como la siguiente:
image
Para más información: http://www.sonomapartners.com/News/PressReleases/12-10-3-universal-search.aspx
Un saludo,

viernes, 28 de septiembre de 2012

FetchXml Error CRM 2011: “Number of link entities in query exceeded maximum limit”

En CRM una de las formas de hacer consultas a través de los web services es a través de los famosos “FetchXML”. ( ver sdk: http://msdn.microsoft.com/en-us/library/gg328117.aspx)
De esta forma y con un lenguaje basado en formato XML, podemos hacer consultas de forma bastante sencilla, incluso se permite hacer “joins” mediante los “link-entity” ademas de otras funcionalidades (ver el esquema de los “FetchXml” aquí: http://msdn.microsoft.com/en-us/library/gg309405.aspx).
Bien, aquí hay un ejemplo de un XML con una “linked-entity” (Join):
   1: <fetch mapping='logical'>

   2:    <entity name='account'>

   3:       <attribute name='accountid'/>

   4:       <attribute name='name'/> 

   5:       <link-entity name='systemuser' to='owninguser'> 

   6:          <filter type='and'> 

   7:             <condition attribute='lastname' operator='ne' value='Cannon' /> 

   8:           </filter> 

   9:       </link-entity> 

  10:    </entity> 

  11: </fetch> 

 
El problema es que la vida a veces nos lleva a realizar consultas mas grandes, con muchas entidades relacionadas.

En caso de hacer una consulta muy grande en cuanto a linked-entities, hay que tener en cuenta que hay un máximo definido que es de 10. Si nos pasamos de esto, nos puede aparecer un error como el siguiente:


   1: <error> 

   2:   <code>0x8004430d</code> 

   3:   <description>Number of link entities in query exceeded maximum limit.</description> 

   4:   <type>Platform</type> 

   5: </error>

 
Ante esto, hay una solución no soportada, que pasa por crear un registro nuevo en la base de datos de configuración del CRM (MSCRM_CONFIG). El registro es un parámetro con el nombre “QueryLinkEntityLimit”. En el siguiente ejemplo lo amplío a “20”.


   1: INSERT INTO DeploymentProperties(Id,ColumnName,IntColumn,Encrypted)

   2: VALUES('6C3BE16F-943B-E111-9AE4-00155D010A39','QueryLinkEntityLimit',20,0)

   3:  

   4: select * from DeploymentProperties where ColumnName='QueryLinkEntityLimit'
 

En primer valor en el campo “Id", se debe introducir el mismo Id que el resto de registros.

Espero les sirva. tener en cuenta que esto es una solución no soportada, y que solo funciona en entornos OnPremise.


Saludo!

jueves, 27 de septiembre de 2012

Authenticación en plugins y diferencias entre 4.0 y 2011

Hola,  como muchos habrán utilizado alguna vez, al trabajar con Plugins, a veces es difícil saber con que usuario se realizan las acciones que se desarrollen en el mismo.

Primero hay que tener en cuenta en el registro de los Plugins, en donde se puede seleccionar que dicho paso se ejecute con un usuario específico, o por el contrario el “Calling User”, que permitirá que en el contexto se “pase” el id del usuario que ha lanzado el Plugin:

image

Una vez que estamos en el código, debemos conectarnos al CRM para realizar diferentes acciones como por ejemplo una consulta, una actualización, etc.

Para esto se utiliza en 2011 el método IOrganizationServiceFactory.CreateOrganizationService (http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.iorganizationservicefactory.createorganizationservice.aspx).

En CRM 4.0 se utilizaba el método IPluginExecutionContext.CreateCrmService (http://msdn.microsoft.com/en-us/library/bb959583.aspx).

Para saber como podemos autenticarnos en los plugins dejo un listado que además muestra las diferencias entre 4.0 y 2011:

Tipo CRM 4.0 CRM 2011
Usuario conectado (Calling User) ICrmService service = context.CreateCrmService(true);
IOrganizationService service = serviceFactory.CreateOrganizationService(Guid.Empty);
Un usuario específico ICrmService service = context.CreateCrmService(context.UserId); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
System User ICrmService service = context.CreateCrmService(false); IOrganizationService service = serviceFactory.CreateOrganizationService(null);

Un saludo,

viernes, 31 de agosto de 2012

Error con UR 10: The element 'savedquery' has incomplete content. List of possible elements expected: 'LocalizedNames'.

Hola, como todos saben, recientemente Microsoft ha publicado el último “Update Rollup” (10) de CRM 2011 (http://www.microsoft.com/en-us/download/details.aspx?id=30711)

Como siempre recomiendo, estas actualizaciones son siempre necesarias ya que se solucionan error y se mejora el rendimiento. Pero esto hay que hacerlo SIEMPRE primero en entornos de desarrollo y probar todo bien.

Bien, ahora aparentemente con este Rollup ocurre un problema, que según he probado, solo pasa en entornos OnPremise migrados desde la versión 4.0.

El problema es que al exportar una solución que contenga cualquier entidad, y se desee volver a importar la misma, aparece el siguiente error:

The element 'savedquery' has incomplete content. List of possible elements expected: 'LocalizedNames'.

Investigando, he visto que esto ocurre porque al exportar hay un error, y se añade en el XML de la entidad una nueva vista que no debería estar allí, que no contiene el tag “LocalizedNames”.

Para ver el problema, podemos abrir el ZIP con la solución, y editar el fichero Customizacions.xml

image

Allí se puede ver esa nueva vista (que no aparece en ningún sitio) que no tiene nombres (“LocalizedNames”) y que tiene como columnas “statecode” y “ownerid” (Estado y Propietario).

Para solucionar este error de momento encontré 2 caminos (los dos son no soportados):

1) Añadir un nodo LocalizedNames a esta vista como por ejemplo:

image

2) Eliminar completamente esta vista.

De las dos maneras el error desaparece y parece que funciona correctamente.

De momento parece ser que no hay solución a este problema, les dejo un “hilo” del foro de Microsoft con otra gente que tiene este mismo problema.

http://social.msdn.microsoft.com/Forums/es-AR/crmdeployment/thread/19adc0c0-b888-499d-aa3a-d922e0c691da

Un saludo,

lunes, 20 de agosto de 2012

DynamicForm: Tutorial de implantación

Completando el artículo del otro día, lo que voy a hacer hoy es explicar como implementar paso a paso (“Step by Step”) la librería y como ponerla en funcionamiento.

La primera opción, podría ser el descargarse la solución completa de Codeplex y luego importarla: http://elblogdedynamicscrm.codeplex.com/releases/view/87885

La versión actual es la DynamicForm_2_1_0_0.zip. Importando y publicando la misma, ya podéis ver funcionando todo lo explicado en el formulario de Cuentas. Solo haría falta crearse algunos países en la entidad con el mismo nombre.

Tener en Cuenta que la solución tiene personalizaciones en Cuenta y Países, además de crear algunos web resources y en es “No Administrada”, por lo cual no se podrá desinstalar:

image

Otra opción pasaría por implementarlo poco a poco y a “mano”. La idea es mostrar como implementar la librearía en el caso real con los ejemplos que ya he montado yo. Esto permitirá entender como funciona.

Los pasos serían los siguientes:

1) Creación de WebResource DynamicForm:

image

El código fuente que se debe incluir en el mismo está en codeplex en el fichero DynamicForm_2.1.js: http://elblogdedynamicscrm.codeplex.com/SourceControl/changeset/view/14049#219034

2) Creación Web Resource con jquery:

image

El código fuente que se debe incluir en el mismo está en codeplex en el fichero jquery.js:

http://elblogdedynamicscrm.codeplex.com/SourceControl/changeset/view/14185#227690

3) Creación del Web Resource ReadDataSyncFunctions

image

El código fuente que se debe incluir en el mismo está en codeplex en el fichero ReadDataSyncFunctions.js:

http://elblogdedynamicscrm.codeplex.com/SourceControl/changeset/view/14186#227691

4) Creación del Web Resource con el XML de configuración

image

El código fuente que se debe incluir en el mismo está en codeplex en el fichero new_test_xml.xml:

http://elblogdedynamicscrm.codeplex.com/SourceControl/changeset/view/14187#227692

5) Creación de la entidad de Países:

image

6) En Cuentas se deben crear dos atributos, uno de tipo Lookup a Paises y otro de tipo ntext:

image

7) Personalizaciones en el formulario de Cuenta para añadir funcionalidades

En la siguiente imagen muestro como he dejado el formulario de cuentas, y he marcado los IFRAMES que he creado con sus nombres.

image

La configuración de los 3 IFRAMES es similar y es como lo siguiente:

imageimageimage

La idea es que en el formulario, estén añadidos todos los campos, secciones y pestañas utilizados en el XML anterior. Además es necesario crear los IFRAMES donde se incluirán las funcionalidades de combo, radio y múltiple selección.

8) Añadir los recursos web con el javascript que se utilizará en el formulario:

image

Es importante mantener el orden:

  • jquery
  • ReadDataSyncFunctions.js
  • DynamicForm

9) Añadir las llamadas necesarias en los eventos:

OnLoad y OnSave del formulario:

image

image

Y en los campos utilizados para las funcionalidades de la librería:

image

image

image

image

image

image

image

image

image

image

Espero les sirva este paso a paso a entender como está “montada” la solución y como funciona.

A partir de ahora intentaré ir mejorándola mas poco a poco.

Un abrazo a todos!

Demian.

viernes, 17 de agosto de 2012

Publicado Rollup 10 de CRM 2011

Se ha publicado el nuevo Rollup 10 para CRM 2011.
En este artículo se explica lo mas importante de este Rollup: http://blogs.msdn.com/b/crminthefield/archive/2012/08/13/overview-and-podcast-update-rollup-10.aspx

Lo más importante a tener en cuenta con este Rollup, se incluye en este artículo, relacionado con temas de optimización de CRM: "Optimizing and Maintaining the Performance of a Microsoft Dynamics CRM 2011 Server Infrastructure": "http://www.microsoft.com/en-us/download/details.aspx?id=27139

Para descargarlo: http://www.microsoft.com/en-us/download/details.aspx?id=30711&WT.mc_id=rss_allproducts_dynamics
 Artículo KB completo: http://support.microsoft.com/default.aspx?kbid=2710577

un saludo,

lunes, 13 de agosto de 2012

DynamicForm: Resumen de funcionalidades

Hola, creo que ha llegado el momento de hacer un pequeño (y rápido) resumen, de todas las funcionalidades incluidas hasta hoy en nuestra librería.
El objetivo de esta librería no es solamente ofrecer funcionalidades adicionales que CRM 2011 no tiene, sino también ir explicando como lo voy haciendo, para dejar ideas de como añadir funcionalidades en CRM 2011 diferentes.
Como todos saben, la idea principal de la misma, es que mediante un XML ubicado en un WebResource de Dynamics CRM 2011, se puedan definir comportamientos dinámicos dentro del formulario de CRM.
De esta manera, se puede “jugar” con estas funcionalidades sin necesidad de programar nada en javascript, sino que los comportamientos pueden ser administrados mediante la modificación del XML y alguna personalización.
La idea en resumen es como lo siguiente:
image
Las soluciones completas, códigos fuentes y documentaciones las tenemos incluidas en un sitio común y abierto en CodePlex: http://elblogdedynamicscrm.codeplex.com/documentation
A continuación haré un resumen de cada una de las funcionalidades. Para ver mas en profundidad acerca del funcionamiento de cada una, recomiendo revisar los correspondientes artículos publicados anteriormente.
1) Ocultamiento de campos, secciones, pestañas y nivel de requerimiento de campos dinámico dependiendo de una condición del valor de un campo.
En el siguiente XML, se puede definir un campo de condición, y dependiendo del valor seleccionado de mismo, se pueden ocultar o mostrar campos, secciones y pestañas. Además se puede definir el nivel de requerimiento de los campos (obligatorio, recomendado u opcional).
   1: <attributes>
   2:     <attribute name="accountcategorycode" value="1" 
   3:         showattributes="primarycontactid,accountnumber"hideattributes="" 
   4:         showsections="general/address,general/shipping information" 
   5:         hidesections="" showtabs="notes and activities,administration" hidetabs="" 
   6:         setrequiredlevel="required:fax-address1_city,recommended:address1_name"/>
   7:     <attribute name="accountcategorycode" value="2" showattributes="" 
   8:         hideattributes="primarycontactid,accountnumber" showsections="" 
   9:         hidesections="general/address,general/shipping information" 
  10:         showtabs="" hidetabs="notes and activities,administration"
  11:         setrequiredlevel="none:fax-address1_city-address1_name-websiteurl"/>
  12: </attributes>
image

2) Concatenaciones de campos

Con el siguiente XML, se puede definir una “action” en donde se define un campo destino, y varios campos que serán concatenados. Además se puede definir que valor tendrá el string de concatenación.


   1: <action type="concat" destattribute="description" 
   2:     attributestoconcat="address1_name,address1_line1,address1_line2,address1_line3,
   3:     address1_city,address1_postalcode,address1_stateorprovince,address1_country,
   4:     address1_telephone1"
stringseparator=";"/>

image

3) Validaciones de campos según tipos
La idea de esta funcionalidad es que se puedan definir validaciones de campos dependiendo del contenido de negocio que se le quiere dar a determinados campos. Por ejemplo, validar que solo se introduzcan númericos, campos de tipo dirección de correo electrónico, de tipo dirección ip, de tipo URL, etc.
Esto se define con el siguiente XML, que además contempla que los mensajes de error en las validaciones aparezca en la parte superior de formulario:

   1: <validations>
   2:     <validation attributename="accountnumber" type="number" RegEx=""/>
   3:     <validation attributename="address1_name" type="email" RegEx=""/>
   4:     <validation attributename="address2_line1" type="ipaddress" RegEx=""/>
   5:     <validation attributename="address2_line2" type="url" RegEx=""/>
   6: </validations>


 
image



4) Diseño de los campos del formulario

Mediante los siguientes XML lo que se puede hacer es cambiar los colores de fondo de los campos y de los textos.

   1: <action type="backgroundcolor" attributename="description" color="#FFF00F"/>
   2: <action type="backgroundcolor" attributename="address1_line1" color="#FF660F"/>
   3: <action type="backgroundcolor" attributename="address1_line2" color="#33300F"/>
   4: <action type="backgroundcolor" attributename="address1_line3" color="#55500F"/>
   5: <action type="fontcolor" attributename="address1_line2" color="#FFFFFF"/>
   6: <action type="fontcolor" attributename="address1_line3" color="#FFFFFF"/>

 
image


5) Convertir un Lookup en un despegable

La idea de este XML, es que la introducción de un campo de tipo Lookup, pueda ser realizada mediante un desplegable.


   1: <action type="lookuptocombo" attributename="new_paisid" entityname="new_pais" 
   2:     entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_pais"/>

image



6) Convertir un Lookup en un selector de tipo Radio

El siguiente XML, convierte un campo de tipo Lookup en un selector de tipo radio.


   1: <action type="lookuptoradio" attributename="new_paisid" entityname="new_pais" 
   2:     entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_paisradio"/>
image


7) Introducción de un campo de tipo selector múltiple (checkbox) de una entidad

La idea de esta funcionalidad, es que mediante un selector múltiple (checkboxes), se puedan seleccionar diversos valores provenientes una entidad de CRM.

El XML que define esta funcionalidad es el siguiente:


   1: <action type="multipleselect" attributename="new_paises" entityname="new_pais" 
   2:     entityid="new_paisid" entityattributename="new_name" iframename="IFRAME_paismultiple"/>

image


Bueno, esperamos seguir avanzando con mas ideas y mas funcionalidades. Se aceptan sugerencias Guiño


un saludo,