viernes, 21 de diciembre de 2007

Habilitar WCF al Visual Studio 2005 en Windows XP

WCF es una de las 4 tecnologías que salieron junto con el Framework 3.0 (3.5) pensando ya en lo que sería Visual Studio 2008. El propósito de esta tecnología es el poder crear un servicio para que pueda ser consumido por otras aplicaciones, sin importar el tipo de tecnología, medio o canal de comunicación que vayamos a utilizar. Así, como desarrolladores nos enfocamos sólo en lo que deseamos compartir con otras aplicaciones, y no en el cómo.

Para empezar a desarrollar con WCF teniendo instalado Windows XP (es decir también el IIS 5.1) como sistema operativo y Visual Studio 2005 en una máquina , se requiere realizar los siguientes pasos:

1. Bajar e instalar el Framework 3.0, ahora ya se baja automáticamente dentro del proceso de Windows Update.

2. Bajar el componente, o las extensiones para WCF y WPF (peso 3.6 MB). (Bajar Aqui)

3. Instalar el paquete vsextwfx.msi que nos acabamos de bajar.

4. Listo, ya podemos entonces usar WCFo WPF y crear un proyecto de este tipo desde VS 2005:



En próximas entradas de este blog, se realizará ejemplos de cómo crear un servicio utilizando WCF desde VS 2005 con Win XP (IIS 5.1). Este sólo hablará de como configurar WCF para que funcione correctamente en una máquina con estas características.

Existen 3 formas de hostear un servicio creado en WCF

- Auto -Hosteado: una aplicación manejada ej: App. Windows, App. de Consola. puede soportar ser el host de un servicio WCF. Este tipo de hosting suele utilizarse en la etapa de desarrollo y pruebas, para testear el servicio WCF creado.
- IIS (con el Internet Information Services): Hostea un servicio WCF como si fuera un servicio Web, con la diferencia que al archivo que se hará referencia en la URL termina en .svc, mientras que en el servicio Web creado con .NET es .asmx. Usa el protocolo HTTP necesariamente si nuestro IIS es de la versión 5.1 o 6.0 para la comunicación.
- Windows Process Activation Service (WAS): Parecido al IIS con la diferencia que soporta otros protocolos de comunicación a más de HTTP: Namepipes, TCP, etc. (Además de muchas otras características)

Con nuestro ambiente (Winxp + VS 2005 + Fr 3.0) sólo podemos trabajar con los dos primeros tipos de hosting. Sin embargo con el segundo (IIS), solemos tener problemas, puesto que ya creamos nuestro servicio WCF y lo exponemos mediante IIS pero al momento de llamar al servicio este no funciona, para probar lo llamamos desde el Internet Explorer y el resultado es el siguiente:

Mustra el .svc como si fuera un simple archivo de texto expuesto desde IIS. Si esto ocurre, para que funcione este servicio necesitaremos correr un utilitario que viene con el Framework 3.0: ServiceModelReg.exe que sirve para instalar ciertas extenciones y metadata en el IIS, este aplicativo se encuentra normalmente en:
C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation

y desde línea de comando escribiremos lo siguiente: ServiceModelReg.exe -i (Mas Información de ServiceModelReg.exe).
Luego de esto, nuestro IIS ya debería ser capaz de hostear los .svc. Sin embargo, ciertas ocasiones el IIS tiene cierta Metadata y extensiones corruptas debido a la propia instalación del fr 3.0 o de las mismas extensiones WCF, por lo que nos puede continuar sucediendo el mismo problema.

Para limipiar y reestablecer nuestro IIS, deberemos correr un último utilitario que se lo puede descargar desde la siguiente página: CleanIISScriptMaps.
Se corre este utilitario, luego volvemos a correr el ServiceModelReg.exe y ahora si nuestro servicio WCF estará bien hosteado y funcionando. Para probar, nuevamente se lo llama por el Browser y el resultado es el siguiente:


Listo, ahora si nuestro WCF se encuentra bien configurado y listo para usarse!!

viernes, 14 de diciembre de 2007

Orientación en la impresión con Reporting Services

Este es un problema que les sucedió a un par de conocidos y que realmente es de fácil solución. Resulta que ellos tenían creados algunos reportes con la herramienta de Reporting Services, los reportes funcionan, se paginan, se exportan, etc. Todo estaba bien, solo tenían un problemita en el momento de la impresión: por cuestiones del negocio y su necesidad requerían que sus reportes por defecto se impriman de manera horizontal. Aca les va un ejemplo:

Supongamos que tengo un reporte como el siguiente















