delphi - sergiogonzalezc.files.wordpress.com · visual basic.net • c# • delphi • asp.net •...

60
Entrevista a Stephen Emott Group Director for External Research en Microsoft dotNetManía nº11 enero 2005 • Precio: 6,00 (España) Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA Mejorando la comunidad de desarrolladores a través de los grupos de usuarios dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Entrevista a Stephen Emott Group Director for External Research en Microsoft Un cambio de paradigma MVP On Line ¿Cómo ejecutar una caja de mensaje dentro de una aplicación Web como se hace en Windows? SoftICE for DevPartner Laboratorio Copia, Corta y Pega en Ensamblados .NET ¿Hasta dónde se puede llegar con la reflexión en el próximo .NET Framework 2.0? Copia, Corta y Pega en Ensamblados .NET ¿Hasta dónde se puede llegar con la reflexión en el próximo .NET Framework 2.0? Informes y trazado de gráficas 3D en ASP.NET (y III) • Redes de mensajería y .NET (I) • Yo formateo, tú formateas... ¡que formatee él! • SQL Server Analysis Services. ¡Hola cubo! (II) • ¿ADO.NET Extendido? • Portal corporativo, la asignatura pendiente Informes y trazado de gráficas 3D en ASP.NET (y III) • Redes de mensajería y .NET (I) • Yo formateo, tú formateas... ¡que formatee él! • SQL Server Analysis Services. ¡Hola cubo! (II) • ¿ADO.NET Extendido? • Portal corporativo, la asignatura pendiente

Upload: phamdan

Post on 03-Nov-2018

283 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Entrevista a Stephen EmottGroup Director for External Research en Microsoft

dotNetManíanº11 enero 2005 • Precio: 6,00 € (España)

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

Comunidad

opinión

INETAMejorando la comunidad de desarrolladoresa través de los grupos de usuarios

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Entrevista a Stephen EmottGroup Director for External Research en Microsoft

Un cambio de paradigma

MVP On Line¿Cómo ejecutar una caja de mensaje dentro de una aplicación Web como se hace en Windows?

SoftICE for DevPartnerLaboratorio

Copia, Corta y Pega enEnsamblados .NET¿Hasta dónde se puede llegar con la reflexión en el próximo .NET Framework 2.0?

Copia, Corta y Pega enEnsamblados .NET¿Hasta dónde se puede llegar con la reflexión en el próximo .NET Framework 2.0?

Informes y trazado de gráficas 3Den ASP.NET (y III) • Redes de

mensajería y .NET (I) • Yoformateo, tú formateas... ¡que

formatee él! • SQL Server AnalysisServices. ¡Hola cubo! (II) •

¿ADO.NET Extendido? • Portalcorporativo, la asignatura

pendiente

Informes y trazado de gráficas 3Den ASP.NET (y III) • Redes de

mensajería y .NET (I) • Yoformateo, tú formateas... ¡que

formatee él! • SQL Server AnalysisServices. ¡Hola cubo! (II) •

¿ADO.NET Extendido? • Portalcorporativo, la asignatura

pendiente

Page 2: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA
Page 3: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Bien grande, ¡que se vea!: dotNet-Solidario.com. Esta es la web de una asociaciónsolidaria creada por iniciativa de Pedro Pozoy Lorenzo Ponte de clikear.com para realizarproyectos solidarios, siempre teniendo comocomún denominador el uso de la tecnologíapara llevarlos a cabo. La web aún está en prue-bas y no se ha hecho nada más que empezar,pero ya hay algunos proyectos en marcha.Desde dotNetSolidario se contactará conONGs para proporcinarles lo que podamosconseguir para llevar la tecnología como ele-mento necesario para la formación de las per-sonas más desfavorecias. Desde dotNetManíaapoyaremos en todo lo que podamos, y espe-ro que muchos de vosotros colaboréis tambiénen los proyectos que empiecen a surgir. Podéisempezar por entrar en la página web y revisarlos proyectos en marcha y, si queréis, dejaralgún mensaje en el foro de la página Web.

Este mes no tenemos grandes noticias enel mundo de la plataforma .NET, si acaso, cabemencionar las versiones CTP (CommunityTechnology Preview) con las que si es suscriptora MSDN o betatester de Visual Studio 2005o SQL Server 2005 podrá comprobar con bas-tante rapidez las últimas mejoras añadidas aestos productos, y con las que Microsoft obten-drá, sin duda, un feedback mayor y sobre todocon una mayor rapidez. Pero ¡ojo! que no sonbetas, que si ya de por sí pueden ser poco esta-bles, éstas, las CTP, no están construidas contanto rigor como aquellas.

En cuanto al contenido, este mesentrevistamos a Stephen Emott, GroupDirector for External Research en Microsoft.Erich Bühler termina la serie de artícu-los que comenzó hace tres números y acambio comenzamos otra de la mano deBraulio Díez, que puede ser muy intere-sante y que nos ayudará a bucear en las tri-pas del MSN Messenger. El artículo de por-tada lo vuelve a protagonizar el GrupoWeboo desde la universidad de la Habana,esta vez ahondando en las capacidades deReflection de la versión 2.0 de .NETFramework. Salvador Ramos continua suserie de iniciación con SQL Server AnalysisServices y aprovecha para recomendarnosunos libros sobre este tema en la seccióndnm.biblioteca.net.

Por último, aprovechando las fechas,van dos regalos: el primero,el que Acens,nuestro anfitrión en Internet, os ha que-rido hacer, con 90 días gratuitos de hos-pedaje en sus servidores como lectores deesta publicación; el segundo, nosotros mis-mos que ponemos el número 8 para sulibre descarga en formato PDF en dotnet-mania.com. Apenas quedan ejemplares enpapel y hemos pensado en distribuirlo gra-tuitamente para una mayor difusión, espe-cialmene en Latinoamérica, donde es casiimposible la distribución de la revista enpapel por el elevado coste del envío des-de España.

dotN

etM

anía

<<

3

dotNetSolidario.comdotNetManía

Dedicada a los profesionales de la plataforma .NET

Año I •Número 11 • Enero 2005Precio: 6€ (España)

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor Técnico/CoordinaciónMarino Posadas

([email protected])

RedactoresAntonio Quirós, Guillermo 'guille' Som, Jorge

Serrano, José Manuel Alarcón, Luis MiguelBlanco, Manuel Imaz y Pedro Pozo.

Colaboradores habitualesÁngel Esteban, Braulio Díez, Eladio Rincón,

Erich Bühler, Fernando Nogueras, JorgeCrespo Cano, José Miguel Torres, Miguel

Egea, Miguel Katrib Mora (Grupo Weboo),Octavio Hernández, Pablo Abbate, Pepe Hevia

y Salvador Ramos.

Además colaboran en este númeroErick Bacallao, William Chiquito,

Yoelvis Parodi

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

PublicidadMediadev

Sophie Mancini ([email protected])Tf. 93 426 22 57 - 670 99 74 64

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

<<

dnm.editorial

Page 4: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

1Idnm.sumario

Un cambio de paradigma 8-9Parece que estamos asistiendo a un importante cambio de modelo en lo que al modo desatisfacer las necesidades informáticas de la empresa se refiere. Se trata del paso de unparadigma presidido por la noción de producto a otro presidido por la noción de servicio.

Entrevista a Stephen Emott 10-11Stephen Emott es Group Director for External Research en Microsoft y presentó laponencia inicial en el evento de Microsoft Research sobre nuevas tendencias eninvestigación para los próximos 10 años.

Informes y trazado de gráficas 3D en ASP.NET (y III) 12-18Implementando el modelo de empuje 'push' con XML y XSLT.

Redes de mensajería y .NET (I) 19-25En esta serie de dos artículos vamos a estudiar la red más importante de mensajería:MSN Messenger. En esta primera, haremos una introducción al protocolo de Messenger,autentificación y gestión de nuestra lista de contactos, e implementaremos un ejemplo quese conecte con éxito a la red y extraiga la lista de usuarios y sus estados.

Yo formateo, tú formateas... ¡que formatee él! 26-29Cómo implementar clases que permitan formatos personalizados en .NET Framework. En este artículo veremos cómo implementar las diferentes versiones del método ToStringpara que, cuando sea preciso, el usuario de nuestras clases pueda utilizar los formatospersonalizados que creamos conveniente aplicar a nuestros tipos de datos.

Copia, Corta y Pega en Ensamblados .NET 30-36¿Hasta dónde se puede llegar con la reflexión en el próximo .NET Framework 2.0?

SQL Server Analysis Services. ¡Hola Cubo! (II) 37-39En este segundo artículo comenzaremos a implementar paso a paso la base de datosmultidimensional y el cubo de ejemplo expuesto anteriormente. Aquí introduciremos, aligual que en el artículo anterior, los conceptos necesarios para facilitar el seguimiento delartículo.

¿ADO.NET Extendido? 40-45ADO.NET ofrece características realmente atractivas a la hora de simplificarnos la vida.Una de ellas es la de poder emplear Strongly Typed DataSets (STDS) para mover lametadata de nuestro proveedor de datos a nuestra lógica de negocios.

Portal corporativo, la asignatura pendiente 46-48A pesar de que la mayoría de las empresas tienen presencia en Internet, son pocas lasempresas que han desarrollado un portal corporativo que les proporcione una mejora enlos procesos de comunicación y de trabajo internos.

dnm.mvp.online 49-51¿Cómo puedo ejecutar una caja de mensaje en pantalla dentro de una aplicación Webcomo se hace en Windows?

dnm.laboratorio 52-53SoftICE for DevPartner

dnm.comunidad.net 54-55INETA. Mejorando la comunidad de desarrolladores a través de los grupos de usuarios

dnm.biblioteca.net 57Business Intelligence. Técnicas de análisis para la toma de decisiones estrtégicas. (ElizabethVitt, Michael Luckevich, Stacia Misner).Professional SQL Server 2000 Data Warehousing with Analysis Services. (Tony Bain,Mike Benkovich, Robin Dewson, Sam Ferguson, Christopher Graves, ...).MDX Solutions With Microsoft SQL Server Analysis Services. (George Spofford)

dnm.desvan 58

dnm

.sum

ario

Page 5: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA
Page 6: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

Nuevas ediciones CTP para Visual Studio 2005 ySQL Server 2005

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Noticias sobre Windows Server

Desde el mes de noviembre pasado han aparecido unas nuevas versionesde revisión (entre betas) llamadas CTP (Community Technology Preview)disponibles para betatesters y suscriptores de MSDN

No son versiones beta, no están construidas conel mismo rigor que éstas -quizá por esto ya esténpublicadas dos, las de noviembre y diciembre-, peroasí permiten a los profesionales testear los últimosavances en el desarrollo de estos productos almomento. Según Paul Flessner, vicepresidente seniorpara SQL Server en Microsoft, “(...) la respuesta aeste programa ha sido impresionante (...) los pro-gramas como el CTP nos ayudarán a construir unproducto mejor”.

Las ediciones CTP de Microsoft Visual Studio2005 que han aparecido a lo largo del mes de diciem-bre pasadon han sido: “Visual Studio 2005 StandardEdition November” el 4 de diciembre de 2004 y“Visual Studio 2005 Team System DecemberCommunity Technology Preview” el 28 de diciem-bre de 2004. Y las ediciones CTP de Microsoft SQLServer han sido “SQL Server 2005 CTP October2004” y, por último, la “SQL Server 2005 CTPDecember 2004”.

Adiós a Windows NT 4.0

Según Peter Houston, seniordirector of Windows Serviceability,Windows NT 4.0 no contará conel soporte técnico del fabricante,Microsoft, a partir el 31 de diciem-bre de 2004, como ya se publicóhace un año cuando estaba pre-visto que éste finalizase (dichosoporte se amplió un año en revi-siones e incidencias relacionadascon la seguridad a petición de losclientes). El soporte paraWindows NT 4.0 Workstation yaterminó en Junio pasado.Exchange Server 5.5 le seguirá elaño que viene.

No habrá WindowsServer 2000 SP5

El Windows Server 2000 SP4,aparecido en la primera mitad de2003, será el último service pack deeste sistema operativo. Las actuali-zaciones se harán a través de unUpdate Rollup para Windows 2000Service Pack 4, según ha informa-do Microsoft en http://www.micro-soft.com/windows2000/server/evalua-

tion/news/bulletins/rollup.asp. ElUpdate Rollup es un paquete más lige-ro que un service pack con el que setrata de hacer más fácil el manteni-miento y la estabilidad del sistema yque contendrá tanto las actualiza-ciones de seguridad aparecidas des-de la publicación del Service Pack 4como otras actualizaciones impor-tantes no relativas con la seguridad,pero no contendrán los hotfixes indi-viduales. Se prevé su aparición paramedidados de 2005. Microsoft reco-mienda que quien no haya instaladoaún este último service pack lo hagacuanto antes; además, éste seráimprescincible para la instalación delUpdate Rollup.

Las últimas versiones deWindows Server 2003 ter-minarán en 2005

Cumpliendo así con lo publica-do hace unos meses por Microsft queespera tener una versión principalnueva cada cuatro años y una revi-sión cada dos. Así, en 2005 toca revi-sar Windows Server 2003 antes deque el equipo de desarrollo de se cen-

tre en Longhorn Server que saldráen 2007. Las versiones principalesesperadas aún son:

Windows Server 2003 Service Pack 1

Centrado en la seguridad, elcual sigue previsto para el primercuatrimestre de 2005 y del que seacaba del publicar la primeraCandidate Release y que está parasu libre descarga en www.micro-soft.com/windowsserver2003/down-loads/servicepacks/sp1. También en2005 aparecerá el service pack parala versión de 64 bits como estabaprevisto.

Windows Server 2003 R2 para Octubre de2005

Como ya anticipábamos en elnúmero 3 de dotNetManía, enabril de 2004, Windows Server2003 R2 hará su aparición este año2005. La fecha de publicación final-mente será en Octubre de 2005 yno en el verano como suponíamosentonces. De hecho existieronrumores este verano pasado de queesta nueva actualización apareceríaen 2006. Para más información verel desván de este mes.

Page 7: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

NDoc es una herramienta para la generaciónde documentación para los desarrolladores .NET.Recientemente se ha publicado la versión 1.3 quecorrige algunos de los fallos reportados y algunasde las características pedidas por los usuarios. Estaversión incluye una reimplementación del for-mato HTML Help 2 (el formato de ayudas deVS.NET 2003); un incremento del rendimientoen la generación de documentación y reflection;soporte para nuevas etiquetas de comentarioscomo “,” y “.”; soporte para los atributosObsoleteAttribute y FlagsAttribute;una característica de extensibilidad que le permi-te definir sus propias etiquetas de comentarios ycontrolar su formato; mejoras en el interfaz deusuario, etc. Para más información: http://ndoc.-sourceforge.net.

NDoc 1.3

dnm.noticias<<

dnm.noticias

dotN

etM

anía

<<

7

En ella participaránalgunos de los ponentesmás prestigiosos del mun-do que tratarán un amplio

abanico de tecnologías tales como SQLServer 2005, Visual Studio 2005,ASP.NET 2.0, C# 2.0, Windows Forms2.0, seguridad, servicios Web, etc.Entre ellos algunos colaboradores dedotNetManía como Dino Esposito(con sus ponencias “Script it withASP.NET 2.0”, “The new ASP.NET2.0 code model” y “Never mind theDataGrid: there’s a new grid control intown”) -junto con otros colegas deWintellect como Jeffrey Richter oJohn Robbins- y Fernando Guerrero

(con sus ponencias “ToCLR or not to CLR inSQL Server 2005”,“Security enhancements inSQL Server 2005” y laTechnical Keynote “What’snew in SQL Server 2005for developers”)-junto consu colega de de SolidQuality Learning, RonTalmage- que tendránespecial protagonismo enel segundo SQL ServerDevcon 2005 que se cele-bra conjuntamente con elDevWeek. Más informaciónen www.devweek.com.

DevWeek 2005 (8ª Edición)La conferencia para desarrolladores más grande delReino Unido se celebrará del 21 al 25 de febrero de2005 en Londres.

Dino Esposito

FernandoGuerrero

En cada centropuede encontrar, conindependencia de sunivel y experiencia,una gran cantidad derecursos ,ejemplos decódigo, artículos,referencias de interés,

cursos, libros, eventos, foros de soporte,etc., y todo ello desde un punto de vistaespecizalizado y organizado por categorí-as según la tecnología o producto de su

interés. Actualmente existen los siguien-tes centros:• Acceso a Datos. • Aplicaciones Móviles.• Microsoft .NET Framework. • Microsoft C#.• Microsoft ASP .NET. • Microsoft Office.• Seguridad. • Microsoft Visual Basic.NET.

Más información en: http://www.micro-soft.com/spanish/msdn/centros_dev)

Centros de desarrollo para .NETMSDN ha puesto en marcha los centros de desarrollopara .NET en español, donde se centralizan todos losrecursos técnicos sobre tecnologías específicas.

Novedades

MSDN Web Developer Kit es una recopi-lación de recursos para el desarrollador deASP.NET que incluye: los vídeos “ASP.NET forPHP programmers” y “Security in ASP.NET”,Kit de recursos para ASP.NET, el softwareAxinom Enterprise CMS 4.2 sin gastos de licen-cia, una versión de prueba de Visual Studio .NETy hosting gratuito para sus proyectos .NET. Estekit es gratuito pero tendrá que pagar 10 euros enconcepto de gastos de envío. Más información en:http://www.microsoft.com/emea/msdn/webdev/es

MSDN Web Developer Kit

Xceed ha anunciado el lanzamiento deactualizaciones a cinco de sus productos .NETy ActiveX.

Xceed Grid for .NET 2.3 ordena de 5 a 25veces más rápido que antes, y aumenta un 10%la velocidad de presentación. Es parte de XceedUI Studio for .NET 2004 v3.

Xceed Zip for .NET v2.1 y Xceed Zip for .NETCF v2 son ahora de un 40% a un 80% más rápi-das en compresión y de un 20% a un 30% enciertos contextos. Éstas están disponibles enXceed Data Manipulation Suit 2004 v3.

Xceed SmartUI for .NET 3.2 también traemejoras en velocidad y nuevas características alos controles SmartUI. Son parte de Xceed UIStudio for .NET 2004 v3.

Todas están también disponibles en XceedUltimate Suite 2004 v4. Para más informacionen: www.xceedsoft.com.

Xceed presenta mejoras paraalgunos de sus productos

Symantec y VERITAS han anunciado quehan alcanzado un acuerdo definitivo para fusio-narse y combinar todos sus valores bursátiles.La compañía fruto de esta fusión va a funcio-nar con el nombre Symantec.

John W. Thompson, presidente y conse-jero delegado de Symantec, va a continuar ocu-pando estos mismos puestos en la compañíaconjunta. Gary L. Bloom, presidente y con-

sejero delegado de VERITAS, va a pasar a servicepresidente, además de ocupar un puesto enla presidencia de la nueva compañía.

Se espera que esta transacción concluyadurante el segundo trimestre de 2005, estandosujeta a las normativas tradicionales en estosacuerdos, incluyendo la aprobación por partedel accionariado de ambas compañías y el cum-plimiento de diferentes regulaciones.

Symantec y Veritas se fusionan

Page 8: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

8

en nuestro mundo tecnológico, pero síparece que va afianzándose definitivamente como elmodo en que las empresas organizan sus estrategiascomerciales y de producto para abordar el mercadode sus potenciales clientes. Quizá uno de los elemen-tos recientes más notorios en que se ha podido verreflejada esta situación ha sido en el Síntesis 2004celebrado por Microsoft en el mes de noviembre enBarcelona. Este evento está destinado a reunir a losprincipales partners españoles de la multinacional delsoftware y en él se suele presentar la línea estratégi-ca para el siguiente año. Lo normal es que se aprove-che para hablar de los próximos anuncios de produc-tos, versiones, tecnologías, etc. O así ha sido hastaahora. Sin embargo el panorama ha cambiado noto-riamente este año. Personalmente asistí al evento yno tuve el placer de oír nada acerca de productosMicrosoft, nuevas versiones, fechas de lanzamiento,etc. Lo único mencionado continuamente es el men-saje de que la empresas lo que tienen son necesidadesde su negocio y que nosotros (los partners) lo quedebemos hacer es dar solución a dichas necesidadesaportando el conjunto de producto y valor añadidoque en cada caso se requiera.

Qué distinto ambiente al de otros años cuandosolo oíamos hablar de Windows 2000 ó 2003, SQLServer 2000, Visual Studio 2003, etc. Ahora todoesto son sólo pequeñas ayudas que colaboran enconfigurar esta solución que el cliente necesita yque normalmente es un conglomerado complejo devarias de ellas. En buena medida me inclino a pen-sar que a la base de este cambio de actitud hay dos

elementos cruciales que la fomentan y motivan, unode ellos es el camino comenzado hace varios añospor Microsoft para desplazarse desde el mercadode los sistemas operativos y los clientes desktop almercado corporativo. El otro tiene sus raíces en lacada vez mayor complejidad del entramado tecno-lógico que las empresas necesitan. Ambos, a su vez,son parte de otro hecho crucial; se trata de que latecnología es cada vez más entendida por los direc-

tivos empresariales como parte de su propio nego-cio, como elemento crucial para obtener ventajascompetitivas y, por tanto, como un elemento másde su cadena de valor. Es decir que el departamen-to de informática de las compañías ha pasado de serun servicio de apoyo a ser una parte más del pro-ceso comercial y productivo de la empresa, algo quediferencia y hace obtener ventajas en un mercadorigurosamente competitivo.

Un cambio de paradigma

Por Antonio QuirósGeneral Area ManagerAlhambra-Eidos

Parece que estamos asistiendo a un importante cambio de modelo en lo que almodo de satisfacer las necesidades informáticas de la empresa se refiere. Se tratadel paso de un paradigma presidido por la noción de producto a otro presididopor la noción de servicio. Las empresas tienen problemas y demandan solucionespara los mismos, pero las empresas no demandan productos en sí mismos sino entanto que sirven para solventar sus necesidades.

Esta visión no es nueva<<

Hoy nuestros clientes (…) lo que nos van a pedir es que

seamos la empresa que mejor entiende su negocio, que mejor

sabe amoldarse al mismo…

Page 9: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Ante una situación como ésta las empresas y losprofesionales no podemos permanecer pasivos. En sudía vivimos una época obsesionados por los produc-tos y las versiones. Grandes conocedores de un len-guaje, de un sistema operativo, de un producto, etc.Más tarde la arquitectura tecnológica sustituyó a esaprimera visión más primitiva. Podemos decir queactualmente estamos aún en esa época pero con cla-ros indicios de cambio hacia la siguiente. He vistopasar importantes cambios en las arquitecturas quehan traspasado a la totalidad de productos que cono-cemos. Pasamos de la programación estructurada a laorientada al objeto y ahora al modelo de servicios.Hemos visto como la seguridad y la movilidad se con-vertían en tecnologías privilegiadas a la hora de plan-tear cualquier solución tecnológica. Sin embargo esoya no basta. Producto en la prehistoria, Tecnología oArquitectura en el medioevo; ahora hay que subir unnivel más de abstracción: Negocio y Solución son laspalabras clave.

No conviene dar a esto una lectura intrascendente,como si no fuera con nosotros. Lo va y mucho. Cambiaráademás nuestra manera de trabajar, nuestro hábitos, nues-tro modo de enfrentar las relaciones con nuestros clien-tes y, desde luego, el modelo por el que nuestros clien-tes evalúan la calidad de nuestros servicios. Así pues, ahíva un consejo por poco coste. Ya que yo en esta secciónno os doy demasiadas ayudas tecnológicas intentaré darosen cambio algún que otro buen consejo. Cambiar vues-tras cabezas y hacer que en ellas determinados princi-pios se superpongan a los estrictamente técnicos. Pensaren que hace unos años una empresa podía ser la quetuviera a los profesionales con mejor nivel de especiali-zación en un determinado producto (por ejemplo losmejores programadores en Visual Basic) o los más cono-cedores de determinada tecnología (por ejemplo en eldesarrollo de sistemas basados en servicios web). Hoynuestros clientes pueden valorar esto pero lo que nosvan a pedir es que seamos la empresa que mejor entien-de su negocio, que mejor sabe amoldarse al mismo y que,por tanto, mejores soluciones aporta a sus necesidades eincluso que se muestra proactiva a la hora de proponersistemas que la ayuden a obtener ventajas competitivasen su mercado.

En general los desarrolladores de software sole-mos vivir en un plano bastante alejado de la realidad.Con el interfaz hacia la máquina bastante más desa-rrollado que el interfaz hacia las personas, esto no nosha hecho muy proclives a la relación con nuestrosclientes. De hecho casi nunca hemos entendido susnecesidades de negocio y en muchas ocasiones noshemos reído de ellos por su escasa comprensión delhecho técnico donde nosotros estábamos ubicadoscomo dioses. Pero los ídolos caen y los momentos dela venganza llegan. Ahora nos tocará vivir un mundoalgo más complejo donde habremos de pasar de serel todo a constituir sólo una pequeña parte del pro-ceso de negocio que se entablará entre nuestras empre-sas y sus clientes. Personalmente conozco a muchosdesarrolladores que se enfrascan en proponer y dise-ñar lo que ellos entienden como la solución técnica másadecuada aunque para nada dicha solución sea lademandada por el negocio, la cultura corporativa olas necesidades del cliente. Este tipo de perfiles pro-fesionales no tienen mucha cabida en el nuevo mode-lo de colaboración que entre las empresas de serviciosinformáticos y sus clientes se está planteando. Se nece-sitan personas dinámicas con una muy buena visióntecnológica, pero no por ello menos facultados paraentender el negocio de los clientes. Saber amoldarsea sus procesos empresariales y saber adecuar el mun-do de la tecnología a las necesidades empresarialesque cada cliente requiere serán facultades elementa-les que los responsables de recursos humanos deman-darán de los tecnólogos con tanta fuerza como la pro-pia capacidad técnica.

