sábado, 19 de abril de 2014

Funcionamiento avanzados de los sub Grids

No se si les ha ocurrido, pero por si les ocurre en algún momento, voy a explicar como funciona una funcionalidad de las que mas me gusta de Dynamics CRM 2013.

Es la funcionalidad de poder relacionar rápidamente registros “hijos” desde un formulario.

Añadir un registro existente a uno padre, consiste básicamente en cambiar ese campo “Lookup” del hijo, para relacionarlo con un nuevo registro “padre”.

Básicamente me refiero que teniendo una Cuenta por ejemplo si quiero añadirle ventas, lo que tengo que hacer es lo siguiente:

imageimage

Pero hay veces que al darle al “+” inicial, en vez de abrirnos eso, nos abre directamente el formulario de Creación rápida de la entidad (si lo tiene habilitado) o el formulario de creación principal.

Otra opción para probar es abrir el grid y ver que ocurre allí:

imageimage

Desde allí tengo la misma experiencia. La pregunta es, ¿por qué algunas relaciones se comportan así y otras nos permiten añadir de esta forma mas rápida?

La respuesta es sencilla, y depende del tipo de relación con el hijo. Si el Lookup que define la relación, lo definimos como “Requerido por la empresa”, el comportamiento cambia y esta funcionalidad deja de existir.

image

El botón de “Agregar…” desaparece, y al intentar añadir nuevos registros me abre el formulario de creación rápida:

imageimage

Por lo tanto, en este tipo de relaciones y formularios, al momento de personalizar formularios visualmente hay que tener en cuenta también si el campo es requerido o no.

Espero les sirva esto.

un saludo

domingo, 13 de abril de 2014

Nuevamente MVP y además MAP 2014!

Hola, estas dos últimas semanas, he recibido dos noticias muy motivadoras y que me hacen seguir adelante cada vez más en mis contribuciones a las comunidades de Microsoft.

En primer lugar, Microsoft me ha vuelto a nominar como MVP (Microsoft Most Valuable Professional) para el año 2014, cosa de la que me siento muy muy orgulloso  y agradezco mucho a @Microsoft y al programa @MVPAward.

Esta semana además el equipo MSDN de España, me ha nominado MAP (Microsoft Active Professional) para el año 2014. Esta es una distinción local en España, que premia a los colaboradores de las comunidades de España y otros países.

Aprovecho para comentar que mi visión es que las comunidades de Microsoft y sus colaboradores por todo el mundo ayudan a que los profesionales que utilizan tecnologías de Microsoft puedan trabajar mejor, aprender, hacer networking y mejorar los productos de esta gran empresa.

En mi experiencia personal, el colaborar en las comunidades me ha hecho conocer gente muy interesante y así ampliar mis contactos directos con profesionales que comparten mis mismas inquitudes técnicas. Por otro lado, aprendo muchísimo respondiendo consultas en los foros, publicando artículos técnicos o creando proyectos en CodePlex.

Estos tipos de programas muestran la importancia que da Microsoft a los mismos, y ayudan a que los colaboradores mas activos, fomenten la aparición de nuevos participantes.

Saludos!

Gracias Totales.

viernes, 4 de abril de 2014

Moviendo datos entre entornos diferentes

Algo que se usa mucho, y de hecho se hace en casi todos los proyectos de CRM, es que una vez que he terminado de desarrollar todo y voy a hacer la subida a los entornos de PRE, UAT, PRO, etc. hace falta también la creación de datos.
Esta creación de datos, puede provenir en general por registros de configuración que ya están creados en DES y deben ser subidos a PRO, o incluso por el simple interés de mover estos datos.
Además a veces incluso queremos que los GUIDs de los registros sean los mismos, ya que se los creo manualmente los GUIDs internos de los registros se asignan automáticamente a nuevos valores.
Esta información además debe estar sincronizada, ya que si modifico datos en el entorno de origen, luego quiero ver ese dato actualizado en el resto.
Normalmente mucha gente mueve estos datos de forma manual exportando e importando desde ficheros Excel, pero es complicado mantenerlo sincronizado y además no se puede automatizar.
Para esto, hoy he preparado una solución MUY SENCILLA que mueve los datos entre entornos.
La idea es la siguiente:
image
El código .NET no puede ser mas simple, en la llamada lo único que quiero pasar es el código son los dos accesos (origen/destino), la entidad y los campos a sincronizar:
static OrganizationService service = GetCrmService(); 
static OrganizationService service2 = GetCrmService2();
MoveData(service, service2, "account", "name,emailaddress1,telephone1");
Y el método lo he llamado “MoveData()”:


         static void MoveData(OrganizationService sourceConnection, OrganizationService destConnection,
           
string entityName, string attributeNames)
        {
           
//1) consulto todo en origen
           
string[] attributes=attributeNames.Split(",".ToCharArray());  
           
QueryExpression consulta1 = new QueryExpression(entityName);  
            consulta1.ColumnSet =
new ColumnSet(attributes);  
           
EntityCollection registros = sourceConnection.RetrieveMultiple(consulta1);  
           
foreach (Entity ent in registros.Entities)  
            {  
               
//2) Consulto si ya existe el registro en destino  
               
Entity dest = null;  
               
try 
               
{  
                    dest = destConnection.Retrieve(entityName, ent.Id,
new ColumnSet(attributes));  
                }  
               
catch (SystemException ex)  
                {  
                    dest =
null;  
                }  
               
bool existe = (dest == null) ? false : true;
  
               
if (!existe)  
                {  
                   
//3) Creacion en destino  
                   
destConnection.Create(ent);  
                   
Console.WriteLine("Registro Creado");  
                }  
               
else  
               
{  
                   
//4) Update en destino  
                   
destConnection.Update(ent);  
                   
Console.WriteLine("Registro Actualizado");  
                }  
            }  
           
Console.ReadLine();  
        }



Finalmente si lo ejecuto me da el resultado:


image

Creo que esta solución es súper fácil pero a la vez útil, para mover datos de un entorno a otro, simplemente pasando las conexiones, y los nombres de entidades y campos.

Pensar cuanto tiempo tardarías en mover 10 entidades de configuración con sus registros manualmente con Excel desde un entorno de DES a PRE, UAT y PRO, y luego intentar pensar cuanto tardarías con algo así…

Happy Developing!

Espero les sirva…

abrazo!