Está en la página 1de 58

Walter R.

Ojeda Valiente Visual FoxPro y Firebird SQL

Visual FoxPro y Firebird SQL


ndice
Introduccin...............................................

PARTE 1: Cliente/Servidor..................................
Servidores de archivos compartidos y Cliente/Servidor...
Sistemas Cliente/Servidor...............................
Como funciona Cliente/Servidor..........................
Cuales son las ventajas de usar Cliente/Servidor?......
Como mostrar los datos al usuario.......................
Manera eficiente de enviar/recibir datos del Servidor...
Claves primarias........................................
Relaciones..............................................
Concurrencia............................................
Transacciones...........................................
Diferencia de terminologa..............................

5
5
5
6
6
7
7
9
9
9
10
10

PARTE 2: Firebird..........................................
Qu es Firebird?.......................................
Tipos de Servidor.......................................
Recursos utilizados.....................................
Plataformas y versiones para el Servidor................
Plataformas y versiones para el Cliente.................
Caractersticas principales de Firebird.................
Conectividad............................................
Herramientas............................................
Instalando el Servidor..................................
Instalando el Cliente...................................
Instalando el driver ODBC...............................
Verificando la instalacin..............................
El archivo HOST.........................................
El archivo ALIASES.CONF.................................
El archivo FIREBIRD.CONF................................
El archivo SECURITY2.FDB................................
Como evitar la corrupcin de las Bases de Datos.........
Como corromper una Base de Datos........................
Dialectos SQL (SQL dialect).............................
Tamao de la pgina (page size).........................
Conjunto de caracteres (character set)..................
Scripts.................................................
El usuario SYSDBA.......................................
Agregando nuevos usuarios...........................
Borrando usuarios...................................
Listando todos los usuarios.........................
Cambiando la contrasea de un usuario...............
Nombres de los usuarios.............................
Contraseas (passwords) de los usuarios.............
Como proteger las Bases de Datos........................

11
11
11
11
12
12
12
13
14
14
14
15
15
16
16
17
17
17
17
18
18
18
19
20
21
21
21
22
22
22
22

-1-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Privilegios de acceso a una Base de Datos...............
Privilegios.........................................
Privilegios sobre columnas (campos).................
Ejemplos............................................
Roles...................................................
Creando un rol......................................
Eliminando un rol...................................
Ejemplos............................................
Comandos del Firebird ms utilizados....................
Crear una Base de Datos.............................
Conectarse a una Base de Datos......................
Crear un dominio....................................
Ver los dominios existentes.........................
Ver la estructura de un dominio.....................
Crear una tabla.....................................
Borrar una tabla de la Base de Datos................
Ver todas las tablas de una Base de Datos...........
Ver la estructura de una tabla......................
Agregarle una clave primaria a una tabla............
Agregarle una columna a una tabla...................
Borrar una columna de una tabla.....................
Agregarle filas a una tabla.........................
Borrar algunas filas de una tabla...................
Borrar todas las filas de una tabla.................
Modificar columnas de una tabla.....................
Consultar las filas de una tabla....................
Consultar las filas cuando se conoce una subcadena..
Consultar solamente los que no estn repetidos......
Consultar los datos ordenadamente...................
Contar la cantidad de filas de una tabla............
Sumar una columna numrica..........................
Hallar el promedio de una columna numrica..........
Hallar el valor mnimo de una columna numrica......
Hallar el valor mximo de una columna numrica......
Agrupar filas.......................................
Ponerles condiciones a las filas agrupadas..........
Relacionar dos tablas...............................
Ordenar una tabla...................................
El programa ISQL.EXE....................................
El programa GBAK.EXE....................................
Ejemplo 1...........................................
Ejemplo 2...........................................
El programa NBACKUP.EXE.................................
Para hacer un backup completo.......................
Para hacer un backup incremental....................
Para restaurar un backup completo...................
Para restaurar un backup incremental................
Usando SQL Manager......................................
Por qu usar un administrador grfico?.............
La Base de Datos Employee...........................
Registrando una Base de Datos.......................
Qu son los dominios?..............................
Cmo se crea un nuevo dominio?.....................
Qu son las tablas?................................
Qu son las vistas?................................
Qu son los procedimientos almacenados?............

-2-

22
23
23
23
24
24
24
24
25
25
25
25
25
25
26
26
26
26
26
26
26
26
26
26
26
27
27
27
27
27
27
27
27
27
27
27
28
28
28
29
30
30
30
31
31
31
31
32
32
32
32
34
35
36
37
37

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Qu son las UDFs?..................................
Qu son los desencadenantes?.......................
Qu son las excepciones?...........................
Qu son los generadores?...........................
Para qu se usa SET TERM?..........................
Cundo se usan los : delante del nombre de una
Variable?...........................................
Integridad Referencial..................................
La restriccin foreign key..........................
Indices.................................................
Transacciones...........................................
Por qu se usan las transacciones?.................
Una transaccin, muchos pedidos.....................
Transacciones y MGA.................................
Grabacin de datos..................................
Datos desechados....................................
Problemas con transacciones.........................
Solucin a los problemas............................

41
42
42
44
45
45
46
46
46
47
48
48

PARTE 3: Visual FoxPro y Firebird..........................


Qu es DSN?............................................
Para crear un DSN...................................
Para conectarse sin DSN.............................
Una clase para usar con Bases de Datos SQL..............
Funcin para conectarse a una BD usando DSN.........
Funcin para conectarse a una BD sin usar DSN.......
Funcin para desconectarse de una (o todas) BD SQL..
Procedimiento para hallar el nombre del driver......
Funcin para ejecutar comandos SQL..................
Funcin para verificar si hay una conexin activa...
Descargar las clases................................
Programas en Visual FoxPro que usan Firebird............
Ejemplo N 1. Usando la instruccin SELECT..........
Ejemplo N 2. Una pequea aplicacin administrativa.

49
49
50
50
50
51
52
52
52
53
54
54
54
54
56

Conclusin.................................................

58

-3-

38
39
40
40
41

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Visual FoxPro y Firebird SQL


Introduccin
Por qu usar Firebird con Visual FoxPro? Por qu Firebird gusta tanto?
Responder a esas preguntas es el objetivo de este documento. Para conseguirlo se
debe empezar desde el principio, es decir desde lo que es Cliente/Servidor, las
caractersticas de Firebird y como integrarlo con Visual FoxPro. Para que todo sea ms
fcil de entender, este documento se divide en tres partes:
1. Cliente/Servidor. Donde se explican algunos conceptos bsicos
2. Firebird. Donde se explican sus principales caractersticas
3. Visual FoxPro y Firebird. Donde se explica como usarlos juntos
Visual FoxPro es un lenguaje fantstico, tiene muchsimas capacidades de las cuales
carecen otros lenguajes, se pueden realizar aplicaciones realmente muy buenas
usndolo, es ms, resulta prcticamente imposible pensar en una aplicacin del tipo
administrativo o comercial que no pueda ser realizada exitosamente y en poco tiempo
con l.
Firebird es un motor de bases de datos SQL muy liviano, muy poderoso, muy fcil
de usar y totalmente gratis tanto para uso privado como comercial. Y se lo puede
integrar perfectamente con Visual Foxpro.
Por lo tanto, es muy lgico que estos dos colosos trabajen juntos. Sin embargo, hasta
este momento no haba literatura al respecto, quienes usaron Visual Foxpro con Firebird
estn ms que conformes con el rendimiento obtenido pero todo lo tuvieron que
aprender desde cero. Cuando finalices de leer este documento te habrs ahorrado un
montn de tiempo.
En este documento se supone que ya has programado en Visual FoxPro y lo conoces
ms o menos bien. Est orientado a ensearte las diferencias que tiene con el Firebird,
las caractersticas de este ltimo y como hacerlos trabajar conjuntamente.

-4-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Parte 1. Cliente/Servidor
Servidores de archivos compartidos y Cliente/Servidor
Mediante el uso de servidores de archivos compartidos es como Visual FoxPro,
Clipper, DBase, Paradox, Access y otros lenguajes manejan los datos. En este caso el
servidor de archivos es una caracterstica del Sistema Operativo, no del lenguaje. Es el
Windows quien te da acceso a los archivos que estn en una carpeta compartida. Un
programa que se encuentra en otra computadora de la red lee esos archivos en la
memoria de su propia computadora y graba datos en ellos como si estuvieran en su
disco local. El gran problema con este aprovechamiento es la fragilidad de los datos,
que pueden daarse o corromperse. Es bastante frecuente encontrarse con tablas o
ndices daados. Un corte de la energa elctrica o un reset en cualquiera de las
computadoras de la red puede corromper las tablas o los ndices. Adems, como las
carpetas son compartidas algunos humanos (por intencin o por ignorancia) pueden
borrar o modificar los archivos que en ellas se encuentran.
En cambio en un sistema Cliente/Servidor los clientes (aunque estn localizados
en la misma computadora que el Servidor) nunca tocan los datos directamente, sino que
envan mensajes al Servidor dicindole lo que quieren hacer. El Servidor procesa esos
mensajes y ejecuta los pedidos usando su propio cdigo y administrando el espacio en
el disco duro, en forma independiente del Sistema Operativo. Un humano que est
sentado frente a otra computadora de la red y que tuviera la (mala) intencin de
modificar una Base de Datos necesitar conocer:
el nombre de la computadora donde se encuentra la Base de Datos
el motor utilizado (Firebird, Postgre, MySQL, etc.)
la carpeta donde se encuentra la Base de Datos
el nombre de la Base de Datos
el nombre de un usuario de esa Base de Datos
la contrasea de ese usuario
algunos conocimientos de programacin para poder conectarse a ella
En un sistema de archivos compartidos, es muy fcil que cualquiera consiga acceso
a la carpeta compartida y a partir de all ya puede borrar o modificar todas las tablas y
eso es un peligro potencial muy grave!!!

Sistemas Cliente/Servidor
Un sistema Cliente/Servidor (tal como Firebird) est compuesto por dos
mdulos de software diseados para comunicarse entre s usando el mismo protocolo de
comunicacin. El Cliente enva mensajes al Servidor pidindole algo y ste responde al
pedido. Inclusive pueden estar en distintos Sistemas Operativos, por ejemplo el Servidor
en una computadora con Linux y el Cliente en una computadora con Windows. El
protocolo recomendado para usar con Firebird es TCP/IP.

-5-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Como funciona Cliente/Servidor


-

Un programa llamado Servidor se instala en una computadora. Su misin es


escuchar los mensajes que llegan a un puerto de esa computadora (el puerto
por defecto para Firebird es el 3050) y luego insertar / borrar / modificar / enviar
/ procesar los datos pedidos y enviar la respuesta correspondiente.
Otro programa, llamado Cliente, se instala en otra computadora (o en la misma).
Su misin es recibir pedidos de la aplicacin (Contabilidad, Ventas, Sueldos,
etc.) y enviar esos pedidos al Servidor y recibir los datos que ste le provee para
devolverlos a la aplicacin. Pero esos datos son una imagen, una copia, de los
datos que se encuentran en el Servidor.

Este es un concepto que se debe entender muy bien: los datos que recibe el
Cliente (y que luego enva a la aplicacin) son una copia de los datos del Servidor.
En cambio en un sistema de archivos compartidos (el utilizado por las tablas .DBF)
son los datos originales, no una copia, los que utilizan las aplicaciones.
En Firebird:
La APLICACIN enva un pedido al CLIENTE quien lo enva al SERVIDOR
El SERVIDOR enva la respuesta al CLIENTE quien la enva a la APLICACIN
La aplicacin puede ser un sistema de Contabilidad, de Facturacin, de Sueldos, etc.

APLICACIN
(Contabilidad,
Facturacin,
Sueldos,
Tesorera, etc.)

Pedido

Respuesta

Pedido
CLIENTE

Respuesta

SERVIDOR

Cuales son las ventajas de usar Cliente/Servidor?


-

Mayor seguridad. La Base de Datos se encuentra en una computadora a la cual


los usuarios de otras computadoras de la red no pueden acceder. Recuerda que
no hay carpetas compartidas. Adems, cada Base de Datos tiene sus propios
mecanismos de seguridad, para usarla hay que especificar el nombre del usuario
y la contrasea. Inclusive a los usuarios se los puede agrupar en roles con lo
cual se determina qu pueden hacer y que no.
Mayor rapidez. Los datos que viajan por la red son pocos, eso incrementa la
velocidad. Aunque los usuarios sean muchos, el trfico por la red siempre es
mucho menor que usando un sistema de archivos compartidos (tablas .DBF) que
tenga la misma cantidad de usuarios.

-6-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


-

Consistencia de los datos. O se graban todos los datos o no se graba ninguno.


En un sistema de archivos compartidos (tablas .DBF) podra darse el siguiente
caso: se graba una fila (registro) en la tabla cabecera, mientras se estn grabando
las filas (registros) de la tabla de detalles se interrumpe la energa elctrica.
Cul es la consecuencia? Que el movimiento (o transaccin) est incompleto.
Algo as no puede suceder en Firebird porque los datos: o se graban todos o no
se graba ninguno. Jams pueden estar incompletos.
Acceso a travs de Internet o redes WAN. Como los datos que viajan son
pocos, hacer aplicaciones que enven/reciban datos a travs de Internet o de una
red WAN es eficiente.
Independencia del lenguaje. Si ya no quieres programar en Visual FoxPro y
prefieres hacerlo en Java, Visual Basic, Delphi o cualquier otro lenguaje, no hay
problema. Dentro de la Base de Datos nada cambiar.

Como mostrar los datos al usuario