Este reporte, por defecto se verá así, si hacemos clic en la vista previa (para saber como se va a imprimir )















o si hacemos clic en la configuración de la página


Como se puede notar, por defecto la pagina es configurada para imprimirse verticalmente. Claro manualmente se puede modificar para configurar la orientación a la página de manera Horizontal:




Pero para ciertas empresas se puede perder mucho tiempo al realizar este trabajo, o simplemente por estetica siempre el reporte tendría que estar configurado para imprimirse de manera horizontal. Por lo que por defecto necesitan que la hoja de reporting services este seteada para la impresión de manera horizontal.

OJO: (Alguna ocasión alguien intento que este trabajo lo haga el objeto que consume un reporte de reporting services en .NET: el Report Viewer, sin embargo este objeto no puede realizar este menester. Si, tiene una propiedad para ver la orientación de la impresión del reporte en código (landscape), pero es de solo LECTURA)

Por lo tanto debemos configurar esto desde el reporting services. En reporting services NO existe una propiedad que setee el reporte de manera horizontal o vertical, por lo que tenemos que modificar lo siguiente: el ancho de página y el alto de página.

Si sabemos que por defecto las impresiones se realizan en formato A4, entonces conocemos que el reporte tendrá el siguiente tamaño:

Ancho de página: 21cm, Alto de página: 29,7cm.

Por lo tanto reemplazaremos estos valores, para que el reporte se vea de manera horizontal por defecto, a los siguientes:

Ancho de página: 29,7cm, Alto de página: 21cm.

Entonces desde mi report project, en el menú superior voy a Report -> Report Properties->la pestaña Layout y modifico estos valores.

Con este pequeño cambio, tenemos configurado ahora nuestro reporte para que se imprima por defecto de manera horizontal!!!.....

PD: Ciertas personas han tenido problemas con este cambio, pues en el momento de probar el reporte, este funciona de correcta manera cuando se lo corre desde visual studio (cuando se lo compila para prueba), pero cuando se lo sube ya al report server se sigue teniendo el mismo problema anterior.

Esto sucede por ciertos elementos de configuración de la máquina, lenguaje, unidades de medida, etc. En estos casos lo recomendable es pasar los valores que seteamos de nuestro reporte en cm a pulgadas (inches), es decir:

Ancho de página: 11,69in, Alto de página: 8,27in.

Les aseguro que este cambió funcionará en todos los reports servers!!

jueves, 8 de noviembre de 2007

Problemas Del Lenguage En SQL Server 2005

Siendo esta mi primera entrega de este nuevo Blog, quisiera poder solucionar ese típico problema del migrador de aplicaciones que suele tener un problema muy común: Lenguage en SQL Server 2005. Y es que cualquiera que sea nuestro caso de migración, la vida (Cambio a un nuevo servidor por ejemplo) o el destino (Cambio de ambiente de mi aplicación por ejemplo) en ocasiones cometemos un error que nos puede causar más de un inconveniente!!.

El caso es: En nuestro nuevo servidor instalamos sistema opertativo, los nuevos paquetes, entre esos el servidor de SQL 2005, los componentes utilizados por mi aplicación, la aplicación en si y luego la levantamos (A nuestra aplicación por supuesto) hasta ahi 0 problemas, comenzamos a probar el funcionamiento de la aplicación y se nos ocurre realizar una consulta que tenga que ver con fechas...."ERROR con el formato de fechas 'mm/dd/yyyy'". Pero que pasó???? lo primero que se nos viene a la mente es: algo con el Lenguage del sistema operativo, ir a configuración regional y de idiomas y probar. Pero NO!!! ese realmente no es el causante de nuestras penas, el verdadero causante fue el personaje (normalmente nosotros mismos) que instaló el paquete de SQL Server 2005 con un lenguaje distinto al de el servidor de origen. Que hacer entonces???? Pues instalar todo de nuevo?? esa sería una solución, pero seguramente no las más adecuada.

Primero que nada...en que formato de fechas se encontraba nuestra aplicación antiguamente??? Pues bien para este caso el formato de las fechas que se encontraba originalmente será 'dd/mm/yyyy'. Y ahora queremos hacer una consulta y nos sale el error de 'mm/dd/yyyy'???
Vamos a comenzar nuestro estudio entonces.

El formato de fechas esta completamente atado al lenguaje con el que esta corriendo nuestro servidor SQL, NO al lenguaje de instalación, ni con el que leemos las opciones de las herramientas de sql, ni con el collation!!! Es el lenguaje que esta corriendo nuestro servidor!!! Como averiguamos ese dato??? pues hay que correr el siguiente script sql en nuestro famoso Microsoft Sql Server Managmente Studio (SQL SMS pa la proxima):

