Firebird 2.5 Language Reference Beta Release 1

6 comentarios

Está disponible para su descarga el documento más completo escrito hasta la fecha sobre Firebird 2.5

Su nombre es: Firebird 2.5 Language Reference, Beta Release 1

Y puedes descargarlo desde este enlace:

http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/Firebird_Language_Reference_25EN.pdf

Inicialmente había sido escrito en idioma ruso, luego con la colaboración monetaria de mucha gente se consiguió traducirlo al inglés, que es la versión que ahora puedes descargar.

Sus autores son la crema y nata de los desarrolladores de Firebird, así que puedes estar 100% seguro de que todo lo que leas es correcto y es valioso. Estos son sus autores:

  • Dmitry Filippov
  • Alexander Karpeykin
  • Alexey Kovyazin
  • Dmitry Kuzmenko
  • Denis Simonov
  • Paul Vinkenoog
  • Dmitry Yemanov

El documento tiene 484 páginas así que podrás obtener mucho provecho de su lectura, sin dudas.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

 

Como saber si una tabla existe en una Base de Datos

5 comentarios

A veces puedes encontrarte con la necesidad de saber desde tu aplicación si una Base de Datos corresponde a lo que necesitas.

Por ejemplo, debes importar datos que se encuentran en la Base de Datos de nombre BaseAjena.FDB a tu propia Base de Datos.

Si tú harás esa tarea te resultará fácil comprobarlo, simplemente te conectas a BaseAjena.FDB y miras los nombres de sus tablas usando el programa ISQL.EXE o algún programa de administración gráfica. Ningún problema con eso.

Rápidamente sabrás si esa Base de Datos es correcta o no lo es.

Pero ¿y si no serás tú quien debe realizar el proceso de importación sino un usuario de tu aplicación?

Allí el asunto se complica, porque deberás asegurarte que la Base de Datos externa sea correcta.

Por ejemplo, en la computadora del usuario hay varias bases de datos de Firebird, con distintas finalidades y quizás creadas por distintas personas: Contabilidad, Facturación, Sueldos, etc.

Tú necesitas conectarte a una Base de Datos de Contabilidad, pero no conoces el nombre de esa Base de Datos. Así que le das al usuario la opción de seleccionar la Base de Datos. Pero ¿es una Base de Datos de Contabilidad o no lo es?

Una forma de comprobarlo es verificando los nombres de las tablas de la Base de Datos externa.

Por ejemplo, si la única Base de Datos que tiene una tabla cuyo nombre es ASIENTOSCAB es la Base de Datos contable entonces puedes tener la certeza de que se trata de la Base de Datos adecuada.

Listado 1.

SELECT
   RDB$RELATION_NAME AS NombreTabla
FROM
   RDB$RELATIONS
WHERE
   RDB$RELATION_NAME = 'ASIENTOSCAB'

Si al ejecutar el Listado 1. obtienes que NombreTabla es igual a ASIENTOSCAB entonces ya sabes que la Base de Datos es la correcta. Desde luego que en algunos casos podrías necesitar verificar el nombre de varias tablas para asegurarte bien.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

 

Agrupando por una columna … y viendo todas las demás columnas

Deja un comentario

Como seguramente ya sabes, puedes usar la cláusula GROUP BY para agrupar filas de una tabla. Todo bien hasta ahí pero pronto descubrirás que a veces te encuentras con un problema … en tu SELECT solamente puedes ver las columnas que has agrupado.

Ejemplo: Tenemos una tabla llamada VENTASCAB (cabecera de ventas) que tiene los siguientes datos:

AGRUPAR1

Captura 1. Si haces clic en la imagen la verás más grande

Queremos ver sus columnas VTC_NRODOC, VTC_FECHAX, VTC_IDECLI y VTC_TOTALX pero solamente cuando la fecha está repetida. En otras palabras, si en una fecha se hicieron dos o más ventas queremos ver esas filas; si se hizo una sola venta, no queremos ver.

Listado 1. (no funcionará)

SELECT
   VTC_NRODOC,
   VTC_FECHAX,
   VTC_IDECLI,
   VTC_TOTALX
FROM
   VENTASCAB
GROUP BY
   VTC_NRODOC,
   VTC_FECHAX,
   VTC_IDECLI,
   VTC_TOTALX
HAVING
   COUNT(*) >= 2

Si ejecutamos el Listado 1. no obtendremos ni siquiera una fila. ¿Por qué no? porque estamos agrupando por VTC_NRODOC y el contenido de esa columna nunca se repite.

Listado 2. (no funcionará)

SELECT
   VTC_FECHAX
FROM
   VENTASCAB
GROUP BY
   VTC_FECHAX
HAVING
   COUNT(*) >= 2

Si ejecutamos el Listado 2. obtendremos la Captura 2. pero … no es lo que estamos necesitando.

AGRUPAR2

Captura 2. Si haces clic en la imagen la verás más grande

En la Captura 2. hemos agrupado por fechas que se repiten 2 ó más veces pero no podemos ver las columnas VTC_NRODOC, VTC_IDECLI, y VTC_TOTALX, y queremos verlas, entonces ¿cómo lo conseguimos?

