“Trabajando con Datos Espaciales en SQL Server 2008 – 2012: PARTE 1 – Definiendo la información Espacial (Spatial).”

Primer artículo de una serie donde se muestran las capacidades de este gestor de bases de datos relacional para manejar datos espaciales.

Parte 1 – Definiendo la información Espacial (Spatial)

Vía GEOCAT CONSULTORES SRL.

“Una Mirada al Impuesto Predial en la Ciudad del Cusco – Perú”

Excelente artículo que muestra una mirada inicial al impuesto predial en la Ciudad del Cusco – Perú.

Una Mirada al Impuesto Predial

Vía GEOCAT CONSULTORES SRL.

“El Software y el Catastro”

Artículo que describe que software es necesario, para implementar un sistema de  información territorial para gestionar información catastral en un gobierno local o regional.

El Software y el Catastro

Vía GEOCAT CONSULTORES SRL.

Autodesk AutoCAD Map 2011 y .NET Framework 4.0

Hace unos cuantos meses, cuando me dispuse a realizar mis primeros módulos en AutoCAD Map 2011, me puse en la disyuntiva de que versión del .NET Framework debería utilizar; dado que recientemente, migramos todo el proyecto GIS de Catastro que estamos desarrollando al .NET Framework 4.0 y Visual Studio 2010; la primera opción era la de utilizar la versión 4.0 del .NET Framework, pero el temor principal era la compatibilidad de AutoCAD Map 2011 con la última versión del .NET Framework.

Llegado a este punto, la única manera de despojarnos de estos temores es haciendo las usuales pruebas, así que me dispuse a programar mi clásico “Hola Mundo”, y grande fue mi sorpresa al encontrarme con este hermoso error de AutoCAD que parecía confirmar todos mis temores.

ErrorEnsambladoNoSoportado

la siguiente línea del mensaje de error fue el que me hizo sudar frio: “This assembly is built by a runtime newer than the currently loaded runtime and connot be loaded”, parecía indicar claramente que el ensamblado que intentaba ejecutar había sido compilado por una versión del .NET Framework mas nueva de la que podía soportar AutoCAD Map 2011; pero esa interpretación inicial traducida en el calor del momento, no era correcta, ya que en realidad dice que el ensamblado que intento ejecutar es mas nuevo que el .NET Framework que actualmente esta cargado; entonces alentado con esta pisca de esperanza me puse en la labor de buscar como cargar el Framework 4.0 en AutoCAD Map 2011 para que pueda ejecutar el ensamblado de prueba que acababa de crear.

Como es usual en estos casos, luego de buscar en interminables sitios web, haber revisado muchos manuales de Autodesk, y haber leído innumerables foros, nadie podía decirme exactamente cual era la manera de solucionar mi problema, pero en muchos de esos lugares encontré pistas importantes, como por ejemplo la existencia del archivo “acad.exe.config”, si señores como los archivos de configuración que toda una vida usamos al desarrollar nuestras aplicaciones .NET, así que nada mejor que echarle una mirada a este archivo haber si encontramos alguna pista adicional.

acad.exe.config_original

Analizando detenidamente la primera sección de configuración, podemos leer claramente que “<supportedRuntime version=“v4.0”/>” está comentada. así que todo parece indicar que ahora podemos decir Bingo!!!.

Al realizar una instalación por defecto de AutoCAD Map 2011, esta sección de configuración siempre esta comentada, por tanto solo nos queda descomentar esta sección, de tal manera que el archivo de configuración “acad.exe.config”, que dicho sea de paso se encuentra en la carpeta de instalación de AutoCAD Map 2011, quede de la siguiente manera:

acad.exe.config_modificado

Con la configuración anterior, ahora podemos proceder a ejecutar nuevamente nuestro “Hola Mundo” y esta vez AutoCAD nos deja cargar el ensamblado sin ningún mensaje de error y permite mostrar en tan ansiado mensaje:

HolaMundo