Cuando se utilizan tablas .DBF es comn que el programa de ABM tenga los
botones Primero, Anterior, Siguiente, Ultimo. Inclusive es comn mostrar
muchos datos en una grilla para que el usuario pueda navegar a travs de ella. En una
aplicacin Cliente/Servidor eso es considerado mala prctica. Por qu? porque se
satura la red. En el caso de las grillas se considera que mostrar hasta 200 filas (registros)
en ellas est dentro de lo aceptable, nunca ms. Nunca. Si el usuario necesita ver ms
filas (registros) entonces debe hacer click en un botn para que se le muestren las
siguientes (o anteriores) 200 filas (registros). Lo normal en las buenas aplicaciones
Cliente/Servidor es que la interfaz sea de bsqueda (el usuario escribe lo que necesita y
slo eso se le muestra).

Manera eficiente de enviar/recibir datos del Servidor


La filosofa detrs de Cliente/Servidor es que el trfico en la red sea el mnimo
posible. Ni un byte ms de lo estrictamente necesario. Tanto en un sentido (del Cliente
al Servidor) como en el otro (del Servidor al Cliente). Por lo tanto:
Todo lo que puede procesarse en la aplicacin se debe procesar en la

aplicacin
Los procesos que requieren acceso a las tablas deben realizarse en el
Servidor, nunca en la aplicacin

Un ejemplo: una aplicacin enva una peticin de consulta al Servidor para que
devuelva un cursor (un cursor es una tabla temporal) con las ventas realizadas entre dos
fechas. En el Servidor se descubre que una de las fechas estaba vaca. Eso es un error de
concepto. Por qu? porque esa verificacin pudo haberse realizado en la aplicacin, la
peticin de consulta viaj por la red y el mensaje de error tambin. O sea, hubo un
trfico innecesario en la red, lo cual la hace ms lenta. Cuando de devolver datos se
trata, al Servidor deben llegar siempre los datos totalmente validados, all no debe
validarse nada, todas las validaciones deben realizarse antes.

-7-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Otro ejemplo: se le muestra al usuario en una grilla la lista de todos los
proveedores de la empresa para que elija a uno de ellos. Cmo se obtuvieron esos
datos? Se los trajo del Servidor? Ese es otro error de concepto, porque si la empresa
tiene 2.000 proveedores, viajaron por la red los datos de los 2.000 proveedores. Lo
correcto es tener en el disco local una tabla con los datos de los proveedores (solamente
cdigos y nombres, nada ms), cuando el usuario quiere verlos para elegir a uno de ellos
se verifica que la tabla local coincida con la tabla del Servidor cmo? si por ejemplo el
ltimo cdigo de la tabla local es el 1997 entonces se sabe que faltan los tres ltimos
proveedores. Se copian los cdigos y nombres de esos tres proveedores en la tabla local
y se le muestra al usuario esa tabla. Cuando el usuario elige a uno de esos proveedores
entonces se enva su cdigo al Servidor, para recuperar los dems datos de ese
proveedor (direccin, telfono, localidad, e-mail, etc.). O sea, por la red viajaron los
datos de los 3 proveedores faltantes (cdigos y nombres) ms los datos del proveedor
elegido. Y no los datos de los 2.000 que estaban en el Servidor.
Otro ejemplo: se le quiere mostrar al usuario los datos de los proveedores a
quienes se les debe ms de 10.000 dlares. Cmo se hace eso? Trayendo todos los
proveedores del Servidor y luego filtrando para que solamente queden a quienes se les
debe ms de 10.000 dlares? ese es otro error de concepto. Porque si hay 2.000
proveedores y solamente 50 cumplen con la condicin, viajaron por la red los 2.000. Lo
correcto es que en la peticin de consulta se especifique la condicin, para que el
Servidor enve los datos de 50 proveedores, no de 2.000.
Por supuesto que si hay que imprimir un informe con los datos de todos los
proveedores entonces los datos de todos los proveedores viajarn por la red. Pero si
solamente se necesitan los datos de algunos proveedores, solamente los datos de ellos
deben viajar por la red.
Siempre hay que tener presente lo siguiente: el trfico en la red debe ser el
mnimo posible. Por lo tanto traer todos los datos es, en general, un error de concepto.
Estars empezando a entender la idea detrs de Cliente/Servidor cuando tengas
muy en claro que: por la red debe viajar la menor cantidad de datos posibles.
En el lenguaje SQL la instruccin utilizada para traer datos desde el Servidor
hacia el Cliente se llama SELECT. Por ejemplo, la siguiente instruccin:
SELECT * FROM Paises
Mostrar todos los datos de todos los pases. Si realmente se desea ver todos los
datos de todos los pases (cdigos, nombres, capitales, poblacin, forma de gobierno,
idioma oficial, moneda, etc.) entonce es correcta. Pero si solamente se desean ver
algunos datos (cdigos y nombres, por ejemplo) es errnea porque se est haciendo
viajar por la red datos que no se utilizarn.
En sntesis: en general, usar SELECT * es un error. Por qu? porque en general
no se necesitan todas las columnas (campos) de cada fila (registro).

-8-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Para quienes estn acostumbrados a usar tablas .DBF esto puede resultar difcil
al principio, ya que all lo normal es que los registros se lean completamente. Cuando se
accede a un registro se tiene acceso a todos sus campos. Por ejemplo:
USE Paises
SET ORDER TO TAG Codigo
SEEK 595
&& Busca el pas que tiene cdigo 595
? Codigo, Nombre, Capital, Poblacion, FormaGob, Idioma, Moneda
No es el mismo caso en SQL, en SQL se pueden especificar cuales son las
columnas (campos) requeridos. Por ejemplo:
SELECT Codigo, Nombre FROM Paises WHERE Codigo = 595
solamente traer el Cdigo y el Nombre del pas cuyo cdigo es 595.
O sea, que por la red solamente viajaron el Cdigo y el Nombre de ese pas,
nada ms. Al no viajar la Capital, Poblacin, etc., todo es ms rpido.

Claves primarias
Cada tabla debe tener s o s una clave que identifique a cada fila (registro) de
manera inequvoca (o sea que no puede faltar ni estar duplicada). A esa clave se la llama
Clave Primaria (PK = Primary Key). Lo mejor para estos casos es que esa clave la
genere el propio Firebird Por qu preocuparte en generar una clave nica si el Firebird
puede realizar ese trabajo por ti? No es lgico.
Para que una columna (campo) pueda ser utilizada como clave primaria, no debe
aceptar valores nulos.

Relaciones
Para relacionar una tabla con otra se utilizan las claves forneas o extranjeras
(FK = Foreign Key). Ese relacionamiento es persistente, o sea que estar en vigencia
sea cual sea la aplicacin que utilice a esa Base de datos.

Concurrencia
En una aplicacin multi-usuario puede ocurrir que dos o ms de ellos quieran
leer o modificar la misma fila (registro) al mismo tiempo. Eso puede causar problemas a
veces graves. Pero no es el caso con Firebird ya que ste provee un mecanismo por el
cual los lectores no molestan a los escritores y los escritores no molestan a los
lectores.

-9-

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Transacciones
Esto puede ser un poco difcil de entender al principio ya que cuando se usan
tablas .DBF los datos quedan grabados despus que el usuario hizo click sobre el botn
Grabar y la luz del disco duro se apag. En cambio en Firebird todas las
comunicaciones entre el Cliente y el Servidor ocurren durante transacciones. Inclusive
leer una fila (registro) de una tabla no se puede realizar si antes no se inici una
transaccin. Una transaccin empieza cuando el Cliente la inicia (a pedido de la
aplicacin), a partir de ese momento y hasta que finaliza (tambin por pedido de la
aplicacin al Cliente) puede realizar pedidos al Servidor.
Durante este perodo se pueden grabar/borrar/modificar filas (registros) y estas
operaciones son grabadas en el disco duro pero no cambian el estado de la Base de
Datos, o sea que aunque ya se grabaron en el disco duro todava son reversibles.
La transaccin finaliza cuando la aplicacin le pide al Cliente que las
operaciones sean permanentes (commit) o que sean desechadas si ocurri algn error
(roll back).
En este ltimo caso se aplica la regla de la atomicidad: si aunque sea un cambio
a la Base de Datos fall entonces todos los cambios son desechados. Por lo tanto: o se
graban todos o ninguno. Esto incluye cualquier cambio realizado por desencadenantes
(triggers) o procedimientos almacenados (stored procedures).

Diferencia de terminologa
En las bases de datos relacionales (como Firebird) se le llama fila a lo que en
Visual FoxPro estamos acostumbrados a llamar registro. Y se le llama columna a lo
que le solemos llamar campo. Recuerda eso.
fila
columna

---------->
---------->

registro
campo

Como seguramente ests ms acostumbrado a llamar registro y campo a lo que


en SQL se llaman fila y columna es que muchas veces vers esas palabras rodeadas de
parntesis. Pero trata de acostumbrarte a los nombres fila y columna porque sern
los que leers en toda la literatura SQL.

- 10 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Parte 2. Firebird
Qu es Firebird?
Es un motor de bases de datos relacionales SQL. Es Open Source (cdigo
abierto) y es totalmente gratis, tanto para uso privado como para uso comercial. Tiene
todas las caractersticas y la potencia de un RDBMS (Relational DataBase Management
System o Sistema Administrador de Bases de Datos Relacionales). Puede manejar bases
de datos desde unos pocos Kilobytes hasta muchos Terabytes con muy buen
rendimiento y casi sin mantenimiento.

Tipos de Servidor
Firebird tiene cuatro tipos de Servidor (Classic, SuperServer, SuperClassic,
Embedded), cualquiera de ellos se puede utilizar y sea cual sea el utilizado las Bases de
Datos no cambian. Por lo tanto se puede pasar muy fcilmente de uno a otro. El
recomendado para usar en Windows es el llamado SuperServer y por lo tanto las
siguientes referencias sern a ese. Sin embargo, si la computadora tiene varios
procesadores entonces Classic o SuperClassic seran los preferibles. Para aplicaciones
monousuario o para catlogos en CD o programas similares se puede usar Embedded,
ya que no necesita instalacin, incluye el Servidor y el Cliente en un solo archivo .DLL

Recursos utilizados
Una de las ventajas de Firebird es que utiliza muy pocos recursos. Inclusive
puede instalarse en las obsoletas computadoras 486 DX con Windows 95 o con Linux.
Desde luego que no es realista usar esas computadoras en esta poca, pero s es posible.
Por supuesto que cuanto ms poderosa sea la computadora ser mucho mejor para
todos. El Servidor de Firebird utiliza 2 Mb de memoria y a eso hay que agregarle unos
115 Kb por cada conexin a la Base de Datos. Una regla mnemnica fcil es la
siguiente: 2 Mb + 1 Mb cada 8 conexiones.
En esta poca casi cualquier computadora tiene por lo menos 1024 Mb, as que
pueden realizarse muchsimas conexiones sin ningn problema.
El espacio requerido en el disco duro es de alrededor de 14 Mb, aunque un poco
ms puede ser necesario para realizar almacenamiento temporario.

- 11 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Plataformas y versiones para el Servidor

Windows Seven
Windows Vista
Windows XP Profesional
Windows 2008 Server
Windows 2003 Server
Windows 2000 Server
Windows NT 4
Windows ME
Windows 98
Windows 95
Linux
FreeBSD
varios UNIX
Mac OS X (Darwin)
Sun Solaris SPARC e Intel
HP-UX

Pasar de una plataforma a otra no puede ser ms fcil. Se hace un backup de la


Base de Datos en una plataforma y se lo restaura en la otra plataforma.

Plataformas y versiones para el Cliente


Las mismas que para el Servidor.

Caractersticas principales de Firebird


Firebird es un motor de bases de datos SQL muy completo. Es poderoso, liviano,
y las necesidades de configuracin y de administracin son mnimas. Fcilmente se lo
puede escalar desde monousuario hasta organizaciones con sucursales por todo el
mundo y miles de computadoras conectadas al mismo tiempo. Un nico servidor
Firebird puede manejar mltiples bases de datos independientes, cada una de ellas
conectada a muchos clientes. Adems, es verdaderamente Open Source, lo cual significa
que es totalmente gratis tanto para uso privado como para uso comercial.

A.C.I.D. A=Atomicity (atomicidad), C=Consistency (consistencia), I=Isolation


(aislamiento), D=Durability (durabilidad) es algo que deben tener todos los
motores de bases de datos bien hechos. Firebird cumple perfectamente con ello.
Atomicidad: la operacin se realiz o no, jams puede quedar incompleta.
Consistencia: solamente se ejecutan las operaciones que no van a romper las
reglas y las directrices de la base de datos. Aislamiento: una operacin no puede
afectar a otras. Esto asegura que la realizacin de dos transacciones sobre la
misma informacin sean independientes y no generen ningn tipo de error.
Durabilidad: una vez realizada la operacin sta persistir y no se podr
deshacer aunque falle el sistema.
- 12 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

