SDK para OpenXML

|

Hace unos meses tuve el gusto de ir a Bogota a recibir un entrenamiento sobre OpenXML, fue realmente interesante pero en ese momento me asalto una gran duda, como hago para que la construccion del documentos basados en OpenXML sea facil para un programador?? Claro como ustedes saben OpenXML se basa en un paquete Zip que contiene archivos XML para describir todo lo que contiene el documento, pero claro generar esto solo con las funciones XML de .NET era algo bastante duro, pero mis plegarias fueron atendidas!!
Se ha generado ya un SDK que esta en CTP para poder construir documentos basados en OpenXML con un modelo de objetos fuerte, lo cual quiere decir que no tenemos que conocer todos los tags y estructuras de la espcificacion y menos aun construir a mano los archivos XML!!!
Es cierta tanta maravilla?? Compruebenlo ustedes mismo!!

http://blogs.msdn.com/erikaehrli/archive/2007/06/04/announcing-the-new-open-xml-object-model.aspx

Traductor OpenXML a ODF

|

Conocen de los formatos OpenXML y ODF?? Pues OpenXML es el formato que usa Office 2007 para almacenar sus documentos, este es de especificacion abierta y es muy sencillo de usar, ODF es similar pero es una iniciativa de la comunidad Open Source, no hay que negar que hay una batalla por la aceptacion de estos 2 formatos, MS claro esta facilitando la adopcion de estos con iniciativas como el Traducto de OpenXML a ODF, este lo puedes encontrar aqui:

http://sourceforge.net/projects/odf-converter

Tambien es un proyecto Open Source y ya tiene un buen avance, pruebalo!!!

El CTP de Visual Studio Team System "Rosario" ha sido liberado!!

|

Este release apunta a mejorar el manejo del ciclo de vida del desarrollo de las aplicaciones incluyéndole muchos features en cuanto al manejo de WorkItems, manejo de requerimientos y mejora en las pruebas y manejo de dependencias, esto agregado a Orcas mejora increíblemente la predictibilidad de un proyecto en todos los aspectos sin dejar de brindar una espectacular visibilidad a quienes manejan el proyecto...

Un whitepaper con detalles mas completos puede ser encontrado aquí:
http://www.microsoft.com/downloads/details.aspx?familyid=0ADE6C5D-BE17-4168-B57B-4C2FA36EAD3E&displaylang=en

Y el VPC bajalo aqui:

http://www.microsoft.com/downloads/details.aspx?FamilyId=8450EFF5-24AD-44C3-AB91-1ED88EF2F4F0&displaylang=en

Llamar a un Servicio Web en forma Asincronica

|

Es muy común en nuestros días que se cuide mucho de la apariencia de las aplicaciones, una de las técnicas muy amplia mente empleadas para esto es la llamada asincrónica a los procesos, esto claro le da al usuario la comodidad de que su interface no se bloquee y claro de una buena impresión, también un efecto importante es que el usuario siente la aplicación que funciona mas rápido, aunque esto no sea verdad!!!

Siendo esto así, se han hecho muchos artículos de como usar esta técnica, en algunos de los casos he notado que los hacen de una forma bastante compleja para los principiantes (delegados, métodos anónimos, etc...) entonces decidí mostrar como ejecuto yo esta técnica consumiendo un Servicio Web desde una forma Windows, para lo cual escribí este código:

//Instancia del Servicio Web Referenciado
//Este tambien puede ser agregado como un componente desde el diseño de la forma
MDMQ_BC.Service objService = new Service();

private void Load()
{
//Este metodo debe ser ejeutado una sola ves en la vida de la forma, puede ser en el Constructor
//Event Handler necesario para ejecutar acciones cuando llegue la respuesta
objService.ConsultaNombresCompleted += new ConsultaNombresCompletedEventHandler(objService_ConsultaNombresCompleted);
}

void objService_ConsultaNombresCompleted(object sender, ConsultaNombresCompletedEventArgs e)
{
//Preguntamos si la consulta fue bien
if (e.Error == null)
{
//Si la consulta se ejecuto sin problemas revisamos el resultado de la misma
if (e.Result.Codigo_error == "0")
{
//Si el resultado del proceso es correcto mostramos los datos
MessageBox.Show("Los datos estan correctos");
}
else
{
//Si el resultado del proceso no es correcto mostramos la razón
MessageBox.Show(e.Result.Codigo_error + ": " + e.Result.Texto_error);
}

}
else
{
//Se muestra el error, en una aplicación consistente se debe tambien guradar los detalles del error
//con una estrategia de Loggin correcta (EventLog, Archivos, Mails, etc...)
MessageBox.Show("Ha ocurrido un error realizando la consulta. " + e.Error.Message);
}

}

private void CallAsync()
{
//Lamada al metodo asincronico, este se ejecuta y el Event Handler maneja la respuesta cuando llegue
objService.ConsultaNombresAsync("LOMAS");
}

Aqui unas aclaraciones:
MDMQ_BC es un NameSpace que contiene los objetos que se crean cuando se hace referencia a mi servicio Web de Pruebas, este contiene el Objeto Service que es el proxy que hace las llamadas al Servicio, así mismo tiene métodos que ejecutan las operaciones que posee el Servicio, tanto de modo sincrónico como asincrónico, estos están claramente diferenciados pues el método asincrónico tiene un sufijo "Async"...

Si bien la respuesta va a ser manejada por un método es importante mostrarle al usuario que se esta ejecutando la operación como también que se ha completado, para esto se puede tener un PictureBox con un gif animado que mientras la operación se ejecuta esta visible y cuando esta termina se vuelve invisible al Picturebox, también sería conveniente bloquear controles que ejecuten otras operaciones...

También hay que tomar en cuenta que siempre se deben tener estrategias claras de manejo de excepciones y loging, así la operación de tu aplicación sera consistente y tendrás datos completos y detallados de que sucedió, en este caso del ejemplo hay una estrategia simple que solo muestra el error pero te hace acuerdo que hace falta mas trabajo sobre el tema...

Algo importante que debo mencionar que si se fijan bien no van a encontrar ni una sola estructura try - catch, eso es importante para el performance de la aplicación, en lo posible no se deben usar estos bloques por que aunque no se note siempre degradan el funcionamiento del código, y su finalidad es encontrar EXCEPCIONES no controlar el flujo normal de una aplicación...

Espero que les sirva este codigo y si desean comentar, adelante!!