| Artículos | 01 MAR 1998

Programar un Asistente de consultas SQL

Tags: Histórico
David R. Vidal.

La implantación de SQL en la informática ha sido definitiva, pero la fama de su sencillez parece no haber cuajado en un gran número de usuarios, necesitados de métodos más sencillos para definir consultas.

Las herramientas que permiten desarrollos rápidos y visuales (RAD), por ejemplo, MS Visual Basic o Borland Delphi, permiten crear en nuestros programas formularios de entrada de datos y búsquedas simples, pero ¿qué pasa cuando el usuario pide buscar información por cualquier campo? ¿cuando la respuesta ha de estar ordenada o agrupada? ¿cuándo la selección implica una expresión donde intervienen varios campos, en ocasiones de distintas entidades?.

No nos preocupemos, no es necesario hacer grandes excesos en la programación debido a que ya hace bastante tiempo que nació el SQL (Structured Query Language) con el fin nada desdeñable de obtener un lenguaje estándar de acceso a las bases de datos relacionales (RDBMS) independiente de la plataforma sobre las que estén construidas. Numerosas aplicaciones comerciales dan la posibilidad de diseñar consultas (aunque también es posible realizar modificaciones en la información, no suelen ser necesarias en los programas, dado que existen otros métodos), las cuales se pueden realizar de dos formas: introduciendo la consulta en el propio lenguaje SQL o bien utilizar un asistente, nombre dado a una utilidad donde establecemos de forma simple y visual los campos y las expresiones que nos van a servir para hacer una selección de información.

El problema

Vamos a poner un ejemplo que sirva de referencia y nos ayude a comprender mejor los problemas y soluciones que nos vamos a encontrar. Suponga que tenemos una base de datos de una agenda con cuatro entidades: personas (DNI, nombre, apellidos y sexo), teléfonos (DNI y teléfono), direcciones (DNI, código de provincia y dirección) y provincias (código de provincia, provincia). Evidentemente, en las tres primeras el campo DNI hace de clave y relaciona a todas ellas. Una persona puede tener un número ilimitado de teléfonos y direcciones.

El programador de Visual Basic o Borland Delphi puede adoptar entonces una solución inmediata, que no le llevará más de unos minutos... un objeto Query al que se le pasa una cadena que contiene una expresión SQL, la cual puede ser obtenida de un objeto visual a modo de caja de edición donde el usuario teclea libremente la consulta. Una vez procesada la misma por el objeto Query, se mostrará en algún control a modo de grid el resultado. Algún usuario no habrá oído hablar nunca de SQL y no sabrán qué escribir. Pero si conoce el lenguaje SQL, todavía necesitará saber cuántos campos hay, cómo los hemos llamado, cómo hemos llamado a las entidades y las relaciones que existen entre ellas. O sea, que casi necesita saber tanto como nosotros sobre nuestro programa.

En un alarde de presunción sobre los elevados conocimientos del usuario, si suponemos que conoce la estructura de la base de datos, ¿podría finalmente hacer la consulta?. No del todo, pues necesita saber la forma en que se han podido codificar ciertos campos. Por ejemplo, en el campo 'Sexo' podríamos poner una 'H' a los hombres y una 'M' a las mujeres, o tal vez 'V' para los hombres (acrónimo de varón), o incluso 'M' a los hombres y 'H' a las mujeres (machos y hembras), o números (cero y uno), etc...

El objetivo del asistente será ayudar al usuario a construir la expresión de consulta, quedando invariable la idea de enviar dicha expresión al objeto Query y la presentación del resultado.

SQL