MGA. Multi Generational Architecture. (en castellano: Arquitectura de


mltiples generaciones). El Firebird maneja varias versiones de la misma fila
(registro) al mismo tiempo para que cada transaccin tenga su propia versin,
por lo tanto: los lectores no molestan a los escritores y los escritores no
molestan a los lectores.
Procedimientos almacenados. Estas son rutinas que pertenecen a la Base de
Datos y que se procesan en el Servidor. Un caso especial son los procedimientos
almacenados seleccionables los cuales pueden realizar sus tareas para cada fila
(registro) de una tabla y luego ser usados como una vista o una tabla virtual en el
lado del cliente. Muy tiles para informes.
Desencadenantes. Cada tabla puede tener todos los desencadenantes (triggers)
que se desee, los cuales son lanzados automticamente antes o despus de
insertar, borrar o modificar una fila (registro). Pueden ser usados para poner
valores por defecto, asegurar la integridad de los datos, etc.
Generadores. Usndolos fcilmente se pueden tener columnas (campos) que se
auto incrementan y claves nicas para ser usadas como PK (Primary Key).
Bases de Datos de slo lectura. Se las puede usar para programas demo o
catlogos, presentaciones, etc.
Control completo de las transacciones. Una aplicacin puede tener mltiples
transacciones manteniendo el total control sobre cada una de ellas.
Backups en lnea. Los backups de una Base de Datos pueden realizarse en
cualquier momento, aunque haya muchos usuarios usando sus tablas, vistas,
procedimientos almacenados, desencadenantes, etc. Esto permite que las
aplicaciones funcionen 24/7 (durante 24 horas, los 7 das de la semana).
Backups incrementales. El backup se puede hacer solamente sobre los ltimos
cambios, ahorrando as mucho tiempo y espacio en disco.
Shadows. Todo lo que se escribe en una Base de Datos puede al mismo tiempo
escribirse en otra Base de Datos, de tal manera que si la primera tiene algn
problema (disco duro daado, por ejemplo) pueden recuperarse el 100% de los
datos.
Replicacin. No es una caracterstica nativa pero hay muchas herramientas de
terceros que permiten hacerla (algunas son gratis).
Funciones externas. Bibliotecas de funciones externas (UDFs) pueden ser
escritas en cualquier lenguaje que genere DLLs y luego ser usadas por el
Firebird como si fueran funciones internas.
Integridad referencial en cascada. Permite que al modificar un cdigo de una
tabla padre se modifiquen automticamente los cdigos de todas las tablas hijas.
Conjuntos de caracteres. Firebird implementa casi todos los lenguajes
humanos (espaol, ingls, portugus, italiano, alemn, polaco, ruso, etc.)

Conectividad
Firebird acepta los siguientes mtodos: ODBC, JDBC (JayBird), PHP driver,
Perl, Python, OLEDB driver, dbExpress, proveedores de datos .Net, paquetes de
componentes nativos para C/C++/Delphi, llamadas directas a la API.
Para usarlo desde Visual FoxPro el primero de ellos (ODBC) da excelentes resultados.

- 13 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Herramientas
Hay muchos programas que pueden usarse con Firebird, incluyendo
administradores grficos, replicadores, auditoras, generadores de datos, analizadores de
estadsticas del Servidor, etc.
Es ms que aconsejable utilizarlos, porque se ahorra muchsimo tiempo al
hacerlo.
Entre los administradores grficos ms conocidos se cuentan los siguientes:
FlameRobin (gratis)
SQL Manager for InterBase and Firebird (la versin Lite es gratis)
IBExpert (tiene una versin personal gratis)
DB Workbench (la versin Lite es gratis)
Firebird Development Studio (30 das gratis)

Instalando el Servidor
Hay que elegir cual tipo de Servidor se desea. Lo aconsejable es instalarlo como
un servicio del Windows, para que se inicie junto con el Windows. El mismo programa
que se utiliza para instalar el Servidor se usar para instalar al Cliente. Siempre es
aconsejable instalar la ltima versin estable. Se lo puede descargar de:
http://www.firebirdsql.org/index.php?op=files&id=engine
El Servidor se debe instalar en una sola computadora de la red, en aquella donde
se encontrarn todas las Bases de Datos.

Instalando el Cliente
Aunque se lo puede instalar manualmente, lo mejor es hacerlo mediante el
programa de instalacin.
El Cliente se debe instalar en cada computadora de la red. Se lo puede instalar
CON las herramientas administrativas o SIN las herramientas administrativas. Lo mejor
es instalarlo SIN esas herramientas porque los usuarios comunes no deben tener acceso
a ellas.
Pero en la computadora que se usar para desarrollar aplicaciones hay que
instalar el Cliente CON las herramientas administrativas.
Tambin es posible instalar en la misma computadora el Servidor y el Cliente.

- 14 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Instalando el driver ODBC


Para poder conectarse a una Base de Datos Firebird desde Visual FoxPro se
necesita escribir un string de conexin el cual necesitar de un driver ODBC (ms
sobre esto en el siguiente captulo).
Puedes descargar el driver ODBC que corresponde a tu computadora desde:
http://www.firebirdsql.org/index.php?op=files&id=odbc

Verificando la instalacin
Verificando la conexin a la computadora donde se encuentra el Servidor
Para verificar que la red funciona correctamente y que la computadora donde se
encuentra el Cliente puede comunicarse con la computadora donde se encuentra el
Servidor se debe abrir una ventana de comandos en la computadora del Cliente y luego
escribir lo siguiente:
ping 192.21.7.15 -1 65500 - t
sustituyendo esa direccin IP por la que corresponda a la computadora donde se
encuentra el Servidor. Esto se llama ping con carga mxima y asegura que la
comunicacin puede realizarse exitosamente.

Verificando que el Servidor se est ejecutando


En la computadora donde se instal el Servidor:
Inicio | Panel de Control | Herramientas administrativas | Servicios
Si se est ejecutando, se ver una pantalla similar a la siguiente:

- 15 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

El archivo HOST
Una manera de ocultar la direccin IP del Servidor es mediante el uso del
archivo HOST. Este es un archivo que se encuentra en la carpeta C:\WINDOWS\ y que
sirve para darle un nombre a las direcciones IP. Luego, cuando sea necesario, se puede
usar el nombre y no la direccin IP.
Si en la carpeta C:\WINDOWS\ no encuentras un archivo llamado HOST, debe
haber un archivo llamado HOSTS.SAM, renmbralo como HOST.
Ejemplos:
192.168.0.11
65.215.221.149
127.0.0.1

MiServidor
apress.com
localhost

# Servidor de Firebird en la LAN


# Servidor en una red WAN
# Servidor local

El archivo HOST puede ser modificado con el NOTEPAD (Bloc de notas) o


cualquier otro editor de texto plano.

El archivo ALIASES.CONF
Este es un archivo que se encuentra en la carpeta raz del Firebird y no debe ser
movido de all.
Permite darle un nombre abreviado a las bases de datos y usar ese nombre
abreviado en las conexiones. Eso aumenta la seguridad, ya que los curiosos no pueden
saber en que carpeta se encuentra la Base de Datos ni cual es el nombre de ella.
Ejemplo:
Conta = C:\SISTEMAS\SQL_CONTA\CONTA.FDB
Conexin:
Para conectarse a la Base de Datos se podra escribir:
10.12.13.2:C:\SISTEMAS\SQL_CONTA\CONTA.FDB
o:
10.12.13.2:Conta
o:
MiServidor:Conta
Esta ltima es la preferible porque los curiosos no podrn saber ni la IP del
Servidor ni la carpeta ni el nombre real de la Base de Datos.

- 16 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

El archivo FIREBIRD.CONF
Este es un archivo que permite configurar al Firebird, se encuentra en su carpeta
raz y sus valores pueden ser cambiados, de acuerdo a la necesidad.
En general, los valores que tiene son los ms adecuados para la mayora de las
situaciones, pero si no es as, cambiarlos es muy fcil. Se lo abre con cualquier editor de
texto plano (el NOTEPAD, por ejemplo) se cambia lo que se desea y se lo graba.

El archivo SECURITY2.FDB
Este es el archivo donde el Firebird guarda los datos de cada usuario (nombres y
contraseas), est localizado en la misma carpeta del Firebird y no debe ser movido de
all.

Como evitar la corrupcin de las Bases de Datos


Aunque las Bases de Datos Firebird muy raramente tienen problemas, hay
algunas medidas que pueden tomarse para disminuir an ms la probabilidad de que
algo malo les pase:

Chequear que la computadora tenga UPS (energa ininterrumpida)


Chequear que la memoria de la computadora est OK, (para ello puede usarse el
programa MTINST.EXE)
Chequear que la Base de Datos tenga Forced Writes en ON
Chequear que haya suficiente espacio libre en el disco, tanto para la Base de
Datos como para los archivos temporales

Las Bases de Datos Firebird no se corrompen si se interrumpe la energa elctrica.

Como corromper una Base de Datos


Esta es una lista de las cosas que no debes hacer si quieres mantener a tu Base de
Datos en buen estado.

Modificar las tablas de los metadatos. Estas son las tablas internas que el
Firebird crea dentro de cada Base de Datos. No las toques. Te lo repito: no las
toques.
Deshabilitar Forced Writes. Por defecto, el Firebird graba los datos en el
disco apenas se hace el commit de ellos. No cambies esa configuracin.
Restaurando un backup en una Base de Datos que se est ejecutando. Si los
usuarios estn usando una Base de Datos, no debes restaurar sobre ella.
Permitir a los usuarios que se conecten durante una restauracin. Mientras
se est restaurando una Base de Datos, nadie debe estar conectado.

- 17 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Dialectos SQL (SQL dialect)


Firebird soporta tres dialectos SQL, nombrados respectivamente 1, 2 y 3. El
ltimo es el que debe usarse en todas las aplicaciones nuevas, los anteriores existen para
compatibilidad con versiones antiguas. El dialecto 3 es el que se usa por defecto pero si
quieres puedes escribir:
SET SQL DIALECT 3;

Hay programadores a quienes les gusta especificar el dialecto que emplean,


aunque no es necesario ya que si no lo especificas se usar el 3 (que es el ms nuevo).

Tamao de la pgina (page size)


Este es tambin un atributo opcional, se expresa en bytes. Su valor por defecto
es 4096. Los valores que puede tomar son: 1024, 2048, 4096, 8192, 16384 (habrs
notado que son todas potencias de 2, empezando con 2 ^ 10).
Si escribes cualquier otro nmero, el Firebird tomar el anterior en estos rangos.
Por ejemplo, si escribes:
2000 toma 1024
3000 toma 2048
3500 toma 2048
8000 toma 4096
Puedes usar cualquier tamao de pgina (PAGE_SIZE) que desees, si no eliges
uno entonces se usar 4096. Para qu sirve el tamao de pgina? Para decirle al
Firebird cuantos bytes debe grabar en cada bloque. Si eliges un tamao que no es el ms
adecuado para tu aplicacin, la nica consecuencia ser que los accesos a tu Base de
Datos no sern tan rpidos como podran serlo. Si te parece que los accesos estn lentos
entonces puedes hacer un backup de tu Base de Datos y luego restaurarla con un nuevo
tamao de pgina, hasta encontrar el que resulte mejor.

Conjunto de caracteres (character set)


Los caracteres que puede reconocer el Firebird se encuentran en los as llamados
character set. Hay varios de ellos, debes usarlos para decirle el idioma que emplears:
ASCII
Ingls
BIG_5
Chino, Coreano, Vietnamita
CYRL
Ruso
ISO8859_1 Castellano, Francs, Ingls, Italiano, Portugus, etc.
...
Hay muchos ms, pero con estos ya tienes la idea. Lo importante a recordar es
que para los idiomas latinos (el castellano entre ellos) debes elegir: ISO8859_1

- 18 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Scripts
Adems de crear las Bases de Datos, Dominios, Tablas, ndices, etc.
manualmente, tambin se tiene la posibilidad de hacer esas tareas automticamente a
travs de un script.
Un script es un archivo de texto plano usualmente con la extensin .SQL en el
cual se colocan los comandos que se desean ejecutar. Son muy tiles para reconstruir la
estructura de una Base de Datos o de una Tabla en la misma o en otra computadora.
Ejemplo:
CREATE TABLE Paises (
Codigo SmallInt NOT NULL,
Nombre VarChar(25) NOT NULL,
Capital
VarChar(25),
Poblacion BigInt,
PRIMARY KEY (Codigo)
);
INSERT INTO Paises VALUES(595, Paraguay, Asuncin, 6500000);
INSERT INTO Paises VALUES(1, Estados Unidos, Washington, 310000000);
INSERT INTO Paises VALUES(86, China, Beijing, 1250000000);

Como se ve en este ejemplo, se ha creado una tabla y tambin se le han agregado


datos. Tambin se podran haber creado una Base de Datos, dominios, otras tablas,
ndices, etc.
Los scripts a menudo se utilizan cuando se instala una nueva aplicacin (Ventas,
Facturacin, Contabilidad, Sueldos, etc.) en lo de un cliente. No hace falta copiar una
Base de Datos vaca en su computadora, con copiar y ejecutar los scripts es ms que
suficiente, se ahorra mucho espacio en disco, pero adems los scripts cumplen con otra
tarea que es muy importante: documentacin.
Mirando los scripts se puede conocer las caractersticas y las estructuras de una
Base de Datos y de cada uno de sus componentes (Dominios, Tablas, ndices, etc.)
Si se debe modificar algo, se modifica el script y ese cambio puede quedar
comentado.
Para comentar algo hay dos formas:
Usando el par /* mi comentario va aqu */
Usando -- este es mi comentario
Por ejemplo:
CREATE TABLE Usuarios (
Nombre
Contrasena

VarChar(20),
VarChar(12)

);

- 19 -

/* este es el nombre del usuario, si es necesario este


comentario puede ocupar varias lneas */
-- esta es la contrasea del usuario, slo en una lnea

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

El usuario SYSDBA
En Firebird hay un usuario que tiene todos los derechos, puede hacer todo lo que
quiera con cualquier Base de Datos. El nombre de ese usuario es SYSDBA. Cuando se
instala el Firebird la contrasea de ese usuario es masterkey (en realidad, masterke,
solamente se consideran los primeros ocho caracteres).
Lo primero que debes hacer apenas has instalado el mdulo Servidor del
Firebird es cambiar esa contrasea por qu? porque la contrasea masterkey la conocen
todos en todo el mundo y si tu computadora est conectada a Internet y llega a ser
hackeada o si dentro de tu organizacin hay un enemigo interno, ser la primera
contrasea que probarn.
Para cambiar la contrasea del usuario SYSDBA debes abrir una ventana de
comandos, ingresar a la carpeta \BIN del Firebird y ejecutar el programa GSEC.EXE,
como se ve en la siguiente pantalla:

Qu se hizo? primero, ejecutar el programa gsec.exe con el usuario SYSDBA y