Y si alguien no me cree que piense en hechos comolos que cada vez se están produciendo más respecto acomo se comercializan los productos. Las grandes cor-poraciones del software, y Microsoft abandera estemovimiento, están pasando de considerar el softwa-re como producto para considerarlo como servicio. Ylos servicios no se venden a precio tasado sino que sealquilan para un periodo de tiempo, de ahí que cadavez se hable menos de versiones, actualizaciones, etc.y más de contratos de servicios para instalar, sopor-tar, mantener y actualizar los sistemas. Igualmentecada vez oímos hablar más del outsourcing de proce-sos o de negocio, donde no es ya el servicio tecnoló-gico lo que se externaliza sino la gestión completa deun determinado proceso de negocio que incluye todoel soporte tecnológico al mismo.

Ancilla Philosophiae, esclava de la filosofía, sedecía que era la ciencia hasta la edad moderna, peroa partir de dicha época la ciencia rompió sus cade-nas para andar por el mundo sin tutor alguno.Ancilla Tecnologiae (y que me perdone Cicerón),esclavo de la tecnología, podríamos decir que hasido el proceso empresarial durante muchos años,pero el momento de romper las cadenas parece queestá llegando al fin.

…la tecnología es cada vez más entendida porlos directivos empresariales como parte de supropio negocio, como elemento crucial para

obtener ventajas competitivas...

dotN

etM

anía

<<

9

dnm.opinion<<

Page 10: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

10

labor dentro del programa de investiga-ción de Microsoft?

Mi responsabilidad se centra en toda la investi-gación relacionada con las universidades. Tratamosde dar la oportunidad de realizar el tipo de explora-ción que no se haría de forma predeterminada en loscentros de investigación de Microsoft.

Quiere eso decir que sugieres líneas de inves-tigación a las universidades y las monitorizas dealguna forma…

Sí, definimos líneas de investigación o sugerimosáreas de trabajo concretas en torno a algunos gruposde investigación. También puede decirse que defini-mos algunas estrategias a seguir en este campo entor-no a las universidades. Y esto lo hacemos en muchasuniversidades europeas. Por ejemplo en España, tra-bajamos estrechamente con la UniversidadPolitécnica de Cataluña en diferentes áreas, y perso-nalmente, estoy gratamente sorprendido por el nivelobtenido hasta ahora.

Respecto a los niveles de trabajo, ¿se diría quevuestro enfoque va más al alto o al bajo nivel?

Es una mezcla de ambos. Intentamos hacer unainvestigación multidisciplinar que puede tomar susfuentes de la biología, o las matemáticas, y que enocasiones funde ambos conceptos, tanto en el altocomo en el bajo nivel.

En tu charla de ayer, hiciste algunas intere-santes comparaciones entre la biología y la evolu-ción de los ordenadores y más adelante elucubra-bas sobre el futuro. ¿Tiene esa línea de trabajo apli-caciones directas?

Las tiene en lo que significa lo que nosotros lla-mamos building blocks (bloques de construcción). Peroen el sentido de pensar lo que puede ser la informá-tica en los próximos 20 años y tratar de anticiparnosy estar preparados sentando las bases para ello. Perotambién pensamos en nuevas aplicaciones para las

Entrevista a Stephen Emott

Por Marino PosadasMVP Visual Developer C#Alhambra-Eidos www.elavefenix.net

<<

Stephen Emott es Group Director for External Research en Microsoft y presentó laponencia inicial en el evento de Microsoft Research sobre nuevas tendencias eninvestigación para los próximos 10 años, que abarcaban desde ideas multidiscipli-nares hasta la computación cuántica y los aportes que la biología puede hacer enesta disciplina. Hablamos brevemente con él, antes de su retorno a Cambridge.

¿Cuál es tu

Page 11: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

plataformas Microsoft exis-tentes, o para extendertecnologías actuales de nue-vas formas.

Puede tratarse de aplica-ciones de tutoría, de ense-ñanza y aprendizaje, redes,ingeniería del software, busi-ness intelligence, etc.

¿Puedes mencionarnosalgunas áreas concretas decara a nuestros lectores?

Aunque hemos crecidomucho en ese sentido, toda-vía la colaboración académi-

ca se encuentra en sus primeros estadios. Tenemos algu-nas investigaciones iniciales completadas, pero más quealguna aplicación concreta, yo señalaría ese “sentar lasbases” al que me he referido antes, y también la antici-pación de lo que va a ser la próxima generación de orde-nadores y computación.

Tú trabajas con universidades europeas, de OrienteMedio y de África. ¿Cuáles piensas que son más procli-ves a las propuestas de investigación de Microsoft?

No puedo destacar a nadie en concreto. Tampocopuedo decir que exista una especial reticencia en la acep-tación de nuestras tecnologías. Se aceptan, unas vecesporque son estándares de facto, y otras, simplemente porsu calidad.

Cambiando de tema,¿crees -como se piensa enmás de un entorno- queel lenguaje C# es el másapropiado para la investi-gación en el entorno uni-versitario, mientras queVisual Basic .NET seríamás adecuado para eldesarrollo de aplicacionesempresariales?

No conozco los lenguajes suficientemente, y yo tam-poco soy programador en el sentido estricto del térmi-no. No obstante, creo que ambos se pueden utilizar enese sentido, aunque es cierto que la similitud sintácticaentre C# y otros lenguajes populares puede favorecer eluso de éste último.

¿A qué crees que se debe el hecho de que brillantesingenieros de la competencia de Microsoft, como YousefKhalidi (arquitecto de Solaris 9 y Cluster 3.0) o BlakeStone (Jefe de Proyecto de J-Builder) estén ahora tra-bajando en Redmond?

A que la plataforma lo merece. La prueba está en lacantidad de “ruido” mediático que la nueva plataformaLonghorn está produciendo en muy diversos entornos.

En Longhorn va a haber muchas API's administradas y, en suma, todo el sistema va a ser mucho más seguro,

por que la propia plataforma .NET lo es

<<dnm.directo.entrevistas

noticias.noticias.noticias.noticias

Imagina un mundo donde la tecnología elimine las barre-ras... es el lema de la nueva Imagine CUP España 2005,la competición de desarrollo para estudiantes universita-rios creada para premiar la inspiración en innovación tec-nológica, que acaba de iniciar su andadura. El plazo de ins-cripción de participantes está abierto y puede hacerlo enwww.desarrollaelfuturo.com. ¡Los primeros dos días ya sehabían inscrito 65 participantes!

Los premios para los tres finalistas la edición española son:1er puesto El viaje a Yokohama (Japón) con todos los gastos

pagados para participar en la final internacional deImagine Cup.

2º puesto Un dispositivo Pocket PC para cada uno de los inte-grantes del equipo.

3º puesto Una consola de juegos Xbox con 3 juegos para cadauno de los integrantes del equipo.

Imagine CUP España 2005Imagina un mundo donde la tecnología elimine las barreras...Imagine CUP España participa en la 3ª Imagine CUP internacional organizada por Microsoft Corp. y donde se repartirán más de 85.000 dólares en premios.

Page 12: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

12

anteriores vimos diferentes tecnologías utili-zando como excusa la de plasmar informes o gráficos3D. Ya sé que hay muchos generadores de informes,sin embargo aprender estas alternativas abre un amplioespectro de soluciones que pueden ir más allá del pro-pio informe en sí para finalmente salvarnos el día enmás de una ocasión. No quiero pasar por alto el artí-culo de José Miguel Torres del número 5 (junio de2004) donde se cubrió SQL Server Reporting Services;éste me ha resultado realmente interesante y puedeser también una buena opción si se tiene SQL Server2000. No obstante, en esta última entrega veremoscómo generar informes de cualquier base de datos,lo que incluso podría involucrar varias de éstas al mis-mo tiempo así como orígenes no relacionales (archi-vos planos, documentos XML, etc.). La solución quepresentaré es una de las más flexibles que he visto yadicionalmente nos servirá para conocer varias tec-nologías colaterales. Le prometo que no empleare-mos más de 15 minutos para construir los informes,pese a que los mismos incluyan características máscomplejas como pueden ser el agrupamiento de datos,subtotales, imágenes, etc.

Modelos de informesTradicionalmente las herramientas generadoras de

informes utilizan el modelo conectado (o pull) comomedio estándar para el modo de diseño y su posteriorejecución. Básicamente este tipo de aplicaciones obtie-ne la estructura de la tabla o tablas involucradas en elinforme con el fin de que el mismo pueda ser diseña-

do gráficamente por el desarrollador. Posteriormenteen tiempo de ejecución el motor de la herramienta seconecta al origen de datos y obtiene la informaciónnecesaria plasmándola finalmente en un documentoresultante. Sin embargo, en algunas ocasiones estaaproximación puede no ser del todo válida u ofreceralgunas restricciones importantes. Por ejemplo, aveces la aplicación que utiliza el informe no se deseaque tenga acceso directo a la base de datos. Esto seve mucho en software bancario donde se ofrece unportal Web para que los clientes consulten su infor-mación personal en línea. Si embargo, el brindar acce-so directo desde la página Web a la base de datos pue-de ser un problema, sobre todo si finalmente seencuentra algún agujero de seguridad. Para enmen-dar esto, la mayor parte de las empresas exponen real-mente una copia de la base original y es esta últimala que emplea la solución Web. Por supuesto que estemodelo no está mal, pero implica un esfuerzo adi-cional en replicar los datos cada un determinadonúmero de horas o minutos, ofrecer la misma estruc-tura que la original, etc. A su vez se puede necesitarque el informe obtenga los resultados de múltiplesbases de datos, o lo que puede ser aún más traumáti-co, tener que incluir datos de orígenes no relaciona-les como puede ser un archivo de texto o la respues-ta de un servicio Web. En estos casos se hace muydifícil consolidar todo esto haciendo uso del modeloconectado. Es por ello que algunas herramientas ofre-cen el llamado modelo Push (de empuje o desconectado).Básicamente éste se basa en que el desarrollador esta-rá en contacto en tiempo de diseño con la estructura

Informes y trazado de gráficas 3D en ASP.NET (y III)

Implementando el modelo de empuje “push” con XML y XSLT

Generar informes en .NET Framework utilizando XML y XSLT puede llevar nomás de 15 minutos, siempre y cuando se conozcan las tecnologías que apoyaneste tipo de tareas.

<<

Por Erich Bühler.NET Framework y VB.NET MVPwww.VBLibros.com

En los artículos

Page 13: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

de la base de datos (tablas, campos, vis-tas, etc.) con el fin de poder dibujar elinforme y así establecer las diferentespautas y estilo (hasta aquí es igual queel modelo conectado). Sin embargo, ladiferencia radica que en tiempo de eje-cución no será el informe quien irá abuscar la información a la base de datos,tendrá que ser la aplicación quien“empuje” los mismos dentro del infor-me y será allí que este último tomarávida y exhibirá los resultados.

En principio se puede preguntarcuáles son las ventajas que ofrece estemodelo y la respuesta es que la aplica-ción puede obtener los datos de variosorígenes al mismo tiempo (incluso dis-pares) y siempre y cuando respete el for-mato de entrada definido para el infor-me, éste ejecutará y mostrará el resul-tado correctamente. Por ejemplo, sepodría obtener una parte de los datosde un servicio Web XML, otra de unatabla en SQL Server u Oracle, y otra dede un archivo de texto o documentoXML. Finalmente se tendrá que empu-jar todo esto dentro del informe, lo quehará que el mismo se ejecute y lleve ade-lante los cálculos indicados en tiempode diseño por el desarrollador. Porsupuesto que el usuario ve un informeestándar sin mayores connotaciones(figura 1).

Hay varias herramientas que utili-zan esta aproximación como, por ejem-plo, Crystal Reports (sobre todo lo haceasí ya que necesita brindar el soportepara ADO.NET donde los datos estánen un DataSet en memoria en vez dehaber una conexión abierta al origende datos). Sin embargo voy a mostraraquí una aproximación diferente queemplea XML y XSLT para llevar ade-lante este modelo, y que adicional-mente no será necesaria una inversión

de más de 15 minutos para tener todofuncionando.

Modelo de empuje “Push” uti-lizando XML y XSLT

Es muy sencillo implementar el mode-lo de empuje (Push) utilizando XML yXSLT, pero antes voy a hablar brevementede estos formatos aunque creo que ya ten-drá noción de los mismos. XML es unestándar de texto para almacenar infor-mación, el que sigue ciertas reglas, se com-pone de etiquetas y hace uso de algunasestructuras obligatorias con el fin de quetodo sea consistente desde el punto de vis-ta de las colocaciones y sintaxis (fuente 1).

Este documento, por ejemplo, hasido obtenido del cruce de 2 tablas dela base de datos Pubs, la que viene inclui-da como ejemplo en Microsoft SQLServer y Microsoft Access, aunque elorigen y las tablas podría ser cualquie-ra. Esto es así porque hoy en día existeun sinfín de herramientas que hacenposible generar un documento de estetipo basado en una conexión a datos.Incluso .NET Framework ofrece clasesy métodos para plasmar un DataSet enun archivo XML. Yo particularmentehe escrito unas 20 líneas en VB.NETpara llevar adelante esta tarea (podrábajar el fuente completo de dotnetma-nia.com), aunque le advierto que es muysencillo. También haciendo uso de unaspocas líneas de código se puede trans-

dotN

etM

anía

<<

13

dnm.asp.net<<

Figura 1. Modelo de empuje “push” o desconectado

Fuente 1

<?xml version=”1.0” encoding=”UTF-8”?><dataroot xmlns:od=”urn:schemas-microsoft-com:officedata”

generated=”2004-11-21T01:09:06”><Editores_titulos>

<dbo_publishers_pub_id>1389</dbo_publishers_pub_id><pub_name>Algodata Infosystems</pub_name><city>Berkeley</city><state>CA</state><country>USA</country><title_id>BU1032</title_id><title>The Busy Executive&apos;s Database Guide</title><type>business</type><dbo_titles_pub_id>1389</dbo_titles_pub_id><price>19.99</price><advance>5000</advance><royalty>10</royalty><ytd_sales>4095</ytd_sales><notes>An overview of available database systems with emphasis on common

business applications. Illustrated.</notes><pubdate>1991-06-12T00:00:00</pubdate>

</Editores_titulos>

Page 14: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

formar un archivo de texto u otro for-mato a XML. Poco a poco le voy acer-cando a mi idea principal, el origen parael informe del modelo de empuje seráun documento de este último tipo. Laidea entonces será generar XML y pos-teriormente empujar salvajemente almismo dentro del informe. En definiti-va, esta aproximación nos permitiráadquirir la información de uno o másorígenes, lo que brinda una flexibilidadtotal. Por ejemplo, si fuera el caso podrí-amos obtener los clientes de un servi-cio Web y las facturas de otro o de unatabla de la base de datos, un archivo detexto, etc. Pero vamos a avanzar un pocomás sobre esta aproximación utilizandoXSLT.

XSLT aplicado a informesComo vimos anteriormente XML

es muy bueno para guardar informaciónpero si se desea mostrar no es muy agra-dable a la vista. Para subsanar esto secuenta con XSLT que es un documen-to de plantilla de estilo y transforma-ción expresado en formato XML. Éste,

básicamente contiene información (sen-tencias) sobre transformaciones de esti-lo que se le deberán aplicar al docu-mento XML de datos. Como resultadofinal se obtiene un tercer archivo quepodría ser por ejemplo un informe enformato HTML. Es entonces que pue-de transformarse un XML como origena diferentes visualizaciones y quierodetenerme aquí por un momento. Lapiedra fundamental de nuestra aventu-

ra será esta tecnología ya que la defini-ción del informe, sus cálculos, subtota-les, etc. vendrán definidos en el docu-mento XSLT. Incluso es posible incluirprocedimientos en alguno de los len-guajes de .NET o VBScript para quesean empleados dentro de las transfor-maciones y de esta forma mejorar algu-nas carencias que se pueden encontrarsi solamente se utilizase el lenguaje detransformación innato de XSLT.

Este documento será entonces ladefinición de nuestro informe, estoincluye cómo mostrar los datos, qué cál-culos efectuar, como agrupar, etc., etc.(ver fuente 2).

Le prometo que no escribirá unasola línea XSLT -yo particularmenteodio dicha tarea, quizá será porque haceunos años atrás me sentaba y pasabahoras tratando de escribir este tipo dedocumentos en el bloc de notas. Se ima-

gina que después de la tercera o cuartahora solía maldecir a quien se le habíaocurrido tan brillante idea, es por elloque no deseo que pase por un momen-to tan traumático-. Vamos a volver porun segundo al modelo de empuje o Push;la idea será entonces construir un pro-cedimiento que obtendrá de una o mástablas la información y la guardará enun documento XML. Una vez hecho,habrá un formulario Web ASP.NETque cargará el documento XML y leaplicará la transformación a los datos,lo que nos dará como resultado un infor-me dentro de la página Web.

Editores de XSLTMe he pasado parte de mi vida bus-

cando un buen editor de XSLT y final-mente siempre termino en lo mismo,esto es, editando parte de la definicióndel documento generado automática-mente con el fin de personalizar el resul-tado. Por supuesto que es algo que nose lo deseo ni al peor de mis enemigos(si es que tengo alguno). Además estoseditores son de amplio espectro y noestán pensados para construir informes;es por ello que para diseñar el docu-mento XSLT vamos a utilizar otraherramienta, una que tanto usted comoyo tiene instalada en su equipo:Microsoft Access.

Esto no significa que los datos ten-gan que ser obtenidos de una base dedatos en este formato ni nada que se leparezca. Este producto cuenta con ungenerador de informes muy potente peromucha gente desconoce que una vez

dotN

etM

anía

<<

14

dnm.asp.net<<

Fuente 2. Pequeño extracto de documento XSLT

<?xml version=”1.0”?><xsl:stylesheet version=”1.0” xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”

xmlns:msxsl=”urn:schemas-microsoft-com:xslt”xmlns:fx=”#fx-functions” exclude-result-prefixes=”msxsl fx”>

<xsl:output method=”html” version=”4.0” indent=”yes”xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”/>

<xsl:key name=”GroupLevel0” match=”Editores_titulos”use=”string(dbo_publishers_pub_id)”xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”/>

<xsl:template match=”//dataroot”xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”>

<html><head><META HTTP-EQUIV=”Content-Type” CONTENT=”text/html;charset=UTF-8”/><title>Editores_titulos</title>

En XSLT es posible incluir procedimientos en alguno de los lenguajes de .NET o VBScript para que sean

empleados dentro de las transformaciones y de esta forma mejorar algunas carencias que se pueden

encontrar si solamente se utilizase el lenguaje de transformación innato de XSLT

Page 15: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dibujado el mismo, la definición puedeser exportada a XSLT, lo que hará posi-ble aplicar éste a cualquier documentoXML generado mediante cualquier otraimplementación, tecnología, etc.

Sé que muchos de ustedes adoranMicrosoft Access y otros piensan locontrario. Debo admitir que en char-las muy técnicas uno puede ser degra-dado al nivel de usuario final si men-ciona el nombre de este producto. Espor ello que aquí recomiendo seguir

siempre la segunda ley de Bühler quedice que “no mencione que su solu-ción utiliza Microsoft Access a no serque sea estrictamente necesario”, y esaquí donde debo agradecer las bon-dades de este producto ya que nos per-mitirá crear un informe basado encualquier origen y posteriormenteexportar la definición de su diseño aun documento de plantilla de trans-formación XSLT.

Generando XSLT conMicrosoft Access

Imaginemos por un instante quetenemos una base de datos en un ser-vidor remoto tal como podría serMicrosoft SQL Server, Oracle, oincluso un origen no relacional. Lo

primero que debemos hacer es ir aMicrosoft Access y crear una basedatos en blanco (más adelante la des-cartaremos). Una vez hecho esto ten-dremos que vincular las diferentestablas remotas que vamos a utilizar enel informe con esta base de datos. Paraello deberá hacer botón derecho y lue-go seleccionar vincular tablas. El pró-ximo paso es seleccionar el origendeseado (en general ODBC), vea lafigura 2.

Aquí tendremos que marcar todaslas tablas a utilizar en el informe. Esimportante destacar que MicrosoftAccess guardará un puntero o referen-cia a los objetos en vez de copiar sucontenido, por lo que cualquier inte-racción con las filas de la tabla en rea-lidad estará modificando los datos ori-ginales. Afortunadamente gran partede las funcionalidades estarán disponi-bles como si fuesen tablas nativas. Elpróximo paso será informar de las rela-ciones existentes entre las tablas remo-tas, esto es así ya que en la mayor par-te de los casos Microsoft Access nopuede detectar a las mismas automáti-camente y es necesario que se especi-fique en forma manual. No obstante elmotivo real de tomarse este trabajoextra es que a la hora de diseñar un

informe si se cuenta con estos datosentonces se podrán crear correcta-mente documentos de tipo maestro/-detalle. Para establecer las relacionesbasta con ir al botón de relaciones enla barra de herramientas y posterior-mente ir agregando las diferentes tablasy sus vínculos (figura 3).

En este caso utilizaré dos tablas, laprimera se llama Publishers (Editores)y contiene la lista de las casas edito-ras de libros. La segunda es secunda-ria y se llama Titles (títulos) y alma-cena los títulos de libros que cada edi-tor publica. Ellas se vinculan por elcampo pub_id en una relación de 1 an, por lo que más adelante nos será deutilidad conocer esto para agrupar loslibros por editor.

Una vez indicada la relación debe-mos ir al menú de informes y utilizan-do el asistente agregaremos todos loscampos de estas dos tablas. Automá-ticamente detectará la relación y nospropondrá la visualización maestro/deta-lle, lo que es apropiado para este caso(figura 4).

En los próximos pasos se nos con-sultará sobre qué campo utilizar para

dotN

etM

anía

<<

15

dnm.asp.net<<

Figura 2

Figura 3

Figura 4

Page 16: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

agrupar, ordenar, y finalmente se pro-pondrá el estilo que tendrá el informeasí como también otras consideracio-nes estéticas. Al finalizar se agregaráun nuevo elemento en la ventana deinformes. Si todo ha salido correcta-mente al hacer clic sobre el mismo sepodrá ver el resultado. Incluso tam-bién puede ir a modo de diseño y alte-rar totalmente el estilo sugerido, agre-gando imágenes, cambiando los colo-res etc. (figura 5).

Vamos ahora a ir a la parte másimportante. Si hace clic derecho sobreel informe verá que hay una opciónque permite exportar al mismo. Unade éstas sugiere XML como formato,haremos clic aquí lo que abrirá unanueva ventana sobre las preferenciasde exportación (figura 6).

La propuesta es sencilla, exportarlos datos actuales de la tabla a XML,crear un documento de plantilla deestilo XSLT que contenga lo quehemos dibujado, y/o crear un docu-

mento de esquema que permita vali-dar si el XML de entrada está en elformato esperado. Éste último no loutilizaremos, por lo que puede blan-quear dicha casilla de verificación. Siva a más opciones, y específicamenteselecciona la ficha de presentación,podrá ver algunas alternativas máscomo puede ser dónde depositar lasimágenes que utilizará el informe, sicrear una página ASP o HTML paravisualizar al mismo, etc. Esto último

no lo emplearemos realmente ya queharemos uso de nuestro propio for-mulario Web ASP.NET para exhibiral documento. Al aceptar la exporta-ción se estarán creando los siguientesarchivos:

1. Documento XML conteniendotodos los datos de la tabla.

2. Documento de plantilla de estiloXSLT conteniendo las transfor-maciones.

3. Archivo HTML o ASP para pro-bar el informe generado.

Puede abrir el archivo HTML oASP y ver dentro del explorador cómose exhibirá el informe resultante utili-zando datos estáticos contenidos en eldocumento XML, el que ha sido gene-rado con la información al momento dela exportación.

Veamos entonces cómo vincular todoesto con ASP.NET y hacer que los datossean obtenidos dinámicamente.

Informes en ASP.NET utilizan-do XSLT

La idea será crear un proyectoWeb en Visual Studio .NET que con-tenga un formulario de ASP.NET.Cada vez que se acceda al mismo (ocada un tiempo determinado) se rege-nerará el documento XML con lainformación de la base de datos.Posteriormente aplicaremos la plan-tilla de estilo XSLT previamente cre-ada con Microsoft Access y retorna-remos el resultado. Esto lógicamentedará como consecuencia dentro delformulario Web el informe en forma-to HTML con los últimos datos de labase de datos. Para regenerar el docu-mento XML cargaremos las tablas enun DataSet y luego haremos uso delmétodo GetXML del mismo, lo que plas-mará toda la información en un archi-vo. Es importante que el documentoXML generado desde la aplicación.NET se vea exactamente igual al queespera la plantilla de transformaciónXSLT, ya que de lo contrario no fun-cionará correctamente. Todos losnodos se deberán llamar igual y el res-to de la estructura también deberá serla misma. Lamentablemente si seguarda directamente un DataSet en esteformato utilizando GetXML/WriteXML seencontrará con algunas diferencias queharán que los archivos no sean igua-les y por ende nada de esto funcione.Muestro en el fuente 3 un pequeñotrozo del documento XML generadopor Access para analizar su estructu-ra y cómo lograr un archivo similarempleando .NET Framework.