Para concluir, seguramente que todos ya sabrán con que versión del .NET Framework estoy trabajando mis módulos de AutoCAD Map, por supuesto la 4.0 y no podría ser de otra manera que con C#. También cabe aclarar que si bien esta prueba la realicé con AutoCAD Map 2011, esto funciona igual para AutoCAD 2011, AutoCAD Civil 2011, etc. Para versiones anteriores de AutoCAD, queda como tarea para el lector, averiguar si esto funciona.

Comentarios XML con GhostDoc en C#

Ya sé, no tienen que decírmelo, hacer comentarios en el código aburre y ni que hablar de los comentarios XML donde uno tiene que estar recordando las etiquetas necesarias lo cual nos hace perder tiempo y productividad a la hora de programar (Excelente excusa, espero que me lo crea mi jefa).

El único problema es que existen herramientas para asistirnos en la laboriosa tarea de escribir nuestros amados comentarios XML, sí esos que hay que comenzar con “/// “. Una de esas herramientas se denomina como ya habrán adivinado GhostDoc, la existencia de este tipo de herramientas tira por los suelos nuestras mejores excusas para no escribir comentarios.

Bueno ahora que no tenemos más excusas nos vemos obligados a ver cuál es la funcionalidad de esta herramienta.

GhostDoc
 GhostDoc es un plug-in compatible tanto con Visual Studio 2005  y Visual Studio 2008 creado por Roland Weigelt, cuya utilidad es (Obligarnos a escribir comentarios), automatizar la escritura de comentarios XML, generando toda la estructura del comentario, lo único que tenemos que hacer es modificar el texto que necesitemos para que todo esté más entendible, gracias a este plug-in nos ahorramos de escribir una cantidad impresionantes de texto y podemos realizar los comentarios XML muy rápido; repito ahora ya no hay excusas.

¿Cómo Funciona?
La mejor manera para comprender su funcionamiento es con un pequeño ejemplo, donde mostraremos su utilidad. Asumamos que estamos escribiendo un sistema altamente complejo donde tenemos que implementar la clase calculadora de la siguiente manera:

ClaseCalculadora

Como verán es una clase muy compleja y por lo tanto casi imposible de usar si es que no se tiene la documentación de:

  • ¿Para qué sirve la clase?
  • ¿Para qué sirve cada método?
  • ¿Que representa cada parámetro?

Para proceder con nuestra tarea de documentación asistida tenemos que realizar los siguientes pasos:

  1. Descargar la versión que corresponda de GhostDoc de la siguiente dirección: Roland Weigelt’s  GhostDoc. Luego procedemos a instalarlo dejando los valores por defecto.
  2. Al iniciar Visual Studio se nos pedirá que seleccionemos algunas opciones como combinación de teclas para acceso directo, donde también pueden dejar los valores por defecto, para verificar que esté instalado el plug-in, revisar en el menú principal la opción “Tools”, bajo la que ahora debería estar GhostDoc.
  3. Ya tenemos todo listo así que nos queda comenzar a generar los comentarios XML, en primer lugar comentaremos la clase, para lo cual pulsamos clic derecho sobre el nombre de la clase y en el menú contextual seleccionamos: “Document this” (también podemos utilizar la combinación de teclas de acceso rápido, si es que dejaron los valores por defecto serán: ctrl + shift + D) 

    MenuContextual

    Esto genera la estructura del comentario completa incluida las etiquetas de resumen, poniendo el cursor en posición para escribir la descripción de la clase:

    ComentarioClaseGenerado

    A continuación solo nos queda escribir la descripción de la clase:

    ComentarioClaseEscrito

  4. Ahora nos toca generar los comentarios XML para los métodos, el proceso es el mismo, pulsamos clic derecho sobre el nombre del método y del menú contextual seleccionamos: “Document this”, lo cual genera toda la estructura necesaria para la descripción del método los parámetros de entrada y la salida del método, como se muestra en la siguiente figura:

    ComentarioMetodoGenerado

    Ahora solo nos queda escribir la descripción del método, los parámetros y el valor de salida, repetimos el procedimiento para todos los métodos.

     ComentarioMetodoEscrito

  5. Ahora ya tenemos nuestra clase completamente comentada, cabe aclarar que en este caso solo utilizamos comentarios para la clase y para métodos, pero también se pueden generar comentarios para otros miembros de clases como propiedades y eventos. GhostDoc también tiene numerosas opciones de configuración avanzadas, para las cuales tendrán que profundizar más en el estudio de esta herramienta.