con la contrasea masterkey. Luego, se cambi la contrasea de SYSDBA, la nueva
contrasea es ahora secreto. Por supuesto que t debes elegir otra contrasea, este es
slo un ejemplo.
Para salir del programa GSEC.EXE y regresar a la ventana de comandos se debe
escribir el comando quit.
A partir de este momento la contrasea del usuario SYSDBA es secreto, la
contrasea anterior (masterkey) ya no funciona. Eso significa que no debes olvidar tu
nueva contrasea porque si la olvidas perders tus derechos como usuario principal.
IMPORTANTE: Como el usuario SYSDBA es muy poderoso y tiene un poder
destructivo muy grande, no debera ser usado para crear bases de datos ni para llenar las
tablas con datos. En lugar de eso, debes crear usuarios comunes para que realicen esas
tareas.
Debes ingresar como usuario SYSDBA solamente para agregar, cambiar o
borrar usuarios, realizar backups, restauraciones y otras tareas que solamente l puede
hacer. Las tareas de todos los das, deben hacerlas los dems usuarios.
Recurdalo muy bien porque este es un concepto muy importante: las tareas
diarias no debe hacerlas el usuario SYSDBA.

- 20 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Agregando nuevos usuarios


El usuario SYSDBA puede agregar nuevos usuarios, como se ve en la siguiente
pantalla:

Aqu se agregaron tres nuevos usuarios. Walter, con contrasea 123456, Silvia,
con contrasea hermosa y Erika con contrasea japonesa.

Borrando usuarios
El usuario SYSDBA tambin puede borrar usuarios, como se ve en la siguiente
pantalla:

Donde se ha borrado al usuario Erika utilizando para ello el comando del.

Listando todos los usuarios

Para ver los nombres de todos los usuarios se utiliza el comando display.

- 21 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Cambiando la contrasea de un usuario

Aqu se cambi la contrasea de Silvia, su nueva contrasea es muylinda, la


anterior ya no funciona.

Nombres de los usuarios


Los nombres de los usuarios pueden escribirse en minsculas, maysculas o
cualquier combinacin. Por ejemplo las palabras: Silvia, silvia y SILVIA se refieren
todas al mismo usuario.

Contraseas (passwords) de los usuarios


A diferencia de los nombres, las contraseas (passwords) de los usuarios deben
ser escritos siempre exactamente igual. Por ejemplo: MuyLinda, Muylinda, muylinda,
MUYLINDA son todas contraseas diferentes y si escribes la que no corresponde, no
podrs acceder a la Base de Datos.

Como proteger las Bases de Datos


Si alguien tiene acceso a la computadora donde se encuentra una Base de Datos
puede copiarla, instalarla en otra computadora donde tenga acceso como usuario
SYSDBA y ver o robar todos los datos que quiera. No solamente puede copiarla,
tambin puede daarla fsicamente o destruirla completamente.
La regla a seguir es la siguiente: Solamente los procesos del Servidor deben
tener acceso a las Bases de Datos, los usuarios no necesitan y no deben tener acceso a
ellas, ni siquiera read-only (slo lectura).

Privilegios de acceso a una Base de Datos


El creador de una Base de Datos y el usuario SYSDBA tienen acceso total y
completo sobre ella desde el mismo momento en que fue creada, los dems usuarios
nada pueden hacer con ella ... hasta que se les otorgan privilegios (o derechos). Recin a
partir de ese momento podrn usar la Base de Datos. Mientras no se les hayan otorgado
privilegios (o derechos) nada podrn hacer, ni siquiera consultarla.

- 22 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


IMPORTANTE: El usuario SYSDBA puede otorgar o quitar derechos a todos
los usuarios de la Base de Datos excepto a su creador. El creador siempre tiene todos los
derechos, ni siquiera SYSDBA puede quitrselos. De la misma manera, el creador
tampoco puede quitarle derechos a SYSDBA.
El comando que se usa para otorgar privilegios a los usuarios se llama GRANT.
Su sintaxis es la siguiente:
GRANT <privilegio> ON <objeto> TO <usuario>;

Para quitarles derechos a los usuarios se usa REVOKE. Su sintaxis es la


siguiente:
REVOKE <privilegio> ON <objeto> FROM <usuario>;

Privilegios
Los privilegios que pueden ser otorgados a los usuarios (y revocados) son los
siguientes:
Nombre del privilegio
SELECT
INSERT
UPDATE
DELETE
REFERENCES
ALL
EXECUTE
ROLE

Lo que puede hacer


Leer filas (registros)
Insertar filas (registros)
Modificar el contenido de las filas (registros)
Borrar filas (registros)
Relacionar una clave primaria con una clave secundaria
Select, Insert, Update, Delete, References
Ejecutar un Procedimiento Almacenado o llamarlo
Adquirir todos los privilegios del rol

Privilegios sobre columnas (campos)


El privilegio UPDATE permite modificar el contenido de todas las columnas
(campos) de una fila (registro). Pero a veces se necesita que el usuario solamente pueda
modificar algunas columnas, no todas. Para ello, a continuacin de UPDATE se debe
escribir entre parntesis los nombres de las columnas que podr modificar.
Ejemplos:
GRANT SELECT, UPDATE, INSERT, DELETE ON PRODUCTOS TO SILVIA;
GRANT SELECT ON PRODUCTOS TO MIRTHA;
REVOKE DELETE ON PRODUCTOS TO SILVIA;
GRANT UPDATE (PRECIO_VENTA1, PRECIO_VENTA2) ON PRODUCTOS TO SILVIA;

- 23 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Roles
Los roles permiten agrupar a los usuarios para que todos quienes compartan un
rol tengan los mismos privilegios. Todos los usuarios que tienen el mismo rol disponen
de exactamente los mismos derechos. Un usuario puede tener varios roles pero
solamente uno de ellos estar activo en cada momento.
Por ejemplo, se puede tener un rol para Ventas, otro para Contabilidad, otro para
Recursos Humanos, etc. Si se crea un rol llamado Ventas que solamente permite ver
cantidades en stock, precios de venta y realizar ventas, los usuarios que usen ese rol no
podrn ver los Balances ni los datos de los empleados.
Los roles son especficos de cada Base de Datos, un rol creado para una Base de
Datos no funcionar en otra.
La implementacin de roles tiene los siguientes pasos:
1. Crear un rol (usando CREATE ROLE)
2. Asignar privilegios al rol (usando GRANT privilegios TO NombreRol)
3. Asignar el rol a los usuarios (usando GRANT NombreRol TO Usuario)
4. Especificar el rol, adems del nombre del usuario, al conectarse a una BD
Creando un rol
La sintaxis para crear un rol es muy simple:
CREATE ROLE <NombreRol>

El creador de la Base de Datos y el usuario SYSDBA pueden crear los roles y


otorgar los privilegios y asignarlos a los usuarios.
Eliminando un rol
Si ya no se necesita un rol entonces se lo puede eliminar, la sintaxis es:
DROP ROLE <NombreRol>

Ejemplos:
/* Se crea el rol R_PRODUCTOS, que tiene todos los privilegios sobre la tabla PRODUCTOS y se le asigna a Silvia */
CREATE ROLE R_PRODUCTOS;
GRANT ALL ON PRODUCTOS TO R_PRODUCTOS;
GRANT R_PRODUCTOS TO SILVIA;

/* Se crea el rol R_VENDEDORES, que solamente puede consultar la tabla VENDEDORES (o sea que no puede insertar
ni borrar ni modificar datos) y se le asigna a Silvia */
CREATE ROLE R_VENDEDORES;
GRANT SELECT ON VENDEDORES TO R_VENDEDORES;
GRANT R_VENDEDORES TO SILVIA;

- 24 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Como puede verse en la siguiente imagen, se cre el rol R_VENDEDORES, el
cual solamente permite consultar a la tabla VENDEDORES pero no permite que se
inserten, borren o modifiquen datos de ella.
El rol R_VENDEDORES se le otorg a SILVIA, por lo tanto ella puede
consultar pero nada ms, solamente puede hacer eso.
Cuando intent agregar una fila a la tabla VENDEDORES el Firebird se lo
impidi, mostrando un cdigo de error (-551), el cual significa: no tienes permiso para
insertar/escribir en la tabla.

Comandos del Firebird ms utilizados


El Firebird tiene muchos comandos, la mayora de ellos con varias clusulas y
en cada versin se van agregando nuevos. Sin embargo hay algunos que son mucho ms
utilizados que los dems, esos son los que se listan a continuacin.
Crear una Base de Datos
CREATE DATABASE "C:\EJEMPLO.FDB" USER "WALTER" PASSWORD "123456";

Conectarse a una Base de Datos


CONNECT "C:\EJEMPLO.FDB" USER "SILVIA" PASSWORD "muylinda";

Crear un dominio
CREATE DOMAIN NumeroEntero INTEGER;
CREATE DOMAIN NombrePersona VARCHAR(30);

Ver los dominios existentes


SHOW DOMAINS;

Ver la estructura de un dominio


SHOW DOMAIN NumeroEntero;
SHOW DOMAIN NombrePersona;

- 25 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Crear una tabla
CREATE TABLE Personas(Codigo NumeroEntero,
Nombres NombrePersona,
Apellidos NombrePersona,
Sueldo Integer);
CREATE TABLE Amigos (Codigo Integer NOT NULL,
Nombres VarChar(15),
Apellidos VarChar(15));

Borrar una tabla de la Base de Datos


DROP TABLE Personas;

Ver todas las tablas de una Base de Datos


SHOW TABLES;

Ver la estructura de una tabla


SHOW TABLE Personas;
SHOW TABLE Amigos;

Agregarle una clave primaria a una tabla


ALTER TABLE Amigos ADD PRIMARY KEY (Codigo);

la columna clave debe estar entre parntesis

Agregarle una columna a una tabla


ALTER TABLE Personas ADD Telefono VarChar(15);
ALTER TABLE Personas ADD Clave Integer NOT NULL;

Borrar una columna de una tabla


ALTER TABLE Personas DROP Codigo;

Agregarle filas a una tabla


INSERT INTO Personas (1, "JUAN", "PEREZ");
INSERT INTO Personas (Codigo, Nombres, Apellidos) VALUES (2, "MARIA", "BENITEZ");
INSERT INTO Personas (Codigo, Nombres) VALUES (3, "CLAUDIA");

Borrar algunas filas de una tabla


DELETE FROM Personas WHERE Codigo = 25;
DELETE FROM Personas WHERE Codigo >= 12 AND Codigo <= 18;
DELETE FROM Personas WHERE Nombres = MARIA;

Borrar todas las filas de una tabla


DELETE FROM Personas;

Modificar columnas de una tabla


UPDATE PERSONAS SET Apellidos = 'ARRUA' WHERE Nombres = 'CLAUDIA';

- 26 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Consultar las filas de una tabla
SELECT * FROM Personas;
SELECT Nombres, Apellidos FROM Personas;
SELECT Nombres FROM Personas WHERE Apellidos = "BENITEZ";
SELECT * FROM Personas WHERE Nombres = "JUAN" OR Apellidos = "BENITEZ";
SELECT * FROM Personas WHERE Sueldo BETWEEN '2000' AND '5000';

Consultar las filas cuando se conoce una subcadena


SELECT * FROM Personas WHERE Nombres LIKE '%ANA%';
mostrar todos los nombres que tengan a ANA
en alguna parte (ANA, ANALIA, SUSANA, LUCIANA, etc.)
A_Z
todas las filas que empiezan con A, tienen cualquier caracter en el medio y finalizan con Z
ABC% todas las filas que empiezan con ABC y continan con cualquier caracter
%XYZ todas las filas que finalizan con XYZ
%AN% todas las filas que tienen AN en cualquier lugar
_AN% todas las filas que empiezan con cualquier carcter, continan con AN y finalizan con cualquier carcter

Consultar solamente los que no estn repetidos


SELECT DISTINCT Nombres FROM Personas;
SELECT DISTINCT Nombres, Apellidos FROM Personas;

Consultar los datos ordenadamente


SELECT * FROM Personas ORDER BY Nombres;
SELECT * FROM Personas ORDER BY Apellidos, Nombres;

Contar la cantidad de filas de una tabla


SELECT COUNT (*) FROM Personas;

Sumar una columna numrica


SELECT SUM(Sueldo) FROM Personas;

Hallar el promedio de una columna numrica


SELECT AVG(Sueldo) FROM Personas;
SELECT AVG(Sueldo) FROM Personas WHERE Apellidos = "BENITEZ";

Hallar el valor mnimo de una columna numrica


SELECT MIN(Sueldo) FROM Personas;

Hallar el valor mximo de una columna numrica


SELECT MAX(Sueldo) FROM Personas;

Agrupar filas
SELECT Codigo, Apellidos, Nombres FROM Personas GROUP BY Apellidos, Nombres, Codigo;
todas las columnas que estn antes del GROUP BY deben estar tambin despus, aunque pueden estar en distinto orden

Ponerles condiciones a las filas agrupadas


SELECT Codigo, Apellidos, Nombres FROM Personas GROUP BY Apellidos, Nombres, Codigo HAVING Nombres =
"JUAN";

- 27 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Relacionar dos tablas
SELECT Personas.Codigo, Personas.Apellidos, Paises.Nombres FROM Personas, Paises WHERE Personas.CodigoPais
= Paises.Codigo;

Ordenar una tabla


SELECT Personas.Codigo, Personas.Apellidos, Paises.Nombres FROM Personas, Paises ORDER BY Paises.Nombres;

El programa ISQL.EXE
Interactive SQL es un programa de lnea de comandos que incorpora
herramientas y tcnicas para mantener objetos de las bases de datos, administrar
transacciones, procesar scripts.
La ventaja que tiene es que existe en todas las instalaciones del Servidor de
Firebird, la desventaja es que hay que escribir los comandos. Como hay muchos
programas que permiten realizar esas tareas grficamente, en general no se lo usa, pero
siempre es bueno conocerlo, alguna vez puede ser de utilidad. Por eso es recomendable
que practiques un poco con l, para saber usarlo cuando lo necesites.
Con ISQL se pueden crear bases de datos, dominios, tablas, ndices, y en general
realizar todas las operaciones usuales.
Se encuentra en la carpeta \BIN del Firebird.

