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,