Los orígenes del lenguaje SQL se remontan a la comercialización por parte de IBM de la sucesión del SEQUEL (Structured English QUEry Language), desarrollado inicialmente como un lenguaje de investigación. Recordemos que la forma de obtener información de una base de datos relacional es la realización de una consulta (query) que no es más que una proyección donde se efectúa la extracción de columnas especificadas de una relación, eliminando posteriormente los duplicados. A pesar de que existe un estándar (el ANSI-89 nivel 1, o el ANSI-92 SQL) prácticamente ninguna adaptación lo sigue con exactitud, debido a que ciertas cláusulas no están implementadas y algunas otras que sí lo están no aparecen en el estándar. Con todo, en un 90% podemos hablar de compatibilidad absoluta, sobre todo en lo referente a los comandos básicos. Como advertencia para los usuarios de Microsoft (MS Jet SQL), existe una diferencia particularmente molesta (y difícilmente explicable) referente al operador LIKE (que luego veremos) el cual utiliza los comodines '*' y '?' en vez de los normales del ANSI, que son '%' y '_' respectivamente.

Aunque este no es el lugar adecuado para un curso de SQL, sí vamos a recordar las cuatro sentencias y cláusulas básicas, lo que no excluye al lector interesado en desarrollar un asistente la lectura pormenorizada de la documentación propia de su entorno de desarrollo. En primer lugar, la consulta típica se comienza con la sentencia SELECT, o mejor dicho SELECT DISTINCT para eliminar duplicados. A continuación se indican los campos (también llamados atributos o columnas de la tabla) que van a aparecer en el resultado. Finalmente hay que indicar la procedencia de estos campos, es decir la entidad que los contiene, para lo cual se emplea FROM. En nuestro ejemplo, la expresión SELECT nombre, apellidos FROM personas tendrá como resultado una lista de nombres y apellidos de personas.

La cláusula WHERE es de vital importancia y nos permite tanto seleccionar subconjuntos como enlazar entidades, especificando los criterios de la selección. En el primer caso, supongamos que queremos hacer una selección en la lista de forma que el nombre deba de ser 'David'. La respuesta es SELECT nombre, apellidos FROM personas WHERE nombre='David'. En el segundo caso, supongamos que además de mostrar el nombre y el apellido, también precisamos el teléfono: SELECT personas.nombre, personas.apellidos, telefonos.telefono FROM personas,telefonos WHERE personas.dni=telefonos.dni.

En la selección podemos usar los típicos operadores booleanos AND, OR, NOT, con lo que, uniendo ambos supuestos (mostrar teléfonos y seleccionar el nombre) podemos construir la siguiente expresión: SELECT personas.nombre, personas.apellidos, telefonos.telefono FROM personas, telefonos WHERE personas.dni=telefonos.dni AND personas.nombre='David'.

Para terminar, vamos a mencionar otra cláusula fundamental que sirve para ordenar el resultado: ORDER BY. Al aplicarla, el resultado aparecerá ordenado de la forma indicada. Por ejemplo, si a la anterior expresión añadimos a continuación ORDER BY personas.apellidos, personas.nombre el resultado se mostrará ordenado primero por apellidos y luego por el nombre.

Primeros pasos

Con lo que sabemos, ya estamos en condiciones de dar unas directrices sobre la construcción del asistente. Los ejemplos que vamos a mostrar están referidos a fragmentos de código basados en la herramienta de desarrollo Borland Delphi. Lo primero ha de ser un control, ya sea una caja de lista o similar donde incluir todos los campos que van a estar disponibles para la consulta. El usuario no tiene porqué saber nada sobre las relaciones de la base de datos, razón que nos obliga a enumerar todos los campos, como si se tratase de un fichero plano.

Internamente, el asistente debería saber muchas más cosas sobre cada campo. Típicamente, la información más útil residirá, aparte del nombre, en el título (texto descriptivo para el usuario), en el tipo de dato y en la entidad en que aparece.

Aunque el tipo de dato puede obtenerlo de la base de datos, en ocasiones resulta mucho más sencillo el indicárselo directamente, puesto que es necesario hacer una simplificación y resumir los posibles tipos a tres: numérico, cadena o fecha.

En el listado de la figura 1 tenemos las

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información