En la imagen de arriba se muestra como conectarse a una base de datos ya


existente. El comando a utilizar es CONNECT.

En la imagen de arriba se muestran todas las tablas que pertenecen a la base de


datos llamada EMPLOYEE.FDB.

- 28 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

En la imagen de arriba se ve la estructura de la tabla llamada COUNTRY.

En la imagen de arriba se ven todas las filas y las columnas country y currency
de la tabla COUNTRY.

El programa GBAK.EXE
Es un programa utilitario que se encuentra en la carpeta \BIN del Firebird, su
misin es realizar copias de seguridad (backups) de las bases de datos y restaurarlas
cuando sea necesario. Tambin detecta corrupcin de datos, libera el espacio en disco
ocupado por las filas borradas (un equivalente al comando PACK del VFP), resuelve las
transacciones que no estaban completas, permite partir una Base de Datos en varios
archivos (muy til cuando ya es demasiado grande), tambin se lo usa para restaurar el
backup en otra plataforma (de Windows a Linux, por ejemplo).
IMPORTANTE: Nunca debes usar programas como WinZip o WinRar para
comprimir tu base de datos si el Firebird est en ejecucin.
IMPORTANTE: El archivo de backup generado por el programa GBAK no
puede ser usado directamente porque el Servidor no lo reconocer, antes de ser usado
debe ser restaurado con una versin de GBAK igual o posterior a la usada para crearlo.
IMPORTANTE: Los usuarios pueden continuar trabajando normalmente
mientras se realiza el backup, pero los datos que se graban son los que se encontraban
en la base de datos en el momento que GBAK se inici. Todos los cambios que los
usuarios hagan despus no sern grabados en el archivo de backup.

- 29 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


PRECAUCIN: El hecho de que un backup se haya realizado exitosamente no
implica que se podr recuperar sin problemas cuando se lo necesite. Siempre debes
probar a restaurar tu backup inmediatamente despus de realizarlo, para asegurarte que
todo est bien.
El uso del programa GBAK est restringido al usuario SYSDBA y al usuario
quien cre la base de datos.
PRECAUCIN: Cualquiera puede robar una base de datos Firebird restaurando
un archivo de backup en una computadora donde conoce la contrasea del usuario
SYSDBA. Por eso es importantsimo asegurar que los archivos de backup se encuentren
en un lugar seguro.
Ejemplo 1:

Aqu el usuario SYSDBA cuya contrasea es secreto hizo un backup del archivo
AGENDA.FDB. El nombre del archivo generado es AGENDA27112010.
Ejemplo 2:

Aqu el usuario SYSDBA cuya contrasea es secreto restaur el archivo de


backup llamado AGENDA27112010 en una base de datos llamada AGENDA.FDB. Es
importante recordar que AGENDA27112010 no es reconocida como una Base de Datos
por el Firebird, debe ser restaurada para poder ser utilizada como tal.

El programa NBACKUP.EXE
Este programa ofrece posibilidades que no tiene GBAK.EXE pero no lo
reemplaza, sino que lo complementa.
Puede hacer el backup y la restauracin completos o incrementales. Este ltimo
slo tiene los cambios ocurridos desde el ltimo backup.
Puede bloquear la base de datos para que el backup se haga con otro programa.
En este caso no realiza el backup sino que establece las condiciones para que pueda ser
realizado.

- 30 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Ambos modos pueden hacerse sobre una Base de Datos activa, sin molestar a los
usuarios. El backup realizado siempre reflejar el estado al principio de la operacin.
Para hacer un backup completo
La sintaxis de este comando es:
nbackup [-U <usuario> -P <contrasea>] -B 0 <Base de Datos> [<Nuevo Nombre>]

Como se ve en la imagen de arriba, el programa nbackup.exe cre un archivo de


backup con la extensin .nbk
Para hacer un backup incremental
Para ahorrar tiempo y espacio en disco se puede hacer un backup incremental, es
decir agregarle al backup anterior solamente los cambios realizados desde ese momento.
Para ello, a continuacin del parmetro B se escribe un nmero mayor que cero (el
nmero cero significa backup completo), como se ve en la siguiente imagen:

Si en el siguiente backup se utiliza:


- B 0, el backup ser completo
- B 1, el backup ser incremental desde el ltimo backup de nivel 0
- B 2, el backup ser incremental desde el ltimo backup de nivel 1
Para restaurar un backup completo
Se debe usar el parmetro R, como en la siguiente imagen:

Para restaurar un backup incremental


Se debe especificar toda la cadena de los archivos de backup, desde el nivel 0
hasta el nivel que se desea restaurar. Esta es la sintaxis:
nbackup [-U <usuario> -P <contrasea>]
-R <Base de Datos> [<backup0> [<backup1> [...] ] ]

- 31 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Usando SQL Manager


Hay varios administradores grficos muy buenos, FlameRobin, SQL Manager,
IB Expert, DB Workbench, etc. cualquiera de ellos puede ser utilizado. Por una cuestin
de costumbre del autor de este documento, SQL Manager ser el que se usar en las
siguientes pginas.
Se lo puede descargar desde:
http://www.sqlmanager.net/en/products/ibfb/manager/download
Hay varias opciones, si se desea descargar una que es gratis elegir la que dice
freeware.

Por qu usar un administrador grfico?


Porque facilita muchsimo el trabajo, se ahorra muchsimo tiempo y se tienen las
ideas ms claras.

La Base de Datos Employee


Cuando se instala el Firebird, dentro de su misma carpeta se copia una Base de
Datos con el nombre Employee (empleado), para que los nuevos usuarios de Firebird
puedan hacer pruebas con ella. Como est disponible en todas las instalaciones, ser la
utilizada en los siguientes ejemplos:

Registrando una Base de Datos


Despus de ingresar al SQL Manager lo primero que se debe hacer es registrar
la Base de Datos con la cual se desea trabajar. Eso es equivalente a abrirla, se necesita
hacerlo para poder usarla.

- 32 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Una vez que la Base de Datos est registrada, se ver una pantalla, similar a la
siguiente:

Haciendo doble click sobre EMPLOYEE se vern todos sus componentes, como
a continuacin se muestra:

- 33 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


en el panel de la izquierda pueden verse los componentes de las Bases de Datos
(dominios, tablas, vistas, procedimientos almacenados, funciones externas del usuario,
desencadenantes, etc.)
Haciendo click sobre el signo + que se encuentra a la izquierda de cada categora
se pueden ver todos sus elementos, como se muestra a continuacin:

Qu son los dominios?


Los dominios son definiciones, globales a la Base de Datos, que son utilizados
en las definiciones de las columnas (pero no en las definiciones de variables ni en los
parmetros de entrada o de salida de los procedimientos almacenados o de los
desencadenantes). Es decir, en la prctica son un nuevo tipo de datos. Eso significa que
adems de los tipos de datos estndares como carcter, numrico, fecha, etc., se puede
usar un dominio. Son opcionales, se los puede usar o no, pero usarlos mejora la
legibilidad del cdigo. Por ejemplo el dominio Salary tiene la siguiente definicin:

- 34 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


CREATE DOMAIN SALARY AS
NUMERIC(10, 2)
DEFAULT 0
CHECK (VALUE > 0);

si una columna (por ejemplo: salario) tiene ese dominio, el Firebird no permitir
que se grabe una fila si el valor de la columna salario es cero o menor que cero Por qu
no? porque antes de realizar la grabacin verifica que el valor sea mayor que cero
(CHECK (VALUE > 0))
Aqu hay otro ejemplo, el dominio EmpNo (nmero del empleado):
CREATE DOMAIN EMPNO AS
SMALLINT;

Aqu hay otro ejemplo, CustNo (nmero del consumidor):


CREATE DOMAIN CUSTNO AS
INTEGER
CHECK (VALUE > 1000);

Aqu hay otro ejemplo, DeptNo (nmero del departamento)


CREATE DOMAIN DEPTNO AS
CHAR(3) CHARACTER SET NONE
CHECK (VALUE = '000' OR (VALUE > '0' AND VALUE <= '999') OR VALUE IS NULL)
COLLATE NONE;

Si te parece complicado no te preocupes, dentro de poco lo entenders. Recuerda


que usarlos o no es opcional, pero usarlos tiene sus ventajas. Por ejemplo, si sabes que
las fechas de las compras, de las ventas, de las cobranzas, de los pagos, no pueden ser
anteriores al 1 de enero de 2011, podras crear un dominio basado en el tipo de datos
date que no permita fechas anteriores. Ese dominio luego lo usars como tipo de datos
de todas las tablas que lo necesiten. Por lo tanto, no necesitars validar que las fechas
sean posteriores al 1 de enero de 2011, el Firebird se encargar de esa tarea, te facilitar
tu trabajo. En ningn caso un usuario de tu aplicacin podra grabar una fecha anterior.

Cmo se crea un nuevo dominio?


Haciendo click con el botn derecho sobre la palabra Domains y luego
eligiendo la opcin New domain..., como se ve a continuacin:

- 35 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Qu son las tablas?


Los lugares donde se guardan los datos. Son muy similares a las utilizadas por
Visual FoxPro as que no merecen mayor comentario.

- 36 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Qu son las vistas?


Consultas predeterminadas, cuyas columnas pueden provenir de una tabla o de
varias tablas. Si los usuarios necesitan ver ciertos datos frecuentemente es mejor hacer
una vista y no una consulta, por qu? porque al ya estar dentro de la Base de Datos las
vistas se ejecutan ms rpidamente.
Este es un ejemplo de una vista:
CREATE VIEW PHONE_LIST(
EMP_NO,
FIRST_NAME,
LAST_NAME,
PHONE_EXT,
LOCATION,
PHONE_NO)
AS
SELECT
emp_no, first_name, last_name, phone_ext, location, phone_no
FROM employee, department
WHERE employee.dept_no = department.dept_no;

Qu son los procedimientos almacenados?


Los procedimientos almacenados, comnmente llamados Stored Procedures (o
SP para abreviar) son los equivalentes a los procedimientos y las funciones del Visual
FoxPro. Reciben parmetros de entrada, realizan alguna tarea y pueden devolver
valores.
Como pertenecen a la Base de Datos son independientes del lenguaje utilizado
para acceder a ella. Es decir que pueden ser invocados por un programa hecho en Visual
FoxPro, C, C++, Delphi, Java, o cualquier otro.
Hay dos clases de procedimientos almacenados: los ejecutables y los
seleccionables. Los ejecutables son los equivalentes a los procedimientos y funciones
del Visual FoxPro en cambio los seleccionables devuelven filas y se los utiliza dentro
de los SELECT.
Este es un ejemplo de un SP ejecutable:
SET TERM ^ ;
CREATE PROCEDURE ADD_EMP_PROJ(
EMP_NO SMALLINT,
PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE)
AS
BEGIN
BEGIN
INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id);
WHEN SQLCODE -530 DO
EXCEPTION unknown_emp_id;
END
SUSPEND;
END^
SET TERM ; ^

- 37 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Y este es un ejemplo de un SP seleccionable:
SET TERM ^ ;
CREATE PROCEDURE GET_EMP_PROJ(
EMP_NO SMALLINT)
RETURNS(
PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE)
AS
BEGIN
FOR SELECT proj_id
FROM employee_project
WHERE emp_no = :emp_no
INTO :proj_id DO
SUSPEND;
END^
SET TERM ; ^

Para que un SP sea seleccionable:


a) Debe tener parmetros de salida declarados (y cargados, por
supuesto)
b) Debe ser escrito con un SUSPEND despus de cada bloque que debe
retornar una fila
En el ejemplo de arriba el parmetro de salida es PROJ_ID (porque est dentro
del RETURNS()) y el SUSPEND est dentro del FOR ... DO. En Firebird si el ciclo
FOR ... DO tiene una sola lnea, no hace falta colocarle un BEGIN...END; aunque
puedes escribirlos, por claridad, hasta que te acostumbres. El FOR ... DO podra haberse
escrito de esta manera:
FOR SELECT proj_id
FROM employee_project
WHERE emp_no = :emp_no
INTO :proj_id DO BEGIN
SUSPEND;
END;

Como ves, se le agreg un BEGIN y un END; es innecesario hacerlo cuando


despus del FOR ... DO hay una sola lnea pero es obligatorio cuando dentro del ciclo
FOR ... DO hay varias lneas.

Qu son las UDFs?


UDF = User Defined Function o Funcin Definida por el Usuario, tambin se le
llama funcin externa. El Firebird permite tener bibliotecas de funciones hechas en
cualquier lenguaje que pueda crear archivos DLL. Las funciones internas del Firebird
son pocas por qu? porque as se puede mantener el motor pequeo y rpido, no tiene
sentido llenarlo de funciones, muchas de las cuales no usars o usars raramente. Es
mejor que las funciones sean externas as dispones solamente de las que necesitas,
ninguna ms.
En Visual FoxPro tienes muchas funciones que raramente usas, por ejemplo
SIN() (seno), COS (coseno), TAN() (tangente), ASIN(), (arco seno), etc. las cuales
siempre estn dentro de tus ejecutables y los hacen ms grandes de lo necesario. El