¿Y para qué sirven esos comentarios XML?
Ahora ya tenemos nuestra clase completamente comentada, y ¿para qué nos sirve esto?, pues si pensamos en lo más inmediato, sirve para que las personas que revisen el código de la clase “Calculadora”  puedan guiarse por estos comentarios y entender la funcionalidad de los miembros de la clase, esta no es su única utilidad, también sirve para que los usuarios de nuestra clase “Calculadora” sepan cómo utilizar los miembros públicos de la clase, los comentarios XML que escribimos se presentarán como ayudas de IntelliSense al momento de escribir el código como se muestra en las siguientes figuras:

 IntelliSenseMetodo

 IntelliSenseParametros

La utilidad de los comentarios XML no termina aquí, en el siguiente artículo veremos cómo generar los archivos de ayuda a partir de estos comentarios XML.
Espero que esta excelente herramienta los motive a escribir más comentarios XML.

Enlaces
Página Oficial de GhostDoc: Roland Weigelt’s  GhostDoc

Desarrollo de Aplicaciones con el ORM .netTiers Parte I: Introducción

En un post anterior hace algún tiempo hablamos sobre los ORMs más conocidos entre los cuales mencionamos a .netTiers que es una plantilla para CodeSmith. En esta ocasión iniciaremos una serie de artículos para mostrar como utilizar este excelente ORM.

Introducción a netTiers
.netTiers es una plantilla de código abierto para CodeSmith escrito en C#. La intención de esta plantilla es asistir a los desarrolladores eliminando el código repetitivo, que tenemos que escribir cada vez que desarrollamos una aplicación con conexión a datos. Al mismo tiempo nos provee de un framework completo para comenzar a trabajar en las partes más importantes de nuestra aplicación, como son la capa de presentación, la lógica empresarial, el flujo de trabajo de nuestra aplicación, etc.

Conjunto de características actuales de netTiers
A continuación presentamos un listado de las características generales de .netTiers:

  • Genera una solución completa con proyectos separados y un framework basado en capas para su aplicación. Puede comenzar a trabajar con la aplicación inmediatamente terminado el proceso de generación.
  • Crea un conjunto completo de procedimientos almacenados que están especializados en el dominio de su aplicación. Este código se puede ejecutar como SQL en línea o como procedimiento almacenado, lo cual es configurable.
  • Genera automáticamente objetos de entidad y las relaciones entre estos objetos del dominio, basado en las tablas y relaciones de la base de datos.
  • Avanzado motor de validación de reglas de entidad, el cual puede utilizar las reglas creadas en el proceso de generación o utilizar delegados para cualquier regla de validación personalizada.
  • Las clases generadas incluyen dos partes, una parcial y una concreta, por lo tanto puede personalizar la lógica de cualquier clase sin que este código se sobrescriba cuando se ejecuta el proceso de generación nuevamente.
  • Utiliza una lista genérica personalizada para las colecciones (TList) que soporta toda la interfaz del modelo de componentes de .NET y más, y soporta enlace, ordenación y filtrado (Bindable, Sortable and Filterable).
  • Crea un sitio web completo, ya pre-configurado y listo para comenzar a escribir código conectable a datos inmediatamente.
  • Crea un conjunto completo de controles web de administración, que pueden servir como una consola de administración web completamente funcional para base de datos.
  • Crea un conjunto completo de controles DataSource con tipo para toda la API de acceso a datos, con soporte en tiempo de diseño, estos controles son similares a los ObjectDataSource, pero con más características propias del dominio.
  • Crea una API de servicios web completa para el dominio, perfecto para clientes .Net WinForms o dispositivos móviles, y su configuración es bastante simple.
  • Crea un conjunto completo de pruebas de unidad para los proveedores de datos y provee aproximadamente un 50% de cobertura. Estas pruebas pueden ser para nUnit o Visual Studio Team System.
  • El código que se genera está completamente comentado y listo para sus necesidades de documentación, además de seguir las directivas de Microsoft para la nomenclatura.
  • Cualquier código que se encuentre en una carpeta especial en cualquiera de los proyectos, que por defecto se llama App_Code, será automáticamente incluido en el proyecto generado.
  • Las consultas que se incluyen en la API de accedo a datos, se pueden realizar por: Clave primaria, clave foránea, índices, relaciones de muchos a muchos, todos, selección paginada con filtro y búsqueda; así también métodos de escritura en la base de datos como Inserción/Actualización/Eliminación.
  • Puede crear sus propios procedimientos almacenados personalizados, para las entidades y .netTiers generará los métodos que sirven como envoltorio de ese procedimiento almacenado y todo lo que se necesite, esto permite tener su propia lógica dentro de la API de .netTiers.
  • y mucho más.

