miércoles, 28 de abril de 2010

Microsoft Dynamics CRM online en España


Microsoft ha anunciado en la Convergence 20010 de Atlanta la disponibilidad internacional y nuevas características de Microsoft Dynamics CRM online.
Entre otros países, se encuentra España, así que ahora ya estará disponible por aquí tambien (hasta ahora sólo estaba disponible en Estados Unidos).
Aparentemente la disponibilidad en España será una realidad durante el mes de Mayo de 2010.

Para mas información acerca de Microsoft Dynamics CRM online ver:
http://www.microsoft.com/online/dynamics-crm-online.mspx.

En modo online se disponen de algunas diferencias especiales como la posibilidad de la utilización de gráficos (charts) y alguna facilidad adicional para realizar importaciones.

Para ver más información:
http://www.estrategiasdeinversion.com/comunicados/microsoft-anuncia-disponibilidad-internacional-nuevas-microsoft
http://muycomputerpro.com/Actualidad/Noticias/Novedades-CRM-on-line-de-MS/_wE9ERk2XxDBcuxa6TTmSo8S_zFmlaj0p9qJ_8IYM3hR5UM4v_7eHEHMTH4o6Ylwz

miércoles, 21 de abril de 2010

Añadiendo botones en las secciones del formulario

He encontrado en el blog de Adi Katz una funcionalidad muy buena para añadir botones en las secciones del formulario.
La verdad que es muy útil, ya que si bien podemos añadir botones en las vistas y en la parte superior de los formularios a través del ISV.config, no tenemos opcion de añadir botones en el mismo formulario.
Este ejemplo muestra como añadir los mismos, a través de Javascript.
Lo que hay que hacer simplemente es crear un atributo nuevo de tipo texto y añadirlo en el formulario quitándole la etiqueta en el mismo. En mi ejemplo el atributo se llama "new_texto".
Luego hay que añadir este código en el Onload:

function InlineToolbar(containerId)
{
var toolbar = this;
var container = document.all[containerId];

if (!container)
{
return alert("Toolbar Field: " + containerId + " is missing");
}

container.style.display = "none";
container = container.parentElement;

toolbar.AddButton = function(id,text,width,callback,imgSrc)
{
var btn = document.createElement("button");
var btStyle = new StyleBuilder();
btStyle.Add( "font-family" , "Arial" );
btStyle.Add( "font-size" , "12px" );
btStyle.Add( "line-height" , "16px" );
btStyle.Add( "text-align" , "center" );
btStyle.Add( "cursor" , "hand" );
btStyle.Add( "border" , "1px solid #3366CC" );
btStyle.Add( "background-color" , "#CEE7FF" );
btStyle.Add( "background-image" , "url( '/_imgs/btn_rest.gif' )" );
btStyle.Add( "background-repeat" , "repeat-x" );
btStyle.Add( "padding-left" , "5px" );
btStyle.Add( "padding-right" , "5px" );
btStyle.Add( "overflow" , "visible" );
btStyle.Add( "width" , width );

btn.style.cssText = btStyle.ToString();
btn.attachEvent("onclick",callback);
btn.id = id;

if (imgSrc)
{
var img = document.createElement("img");
img.src = imgSrc;
img.style.verticalAlign = "middle";
btn.appendChild(img);
btn.appendChild(document.createTextNode(" "));
var spn = document.createElement("span");
spn.innerText = text;
btn.appendChild(spn);
}
else
{
btn.innerText = text;
}

container.appendChild(btn);
container.appendChild(document.createTextNode(" "));

return btn;
}

toolbar.RemoveButton = function(id)
{
var btn = toolbar.GetButton(id)
if (btn)
{
btn.parentNode.removeChild(btn);
}
}

toolbar.GetButton = function(id)
{
return document.getElementById(id);
}

function StyleBuilder()
{
var cssText = new StringBuilder();
this.Add = function( key , value ){cssText.Append( key ).Append( ":" ).Append( value ).Append( ";" );}
this.ToString = function(){return cssText.ToString();}
}

function StringBuilder()
{
var parts = [];
this.Append = function( text ){parts[ parts.length ] = text;return this;}
this.Reset = function(){parts = [];}
this.ToString = function(){return parts.join( "" );}
}
}

/* Start Script Execution */
function OnCrmPageLoad()
{
window.GeneralToolbar = new InlineToolbar("new_texto");
GeneralToolbar.AddButton("btnActivity","Nueva Actividad","10%",Lookup_Click);
GeneralToolbar.AddButton("btnAddNote","Adjuntar fichero","16px",AddNote_Click,"/_imgs/ico_16_5_d.gif");
}


function Lookup_Click()
{
openStdDlg('/InfoavanCRM/Activities/dlg_create.aspx', window, 350, 350);
}

function AddNote_Click()
{
locAddFileTo(5);
}
OnCrmPageLoad() ;

Y el formulario quedaría finalmente así:

En este caso, le he modificado la funcionalidad para que puedan adjuntar ficheros y añadir directamente actividades.

El post original del que saqué la idea es: http://mscrm4ever.blogspot.com/2009/10/crm-40-creating-inline-toolbar-and.html

Un saludo,

miércoles, 14 de abril de 2010