- 38 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Firebird es ms econmico, tambin puedes usar esas funciones si las necesitas, pero si
no las necesitas, no estn ocupando espacio.
Las funciones UDFs son globales a la Base de Datos, eso significa que una vez
declaradas las puedes utilizar en cualquier procedimiento almacenado o en cualquier
desencadenante.
Antes de usar una funcin hay que declararla, o sea decirle al Firebird que
deseas usar esa funcin en la Base de Datos abierta. Para ello se utiliza el comando
DECLARE EXTERNAL FUNCTION.
La gran mayora de las funciones externas que puedes descargar de Internet
vienen con sus propios archivos de script, eso sirve de documentacin para que puedas
saber que hacen, como llamarlas y los valores que retornan.
IMPORTANTE: T puedes crear tus propias funciones externas pero debes
verificarlas muy bien antes de incluirlas en tus proyectos porque una funcin mal hecha
puede corromper tu Base de Datos.
Las funciones externas no deberan modificar columnas (campos). Si lo hacen,
la probabilidad de que causen problemas se incrementa mucho.
Ejemplo:
DECLARE EXTERNAL FUNCTION abs
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY POINT IB_UDF_abs MODULE NAME ib_udf;

Probablemente la declaracin anterior te pareci complicada pero no te


preocupes, usualmente lo nico que haces es un copiar y pegar desde el script que
descargaste de Internet al script tuyo.

Qu son los desencadenantes?


Tambin llamados triggers, son unos procedimientos almacenados que se
ejecutan automticamente cada vez que en una tabla se realiza una insercin, borrado o
modificacin de fila (registro)
Pueden activarse antes de la operacin o despus de la operacin. Para elegir
una u otra se usan las palabras clave BEFORE (antes) y AFTER (despus).
Una tabla puede tener todos los desencadenantes que se desee, el orden de
ejecucin de ellos depende del valor de la variable POSITION.
No reciben parmetros de entrada ni devuelven valores.
Tienen dos seudovariables internas, new y old.
New se refiere al nuevo valor que tendr la columna, old se refiere al valor
anterior.

- 39 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Aqu hay un ejemplo de un trigger (desencadenante):
SET TERM ^ ;
CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE
ACTIVE AFTER UPDATE
POSITION 0
AS
BEGIN
IF (old.salary <> new.salary) THEN
INSERT INTO salary_history
(emp_no, change_date, updater_id, old_salary, percent_change)
VALUES (
old.emp_no,
'NOW',
user,
old.salary,
(new.salary - old.salary) * 100 / old.salary);
END^
SET TERM ; ^

En este caso, la insercin dentro de la tabla Salary_History se realizar


solamente si el salario nuevo es distinto al salario anterior.

Qu son las excepciones?


Son mensajes que pueden colocarse dentro de un SP o de un trigger y que se
envan cuando ocurri un error. En ese caso, deshacen todo lo que se haba realizado
con anterioridad.
Aqu est la declaracin de una excepcin:
CREATE EXCEPTION UNKNOWN_EMP_ID 'Invalid employee number or project id.';

Y aqu el uso de ella:


SET TERM ^ ;
CREATE PROCEDURE ADD_EMP_PROJ(
EMP_NO SMALLINT,
PROJ_ID CHAR(5) CHARACTER SET NONE COLLATE NONE)
AS
BEGIN
BEGIN
INSERT INTO employee_project (emp_no, proj_id) VALUES (:emp_no, :proj_id);
WHEN SQLCODE -530 DO
EXCEPTION unknown_emp_id;
END
SUSPEND;
END^
SET TERM ; ^

Qu son los generadores?


Nmeros secuenciales que pueden ser automticamente insertados en una
columna. Normalmente se los utiliza para asegurar que las PK (claves primarias) tengan
un valor nico.
Aqu se declara un generador:
CREATE GENERATOR EMP_NO_GEN;
SET GENERATOR EMP_NO_GEN TO 145;

- 40 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


el cual le dice al Firebird que los nmeros de empleado deben empezar con 145.
Y aqu se usa ese generador:
SET TERM ^ ;
CREATE TRIGGER SET_EMP_NO FOR EMPLOYEE
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
if (new.emp_no is null) then
new.emp_no = gen_id(emp_no_gen, 1);
END^
SET TERM ; ^

Para qu se usa SET TERM?


En Firebird, todos los comandos deben finalizar con un terminador, el
terminador por defecto es el punto y coma (;). Para cambiar ese terminador por otro se
utiliza SET TERM. Otros lenguajes tambin utilizan terminadores, por ejemplo Pascal,
Delphi, C, C++, Java, etc.
Cuando se escribe un procedimiento almacenado o un desencadenante hay que
cambiar al terminador por defecto porque el analizador del Firebird termina su tarea
cuando lo encuentra. Al terminar el procedimiento almacenado o desencadenante hay
que volver a colocar el terminador por defecto. Por eso vers que la primera y la ltima
instruccin son siempre SET TERM. En este ejemplo:
create procedure p1
as
begin
finsert into t1 values(10);
end;
si no se usa SET TERM, el analizador finalizar despus del (10) y eso
ocasionara un error, porque nunca lleg hasta el end.
El nuevo terminador puede ser cualquiera, con una condicin: no debe estar
dentro del bloque de cdigo que ests escribiendo (podras usar la letra A pero tendras
problema si dentro del bloque aparece una letra A). El terminador alternativo ms
utilizado, el que est prcticamente estandarizado en Firebird es el ^

Cundo se usan los : delante del nombre de una variable?


Habrs visto que delante de los nombres de algunos parmetros o variables
aparecen los dos puntos (:). La regla es la siguiente:

Si son usados dentro del contexto del procedimiento almacenado (asignacin


o comparacin) entonces no se necesitan los dos puntos.
Si son usados fuera del contexto del procedimiento almacenado (INSERT,
DELETE, UPDATE, SELECT) entonces s se necesitan los dos puntos.

- 41 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Integridad Referencial
La integridad referencial es la capacidad de una Base de Datos de protegerse a
s misma evitando recibir valores de entrada que puedan daar a las relaciones.
Especficamente se trata de proteger las relaciones entre dos tablas.
Por qu se debera proteger las relaciones entre dos tablas?
1) Prueba de fuego. Las restricciones referenciales (especialmente cuando
usadas inteligentemente con otras restricciones) protegern fuertemente las
reglas de negocio de la aplicacin contra errores, sin importar de donde
provengan ellos. Esto es de mucha importancia cuando la Base de Datos ser
manipulada por otras personas, algunas quizs con un nivel bastante bajo.
2) Velocidad de las consultas. Los ndices creados automticamente para la
integridad referencial aumentarn la velocidad de las consultas.
3) Control de calidad. Durante la etapa de desarrollo y verificacin los errores
se encontrarn pronto porque la Base de Datos rechazar operaciones que
rompan las reglas.
4) Documentacin automtica. En los scripts que hagas podrn verse las
reglas, evitando as escribir documentos especficos (ya que todos saben que
a la mayora de los programadores no les gusta escribir documentacin).
La integridad referencial entre dos tablas se crea a travs de una restriccin
foreign key (clave fornea). Esta restriccin protege a la tabla contra los intentos de
grabar filas que son inconsistentes con el modelo de datos.
La restriccin foreign key
Una foreign key (abreviada FK) es una columna o conjunto de columnas de una
tabla que corresponde en orden exacto a una columna o conjunto de columnas de otra
tabla definida/s como primary key (abreviada PK) o como unique.
Si se implementa este modelo como dos tablas PADRE e HIJO, entonces las
filas en la tabla HIJO dependen de la existencia de una fila en la tabla PADRE.
Por ejemplo: si se tienen dos tablas, una llamada PRODUCTOS y la otra
llamada VENTASDET (detalle de ventas), las filas de la tabla VENTASDET dependen
de la tabla PRODUCTOS. O sea, no se puede vender un producto cuyos datos no se
encuentren en la tabla PRODUCTOS.
Qu implica esto?
1) Que primero se deben cargar los datos de los productos antes de poder
venderlos
2) Que la tabla PRODUCTOS debe tener una clave primaria (el cdigo del
producto)
3) Que la tabla VENTASDET debe tener una restriccin foreign key sobre el
cdigo del producto.
4) Que no se puede tener una fila en VENTASDET que no haga referencia a
una fila en PRODUCTOS.

- 42 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Trabajando con las tablas .DBF del Visual FoxPro se pueden grabar registros en
VENTASDET aunque el campo Cdigo del Producto se deje en blanco o aunque se
escriba un cdigo inexistente. Algo as es imposible en Firebird, no se puede hacer eso,
aunque se quiera. Por lo tanto, aumenta en gran medida la seguridad y la confianza en
los datos grabados.
En Visual FoxPro:
-

Aunque no exista un producto con ese Cdigo igual se puede grabar un registro
en VENTASDET
Aunque se deje en blanco el campo Cdigo del Producto, igual se puede grabar
un registro en VENTASDET
Se puede borrar un registro de la tabla PRODUCTOS aunque el cdigo de ese
registro se est utilizando en la tabla VENTASDET
Se puede cambiar el cdigo de un producto aunque ese cdigo se est utilizando
en la tabla VENTASDET

O sea, es ms fcil meter la pata (hacer algo malo o incorrecto) en Visual FoxPro.
Solamente por esta caracterstica ya deberas pensar seriamente en usar tablas Firebird.
Cuando se define una FK (Foreign Key) se le puede decir al Firebird que
acciones deber tomar cuando se quiera borrar o modificar la PK (Primary Key). Estas
acciones pueden ser:
ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}
ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}

No action
Es el valor por defecto, por lo tanto puede ser (y generalmente es) omitido. Su
accin es impedir que la PK pueda ser borrada o modificada.
On Delete Cascade
Cuando se borra una fila de la tabla PADRE las filas relacionadas en la tabla
HIJO tambin son borradas.
On Update Cascade
Cuando se modifica un cdigo en la tabla PADRE los cdigos relacionados de la
tabla HIJO son tambin modificados para que todos tengan el mismo valor.
Set Null
Cuando se borra o modifica un cdigo de la tabla PADRE los cdigos
relacionados de la tabla HIJO son puestos a null, por lo tanto esas filas quedan
hurfanas. Generalmente esta accin no es recomendada ya que se pierde la ventaja de
la integridad referencial. Naturalmente esta accin no puede realizarse si la columna
cdigo de la tabla HIJO no admite valores nulos.

- 43 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

ndices
Los ndices son atributos de las tablas que pueden ser localizados sobre una
columna o conjunto de columnas para acelerar la recuperacin de filas.
Lmites
Firebird admite hasta 256 ndices por tabla.
Cada ndice puede tener hasta 253 bytes.
ndices automticos
Las restricciones PK y FK automticamente crean sus propios ndices. Cuando
crees tus ndices es importantsimo no duplicar los ndices que ya ha creado el Firebird
porque en ese caso el motor podra estar en la duda de cual usar (porque ambos son
idnticos) y podra decidir no usar ninguno de ellos (haciendo tus bsquedas mucho ms
lentas).
Direccin de los ndices
Todos los ndices pueden ser ascendentes (de menor valor a mayor valor) o
descendentes (de mayor valor a menor valor).
Es un error muy comn creer que con un solo ndice se obtendrn los mismos
resultados tanto si se buscan valores altos como valores bajos. La regla a aplicar es la
siguiente:
Si buscas valores bajos, debes usar un ndice ascendente
Si buscas valores altos, debes usar un ndice descendente
Cuando indexar
Cada ndice ocupa espacio en disco, adems los ndices deben ser actualizados
cuando se agregan, borran o modifican las filas, consumiendo tiempo, a veces mucho.
Por lo tanto aunque pueden ser de gran ayuda es importante crear solamente los que
sean necesarios y ninguno ms. Una buena prctica es la siguiente:
Creas tus tablas sin ndices y los vas agregando a medida que los necesitas
Crea ndices sobre columnas cuyo valores son frecuentemente buscados
Crea ndices sobre columnas que frecuentemente aparecen en JOINs
Crea ndices sobre columnas que frecuentemente aparecen en los primeros
lugares de GROUP BY
No crees ndices sobre columnas que tienen muchos valores repetidos
No crees ndices sobre columnas que se usarn muy raras veces
No crees ndices sobre columnas que tienen muchos valores que nunca son
buscados, como horas y minutos
No crees ndices sobre columnas que se buscan con LIKE

- 44 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Transacciones
Recuerda que en Firebird las aplicaciones nunca tocan los datos que estn
almacenados en una Base de Datos. En lugar de eso, las aplicaciones realizan
conversaciones con el Servidor a travs de los pedidos que hacen y las respuestas que
reciben. Una conversacin completa entre un cliente y el Servidor se llama transaccin.
Por qu se usan las transacciones?
Porque cuando muchos usuarios estn actualizando y consultando los mismos
datos muchos problemas pueden ocurrir:
Actualizaciones perdidas
Esto ocurre cuando dos usuarios estn viendo los mismos datos. El primero de
ellos realiza algunos cambios, poco despus el segundo realiza otros cambios. Por lo
tanto se pierden los cambios que haba hecho el primero.
Lecturas sucias
Esto le permite a un usuario ver los cambios que otro usuario est haciendo, pero
sin tener la garanta de que esos cambios sean finales.
Lecturas no reproducibles
Ocurren cuando un usuario est seleccionando filas continuamente mientras
otros usuarios estn modificando y borrando esas filas. Esto puede ser un problema o
no, depende de las circunstancias.
Filas fantasmas
Ocurre cuando un usuario puede seleccionar algunas, pero no todas, las filas
insertadas por otro usuario. Nuevamente, esto puede ser un problema o no, dependiendo
de las circunstancias.
Transacciones intercaladas
Ocurren cuando cambios en una fila por un usuario afectan a otras filas de esa
misma tabla o de otras tablas que estn siendo accedidas por otros usuarios. Esto suele
suceder cuando no hay forma de controlar el orden en el cual se realizan los cambios.
Para resolver estos problemas el Firebird aplica un modelo de administracin
que asla cada tarea dentro un contexto nico el cual le impide que sea completada si
pone en riesgo otras tareas. La Base de Datos no cambiar si hay algn conflicto.
Cada transaccin tiene un contexto nico que causa que est aislada de todas las
dems transacciones. Las reglas para ese contexto son especificadas por la aplicacin
cliente pasando parmetros de transaccin.
Cundo se inicia una transaccin?
Cuando un Cliente pide que se inicie y recibe un handle del Servidor. Desde ese
momento la transaccin est activa.