select @@language

Y obtendremos ese lenguaje, en mi caso: us_english. Listo ahora sé que el lenguaje con el que corre mi servidor es el inglés. Ahora como sé que formato de fechas es el que está atado a mi servidor?? corramos entonces el siguiente query!! o store procedure (sp pa la proxima) del sistema.

sp_helplanguage 'us_english'

Obtendremos toda la información acerca de este idioma. Entre esos su código, su formato de fecha, el nombre, su alias, sus nombres de meses, sus nombres de meses cortos, etc. Por cierto si corremos solo el sp sp_helplanguage sin parametros el resultado es la información acerca de todos los lenguajes posibles instalados en nuestro SQL 2005. Pero para muestra un botón:






Aca esta el resultado de nuestra consulta completa.



"Lindo hasta ahora todo lindo, pero no se me ha solucionado absolutamente NADA!!!!" si lo sé, ahora vamos. Una solución parcial sería utilizar la siguiente sentencia antes de correr cualquier sentencia SQL de nuestra aplicación:

set dateformat dmy

Sin emabargo como notarán para este caso es una solución muy parcial, muy superficial!!! Nos tocaría cambiar todas las sentencias para que antes de que corran ellas, primero corra nuestra sentencia set date format dmy.

Bueno esta no fue!!! veamos que más podríamos hacer!!! Vamos a utilizar la siguiente sentencia, que es una solución menos parcial!!! Voy a setear lenguaje español porque ese lenguaje está atado con la fecha en el formato que yo quiero 'dd/mm/yyyy' o dmy -sino me creen ejecuten el sp sp_helplanguage-.

SET LANGUAGE Español

Hey ahora funcionan todas las consultas SQL!!! Todas las sentencias se ejecutan!!! Que bien!! Arreglado el problema!! Ejecuto el select @@language y me dice ESPAÑOL!!! POR FIN!!! Pues talvez no necesariamente. Probemos: bajemos los servicios SQL o ingresemos con un usuario diferente a la base de datos y hagamos las consultas!!!Pues otra vez dejo de funcionar :'(
sigue saliendo us_english como respuesta a mi select @@language!!!
Que pasó??? pues esta sentencia solo mantiene el cambio del lenguaje para la sesión del usuario conectado en ese momento a la base de datos, por lo tanto al bajar los servicios o al conectarse otro usuario distinto nuestra configuración se pierde. Entonces la solución parcial para nuestro caso sería correr la sentencia set language automáticamente después de que un usario se conecte a la base. Pero sigue siendo una solución muy parcial para mi problema, menos que la anterior pero igual parcial!!!

Bueno, entonces ahora si viene la de verdad verdad!!!. Entramos al SQL SMS (ya saben a que me refiero!!! Sql Server Managment Studio!!!) En el lado izquierdo se encuentra nuestro árbol explorador de objetos, encontramos el nombre del servidor de nuestra base y/o el nombre de mi instancia. Clic derecho -> Propiedades











Luego voy a la pestaña de avanzados, y veo la opción de lenguaje por defecto y entonces cambio y escojo el de mi elección!!! En mi caso será español....para muestra otro botón!!!




Si esta es la ventana de las que les hablaba. Entonces escogeremos el lenguaje de nuestro servidor!!! OJO que es de nuestro servidor, es decir también modifica el lenguaje de todas las bases de datos alojadas en este servidor (cuidado!!! por arreglar una dañamos 3!!!) Pero si solo tenemos una BD como en nuestro caso, entonces quedará perfecto!!!!. Listo el lenguaje de nuestro servidor esta modificado!!! Este será el lenguaje por defecto de todos los nuevos logins creados!!! todos los NUEVOS logins creados!!!. Si falta entonces un paso, cambiar el de los logins ya creados!!.

En nuestro object explorer vamos a la carpeta de seguridad y escojemos logins. Encima del grupo o usuario clic derecho propiedades y en la pestaña de default lenguage escojemos el lenguaje deseado, en nuestro caso el Español!!.



Repetimos el proceso para todos los logins de nuestro servidor, o si tenemos muchos hacemos un script que modifique esta propiedad a todos los logins.






Ahora si probemos, TODO SIRVE ahora si TODO sirve. reiniciamos los servicios, entremos con cualquier login :) TODO SIRVE.

Espero que les sirva, y espero también sus comentarios, preguntas y sugerencias!!! Proximas ediciones tendrán que ver con el maravilloso mundo del desarrollo!!! Auqnue siempre habrá una que otra de Bases de Datos!!! Hasta pronto!!!