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!

No hay comentarios:

Publicar un comentario