- 45 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Cundo finaliza una transaccin?
Cuando el Cliente enva un pedido de commit (grabar todos los cambios) o de
roll back (deshacer todos los cambios) y ese pedido es completado.
Cmo se identifica una transaccin?
Cada transaccin tiene un nmero nico (ID) que sirve para identificarla. De esta
manera el Firebird sabe cual es la transaccin que est haciendo cada tarea. Sin embargo
no hay que usar ese nmero como clave primaria o clave nica porque cada vez que se
restaura un backup el contador de las transacciones vuelve a cero. O sea que la primera
transaccin despus de la restauracin tendr el nmero 1, la segunda el nmero 2 y as
sucesivamente. Para conocer cual es el nmero de la transaccin actual en la base de
datos activa:
SELECT CURRENT_TRANSACTION FROM RDB$DATABASE;

Una transaccin, muchos pedidos


En Firebird cada operacin pedida por un Cliente debe ocurrir en el contexto de
una transaccin. Una transaccin puede implicar muchos pedidos del Cliente y muchas
respuestas del Servidor. Una transaccin puede abarcar ms que una Base de Datos,
incluyendo lecturas y escrituras.
Cul es la tarea del Cliente?
Iniciar todas las transacciones. Una vez que una transaccin se inici es la
responsabilidad del Cliente enviar los pedidos de lectura y de escritura. Tambin es su
responsabilidad terminar la transaccin (con un commit o un roll back).
Un Cliente puede tener muchas transacciones activas.
Cul es la tarea del Servidor?
Llevar la cuenta de cada transaccin y mantener la vista que cada transaccin
tiene del estado de la Base de Datos consistente con su contexto. Tiene que administrar
todos los pedidos de cambios a la Base de Datos para que los conflictos sean manejados
adecuadamente y as evitar que se rompa la consistencia.
Transacciones y MGA
Como ya se ha visto, las siglas MGA significan multi-generational architecture
(arquitectura de mltiples generaciones). En este modelo cada fila guardada en una base
de datos tiene un nmero nico identificando a la transaccin que escribi esa fila. Si
otra transaccin escribe un cambio a esa misma fila, el Servidor escribe una nueva
versin de la fila en el disco duro. O sea que habr dos filas similares guardadas en el
disco duro. Por eso se dice que el Servidor mantiene dos generaciones de la misma fila.
Grabacin de datos
En Firebird los datos pueden ser grabados de dos formas:
a) Temporalmente
b) Permanentemente

- 46 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Siempre que se realiza un INSERT o un UPDATE o un DELETE a una tabla esa
insercin, modificacin o borrado se realiza en forma temporal. Es decir, que an es
reversible. Y mientras tanto solamente es visible dentro del contexto de la transaccin
que hizo la operacin, nadie ms est enterado.
Una sola transaccin puede realizar muchas tareas: insertar registros en una o en
varias tablas, modificarlos, borrarlos. Si se descubre algn error en alguna de esas tareas
entonces todas esas inserciones, modificaciones y borrados pueden ser desechados
(mediante un roll back). Si todo est bien y solamente si todo est bien, entonces se los
graba permanentemente en el disco (con un commit).
Por qu se hace as? Porque de esa manera las bases de datos siempre tienen
datos consistentes, nunca falta o sobra algo. Por ejemplo si se tiene una tabla maestro y
una tabla detalles el programador puede estar seguro que la tabla detalles tiene todas las
filas y con todos los datos correctos, sin faltar nada.
Por lo tanto:
o El usuario que realiz un INSERT, UPDATE o DELETE est viendo los
cambios que esas operaciones implican
o Los dems usuarios no los ven
o Si el usuario graba en forma permanente (con un commit), los dems
usuarios tambin ven los cambios
o Si el usuario desecha los cambios (con un roll back), los dems usuarios
jams se enteraron de ellos

Por ejemplo:
El usuario Juan cambia el nmero de telfono del proveedor TodoFrutas S.A
El usuario Juan imprime los nmeros de telfono de todos los proveedores. El
nuevo nmero de telfono de TodoFrutas S.A. aparece en ese informe
El usuario Mara imprime los nmeros de telfono de todos los proveedores. El
viejo nmero de telfono de TodoFrutas S.A. aparece en ese informe
El usuario Juan graba en forma permanente los cambios (hace un commit)
Los dems usuarios (Mara y los otros) recin ahora pueden ver el nuevo nmero
de telfono del proveedor TodoFrutas S.A.

Datos desechados
El roll back nunca falla. Nunca. Este desecha todos los cambios que se
realizaron en la transaccin, tanto el que caus el error como todos los dems que se
hubieran grabado exitosamente de no haber ocurrido el error.
Por ejemplo:
Se inicia una transaccin
Se agrega un proveedor a la tabla de PROVEEDORES
Se agrega una compra a la tabla COMPRASCAB
Se agregan los datos de los productos comprados a la tabla COMPRASDET
Se descubre un error
Se realiza un roll back de los datos. Eso implica que:
o El proveedor que se haba agregado a PROVEEDORES es eliminado
o La compra que se haba agregado a COMPRASCAB es eliminada
- 47 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

o Los productos que se haban agregado a COMPRASDET son


eliminados
Se finaliza la transaccin

Problemas con transacciones


Como ya se vio anteriormente, las nicas formas de finalizar una transaccin son
mediante un commit o mediante un roll back. Pero qu ocurre si la aplicacin se colg
o hubo un corte de energa elctrica? En ese caso la transaccin continuar activa
porque el Servidor no finalizar una transaccin a menos que se le pida que lo haga.
En sistemas mal diseados tambin ocurrir lo mismo, cuando se le permite a un
usuario salir de la aplicacin sin antes hacer el commit o el roll back. A estas
transacciones se las llama muertas porque no estn ligadas a ninguna conexin. Y las
inserciones, modificaciones o borrados que hizo la transaccin continan dentro de la
base de datos pero nadie puede acceder a ellos.
Y cul es el problema? Que si mltiples versiones de una fila estn en una tabla
o si hay transacciones muertas entonces se est ocupando innecesariamente espacio en
el disco duro y las bsquedas y las consultas son ms lentas. Es decir: se degrada la
performance.
Solucin a los problemas
Para lidiar con esos problemas hay varias formas:
1. Hacer un backup y una restauracin de la Base de Datos
2. Usar el programa GFIX.EXE (que est instalado en la carpeta \BIN del
Firebird)
El backup y la restauracin solucionarn algunos de los problemas, pero no
todos. El gfix solucionar otros. Pero si an as la base de datos es ms grande de lo que
debera ser o las consultas son lentas, una revisin humana puede ser necesaria.
De todas maneras, si el entorno es el adecuado (el Servidor tiene una fuente de
energa ininterrumpida, las aplicaciones no se cuelgan, los usuarios no salen de la
aplicacin sin antes hacer un commit o un roll back ), todo debera funcionar siempre
muy bien.

- 48 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Parte 3. Visual FoxPro y Firebird


Bueno, despus de todas las pginas anteriores finalmente llegamos a lo que puede
resultar ms interesante a los programadores en Visual FoxPro: como integrar el
lenguaje con el Firebird.
Cuando se trabaja con Cliente/Servidor hay que:
1. Conectarse a la Base de Datos
2. Ejecutar los comandos
3. Desconectarse de la Base de Datos
Esa es la forma correcta cuando tanto el Servidor como el Cliente estn en una
LAN. La conexin se realiza al principio de la aplicacin (Contabilidad, Ventas,
Sueldos, etc.) y la desconexin al finalizar la aplicacin.
Sin embargo, si la conexin tiene problemas (suele ocurrir cuando es por
Internet), entonces hay que:
1. Conectarse a la Base de Datos
2. Ejecutar un comando
3. Desconectarse de la Base de Datos
Desde luego que esto es mucho ms lento, porque el estar conectndose y
desconectndose toma un buen tiempo, pero a veces no hay otra alternativa.
Una buena prctica es la siguiente: se realiza la conexin de la primera forma
pero si se encuentran muchas o frecuentes cadas de conexin se opta por la segunda
forma.

Que es DSN?
Son las siglas de Data Source Name (Nombre de la Fuente de Datos) y sirve para
proveer conectividad a una Base de Datos a travs de un driver ODBC.
En el DSN se especifican el nombre de la Base de Datos, la carpeta, el driver
ODBC, el nombre del usuario, la contrasea y alguna otra informacin relevante. Una
vez que se cre un DSN para una Base de Datos se lo puede usar en cualquier
aplicacin para conectarse a esa Base de Datos.
La conexin tambin puede realizarse sin DSN. En este caso toda la informacin
necesaria para la conexin se escribe dentro de la aplicacin. Si la conexin es sin DSN,
en lugar de utilizar un driver ODBC se puede usar OLE DB o algn otro mtodo.
La primera opcin (conectarse con DSN) es til cuando varias aplicaciones
(quizs creadas con distintos lenguajes) deben conectarse a la misma Base de Datos. La
segunda opcin (conectarse sin DSN) es preferible si una sola aplicacin se conectar.

- 49 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Para crear un DSN
Primero, debes instalar el driver ODBC del Firebird en la computadora, luego:
Inicio
Panel de Control
Herramientas Administrativas
Orgenes de Datos (ODBC)
DSN de Sistema
Hacer click en el botn Agregar
Elegir: Firebird/Interbase (r) driver
Escribir el nombre que se le quiere dar a la conexin DSN
Escribir una descripcin
Escribir el nombre de la Base de Datos que corresponde a la conexin
Escribir el nombre del archivo DLL del cliente (FBCLIENT.DLL)
Escribir el nombre del usuario de la Base de Datos
Escribir la contrasea de ese usuario
Escribir el conjunto de caracteres (espaol es ISO8859_1)

Si no ves el driver Firebird/Interbase (r) driver es porque an no has ejecutado


el instalador de ese driver. Lo puedes encontrar y descargar de:
http://www.firebirdsql.org/index.php?op=files&id=odbc
busca uno que corresponda a tu versin del Windows.
Para conectarse sin DSN
Si deseas conectarte sin usar DSN (muchas veces es la opcin preferible), lo
nico que tendrs que hacer es instalar el driver ODBC y luego enviar un string de
conexin, como se ver ms adelante.

Una clase para usar con Bases de Datos SQL


Desde hace muchas versiones el Visual FoxPro permite la programacin
orientada a objetos (POO) y esta es una muy buena oportunidad para usarla.
Por supuesto que las Bases de Datos SQL se pueden usar sin necesidad de
objetos pero ya que se tiene esa posibilidad, por qu no aprovecharla?. La POO tiene
muchas cosas buenas, entre ellas que permite que el cdigo escrito sea reutilizable, que
todo se encuentre en un solo lugar haciendo ms fcil buscar y modificar lo que se desee
y que los cambios se propagan a todos los objetos creados a partir de una clase.
La clase que se desarrollar a continuacin permitir:
Conectarse a una Base de Datos con DSN
Conectarse a una Base de Datos sin DSN
Desconectarse de una Base de Datos (o de todas al mismo tiempo)
Hallar el nombre del driver que se necesitar para la conexin
Ejecutar comandos
Verificar si hay una conexin activa
Naturalmente puedes agregarle las funciones o procedimientos que te parezcan
adecuados o necesarios, esta es una clase bsica, se le pueden adicionar nuevas
funcionalidades, de acuerdo a las necesidades de cada quien.
- 50 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Lo primero que se debe hacer es escribir en la ventana de comandos:


modify command SQL_CLASES

Estando dentro del archivo SQL_CLASES.PRG, escribir:


DEFINE CLASS SQL_DataBase as CUSTOM
*
*
lcODBC_Driver
= ""
lcServidor
= ""
lcBaseDatos
= ""
lcNombreConexion
= ""
lcUsuario
= ""
lcContrasena
= ""
lnHandle
= 0
lcMensajeError
= ""
lnResultado
= 0
lcComando
= ""
lcNombreCursor
= ""
llTerminarConexion = .F.
&& Si quiere terminar la conexin despus
&& de ejecutar un comando. til cuando se
&& accede por Internet.
*
*
ENDDEFINE
*
*

Estas son todas las variables internas (o propiedades) de la clase que se est
creando. Pero esas propiedades por s solas no sirven para mucho, son ms tiles
cuando se crean procedimientos o funciones que las manipulan.
Funcin para conectarse a una Base de Datos usando DSN
Si definiste un DSN (como se explic anteriormente), entonces puedes usar la
siguiente funcin para conectarte a una Base de Datos:
Function CONECTAR_CON_DSN
with This
.lnHandle
= SQLConnect(.lcNombreConexion, .lcUsuario, .lcContrasena)
.lnResultado = iif(.lnHandle > 0, 1, -1)
endwith
Return(This.lnResultado)
*
*

La funcin SQLConnect() es la que intenta realizar la conexin, recibe como


parmetros el nombre de la conexin DSN, el nombre del usuario y la contrasea del
usuario. Si la conexin se realiz con xito, devuelve un nmero entero mayor que cero
(o sea, un nmero natural: entero y positivo). Si por algn motivo la conexin no pudo
realizarse, devuelve un nmero entero y negativo.
En la propiedad lnResultado se guarda el resultado del intento de conexin. Si
vale 1 (uno) significa que tuvo xito, si vale -1 (menos uno) que fall.