Aprovechando todos los procesadores con Framework 4.0 usando Parallel.For

Como todos saben, ya han publicado el Visual Studio 2010 (para mas información ver: http://www.microsoft.com/spain/visualstudio).
Hace un tiempo salió un artículo en el Blog del equipo de Dynamics acerca de la utilización de la nueva funcionalidad de Framework 4.0 "Parallel.For" para hacer cargas en CRM (http://blogs.msdn.com/crm/archive/2010/03/22/parallelism-using-parallel-for-with-the-crm-sdk.aspx). Si bien esto antes se podía hacer, ahora es mucho mas sencillo.
Ahora que ya tengo instalado el Visual Studio 2010, lo primero que quise hacer es probar esta funcionalidad para intentar ver como afectaría a la hora de hacer cargas.
Bien, lo primero que hice, fue una aplicación de consola, con el siguiente código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Collections;
using ConsoleApplication2.service;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Inicio");
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.AuthenticationType = 0;
token.OrganizationName = "DEMO";

CrmService service = new CrmService();
service.Url = "http://192.168.1.99:5555/mscrmservices/2007/crmservice.asmx";
service.CrmAuthenticationTokenValue = token;
service.Credentials = new System.Net.NetworkCredential("administrador","P@ssw0rd","DEMO");

Stopwatch watch = new Stopwatch();
watch.Start();
//Creación de 1000 Cuentas con For
for (int i = 0; i < 1000; i++)
{
account account = new account();
account.name = "Cuenta" + i.ToString();
TargetCreateAccount target = new TargetCreateAccount();
target.Account = account;
CreateRequest create = new CreateRequest();
create.Target = target;
CreateResponse created = (CreateResponse)service.Execute(create);
}
watch.Stop();
Console.WriteLine("Duración total for normal:" + watch.Elapsed.Minutes.ToString() + ":" + watch.Elapsed.Seconds.ToString() + ":" + watch.Elapsed.Milliseconds.ToString());

ParallelOptions ops = new ParallelOptions();
ops.MaxDegreeOfParallelism = 2;
Stopwatch watch2 = new Stopwatch();
watch2.Start();
//Creación de 1000 Cuentas con Parallel.For
Parallel.For(0, 1000, i =>
{
account account = new account();
account.name = "Cuenta" + i.ToString();
TargetCreateAccount target = new TargetCreateAccount();
target.Account = account;
CreateRequest create = new CreateRequest();
create.Target = target;
CreateResponse created = (CreateResponse)service.Execute(create);
});

watch2.Stop();
Console.WriteLine("Duración total ParallelFor:" + watch2.Elapsed.Minutes.ToString() + ":" + watch2.Elapsed.Seconds.ToString() + ":" + watch2.Elapsed.Milliseconds.ToString());

Console.ReadLine();
}
}
}

Como se ven el código, allí simplemente primero creo 1000 cuentas con un "For" normal y luego creo otras 1000 Cuentas con el "Parallell.For" (con hasta 2 procesos simultáneos).
El resultado es el siguiente:

Obviamente el Parallel.For es senciblemente mas rápido a la hora de crear 1000 Cuentas.
El siguiente gráfico compara cuantos segundos son necesarios para la creación de 1000 Cuentas con ambos métodos:


Hay que tener en cuenta que los tiempos también dependerán de cuantos atributos sean necesarios, de las relaciones, de la velocidad del cliente y del servidor, pero yo creo que con esto ya tenemos por lo menos una aproximación del funcionamiento del "Parallel.For".

así que ahora a usarlo!

un saludo

lunes, 12 de abril de 2010

Se ha publicado el Rollup 10

El pasado 8 de abril se ha publicado el Rollup 10 para Microsoft Dynamics CRM 4.0.
Este puede ser descargado de aquí: http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=5da4d352-1d3f-4426-9c17-b256c30afdb9
Así que como siempre recomiendo: instalar el Rollup primero en una máquina de desarrollo, probar todo (incluso lo que uno se imagina que nunca fallaría) para luego instalarlo en producción.
Para mas información acerca del Rollup ver:
http://support.microsoft.com/?kbid=979347
http://blogs.msdn.com/crm/archive/2010/04/12/update-rollup-10-for-microsoft-dynamics-crm-4-0.aspx

Un saludo!

viernes, 9 de abril de 2010

Se viene CRM "5"

Pues si, por fin parece que empieza a sonar fuerte la nueva versión del CRM.
El pasado 25 de marzo salió a la luz la versión "CTP3" del producto.
El enlace de la publicación del mismo puede verse aquí: http://www.microsoft.com/Presspass/press/2010/mar10/03-25CTP3PR.mspx.
Todas las revistas especializadas sacaron artículos relacionados con esta publicación, como la ZDNet: http://blogs.zdnet.com/microsoft/?p=5692 y la eWeek: http://www.eweek.com/c/a/Enterprise-Applications/Microsoft-Launches-Preview-of-Dynamics-CRM5-655855/.
Parece que finalmente comienza la cuenta atrás para el lanzamiento de una nueva versión. Según se comenta en estas revistas, el CRM "5" podría ver la luz en el segundo semstre de 2010, así que esperemos que sea cuanto antes y que llegue con muchas nuevas herramientas.

Un abrazo!