Las primeras dos líneas indican laversión de XML, su formato de escri-tura, así como el espacio de nombresraíz a utilizar (dataroot). Recuerde quese diferencia entre mayúsculas y minús-culas, por lo que un error en el nombrede una etiqueta puede dar como conse-cuencia varias horas de depuración.Posteriormente se tiene un nodo secun-dario llamado Editores_titulos (el quees en realidad el nombre que se le dioal informe), existirán tantos de estosnodos como filas hayan en la base dedatos. Dentro del mismo se contienenlos diferentes campos y sus respectivosvalores.

dotN

etM

anía

<<

16

dnm.asp.net<<

Figura 5

Figura 6

Page 17: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Comencemos por lo más relevan-te. Lo primero en lo que hay que pres-tar atención es la sentencia de selec-ción de filas de la base de datos, estoes importante ya que Microsoft Accessrenombra algunos campos con el finde evitar conflictos. La sentencia del

fuente 4 es la adecuada para generarlos nodos con los nombres correctosdentro del DataSet, lo que se plasma-rá posteriormente en el documentoXML.

Preste atención a las partes resalta-das ya que es allí donde se renombranalgunos campos. En realidad esta líneala he obtenido de la sentencia de selec-ción de Microsoft Access y luego heefectuado algunos pequeños cambiospara adecuar los nombres con el fin deque sean los mismos de los nodos deldocumento XML. Conviene entoncesuna vez creada la instrucción de selec-ción ver si cada campo se llama de lamisma forma que las etiquetas del archi-vo XML original.

Para crear un nodo raíz que se lla-me dataroot y que contenga a los demáselementos solamente es necesario indi-car éste como nombre del DataSet en elmomento de crear al mismo.

MiDataSet = New DataSet("dataroot")

Como vimos anteriormente tambiénes indispensable un nodo llamado

Editores_titulos por cada fila. Esto sehace simplemente modificando el nom-bre de la tabla dentro del DataSet.

MiDataSet.Tables(0).TableName = "Editores_titulos"

Existen 3 cambios más que hay queefectuar que son realmente muy peque-ños y los he realizado directamente sobreel texto generado. Vista la poca impor-tancia que tienen he creído que no vale lapena que me explaye aquí aunque inclu-yo el detalle en los fuentes respectivos.

Está listo el documento XML.Ahora el último paso será escribir el mis-mo al dispositivo con el fin de que pue-da ser utilizado por el archivo de plan-tilla de estilo XSLT (fuente 5).

Debemos aplicar ahora al docu-mento XML el estilo creado conMicrosoft Access para obtener elHTML resultante conteniendo al infor-me diseñado anteriormente.

Aplicando la plantilla de estiloXSLT

A primera vista se puede pensar enutilizar el control XML disponible enla barra de herramientas para formula-rios Web o las clases del espacio de nom-bres System.XML. Estas últimas en prin-cipio deberían dar soporte para este tipode tareas, sin embargo, cuandoMicrosoft Access genera el documentode plantilla de estilo XSLT añade códi-go VBScript para realizar cálculos ydemás tareas que no pueden ser lleva-das adelante haciendo uso directamen-te de las instrucciones de este metalen-

dotN

etM

anía

<<

17

dnm.asp.net<<

Fuente 3. Documento XML generado por Microsoft Access

<?xml version=”1.0” encoding=”UTF-8”?><dataroot xmlns:od=”urn:schemas-microsoft-com:officedata”

generated=”2004-11-21T01:09:06”>

<dbo_publishers_pub_id>1389</dbo_publishers_pub_id><pub_name>Algodata Infosystems</pub_name><city>Berkeley</city><state>CA</state><country>USA</country><title_id>BU1032</title_id><title>The Busy Executive&apos;s Database Guide</title><type>business</type><dbo_titles_pub_id>1389</dbo_titles_pub_id><price>19.99</price><advance>5000</advance><royalty>10</royalty><ytd_sales>4095</ytd_sales><notes>An overview of available database systems with emphasis on common

business applications. Illustrated.</notes><pubdate>1991-06-12T00:00:00</pubdate>

Fuente 4

Fuente 5

SELECTpublishers.pub_id AS dbo_publishers_pub_id, publishers.pub_name, publishers.city, publishers.state, publishers.country, titles.title_id,titles.title, titles.type, titles.pub_id AS dbo_titles_pub_id, titles.price,titles.advance, titles.royalty, titles.ytd_sales, titles.notes, titles.pubdate

FROM publishersINNER JOIN titles ON publishers.pub_id = titles.pub_id;

Dim ArchivoyRuta As String = MapPath("MiInforme.xml")Dim Escritor As New StreamWriter(ArchivoyRuta)Dim MiAdaptador As SqlDataAdapterDim MiDataSet As DataSetDim XMLInforme As String

'<Aquí se conecta y carga el Dataset>

'Obtiene y transforma el Dataset para que sea completamente'igual al generado por MS Access.XMLInforme = MiDataSet.GetXml()XMLInforme = AdaptarXML(XMLInforme)

'Escribe a archivoEscritor.Write(XMLInforme)Escritor.Flush()Escritor.Close()

<Editores_titulos>

</Editores_titulos>

publishers.pub_id AS dbo_publishers_pub_id,

titles.pub_id AS dbo_titles_pub_id,

Page 18: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

guaje. Las clases de la infraestructurasoportan documentos XSLT que con-tengan complementos de código escri-tos en alguno de los lenguajes de .NETpero no VBScript. Es por ello que si seintenta aplicar la plantilla al archivoXML utilizando estos métodos obten-drá un error de ejecución. De esta for-ma hay que descartar las característicasinnatas de la infraestructura para ges-tión de XML/XSLT.

Afortunadamente la biblioteca queutiliza Office para la gestión deXML/XSLT está disponible desde.NET, simplemente se debe estableceruna referencia a ella (figura 7).

Esta biblioteca es en realidad la ver-sión 5.0 del modelo de documento deobjetos o DOM, la cual muchos de uste-des conocerán y se emplea desde variosproductos de Microsoft. Uno vez hechoesto, tendrá que cargar ambos docu-mentos utilizando los métodos Load paraluego aplicar el archivo de transforma-ción XSLT al documento de datos XML(fuente 6).

Esto dará como resultado el infor-me que dibujamos en MicrosoftAccess con los datos escritos desde.NET Framework. Recuerde quesiempre y cuando conserve el forma-to de entrada, el informe funcionarácorrectamente. Esto es importante ya

que se podría obtener la informaciónde orígenes dispares tal como podríaser un servicio Web, una tabla, etc., ysiempre y cuando ésta se mantenga

acorde, todo seguirá funcionando sinproblemas (figura 8).

Este es el último artículo de laserie. Espero que le haya sido de uti-lidad para conocer un poco más sobreASP.NET y varias tecnologías colate-rales. Como siempre me despido has-ta un nuevo artículo esperando suscomentarios.

dotN

etM

anía

<<

18

dnm.asp.net<<

Figura 7

Figura 8

Fuente 6

Dim InformeXML As New MSXML2.DOMDocumentDim EstiloXSL As New MSXML2.DOMDocument

'<Aquí se genera el documento XML>

'Establece el archivo con los datos (XML)InformeXML.load(Server.MapPath(_

"MiInforme.xml"))

'Establece el estilo a aplicar (XSLT)EstiloXSL.load(Server.MapPath(_

"MiInforme.xsl"))

'Aplica el estilo al XML y lo retornaResponse.Write(InformeXML._

transformNode(EstiloXSL))

Page 19: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

19

de dos artículos vamos a estudiar una de las redesmás importantes (sino la más importante) de mensa-jería: MSN Messenger.

• En el primero veremos una introducción al pro-tocolo de Messenger, autentificación y gestión denuestra lista de contactos, e implementaremos unejemplo que se conecte con éxito a la red y extrai-ga la lista de usuarios y sus estados.

• En el segundo veremos cómo comunicarnos conlos servidores Switchboard (los que se encargan deque podamos “hablar” con otros usuarios), y aña-diremos dicha funcionalidad a la aplicación deejemplo que estamos realizando.

La red Messenger

¿Qué es la red Messenger?

La red Messenger de Microsoft, es una red de men-sajería instantánea (permite ver el estado de otros clien-tes, y comunicarse con ellos) que comenzó a funcionaren julio de 1999.

¿Qué es el protocolo MSN Messenger?

El protocolo MSN Messenger consiste en una seriede comandos que se envían entre cliente y servidor. Porejemplo cuando un contacto de tu lista se desconecta,el servidor nos envía un mensaje algo así como: FLN [email protected], cuando se recibe este mensaje laaplicación cliente debe sacar de la lista de usuarios onli-ne a éste, y moverlo a la lista de usuarios offline.

Dicho protocolo ha ido evolucionando con elpaso del tiempo, en la actualidad las versiones quesoporta el servidor Messenger del protocolo son laMSNP8 o superior.

En agosto de 1999, Microsoft anunció que teníaplanes de publicar su protocolo de MSN messengery envío un borrador del mismo a la IETF (InternetEngineering Task Force).

Este documento se refería a la versión MSNP2 delprotocolo, a fecha de hoy es necesaria la versión MSNP8o superior. La información acerca de esta última la pode-mos extraer del sitio Web “no oficial” de Mike Mintzy Andrew Sayers www.hypothetic.org/docs/msn/index.php,que han realizado una excelente tarea de ingeniería inver-sa extrayendo el nuevo protocolo (la intención de esteartículo, es que tengas una toma de contacto rápida y sidespues quieres ampliar, te dirijas a dicho sitio web).

Antes de empezar a enviar y recibir mensajes, vamosa ver con que tipos de servidores nos podemos comu-nicar en la red Messenger.

Servidor de Entrada (Dispatch Server /Comunicación TCP/IP): Este servidor se encuen-tra en la dirección "messenger.hotmail.com",puerto 1863, a él nos conectamos sólo para quenos de una dirección valida de un servidor de noti-ficación (mira el siguiente punto).

Servidores de Notificación (Notification servers/ Comunicación TCP/IP): Este tipo de servidornos da servicios de "presencia", esto es, nos dicequien de nuestros contactos está conectado o

Redes de mensajería y .NET (I)

MSN messenger, ICQ,Yahoo Messenger, AOL,… todos hemos usado al menos unade estas redes de mensajería. Hoy en día estas redes gestionan a millones de usua-rios a nivel mundial. Seguro que más de una vez se habrá hecho preguntas del esti-lo de ¿cómo pueden gestionar tantos usuarios a la vez?, ¿son aplicaciones P2P o nosestán “escuchando”? Hay clientes de Messenger corriendo bajo Linux, ¿es fácil imple-mentar un cliente que use una de estas redes con .NET?

<<

Por Braulio DíezSolutions DeveloperAvanade

En esta serie

Page 20: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

no, y también se encarga de con-trolar nuestro estado. Mientrastengamos una sesión abierta esta-remos conectados a uno de estosservidores.

Servidores de Passport Microsoft(Comunicación HTTPS): Para poderautentificarnos con éxito en un ser-vidor de Notificación y podercomenzar nuestra sesión debemosconectarnos con un servidor dePassport Microsoft y validar nues-tra cuenta.

Servidores de Charla (Switchboardservers / Comunicación TCP/IP):Cuando queremos hablar connuestros contactos, le pedimos alservidor de notificación que nosreserven una sala para chatear, éstenos da una dirección de unSwitchboard server con el que ten-dremos que conectarnos y decircon quién queremos hablar (estosservidores también se usan paraotros servicios como transferenciade ficheros, o NetMeeting).

Notación de los mensajes

Los mensajes que se manejan eneste protocolo están en formato texto(una codificación buena para trabajarcon ellos es la UTF-8), la mayoría deellos terminan con un salto de línea\r\n (después veremos un tipo demensajes, los que tienen payload, queson una excepción), para mostrarejemplos de secuencias de envío/recep-ción de mensajes, vamos a usar la mis-ma metodología que en la página deMike y Andrew, es decir:• Para indicar que un mensaje lo envía

un cliente, escribiremos dicho men-saje en color azul, y le pondremos elprefijo >>.

• Para indicar que un mensaje lo recibi-mos del servidor, lo escribiremos encolor verde le pondremos el prefijo <<.

• Los comentarios los escribimos encolor celeste, y los marcamos con elsímbolo de comentario //.

• Al final de cada línea de texto que seenvía al servidor suele haber unasecuencia de salto de línea, ésta la indi-caremos como: \r\n.

Handshake/Autentificación

Hacer login en una sesión de mes-senger, es una tarea que parece un pocopesada (en la figura 1 puede ver un resu-men de cuáles son los pasos para esta-blecer dicha conexión), antes de estar“colocados” en el servidor definitivo,tenemos que saltar entre varios inter-medios. En la tabla 1 vamos a ver unejemplo de autentificación con éxito.

Este es el caso féliz de una conexión;en la página web de Mike y Andrewencontrará todas las variantes que se pue-den dar (una opción un poco relajada decontrol de errores sería envolver la secuen-cia de login en un bloque try/catch, y si elservidor nos hecha, al intentar enviar elsiguiente mensaje obtendremos unaexcepción y mostraremos el mensaje “Noha sido posible realizar la conexión, ase-

gúrese que su cuenta y password es correc-to, o pinche aquí para ver el estado de lared de Messenger”).

Comandos básicos de notifi-cación

Muy bien, estamos autentificados…¿Y ahora qué? Lo primero que debeshacer es indicar que estás online, y pedirla lista de usuarios que tienes en la agen-

da. A continuación vamos a ver un grupode mensajes básicos que podemos enviary otros que podemos recibir.

Mensajes de presencia

Nos sirven para dar a conocer nues-tro estado actual (online, away, …), cam-biar nuestro nombre, y recibir infor-mación de cambio de estado de los usua-

Figura 1. Resumen protocolo de autentificación/conexión al servidor de notificación

dotN

etM

anía

<<

20

dnm.comunicaciones<<

Con

exio

nes T

CP

HT

TPS

1. >> Pedimos una dirección de un servidor de notificación donde empe-zar nuestro proceso de autentifiación (enviamos el primer mensaje USR)Usuario

Servidor deentrada (messen-ger.hotmail.com)

1. << El servidor nos devuelve una dirección de servidor de notificación váli-da y cierra la conexión

Servidor de notificación

2. >> Conectamos con el servidor de notificación, volvemos a usar la mismasecuencia de mensajes que con el dispatch server (USR)

2. << En esta conestación, el servidor nos envía un parámetro “ru” quetendremos que usar en la autentifiación passport (la conexión se mantiene)

3. Nos conectamos al servidor de passports de Microsoft, y con elparámetro que obtuvimos en el paso 2, nuestra cuenta de passporty nuestra password, obtenemos un ticket de sesión que le enviamosal servidor de notificación, al que seguimos conectados, quedan-do establecida la conexión

3a. >> Le enviamos al servidor Nexus una petición dedirección de un servidor de login para passports

3a. << Nos devuelve una dirección de un servi-dor de login

Servidorde login

3b. >> Le enviamos al servidor de login de passports,nuestra cuenta passport, nuestro password, y la cadenaque obtuvimos en el paso 4

3b. << Nos devuelve un ticket de sesión con el quecompletaremos nuestra autentificación con el servi-dor de notificación

Nexus

Page 21: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

21

dnm.comunicaciones<<

Tabla 1. Ejemplo de proceso de autentificación con éxito (sigue...)

PASO 1. Le pedimos al dispatch server (Messenger.hotmail.com) la dirección de un servidor de notificación

// El cliente se conecta a Messenger.hotmail.com via TCP/IP, puerto 1863 (Dispatch server)

// Le enviamos el comando “VER”, en el que le indicamos que versión de protocolo Messenger soportamos en este caso,// sólo la 8 ( el parámetro con valor “1” es un número de secuencia que vamos incrementando con cada mensaje // que enviamos (en la página de Mike, lo llama “TrID” o “Transaction ID”>> VER 1 MSNP8 CVR0\r\n

// El servidor nos contesta con un “VER” con el mismo número de secuencia que le enviamos (1), y con la versión// de las que le hemos enviado que soporta (en este caso MSNP8)<< VER 1 MSNP8 CVR0\r\n

// Le enviamos información acerca de nuestro sistema operativo, el lenguaje que hablamos, … en este caso // 0x0409 indica que el idioma U.S. English, “win” Windows, y 4.10 Windows 98 ;-), i386 que es un intel 386 o // superior, y MSNMSGR que estamos usando el cliente oficial de Messenger, la versión de nuestra aplicación // cliente, y al final nuestra cuenta de pasaporte >>> CVR 2 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS [email protected]\r\n

// Nos contesta diciendonos la versión recomendada de cliente que deberíamos usar, de donde podríamos // bajarnosla, y la dirección donde el usuario podría obtener más información acerca de esa versión<<< CVR 2 6.0.0602 6.0.0602 1.0.0000 http://download.microsoft.com/download/8/a/4/

8a42bcae-f533-4468-b871-d2bc8dd32e9e/SETUP9x.EXE http://messenger.msn.com\r\n

// Le envíamos el primer mensaje USR, los parametros son el número de secuencia del mensaje (igual que en // el mensaje VER), y el protocolo de autentificación que usamos (siempre “TWN”), la letra “I” (en la que le // decimos “Initiating authentification”, y el tercero es la cuenta con la que queremos logarnos>>> USR 3 TWN I [email protected]\r\n

// Todo va bien, el servidor nos contesta con la direccion ip del siguiente servidor de Notificación al que// debemos dirigirnos en el tercer parámetro (también nos devuelve la dirección IP del servidor al que estamos ahora // conectados)<<< XFR 3 NS 207.46.106.35:1863 0 207.46.104.20:1863\r\n

// messenger.hotmail.com cierra la conexión (tenemos ahora que abrir conexión en el servidor de notificación // que nos ha indicado el mensaje XFR)

PASO 2.Nos conectamos a la direccion de servidor de notificación que obtuvimos en el paso anterior, y volvemos a repetir el proceso de login. Estavez mantenemos la conexión y nos dirigimos al servidor de passports a pedir un ticket de sesión

// El cliente se conecta a la dirección del servidor de notificación obtenida en el paso 1, y repetimos los mismos// pasos que en el paso anterior.

>> VER 1 MSNP8 CVR0\r\n

<< VER 1 MSNP8 CVR0\r\n

>>> CVR 2 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS [email protected]\r\n

<<< CVR 2 6.0.0602 6.0.0602 1.0.0000 http://download.microsoft.com/download/8/a/4/8a42bcae-f533-4468-b871-d2bc8dd32e9e/SETUP9x.EXE http://messenger.msn.com\r\n

// Le envíamos el mensaje USR, esta vez esperamos que nos de otra contestación diferente al paso 1 >>> USR 3 TWN I [email protected]\r\n

// De esta contestación, cogemos el parámetro “ru”, que nos servira para obtener el ticket de sesión// cuando conectemos con el servidor de pasaportes <<< USR 3 TWN S lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1062764229,kpp=1,kv=5,

ver=2.1.0173.1,tpf=43f8a4c8ed940c04e3740be46c4d1619r\n

// Esta vez el servidor no cierra la conexión y se queda a la espera de que le enviemos el ticket (clave)de // sesión para dar por finalizado el proceso de autentificación (esta clave la obtendremos en el paso 3 enviando // peticiones https al servidor de pasaportes de Messenger)

PASO 3a-3b.Pedimos una dirección a un servidor de pasaportes, y le hacemos una petición de ticket de sesión,enviándole como parámetros,una valor"ru" que obtuvimos en el paso anterior, la cuenta passport con la que queremos logarnos, y su password

// Nos conectamos a “nexus.passport.com” puerto 443 (el servidor Nexus Passport), para pedirle un servidor de // pasaportes que nos pueda dar un ticket de sesión

Page 22: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

22

dnm.comunicaciones<<

rios de nuestra lista. En la tabla 2 pue-des ver una lista con los comandos depresencia básicos.

Mensajes de petición de informaciónpersonal

Como en el caso anterior, justodespués de finalizar el proceso de

autentificación, debemos enviar unmensaje para que el servidor de noti-ficación nos envíe la lista de contac-tos que tiene la cuenta con la que noshemos conectado; esto lo haremosenviando el comando SYN, puedesver un descripción de comandos bási-cos de información personal en latabla 3.

Pings/Challenges

Los pings nos sirven para saber el tiem-po de respuesta de nuestro servidor denotificación, los challenges le sirven al ser-vidor para saber si estamos vivos (y paracomplicarnos algo la vida) ya que si no con-testamos correctamente en 50 segundoséste nos cerrará la conexión (ver tabla 4).

(...continuación) Tabla 1. Ejemplo de proceso de autentificación con éxito

// Le pedimos una dirección (URL) de un servidor de pasaportes (un servidor de login)>>> GET /rdr/pprdr.asp HTTP/1.0\r\n\r\n

// nos la devuelve en el parámetro PassportURLs: DALogin (le tenemos que añadir a esa dirección el prefijo // https:// a esa dirección<<< HTTP/1.1 200 OK\r\n<<< Server: Microsoft-IIS/5.0\r\n// (…)<<< PassportURLs:DARealm=Passport.Net,DALogin=login.passport.com/login2.srf,DAReg=http://register.passport.net/uixpwiz.srf,Properties=https://register.passport.net/editprof.srf,Privacy=http://www.passport.com/consumer/privacypolicy.asp,GeneralRedir=http://nexusrdr.pass-port.com/redir.asp,Help=http://memberservices.passport.net/memberservice.srf,ConfigVersion=11\r\n// (…)<<< \r\n

// nexus.passport.com cierra la conexión

// Nos conectamos a la dirección indicada, y pedimos el ticket de sesión>>> GET /login2.srf HTTP/1.1\r\n>>> Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=example%40passport.com,pwd=password,lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1062764229,kpp=1,kv=5,ver=2.1.0173.1,tpf=43f8a4c8ed940c04e3740be46c4d1619\r\n>>> Host: login.passport.com\r\n

// Si la petición tiene éxito, la respuesta debe parecerse a algo así como:<<< HTTP/1.1 200 OK\r\n<<< Server: Microsoft-IIS/5.0\r\n// (…)<<< Set-Cookie: // (...) <<< Authentication-Info: Passport1.4 da-status=success,tname=MSPAuth,tname=MSPProf,tname=MSPSec,from-PP=’t=53*1hAu8ADuD3TEwdXoOMi08sD*2!cMrntTwVMTjoB3p6stWTqzbkKZPVQzA5NOt19SLI60PY!b8K4YhC!Ooo5ug$$&p=5eKBBC!yBH6ex5mftp!a9DrSb0B3hU8aqAWpaPn07iCGBw5akemiWSd7t2ot!okPvIR!Wqk!MKvi1IMpxfhkao9wpxlMWYAZ!DqRfACmyQGG112Bp9xrk04!BVBUa9*H9mJLoWw39m63YQRE1yHnYNv08nyz43D3OnMcaCoeSaEHVM7LpR*LWDme29qq2X3j8N’,ru=http://messenger.msn.com\r\n<<< Content-Length: 0\r\n<<< \r\n

// En subrayado está el ticket de sesión (Nota: si la cuenta passport no es del tipo “Hotmail” o “MSN”, // tendríamos un paso intermedio extra, una nueva redirección a otro servidor, y allí ya podríamos obtener el ticket // de sesión

PASO 3.Volvemos a la conexión que teníamos abierta con el servidor de notificación en el paso 2, y le envíamos nuestro ticket de sesión,terminando así el proceso de autentificación

// Ya tenemos el ticket de sesión obtenido del servidor de pasaportes, nos autentificamos con él en el servidor // de Notificación

>>> USR 4 TWN St=53*1hAu8ADuD3TEwdXoOMi08sD*2!cMrntTwVMTjoB3p6stWTqzbkKZPVQzA5NOt19SLI60PY!b8K4YhC!Ooo5ug$$&p=5eKBBC!yBH6ex5mftp!a9DrSb0B3hU8aqAWpaPn07iCGBw5akemiWSd7t2ot!okPvIR!Wqk!MKvi1IMpxfhkao9wpxlMWYAZ!DqRfACmyQGG112Bp9xrk04!BVBUa9*H9mJLoWw39m63YQRE1yHnYNv08nyz43D3OnMcaCoeSaEHVM7LpR*LWDme29qq2X3j8N\r\n

// El servidor nos contesta diciéndonos que la validación ha tenido éxito, y nos informa de nuestra cuenta y // nombre<<< USR 4 OK [email protected] example%20display%20name 1 0\r\n

Page 23: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

La respuesta que tenemos que enviara un CHL (desafío), es un mensaje conPayload, es decir, un mensaje que estácompuesto por:

• Cabecera: Una línea en la quedefinimos el comando que enviamos(en este caso QRY), sus parámetros, yun parámetro extra en el que le deci-mos la longitud del resto del mensaje(el cuerpo del mismo), para finalizardicha línea se emplea la secuencia deescape \r\n.

• Cuerpo: Aquí tenemos la tira dedatos (la longitud, la misma que la indi-cada en la cabecera).

En el caso del mensaje de respuestaQRY, tenemos:

• En la cabecera del mensaje 3 pará-metros: uno es el número de secuencia desiempre; el segundo es la cadena de texto“[email protected]”; y el tercero,la longitud del cuerpo (32 caracteres).

• En el cuerpo, escribimos el resul-tado de concatenar el challenge string(aquel número que nos dio el servidor enel mensaje CHL) con el valor“Q1P7W2E4J9R8U3S5” y aplicarledespués el algoritmo Hash MD-5 Digest(que crea una salida de 32 bytes fija), es

