viernes, 30 de diciembre de 2011

Acceder a las propiedades de una columna de un modelo de Entity Framework con Visual Studio 2010 si sólo usas teclado

¿Qué pasa si eres ciego y quieres o necesitas utilizar un ordenador?

La mayoría de los usarios de informática no pensamos en lo que seríamos capaces de hacer si nos quitaran la pantalla. Y cuando nos quitan la pantalla, automáticamente podemos asumir que nos han quitado el ratón, porque no vemos el puntero.

Pues las personas ciegas se encuentran en esa situación, y para poder utilizar un ordenador recurren a lo que se denominan ayudas técnicas. En concreto, las ayudas técnicas para que los usuarios ciegos puedan utilizar el ordenador son los lectores de pantalla. El usuario se mueve por los distintos elementos de la pantalla (ventanas, botones, textos, listas, enlaces...) utilizando el teclado, y el lector de pantalla se encarga de ir "cantando" qué es cada elemento y el texto, que acción produce, etc.

Hay varios lectores de pantalla, pero en España la gran mayoría de los usuarios de Windows utilizan  JAWS, de la empresa Freedom Scientific. Otro lector de pantalla utilizado es un proyecto open source, NVDA. Normalmente, al menos en el entorno de mis compañeros de trabajo, se utiliza JAWS, y cuando se tienen dificultades para acceder a algún elemento utilizando este lector, se cambia a NVDA y se intenta realizar la tarea, pero no siempre se consigue. Además, el cambio de un lector a otro es como poco bastante molesto, porque mientras se cambia de lector no se dispone de soporte de voz.

Uno de mis compañeros trabaja habitualmente con Visual Studio 2010, y a veces se encuentra con elementos del IDE a los que no se llega fácilmente con teclado y JAWS. Cuando pasa esto, para evitar el cambio a NVDA,  intentamos buscar una forma alternativa para que llegue desde teclado a lo que nosotros hacemos con ratón de forma intuitiva.

En este caso, el problema es para acceder a las propiedades de una propiedad en una entidad de un modelo de Entity Framework. Los que usamos la pantalla y el ratón, lo haríamos simplemente abriendo el modelo de entidades en el diseñador, y haríamos clic en la propiedad que deseamos modificar. Al hacerlo, automáticamente se nos mostraría en la ventana de propiedades, si la tenemos visible. Si no la tenemos visible (la hemos cerrado o está configurada como auto-ocultar, o está organizada con otras ventans de forma que no se muestra automáticamente), con pulsar F4 se mostraría. También lo podríamos hacer con un clic del botón derecho del ratón, y desde el menú contextual podríamos acceder a ellas.

Si se abre el modelo de entidades y se intenta navegar con él con tab y teclado no se puede llegar directamente a las propiedades de una entidad, porque al usar las teclas, lo que pasa es que se mueven las entidades en el diseñador, pero no se llega a las propiedades.

Para poder acceder al modelo de entidades sin necesidad de usar el diseñador, se debe utilizar el "Entity Data Model Browser". Para abrirlo, se hace a través del menú principal de Visual Studio: View -> Other windows -> Entity Data Model Browser. En esta ventana se puede navegar por un árbol que contiene todas las entidades y sus propiedades, así como el esquema de la base de datos y las propiedades de las tablas y columnas. Si se quiere acceder directamente a la entidad desde el diseñador, una vez que tenemos seleccionada la entidad, se saca el menú contextual, y desde ahí se puede acceder al Model Browser, ya posicionados en la entidad.

lunes, 21 de noviembre de 2011

Entity Framework 4 con SQL Server 2000

A dia de hoy aún quedan sistemas basados en SQL Server 2000, para los que una migración a versiones 2005 o 2008 no es posible. Bien porque no se dispone de hardware y/o software necesario, o porque hay funcionalidad basada en paquetes DTS que no se puede migrar debido al coste de desarrollo que implica.

En mi tabajo tenemos una base de datos para controlar las horas de dedicación del personal a los distintos proyectos, que en el entorno de desarrollo se tiene en un SQL Server 2005, pero en el servidor de producción está aún en 2000.

Cuando se planteó realizar cienta nueva funcionalidad sobre esta base de datos, ni cortos ni perezosos nos metimos a hacerlo con VS 2010 y EF 4. En el entorno de desarrollo todo fue miel sobre hojuelas, pero cuando lo pasamos a producción nos encontramos con este hermoso error:

"An error occurred while executing the command definition. See the inner exception for details."

Mirando la excepción original, y usando intellitrace, nos encontramos con que EF 4 genera código SQL que no es válido para SQL Server 2000. En concreto, esta sentencia de LINQ:


Usuario primer = (from Usuario u in ctx.Usuarios 
                  orderby u.NomUsu 
                  select u).FirstOrDefault();


Genera la siguiente sentencia SQL:

SELECT TOP (1) 
[Extent1].[IDUsu] AS [IDUsu], 
[Extent1].[NomUsu] AS [NomUsu], 
.
.
.
FROM (SELECT 
[Usuario].[IDUsu] AS [IDUsu], 
.
.
.
FROM [dbo].[Usuario] AS [Usuario]) AS [Extent1]
ORDER BY [Extent1].[NomUsu] ASC


En concreto, el problema de esta sentencia es la forma en la que se ha generado el "top", ya que usa paréntesis, y en sql server 2005 si es válida, pero en sql 2000 debe realizarse sin paréntesis:


SELECT TOP 1...


Parece que lo tenemos mal, porque sin los métodos First() o FirstOrDefault() las sentencias de LINQ se complican, ya que habría que recuperar colecciones completas. Y no hablemos de las paginaciones, ya que este mismo problema se produce con el método Take().

¿Cómo se puede solucinar este problema? Pues Microsoft no da soporte de SQL Server 2000 en las herramientas de EF 4 (el diseñador, por ejemplo), pero el runtime si que tiene soporte de SQL 2000. Para hacer que nuestro modelo de entidades genere código válido para SQL 2000 tenemos que cambiar el XML del fichero edmx. Para ello, en VS 2010 hacemos clic con el botón derecho en el fichero edmx, y elegimos "Open with..." y "XML (Text) Editor". Esto abrirá el fichero como si de cualquier XML se tratara. Buscamos el elemento "edmx:Runtime", dentro de este, el "edmx:StorageModels", y dentro de este, el elemento "Schema". En este elemento, buscamos el atributo "ProviderManifestToken", y cambiamos su valor, que será 2005 o 2008 en función de la versión que usemos en desarrollo, a "2000". Quedaría algo así:


<Schema Namespace="DSTTSModel.Store" Alias="Self" 
Provider="System.Data.SqlClient" ProviderManifestToken="2000" 
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">



¡Voilá! Si compilamos y ejecutamos ya no nos aparece el error en tiempo de ejecución.

Esto no quiere decir que TODO lo que se puede hacer con LINQ + EF 4 se pueda hacer en SQL Server 2000, pero hemos salvado el primer escollo, y no uno pequeño.

A cosica hecha


Si tienes que buscar una nueva dirección de correo electrónico en gmail, o tienes que elegir un gamertag para tu cuenta XBOX Live, o tienes que elegir un título y su correspondiente dominio para un blog, estás perdido. Está todo reservado. Si haces caso a las recomendaciones que te hacen los sistemas de registro, acabas valorando muy seriamente la posiblidad de disfrutar de una dirección de correo que utilice 1337 5p34k.

Cuando me puse a buscar un nombre para el blog, me acordé del amplio espectro de palabras originarias de Murcia que utilizan mis padres, y algunas de las cuales han pasado a mi vocabulario. Y me dije, ¿habrá algo divertido para poner en el blog?

Buscando, buscando, me encontré con el Palabrero Calasparreño. Una recopilación de palabras y expresiones habituales en este pueblo de Murcia, muchas de las cuales se utilizan también en el resto de la comunidad autónoma. Recomiendo su lectura a los que, como yo, tienen familiares nacidos en esta región. En mi caso, me ha arrancado alguna que otra sonrisa, y por qué no, algún recuerdo de la infancia.

Entre todas las expresiones de este diccionario, nos encontramos "A cosica hecha", con su correspondiente definición: "Hacer algo a cosica hecha es hacerlo a propósito, con premeditación".

Y aunque sé que no actualizaré el blog con la frecuencia deseada, e incluso es posible que muera con tan solo un par de entradas en él, yo me pongo a ello "a cosica hecha".