Usando una gran construcción del Firebird que es la subconsulta filtrada. O sea, una subconsulta que se utiliza en la cláusula WHERE.

Listado 3. (Sí funcionará)

SELECT
   VTC_NRODOC,
   VTC_FECHAX,
   VTC_IDECLI,
   VTC_TOTALX
FROM
   VENTASCAB
WHERE
   VTC_FECHAX IN (SELECT
                     VTC_FECHAX
                  FROM
                     VENTASCAB
                  GROUP BY
                     VTC_FECHAX
                  HAVING
                     COUNT(*) >= 2)

Si ejecutamos el Listado 3. obtendremos la Captura 3. que nos mostrará exactamente lo que estábamos necesitando.

AGRUPAR3

Captura 3. Si haces clic en la imagen la verás más grande

O sea que si la fecha está repetida, queremos ver los datos de cada una de las ventas realizadas en esa fecha.

Si te fijas, notarás que la subconsulta del Listado 3. es igual a la consulta del Listado 2. ¿Qué estamos pidiendo en el Listado 3.? Que nos muestre las filas de la tabla VENTASCAB cuyas fechas se obtengan de la subconsulta. O sea, las fechas mostradas en la Captura 2. Por lo tanto, solamente si una fecha se encuentra en la Captura 2. esa fila será mostrada.

Conclusión:

Una subconsulta filtrada puede ser extremadamente útil en muchas circunstancias y debemos aprender a utilizarla. Lo que hacemos con ella es filtrar a una tabla o una vista para que solamente se utilicen las filas que cumplen con la condición que le imponemos.

Como en nuestro ejemplo la fecha debe estar repetida entonces debemos filtrar usando la columna de fecha (VTC_FECHAX se llama en esta tabla). Desde luego que podemos filtrar por cualquier otra columna, siempre y cuando tenga valores repetidos esta técnica funcionará.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

 

Extrayendo caracteres del WHERE

Deja un comentario

Lo correcto es no guardar en las tablas los datos con cualquier formato, sino guardarlos solamente con el formato que previamente hemos establecido.

Sin embargo a veces podríamos encontrarnos con la situación de que el formato es desconocido.

Ejemplo:

Un usuario podría escribir: 123-456-789

Otro usuario podría escribir: 1-23-456-7-89

Otro usuario podría escribir: 12-345678-9

Otro usuario podría escribir: 123456789

Entonces, ¿qué condición de filtro debemos escribir en el SELECT para que sea cual sea el formato podamos obtener el dato que nos interesa?

Listado 1.

SELECT
   *
FROM
   MiTabla
WHERE
   REPLACE(MiColumna, '-', '') = 'MiValorBuscado'

Comentario 1:

Aunque como hemos visto podemos escribir un SELECT que nos muestre todas las filas que tienen el valor buscado, hay un error intrínseco de diseño porque estamos permitiendo que los usuarios ingresen los datos como se les antoja, eso no debería ser así.

Para estos casos una posibilidad es tener un trigger BEFORE INSERT OR UPDATE que se encargue de extraer los guiones antes de guardar la fila en la tabla, algo como:

Listado 2.


New.MiColumna = REPLACE(New.MiColumna, '-', '')

Comentario 2:

Aunque el Listado 1. funcionará bien y nos mostrará lo que deseamos ver, si la tabla es muy grande puede llegar a ser muy lento, demorarse una eternidad. ¿Por qué? Porque no se usará un índice y reemplazar un carácter por otro no es instantáneo. Por ese motivo es preferible guardar la columna sin los guiones, como se muestra en el Listado 2. Pero … ¿y si necesitamos a veces mostrarle al usuario la columna exactamente igual a cómo él la había escrito?

Una solución es agregarle una columna a la tabla, y entonces tendremos dos columnas:

Una columna, para guardar en ella lo que escribió el usuario

Otra columna, para guardar en ella lo que escribió el usuario pero sin los guiones

Esta segunda columna podríamos obtenerla mediante un trigger similar al del Listado 2. o mediante una columna computada, algo como:

Listado 3.


MiColumnaEditada COMPUTED BY (REPLACE(New.MiColumna, '-', ''))

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

 

Obteniendo las ventas realizadas la semana pasada

Deja un comentario

Supongamos que tienes una tabla de ventas y deseas conocer ¿cuáles fueron las ventas realizadas la semana pasada?

Puedes obtener la respuesta con un SELECT similar al siguiente:

Listado 1:

SELECT
   *
FROM
   MiTabla
WHERE
   MiColumnaFecha BETWEEN CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE) - 6 AND
CURRENT_DATE - EXTRACT(WEEKDAY FROM CURRENT_DATE)
ORDER BY
   MiColumnaFecha

En el Listado 1. se supone que las semanas empiezan los días Lunes, si necesitas que empiecen los días Domingo entonces a la primera fecha del BETWEEN deberías restarle 7 (y no 6) y a la segunda fecha deberías restarle 1.
Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21