dotN

etM

anía

<<

23

dnm.comunicaciones<<

Tabla 2. Mensajes básicos de presencia

Dirección Mensaje Descripción>> CHG Este mensaje nos sirve para indicarle al servidor en qué estado nos encon-

tramos (NLN=Online, AWY=Away, BSY=Busy, …). Este comando tie-ne tres parámetros: el número de secuencia o TrID (ver ejemplo auten-tificación), el código del estado (en mayúsculas), y el ClientID (esto lodejaremos a cero). Por ejemplo:

// Le decimos al servidor que nuestro estado actual es Online>> CHG 12 NLN 0\r\n

// Si todo va bien, el servidor nos contesta haciendo “eco” // del mensaje

<< CHG 12 NLN 0\r\n

*Importante: Este mensaje lo tenemos que enviar justo después de habernos autentificado.

<< ILN Con este mensaje, el servidor nos indica justo después de autentificarnos,que ya hay usuarios de nuestra lista que están online. Los parámetros querecibimos son: el TrID (número de secuencia del primer mensaje CHGque enviamos), el estado en que se encuentre el contacto, su cuenta, y sunombre. Por ejemplo:

<<< ILN 12 AWY [email protected] Mike 0\r\n

<< FLN Cuando un usuario se desconecta, el servidor nos lo notifica con este men-saje. Sólo tiene un parámetro que es la cuenta del usuario que se ha desco-nectado. Por ejemplo:

<<< FLN [email protected]\r\n

<< NLN Si un usuario cambía su estado (Away, Busy, …), el servidor nos lo noti-fica con este mensaje. La sintaxis del NLN es igual que la del ILN, excep-to que no tiene TrID (secuencia de mensaje). Por ejemplo:

<<< NLN AWY [email protected] Mike 0\r\n

Tabla 3. Mensajes básicos de petición de información personal (sigue...)

Dirección Mensaje Descripción>> SYN SYN es un acrónimo de synchronisation. Cuando le envíamos esta petición al servidor, él nos responde con la lista de contactos

que poseemos, la lista de grupos, y datos personales. Este comando tiene dos parámetros: la secuencia del mensaje, y la versiónúltima que nos hemos bajado de datos personales (para ahorrarnos ancho de banda). En nuestro ejemplo diremos siempre queno tenemos nada bajado (versión 0).

La respuesta que nos da el servidor es otro SYN que nos indica la versión actual de caché, el número de contactos y el núme-ro de grupos, además de una serie de mensajes de salida GTC, BLP, PRP, LSG, LST que contienen los datos de esas listas(los más importante los veremos en esta tabla). Por ejemplo:

// Le decimos que nos de datos, que no conocemos nada de la cuenta >> SYN 1 0\r\n

// Nos contesta diciendo que la última cache de contactos es la 139, y que tenemos// cinco contactos y tres grupos<<< SYN 1 139 5 3\r\n

<<< GTC A\r\n// Lista de gente bloqeuada<<< BLP AL\r\n// Mis numeros de telefono<<< PRP PHH 01%20234\r\n<<< PRP PHM 56%20789\r\n

// Lista de grupos (Id del grupo y nombre del mismo)<<< LSG 0 Other%20Contacts 0\r\n<<< LSG 1 Coworkers 0\r\n<<< LSG 2 Friends 0\r\n

Page 24: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

<<dnm.comunicaciones

24

<<do

tNet

Man

ía

(continuación...) Tabla 3. Mensajes básicos de petición de información personal

Dirección Mensaje Descripción(... continuación)

>> SYN// Lista de contactos, cuenta, nombre, un código que indica si // esta bloqueado o no si hay un cuarto parámetro, es la lista// de grupos a los que pertenece<<< LST [email protected] principal1 4\r\n<<< LST [email protected] principal2 10\r\n<<< LST [email protected] principal3 11 1,2\r\n<<< LST [email protected] principal4 11 0\r\n<<< BPR PHH 01%20234\r\n<<< BPR MOB Y\r\n<<< LST [email protected] principal5 12\r\n

*Importante: Este mensaje lo tenemos que enviar justo después de habernos autentificado.

<< LST Este mensaje nos da la cuenta de un contacto, si lo tenemos bloqueado o no, y a qué grupospertenece, ejemplo:

// Parámetros: Cuenta del contacto, su nombre, en qué tipo // de lista lo tenemos (hay cuatro valores disponibles, el // valor del parámetro es la suma de ellos), y a qué grupos // pertenece (en este caso al 1 y al 2)<<< LST [email protected] principal3 11 1,2\r\n

Para el resto de mensajes (por falta de espacio) dejamos el resumen de la fila anterior, para másinformación puedes consultar la web de Mike.

Tabla 4. Mensajes básicos de chequeo de estado (ping/challenge)

Dirección Mensaje Descripción>> PNG Le preguntamos al servidor si está vivo… :-)

>> PNG\r\n

// Si todo va bien, el servidor nos constesta con este mensaje<< QNG\r\n

>> CHL Con este tenemos que tener mucho cuidado. El servidor nos envia un challenge (“desafío”) devez en cuando, nosotros tenemos que contestar de forma correcta o si no, nos desconectaraáde la red (si no contestamos en 50 segundos también nos echará). Ojo porque es un poquitoenrevesado:

// Recibimos un “desafio” del servidor, el primer parámetro es // siempre 0, el segundo es el Challenge String (lo llamaremos // CS), este parámetro lo debemos de usar para responder<< CHL 0 15570131571988941333\r\n

// Éstamos forzados a responderle, para ello enviaremos un // mensaje QRY, este mensaje es bastante especial, y lo vamos // a explicar en detalle fuera de esta tabla >>> QRY 10 [email protected] 32\r\n

8f2f5a91b72102cd28355e9fc9000d6e // (aquí no hay salto de línea)

Tabla 5. Clases principales que se usan en el ejemplo de cliente Messenger

Clase Para qué sirve La usamos en...System.net.Sockets Nos permite abrir un socket (ya sea para

conectarnos vía TCP, UDP,…)La comunicación con el servidor de notificación y elservidor de entrada, la hacemos vía TCP/IP

System.net.HttpWebRequestSystem.net.HttpWebResponse

Para hacer peticiones y procesar respuestaHTTP / HTTPS

La usamos para pedir el ticket de sesión al servidorde passports

System.net.Sockets.NetworkStreamSystem.IO.StreamReaderSystem.IO.StreamWriter

Nos permite tratar la entrada/salida deun socket como si fuera un stream (en estecaso de texto)

Muy cómodo para leer los mensajes que nos llegan(primero hacemos un readline, y si es un mensaje concuerpo, hacemos un read de <n> bytes)

System.Security.Cryptography.MD5 Le metemos una cadena como entrada yprocesa la respuesta (el valor hash) aplican-do el algoritmo MD5 Digest

Para contestar a los “desafíos” del servidor.

RegEx Permite reconocer patrones en cadenas y extra-er información, usando expresiones regulares

Imprescindible a la hora de saber de qué tipo es unmensaje, extraer sus parámetros, etc.

System.Text.Encoding Para codificar en diferentes formatos Los bytes que enviamos/recibimos los transforma-mos a UTF-8

Page 25: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

decir: Body = HashMD5(ChallengeString +"Q1P7W2E4J9R8U3S5"). Afortunadamente,.NET Framework tiene clases que com-putan este algoritmo, y funcionalidad parapasarlo a formato hexadecimal.

¿Por qué tanto valor raro? Lasmalas lenguas dicen que era paraponerle difícil a los desarrolladoressacar el protocolo (aplicar un hash aun valor secreto más otro aleatorio,hace casi imposible que podamosgenerarlo nosotros).

Implementando con .NET¡Manos a la obra! .NET Framework

nos ofrece un conjunto de clases muypotentes para implementar este proto-colo, en la tabla 5, puede ver un listadocon las principales clases que he usadopara implementar nuestro pequeñoejemplo.

El ejemplo que he implementado esuna aplicación Windows Forms, a laque le introducimos una cuenta deusuario y password, y nos devuelve lalista de usuarios que contiene y los esta-dos de los mismos (dichos estados sevan actualizando en tiempo real), verfigura 2. Aunque el código es simple-mente para hacer pruebas, he encapsu-lado la parte de comunicación en unassembly para que sea más fácil deentender (el diagrama de clases lo pue-de ver en la figura 3).

El funcionamiento de nuestro mini-messenger lo puede ver esquematizadoen la figura 4. No he optado por incluirfragmentos del código en el artículo enpapel por cuestiones de espacio; el códi-

go completo lo puede bajar de la Webde dotNetManía (consta de dos pro-yectos, el assembly en sí, que se llama

MSNComm, e incluido en él está el otro, laaplicación de ejemplo DummyTester).

Continuará…

dotN

etM

anía

<<

25

dnm.comunicaciones<<

Figura 3. Diagrama de clases de nuestro assembly de ejemplo

Figura 2.Aplicación de ejemplo

Figura 4. Esquema de funcionamiento de nuestro mini-messenger

Page 26: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

26

de .NET Framework habrá usadoen más de una ocasión formatos que las clases Console,String o StringBuilder nos permiten; incluso con másfrecuencia usará formatos que algunos tipos del pro-pio .NET exponen mediante el método ToString. Esamisma funcionalidad “formateadora” podemos dár-sela a nuestras propias clases (o tipos) mediante ladefinición del método ToString, particularmenteimplementando el definido en la interfaz IFormattable.

Dar formato al estilo .NETCuando hablamos de dar formato, nos estamos

refiriendo a la posibilidad de hacer que el contenidode un tipo de .NET Framework se muestre de unaforma particular. Por ejemplo, si queremos mostraro usar el contenido de un tipo de datos que contieneuna fecha, es posible que nos interese que se mues-tre en formato fecha corta o fecha larga o, lo que serámás habitual, que se muestre según nuestras prefe-rencias. Por ejemplo, si la fecha actual es el 3 de ene-ro de 2005 y queremos mostrarla usando solamentedígitos, seguramente la forma de hacerlo sería“03/01/2005”, pero si queremos mostrarla de formaque el mes se muestre usando tres letras, la repre-sentación sería “03/ene/2005”. Como vemos, tododependerá de nuestras preferencias o de las prefe-rencias del usuario, ya que para un norteamericanosería mejor que se la mostremos empezando por elmes seguido del día y por último el año: “1-3-2005”.Todas estas formas diferentes de mostrar una mismafecha podemos hacerla gracias a que el tipo de datosque mantiene una fecha en .NET está preparado paraque se puedan usar diferentes formatos. Normalmente

esos formatos los indicaremos como una cadena quele pasaremos al método ToString, ya que este méto-do es el encargado de devolver una representaciónvisual del contenido de un tipo de datos. Para conse-guir una cadena usando los tres casos de formato quehemos comentado tendríamos que usar el siguientecódigo:

DateTime.Now.ToString("dd/MM/yyyy")

DateTime.Now.ToString("dd/MMM/yyyy")

DateTime.Now.ToString("M-d-yyyy")

En estos casos lo que hacemos es pasar un for-mato al método ToString, ese método lo interpretaráy devolverá la cadena correspondiente. Ni qué decirtiene que estos formatos están previamente estable-cidos y no son aleatorios, ni algo que existe porquesí, ya que, como sabemos, todo lo que ocurre en cual-quier entorno de programación, ocurre porquealguien lo ha previsto y programado. De este últimoaspecto nos ocuparemos dentro de poco.

Los formatos de las clases de .NETEn los tipos de datos predefinidos en .NET pode-

mos usar formatos que nos permiten dar distintosaspectos al contenido de los mismos. Anteriormentehemos visto tres ejemplos de formatos de fecha; en esosejemplos hemos usado formatos mediante patronesdefinidos en la clase DateTime, (lo que la documenta-ción de Visual Studio .NET llama “cadenas de formatopersonalizado DateTime”), pero también podemos usarcadenas con formatos predefinidos o formatos están-dar; estos últimos suelen ser de una sola letra, por ejem-

Yo formateo, tú formateas... ¡que formatee él!Cómo implementar clases que permitan formatos personalizados en .NET Framework

En este artículo veremos cómo implementar las diferentes versiones del método ToStringpara que, cuando sea preciso, el usuario de nuestras clases pueda utilizar los formatospersonalizados que creamos conveniente aplicar a nuestros tipos de datos.

<<

Por Guillermo ‘Guille’ SomVisual Basic MVP desde 1997www.elguille.info

Cualquier programador

Page 27: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

plo, siguiendo con la fecha 3 de enero, si lo usamos deesta forma: DateTime.Now.ToString("D"), tendríamoseste resultado: “lunes, 03 de enero de 2005”.

Por supuesto existen otros formatos predefinidospara las fechas, los cuales nos permiten mostrar tan-to fechas como horas de diferente forma.

Como es de esperar, también existen formatos paralos tipos numéricos, y al igual que en las fechas nosencontramos con formatos ya predefinidos y otros quenos permiten componer un formato particular. Aunquedebemos tener en cuenta que no todos los formatosson aplicables a todos los tipos numéricos. Por ejem-plo, si trabajamos con valores de tipo entero, podre-mos usar el formato “x”, (que sirve para devolver unarepresentación en formato hexadecimal), pero ese for-mato no podremos aplicarlo a un valor de tipo Decimalo a uno de punto flotante.

En el código que acompaña a este artículo (en“Material de apoyo” en www.dotnetmania.com), pode-mos ver algunos ejemplos de los diferentes formatosque podemos usar tanto con las fechas como con losnúmeros.

¿Cómo definir una clase que sea “forma-teable”?

Los formatos que hemos comentado anterior-mente, sólo son aplicables a los tipos numéricos y alos de fecha/hora. Cuando definimos nuestro propiotipo de datos, esos formatos no están disponibles. Almenos no lo estarán de forma predeterminada, portanto, si queremos que nuestros propios tipos de datosacepten formatos mediante el método ToString, debe-mos programarlo nosotros.

Esa personalización de los formatos a aplicar anuestros propios tipos de datos podemos hacerla dedos formas diferentes.

Definir el método ToString para dar formato

La primera forma de permitir que nuestros pro-pios tipos se puedan usar para dar diferentes forma-tos al valor contenido, es creando nuestra propia sobre-carga del método ToString, de forma que acepte unparámetro en el que indicaremos el formato a aplicar.Así podremos usarlo de la misma forma que los tiposdefinidos en .NET.

Debido a que nuestros propios tipos siempretrabajarán con algún tipo de datos del propio .NETFramework, podremos usar el método ToString deese tipo elemental para hacer el trabajo de dar for-mato al contenido interno de nuestro propio tipo,al menos salvo en el caso de que queramos dar for-matos propios y únicos definidos en nuestro tipo.Pero para mantener las cosas simples (para que seafácilmente comprensible), no vamos a inventarnos(al menos por ahora) ningún formato especial, sino

que desde nuestro método llamaremos al del tipousado internamente.

Para clarificar las cosas, vamos a definir una estruc-tura a la que llamaremos Moneda, la cual tendrá unasola propiedad (realmente un campo público) llama-da Importe, y que será del tipo Decimal. La declara-ción de esta estructura y el método ToString que nospermita darle formato será tal como se muestra en elfuente 1.

Para usar los formatos proporcionados por estaestructura, podemos hacerlo de la misma forma queharíamos con un tipo de datos Decimal. De hecho sólopermitirá las mismas cadenas de formato que el tiposubyacente. En el fuente 2 tenemos un par de ejem-plos de cómo usar los formatos de nuestra estructura.

Por supuesto, si pretendemos usar un formato nopermitido por el tipo Decimal, obtendremos una excep-ción indicándonos que el formato no es válido, talcomo ocurriría al intentar mostrarlo en formato hexa-decimal (usando “x”).

Definir nuestras propias cadenas de formato

Si por cualquier razón se nos ocurre que sería inte-resante crear un nuevo formato para nuestra estruc-tura o dar una funcionalidad distinta a los ya existen-tes, e incluso redefinir o permitir usar algunos no váli-dos (como el que permite mostrarlo en hexadecimal),simplemente tendríamos que añadir el código corres-pondiente y asunto arreglado.

Para no alargar el artículo, y debido a que segui-damente vamos a definir nuestros propios formatos,en los proyectos formatos3VB y formatos3CS del códi-go que acompaña al artículo puede ver un ejemplotanto en Visual Basic como en C#.

Fuente 1. La estructura Moneda

Public Structure MonedaPublic Importe As Decimal‘Public Overloads Function ToString(format As String) As String

Return Importe.ToString(format)End Function

End Structure

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Fuente 2. Uso de la estructura Moneda del fuente 1