Arquitectura de .netTiers
La arquitectura de .netTiers está basada en las guías de Microsoft patterns & practices, específicamente de: Designing Data Tier Components and Passing Data Through Tiers

Arquitectura Microsoft

Este concepto de capa de datos está compuesto por componentes de entidad del negocio personalizadas (que representan a los datos propiamente dichos), y componentes de lógica de acceso a datos (la lógica de persistencia).

Bases de datos y SQL
¿Cómo sabe .netTiers que generar? .netTiers utiliza el proveedor de metadata de CodeSmith que analiza una base de datos con el fin de crear un completo dominio de objetos, basado en las relaciones de la base de datos. El explorador de esquemas provee información sobre bases de datos, tablas, vistas, índices, procedimientos almacenados y más.

Buenas prácticas para diseñar bases de datos
En un mundo perfecto sería muy conveniente utilizar las siguientes recomendaciones para que la generación de código con .netTiers y CodeSmith sea óptima:

  • Los nombres de las tablas deben de estar en singular y en notación Pascal (primera letra de cada palabra compuesta en mayúsculas), ejemplo: Orden, DetalleOrden, Producto, etc.
  • Las descripciones para tablas, columnas y claves deben estar establecidas como atributos extendidos, para Microsoft SQL Server se utiliza la clave “MS_Description” para atributos extendidos.
  • .netTiers no asume relaciones, es necesario que se creen las relaciones de clave foránea a clave primaria específicamente en la base de datos.

Procedimientos almacenados personalizados
Existen muchos casos en los que se necesita extender la API de acceso a datos, sin perder las características de generación de la capa de datos. .netTiers ofrece la capacidad de escribir sus propios procedimientos almacenados, proporcionando la posibilidad de incrementar la funcionalidad que no ha sido generada automáticamente o las características que son especializadas de una aplicación en particular, un ejemplo sencillo sería el caso de necesitar la creación de un procedimiento almacenado personalizado para obtener un listado de productos con stock por debajo de un determinado límite. Cuando se inicia el proceso de generación, el explorador de esquemas de CodeSmith intenta descubrir toda la metadata para determinar el conjunto de resultados de un procedimiento almacenado así como también los parámetros que requiere tanto de entrada como de salida con sus respectivos tipos de datos, en base a esta información puede crear los métodos de las clases necesarias para realizar el mapeo.

Existen algunos casos en los que los procedimientos almacenados no retornan los resultados esperados, los procedimientos almacenados personalizados no funcionan cuando se utilizan tablas temporales dentro del procedimiento, esto se produce porque cuando el explorador de esquemas de CodeSmith está analizando la información no tiene los privilegios suficientes para crear las tablas temporales; una solución alternativa es utilizar variables de tabla en lugar de las tablas temporales.

Un detalle importante a tener en cuenta es que si queremos retornar entidades del dominio desde los procedimientos almacenados personalizados, necesitamos devolver en la consulta todos los datos de la tabla y en el orden correcto para que coincida con una entidad del dominio, cuando los resultados de un procedimiento almacenado personalizado no coincide con algún objeto entidad del dominio, se mapea como un DataSet genérico o como un objeto DataReader, lo cual es configurable.

Hasta aquí la parte introductoria de esta serie de artículos, en la que vimos una descripción un tanto más detallada de las bases de .netTiers, toda esta información fue obtenida de la documentación oficial de .netTiers que puede ser consultada en la siguiente dirección: .netTiers Documentation Wiki

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.