- 51 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Funcin para conectarse a una Base de Datos sin usar DSN
Si no se defini un DSN, se puede usar la siguiente funcin para realizar la
conexin a la Base de Datos:
Function CONECTAR_SIN_DSN
Local lcCadenaConexion
with This
lcCadenaConexion = "DRIVER={" + .lcODBC_Driver + "};" ;
+ "SERVER=" + .lcServidor + ";" ;
+ "USER=" + .lcUsuario + ";" ;
+ "PASSWORD=" + .lcContrasena + ";" ;
+ "DATABASE=" + .lcBaseDatos + ";" ;
+ "OPTIONS=131329;"
endwith
=SQLSetProp(0, "DispLogin", 3)
&& Para no mostrar caja dilogo del Login
with This
.lnHandle
= SQLStringConnect(lcCadenaConexion)
.lnResultado = iif(.lnHandle > 0, 1, -1)
endwith
Return(This.lnResultado)
*
*

En este caso hay que armar una cadena de conexin y usar la funcin
SQLStringConnect().
Al igual que antes en la propiedad lnResultado se guardar el resultado del
intento de conexin. Un valor de 1 (uno) significa xito y un valor de -1 (menos uno)
que hubo algn problema.
Funcin para desconectarse de una (o todas) Base de Datos SQL
Antes de finalizar tu aplicacin lo correcto es que te desconectes de la Base de
Datos que estuviste usando.
Function DESCONECTAR
with This
if .lnHandle == 0

&& Si quiere desconectarse de TODAS las Bases de


&& Datos.
.lnResultado = SQLDisconnect(0)
endif
if .lnHandle > 0
&& Si quiere desconectarse de UNA Base de Datos y hay
&& una conexin activa, trata de desconectarse.
.lnResultado = SQLDisconnect(.lnHandle)
endif
.lnHandle = iif(.lnResultado > 0, 0, .lnHandle)
endwith
Return(This.lnResultado)
*
*

Si la desconexin se realiz con xito entonces la propiedad lnHandle tendr el


valor de 0 (cero) y la propiedad lnResultado el valor de 1 (1 = xito).
Procedimiento para hallar el nombre del driver
En una computadora normalmente hay muchos drivers instalados, sin embargo
para realizar la conexin a la Base de Datos SQL necesitamos saber si uno en especial
est (o no est) instalado.

- 52 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


Lo que hace el siguiente procedimiento es lo siguiente:
Carga en un vector (o array) los nombres de todos los drivers
Verifica si el driver que se busca est en ese vector
Guarda en la propiedad lcODBC_driver el nombre del driver
Guarda en la propiedad lnResultado si se encontr o no el driver buscado.
Procedure HALLARNOMBREDRIVER
LParameters tcNombreMotorSQL
Local lcNombre, loReg, lnNumError, lcSetExact, lnNumElemento
loReg = CreateObject("ODBCReg")
Dimension aVec(2000)
lnNumError = loReg.GetODBCDrvrs(@aVec)
lcSetExact = Set("EXACT")
set exact OFF
&& Tiene que estar en OFF para que lo pueda encontrar
lnNumElemento = AScan(aVec, tcNombreMotorSQL)
set exact &lcSetExact
Release loReg
with This
.lcODBC_Driver = iif(lnNumElemento > 0, aVec[lnNumElemento], "")
.lnResultado
= iif(!Empty(.lcODBC_Driver), 1, -1)
endwith
EndProc
*
*

Funcin para ejecutar comandos SQL


Con la funcin SQLExec() se pueden ejecutar los comandos SQL (si existe una
conexin activa a una Base de Datos, desde luego). Pero ya que se est escribiendo una
clase, por qu no crear una funcin propia que no solamente trate de ejecutar un
comando sino que tambin verifique antes si hay una conexin activa y en caso de no
haberla intente la conexin?
Function EJECUTAR
LParameters tcComando, tcNombreCursor
Local lnI
tcNombreCursor = iif(VarType(tcNombreCursor) <> "C", "", tcNombreCursor)
with This
.lcComando
= tcComando
.lcNombreCursor = tcNombreCursor
lnI = 1
do while !.HayConexion() .and. lnI <= 30
.Conectar_sin_DSN()
if .lnResultado < 0
Wait window "No puedo conectarme al Servidor. Deberas verificar que la
red est funcionando correctamente. Intento N " + Transform(lnI) TimeOut 2
endif
lnI = lnI + 1
enddo
if .lnHandle > 0
&& Hay una conexin activa
.lnResultado = SQLExec(.lnHandle, .lcComando, .lcNombreCursor)
if .llTerminarConexion
&& Quiere terminar la conexin despus de
ejecutar el comando, usualmente cuando se accede por Internet
.Desconectar()
endif
else
.lnResultado = -1
endif
endwith
Return(This.lnResultado >= 1)
*
*

Primero, verifica si hay una conexin activa, si no la hay trata de conectarse, se


hacen 30 intentos esperndose 2 segundos entre uno y el siguiente, lo que hace un total
de 1 (un) minuto de intentos. Si hay una conexin activa entonces trata de ejecutar el

- 53 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL


comando pedido. Si despus de eso el usuario quiere desconectarse de la Base de Datos,
se desconecta. La funcin devuelve .T. si el comando se ejecut exitosamente o .F. si
ocurri algn problema.
Funcin para verificar si hay una conexin activa
Antes de enviar un comando SQL es conveniente verificar que hay una conexin
activa a la Base de Datos. Porque si no la hay, ocurrir un error, eso es seguro.
Function HAYCONEXION
Local llResultado
Try
llResultado = SQLExec(This.lnHandle, "SELECT CURRENT_TIME FROM
RDB$DATABASE")
Catch
llResultado = -1
EndTry
Return(llResultado == 1)
*
*

La forma de verificar si hay una conexin activa es la siguiente: se trata de


obtener la fecha y la hora del Servidor. Si se consigui, si se tuvo xito, significa que s
hay una conexin activa, la conexin est ok. Si no se pudo obtener la fecha y la hora,
eso significa que hubo algn problema. O sea, la conexin no est activa.
Descargar las clases
Estas clases (SQL_CLASES y SQL_REGISTRYCLASS) pueden descargarse
desde:
http://www.mediafire.com/?64vd8se54g91eob
http://www.mediafire.com/?qqsh1q2z3e6kmnq

Programas en Visual FoxPro que usan Firebird


Estos programas son ejemplos que muestran como usar Bases de Datos Firebird
en Visual Foxpro.
Ejemplo N 1. Usando la instruccin SELECT
El comando SELECT permite realizar consultas a la Base de Datos, pero los
datos los retorna en una tabla temporal (o cursor). En este ejemplo esos datos son luego
mostrados con un BROWSE. Lo importante a notar es que si se cambia el contenido de
alguno de los campos mostrados por el BROWSE, ese nuevo valor no es actualizado en
la Base de Datos, por lo tanto la siguiente vez que se ejecute el programa se seguirn
viendo los valores originales.
Eso es distinto que cuando se trabaja con tablas .DBF. En este caso, si modificas
los campos que ves en el BROWSE, esos cambios quedan grabados en la tabla. En
cambio, cuando usas tablas SQL, los cambios que haces en un BROWSE no se graban
en la tabla original. Si quieres grabar algo en una tabla SQL debes enviar
especficamente una instruccin INSERT o UPDATE.
- 54 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

En el programa de ejemplo antes de llamar a cada SELECT se muestra un


mensaje mediante un WAIT WINDOW, para que ese mensaje desaparezca puedes
presionar cualquier tecla. Para salir del BROWSE presiona la tecla ESC (o si prefieres
puedes presionar la tecla ESC tanto para salir del WAIT WINDOW como para salir del
BROWSE).
El cursor de los ejemplos se llama TEMP (por: temporal o temporario), por
supuesto que t puedes elegir cualquier otro nombre que desees cuando generes tus
propios cursores.
IMPORTANTE: Todos estos SELECT los puedes escribir en el programa ISQL,
como se muestra a continuacin para el primero de ellos:

Y aqu se muestra el segundo SELECT del programa (donde se supone que ya


ests conectado a la Base de Datos EMPLOYEE.FDB):

Por supuesto que usar ISQL no suele ser la mejor alternativa, y en su lugar se
puede usar Flame Robin, SQL Manager o inclusive el BROWSE del Visual FoxPro
pero la gran ventaja que se tiene con ISQL es que est siempre disponible en todas las
instalaciones del Firebird.
Otra ventaja es que si el SELECT que has escrito en tu programa Visual FoxPro
no te funciona y no sabes el motivo entonces al escribirlo dentro del ISQL obtendrs
informacin que te resultar de utilidad para saber qu ests haciendo mal. Por ejemplo:

- 55 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

En este caso se agrup solamente por FULL_NAME, pero a la izquierda de la


clusula GROUP BY hay dos campos y se debe usarlos a los dos. La expresin correcta
es la siguiente:
SELECT EMP_NO, FULL_NAME FROM EMPLOYEE GROUP BY FULL_NAME, EMP_NO;

Aunque a veces parecen ser la misma cosa, agrupar es distinto que ordenar, para
agrupar (poner a las filas en grupos) se usa GROUP BY, para ordenarlas se usa ORDER
BY, para ordenarlas en forma descendente hay que agregar DESCENDING.
Ejemplo N 2. Una pequea aplicacin administrativa (stock, compras, ventas)
Un pequeo negocio ha pedido que se le haga una aplicacin para ayudarle con
el control del mismo. Ellos se dedican a vender bebidas, es lo nico que venden y no
tienen previsto vender algo ms. En su lista hay cervezas, vinos, whiskies, gaseosas,
aguas minerales, pero su fuerte son las bebidas alcohlicas, en especial las cervezas. El
negocio abre los 7 das de la semana, inclusive cuando hay partidos de ftbol
importantes o algn otro acontecimiento los das Domingo tienen una venta muy
grande. No tienen sucursales ni planean tenerlas. En ese negocio trabajan dos personas:
el propietario y un empleado, quienes se van turnando los horarios. Al empleado
adems de un sueldo fijo se le paga una comisin del 3% sobre las ventas realizadas.
Todas las compras y todas las ventas son al contado, a nadie se le vende a crdito, por
ningn motivo. Los clientes no pueden retirar la mercadera antes de pagarla. Las ventas
pueden ser al por mayor o al por menor (o detalle), los precios de venta son distintos
para ambos casos. Pueden vender por unidades o por cajas (o packs), las cajas (o packs)
pueden contener: 3, 6, 12, 24 unidades. Nunca devuelven productos a los proveedores ni
aceptan devoluciones de los clientes.
La aplicacin se realizar en Visual FoxPro, usando Firebird SQL como motor
de la Base de Datos.
Despus del anlisis correspondiente se ha encontrado que se necesitarn las
siguientes tablas:
Vendedores
Proveedores
Productos
Movimientos cabecera
Movimientos detalles
Se han determinado las siguientes restricciones:
Ninguna fecha de compra o de venta puede faltar
Ninguna fecha de compra o de venta puede ser anterior al 1 de enero de 2011
Ninguna cantidad, comprada o vendida, puede faltar
Toda cantidad, comprada o vendida, debe ser mayor que cero
- 56 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Ningn importe, de compra o de venta, puede faltar


Todo importe, de compra o de venta, debe ser mayor que cero
Todos los vendedores deben tener un cdigo nico, entre 000 y 999
Todos los vendedores deben tener un nombre y en maysculas
Todos los proveedores deben tener un cdigo nico, entre 000 y 999
Todos los proveedores deben tener un nombre y en maysculas
Todos los proveedores deben tener un telfono
Todos los productos deben tener un cdigo nico, entre 000 y 999
Todos los productos deben tener un nombre y en maysculas
Todos los productos deben tener una cantidad no negativa
Todos los productos deben tener un precio de costo positivo
Todos los productos deben tener un precio de venta mayorista positivo
Todos los productos deben tener un precio de venta minorista positivo
Todos los movimientos cabecera deben tener un tipo de movimiento (COM
o VEN, significando compras y ventas, respectivamente)
Todos los movimientos detalles deben tener un campo que los relacione con
los movimientos de cabecera

Para crear la Base de Datos, los dominios, tablas y vistas se utilizaron scripts, de
tal manera que sea muy fcil reconstruirla en caso de necesidad.
En ISQL se utiliza la instruccin INPUT para ejecutar un script, como se ve a
continuacin:

Por convencin los scripts tienen la extensin .SQL pero no es obligatorio, a tus
scripts puedes ponerles la extensin que quieras aunque desde luego sera preferible que
usaras .SQL para que los dems puedan entenderte fcilmente.

- 57 -

Walter R. Ojeda Valiente Visual FoxPro y Firebird SQL

Conclusin
Aunque para quienes se acostumbraron a usar las tablas .DBF puede resultar
muy complicado al principio, realmente usar Firebird no lo es tanto. Por supuesto que s
es ms complicado pero eso se debe a que tiene mucha mayor potencia y esa mayor
potencia se paga con un incremento en la dificultad de uso. Pero la pregunta que se
deben hacer es: vale la pena? se compensa usar Firebird o es mejor continuar usando
las viejas conocidas tablas .DBF?
La respuesta a ambas preguntas es un rotundo s. Las ventajas que se obtienen de
usar Firebird son muy grandes comparadas con el tiempo que se emplear en aprenderlo
a cabalidad.
Las tablas .DBF ya estn obsoletas, en aplicaciones nuevas ni siquiera deberan
considerarse. Y si se las va a reemplazar entonces, sin ninguna duda, Firebird es una de
las mejores alternativas que actualmente existen.
As que, emplearas muy bien tu tiempo adentrndote en el uso de este potente
motor SQL. Te olvidars de tablas corruptas, ndices daados, poca seguridad de los
datos, lentitud de acceso por Internet. Es otro mundo.
Dedcate a aprender SQL. Y Firebird. Ganars mucho.

Comentario final:
Como todo documento, ste tambin puede ser mejorado. Si encuentras algn
error o algo que te gustara que se le agregara o algo que te gustara que estuviera mejor
explicado o cualquier idea o sugerencia, hzmelo saber y tratar de realizar la
modificacin lo antes posible. Mi e-mail es:
wrov@hotmail.com

- 58 -

También podría gustarte