Dim m1 As Monedam1.Importe = 1500.523D‘Console.WriteLine(m1.ToString(“f”))Console.WriteLine(m1.ToString(“#,###.##”))

Page 28: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

28

dnm.plataforma.net<<

Pero aunque hayamos definido nuestra propiasobrecarga del método ToString para que acepte unacadena en la que podamos indicar el formato, no siem-pre va a funcionar como esperamos. Aclaremos estoúltimo: tal como hemos visto en el fuente 2, podemosusar ToString con el método Write (o WriteLine) de laclase Console, pero tanto esos métodos de la clase Consolecomo el método Format de la clase String o el méto-do AppendFormat de la clase StringBuilder, permitenque usemos una variable de nuestro tipo e incluso per-miten que podamos indicar formatos especiales paraaplicar a nuestros tipos, de tal forma que podamoscomponer una cadena en la que se incluirá el conte-nido de la variable usando diferentes representacio-nes. Sí, mejor verlo con un ejemplo. En el fuente 3tenemos varias formas de usar los métodos que hemoscomentado utilizando diferentes formatos.

En el código del fuente 3 hemos usado una varia-ble de tipo entero y como ocurre con el resto de lostipos incluidos en la librería de clases de .NET, elmétodo ToString está implementado completamen-te, o mejor dicho, tiene todas las posibilidades deimplementación del método ToString. Y en esta oca-sión aún no estamos hablando de formatos especia-les como ocurre cuando usamos, por ejemplo, {0,11:N}, sino de algo tan simple como el métodoToString sin parámetros. Esta sería, o debería ser, unade las primeras cosas que tendríamos que hacer ennuestros propios tipos, ya que si no lo hacemos, nospodemos encontrar con algo inesperado al usar, porejemplo, algo tan simple como una variable del tipoMoneda (definido en el fuente 1) con el métodoWriteLine de la clase Console: Console.WriteLine(m1).Lo que este código mostrará no es el contenido (ovalor) de la variable m1, sino el nombre completo dela estructura Moneda, (que incluye el espacio de nom-bres y el nombre del tipo).

¿Qué es lo que ocurre aquí?Lo que ocurre es queel runtime de .NET, cuando no sabe cómo obteneruna representación de un tipo, llama al métodoToString y si no está redefinido usará la implementa-

ción de la clase base de todos los tipos de .NET:Object, y esa implementación simplemente devuelveel nombre completo de la clase. Por tanto, lo prime-ro que deberíamos hacer al crear nuestras clases esredefinir el método ToString para que devuelva algo“coherente” con el valor que almacena. En nuestroejemplo del tipo Moneda, podríamos definirlo para quesimplemente devuelva el valor de la propiedadImporte, tal como podemos ver en el fuente 4.

De esta forma nos aseguramos de que cuandoalguien quiera obtener una cadena de una variabledel tipo Moneda, realmente obtenga algo “válido”; eneste caso el contenido de la propiedad Importe.

Ahora veamos que es lo que habría que hacer parapoder dar soporte al resto de formatos que hemosusado en el fuente 3 e incluso cómo podemos defi-nir los nuestros propios para que se puedan usar den-tro de las llaves en las cadenas usadas en los métodosque permiten formatos especiales.

Definir formatos especiales para nues-tros tipos

De igual forma que .NET utiliza el métodoToString sin parámetros cuando no se indica quémétodo usar de una clase, al menos en los casos enlos que se deben usar como cadenas, los métodosWrite/WriteLine de la clase Console o los métodosFormat y AppendFormat de las clases String yStringBuilder respectivamente cuando se usa un mar-cador de formato (el número entre las llaves) en el

Fuente 3. Ejemplos de formatos en algunos métodos de las clases de .NET

Dim i As Integer = 1500Console.WriteLine(“{0}”, i)Console.WriteLine(“{0:N}”, i)Console.WriteLine(“{0,10}”, i)

Dim sb As New System.Text.StringBuildersb.AppendFormat(“El valor de i es ‘{0,12}’”, i)sb.AppendFormat(“{0,11:N}”, i)

Dim s As String = sb.ToString()s &= String.Format(“El valor de i es {0}”, i)Console.WriteLine(s)

Fuente 4. La declaración del método ToString del tipo Moneda

Public Overloads Overrides Function ToString() As StringReturn Importe.ToString()

End Function

Page 29: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

que se indica un formato especial, como sería el casoal usar {0, 11:N}, en estos casos también se llama almétodo ToString, pero a una versión especial: el defi-nido en la interfaz IFormattable.

La interfaz IFormattable sólo tiene un método:ToString, el cual recibe dos parámetros (o argumen-tos), el primero indica una cadena con el formato aaplicar y el segundo será un objeto con el proveedordel formato, el cual en la mayoría de los casos podre-mos obviar.

La cadena que indica el formato será parecida ala usada en la versión simple, la que sólo recibe unargumento. Es más, podemos imple-mentar este método ToString para queinternamente llame al métodoToString del tipo usado para almace-nar el valor de nuestro tipo. En elfuente 5 podemos ver la definiciónsimple de nuestro tipo en el quehemos implementado la interfazIFormattable.

Debemos fijarnos que realmenteno hemos hecho nada especial, sim-plemente indicarle al .NET que aho-ra nuestra clase implementa el méto-do ToString definido en la interfazIFormattable y que puede usarlo cadavez que un método necesite accedera dicha implementación, pero esto essuficiente para que se puedan usartodos los formatos permitidos, ennuestro caso por el tipo Decimal,incluso el que indica la longitud o elnúmero de posiciones que debe ocu-par en la cadena, que es el valornumérico separado con una coma delmarcador de posición, ya que ese

comportamiento es algo “innato” de esos métodosformateadores, realmente el parámetro format delmétodo ToString hace referencia al que se indica des-pués de los dos puntos.

Tal como hemos definido la implementación deToString de la interfaz IFormattable, usaríamos sola-mente los formatos permitidos por el tipo Decimal,pero si queremos definir otros formatos, tendremosque escribir el código que lo interprete y que devuel-va lo que nos interese devolver. Esto es útil sobre todopara tipos de datos cuyo contenido interno no es tanobvio como el de un valor numérico, por ejemplo quetengamos una clase Empleado en la que nos interesa-ría usar formatos diferentes para mostrar los distintosvalores que dicha clase pueda almacenar, pero paraseguir con la simplicidad, veamos cómo definir algu-nos formatos especiales e incluso, como ya comenta-mos, redefinir algunos ya existentes o no válidos parael tipo usado internamente para almacenar el valor delimporte de nuestra estructura Moneda. En el fuente 6tenemos la definición de los dos métodos ToString quereciben algún parámetro.

Como recomendación final, decir que sólo debe-ríamos implementar los métodos “formateadores” ennuestras clases o tipos cuando realmente tenga algúnsentido, ya que no siempre los usuarios de nuestrostipos los usarán para darles formatos especiales. Elmétodo que siempre deberíamos definir es el méto-do ToString sin parámetros, ya que ese método tienemás usabilidad y en muchos casos nuestros usuariosquerrán tener una representación imprimible del con-tenido de nuestro tipo.

dotN

etM

anía

<<

29

dnm.plataforma.net<<

Fuente 5. El tipo Moneda con las tres versiones de ToString

Public Structure MonedaImplements IFormattable‘Public Importe As Decimal‘Public Overloads Overrides Function ToString() As String

Return Importe.ToString()End FunctionPublic Overloads Function ToString(format As String) As String

Return Importe.ToString(format)End FunctionPublic Overloads Function ToString( _

ByVal format As String, _ByVal formatProvider As System.IFormatProvider) As String _

Implements System.IFormattable.ToStringReturn Me.ToString(format)

End FunctionEnd Structure

Fuente 6. Los métodos ToString con parámetros del tipo Moneda

Public Overloads Function ToString(ByVal format As String) As StringReturn Me.ToString(format, Nothing)

End Function‘Public Overloads Function ToString( _

ByVal format As String, _ByVal formatProvider As System.IFormatProvider) As String _

Implements System.IFormattable.ToStringIf format Is Nothing OrElse format = “” Then

Return Me.ToString()End IfSelect Case format.ToLower()

Case “i”Return Decimal.Truncate(Importe).ToString()

Case “if”Return Decimal.Truncate(Importe).ToString(“#,###”)

Case “f”, “m”Return Importe.ToString(“#,###.####”)

Case “d”Return Importe.ToString(“#.####”)

Case “x”Return CLng(Importe).ToString(“x”)

Case ElseReturn Importe.ToString(format)

End SelectEnd Function

Page 30: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Copia, corta y pega en ensamblados .NET¿Hasta dónde se puede llegar con la reflexión en el próximo .NET Framework 2.0?

<<

<<

Por Erick Bacallao, Miguel Katriby Yoelvis Parodi (Grupo Weboo )Universidad de La Habana

Con los recursos de reflexión del.NET Framework 1.1 podemos ins-peccionar un ensamblado y creardinámicamente uno nuevo que“mimetice” los tipos y métodos deloriginal. Sin embargo, no podemoscopiar código IL de un ensambladoexistente hacia otro que estemoscreando. Cualquier intento de usaren el nuevo ensamblado funcionali-dades de otro ensamblado, implicaemitir un código que use recursosdel original y por tanto exigir queuna aplicación que se desarrolle conel nuevo ensamblado tenga que dis-poner también del original. Este esun patrón muy común cuando secrean tipos proxy que van a hacerde intermediarios entre el códigocliente y el código de un tipo ser-vidor. El código de la nueva aplica-ción va a facilitarse el trabajo usan-do el ensamblado del proxy, perotiene que cargar también con elotro ensamblado porque el proxyhace referencia a éste.

¿Podemos aspirar a formar un nuevoensamblado “copiando” y “pegando”código extraído de un ensambladopara luego prescindir de éste? En esteartículo veremos cuáles recursosaportará el .NET Framework 2.0 quepueden ayudarnos a extraer el códi-go IL de un método y copiarlo haciaotro método.Se muestra un ejemploque ilustra bajo cuáles condiciones sepodría “clonar” un ensamblado cre-ando uno igual con la misma funcio-nalidad (los mismos tipos y métodos)pero en el que se pueden haber cam-biado los nombres originales.

¿Se puede lograr un tal efecto decopia y pega más general y ambi-cioso? Veremos en este trabajo cuá-les son las limitaciones para esto;en un próximo artículo se propon-drá una biblioteca para facilitar esta“edición de ensamblados” y se mos-trará una herramienta (IL-LEGO)desarrollada para realizar visual-mente esta edición.

Page 31: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

¿Qué puedo hacer con .NETFramework 1.1?

La expresividad y generalidad delcódigo intermedio (IL), el concepto deensamblado (assembly), los metadatosincluidos en el propio ensamblado paradescribir a éste, y las facilidades parahacer introspección o reflexión (reflec-tion) de la información contenida enun ensamblado (a través del System.Re-flection), junto a la capacidad de emi-sión de código IL (a través delSystem.Reflection.Emit), nos permi-ten afirmar que .NET es una plata-

forma que nosofrece, mejor queninguna otra has-ta ahora, la capa-cidad de haceringeniería inversadel código gene-

rado por los com-piladores.

U nescena-rio don-

de sonmuy útiles

estas capacida-des de inspeccio-

nar un ensamblado,y emitir uno nuevobasándose en el ori-ginal, es en la gene-ración de proxies.Como sabemos un

proxy es un

intermediario omediador entre un códi-

go cliente y un código servidor. Losobjetivos del mediador pueden servarios: dar una cara (interfaz) más ami-gable o fácil de usar al código clienteque la que puede dar el servidor, ocul-tar al cliente funcionalidades que ésteno necesita usar del servidor, preproce-sar la información que envía el códigocliente antes de invocar las funcionali-dades del servidor, liberando por tantoal código cliente de este tipo de traba-jo y adaptando con ello funcionalidades

existentes en el servidor para que pue-dan ser utilizadas por el cliente.

En dos artículos previos endotNetManía [1][2] tratamos temas rela-cionados con la generación dinámica deun tipo que sirviese de proxy, en ambostrabajos el tipo proxy se emite hacia unnuevo ensamblado que mantiene unareferencia al original. ¿Pudiéramos gene-rar un ensamblado que no mantuviesedependencias del original? Para ellohabría que tener la posibilidad de copiarel código IL del ensamblado inspeccio-nado hacia el nuevo ensamblado que seestá creando. Los recursos delSystem.Reflection en el .NET Frame-work 1.1 nos permiten extraer de unensamblado objetos de los tipos Type,MethodInfo, ParameterInfo, etc, y con elloinspeccionar el ensamblado. Sin embar-go, no nos ofrece ningún tipo de facili-dades para extraer, vía programación, elcódigo IL de un método, luego si no sepuede ni extraer ¿cómo vamos a preten-der copiarlo hacia otro?

Podría ser de gran utilidad disponerde alguna infraestructura y herramien-ta para hacer algo como “copia”, “edi-ta”, y “pega” de partes de un ensambla-do hacia otro. Esto podría aplicarse envariados escenarios como los que lista-mos a continuación (principalmentecuando no se dispusiese directamentedel código fuente que dio lugar alensamblado original):

• Crear un nuevo ensamblado igualal original pero en el que se hancambiado los nombres de deter-minados recursos visibles al códi-go cliente: por ejemplo tipos ymétodos.

• Crear un ensamblado con los mis-mos tipos del original pero qui-tando o añadiendo nuevos méto-dos a un tipo.

• Lograr un nuevo ensamblado quenos dé el efecto de haber inyecta-do funcionalidad a uno ya exis-tente. Por ejemplo añadiendocódigo para ejecutar antes de unmétodo o para ejecutar despuésde un método.

• Obtener un nuevo ensambladodonde se ha cambiado la visibilidad

a algunos de sus miembros (porejemplo, de privado a público)

En los escenarios anteriores el nue-vo ensamblado podría sustituir al origi-nal, es decir hacer las veces de interme-diario pero sin requerir la presencia deéste ya que tendría dentro el código quenecesita.

El ILDSAM.NET ofrece una herramienta para

inspeccionar los ensamblados: ILDASM(Intermediate Language Disassembler) ysu complemento ILASM (IL Assembler).El ILDASM toma un ensamblado ymuestra su contenido a través de unainterfaz gráfica amigable que nos posi-bilita navegar arbóreamente por losmiembros del ensamblado. La figura 1nos muestra la aplicación del ILDSAMal ensamblado que contiene la claseMathematics siguiente:

class Mathematics{public static bool IsEven(int k){return ((k%2)==0);

}public static int Factorial(int k){if (k==0) return 1;else return k*Factorial(k-1);

}public static float Square(float x){return x*x;

}}

dotN

etM

anía

<<

31

Figura 1. ILDSAM Aplicado a laclase Mathematics

Fuente 1

Page 32: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

32

dnm.plataforma.net<<

Si en el árbol de la figura 1 se hace doble clic sobrela hoja de un método se muestra el código IL corres-pondiente a éste. La figura 2 muestra el código IL delmétodo Square.

Esto está MUY bien, gracias a ello los más curio-sos pueden a través del ILDASM llegar hasta las tri-pas de un ensamblado1. Pero SÓLO para ver y NOpara “tocar” ni “copiar”.

Si se quiere escribir algún código que haga uso dela información que es capaz de mostrar el ILDASMhabría que recurrir a la vieja técnica del “vaciado decódigo”. Es decir, salvar el resultado del ILDASM enun archivo texto (por ejemplo invocando al ILDASMdesde la línea de comandos ildasm Mathematics.dll/out: Mathematics.il.txt) para que después nuestrocódigo "bucee" por su cuenta en dicho texto y enton-ces hacer cualquier copia, modificación o composi-ción a riesgo, posiblemente generando otro texto queluego debe ensamblarse con el ILASM2.

Hacer modificaciones útiles en el texto corres-pondiente al código IL, para luego compilarlo es, ade-más de laborioso, complicado. Lamentablemente nohay ningún espacio de nombres (name space) para ello,ni ninguna herramienta integrada a Visual Studio quenos ayude.

Por otra parte, en el System.Reflection del.NET Framework 1.1 no hay ningún tipo ni méto-do que nos ayude a extraer el código IL de un méto-do. La funcionalidad existente nos permite extraerla información de un ensamblado para obtener lostipos, los atributos, las signaturas de los métodos,etc. Pero no hay nada para sacar el código IL delcuerpo del método.

Además del ILDSAM hay algunas aplicaciones,que están disponibles en la red, para extraer infor-mación de un ensamblado, ejemplos de ellas sonAnakrino3 y Reflector4. Éstas extraen la informacióndel código IL y nos muestran el equivalente a ésteen un lenguaje de alto nivel (C#, VB, Delphi en elcaso de Reflector y C++, C# en el caso de Anakrino) con bastante fidelidad al código fuente que pudie-ra haber sido el origen del tal ensamblado. Sin embar-go, estas aplicaciones no están orientadas a nuestropropósito de ofrecer recursos para facilitar la edi-ción de un ensamblado, es decir, facilitar la creaciónde un nuevo ensamblado que incluya funcionalida-des de uno ya existente.

¿Qué nos trae nuevo la reflexión en .NETFramework 2.0?

.NET Framework 2.0 nos trae nuevos recursos enSystem.Reflection. En especial recursos para traba-jar con la genericidad. A diferencia de otros lengua-jes y tecnologías anteriores, la genericidad en .NETFramework 2.0 está integrada, no sólo a los lengua-jes fuentes, sino también a la propia plataforma y que-da expresada a nivel del ensamblado, del que puedeser analizada con la reflexión. Sin embargo, el temade la genericidad se sale de los objetivos de este tra-bajo5. Lo que nos interesa ahora son aquellos recur-sos que vienen en el .NET Framework 2.0 y quepodrán ayudarnos en nuestro propósito de trajinarcon el código IL.

En el espacio de nombres System.Reflection del.NET Framework 2.0 viene un nuevo tipo: MethodBody.A un objeto de tipo MethodInfo se le puede aplicar aho-ra el método GetMethodBody() y éste devuelve un obje-to de tipo MethodBody. Luego a un objeto de tipo

Figura 2. Código IL del método Square

NOTA

Recuerde la máxima (que no acaban de interiorizaralgunos fundamentalistas del Open Source): Siempre quepara hacer cambios el programador tenga que metersedentro de un texto fuente (en este caso el texto del códi-go IL) tiene libertad entonces para hacer los cambios quequiera pero también para hacer los que no debiera. ][

1 ¿Y qué dicen los defensores del Open Source? Ver, a través del ILDSAM, el código IL de un ensamblado correspondiente a un código fuente bienprogramado, puede ser tan legible o más, que ver directamente el fuente de un críptico y mañoso programa en C.

2 Se debe aclarar que si se aplica esta técnica para hacer modificaciones en ensamblados firmados, entonces habría que incluirle una modificaciónextra al código IL obtenido para eliminar la información referente a la firma digital.

3 http://www.saurik.com/net/exemplar4 http://www.aisto.com/roeder/dotnet5 Y de seguro será tratado en futuros artículos de dotNetManía.

Page 33: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

33

dnm.plataforma.net<<

MethodBody se le puede aplicar el méto-do GetILAsByteArray(), y éste nosdevuelve el código IL del cuerpo delmétodo (aunque como un simple y cru-do array de bytes).

Muy bien, si tenemos los bytes delcódigo de un método entonces hemosllegado a las tripas del código, pero, ¿quépodemos hacer ahora con esto?

Supongamos que a partir de unensamblado Utils.dll, que contiene eltipo Mathematics visto anteriormente,queremos generar uno nuevo de nom-bre Utilidades.dll y que contenga untipo análogo a Mathematics pero cam-biando los nombres respectivamente porMatemática, Factorial, EsPar yElevaAlCuadrado.

El fuente 2 nos muestra un extrac-to del código que nos permitiría “clo-nar” un ensamblado generando unonuevo que tiene los mismos tipos ymétodos (e implementación de losmétodos) pero tal vez con nuevosnombres. El método Clone del fuente2 recibe como parámetro un diccio-nario en el cual se indican los cambiosde nombre (aquellos que no aparez-can en el diccionario mantendrán sunombre original). Por razones de sim-plicidad este código no incluye ahorael tratamiento de clases internas, dele-gados, estructuras y enumeradores,para los cuales habría que hacer algosimilar.

Debemos notar que este código nofunciona como desearíamos si unmiembro del ensamblado usa un tipoque se encuentra dentro del propioensamblado que estamos creando.Esto se debe a que en las definicionesde miembros donde usamos tiposbases, interfaces, tipos de variables,tipos de parámetros y tipos de retor-no se hace referencia a los mismostipos que los correspondientes miem-bros (antes de la edición) se referían.Sin embargo, estos tipos pueden serde los nuevos que precisamente seestán editando (a través delTypeBuilder) hacia el nuevo ensam-blado. Esto no es problema en el ejem-plo del ensamblado Utils porque lostipos que se usan son de los predefi-nidos. Incluir la solución completaaquí haría muy extenso el fuente 26.

public static void Clone(Hashtable dicc){Assembly asmSource = Assembly.LoadFrom("...nombre del ensamblado original...");AssemblyName asmName = new AssemblyName("...nuevo nombre de ensamblado...");AssemblyBuilder assemblyBuilder =

AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Save);ModuleBuilder moduleBuilder =

assemblyBuilder.DefineDynamicModule("Utilidades.dll", "Utilidades.dll");

//Copiar los tiposforeach (Type t in asmSource.GetTypes()){string newTypeName = dicc[t.Name] == null ?

t.FullName : t.Namespace + "." + (string)dicc[t.Name];TypeBuilder typeBuilder = moduleBuilder.DefineType(newTypeName, t.Attributes,

t.BaseType, t.GetInterfaces());

//Copiar los miembros de cada tipoforeach (MemberInfo mInfo in

t.GetMembers( BindingFlags.DeclaredOnly | BindingFlags.CreateInstance|BindingFlags.Instance| BindingFlags.NonPublic |BindingFlags.Public | BindingFlags.Static) )

{//Copiar las variablesif (mInfo is FieldInfo){FieldInfo f = (FieldInfo) mInfo;string newFieldName = dicc[f.Name] == null ? f.Name : (string)dicc[f.Name];typeBuilder.DefineField(newFieldName, f.FieldType, f.Attributes);

}//Copiar los constructoreselse if (mInfo is ConstructorInfo){ConstructorInfo cInfo = (ConstructorInfo) mInfo;ConstructorBuilder cBuilder = typeBuilder.DefineConstructor(cInfo.Attributes,

cInfo.CallingConvention,ParameterType(cInfo.GetParameters()));ILGenerator iLGen = cBuilder.GetILGenerator();iLGen.Emit(OpCodes.Ldarg_0);iLGen.Emit(OpCodes.Call, typeof(object).GetConstructor(new Type[]{}));iLGen.Emit(OpCodes.Ret);

}//Copiar los métodoselse if (mInfo is MethodInfo){MethodInfo m = (MethodInfo) mInfo;string newMethodName = dicc[m.Name] == null ? m.Name : (string)dicc[m.Name];MethodBuilder mBuilder =

typeBuilder.DefineMethod( newMethodName, m.Attributes, m.CallingConvention,m.ReturnType, ParameterType(m.GetParameters()));

MethodBody mBody = m.GetMethodBody();byte[] ILByteArray = mBody.GetILAsByteArray();

//Emitir el mismo array de bytesmBuilder.CreateMethodBody(ILByteArray, ILByteArray.Length);}else ...}typeBuilder.CreateType();//Concluye la emisión de un tipo

}moduleBuilder.CreateGlobalFunctions();//Concluye la emisión del móduloassemblyBuilder.Save("Utilidades.dll");

}

private static Type[] ParameterType(ParameterInfo[] pInfo){Type[] t = new Type[pInfo.Length];for (int i = 0; i < pInfo.Length; i++)t[i] = pInfo[i].ParameterType;

return t;}

Fuente 2

6 Sin embargo, esto sí estará incluido en la herramienta en desarrollo que se pondrá mas adelante a disposición de los lectores de dotNetManía.

Page 34: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

34

dnm.plataforma.net<<

Note las dos instrucciones siguien-tes dentro del código del fuente 2:

MethodBody mBody = m.GetMethodBody();byte[] ILByteArray =

mBody.GetILAsByteArray();

Se está usando aquí el tipo MethodBodyy el nuevo método GetILAsByteArray()que nos permite extraer el código delmétodo. De este modo cuando luego sehace:

mBuilder.CreateMethodBody(ILByteArray, ILByteArray.Length);

Lo que ocurre es una copia “bruta”del array de bytes hacia el nuevo méto-do que se está generando.

Decimos copia “bruta” porque elmétodo CreateMethodBody no hace nin-guna comprobación de si el métodoresultante servirá realmente como unduplicado del original. Esto queda a ries-go del programador. La herramientaPEVerify (incluida en el .NETFramework SDK) comprueba que unensamblado sea consistente y correctodesde el punto de la ejecución y seguri-dad del código, pero claro que no nospuede servir para garantizar que elensamblado generado tenga las trans-formaciones que quisimos hacer del ori-ginal, ni nos facilita el hacer tales trans-formaciones.

Para un caso simple, como el delejemplo del tipo Mathematics, la copiaanterior dará el resultado deseado, peromás adelante analizaremos las limita-ciones de lo que hicimos en el códigodel fuente 2 que nos impiden afirmarque esto vale de modo general.

Contexto de sólo reflexión

Otra nueva característica muy atracti-va vendrá incluida en el .NET Framework2.0, ésta es la denominada Contexto de sóloreflexión (ReflectionOnly context).

Con este nuevo recurso si se cargaun ensamblado por medio de:

Assembly asm = Assembly.ReflectionOnlyLoad("Utils.dll");

No será posible realizar las funcio-nalidades más activas asociadas a la refle-xión (note el prefijo ReflectionOnly en

el nombre del método). Es decir, nopodemos hacer acciones que intentanejecutar funcionalidades de lo inspec-cionado, como crear instancias de lostipos extraídos o evaluar un MethodInfopor mediación de un Invoke, ni obtenerel valor de una variable de un objeto yainstanciado.

En muchos casos cuando acudimosa la reflexión lo que se desea es sola-mente inspeccionar un ensamblado (esoes lo que hace, por ejemplo, el propioVisual Studio) pero no se pretende eje-cutar funcionalidades del ensamblado.

Con esta distinción en la reflexión,parece que el CLR podrá ejecutar máseficientemente. Aunque de momentoen la documentación de MSDN no seexplica en qué se basa esto, puede serque se deba a que se libera al CLR deverificaciones innecesarias si éste sabeque la información extraída no se va aejecutar. Se obvian, por ejemplo, las

verificaciones de nombrado fuerte(strong name) y los chequeos de la polí-tica de seguridad de acceso a código(CAS)7.

Como en el caso que nos ocupa novamos a hacer ninguna ejecución de loinspeccionado, sino que sólo vamos agenerar IL a partir de ello, podemossuponer que el código del fuente 2 eje-cutaría de modo más eficiente si lomodificamos para que trabaje en esteContexto de Sólo Reflexión.

¿Podemos copiar cualquiermétodo simplemente pasan-do los bytes del código IL deun ensamblado hacia otro?

La descripción de los miembros quese encuentran declarados en un ensam-blado, o que son referenciados por éste,se encuentra en los metadatos del pro-pio ensamblado. Estos metadatos estánestructurados en tablas.

Cuando en el código IL del cuerpode un método (el cual es recuperadocomo array de bytes a través delMethodBody) se hace referencia a otromiembro de un tipo, esta referencia apa-rece en el código IL como un token. Estetoken no es más que un número enteroque indica la posición de un registro den-tro de una de las tablas de los metadatos.La tabla 1 ilustra la tabla con los regis-tros de los métodos del ensamblado enel que está el tipo Mathematics.

Clonar un método como IsEven ocomo Square (cuyo código IL se mues-tra en la figura 2) no tiene mayor difi-cultad porque en el array de bytes extra-ído del MethodBody no hay ninguna refe-rencia a ningún otro miembro. En estecaso, si el array de bytes se copia haciael nuevo método, mantiene, a los efec-tos del CLR, su mismo significado.

Sin embargo, note que el métodoFactorial es recursivo y contiene unallamada a él mismo (ver figura 3):

Tabla1

NAME FLAGS IMPLFLAGS RVA(Relative Virtual Address)

IsEven [Public][Static][HideBySig][ReuseSlot]

[IL] [Managed] 0x00002050

Factorial [Public][Static][HideBySig][ReuseSlot]

[IL] [Managed] 0x00002058

Square [Public][Static][HideBySig][ReuseSlot

[IL] [Managed] 0x000020691

.ctor [Public][HideBySig][ReuseSlot][SpecialName][RTSpecialName][.ctor]

[IL] [Managed] 0x0000206e

7 http://blogs.msdn.com/junfeng/archive/2004/08/24/219691.aspx

Page 35: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

IL_0009: call int32 ILLego.Mathematics::Factorial(int32)

Se pudiera pensar que el hecho decopiar ciegamente el array de bytes nofuncionaría porque el nombreMathematics ya no existe en el nuevoensamblado, ha sido cambiado porMatemática. Pero lo que mostramos enla figura 3 es la información que sim-bólicamente nos reproduce el ILDASM.Lo que verdaderamente está en el arrayde bytes del método original es una lla-mada en la forma:

IL_009: call 2

Aquí el número 2 lo que indica esque se quiere llamar al método de lasegunda entrada de la tabla de métodosen los metadatos, que es en este casoFactorial.

Esto implica que hay que garantizar,para que las referencias a miembros den-tro del código se mantengan consisten-tes, que la emisión de tipos, y sus méto-dos, hacia el nuevo ensamblado se debehacer en el mismo orden en que estánen el ensamblado original. Felizmenteel mecanismo del System.Reflection nosofrece los miembros en el mismo ordenen que aparecen en las tablas de meta-datos, por lo que la ejecución del códi-go del fuente 2 nos produce el efectodeseado.

Si hacia el ensamblado que estamosgenerando hubiésemos emitido prime-ro el código de Factorial y luego el deSquare, entonces al copiar los bytescorrespondientes a la instrucciónIL_009: call 2 (que está dentro delcuerpo del Factorial original) la llama-da dentro del código de Factorial en el

nuevo ensamblado quedaría como unallamada a Square. ¿Qué pasaría enton-ces? ¿Una hecatombe en ejecución?Felizmente no, porque cuando el CLRintente, en una aplicación, cargar estenuevo ensamblado, reportará un errorpor incompatibilidad en la firma de losmétodos (el CLR detecta que hay unallamada a un método 2, que según suregistro en la tabla de metadatos tieneun parámetro de tipo float, cuandorealmente lo que se le va a pasar es unint). Sin embargo, el lector puede ima-ginar, que si los métodos tuviesen igualfirma, el CLR no puede adivinar loserrores que usted, al generar el ensam-blado, ha cometido si alteró el orden.El nuevo ensamblado podrá ser consis-tente y correcto pero no tendría la fun-cionalidad que se pretendía.

Una tal dislocación de los métodosen la tabla de metadatos, en correspon-dencia con las referencias que aparecena los mismos en el código IL, podríaocurrir si queremos que en el nuevoensamblado no aparezcan algunos méto-dos que sí están el original o si quere-mos añadir nuevos métodos. Por razo-nes de espacio la solución para esto nose verá ahora aquí y se dejará para unpróximo artículo.

¿Y la clonación de constructores?

En el modelo de herencia de .NET,todo constructor debe invocar al cons-tructor correspondiente en la clase base(recuerde que en caso de no tener defi-nida explícitamente tal clase base enton-ces se considera que es Object). Por lotanto, algún tipo base, en la jerarquía deherencia del tipo que estemos querien-

do clonar, estará en un ensambladoexterno (porque en el caso extremo esta-rá Object que está en mscorlib.dll). Poreste motivo en todo ensamblado quegeneremos, y que tenga tipos definidospor clases, siempre tendrá que haber unareferencia externa (al menos al cons-tructor de Object).

Estas referencias externas son colo-cadas en el ensamblado que se esté emi-tiendo cuando, usando a través de unobjeto de tipo ConstructorBuilder, seemite el código con el siguiente extrac-to de código (fuente 2):

ILGenerator iLGen = cBuilder.GetILGenerator();iLGen.Emit(OpCodes.Ldarg_0);iLGen.Emit(OpCodes.Call,typeof(object).GetConstructor(new Type[]{}));iLGen.Emit(OpCodes.Ret);

En este caso el método Emit cuandoemite un OpCodes.Call (tercera línea delextracto de código anterior) comprue-ba si lo que se va a emitir es una llama-da a un método (constructor en estecaso) que está en un ensamblado exter-no, y en tal caso coloca en la tabla demetadatos la referencia a dicho ensam-blado y miembro externo.

Por lo tanto la copia de constructo-res no puede resolverse copiando sim-plemente el array de bytes de un cons-tructor hacia otro, porque, quién pon-dría entonces esta referencia en losmetadatos. De hecho (y tal vez por ello)no hay en ConstructorBuilder un equi-valente al CreateMethodBody (como sí lohay en MethodBuilder) que es el méto-do que se usa para poder emitir el arrayde bytes.

Cómo facilitar esta copia de losconstructores se dejará para un próxi-mo artículo. Sin embargo, para uncaso simple, como el de esta claseMathematics, que sólo tiene el cons-tructor por defecto, basta con emitirel código para aplicar este construc-tor de Object. Esto es lo que hace elextracto de código anterior (que esparte del fuente 2). El código que seemitirá es entonces:

// Poner en la pila una referencia a this.ldarg.0

//Llamada al constructor de objectCall instance void

[mscorlib]System.Object::.ctor()Ret

dotN

etM

anía

<<

35

dnm.plataforma.net<<

Figura 3. Código IL del método Factorial

Page 36: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

36

dnm.plataforma.net<<

Esto es suficiente para el caso de la claseMathematics ya que ésta no hereda de nadie salvo deObject. No hubo aquí necesidad de copiar el array debytes del constructor (lo que de hecho no hubiese ser-vido como ya explicamos).

Clases estáticas

Una clase como ésta del ejemplo Mathematics esuna clase de la que no nos interesa crear instancias.El nuevo .NET Framework 2.0 trae también el con-cepto de clase estática. Una clase estática (en C# se indi-cará precediendo la definición de la clase con la pala-bra static) es una clase que sólo tiene métodos y varia-bles estáticas. Por tanto no tiene constructores, ni estáobligado a tener un constructor por defecto que loque haga sea llamar al constructor de Object. El códi-go del fuente 2 podría modificarse para tener en cuen-ta tal tipo de clases.

¿Y si el método tiene variables locales?

En la copia de los métodos de Mathematics no tuvi-mos problemas porque estos métodos no tienen varia-bles locales. Si un método tiene variables locales,entonces, para que la copia del array de bytes tengautilidad, habría también que haber generado las varia-bles locales en el método correspondiente del nuevoensamblado. ¿Pero cómo nos enteramos de cuáles sonestas variables locales?

Según MSDN Online8 la clase MethodBody del.NET Framework 2.0 tiene la propiedadLocalVariables, que nos daría las variables localesdel método. Sin embargo, en la versión Beta 1 deVisual Studio 20059 ésta no aparece aún. En casoque se incluya en la versión final (lo cual es lo espe-rado), entonces, una vez que podamos conocer lasvariables locales, las podríamos reproducir en elnuevo método a través del ILGenerator.

Conclusiones y trabajos futurosEn este artículo hemos ilustrado algunas de las bon-

dades del nuevo .NET Framework 2.0 en cuanto a lareflexión. Con el MethodBody y el GetILAsByteArray ten-dremos acceso a las interioridades de un método, perocon la responsabilidad de que lo que hagamos despuéscon ello, correrá a nuestra cuenta.

Hemos ilustrado cómo estos recursos se pueden apro-vechar para generar nuevos ensamblados copiando códi-go de un ensamblado hacia uno nuevo. De este modoun nuevo ensamblado puede reproducir funcionalida-des de uno ya existente. Vimos el ejemplo de cómo cam-biarle los nombres a funcionalidades sin que en el ensam-blado final quede dependencia del original.

También hemos analizado algunas de las insuficien-cias de esta nueva oferta. Se explicó en cuáles limitadassituaciones esta copia ciega de código es correcta. Si porejemplo queremos algo tan simple como despejar deobsolescencias un ensamblado, generando un nuevoensamblado con los métodos del otro, pero sin incluiraquellos que ya no nos interesan, habría que garantizarque en el nuevo código las referencias a los recursos seancorrectas con respecto a la posición de éstos en la tablade metadatos.

Otro escenario aún más complicado, sería si quere-mos inyectar pedazos de código en algunos métodos.Un patrón interesante de esta inyección es el de inter-calar código que se quiere ejecutar antes que el métodoo que se quiere ejecutar después del método. Tal inyec-ción de código puede significar que haya que cambiar,en la parte del código que se copia del original, algunasreferencias que puedan existir porque al intercalar códi-go éstas pueden haberse desplazado de lugar.

Si lo único que podemos hacer es trabajar cruda-mente sobre la secuencia de bytes que recuperamosvía el MethodBody entonces todo lo que hemos dichoen los párrafos anteriores sería complejo de progra-mar y por supuesto que propenso a errores. En unpróximo trabajo propondremos el espacio de nom-bres Reflection.Editor que nos proporcionará unaforma de más alto nivel para ayudarnos a hacer estaplomería en el código IL, sobre este Reflection.Editorse desarrollará una herramienta IL-LEGO que nosayudará en la edición y composición visual de losensamblados.

Referencias[1] Mario del Valle, Miguel Katrib, El poder de la

reflexión en .NET, dotNetManía No 3, Abril 2004.[2] Miguel Katrib, Yamil Hernández, Aspectos e

intercepción de métodos en .NET o cómo poner la guindasin estropear el merengue, dotNetManía No 10,Diciembre 2004.

.NET es una plataforma que nos ofrece,mejor que ninguna otra hasta ahora,

la capacidad de hacer ingeniería inversa del código generado por los compiladores

8 http://msdn2.microsoft.com/library/System.Reflection.MethodBody.aspx9 La disponible en el momento de escribir este artículo.

Page 37: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

iremos directamente al grano, ya quesupongo que los que habéis leído el artículo ante-rior estaréis deseosos de construir vuestra pri-mera base de datos multidimensional, y poner enpráctica todo aquello que os he contado en el artí-culo anterior.

Comenzaremos abriendo la herramienta quenos permitirá llevar a cabo todo el proceso dedesarrollo, ésta es el Analysis Manager. Una vezabierto, veremos que aparece nuestro servidor,sobre él pulsaremos el botón secundario del ratón,y en el menú que se despliega elegiremos laopción “Nueva base de datos…”, apareciendo unapantalla donde nos pedirá el nombre de dichabase de datos (la llamaremos dotNetMania) y si lodeseamos, podremos indicar una breve descrip-ción.

Es necesario saber que cualquier base de datosmultidimensional debe tener, al menos un origende datos desde el que se obtendrán los datos queluego tendremos disponibles en los diferentesobjetos (cubos, dimensiones, …). En este caso,nuestro origen de datos estará en la misma máqui-na que la base de datos multidimensional (local-host) y apuntará a la base de datos relacional deSQL Server llamada DataWarehouse que vimos enel artículo anterior, aunque podría ser cualquierotro SGDBR (Oracle, DB2, MySQL, …) u otroorigen de datos para el que exista un proveedorOle DB o un driver ODBC.

Para crear este origen de datos, debemos pul-sar el botón secundario del ratón sobre la base de

datos y elegir la opción “Nuevo Origen de datos…” (como podemos ver en la figura 1).

Nos aparecerá la típica pantalla de “Propiedadesde vínculo de datos” que tantas veces hemos utilizadopara conectarnos a orígenes de datos, donde elegire-mos “Microsoft OLE DB Provider for SQL Server”y pulsaremos el botón “siguiente”. En la segunda pan-talla elegiremos el servidor y la base de datos a la quenos queremos conectar, y además debemos pulsar elbotón “Probar conexión” para confirmar que accede-mos correctamente al origen de datos.

Una vez creada la base de datos y el origen dedatos (en este caso sólo tenemos un origen de datos,pero podríamos tener varios, en cuyo caso deberí-amos repetir por cada uno de ellos los pasos ante-riores para su creación), procederemos a la creaciónde las diversas dimensiones compartidas, que podránser utilizadas por los cubos que posteriormente cre-emos en esta base de datos.

SQL Server Analysis Services¡Hola Cubo! (II)

Por Salvador RamosSQL Server MVPHelpDNA.net

En este segundo artículo comenzaremos a implementar paso a paso la base dedatos multidimensional y el cubo de ejemplo expuesto anteriormente.Aquí intro-duciremos, al igual que en el artículo anterior, los conceptos necesarios para faci-litar el seguimiento del artículo.

Sin más preámbulos<<

dotN

etM

anía

<<

37

Figura 1

Page 38: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

En primer lugar vamos a crear la dimensiónCliente, para ello pulsaremos el botón secundario delratón sobre la carpeta “Dimensiones compartidas” yelegiremos la opción “Nueva dimensión” en esta apa-recen dos formas de crear las dimensiones, una esmediante un asistente que es la que utilizaremos, yaque es la más sencilla para iniciarnos, y la otra esmediante el editor de dimensiones.

Nos aparece la ventana del Asistente para dimensionesdonde pulsaremos el botón “Siguiente” en la primerapantalla, ya que es meramente informativa. Y nos apa-recerá otra pantalla en la que debemos decidir el tipo dedimensión que vamos a crear; allí disponemos de cincotipos de dimensiones. Elegiremos “Esquema de estre-lla” que es el que nos permitirá crear una dimensión apartir de una sola tabla relacional.

Seguidamente debemos seleccionar entre las tablasde nuestros orígenes de datos cuál es la que alimen-tará la información que va a manejar dicha dimensión,en este caso se trata de la tabla dwClientes.

Como ya comentamos en el artículo anterior, unadimensión puede constar de varios niveles; en estecaso la dimensión cliente consta de un solo nivel, quees el correspondiente al código del cliente. Debemosmarcarlo y pulsar el botón “>” para que quede selec-cionado como nivel de la dimensión.

A continuación aparece una pantalla en la que seindican las columnas claves del miembro, en este casoserá la única columna que hemos seleccionado, y pul-saremos el botón “Siguiente”. La siguiente pantallahace referencia a una serie de opciones avanzadas quese salen del ámbito de este artículo, por lo que hare-mos clic en el botón “Siguiente” sin hacer ningunavariación de los valores que aparecen.

Finalmente nos pide el nombre de la dimensión,allí escribiremos Cliente, y pulsaremos el botón“Finalizar”.

Pues bien, ya tenemos construida nuestra prime-ra dimensión, en la que hemos realizado todo el pro-ceso mediante un asistente. Ahora nos aparece la pan-talla del editor de dimensiones por si queremos hacercualquier modificación sobre ella.

Lo más habitual es que realicemos ciertos cam-bios sobre las dimensiones creadas. Personalmente nome gusta utilizar como nombres de niveles los nom-bres del campo que utilizo para crearlos. Además enmuchos casos, a parte del campo seleccionado, comoen este caso es el código, nos interesa que el usuariovea otra información. Yo suelo mostrar en cada miem-

dotN

etM

anía

<<

38

dnm.servidores.sql<<

Figura 2

Figura 3

Figura 4

Figura 5

Page 39: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

bro, el nombre o descripción y, entre corchetes, elvalor de la clave. En ciertos casos, también suelo mos-trar los datos ordenados por el nombre, en vez de porla clave, según el orden que sea más cómodo para losusuarios.

Pues bien, procedamos a realizar los cambios cita-dos sobre la dimensión que acabamos de crear. Paraello vamos a modificar en el único nivel creado laspropiedades Name y Member Name Column, asig-nándole los siguientes valores:

Opcionalmente podríamos ir ala pestaña de propiedades“Avanzadas” y modificar el valor de“Order by” y elegir si queremos orde-nar los miembros de la dimensión porKey (se ordenarán según el valor de lapropiedad Member Key Column) o porName (se ordenarán por el valor de la pro-piedad Member Name Column).

Finalmente, para ver los miembros de ladimensión que acabamos de crear, debe-mos seleccionar la vista “Datos” en las pes-tañas que hay en la parte inferior de la ven-tana donde se muestran los miembros de la dimen-sión (ver figura 7).

Pues ya tenemos construida nuestra primeradimensión, ahora pulsamos guardar, y damos por con-cluido el proceso. Ya podemos cerrar el editor dedimensiones.

Las dimensiones Forma de Pago y Provincia, sontambién dimensiones con un esquema de estrella, porlo que para su creación seguiremos los mismos pasosvistos anteriormente seleccionando en cada caso latabla correspondiente.

Una vez creadas debemos hacer ciertas modifi-caciones, como en el caso de la dimensión Cliente.Modificaremos las siguientes propiedades del úniconivel creado en cada una de ellas, con los valores quese indican a continuación:

ConclusiónTras un primer artículo introductorio, en éste

segundo hemos comenzado a utilizar la herramien-ta Analysis Manager, construyendo con él nuestrasprimeras dimensiones y familiarizándonos con elentorno. En el siguiente artículo continuaremos conla creación del resto de dimensiones, y la creacióndel cubo de Ventas.

Como complemento a este artículo, encontra-rá unas referencias bibliográficas en la seccióndnm.biblioteca.

dotN

etM

anía

<<

39

dnm.servidores.sql<<

Figura 6

Figura 7

Forma de PagoName Forma de Pago

MemberNameColumn

RTRIM("dbo"."dwForPag"."nombre") + ' [' + RTRIM(CAST("dbo"."dwForPag"."codigo"AS CHAR(10))) + ']'

Order By Name

ProvinciaName Forma de Pago

MemberNameColumn

RTRIM("dbo"."dwProvincias"."nombre")+' ['+ RTRIM(CAST("dbo"."dwProvincias"."codigo"AS CHAR(2))) + ']'

Cliente

Name Cliente

MemberNameColumn

RTRIM("dbo"."dwClientes"."nombre")+ '[' + RTRIM(CAST("dbo"."dwClientes"."codigo"AS CHAR(10))) + ']'

Page 40: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

40

muy cómodo arrastrar lastablas de la base de datos y ver cómo Visual Studiocrea el esquema y, por debajo, una clase que repre-senta dicho esquema. No más errores por llama-das a campos que no existen o por asignación devalores en donde no coinciden los tipos de datos.Ahora el compilador puede realizar las verifica-ciones en tiempo de compilación e informarnosde antemano que se ha realizado una asignación oreferencia incorrecta.

Cuando arrastramos una tabla desde nuestrorepositorio a un XSD, Visual Studio obtiene laspropiedades de esta tabla y crea los elementosXML dentro del esquema. Por ejemplo, emple-ando la base de datos ejemplo suministrada conSQL Server puedo arrastrar la tabla Employees den-tro de un DataSet existente en mi proyecto. Elaspecto final será el siguiente:

Cuando almacene este archivo, Visual Studiocreará automáticamente el código que describedicho esquema. Para verlo debo habilitar la opciónProject Show All Files y buscar el archivo .CS(estoy escribiendo en C#) vinculado a mi XSD. Elproyecto luce así:

Este esquema contiene la descripción de todoslos elementos que existen en mi tabla Employees.Refleja la definición de la tabla, sus columnas, suclave primaria. En fin, está todo. ¿O no?.

Utilizando SQL Enterprise Manager examinoen detalle la tabla Employees y descubro que tieneuna restricción (constraint) para la columnaBirthDate. La figura 3 lo confirma.

Bien, la restricción no aparece en mi esquema.Esto quiere decir que, si no soy conciente que estarestricción existe, mi lógica de negocios no podrávalidar esta regla y será mi servidor de base dedatos el responsable de efectuar el control. Pero,para ello, deberé efectuar un viaje hasta SQL

¿ADO.NET Extendido?

ADO.NET ofrece características realmente atractivas a la hora de simplificarnos la vida.Una de lasque más me atrae es la de poder emplear Strongly Typed DataSets (STDS) para mover la metadatade nuestro proveedor de datos a nuestra lógica de negocios.

<<

Por Pablo AbbateMCDBA/MCAD/MCSD/MCTConsultor independiente

Realmente resulta

Figura 1

Figura 2

Page 41: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Server, aún cuando la operaciónpodría haberse efectuado en mi com-ponente.

Además, SQL Server me comuni-cará (a su manera) que la fecha de naci-miento debe ser menor que la fechaen curso. Este mensaje lo especifica:

Server: Msg 547, Level 16, State 1,Line 1

UPDATE statement conflicted with COLUMNCHECK constraint 'CK_Birthdate'.The conflict occurred in database'Northwind', table 'Employees',column 'BirthDate'.

The statement has been terminated.

Hummm..., no creo que el usuariofinal pueda entender qué es lo que estáocurriendo. Sería mucho más adecua-do colocar el código de validación ennuestra lógica de negocio y, si la ope-ración no es correcta, informar alusuario con un mensaje tal como:

El empleado debe tener una fecha denacimiento menor a la fecha encurso.

¿Cómo se hace esto?El primer paso consiste en extender

el STDS, por medio de la herencia, paraagregarle la funcionalidad requerida.Para ello, voy a utilizar un manejadorpara el evento DataRowChanging de cadatabla. El código queda según vemos enel fuente 1.

La idea es que al realizar un Updatede la tabla Employees, se dispara elevento EmployeesColumnChanging y sumanejador verifica que la columnaBirthDate tenga un valor válido. Encaso que la fecha ingresada no seacorrecta, la lógica de negocios detec-ta este problema y marca la columnacomo errónea, proporcionando unmensaje claro para el usuario sin nece-sidad de viajar al servidor SQL paradetectarlo.

Para comprobar si mi DataSetextendido funciona, voy a crear un for-mulario que me permita modificar losdatos de mi tabla Employees. Necesitoun formulario, una SqlConnection ySqlDataAdapter para la tabla Employeesy un DataGrid.

dotN

etM

anía

<<

41

dnm.ado.net<<

Figura 3

Fuente 1

public class LNDataSet : ExtDS

{

public LNDataSet()

{

this.Employees.ColumnChanging += new

DataColumnChangeEventHandler(EmployeesCheckColumns );

}

public void EmployeesCheckColumns(object sender, DataColumnChangeEventArgs e )

{

if( e.Column == Employees.BirthDateColumn )

{

// Validación

if( e.ProposedValue == null || (DateTime)e.ProposedValue >= DateTime.Now )

{

e.Row.SetColumnError(e.Column,"El empleado debe tener la fecha" +

" de nacimiento menor que la fecha en curso");

}

else

{

e.Row.SetColumnError(e.Column,"");

}

}

}

Fuente 2

private void cmdLlenar_Click(object sender, System.EventArgs e){

sqlDataAdapter1.Fill( lnDataSet1.Employees );}

private void cmdActualizar_Click(object sender, System.EventArgs e){

if( !lnDataSet1.HasErrors )sqlDataAdapter1.Update( lnDataSet1.Employees );

}

Page 42: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

42

dnm.ado.net<<

Además agrego una instancia de miDataSet Extendido (LNDataSet) y loasigno como DataSource para miDataGrid. De paso, agrego dos boto-nes: uno para llenar el STDS y el otropara enviar los cambios al servidor.

Gráficamente, la apariencia es lade la figura 4. El código para el for-mulario, es relativamente simple. Verfuente 2.

Ahora, cuando se ingresa un datoincorrecto, ADO.NET puede detec-tar esta situación e informar al usua-rio de una manera amigable y sinnecesidad de realizar un round-trip alservidor SQL (ver figura 5).

ADO.NET no siempre puede atra-par errores tales como violación de cla-ves primarias o externas o violación derestricciones o triggers. Pero sí puedeinterceptar los mensajes de error envia-dos por el servidor a fin de informar alusuario del problema en un léxico queéste pueda entender, proporcionándoleinformación acerca de qué error se haproducido, porqué y cómo solucionar-lo. Por ejemplo, dos usuarios puedeningresar un dato duplicado en unacolumna que no admite repetidos, almomento de grabar, SQL Server dispa-ra un error de violación de clave única.Otro ejemplo del mismo problema suce-

de cuando se intenta eliminar una filaque tiene dependencias con otra tabla.Si nuestro DataSet no tiene las relacio-nes necesarias para detectar la operación,será el servidor quién le informe a nues-tra aplicación del error ocurrido. EnADO.NET este error se refleja comouna excepción (SqlException) que el pro-gramador debe atrapar y tratar. Si no lohace, la excepción llegará al usuario finalcon el mensaje que originalmente pro-porcionó el servidor SQL.

Si no atrapo las SqlExceptions, elusuario final recibirá mensajes talescomo:

Server: Msg 547, Level 16, State 1,Line 1

DELETE statement conflicted withCOLUMN REFERENCE constraint'FK_Orders_Employees'. The con-flict occurred in database'Northwind', table 'Orders',column 'EmployeeID'.

The statement has been terminated.

Bueno, creo que el lector coincidi-rá conmigo en que esto no es conve-niente y que debemos proporcionar unprocedimiento que trate estos errores ylos ponga en “cristiano”. Para ello, elprimer paso consiste en detectar dóndese dispara el error. Esto sucede cuandose ejecuta el método Update del adapta-dor encargado de replicar los cambiosen el servidor.

En un principio, bastaría con atra-par la excepción SqlException y mirarel número de error para así tratarlo. Siretomo el formulario construido en laprimera parte de este artículo, ahorapuedo modificar la llamada al métodoUpdate para que atrape cualquier excep-ción SQL. El código, queda segúnvemos en el fuente 3.

Para cada error, en SQL Server exis-te un número, así que sólo debo cono-cer este número y ya puedo intercep-tarlo. Pero esto no quiere decir que pue-da informar al usuario exactamente quées lo que ha causado el error. Hasta elmomento, sé que:

• Se ha producido una excepciónde SQL Server.

• El error ocurrido es el 547 (vio-lación de una clave externa).

• Que estoy actualizando la tablaEmployees.

Figura 4

Figura 5

Page 43: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Pero esta información no me indica exactamenteporqué motivo ha ocurrido el error. Debo leer elmensaje para saber que se ha intentado eliminaruna fila que tiene registros en una tabla hija y, comoexiste una clave externa, se ha impedido dicha ope-ración.

La tabla (Employees) también tiene una claveexterna sobre el campo ReportsTo que al recibir unvalor inválido, por ejemplo cero, dispara el siguien-te error:

Server: Msg 547, Level 16, State 1, Line 1

UPDATE statement conflicted with COLUMN FOREIGN

KEY SAME TABLE constraint 'FK_Emplo-

yees_Employees'. The conflict occurred in

database 'Northwind', table 'Employees',

column 'EmployeeID'.

The statement has been terminated.

Lo que pretendo es que cada vez que se pro-duzca este error, el usuario reciba un mensaje quepueda indicarle exactamente que está sucediendo.Por ejemplo:

El jefe al cual se reporta el empleado no es

correcto.

Al ver el número de error de SQL Server, medoy cuenta que SQL Server siempre hace mencióna la restricción que se ha violado, en este caso:FK_Employees_Employees. Si pudiera enlazar cadarestricción (constraint) con una descripción del error,su origen y su procedimiento para solucionarlo,podría generalizar el código de tratamiento de erro-res y hacer que funcione para cualquier base dedatos. Lo cual me haría muy feliz porque me evi-taría tener que agregar código de gestión de erro-res para cada nueva base de datos.

Para lograr esto, es necesario encontrar un repo-sitorio donde colocar esta información, es decir, elmensaje de error asociado a la restricción y la infor-

mación adicional. Miprimera idea fue utilizaruna tabla auxiliar, perodespués me incliné porutilizar las propiedadesextendidas que SQLServer ofrece. El lectorpodrá optar por otrassoluciones si su servidorde base de datos no ofre-ce la funcionalidad dediccionario.

Las propiedadesextendidas de SQLServer permiten agregarnuevos atributos a los

objetos existentes en SQL, que es exactamente loque necesito.

Existen dos mecanismos para agregar propie-dades extendidas a un objeto en una base de datosSQL Server.

El primero es el más sencillo. Se trata de utili-zar el Analizador de Consultas (Query Analyzer) deSQL Server. Mediante el Navegador de Objetos(Object Browser) se puede seleccionar el objeto alcual se desea agregar la nueva propiedad y con elbotón derecho se activa el menú desplegable. Luegoseleccionando la opción Propiedades Extendidas(Extended Properties) se administran los atributosdel objeto seleccionado:

Lo que resta es agregar la nueva propiedadErrMsg y el valor que se le asignará, es decir el men-saje de error propiamente dicho.

El segundo mecanismo emplea un conjunto deprocedimientos almacenados para crear, actualizaro eliminar propiedades extendidas:

sp_addextendedproperty: agrega una nueva pro-piedad extendida.

dotN

etM

anía

<<

43

dnm.ado.net<<

Fuente 3

private void cmdActualizar_Click(object sender, System.EventArgs e){

if( !lnDataSet1.HasErrors ){

try{sqlDataAdapter1.Update( lnDataSet1.Employees );

}catch( SqlException se ){if( se.Number == 547 ){

// Código a ejecutar cuando ocurre el error.}

}}

}

Figura 6

Page 44: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

sp_dropextendedproperty: eliminauna propiedad existente.

sp_updateextendedproperty: actua-liza el valor de una propiedad.

Por ejemplo, el siguiente coman-do, equivale a la operación efectuadaanteriormente:

EXEC dbo.sp_addextendedproperty 'ErrMsg','El jefe al cual se reporta el

empleado no es correcto','USER','dbo','Table','Employees','Constraint','FK_Employees_Employees'

Para recuperar la informaciónalmacenada en una propiedad exten-dida se utiliza la función de SQLServer fn_listextendedproperty. Porejemplo, para recuperar la propiedadque he almacenado utilizo:

SELECT * FROM ::fn_listextendedproperty('ErrMsg','USER','dbo','Table','Employees','Constraint','FK_Employees_Employees')

Este comando me devuelve unatabla, de la cual puedo extraer la pro-piedad almacenada. En la figura 7 sepuede ver.

Para recuperar esta propiedadextendida he necesitado indicar, en elcomando, que se trata de una tablacuyo nombre es Employees y de unaconstraint cuyo nombre es FK_Emplo-yees_Employees.

Pero si lo que deseo es generalizareste comando para cualquier restric-ción detectada en SQL debo obtenerestos datos del mensaje de error delservidor. Primero necesito obtener elnombre de la restricción y de la tabla.Luego, con estos datos puedo llamara un comando que recupere el men-saje de error almacenado en la pro-piedad extendida.

Como quiero reutilizar el código,lo coloco en una clase separada. Elresultado de este proceso puede ver-lo en el fuente 4.

dotN

etM

anía

<<

44

dnm.ado.net<<

Fuente 4

using System;using System.Data;using System.Data.SqlClient;

namespace ExtendedDS{

public class ExtDsUtils{

public static string ObtenerError( SqlException se, SqlConnection cn ){string errMsg = se.Message;switch( se.Number ){

case 547:string constraint = ObtenerConstraint( se.Message);string tabla = ObtenerTabla( se.Message );errMsg = BuscarMsgErr(cn, constraint, tabla);break;

// case otros errores..}return errMsg;

}

private static string ObtenerConstraint( string SqlErrMsg ){int posini;int posfin;SqlErrMsg = SqlErrMsg.ToLower();posini = SqlErrMsg.IndexOf("constraint '");posfin = SqlErrMsg.IndexOf("'", posini + 12);return SqlErrMsg.Substring(posini + 12, posfin - posini - 12 );

}private static string ObtenerTabla( string SqlErrMsg ){int posini;int posfin;SqlErrMsg = SqlErrMsg.ToLower();posini = SqlErrMsg.IndexOf(", table '");posfin = SqlErrMsg.IndexOf("'",posini + 9);return SqlErrMsg.Substring(posini + 9, posfin - posini - 9);

}

private static string BuscarMsgErr( SqlConnection cn, string constraint, stringtabla )

{SqlCommand cmd = new SqlCommand();SqlDataReader dr;ConnectionState cnState;string msgError = "";cmd.CommandText = @"SELECT * FROM ::fn_listextendedproperty('ErrMsg'," +

@" 'USER', " +@" 'dbo', " +@" 'Table', " +"'" + tabla + "'," +@" 'Constraint', " +"'" + constraint + "')" ;

cmd.Connection = cn;cnState = cn.State ;if( cn.State != ConnectionState.Open ) cn.Open();dr = cmd.ExecuteReader();if(dr.Read() ){

msgError = (string) dr["value"];}dr.Close();if( cnState != ConnectionState.Open) cn.Close();return msgError;

}}

}

Page 45: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Bueno, ahora sólo resta comprobar si todo estofunciona. Para ello, en mi formulario, hago lamodificación del fuente 5.

Al ingresar un valor incorrecto para la columnaReportsTo obtengo mi mensaje de error:

ConclusiónGracias a las propiedades extendidas, es facti-

ble agregar atributos a los objetos en una base dedatos del SQL Server potenciando la versatilidaddel componente de lógica de negocios a la hora de

comunicar -de maneraamigable- los mensajes deerror ocurridos en el ser-vidor de base de datos alusuario final.

Con un poco de imagi-nación se puede extenderla funcionalidad de estemodesto ejemplo para quetrate otros tipos de errores,brinde información acercade cómo solucionar el pro-blema o interactúe con elSTDS para pasar los men-sajes de error a las propiastablas. Seguramente, el lec-tor encontrará aplicacionesprácticas que yo ni siquie-ra he imaginado. ¡Queaproveche!

dotN

etM

anía

<<

45

dnm.ado.net<<

Figura 7

Fuente 5

private void cmdActualizar_Click(object sender, System.EventArgs e){

if( !lnDataSet1.HasErrors ){

try{sqlDataAdapter1.Update( lnDataSet1.Employees );

}catch( SqlException se ){MessageBox.Show( ExtDsUtils.ObtenerError( se, sqlConnection1 ),"Error",

MessageBoxButtons.OK, MessageBoxIcon.Error );}

}}

Figura 8

Page 46: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

46

de la típica web de empresa donde pue-de acceder cualquier internauta y se suele mostrara qué se dedica la empresa, información de con-tacto, noticias del sector, y poco más, un portal cor-porativo trata de ser una herramienta a través dela cual se puede acceder a información empresarialde distinto tipo y origen a través de una única inter-faz homogénea.

Si bien la web estática de carácter informativo esalgo que todas las empresas han asumido y ya tienenen funcionamiento, el portal corporativo es una asig-natura pendiente para la gran mayoría de las empre-sas. Sin embargo la importancia del portal corpora-tivo y los beneficios que puede aportar a la empresason mucho mayores que los que pueda ofrecer unaweb estática de carácter informativo.

Los portales corporativos tienen un acceso res-tringido, los usuarios deben identificarse para acce-der y la información a la que tendrán acceso depen-derá de su perfil dentro de la empresa.

Así la web que podrá ver un empleado del depar-tamento de compras será distinta a la que podrá verun empleado de recursos humanos y, por supuesto,totalmente distinta a la que podrá ver un proveedor.Cada tipo de usuario tendrá acceso sólo a la infor-mación que le interesa o que le es permitida ver.

¿Porqué crear un portal corporativo?Pero ¿porqué crear un portal corporativo?, pues

bien, porque el conocimiento es un bien que crece amedida que se comparte. Si en una organización su

sistema permite compartir información y tener unacceso fácil a la misma, los empleados se centran másen sus tareas propias y no en procesar o buscar datos,ayudándole a tomar las decisiones adecuadas.

Veamos un ejemplo, podemos pensar en unaempresa que se dedica a vender hardware, y queactualmente tiene una aplicación ERP, otra aplica-ción de CRM y una tercera aplicación para gestiónde recursos humanos.

En este caso la información de varios departa-mentos se mantiene aislada, al utilizarse distintas apli-caciones para cada actividad resulta complicado, porejemplo, poder comparar información de ventas conel seguimiento que se hizo a los clientes.

Además no se puede consultar información fuerade la empresa y a los comerciales no les resulta posi-ble consultar datos o confirmar pedidos cuando visi-tan a un cliente. Debido a la gran variedad de pro-ductos, los documentos técnicos o las hojas de espe-cificaciones son difíciles de encontrar y muchas vecesno están actualizados.

En esta empresa de ejemplo, el flujo de informa-ción entre departamentos es mínimo y muy lento, elacceso a la información está muy localizado y no resul-tado posible hacerlo externamente o con dispositivosmóviles, y la gestión de documentos esta poco orga-nizada y la posibilidad de búsqueda de documenta-ción es casi inexistente.

No es necesario quitar las aplicaciones ya exis-tentes ni cambiar el modo de funcionamiento de lossistemas de información de la empresa, sino utilizarlo que ya tenemos y coger sólo la información que

Portal corporativo,la asignatura pendiente

Por Pedro PozoVASSwww.vass.es

Hoy en día la inmensa mayoría de las empresas tienen presencia en Internet, normal-mente una web que, con menor o mayor acierto, muestra la información básica de laempresa y sirve para tener una presencia más que nada testimonial. Sin embargo sonpocas las empresas que han desarrollado un portal corporativo que les proporcioneuna mejora en los procesos de comunicación y de trabajo internos.

A diferencia de<<

Page 47: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

nos interesa de cada aplicación y reu-nirla en el portal corporativo.

El portal corporativo debe ser unaherramienta para simplificar, recopi-lar y mostrar más fácilmente la infor-mación de la que ya disponemos.Establecerá un flujo de informacióndesde y hacia las aplicaciones que yatiene la empresa para conseguir queesa información sea mas fácilmenteaccesible y actualizable y nos ayude atomar decisiones de una forma mássencilla y rápida.

Mejorar la gestión del conocimien-to, impulsar el flujo de información portoda la empresa y, en definitiva, com-partir la información para tenerla siem-pre a mano es lo que se pretende con-seguir.

VentajasA través de un portal corporativo

la primera ventaja la tendríamos en elentorno de trabajo. A través de unaweb podemos acceder a la informacióny los documentos que deseemos; esosupone una gran facilidad de manejoy un rápido aprendizaje -el entornoWeb ha quedado sobradamentedemostrado que es muy intuitivo ymuy amigable para el usuario-.

Un único entorno y un único acce-so para toda la información corporati-va, podemos olvidarnos de tener que uti-lizar la aplicación ERP para realizar unpedido, la aplicación CRM para hacerun seguimiento de un cliente y la apli-cación de recursos humanos para com-probar que empleados no están asigna-dos a proyectos.

Accediendo a nuestro portal podre-mos localizar esa información sin tenerque ir cambiando de aplicación y cono-ciendo cada una de éstas, o aún peor,teniendo que ir a buscar a la persona quese encarga de generar los informes parapedirle que nos obtenga un informe conla información que estamos buscando,tan solo navegando por la web conse-guiremos la información que deseamosobtener.

Otra gran ventaja del portal corpo-rativo es que podemos acceder a la infor-mación desde fuera del entorno de laoficina, si por ejemplo estamos reali-zando una visita a un cliente, mientras

estamos en la sala de espera esperandoque nos atienda, podremos comprobara través de nuestro móvil o de nuestraPDA si podemos ofrecerle un descuen-to del producto que vamos a venderle osi se encuentra en stock.

También conseguiremos agilizar losprocesos con proveedores y distribui-dores. A través de un portal corporati-vo podremos crear un mercado B2B enel cual realizaremos pedidos a provee-dores y ventas a distribuidores.

Por ejemplo si uno de nuestros dis-tribuidores quiere realizarnos un pedi-do urgente, no tendrá que localizar a uncomercial y esperar que éste le atienday tenga tiempo para introducir el pedi-do en el sistema de información de laempresa, podrá ser el propio distribui-dor accediendo al portal corporativoquien realizará el pedido que automáti-camente estará introducido en el siste-ma de información de nuestra empresa.

Errores a evitarCuando creamos un portal corpo-

rativo debemos evitar caer en algunoserrores típicos, como los que enumera-mos a continuación:• No se actualizan los contenidos o son poco

relevantes.El principal objetivo es que el por-tal sea muy visitado. Para conse-guirlo deberá tener información deutilidad para cada tipo de audien-cia que lo utilice. Si la informaciónno se actualiza, no es de interés ono es útil, los usuarios pierdeninterés y no visitan el portal. Adiferencia de cuando desarrolla-mos una aplicación de escritorio,en un portal corporativo no es sufi-ciente con hacer una aplicaciónrobusta, fiable, escalable, rápida yversátil; también es muy impor-

tante qué información mostrare-mos y cómo estará estructurada, siesta información no es relevante ono está bien enfocada al tipo deusuario, o no se actualiza, el por-tal no cumplirá sus objetivos.

• Escasa o nula integración de las aplica-ciones.Un portal corporativo debe ser algomás que una web donde se puedenleer las noticias de la empresa, enun portal corporativo se debenintegrar procesos de negocio. Sonespecialmente interesantes y bene-ficiosos de incluir los procesos quepuedan implicar a varias personaso departamentos, los informes, ylos procesos B2B. Pero como diji-mos anteriormente, no se trata detirar a la basura todas nuestras apli-caciones y volverlas a construir,sino de reutilizar las aplicacionesya existentes y obtener de éstas lainformación que nos interesa paramostrarla en el portal.

• Los objetivos no están claramente defi-nidos.Fijar claramente cúal va a ser la fun-cionalidad del portal, qué informa-ción se va a mostrar, cómo va a estarestructurado y a qué tipo de usua-rios va a estar dirigido, son algunosde los temas que se deben tener cla-ros antes de empezar a crear un por-tal corporativo. Como en cualquierotro proyecto se deben prefijar losobjetivos y las metas del portal ycomprobar si es viable y rentable surealización.

• Excesiva duración.Si el desarrollo del portal corpo-rativo se queda estancado y se alar-ga en el tiempo sin obtener unaversión definitiva se estará per-diendo tiempo y dinero.Probablemente los procesos denegocio o las aplicaciones cambieny esto suponga tener que volver arehacer parte del trabajo ya reali-zado. A mayor duración, mayorserá el gasto generado, por eso esmás recomendable ir sacandopequeñas versiones del portal, yaque además el ir añadiendo nuevascaracterísticas y funcionalidadescada cierto tiempo lo hará masatractivo de cara al usuario.

dotN

etM

anía

<<

47

dnm.opinion<<

El conocimiento es un bien que crece a medida

que se comparte

Page 48: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

48

dnm.opinion<<

Servidores .NET, la solución

La elección del software que vamos a utilizaren la construcción de nuestro portal es funda-mental, y especialmente si no queremos que el pro-yecto se alargue en el tiempo. Los servidoresMicrosoft .NET nos ofrecen robustez, escalabili-dad, rendimiento, y sobre todo sencillez de mane-jo y posibilidad de integración entre todos ellos.

Para la creación de portales corporativos tene-mos Sharepoint, que es posiblemente uno de losservidores .NET que mas acogida esta teniendo, yse esta extendiendo muy rápido en el mundo deldesarrollo de Intranet.

Sharepoint tiene como gran ventaja que noscrea un portal en apenas unos minutos, es instalary listo, ya tenemos un portal que tan solo tendre-mos que configurar a nuestro gusto. En apenasunos minutos tendremos un portal operativo quetiene un motor de búsqueda, suscripciones a con-tenidos, categorización de la información, inte-gración con Office, versionado de documentos,roles para mantener la seguridad, colaboración enWeb, entre otras cosas.

Como ya comentamos anteriormente, los con-tenidos del portal son una parte fundamental delmismo, por tanto tener un buen gestor de conte-nidos es una pieza clave en el desarrollo de un por-tal corporativo.

La herramienta que mejor se integra conSharepoint es Content Management Server, setrata de una herramienta para la creación, publi-cación y almacenamiento de contenidos para laweb. Con Content Management Server consegui-mos que sean las propias personas que generan lainformación las que la publican; de esta forma laspersonas con un perfil técnico se dedican a desa-rrollar y no pierden el tiempo en la gestión de loscontenidos.

Si tenemos intención de extender el portal cor-porativo a los distribuidores o proveedores, y ofre-cer posibilidades de realizar actividades B2B (busi-ness to business), disponemos de Commerce Server,que sigue ofreciéndonos la posibilidad de colabo-rar a la perfección con Sharepoint y ContentManagement Server.

Commerce Server nos permite personalizarnuestra web B2B en varios idiomas y divisas, tenercatálogos personalizados para distintos tipos declientes, realizar actividades de marketing comocampañas de correo, banners, o promociones basa-das en reglas. Pero en Commerce Server destacaque nos ofrece desde el primer momento una apli-cación totalmente operativa donde poder realizarla gestión de los catálogos de productos, precios,usuarios, campañas de marketing, y todo lo nece-sario para nuestro negocio B2B.

Y por último, destacaremos un nuevo servidor.NET que nos puede ayudar a poner la guinda enel pastel, se trata de Live Communication Serverque se encarga de los servicios de mensajería ins-tantánea y las comunicaciones en tiempo real a tra-vés de la red. Live Communication Server nos ofre-ce la posibilidad de realizar desarrollos a medidapara aplicaciones en las que podemos realizarcomunicaciones en tiempo real de usuarios quepueden intercambiar no sólo mensajes de texto,sino también audio, vídeo o ficheros, permitiendoasí una comunicación más fluida y personal.

Seguro que rápidamente ha pensado en el ejem-plo típico, poder comunicar a dos empleados quese encuentran en distintas oficinas a varios cientosde kilómetros de distancia, pudiendo verse, hablare intercambiar información, todo esto en tiemporeal.

Pero es que además Live Comunication Server,al igual que el resto de servidores .NET, se inte-gra a la perfección dentro de lo que ya tenemos,es decir que se integra con la seguridad de nuestrared, tiene un API para poder realizar nuestros desa-rrollos con .NET y está incorporado en elMicrosoft Office System.

ConclusionesEl conocimiento es un bien que crece a medida

que se comparte. Ésta es una idea que se está exten-diendo por el mundo empresarial y que se pone enpráctica si creamos un portal corporativo.

Compartir información, localizarla fácilmentey desde cualquier lugar y con distintos tipos de dis-positivos es hoy en día posible gracias a los porta-les corporativos.

Estar en Internet y sacarle provecho es algomás que tener una web estática contando a qué sededica una empresa. Por eso es el momento de darel paso y crear un portal de valor añadido que apor-te soluciones y servicios para la empresa.

Los servidores Microsoft .NET nos ofrecenrobustez, escalabilidad, rendimiento, y sobre

todo sencillez de manejo y posibilidad de integración entre todos ellos

Page 49: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

49

<< la programa-ción no es una ciencia exacta. A veces,preguntas difíciles de responder, sonresueltas con la más sencilla de las res-puestas posibles. Pero dentro de eseamplio rango de dudas y preguntas, hayalgunas que se repiten hasta la saciedady que muy pocos ponen empeño a daruna respuesta general que satisfaga a lamayoría.

Entre esas preguntas, una surje de for-ma repetitiva en los foros de discusión,casi con una frecuencia meridiana: ¿Cómopuedo ejecutar una caja de mensaje en pan-talla dentro de una aplicación Web como sehace en Windows?.

De sopetón, la primera afirmacióndirecta que se le pasa a uno por la cabe-za ante esta pregunta es un rotundo“NO se puede”, para tras meditarloconscientemente, pasar a un “bueno,con script SÍ”, pero finalmente y trasanalizarlo más a fondo, diríamos algoasí como “de todos los modos, Web noes Windows”. Y es que existe en elmundo informático una equivocadamentalidad de pensar que una aplica-ción Windows, puede y debe ser pasa-da a toda costa a Web (las modas y lascreencias idólatras aún perviven), noperdiendo ni un ápice de funcionalidadni rendimiento.

El siguiente artículo no obstante,trata de enseñarnos cómo crear un con-trol web que permita ejecutar a nues-tra aplicación el típico MessageBox o cajade mensaje que permita incluso inte-ractuar al usuario con la aplicación.

Poniéndonos en situación:scripts y algo más

Indudablemente, una aplicaciónweb tiene dos partes principales amplia-mente conocidas y que conviene dife-renciar. Por un lado la parte cliente ypor otro lado la parte servidora.

La parte cliente puede alimentarsecon algún tipo de componente previa-mente instalado en la máquina cliente ocon un script que permita interactuar conel cliente. La parte servidora, permite eje-

cutar cualquier tipo de código en el ser-vidor y devolver la respuesta a la partecliente. Reconozco que son conocimien-tos básicos, pero veremos a continuación,como mezclando estos conocimientosbásicos, podemos incurrir en un graveerror de programación.

Antes de esto, permítame introdu-cir la ejecución del típico mensaje enpantalla por medio de lenguajes scriptdel lado del cliente. Crearemos unapágina web en ASP.NET y añadiremosun control Button a ella. A continua-ción, escribiremos el siguiente código:

Usando VBScript sería:

Private Sub Page_Load(_ByVal sender As System.Object,_ByVal e As System.EventArgs)_

Handles MyBase.LoadButton1.Attributes.Add(“onclick”,_“vbscript:MsgBox(_‘Caja de Mensaje desde VBScript’)”)

End Sub

Usando JavaScript sería:

Private Sub Page_Load(_ByVal sender As System.Object,_ByVal e As System.EventArgs)_

Handles MyBase.LoadButton1.Attributes.Add(“onclick”,_“javascript:window.alert(_‘Caja de Mensaje desde JavaScript’)”)

End Sub

En ambos casos, se ejecutará unmensaje en pantalla en el lado del clien-te. En este caso, el servidor debe sopor-tar el lenguaje script que se utiliza (debe-

mos indicar que VBScript es menoscompatible que JavaScript).

Por otro lado, algún avanzado desa-rrollador habrá pensado que .NET nosofrece muchas más posibilidades (no vamal encaminado) y que quizás aña-diendo la referencia al nombre de espa-cio System.Windows.Forms, podamos uti-lizar la clase MessageBox de éste para lle-var a cabo nuestro propósito. Puede serque hayamos encontrado la piedraangular que solucione nuestra dudaexistencial, asi que añadiendo la refe-rencia al nombre de espacio comenta-do, tan sólo deberíamos escribir el códi-go del fuente 1.

Pero al ejecutar este código, obser-vamos algo que nos inquieta. Si lo eje-cutamos en el mismo entorno de desa-rrollo, aparecerá una caja de mensaje(¡bingo!). Daremos al botón pertinen-te y la aplicación terminará de enviarlos datos al cliente, pero ¿qué ocurre siejecutamos este código desde otramáquina?. Pues que el cliente no reci-birá ningún mensaje en pantalla, sinembargo, la aplicación estará inexpli-cablemente ejecutándose y la barra deprogreso seguirá esperando la respues-ta del servidor, que lógicamente daráun time-out, a no ser que pongamos aalguien físicamente allí para que estédando clic a la cantidad de cajas de men-sajes que aparecerán, ya que este men-saje aparecerá en el lado del servidor.Una situación cómica a la vez que ridí-cula y peligrosa sin duda.

Todos sabemos que

Jorge Serrano

dnm.mvp.online<<

System.Windows.Forms.MessageBoxImports WinForms = System.Windows.Forms

Public Class WebForm1Inherits System.Web.UI.Page

[...]

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles Button1.Click

WinForms.MessageBox.Show(“Ejemplo con System.Windows.Forms”, “Mi ejemplo”,WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Exclamation,WinForms.MessageBoxDefaultButton.Button1,WinForms.MessageBoxOptions.DefaultDesktopOnly)End SubEnd Class

Fuente 1

Page 50: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Ante esto y la cantidad de pregun-tas repititivas que aparecen normal-mente en los foros de discusión sobreestos conceptos, Eugenio JoséSerrano, MVP ASP.NET, recurrió acrear su propio control que permitirámostrar cajas de mensaje en aplicacio-nes web, de forma sencilla y rápida,haciendo de este control, un paso inter-medio entre los lenguajes script y la eje-cución directa de la caja de mensaje típi-ca de Windows.

La funcionalidad por encimade todo

El objetivo que Eugenio perseguía,era el de permitir que ASP.NET emu-lara la acción y funcionamiento de lascajas de mensajes que aparecían gene-ralmente en las aplicaciones Windows.Por esa razón, decidió crear un con-trol personalizado que llevara a cabotal funcionalidad. Obviamente, se bus-có la idoneidad del proyecto, y por lotanto, se decidió utilizar JavaScriptcomo lenguaje script, ya que es mayo-ritariamente compatible con la inmen-sa mayoría de navegadores web. Acontinuación expongo las anotacionesy explicaciones que Eugenio hacesobre esto:

...La funcionalidad por lo tanto, resi-de en usar JavaScript no sólo para mos-trar el Cuadro de Diálogo sino tambiénpara disparar eventos en el servidor. Estoúltimo se consigue con el uso de la inter-faz IPostBackEventHandler provista por.Net Framework.

Debido a que los formularios deASP.NET funcionan de una formamuy diferente a los formularios deWindows, la funcionalidad de estecontrol también lo será. Los formula-rios Web trabajan desconectados delservidor, y cada vez que se hace unpostback se crea la página nuevamen-te, se rearma el contenido, se envía alcliente, y se dispone de todos los obje-tos de la página. Es por eso que al uti-lizar este control, la ejecución de lapágina debe finalizar para que el men-saje sea mostrado efectivamente en elcliente, lo que hace diferente su usocon respecto al MessageBox deWindows.

Es bueno saber cómo trabaja-rá nuestro control

Cuando el control se prepara (méto-do OnPreRender), envía código JavaScriptal navegador, que tiene entre otras cosas,lo siguiente:

var MsgBoxInterval = setInterval(_“MsgBoxMostrarMensaje()”, 40 );

Esto permite que nuestra funciónJavaScript MsgBoxMostrarMensaje se eje-cute cuando se carga la página. Dicha

función evalúa el contenido de algunasvariables y luego, si todavía no se hamostrado el mensaje, se muestra y can-cela la llamada. En algunos casos, tam-bién ejecuta una función provista por el.NET Framework para disparar el even-to en el servidor cuando el usuario eli-ge “Aceptar” o “Cancelar”. La referen-cia a esa función lo obtenemos tambiéncuando se prepara el control, conPage.GetPostBackEventReference.

Finalmente en el método Render,enviamos a la página las variables men-

dotN

etM

anía

<<

50

dnm.mvp.online<<

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_Handles Button1.Click

‘Verificamos que puede grabar‘Se encontró una condición que necesita confirmación del usuario...‘Se envía True y False como 2 últimos parámetros ya que en este ejemplo no se necesita ‘hacer PostBack cuando el usuario elige cancelar.MsgBox1.ShowConfirmation(“Este movimiento ya esta conciliado. “ + _

“¿Está seguro que desea grabarlo ?”, “GRABAR”, True, False)End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_Handles Button2.Click

‘Verificamos que se puede eliminar....‘Se encontró una condición que necesita confirmación del usuario...‘Se envía True y False como 2 últimos parámetros ya que en este ejemplo no se necesita ‘hacer PostBack cuando el usuario elige cancelar.MsgBox1.ShowConfirmation(“La eliminación de este registro incluye eliminar todos ” + _

“los movimientos que dependen de él. “ + _¿Está seguro que desea eliminarlo ?”,“ELIMINAR”, True,False)

End Sub

Private Sub MsgBox1_YesChoosed(ByVal sender As Object, ByVal Key As String) _Handles MsgBox1.YesChoosed

‘Key contiene la clave introducida cuando se llama al método ShowConfirmation.Select Case Key

Case “GRABAR”‘Se confirmó que se desea grabar lo mismo, grabo...‘Y muestro que se grabo okMsgBox1.ShowMessage(“Datos grabados correctamente.”, “GRABADO_OK”, False)

Case “ELIMINAR”‘Se confirmó que se desea eliminar lo mismo, elimino‘Muestro que se eliminó y luego del Ok quiero hacer otra cosa... MsgBox1.ShowMessage(“Registro eliminado.”, “ELIMINADO_OK”, True)

End SelectEnd Sub

Private Sub MsgBox1_OkChoosed(ByVal sender As Object, ByVal Key As String)_Handles MsgBox1.OkChoosed

Select Case KeyCase “ELIMINADO_OK”

‘Response.Redirect(“OtraPagina.aspx”)MsgBox1.ShowMessage(“Aqui Deberiamos ir a otra pagina”, “OTRAPAGINA”, False)

End SelectEnd Sub

Private Sub MsgBox1_NoChoosed(ByVal sender As Object, ByVal Key As String)_Handles MsgBox1.NoChoosed

‘En este ejemplo no lo utilizamos.‘Pero si necesita realizar alguna acción cuando el usuario hace clic en No, ‘debe escribirlo aquí.End Sub

Fuente 2.

Page 51: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

cionadas arriba que harán que nuestrafunción JavaScript muestre el mensajedeseado.

Programando el controlEugenio nos ha facilitado el código

de este control tanto en VB.NET comoen C#. Este código, puede ser descarga-do de la página web de dotNetManía.Dada la extensión del código, se haceimpensable agregarlo en la revista.

Una vez descargado el código, locompilaremos y así, tendremos nuestrocontrol disponible para ser usado ennuestras páginas web. Después de com-pilar el control, estaremos listos parausarlo en nuestras aplicaciones Web.Bastará con agregar el control en elcuadro de herramientas.

Probando el controlCrearemos un nuevo proyecto de

ASP.NET y en nuestro formularioWebForm1.aspx añadiremos una instan-cia de nuestro control. No es impor-tante la posición de éste en el formula-rio, ya que se trata de un control no visi-ble en tiempo de ejecución.

En el mismo formulario, añadire-mos dos controles Button, sobre los quemodificaremos la propiedad Text deambos. En principio, hemos optado porponer el texto “Grabar” y “Eliminar”respectivamente. La disposición de loscontroles dentro del formulario Web,quedaría como se detalla en la figura 1.

A continuación, escribiremos elcódigo del fuente de nuestra aplicaciónde ejemplo (fuente 2).

Las cajas de mensaje de nuestropequeño ejemplo en ejecución son lasque se muestran en la figura 2.

Observando esta figura, nos damoscuenta de cómo se realiza el proceso demostrar una caja de mensaje en la apli-cación web. El punto 1 indica lo queobtenemos en nuestra página web alser ejecutada. El punto 2, indica lo quese obtiene en pantalla al hacer clicsobre el botón “Grabar”. El punto 3,nos indica con un segundo mensaje, loque ha ocurrido cuando se ha acepta-do la condición.

ConclusiónEste es un simple ejemplo de cómo

integrar código JavaScript con nuestroscontroles de servidor de ASP.NET.Quiero aclarar antes de despedirme, quedebido a la facilidad de ASP.NET de pro-gramar para la Web al estilo de formula-rios Windows, muchos programadores(principalmente los que conocen poco lastecnologías de la Web) olvidan en quéambiente se está desarrollando e intentanprogramar una página Web como si fue-ra un formulario Windows. Y en ese sen-tido este control puede colaborar aun mása esa confusión. Es por eso que reco-miendo no abusar del uso del mismo ytener en cuenta que cada vez que se envíaun mensaje de confirmación y el usuariohace clic en aceptar o cancelar, hay un iday vuelta al servidor con todo lo que esoimplica. Teniendo en cuenta esos facto-res, este control puede ser una maneramuy útil de interactuar con el usuario des-de el código del lado del servidor.

Basado en el artículo original:http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art120.asp.

El actual artículo implementa mejo-ras del propio Eugenio sobre su control.

Sobre Eugenio José SerranoEugenio José Serrano es MVP ASP.NET

y reside en Argentina. Es voluntario de INE-TA Latam (http://www.ineta.org/latam/), yha estado involucrado como orador en confe-rencias y eventos de MSDN OnSite,TechNights, MSDN Briefing y Jornadas parael Grupo de Usuarios de Microsoft deArgentina, tratando sobre todo, temas rela-cionados con .NET. Pertenece a NDSoft, unaempresa de consultoría y desarrollo especiali-zada en tecnologías Microsoft.

Podrás contactar con él en la dirección dee-mail [email protected]

dotN

etM

anía

<<

51

dnm.mvp.online<<

Figura 1.Disposición del control MsgBox y de loscontroles Button en nuestra página web

Figura 2. Cajas de mensaje de nuestro ejemplo en ejecución

Los formularios Web traba-jan desconectados del servi-dor, y cada vez que se hace

un postback se crea la páginanuevamente, se rearma el

contenido, se envía al cliente,y se dispone de todos los

objetos de la página

Page 52: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

52

de dos herramientas diferentes,SoftICE y Visual SoftICE. La primera se centra enla depuración de máquinas locales, y puede ser invo-cada vía hotkey, excepción, atajo de teclado o fallo delsistema, mientras que la segunda permite la depura-ción remota mediante varios sistemas de conexión. Sidisponemos del hardware suficiente, es idónea la ins-talación de la parte nuclear de Visual SoftICE en unservidor, mientras que mantenemos la interfaz de usua-rio en un cliente. A pesar de que el nombre pudieseinducir a pensar que sólo se pueden depurar drivers,SoftICE es capaz de depurar casi cualquier tipo de apli-

cación, incluyendo EXE's, DLL's, OCX's y dispositi-vos VxD tanto estáticos como dinámicos.

La potencia de esta herramienta es espectacular, ydiríamos, sin temor a equivocarnos, que no tiene paran-gón con nada similar en la industria. Es capaz de esta-blecer puntos de ruptura en tiempo real sobre procesosde lectura/escritura a memoria, así como a puertos, inte-rrupciones del sistema, procesos de entrada/salida o men-sajes del sistema operativo. El conjunto de posibilida-des que ofrece esta suite parece no tener fin: durante eldesarrollo y depuración disponemos de múltiples ven-tanas informativas (ventana de comados, ventana de códi-go, ventana de variables locales, ventana de valores deinterrupción, de datos, de la pila, del estado de los regis-tros del procesador (Pentium III/IV), así como de la pilade información de la CPU. Permite una depuración anivel de kernel, pudiendo mostrar información internay datos específicos de funcionamiento de sistemas, (des-de MS-DOS hasta Windows 98, NT, ME, 2000, y XP),tales como:

• Información completa de hebras y procesos deejecución.

• Mapas de memoria virtual de un proceso.• Puntos de entrada en modo kernel.• Directorio de objetos de Windows NT.• Información completa de drivers y dispositivos.• Zona de memoria heap de Win32.• Marcos de SEH (Manejo estructurado de excep-

ciones).• Exportaciones de DLL's.

SoftICE for DevPartner

Por Marino PosadasMVP Visual Developer C#Alhambra-Eidos/ElAveFenix.net

En números anteriores, Peter Varhol analizaba la gestión de memoria que efectúa elGarbage Collector de .NET y la forma en que DevPartner Studio de Compuware, podríaayudarnos a manejar los problemas asociados a su funcionamiento; Pedro Pozo noscomentaba sus características y utilización en el análisis de aplicaciones distribuidas,rendimiento, alcance, y gestión de memoria en general. Pero la suite, incluye, además,SoftICE for DevPartner, una vieja conocida como depurador de sistema desde los tiem-pos en que era distribuida por NuMega Technologies.

De hecho, se trata<<

Tabla de soporte

Procesador S. Operativo SoftICEVisualSoftICE

Intel X86 y compatibles

MS_DOS,Windows 3.*,Windows 9x

Sí No

Intel X86 y compatibles

Windows NT 3.x,Windows NT 4.0

Intel X86 y compatibles

Windows 2000, XP,Advanced Server, NETServer

Sí Sí

Intel Itanium 1 e Itanium2(IA64)

Windows XP 64 bit Ed., .NETServer 64 bit Ed.

AMD Opteron /Hammer(x86-64 bit / k8)

Windows XP 64 bit Ed., .NETServer 64 bit Ed.

Page 53: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Además, dispone de característicasmuy interesantes de uso, como por ejem-plo ventanas emergentes que saltan de for-ma automática cuando se produce unaexcepción, o posibilidad de conexión porMODEM, puerto serie, red o Internet aun usuario remoto (por ejemplo, pudien-do llegar a diagnosticar una caída del sis-tema en otra máquina).

DriverStudioIgualmente notables son las herra-

mientas que incluye DriverStudio parala creación de drivers de cualquier tipo(usando C++ como lenguaje) y con todaslas capacidades de depuración necesa-rias en tiempo real: DriverWorkbench,conjunto de utilidades de testeo y depu-ración para dispositivos, BoundsChecker,

que controla los errores en las API's,TrueTime, que permite un análisis derendimientos, o TrueCoverage, otraherramienta de análisis que garantizaque se han testeado todos los aspectosnecesarios.

El control de los puntos de ruptu-ra es muy flexible, pudiendo estable-cerlos de forma absoluta o condicio-nal. De la misma manera, podemostener control de todos los símbolosexternos cargados por cualquier DLLo EXE, utilizar puntos de entrada anó-nimos, o la propia familia de símbo-los definida por Windows NT.

PersonalizaciónFinalmente, las dos herramientas

disponen de muchísimas posibilidadesde personaliza-ción y monitori-zación de resulta-dos y de sesionesde actividad.Desde el típicoseguimiento delhistórico del buf-fer, hasta controltotal de la memo-ria RAM, de losmensajes de diag-nóstico, desen-samblado conopciones de for-mato, o personali-zación de los ata-jos de teclado para

invocación de comandos. También esposible crear y manejar macros perso-nalizadas para configurar tareas repeti-tivas.

Documentación y conclu-siones

Curiosamente (algo que se ve cadavez menos), acompañan al productovarios manuales excelentes de utiliza-ción que, en el caso de los productosque analizamos aquí, incluyen uncompleto tutorial que podemos seguirpaso a paso para guiarnos en la cons-trucción de un driver.

En fin, larga vida a esta increíbleutilidad (que por su potencia, algunosllamaban “La Bestia”). Una herra-mienta única en su género, por su gra-do de especialización, la calidad de laimplementación y las enormes posi-bilidades que ofrece, teniendo encuenta que la creación de este tipo desoftware es, probablemente de las másespecializadas y exigentes que puedanencontrarse.

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

La potencia de esta herramienta es especta-

cular, y diríamos, sin temora equivocarnos, que no

tiene parangón con nada similar en la industria

Ficha técnica

Nombre SoftICE for DevPartner

Versión 4.3.2

Fabricante Compuware

Web www.compuware.com

Categoría Add-on

Precio A partir de 1.500€

(con mantenimiento el1er año)

Valoración

Page 54: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

54

dnm.comunidad.net<<

INETAMejorando la comunidad de desarrolladores

a través de los grupos de usuarios

consiste en proporcionar asistencia yrecursos a grupos de la comunidad de desarrollado-res, arquitectos, gerentes de proyectos, profesiona-les de IT y estudiantes.

¿Quién puede ser miembro de INETA?Actualmente, la participa-

ción en INETA está abierta acualquier grupo de usuarios,independientemente que seconformen en ciudades, uni-versidades u otros espacios devinculación.

Los líderes y responsables degrupos de usuarios interesados en

.NET y Windows obtendrán el mayor valor por su par-ticipación activa en INETA.

Pueden ser miembros todos aquellos grupos de usua-rios o grupos que cumplan los siguientes criterios:

• Siempre orientado a .NET y el desarrollo basa-do en Windows.

• Contar con un grupo de usuarios establecido.• Realizar reuniones físicas regulares, abiertas a

todo público.• Contar con un sitio Web del grupo de usuarios.• Realizar acciones para expandir el grupo y la

comunidad .NET/Windows local.

Organización,educación y promociónINETA ha creado programas que satisfacen las

necesidades de la comunidad. Por ejemplo:

• Organizacional: Para líderes y responsables degrupos de usuarios.- Mejores prácticas para comenzar y dirigir un

grupo de usuarios.- Foros de discusión: Hub de Ineta Latam

(http://es.thespoke.net/Hubs/Hubs_Hub.aspx?categoryid=1653&cat=12).

• Educativo: Soporte para la necesidad central delos grupos de usuarios.- Biblioteca de contenido de compañías patro-

cinantes u otros grupos de usuarios.- Centro de oradores reconocidos en la indus-

tria a disposición de los grupos.• Promocional: Creando la base de miembros.

- Directorio internacional de grupos.- Oportunidades de contacto con patrocinadores.

INETA LatamINETA-LATAM es la representación de INE-

TA para Latinoamérica y es la encargada de brindarasistencia y apoyo a los grupos de usuarios de estaregión. En la actualidad INETA-LATAM está estruc-turada cómo se muestra en la figura 1.

Una oportunidad para la comunidad de usuarios detecnologías .NET en el ámbito académico

• Para alumnos o docentes de carreras de infor-mática.

• Para quienes quieren compartir conoci-mientos sobre .NET con otros alumnos,docentes y profesionales.

<< La misión de INETA

INETA (International .NET Association) es una organización internacional independientesin ánimo de lucro, que reúne a grupos de usuarios de tecnologías Microsoft

alrededor de todo el mundo, con la misión de promover su desarrollo e impulsar susactividades para la difusión de .NET y de todas las tecnologías bajo el “paraguas de

Windows”. Es un intercambio entre pares, de “usuarios para usuarios”

Page 55: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

• Para los interesados en participar activamen-te en la comunidad.

• Para aquellos interesados en asistir y organizareventos con reconocidos oradores.

El Comité de Academia para Latinoamérica deINETA se concentra en brindar soporte y asistenciaen .NET en ámbitos académicos, promoviendo la for-mación y el crecimiento de grupos de usuarios de estu-diantes y docentes en el ámbito de las universidades.Proveemos también una conexión con desarrollado-res profesionales .NET, a través de los grupos loca-les, para ayudar a construir la comunidad y para ase-soramiento técnico.

INETA-LATAM Academia provee, además delos recursos estándar:

• Asistencia para la formación de grupos de usua-rios en tecnología .NET en las universidades,instituciones terciarias o en los colegios de nivelmedio.

• Espacio gratuito para que los grupos de usua-rios desarrollen sus propios sitios Web.

• Acceso a otros grupospara intercambio ycolaboración.

Integrarse como Grupo deUsuarios Académico deINETA

INETA-LATAM ase-gura la calidad y foco con-sistente para los gruposmiembros. Tenemos un

proceso de admisión para todos los grupos, el quehemos adaptado especialmente para grupos acadé-micos. Entre los requerimientos para asociarse, sedestacan:

• Siempre orientado a .NET.• Contar con un grupo de usuarios estableci-

do.• Realizar reuniones físicas regulares, abiertas

a todo público.• Contar con un sitio Web del grupo de usua-

rios.• Realizar acciones para expandir el grupo y la

comunidad .NET local.• Grupos de usuarios en escuelas de nivel inter-

medio deben tener un consejero escolar.

William Chiquito, Voluntario INETA-LATAM

Actualmente, la participación en INETA está abierta a cualquier grupode usuarios, independientemente quese conformen en ciudades, universida-des u otros espacios de vinculación

dotN

etM

anía

<<

55

dnm.comunidad.net

Datos de interés

Blog de INETA-LATAM http://weblogs.golemproject.com/ineta

Hub de INETA-LATAM enes.thespoke.net

http://es.thespoke.net/Hubs/Hubs_Hub.aspx?categoryid=1653&cat=12

Web de INETA e INETALATAM

http://www.ineta.org yhttp://www.ineta.org/latam

INETA reúne a grupos de usuarios de tecnología .NET

Alrededor de todo el mundo 639 grupos de usuarios289.068 miembros

En Latinoamérica

Presencia en 17 países.188 grupos que representa el29.42% del total de grupos deusuarios INETA a nivel mundial yes la segunda región en número degrupos de usuario después deNorteamérica (EEUU y Canadá).

GerenteGeneral

Gerente deProyectos

DirectoresRegionales

Comité deAcademia

Comité deNoticias

Comité deMercadeo

Comité deOradores

Comité de Weby Contenido

Comité de Gruposde Usuarios

Figura 1

Page 56: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

IMPORTES VÁLIDOS HASTA NUEVA OFERTA

DATOS DE FACTURACIÓN

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE ENVÍO (sólo si son distintos de los datos de facturación)

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

FORMA DE PAGO

❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARD

Número de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello (imprescindible)

a de de 20

Suscripción a dotNetManía

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a accedera sus datos, modificarlos y cance-larlos cuando lo desee. Sus datosno serán cedidos en ninguna de lasformas posibles a terceras partes yno se utilizarán más que para elbuen funcionamiento de su sus-cripción a la revista dotNetManíay para informarle de las activida-des comerciales que realice la edi-torial Netalia, S.L. Si no desea reci-bir información comercial dedotNetManía marque la casillasiguiente ❑

❑ Nº9❑ Nº4 ❑ Nº5

Puede enviar los datos al email [email protected],al FAX (34) 91 499 13 64 o al teléfono (34) 91 666 74 77.También puede enviarlo por correo postal a la siguiente dirección:

C/ Robledal, 13528529- Rivas VaciamadridMadrid (España)

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por unimporte total de 60 € para España; o por 120€ para el resto del mundo (envío por avión) (IVA incluido).

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) por un importe de 45 € por ser estudiante (IVA incluido).Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLOPARA ESTUDIANTES RESIDENTES EN ESPAÑA.

❑ Nº6 ❑ Nº7 ❑ Nº8

Si desea algún otro número indíquelo

❑ Nº10

Page 57: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

dotN

etM

anía

<<

57

Business Intelligence.Técnicas de análisis para la toma de decisiones estrtégicasElizabeth Vitt,Michael Luckevich, Stacia Misner

Es un libro que recomiendo a cualquier persona que desee conocer el significado y alcance del BusinessIntelligence (BI). Tanto para los ejecutivos y gerentes que deben tomar decisiones, como para los técnicos queparticiparán en el desarrollo de dichos proyectos. Ofrece una visión global de esta tecnología, que ayuda a pro-cesar e interpretar la inmensa cantidad de información que genera una empresa.

Está dividido en tres partes: la primera explica de forma clara y concisa qué es el BI y qué puede aportar alas empresas; la segunda expone una serie de casos prácticos, sacados del mundo real, que apoyan todo lo expues-to en la primera parte y muestran las ventajas que han obtenido dichas empresas en la toma de decisiones; final-mente, en la tercera parte, se expone una guía básica para el desarrollo, que ayuda a identificar, evaluar y eje-cutar este tipo de soluciones. Adicionalmente hay un apéndice dedicado a explicar la plataforma y herramien-tas de Microsoft para BI, enmarcadas en lo que ha denominado “Microsoft Data Warehousing Framework”, yun glosario de términos muy útil para los que se están introduciendo en estas tecnologías.

Professional SQL Server 2000 Data Warehousing with Analysis ServicesTony Bain,Mike Benkovich, Robin Dewson, Sam Ferguson, Christopher Graves,Terrence J. Joubert,DennyLee,Mark Scott, Robert Skoglund, Paul Turley, Sakhr Youness

Se trata de un libro muy completo, que explica todo el proceso de construcción y mantenimiento de un pro-yecto datawarehouse basado en Analysis Services, incluyendo el desarrollo de la base de datos multidimensional,su posterior explotación utilizando las herramientas cliente que tenemos a nuestra disposición, y el desarrollode aplicaciones basadas en éstas. Todo ello apoyado con muchos ejemplos prácticos que ayudan a comprendermejor todos los conceptos tratados.

Comienza con una introducción al modelado de datos haciendo una comparativa entre los sistemas OLTPy los DSS (Decisión Support Systems), para que el lector se vaya familiarizando con las nuevas perspectivas. Aprovechadicha introducción para ir mostrando las herramientas que Microsoft nos ofrece para estos propósitos, y paraintroducir todos los conceptos necesarios para entender esta tecnología. Seguidamente pasa a explicar detalla-damente la construcción de un datawarehouse basándose en la herramienta ETL (Extraction Transormation andLoad) que nos proporciona SQL Server, los DTS (Data Transformation Services). A continuación, como si de unproyecto real se tratase, explica todo el proceso de construcción de los cubos OLAP basados en el datawarehou-se, y su posterior explotación mediante el lenguaje de consultas multidimensionales MDX (MultiDimensionaleXpresions). Finalmente muestra el uso de herramientas cliente y técnicas de programación basadas en el len-guaje MDX, el servicio PivotTable, el proveedor ADO MD, la herramienta English Query y las tecnologías deminería de datos. Por supuesto que también trata temas como la seguridad en los cubos, la optimización del ren-dimiento y el mantenimiento del datawarehouse.

dnm.biblioteca.net<<

dnm.biblioteca.net

Editorial: McGraw-HillISBN: 8448139208Páginas: 189Publicado: 2003

Editorial: WroxISBN: 1861005407Páginas: 800Publicado: Octubre 2001

MDX Solutions With Microsoft SQL Server Analysis ServicesGeorge Spofford

Para el lector que desee conocer y profundizar en el lenguaje de consultas multidimensionales (MDX -MultiDimensional eXpresions). Este libro puede utilizarlo desde la persona que se está introduciendo en este nue-vo lenguaje, que puede hacer una lectura continua e ir poniendo en práctica todo lo tratado, hasta la que ya cuen-ta con amplia experiencia, que lo puede utilizar como material de referencia y consulta.

Parte de los conceptos más básicos, se va adentrando para mostrar en profundidad todos los elementos deeste lenguaje y cómo deben ser utilizados, apoyados en múltiples ejemplos prácticos, y tratado de una forma bas-tante amena.

Editorial: WileyComputer PublisingISBN: 0471400467Páginas: 432Publicado: 2001 <<

Page 58: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA

Longhorn y sus betas y productos asociados,podrían tenerya una fecha extraoficial para su lanzamiento.¿22 de Mayo de 2006? Esa fecha se ha barajado yade manera extraoficial como posible fecha de la sali-da del nuevo sistema operativo. Paul Thurrot, en su

popular sitio WinSupersite (ver la sección de “Documentos en lared”), ha conseguido hablar directamente con varios integran-tes de los equipos de desarrollo y evangelismo, y en su páginahttp://www.winsupersite.com/showcase/longhorn_preview_2004.aspexplica algunas de las conclusiones:a) Aunque se dijo que la siguiente versión de Office (Office12)

sólo sería ejecutable bajo Longhorn, lo cierto es que será eje-cutable también bajo Windows XP.

b) El pasado verano se comentó que Longhorn Server vería laluz 9 meses después de la aparición de Longhorn. El calen-dario no ha variado. (¡Ah! Y no confundir Longhorn Servercon Blackcomb -la siguiente versión del sistema- que sigueanclado en 2010 como fecha prevista).

c) Todo indica que Indigo ya está terminado y Avalon muyavanzado. La versión del SDK aparecida hace dos meses

(ver número anterior de El Desván en dotNetManía), asílo corrobora.

d) El equipo de desarrollo entró hace dos meses en la fase queinternamente se denomina D1 (preBeta1), y la fecha de lanza-miento sería el 22 de Mayo de 2006. La fecha de aparición dela primera beta oficial, sería el 16 de Febrero de 2005.

e) La aparición de Office12 (desarrollada con .NET en su mayorparte), se encuentra vinculada a la de Longhorn, y de acuer-do con la misma documentación, se lanzaría públicamente elmismo día que Longhorn, pero sería una evolución diferen-te. De acuerdo con esto, Office12 vería la aparición de variasversiones pre-view hasta el mes de Junio, que precederían a laaparición oficial de la primera beta del producto para el 26 deSeptiembre de 2005, seguida de una beta 2 el 19 de Diciembrede 2005 y la definitiva beta 3, el 13 de Marzo de 2006.

Aunque lógicamente, esto son rumores más o menos bien fun-dados, la persistencia del rumor, muchas veces, indica que “cuan-do el rio suena, agua lleva”, y por otro lado, las fechas encajanmilimétricamente con los planes oficialmente publicados porJim Alchin el verano pasado.

dotN

etM

anía

<<

58

no

ticia

s.n

oti

cia

s

Sitio de Raul Serrano: Otro MVP español, con tutoriales, artí-culos, FAQ's, enlaces. Todo ello sobre .NET. http://www.raul-serrano.net.

Un poco de historia: “The Alan Turing HomePage”. Una recreación histórica y documenta-da de la vida y milagros del padre de la infor-mática moderna, con multitud de enlaces rela-cionados y datos históricos de interés. Puedeencontrarse en http://www.turing.org.uk/turing.

Página de proyectos de desarrollo de Google (Google Labs):Se trata de una página que recoge el

estado de los distintos proyectosen los que Google se encuentra

implicado en la actualidad: cosasdel estilo de la Google Toolbar o el busca-

dor de escritorio (Google Desktop Search). http://labs.goo-gle.com.

WinSupersite: Y para aque-llos interesados en seguir lasnovedades de Longhorn, sudesarrollo y las fechas de apa-rición (algunas de las cualesmencionamos en el apartado de

noticias), recomendamos el sitio de Paul Thurrot www.win-supersite.com donde pueden encontrarse desde declaracionesde primera mano del equipo de desarrollo y/o los evangelis-tas del producto, hasta vídeos, fotografías, y trucos de las ver-siones aparecidas hasta ahora (especialmente, de la última,llamada WinHEC).

dnm.desvan<<

Marino Posadas

Mike Gunderloy, colaborador de la suite de revistas“Advisor”, publica un interesante artículo sobre fir-ma digital de ensamblados. Su nombre es "TheSecrets of Strong Naming", y puede encontrarse enhttp://www.ondotnet.com/pub/a/dotnet/2003/04/28/strongnaming.html.

documentos en la Red enlaces del mes

uti l idades del mes

MZTools 4.0 for Visual Studio .NET: Excelente y ya popu-lar herramienta desarrollada por el MVP CarlosQuintero, que ha tenido más de 100.000 descargassólo en la primera semana de aparición. Implementamuchos de los “wishes” (cosas que nos gustaría quetuviese) del desarrollador de Visual Studio. Desdecontrol de las ventanas, y documentación generadaautomáticamente, hasta ajuste automático de con-troles en un formulario y explorador de los mismos.Muy recomendable. Para descargas, demos y licen-cias, visitar www.mztools.com.

True Crypt: Interesante proyecto del programaSourceforge. Es un software de encriptación gratuito,válido para Windows 2000/XP y 2003. Permiteencriptar sencillamente discos completos, ficheros ounidades enteras (incluyendo USB) o particiones.Soporta varios algoritmos de encriptación. (verhttp://truecrypt.sourceforge.net)

Page 59: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA
Page 60: Delphi - sergiogonzalezc.files.wordpress.com · Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System Comunidad opinión INETA